]> granicus.if.org Git - fribidi/commitdiff
Initial revision
authorbehdad <behdad>
Sun, 25 Apr 2004 18:47:56 +0000 (18:47 +0000)
committerbehdad <behdad>
Sun, 25 Apr 2004 18:47:56 +0000 (18:47 +0000)
91 files changed:
.cvsignore [new file with mode: 0644]
.indent.pro [new file with mode: 0644]
AUTHORS [new file with mode: 0644]
COPYING [new file with mode: 0644]
HACKING [new file with mode: 0644]
HISTORY [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
NEWS [new file with mode: 0644]
README [new file with mode: 0644]
THANKS [new file with mode: 0644]
TODO [new file with mode: 0644]
bin/Makefile.am [new file with mode: 0644]
bin/fribidi-benchmark.c [new file with mode: 0644]
bin/fribidi-main.c [new file with mode: 0644]
bin/getopt.c [new file with mode: 0644]
bin/getopt.h [new file with mode: 0644]
bin/getopt1.c [new file with mode: 0644]
bin/getopt_int.h [new file with mode: 0644]
bootstrap [new file with mode: 0755]
charset/Headers.mk [new file with mode: 0644]
charset/Makefile.am [new file with mode: 0644]
charset/fribidi-char-sets-cap-rtl.c [new file with mode: 0644]
charset/fribidi-char-sets-cap-rtl.h [new file with mode: 0644]
charset/fribidi-char-sets-cp1255.c [new file with mode: 0644]
charset/fribidi-char-sets-cp1255.h [new file with mode: 0644]
charset/fribidi-char-sets-cp1256.c [new file with mode: 0644]
charset/fribidi-char-sets-cp1256.h [new file with mode: 0644]
charset/fribidi-char-sets-iso8859-6.c [new file with mode: 0644]
charset/fribidi-char-sets-iso8859-6.h [new file with mode: 0644]
charset/fribidi-char-sets-iso8859-8.c [new file with mode: 0644]
charset/fribidi-char-sets-iso8859-8.h [new file with mode: 0644]
charset/fribidi-char-sets-list.h [new file with mode: 0644]
charset/fribidi-char-sets-utf8.c [new file with mode: 0644]
charset/fribidi-char-sets-utf8.h [new file with mode: 0644]
charset/fribidi-char-sets.c [new file with mode: 0644]
charset/fribidi-char-sets.h [new file with mode: 0644]
configure.ac [new file with mode: 0644]
doc/Makefile.am [new file with mode: 0644]
fribidi.pc.in [new file with mode: 0644]
fribidi.spec.in [new file with mode: 0644]
gen.tab/Makefile.am [new file with mode: 0644]
gen.tab/gen-bidi-type-tab.c [new file with mode: 0644]
gen.tab/gen-mirroring-tab.c [new file with mode: 0644]
gen.tab/packtab.c [new file with mode: 0644]
gen.tab/packtab.h [new file with mode: 0644]
gen.tab/unidata/BidiMirroring.txt [new file with mode: 0644]
gen.tab/unidata/ReadMe.txt [new file with mode: 0644]
gen.tab/unidata/extracted/DerivedBidiClass.txt [new file with mode: 0644]
gen.tab/unidata/extracted/DerivedDecompositionType.txt [new file with mode: 0644]
gen.tab/unidata/extracted/DerivedJoiningType.txt [new file with mode: 0644]
lib/Headers.mk [new file with mode: 0644]
lib/Makefile.am [new file with mode: 0644]
lib/bidi-type-table.i [new file with mode: 0644]
lib/bidi-types-list.h [new file with mode: 0644]
lib/bidi-types.h [new file with mode: 0644]
lib/common.h [new file with mode: 0644]
lib/debug.h [new file with mode: 0644]
lib/fribidi-begindecls.h [new file with mode: 0644]
lib/fribidi-bidi-type.c [new file with mode: 0644]
lib/fribidi-bidi-type.h [new file with mode: 0644]
lib/fribidi-bidi-types.c [new file with mode: 0644]
lib/fribidi-bidi-types.h [new file with mode: 0644]
lib/fribidi-bidi.c [new file with mode: 0644]
lib/fribidi-bidi.h [new file with mode: 0644]
lib/fribidi-common.h [new file with mode: 0644]
lib/fribidi-config.h.in [new file with mode: 0644]
lib/fribidi-enddecls.h [new file with mode: 0644]
lib/fribidi-env.c [new file with mode: 0644]
lib/fribidi-env.h [new file with mode: 0644]
lib/fribidi-mem.c [new file with mode: 0644]
lib/fribidi-mirroring.c [new file with mode: 0644]
lib/fribidi-mirroring.h [new file with mode: 0644]
lib/fribidi-types.h [new file with mode: 0644]
lib/fribidi-unicode-version.h [new file with mode: 0644]
lib/fribidi-unicode.h [new file with mode: 0644]
lib/fribidi.c [new file with mode: 0644]
lib/fribidi.h [new file with mode: 0644]
lib/mem.h [new file with mode: 0644]
lib/mirroring-table.i [new file with mode: 0644]
test/Makefile.am [new file with mode: 0644]
test/run.tests [new file with mode: 0755]
test/test_CapRTL_explicit.input [new file with mode: 0644]
test/test_CapRTL_explicit.reference [new file with mode: 0644]
test/test_CapRTL_implicit.input [new file with mode: 0644]
test/test_CapRTL_implicit.reference [new file with mode: 0644]
test/test_ISO8859-8_hebrew.input [new file with mode: 0644]
test/test_ISO8859-8_hebrew.reference [new file with mode: 0644]
test/test_UTF-8_persian.input [new file with mode: 0644]
test/test_UTF-8_persian.reference [new file with mode: 0644]
test/test_UTF-8_reordernsm.input [new file with mode: 0644]
test/test_UTF-8_reordernsm.reference [new file with mode: 0644]

diff --git a/.cvsignore b/.cvsignore
new file mode 100644 (file)
index 0000000..ce21673
--- /dev/null
@@ -0,0 +1,19 @@
+ChangeLog.bak
+INSTALL
+aclocal.m4
+autom4te.cache
+fribidi.pc
+fribidi.spec
+config.guess
+config.h
+config.h.in
+config.log
+config.status
+config.sub
+configure
+depcomp
+install-sh
+libtool
+ltmain.sh
+missing
+stamp-h1
diff --git a/.indent.pro b/.indent.pro
new file mode 100644 (file)
index 0000000..35a5cb6
--- /dev/null
@@ -0,0 +1,19 @@
+-gnu
+-bfda
+-bfde
+-T TypeLink
+-T LevelInfo
+-T FriBidiChar
+-T FriBidiStrIndex
+-T FriBidiMaskType
+-T FriBidiCharType
+-T FriBidiPropCharType
+-T FriBidiLevel
+-T FriBidiCharSet
+-T FriBidiCharSetHandler
+-T FriBidiMemChunk
+-T FriBidiEnv
+-T fribidi_uint8
+-T fribidi_uint16
+-T fribidi_uint32
+-T fribidi_boolean
diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..56e66e8
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1 @@
+behdad: Behdad Esfahbod <behdad@gnu.org>
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..b1e3f5a
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,504 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                      Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+\f
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+\f
+                 GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+\f
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+\f
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+\f
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+\f
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+\f
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+\f
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                           NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/HACKING b/HACKING
new file mode 100644 (file)
index 0000000..05a0c41
--- /dev/null
+++ b/HACKING
@@ -0,0 +1,7 @@
+
+The GIMP uses GNU Libtool in order to build shared libraries on a
+variety of systems. While this is very nice for making usable
+binaries, it can be a pain when trying to debug a program. For that
+reason, compilation of shared libraries can be turned off by
+specifying the `--disable-shared' option to `configure'.
+
diff --git a/HISTORY b/HISTORY
new file mode 100644 (file)
index 0000000..034003a
--- /dev/null
+++ b/HISTORY
@@ -0,0 +1,34 @@
+FriBidi was first developed by Dov Grobgeld of the Ivrix project, a few
+releases happened there, up to 0.1.15.  This was late 2000.
+
+Behdad Esfahbod of the FarsiWeb project started reading and hacking FriBidi
+in the same days.  As per request of Roozbeh Pournader from the FarsiWeb
+project, FriBidi development was moved to SourceForge (http://www.sf.net/),
+under the same name (http://fribidi.sf.net/).
+
+Behdad started applying patches in early 2001, and became the new
+maintainer.  He first aimed for full compliance of the standard, and then
+applied the GNU Coding Standards.  The effort was then released in the
+Iranian New Year celebrations on 2001-03-29 as FriBidi 0.9.0.
+
+Since then, FriBidi has been quite stable.  A few other releases were made,
+to fix bugs, code cleanup, etc which all led to the release of FriBidi
+0.10.4 on 2002-05-19.  It turned out to be quite stable, and is shipped by
+several distributions these days (~2003).
+
+Behdad promised a major redesign of the interface and the code to code, but
+it almost never happened, at least not before Iranian New Years of March
+2004.  In the mean time, FriBidi was dubbed as a GNU package by Richard
+Stallman.  The first time was in 2002, and he mis-spelled it as "FreeBidi".
+Next time in 2003 he addressed the correct name "FriBidi", but the
+transition to gnu.org (http://www.gnu.org/) never happened, due to long
+down-times of gnu.org due to several administrative problems.
+
+GNU FriBidi was finally moved to the FreeDesktop project
+(http://www.freedesktop.org), which it lives a peaceful life these days
+(http://www.freedesktop.org/Software/FriBidi).  Major cleanup made to the
+build system, and was reimported from scratch in the FreeDesktop CVS.  The
+old CVS repository is still available under the "fribidi-sf.net" module.
+
+You can find more details in the file ChangeLog.old in the GNU FriBidi CVS
+repository.
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..2565fed
--- /dev/null
@@ -0,0 +1,54 @@
+##############################################################################
+## $Id: Makefile.am,v 1.1 2004-04-25 18:47:57 behdad Exp $
+## $Author: behdad $
+## $Date: 2004-04-25 18:47:57 $
+## $Revision: 1.1 $
+## $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/Makefile.am,v $
+##############################################################################
+##                                               -*- Automake -*-
+## Process this file with automake to produce Makefile.in
+
+## The order of subdirs is important, don't change without a reason.
+SUBDIRS = tablegen charset lib bin doc test
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = @PACKAGE@.pc
+
+MAINTAINERCLEANFILES = \
+               $(srcdir)/INSTALL \
+               $(srcdir)/aclocal.m4 \
+               $(srcdir)/autoscan.log \
+               $(srcdir)/compile \
+               $(srcdir)/config.guess \
+               $(srcdir)/config.h.in \
+               $(srcdir)/config.sub \
+               $(srcdir)/configure \
+               $(srcdir)/configure.scan \
+               $(srcdir)/depcomp \
+               $(srcdir)/install-sh \
+               $(srcdir)/ltmain.sh \
+               $(srcdir)/missing \
+               `find "$(srcdir)" -type f -name Makefile.in -print` \
+               `find "$(srcdir)" -type f -name "*~" -print`
+
+# Indent all C source and header files
+
+.PHONY: indent
+
+indent: $(srcdir)/.indent.pro
+       cd "$(srcdir)" && \
+       find . -type f -mindepth 2 -name "*.[ch]" -print | \
+               xargs ./missing --run indent
+
+
+# Creating ChangeLog from CVS log, with cvs2cl:
+
+MAINTAINERCLEANFILES += ChangeLog ChangeLog.bak
+
+EXTRA_DIST = ChangeLog
+
+ChangeLog:
+       if test -d "$(srcdir)/CVS"; then \
+               cd "$(srcdir)" && \
+               ./missing --run cvs2cl --stdout --utc --FSF -U AUTHORS; \
+       fi > $@
diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..49eac46
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,18 @@
+Overview of changes between 0.10.4 and 0.19.0
+=============================================
+* Unicode 4.0.1 data files used.
+* Has been dubbed GNU FriBidi by Richard Stallman
+* Restructured.
+
+Overview of changes between 0.10.2 and 0.10.4
+=============================================
+* Unicode 3.2 data files used.
+
+Overview of changes between 0.10.1 and 0.10.2
+=============================================
+* Rule L3 of UAX#9 implemented.  Now fribidi implements the whole Unicode
+  BiDi Algorithm.
+* The autogenerated table files now contain much fewer symbols, which reduces
+  the relocation time of the library.
+
+See ChangeLog for more descriptive list of changes.
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..d3b8554
--- /dev/null
+++ b/README
@@ -0,0 +1,152 @@
+This is GNU FriBidi
+The Free Implementation of the Unicode Bidirectional Algorithm.
+
+Background
+==========
+
+One of the missing links stopping the penetration of free software in Middle
+East is the lack of support for the Arabic and Hebrew alphabets. In order to
+have proper Arabic and Hebrew support, the BiDi algorithm should have been
+implemented. It is our hope that this library will stimulate more free
+software in the Middle Eastern countries.
+
+Audience
+========
+
+It is our hope that this library will stimulate the implementation of Hebrew
+and Arabic in lots of free software. Here is a small list of projects that
+would benefit from the use of the GNU FriBidi library, but of course there are
+many more: Wine, Mozilla, Qt, KDE, lynx, OpenOffice.
+
+GNU FriBidi is already being used in projects like Pango (resulting in GTK+
+and GNOME using GNU FriBidi), AbiWord, MLTerm, MPlayer, and BiCon.
+
+Dependencies
+============
+
+Currently GNU FriBidi does not depend on any other library.  It uses GNU Build
+System for build and installation on POSIX systems.  There are some files to
+assist you creating a w32 DLL in the w32/ folder.
+
+Downloading
+===========
+
+The latest version of GNU FriBidi may be found at:
+
+   http://www.freedesktop.org/Software/FriBidi
+
+Building
+========
+
+See INSTALL for a description of how to build and install this library.
+
+License
+=========
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this library, in a file named COPYING; if not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+Boston, MA  02111-1307  USA
+
+Implementation
+==============
+
+The library implements the algorithm described in the "Unicode Standard
+Annex #9, The Bidirectional Algorithm", available at
+http://www.unicode.org/unicode/reports/tr9/. GNU Fribidi has been tested
+exhaustively against the Unicode Reference Code, and to the best of our
+knowledge, it completely conforms to the specification, always producing
+the same result as the Reference Code.
+
+The library uses Unicode (UTF32) entirely. The character properties are
+automatically extracted from the Unicode data files, available from:
+
+       http://www.unicode.org/Public/UNIDATA/
+
+This means that every Unicode character is treated in strict accordance
+with the Unicode specification.
+
+There is a limited support for character set conversion from/to the UTF32
+encoding.  Data in these character sets must be converted into UTF32 before
+the library may be used.  iconv(3) can always do a better job on that, so you
+may find that the character sets conversion code is typically turned off on
+POSIX machines.
+
+The reordering of characters is typically done through the function:
+      
+     fribidi_boolean
+     fribidi_log2vis(/* input */
+                    FriBidiChar *str,
+                    FriBidiStrIndex len,
+                    FriBidiCharType *pbase_dir,
+                    /* output */
+                    FriBidiChar *visual_str,
+                    FriBidiStrIndex *position_L_to_V_list,
+                    FriBidiStrIndex *position_V_to_L_list,
+                    FriBidiLevel    *embedding_level_list
+                    )
+    
+
+where
+     str                    is the Unicode input string
+     len                    is the length of the unicode string
+     pbase_dir              is the input and output base direction. If 
+                            base == FRIBIDI_TYPE_ON then fribidi_log2vis 
+                            calculates the base direction on its own
+                            according to the BiDi algorithm.
+     visual_str             The reordered output unicode string.
+     position_L_to_V_list   Maps the positions in the logical string to 
+                            positions in the visual string.
+     position_V_to_L_list   Maps the positions in the visual string to 
+                            the positions in the logical string.
+     embedding_level_list   Returns the classification of each character. Even
+                            levels indicate LTR characters, and odd levels
+                            indicate RTL characters. The main use of this
+                            list is in interactive applications when the
+                            embedding e.g. level determines cursor display.
+
+In any of the output pointers == NULL, then that information is not 
+calculated.
+
+How it looks like
+=================
+
+Have a look at tests directory, to see some input and outputs, which
+CapRTL charset means that CAPITAL letters are right to left, and digits
+6, 7, 8, 9 are Arabic digits, try 'fribidi --charsetdesc CapRTL' for the
+full description.
+
+Executable
+==========
+
+There is also a command-line utilitity called fribidi that loops over
+the text of a file and performs the BiDi algorithm on each line, also
+used for testing the algorithm. Run fribidi with the --help option to
+learn about usage.  The command-line utility is known to have problems
+with line-breaking and ltov/vtol lists.
+
+Bugs and comments
+=================
+
+Report GNU FriBidi bugs at:
+
+       http://freedesktop.org/cgi-bin/bugzilla/enter_bug.cgi?product=FriBidi
+
+And send your comments to:
+
+       fribidi-discuss@lists.sourceforge.net
+
+
+Behdad Esfahbod
+behdad@gnu.org
+10 April 2004
diff --git a/THANKS b/THANKS
new file mode 100644 (file)
index 0000000..2aedf76
--- /dev/null
+++ b/THANKS
@@ -0,0 +1,33 @@
+Thanks to:
+
+
+Members of the Linux-il and Arabeyes communities
+       * For the feedbacks.
+       * For the constant pressure on keep the wheel rolling.
+
+Mark Davis
+       * For writing the Unicode Standard Annex #9.
+
+
+
+And for the previous versions of FriBidi (up to 2002), thanks to:
+
+
+Dov Grobgeld <dov@imagic.weizmann.ac.il>
+       * Initial author, and maintainer before the 0.9 releases.
+   
+Franck Portaneri
+       * For the Mozilla BiDi languges support document;
+
+Owen Tayler <otaylor@redhat.com>
+       * Contributed very important memory leak and speed patches.
+
+Pablo Saratxaga <pablo@mandrakesoft.com>  
+       * Contributed several arabic charset converters.
+
+Omer Zak <omerz@actcom.co.il>
+       * Contributed several bug fixes, and several considerations for
+         embedded systems.
+
+Roozbeh Pournader <roozbeh@sharif.edu>
+       * Fixed small things here and there.
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..559b30d
--- /dev/null
+++ b/TODO
@@ -0,0 +1,13 @@
+Implementation issues:
+
+* BidiTypes enum in manual.
+
+* Update CapRTL with new Unicode reference code.
+
+* Revise reorder API, in fribidi_main.c reorder after link break.
+
+* Add an option to fribidi_main.c to assume two consecutive returns as
+  paragraph separators.
+
+* Design better apis to do reorder based on available levels, remove
+  explicit marks then calculate position maps, ....
diff --git a/bin/Makefile.am b/bin/Makefile.am
new file mode 100644 (file)
index 0000000..6d8209a
--- /dev/null
@@ -0,0 +1,25 @@
+bin_PROGRAMS = fribidi
+
+noinst_PROGRAMS = fribidi-benchmark
+
+getopt_SOURCES = getopt.c getopt1.c getopt_int.h getopt.h
+
+fribidi_SOURCES = fribidi-main.c $(getopt_SOURCES)
+
+fribidi_benchmark_SOURCES = fribidi-benchmark.c $(getopt_SOURCES)
+
+AM_CPPFLAGS = \
+               -I$(top_builddir)/lib \
+               -I$(top_srcdir)/lib \
+               -I$(top_srcdir)/charset \
+               $(GLIB_CFLAGS)
+
+LDADD = $(top_builddir)/lib/libfribidi.la $(GLIB_LIBS)
+
+if FRIBIDI_CHARSETS
+else # !FRIBIDI_CHARSETS
+LDADD += $(top_builddir)/charset/libfribidi-char-sets.la
+endif # !FRIBIDI_CHARSETS
+
+$(top_builddir)/lib/libfribidi.la:
+       cd $(top_builddir)/lib && $(MAKE) $(AM_MAKEFLAGS) libfribidi.la
diff --git a/bin/fribidi-benchmark.c b/bin/fribidi-benchmark.c
new file mode 100644 (file)
index 0000000..9fd015c
--- /dev/null
@@ -0,0 +1,278 @@
+/* FriBidi
+ * fribidi-benchmark.c - command line benchmark tool for libfribidi
+ *
+ * $Id: fribidi-benchmark.c,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/bin/fribidi-benchmark.c,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#include <fribidi.h>
+
+#include <common.h>
+
+#include <stdio.h>
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_SYS_TIMES_H
+# include <sys/times.h>
+#endif
+
+#include "getopt.h"
+
+#define appname "fribidi_benchmark"
+
+#define MAX_STR_LEN 1000
+
+static void
+die2 (
+  const char *fmt,
+  const char *arg
+)
+{
+  fprintf (stderr, "%s: ", appname);
+  if (fmt)
+    fprintf (stderr, fmt, arg);
+  fprintf (stderr, "Try `%s --help' for more information.\n", appname);
+  exit (-1);
+}
+
+#define TEST_STRING \
+  "a THE QUICK -123,456 (FOX JUMPS ) DOG the quick !1@7#4&5^ over the dog " \
+  "123,456 OVER THE 5%+ 4.0 LAZY"
+#define TEST_STRING_EXPLICIT \
+  "this is _LJUST_o a _lsimple _Rte%ST_o th_oat  HAS A _LPDF missing" \
+  "AnD hOw_L AbOuT, 123,987 tHiS_o a GO_oOD - _L_oTE_oST. " \
+  "here_L is_o_o_o _R a good one_o And _r 123,987_LT_oHE_R next_o oNE:" \
+  "_R_r and the last _LONE_o IS THE _rbest _lONE and" \
+  "a _L_L_L_LL_L_L_L_L_L_L_L_L_Rbug_o_o_o_o_o_o" \
+  "_R_r and the last _LONE_o IS THE _rbest _lONE and" \
+  "A REAL BIG_l_o BUG! _L _l_r_R_L_laslaj siw_o_Rlkj sslk" \
+  "a _L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_Rbug" \
+  "here_L is_o_o_o _R ab  one_o _r 123,987_LT_oHE_R t_o oNE:" \
+
+int niter;
+
+static void
+help (
+  void
+)
+{
+  printf
+    ("Usage: " appname " [OPTION]...\n"
+     "A program for benchmarking the speed of the " FRIBIDI_NAME
+     " library.\n" "\n"
+     "  -h, --help            Display this information and exit\n"
+     "  -V, --version         Display version information and exit\n"
+     "  -n, --niter N         Number of iterations. Default is %d.\n"
+     "\nReport bugs online at\n<" FRIBIDI_BUGREPORT ">.\n", niter);
+  exit (0);
+}
+
+static void
+version (
+  void
+)
+{
+  printf (appname " %s", fribidi_version_info);
+  exit (0);
+}
+
+static double
+utime (
+  void
+)
+{
+  struct tms tb;
+  times (&tb);
+  return 0.01 * tb.tms_utime;
+}
+
+static void
+benchmark (
+  char *S_,
+  int niter
+)
+{
+  int len, i;
+  FriBidiChar us[MAX_STR_LEN], out_us[MAX_STR_LEN];
+  FriBidiStrIndex positionLtoV[MAX_STR_LEN], positionVtoL[MAX_STR_LEN];
+  FriBidiLevel embedding_list[MAX_STR_LEN];
+  FriBidiCharType base;
+  double time0, time1;
+
+  {
+    int j;
+    len = strlen (S_);
+    for (i = 0, j = 0; i < len; i++)
+      {
+       if (S_[i] == '_')
+         switch (S_[++i])
+           {
+           case '>':
+             us[j++] = FRIBIDI_CHAR_LRM;
+             break;
+           case '<':
+             us[j++] = FRIBIDI_CHAR_RLM;
+             break;
+           case 'l':
+             us[j++] = FRIBIDI_CHAR_LRE;
+             break;
+           case 'r':
+             us[j++] = FRIBIDI_CHAR_RLE;
+             break;
+           case 'L':
+             us[j++] = FRIBIDI_CHAR_LRO;
+             break;
+           case 'R':
+             us[j++] = FRIBIDI_CHAR_RLO;
+             break;
+           case 'o':
+             us[j++] = FRIBIDI_CHAR_PDF;
+             break;
+           case '_':
+             us[j++] = '_';
+             break;
+           default:
+             us[j++] = '_';
+             i--;
+             break;
+           }
+       else
+         us[j++] = S_[i];
+       if (us[j] >= 'A' && us[j] <= 'F')
+         us[j] += FRIBIDI_CHAR_ARABIC_ALEF - 'A';
+       else if (us[j] >= 'G' && us[j] <= 'Z')
+         us[j] += FRIBIDI_CHAR_HEBREW_ALEF - 'G';
+       else if (us[j] >= '6' && us[j] <= '9')
+         us[j] += FRIBIDI_CHAR_ARABIC_ZERO - '0';
+      }
+    len = j;
+  }
+
+  /* Start timer */
+  time0 = utime ();
+
+  for (i = 0; i < niter; i++)
+    {
+      /* Create a bidi string */
+      base = FRIBIDI_TYPE_ON;
+      fribidi_log2vis (us, len, &base,
+                      /* output */
+                      out_us, positionVtoL, positionLtoV, embedding_list);
+    }
+
+  /* stop timer */
+  time1 = utime ();
+
+  /* output result */
+  printf ("Length = %d\n", len);
+  printf ("Iterations = %d\n", niter);
+  printf ("%d len*iterations in %f seconds\n", len * niter, time1 - time0);
+  printf ("= %.0f kilo.length.iterations/second\n",
+         1.0 * len * niter / 1000 / (time1 - time0));
+
+  return;
+}
+
+int
+main (
+  int argc,
+  char *argv[]
+)
+{
+  niter = 2000;
+
+  /* Parse the command line */
+  argv[0] = appname;
+  while (1)
+    {
+      int option_index = 0, c;
+      static struct option long_options[] = {
+       {"help", 0, 0, 'h'},
+       {"version", 0, 0, 'V'},
+       {"niter", 0, 0, 'n'},
+       {0, 0, 0, 0}
+      };
+
+      c = getopt_long (argc, argv, "hVn:", long_options, &option_index);
+      if (c == -1)
+       break;
+
+      switch (c)
+       {
+       case 0:
+         break;
+       case 'h':
+         help ();
+         break;
+       case 'V':
+         version ();
+         break;
+       case 'n':
+         niter = atoi (optarg);
+         if (niter <= 0)
+           die2 ("invalid number of iterations `%s'\n", optarg);
+         break;
+       case ':':
+       case '?':
+         die2 (NULL, NULL);
+         break;
+       default:
+         break;
+       }
+    }
+
+  printf ("* Without explicit marks:\n");
+  benchmark (TEST_STRING, niter);
+  printf ("\n");
+  printf ("* With explicit marks:\n");
+  benchmark (TEST_STRING_EXPLICIT, niter);
+
+  return 0;
+}
+
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/bin/fribidi-main.c b/bin/fribidi-main.c
new file mode 100644 (file)
index 0000000..60d8fbf
--- /dev/null
@@ -0,0 +1,597 @@
+/* FriBidi
+ * fribidi-main.c - command line program for libfribidi
+ *
+ * $Id: fribidi-main.c,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/bin/fribidi-main.c,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#include <fribidi.h>
+#if !FRIBIDI_CHARSETS
+# if FRIBIDI_MAIN_USE_ICONV_H
+#  include <iconv.h>
+# else /* !FRIBIDI_MAIN_USE_ICONV_H */
+#  include <fribidi-char-sets.h>
+# endif        /* FRIBIDI_MAIN_USE_ICONV_H */
+#endif /* !FRIBIDI_CHARSETS */
+
+#include <common.h>
+
+#include <stdio.h>
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_SYS_TIMES_H
+# include <sys/times.h>
+#endif
+
+#include "getopt.h"
+
+#define appname "fribidi"
+
+#define MAX_STR_LEN 65000
+
+
+#define ALLOCATE(tp,ln) ((tp *) malloc (sizeof (tp) * (ln)))
+
+static void
+die2 (
+  const char *fmt,
+  const char *arg
+)
+{
+  fprintf (stderr, "%s: ", appname);
+  if (fmt)
+    fprintf (stderr, fmt, arg);
+  fprintf (stderr, "Try `%s --help' for more information.\n", appname);
+  exit (-1);
+}
+
+#define die1(msg) die2("%s", msg)
+
+fribidi_boolean do_break, do_pad, do_mirror, do_reorder_nsm, do_clean;
+fribidi_boolean show_input, show_visual, show_basedir;
+fribidi_boolean show_ltov, show_vtol, show_levels;
+int text_width;
+char *char_set;
+char *bol_text, *eol_text;
+FriBidiCharType input_base_direction;
+#if FRIBIDI_MAIN_USE_ICONV_H
+iconv_t to_ucs4, from_ucs4;
+#else /* !FRIBIDI_MAIN_USE_ICONV_H */
+int char_set_num;
+#endif /* !FRIBIDI_MAIN_USE_ICONV_H */
+
+static void
+help (
+  void
+)
+{
+  /* Break help string into little ones, to assure ISO C89 conformance */
+  printf ("Usage: " appname " [OPTION]... [FILE]...\n"
+         "A command line interface for the " FRIBIDI_NAME " library.\n"
+         "Convert a logical string to visual.\n"
+         "\n"
+         "  -h, --help            Display this information and exit\n"
+         "  -V, --version         Display version information and exit\n"
+         "  -v, --verbose         Verbose mode, same as --basedir --ltov --vtol\n"
+         "                        --levels --changes\n");
+  printf ("  -d, --debug           Output debug information\n"
+         "  -t, --test            Test " FRIBIDI_NAME
+         ", same as --clean --nobreak\n"
+         "                        --showinput --reordernsm\n");
+#if FRIBIDI_MAIN_USE_ICONV_H
+  printf ("  -c, --charset CS      Specify character set, default is %s.\n"
+         "                        CS should be a valid iconv character set name\n",
+         char_set);
+#else /* !FRIBIDI_MAIN_USE_ICONV_H */
+  printf ("  -c, --charset CS      Specify character set, default is %s\n"
+         "      --charsetdesc CS  Show descriptions for character set CS and exit\n"
+         "      --caprtl          Old style: set character set to CapRTL\n",
+         char_set);
+#endif /* !FRIBIDI_MAIN_USE_ICONV_H */
+  printf ("      --showinput       Output the input string too\n"
+         "      --nopad           Do not right justify RTL lines\n"
+         "      --nobreak         Do not break long lines\n"
+         "  -w, --width W         Screen width for padding, default is %d, but if\n"
+         "                        enviroment variable COLUMNS is defined, its value\n"
+         "                        will be used, --width overrides both of them.\n",
+         text_width);
+  printf
+    ("  -B, --bol BOL         Output string BOL before the visual string\n"
+     "  -E, --eol EOL         Output string EOL after the visual string\n"
+     "      --rtl             Force base direction to RTL\n"
+     "      --ltr             Force base direction to LTR\n"
+     "      --wrtl            Set base direction to RTL if no strong character found\n");
+  printf
+    ("      --wltr            Set base direction to LTR if no strong character found\n"
+     "                        (default)\n"
+     "      --nomirror        Turn mirroring off, to do it later\n"
+     "      --reordernsm      Reorder NSM sequences to follow their base character\n"
+     "      --clean           Remove explicit format codes in visual string\n"
+     "                        output, currently does not affect other outputs\n"
+     "      --basedir         Output Base Direction\n");
+  printf ("      --ltov            Output Logical to Visual position map\n"
+         "      --vtol            Output Visual to Logical position map\n"
+         "      --levels          Output Embedding Levels\n"
+         "      --novisual        Do not output the visual string, to be used with\n"
+         "                        --basedir, --ltov, --vtol, --levels, --changes\n");
+  printf ("  All string indexes are zero based\n" "\n" "Output:\n"
+         "  For each line of input, output something like this:\n"
+         "    [input-str` => '][BOL][[padding space]visual-str][EOL]\n"
+         "    [\\n base-dir][\\n ltov-map][\\n vtol-map][\\n levels][\\n changes]\n");
+
+#if !FRIBIDI_MAIN_USE_ICONV_H
+  {
+    int i;
+    printf ("\n" "Available character sets:\n");
+    for (i = 1; i <= FRIBIDI_CHAR_SETS_NUM; i++)
+      printf ("  * %-10s: %-25s%1s\n",
+             fribidi_char_set_name (i), fribidi_char_set_title (i),
+             (fribidi_char_set_desc (i) ? "X" : ""));
+    printf
+      ("  X: Character set has descriptions, use --charsetdesc to see\n");
+  }
+#endif /* !FRIBIDI_MAIN_USE_ICONV_H */
+
+  printf ("\nReport bugs online at\n<" FRIBIDI_BUGREPORT ">.\n");
+  exit (0);
+}
+
+static void
+version (
+  void
+)
+{
+  printf (appname " %s", fribidi_version_info);
+  exit (0);
+}
+
+int
+main (
+  int argc,
+  char *argv[]
+)
+{
+  int exit_val;
+  fribidi_boolean file_found;
+  char *s;
+  FILE *IN;
+
+  text_width = 80;
+  do_break = TRUE;
+  do_pad = TRUE;
+  do_mirror = TRUE;
+  do_clean = FALSE;
+  do_reorder_nsm = FALSE;
+  show_input = FALSE;
+  show_visual = TRUE;
+  show_basedir = FALSE;
+  show_ltov = FALSE;
+  show_vtol = FALSE;
+  show_levels = FALSE;
+  char_set = "UTF-8";
+  bol_text = NULL;
+  eol_text = NULL;
+  input_base_direction = FRIBIDI_TYPE_ON;
+
+  if ((s = getenv ("COLUMNS")))
+    {
+      int i;
+
+      i = atoi (s);
+      if (i > 0)
+       text_width = i;
+    }
+
+#define CHARSETDESC 257
+#define CAPRTL 258
+
+  /* Parse the command line with getopt library */
+  /* Must set argv[0], getopt uses it to generate error messages */
+  argv[0] = appname;
+  while (1)
+    {
+      int option_index = 0, c;
+      static struct option long_options[] = {
+       {"help", 0, 0, 'h'},
+       {"version", 0, 0, 'V'},
+       {"verbose", 0, 0, 'v'},
+       {"debug", 0, 0, 'd'},
+       {"test", 0, 0, 't'},
+       {"charset", 1, 0, 'c'},
+#if !FRIBIDI_MAIN_USE_ICONV_H
+       {"charsetdesc", 1, 0, CHARSETDESC},
+       {"caprtl", 0, 0, CAPRTL},
+#endif /* FRIBIDI_MAIN_USE_ICONV_H */
+       {"showinput", 0, &show_input, TRUE},
+       {"nopad", 0, &do_pad, FALSE},
+       {"nobreak", 0, &do_break, FALSE},
+       {"width", 1, 0, 'w'},
+       {"bol", 1, 0, 'B'},
+       {"eol", 1, 0, 'E'},
+       {"nomirror", 0, &do_mirror, FALSE},
+       {"reordernsm", 0, &do_reorder_nsm, TRUE},
+       {"clean", 0, &do_clean, TRUE},
+       {"ltr", 0, (int *) (void *) &input_base_direction, FRIBIDI_TYPE_L},
+       {"rtl", 0, (int *) (void *) &input_base_direction, FRIBIDI_TYPE_R},
+       {"wltr", 0, (int *) (void *) &input_base_direction, FRIBIDI_TYPE_WL},
+       {"wrtl", 0, (int *) (void *) &input_base_direction, FRIBIDI_TYPE_WR},
+       {"basedir", 0, &show_basedir, TRUE},
+       {"ltov", 0, &show_ltov, TRUE},
+       {"vtol", 0, &show_vtol, TRUE},
+       {"levels", 0, &show_levels, TRUE},
+       {"novisual", 0, &show_visual, FALSE},
+       {0, 0, 0, 0}
+      };
+
+      c =
+       getopt_long (argc, argv, "hVvdtc:w:B:E:", long_options,
+                    &option_index);
+      if (c == -1)
+       break;
+
+      switch (c)
+       {
+       case 0:
+         break;
+       case 'h':
+         help ();
+         break;
+       case 'V':
+         version ();
+         break;
+       case 'v':
+         show_basedir = show_ltov = show_vtol = show_levels = TRUE;
+         break;
+       case 'w':
+         text_width = atoi (optarg);
+         if (text_width <= 0)
+           die2 ("invalid screen width `%s'\n", optarg);
+         break;
+       case 'B':
+         bol_text = optarg;
+         break;
+       case 'E':
+         eol_text = optarg;
+         break;
+       case 'd':
+         if (!fribidi_set_debug (TRUE))
+           die1
+             ("lib" FRIBIDI
+              " must be compiled with DEBUG option to enable\nturn debug info on.\n");
+         break;
+       case 't':
+         do_clean = show_input = do_reorder_nsm = TRUE;
+         do_break = FALSE;
+         break;
+       case 'c':
+         char_set = strdup (optarg);
+         break;
+#if !FRIBIDI_MAIN_USE_ICONV_H
+       case CAPRTL:
+         char_set = "CapRTL";
+         break;
+       case CHARSETDESC:
+         char_set = strdup (optarg);
+         char_set_num = fribidi_parse_charset (char_set);
+         if (!char_set_num)
+           die2 ("unrecognized character set `%s'\n", char_set);
+         if (!fribidi_char_set_desc (char_set_num))
+           die2 ("no description available for character set `%s'\n",
+                 fribidi_char_set_name (char_set_num));
+         else
+           printf ("Descriptions for character set %s:\n"
+                   "\n" "%s", fribidi_char_set_title (char_set_num),
+                   fribidi_char_set_desc (char_set_num));
+         exit (0);
+         break;
+#endif /* !FRIBIDI_MAIN_USE_ICONV_H */
+       case ':':
+       case '?':
+         die2 (NULL, NULL);
+         break;
+       default:
+         break;
+       }
+    }
+
+#if FRIBIDI_MAIN_USE_ICONV_H
+  to_ucs4 = iconv_open ("WCHAR_T", char_set);
+  from_ucs4 = iconv_open (char_set, "WCHAR_T");
+#else /* !FRIBIDI_MAIN_USE_ICONV_H */
+  char_set_num = fribidi_parse_charset (char_set);
+#endif /* !FRIBIDI_MAIN_USE_ICONV_H */
+
+#if FRIBIDI_MAIN_USE_ICONV_H
+  if (to_ucs4 == (iconv_t) (-1) || from_ucs4 == (iconv_t) (-1))
+#else /* !FRIBIDI_MAIN_USE_ICONV_H */
+  if (!char_set_num)
+#endif /* !FRIBIDI_MAIN_USE_ICONV_H */
+    die2 ("unrecognized character set `%s'\n", char_set);
+
+  fribidi_set_mirroring (do_mirror);
+  fribidi_set_reorder_nsm (do_reorder_nsm);
+  exit_val = 0;
+  file_found = FALSE;
+  while (optind < argc || !file_found)
+    {
+      char *S_;
+
+      S_ = optind < argc ? argv[optind++] : "-";
+      file_found = TRUE;
+
+      /* Open the infile for reading */
+      if (S_[0] == '-' && !S_[1])
+       {
+         IN = stdin;
+       }
+      else
+       {
+         IN = fopen (S_, "r");
+         if (!IN)
+           {
+             fprintf (stderr, "%s: %s: no such file or directory\n",
+                      appname, S_);
+             exit_val = 1;
+             continue;
+           }
+       }
+
+      /* Read and process input one line at a time */
+      {
+       char S_[MAX_STR_LEN];
+       int padding_width, break_width;
+
+       padding_width = show_input ? (text_width - 10) / 2 : text_width;
+       break_width = do_break ? padding_width : 3 * MAX_STR_LEN;
+
+       while (fgets (S_, sizeof (S_) - 1, IN))
+         {
+           char *new_line, *nl_found;
+           FriBidiChar logical[MAX_STR_LEN];
+           char outstring[MAX_STR_LEN];
+           FriBidiCharType base;
+           FriBidiStrIndex len;
+
+           nl_found = "";
+           S_[sizeof (S_) - 1] = 0;
+           len = strlen (S_);
+           /* chop */
+           if (S_[len - 1] == '\n')
+             {
+               len--;
+               S_[len] = '\0';
+               new_line = "\n";
+             }
+           else
+             new_line = "";
+
+#if FRIBIDI_MAIN_USE_ICONV_H
+           {
+             char *st = S_, *ust = (char *) logical;
+             int in_len = (int) len;
+             len = sizeof logical;
+             iconv (to_ucs4, &st, &in_len, &ust, (int *) &len);
+             len = (FriBidiChar *) ust - logical;
+           }
+#else /* !FRIBIDI_MAIN_USE_ICONV_H */
+           len = fribidi_charset_to_unicode (char_set_num, S_, len, logical);
+#endif /* !FRIBIDI_MAIN_USE_ICONV_H */
+
+           {
+             FriBidiChar *visual;
+             FriBidiStrIndex *ltov, *vtol;
+             FriBidiLevel *levels;
+             FriBidiStrIndex new_len;
+             fribidi_boolean log2vis;
+
+             visual = show_visual ? ALLOCATE (FriBidiChar,
+                                              len + 1
+             ) : NULL;
+             ltov = show_ltov ? ALLOCATE (FriBidiStrIndex,
+                                          len + 1
+             ) : NULL;
+             vtol = show_vtol ? ALLOCATE (FriBidiStrIndex,
+                                          len + 1
+             ) : NULL;
+             levels = show_levels ? ALLOCATE (FriBidiLevel,
+                                              len + 1
+             ) : NULL;
+
+             /* Create a bidi string. */
+             base = input_base_direction;
+             log2vis = fribidi_log2vis (logical, len, &base,
+                                        /* output */
+                                        visual, ltov, vtol, levels);
+             if (log2vis)
+               {
+
+                 if (show_input)
+                   printf ("%-*s => ", padding_width, S_);
+
+                 new_len = len;
+
+                 /* Remove explicit marks, if asked for. */
+                 if (do_clean)
+                   len =
+                     fribidi_remove_bidi_marks (visual, len, ltov, vtol,
+                                                levels);
+
+                 if (show_visual)
+                   {
+                     printf (nl_found);
+
+                     if (bol_text)
+                       printf ("%s", bol_text);
+
+                     /* Convert it to input charset and print. */
+                     {
+                       FriBidiStrIndex idx, st;
+                       for (idx = 0; idx < len;)
+                         {
+                           FriBidiStrIndex wid, inlen;
+
+                           wid = break_width;
+                           st = idx;
+#if !FRIBIDI_MAIN_USE_ICONV_H
+                           if (char_set_num != FRIBIDI_CHAR_SET_CAP_RTL)
+#endif /* !FRIBIDI_MAIN_USE_ICONV_H */
+                             while (wid > 0 && idx < len)
+                               {
+                                 wid -=
+                                   fribidi_get_type (visual[idx]) &
+                                   (FRIBIDI_MASK_BN | FRIBIDI_MASK_NSM) ? 0 :
+                                   1;
+                                 idx++;
+                               }
+#if !FRIBIDI_MAIN_USE_ICONV_H
+                           else
+                             while (wid > 0 && idx < len)
+                               {
+                                 wid--;
+                                 idx++;
+                               }
+#endif /* !FRIBIDI_MAIN_USE_ICONV_H */
+                           if (wid < 0 && idx > st + 1)
+                             idx--;
+                           inlen = idx - st;
+
+#if FRIBIDI_MAIN_USE_ICONV_H
+                           {
+                             char *str = outstring, *ust =
+                               (char *) (visual + st);
+                             int in_len = inlen * sizeof visual[0];
+                             new_len = sizeof outstring;
+                             iconv (from_ucs4, &ust, &in_len, &str,
+                                    (int *) &new_len);
+                             *str = '\0';
+                             new_len = str - outstring;
+                           }
+#else /* !FRIBIDI_MAIN_USE_ICONV_H */
+                           new_len =
+                             fribidi_unicode_to_charset (char_set_num,
+                                                         visual + st, inlen,
+                                                         outstring);
+#endif /* !FRIBIDI_MAIN_USE_ICONV_H */
+                           if (FRIBIDI_IS_RTL (base))
+                             printf ("%*s",
+                                     (int) (do_pad ? (padding_width +
+                                                      strlen (outstring) -
+                                                      (break_width -
+                                                       wid)) : 0),
+                                     outstring);
+                           else
+                             printf ("%s", outstring);
+                           if (idx < len)
+                             printf ("\n");
+                         }
+                     }
+                     if (eol_text)
+                       printf ("%s", eol_text);
+
+                     nl_found = "\n";
+                   }
+                 if (show_basedir)
+                   {
+                     printf (nl_found);
+                     printf ("Base direction: %s",
+                             (FRIBIDI_DIR_TO_LEVEL (base) ? "R" : "L"));
+                     nl_found = "\n";
+                   }
+                 if (show_ltov)
+                   {
+                     FriBidiStrIndex i;
+
+                     printf (nl_found);
+                     for (i = 0; i < len; i++)
+                       printf ("%ld ", (long) ltov[i]);
+                     nl_found = "\n";
+                   }
+                 if (show_vtol)
+                   {
+                     FriBidiStrIndex i;
+
+                     printf (nl_found);
+                     for (i = 0; i < len; i++)
+                       printf ("%ld ", (long) vtol[i]);
+                     nl_found = "\n";
+                   }
+                 if (show_levels)
+                   {
+                     FriBidiStrIndex i;
+
+                     printf (nl_found);
+                     for (i = 0; i < len; i++)
+                       printf ("%d ", (int) levels[i]);
+                     nl_found = "\n";
+                   }
+               }
+             else
+               {
+                 exit_val = 2;
+               }
+
+             if (show_visual)
+               free (visual);
+             if (show_ltov)
+               free (ltov);
+             if (show_vtol)
+               free (vtol);
+             if (show_levels)
+               free (levels);
+           }
+
+           if (*nl_found)
+             printf (new_line);
+         }
+      }
+    }
+
+  return exit_val;
+}
+
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/bin/getopt.c b/bin/getopt.c
new file mode 100644 (file)
index 0000000..74330fa
--- /dev/null
@@ -0,0 +1,1268 @@
+/* Getopt for GNU.
+   NOTE: getopt is now part of the C library, so if you don't know what
+   "Keep this file name-space clean" means, talk to drepper@gnu.org
+   before changing it!
+   Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001,2002,2003,2004
+       Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along
+   with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+\f
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
+   Ditto for AIX 3.2 and <stdlib.h>.  */
+#ifndef _NO_PROTO
+# define _NO_PROTO
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#define GETOPT_INTERFACE_VERSION 2
+#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
+# include <gnu-versions.h>
+# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
+#  define ELIDE_CODE
+# endif
+#endif
+
+#ifndef ELIDE_CODE
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef __GNU_LIBRARY__
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+   contain conflicting prototypes for getopt.  */
+# include <stdlib.h>
+# include <unistd.h>
+#endif /* GNU C library.  */
+
+#include <string.h>
+
+#ifdef VMS
+# include <unixlib.h>
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "gettext.h"
+# define _(msgid) gettext (msgid)
+#endif
+
+#if defined _LIBC && defined USE_IN_LIBIO
+# include <wchar.h>
+#endif
+
+#ifndef attribute_hidden
+# define attribute_hidden
+#endif
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+   but it behaves differently for the user, since it allows the user
+   to intersperse the options with the other arguments.
+
+   As `getopt' works, it permutes the elements of ARGV so that,
+   when it is done, all the options precede everything else.  Thus
+   all application programs are extended to handle flexible argument order.
+
+   Setting the environment variable POSIXLY_CORRECT disables permutation.
+   Then the behavior is completely standard.
+
+   GNU application programs can use a third alternative mode in which
+   they can distinguish the relative order of options and other arguments.  */
+
+#include "getopt.h"
+#include "getopt_int.h"
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns -1, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+/* 1003.2 says this must be 1 before any call.  */
+int optind = 1;
+
+/* Callers store zero here to inhibit the error message
+   for unrecognized options.  */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+   This must be initialized on some systems to avoid linking in the
+   system's own getopt implementation.  */
+
+int optopt = '?';
+
+/* Keep a global copy of all internal members of getopt_data.  */
+
+static struct _getopt_data getopt_data;
+\f
+
+#ifndef __GNU_LIBRARY__
+
+/* Avoid depending on library functions or files
+   whose names are inconsistent.  */
+
+#ifndef getenv
+extern char *getenv (
+);
+#endif
+
+#endif /* not __GNU_LIBRARY__ */
+\f
+#ifdef _LIBC
+/* Stored original parameters.
+   XXX This is no good solution.  We should rather copy the args so
+   that we can compare them later.  But we must not use malloc(3).  */
+extern int __libc_argc;
+extern char **__libc_argv;
+
+/* Bash 2.0 gives us an environment variable containing flags
+   indicating ARGV elements that should not be considered arguments.  */
+
+# ifdef USE_NONOPTION_FLAGS
+/* Defined in getopt_init.c  */
+extern char *__getopt_nonoption_flags;
+# endif
+
+# ifdef USE_NONOPTION_FLAGS
+#  define SWAP_FLAGS(ch1, ch2) \
+  if (d->__nonoption_flags_len > 0)                                          \
+    {                                                                        \
+      char __tmp = __getopt_nonoption_flags[ch1];                            \
+      __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2];         \
+      __getopt_nonoption_flags[ch2] = __tmp;                                 \
+    }
+# else
+#  define SWAP_FLAGS(ch1, ch2)
+# endif
+#else /* !_LIBC */
+# define SWAP_FLAGS(ch1, ch2)
+#endif /* _LIBC */
+
+/* Exchange two adjacent subsequences of ARGV.
+   One subsequence is elements [first_nonopt,last_nonopt)
+   which contains all the non-options that have been skipped so far.
+   The other is elements [last_nonopt,optind), which contains all
+   the options processed since those non-options were skipped.
+
+   `first_nonopt' and `last_nonopt' are relocated so that they describe
+   the new indices of the non-options in ARGV after they are moved.  */
+
+static void
+exchange (
+  char **argv,
+  struct _getopt_data *d
+)
+{
+  int bottom = d->__first_nonopt;
+  int middle = d->__last_nonopt;
+  int top = d->optind;
+  char *tem;
+
+  /* Exchange the shorter segment with the far end of the longer segment.
+     That puts the shorter segment into the right place.
+     It leaves the longer segment in the right place overall,
+     but it consists of two parts that need to be swapped next.  */
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+  /* First make sure the handling of the `__getopt_nonoption_flags'
+     string can work normally.  Our top argument must be in the range
+     of the string.  */
+  if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len)
+    {
+      /* We must extend the array.  The user plays games with us and
+         presents new arguments.  */
+      char *new_str = malloc (top + 1);
+      if (new_str == NULL)
+       d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0;
+      else
+       {
+         memset (__mempcpy (new_str, __getopt_nonoption_flags,
+                            d->__nonoption_flags_max_len),
+                 '\0', top + 1 - d->__nonoption_flags_max_len);
+         d->__nonoption_flags_max_len = top + 1;
+         __getopt_nonoption_flags = new_str;
+       }
+    }
+#endif
+
+  while (top > middle && middle > bottom)
+    {
+      if (top - middle > middle - bottom)
+       {
+         /* Bottom segment is the short one.  */
+         int len = middle - bottom;
+         register int i;
+
+         /* Swap it with the top part of the top segment.  */
+         for (i = 0; i < len; i++)
+           {
+             tem = argv[bottom + i];
+             argv[bottom + i] = argv[top - (middle - bottom) + i];
+             argv[top - (middle - bottom) + i] = tem;
+             SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
+           }
+         /* Exclude the moved bottom segment from further swapping.  */
+         top -= len;
+       }
+      else
+       {
+         /* Top segment is the short one.  */
+         int len = top - middle;
+         register int i;
+
+         /* Swap it with the bottom part of the bottom segment.  */
+         for (i = 0; i < len; i++)
+           {
+             tem = argv[bottom + i];
+             argv[bottom + i] = argv[middle + i];
+             argv[middle + i] = tem;
+             SWAP_FLAGS (bottom + i, middle + i);
+           }
+         /* Exclude the moved top segment from further swapping.  */
+         bottom += len;
+       }
+    }
+
+  /* Update records for the slots the non-options now occupy.  */
+
+  d->__first_nonopt += (d->optind - d->__last_nonopt);
+  d->__last_nonopt = d->optind;
+}
+
+/* Initialize the internal data when the first call is made.  */
+
+static const char *
+_getopt_initialize (
+  int argc,
+  char *const *argv,
+  const char *optstring,
+  struct _getopt_data *d
+)
+{
+  /* Start processing options with ARGV-element 1 (since ARGV-element 0
+     is the program name); the sequence of previously skipped
+     non-option ARGV-elements is empty.  */
+
+  d->__first_nonopt = d->__last_nonopt = d->optind;
+
+  d->__nextchar = NULL;
+
+  d->__posixly_correct = !!getenv ("POSIXLY_CORRECT");
+
+  /* Determine how to handle the ordering of options and nonoptions.  */
+
+  if (optstring[0] == '-')
+    {
+      d->__ordering = RETURN_IN_ORDER;
+      ++optstring;
+    }
+  else if (optstring[0] == '+')
+    {
+      d->__ordering = REQUIRE_ORDER;
+      ++optstring;
+    }
+  else if (d->__posixly_correct)
+    d->__ordering = REQUIRE_ORDER;
+  else
+    d->__ordering = PERMUTE;
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+  if (!d->__posixly_correct && argc == __libc_argc && argv == __libc_argv)
+    {
+      if (d->__nonoption_flags_max_len == 0)
+       {
+         if (__getopt_nonoption_flags == NULL
+             || __getopt_nonoption_flags[0] == '\0')
+           d->__nonoption_flags_max_len = -1;
+         else
+           {
+             const char *orig_str = __getopt_nonoption_flags;
+             int len = d->__nonoption_flags_max_len = strlen (orig_str);
+             if (d->__nonoption_flags_max_len < argc)
+               d->__nonoption_flags_max_len = argc;
+             __getopt_nonoption_flags =
+               (char *) malloc (d->__nonoption_flags_max_len);
+             if (__getopt_nonoption_flags == NULL)
+               d->__nonoption_flags_max_len = -1;
+             else
+               memset (__mempcpy (__getopt_nonoption_flags, orig_str, len),
+                       '\0', d->__nonoption_flags_max_len - len);
+           }
+       }
+      d->__nonoption_flags_len = d->__nonoption_flags_max_len;
+    }
+  else
+    d->__nonoption_flags_len = 0;
+#endif
+
+  return optstring;
+}
+\f
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+   given in OPTSTRING.
+
+   If an element of ARGV starts with '-', and is not exactly "-" or "--",
+   then it is an option element.  The characters of this element
+   (aside from the initial '-') are option characters.  If `getopt'
+   is called repeatedly, it returns successively each of the option characters
+   from each of the option elements.
+
+   If `getopt' finds another option character, it returns that character,
+   updating `optind' and `nextchar' so that the next call to `getopt' can
+   resume the scan with the following option character or ARGV-element.
+
+   If there are no more option characters, `getopt' returns -1.
+   Then `optind' is the index in ARGV of the first ARGV-element
+   that is not an option.  (The ARGV-elements have been permuted
+   so that those that are not options now come last.)
+
+   OPTSTRING is a string containing the legitimate option characters.
+   If an option character is seen that is not listed in OPTSTRING,
+   return '?' after printing an error message.  If you set `opterr' to
+   zero, the error message is suppressed but we still return '?'.
+
+   If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+   so the following text in the same ARGV-element, or the text of the following
+   ARGV-element, is returned in `optarg'.  Two colons mean an option that
+   wants an optional arg; if there is text in the current ARGV-element,
+   it is returned in `optarg', otherwise `optarg' is set to zero.
+
+   If OPTSTRING starts with `-' or `+', it requests different methods of
+   handling the non-option ARGV-elements.
+   See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+   Long-named options begin with `--' instead of `-'.
+   Their names may be abbreviated as long as the abbreviation is unique
+   or is an exact match for some defined option.  If they have an
+   argument, it follows the option name in the same ARGV-element, separated
+   from the option name by a `=', or else the in next ARGV-element.
+   When `getopt' finds a long-named option, it returns 0 if that option's
+   `flag' field is nonzero, the value of the option's `val' field
+   if the `flag' field is zero.
+
+   The elements of ARGV aren't really const, because we permute them.
+   But we pretend they're const in the prototype to be compatible
+   with other systems.
+
+   LONGOPTS is a vector of `struct option' terminated by an
+   element containing a name which is zero.
+
+   LONGIND returns the index in LONGOPT of the long-named option found.
+   It is only valid when a long-named option has been found by the most
+   recent call.
+
+   If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+   long-named options.  */
+
+int
+_getopt_internal_r (
+  int argc,
+  char *const *argv,
+  const char *optstring,
+  const struct option *longopts,
+  int *longind,
+  int long_only,
+  struct _getopt_data *d
+)
+{
+  int print_errors = d->opterr;
+  if (optstring[0] == ':')
+    print_errors = 0;
+
+  if (argc < 1)
+    return -1;
+
+  d->optarg = NULL;
+
+  if (d->optind == 0 || !d->__initialized)
+    {
+      if (d->optind == 0)
+       d->optind = 1;          /* Don't scan ARGV[0], the program name.  */
+      optstring = _getopt_initialize (argc, argv, optstring, d);
+      d->__initialized = 1;
+    }
+
+  /* Test whether ARGV[optind] points to a non-option argument.
+     Either it does not have option syntax, or there is an environment flag
+     from the shell indicating it is not an option.  The later information
+     is only used when the used in the GNU libc.  */
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \
+                     || (d->optind < d->__nonoption_flags_len                \
+                         && __getopt_nonoption_flags[d->optind] == '1'))
+#else
+# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')
+#endif
+
+  if (d->__nextchar == NULL || *d->__nextchar == '\0')
+    {
+      /* Advance to the next ARGV-element.  */
+
+      /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
+         moved back by the user (who may also have changed the arguments).  */
+      if (d->__last_nonopt > d->optind)
+       d->__last_nonopt = d->optind;
+      if (d->__first_nonopt > d->optind)
+       d->__first_nonopt = d->optind;
+
+      if (d->__ordering == PERMUTE)
+       {
+         /* If we have just processed some options following some non-options,
+            exchange them so that the options come first.  */
+
+         if (d->__first_nonopt != d->__last_nonopt
+             && d->__last_nonopt != d->optind)
+           exchange ((char **) argv, d);
+         else if (d->__last_nonopt != d->optind)
+           d->__first_nonopt = d->optind;
+
+         /* Skip any additional non-options
+            and extend the range of non-options previously skipped.  */
+
+         while (d->optind < argc && NONOPTION_P)
+           d->optind++;
+         d->__last_nonopt = d->optind;
+       }
+
+      /* The special ARGV-element `--' means premature end of options.
+         Skip it like a null option,
+         then exchange with previous non-options as if it were an option,
+         then skip everything else like a non-option.  */
+
+      if (d->optind != argc && !strcmp (argv[d->optind], "--"))
+       {
+         d->optind++;
+
+         if (d->__first_nonopt != d->__last_nonopt
+             && d->__last_nonopt != d->optind)
+           exchange ((char **) argv, d);
+         else if (d->__first_nonopt == d->__last_nonopt)
+           d->__first_nonopt = d->optind;
+         d->__last_nonopt = argc;
+
+         d->optind = argc;
+       }
+
+      /* If we have done all the ARGV-elements, stop the scan
+         and back over any non-options that we skipped and permuted.  */
+
+      if (d->optind == argc)
+       {
+         /* Set the next-arg-index to point at the non-options
+            that we previously skipped, so the caller will digest them.  */
+         if (d->__first_nonopt != d->__last_nonopt)
+           d->optind = d->__first_nonopt;
+         return -1;
+       }
+
+      /* If we have come to a non-option and did not permute it,
+         either stop the scan or describe it to the caller and pass it by.  */
+
+      if (NONOPTION_P)
+       {
+         if (d->__ordering == REQUIRE_ORDER)
+           return -1;
+         d->optarg = argv[d->optind++];
+         return 1;
+       }
+
+      /* We have found another option-ARGV-element.
+         Skip the initial punctuation.  */
+
+      d->__nextchar = (argv[d->optind] + 1
+                      + (longopts != NULL && argv[d->optind][1] == '-'));
+    }
+
+  /* Decode the current option-ARGV-element.  */
+
+  /* Check whether the ARGV-element is a long option.
+
+     If long_only and the ARGV-element has the form "-f", where f is
+     a valid short option, don't consider it an abbreviated form of
+     a long option that starts with f.  Otherwise there would be no
+     way to give the -f short option.
+
+     On the other hand, if there's a long option "fubar" and
+     the ARGV-element is "-fu", do consider that an abbreviation of
+     the long option, just like "--fu", and not "-f" with arg "u".
+
+     This distinction seems to be the most useful approach.  */
+
+  if (longopts != NULL
+      && (argv[d->optind][1] == '-'
+         || (long_only && (argv[d->optind][2]
+                           || !strchr (optstring, argv[d->optind][1])))))
+    {
+      char *nameend;
+      const struct option *p;
+      const struct option *pfound = NULL;
+      int exact = 0;
+      int ambig = 0;
+      int indfound = -1;
+      int option_index;
+
+      for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++)
+       /* Do nothing.  */ ;
+
+      /* Test all long options for either exact match
+         or abbreviated matches.  */
+      for (p = longopts, option_index = 0; p->name; p++, option_index++)
+       if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar))
+         {
+           if ((unsigned int) (nameend - d->__nextchar)
+               == (unsigned int) strlen (p->name))
+             {
+               /* Exact match found.  */
+               pfound = p;
+               indfound = option_index;
+               exact = 1;
+               break;
+             }
+           else if (pfound == NULL)
+             {
+               /* First nonexact match found.  */
+               pfound = p;
+               indfound = option_index;
+             }
+           else if (long_only
+                    || pfound->has_arg != p->has_arg
+                    || pfound->flag != p->flag || pfound->val != p->val)
+             /* Second or later nonexact match found.  */
+             ambig = 1;
+         }
+
+      if (ambig && !exact)
+       {
+         if (print_errors)
+           {
+#if defined _LIBC && defined USE_IN_LIBIO
+             char *buf;
+
+             if (__asprintf (&buf, _("%s: option `%s' is ambiguous\n"),
+                             argv[0], argv[d->optind]) >= 0)
+               {
+                 _IO_flockfile (stderr);
+
+                 int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+                 ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+                 if (_IO_fwide (stderr, 0) > 0)
+                   __fwprintf (stderr, L"%s", buf);
+                 else
+                   fputs (buf, stderr);
+
+                 ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+                 _IO_funlockfile (stderr);
+
+                 free (buf);
+               }
+#else
+             fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
+                      argv[0], argv[d->optind]);
+#endif
+           }
+         d->__nextchar += strlen (d->__nextchar);
+         d->optind++;
+         d->optopt = 0;
+         return '?';
+       }
+
+      if (pfound != NULL)
+       {
+         option_index = indfound;
+         d->optind++;
+         if (*nameend)
+           {
+             /* Don't test has_arg with >, because some C compilers don't
+                allow it to be used on enums.  */
+             if (pfound->has_arg)
+               d->optarg = nameend + 1;
+             else
+               {
+                 if (print_errors)
+                   {
+#if defined _LIBC && defined USE_IN_LIBIO
+                     char *buf;
+                     int n;
+#endif
+
+                     if (argv[d->optind - 1][1] == '-')
+                       {
+                         /* --option */
+#if defined _LIBC && defined USE_IN_LIBIO
+                         n = __asprintf (&buf, _("\
+%s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name);
+#else
+                         fprintf (stderr, _("\
+%s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name);
+#endif
+                       }
+                     else
+                       {
+                         /* +option or -option */
+#if defined _LIBC && defined USE_IN_LIBIO
+                         n = __asprintf (&buf, _("\
+%s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[d->optind - 1][0], pfound->name);
+#else
+                         fprintf (stderr, _("\
+%s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[d->optind - 1][0], pfound->name);
+#endif
+                       }
+
+#if defined _LIBC && defined USE_IN_LIBIO
+                     if (n >= 0)
+                       {
+                         _IO_flockfile (stderr);
+
+                         int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+                         ((_IO_FILE *) stderr)->_flags2
+                           |= _IO_FLAGS2_NOTCANCEL;
+
+                         if (_IO_fwide (stderr, 0) > 0)
+                           __fwprintf (stderr, L"%s", buf);
+                         else
+                           fputs (buf, stderr);
+
+                         ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+                         _IO_funlockfile (stderr);
+
+                         free (buf);
+                       }
+#endif
+                   }
+
+                 d->__nextchar += strlen (d->__nextchar);
+
+                 d->optopt = pfound->val;
+                 return '?';
+               }
+           }
+         else if (pfound->has_arg == 1)
+           {
+             if (d->optind < argc)
+               d->optarg = argv[d->optind++];
+             else
+               {
+                 if (print_errors)
+                   {
+#if defined _LIBC && defined USE_IN_LIBIO
+                     char *buf;
+
+                     if (__asprintf (&buf, _("\
+%s: option `%s' requires an argument\n"), argv[0], argv[d->optind - 1]) >= 0)
+                       {
+                         _IO_flockfile (stderr);
+
+                         int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+                         ((_IO_FILE *) stderr)->_flags2
+                           |= _IO_FLAGS2_NOTCANCEL;
+
+                         if (_IO_fwide (stderr, 0) > 0)
+                           __fwprintf (stderr, L"%s", buf);
+                         else
+                           fputs (buf, stderr);
+
+                         ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+                         _IO_funlockfile (stderr);
+
+                         free (buf);
+                       }
+#else
+                     fprintf (stderr,
+                              _("%s: option `%s' requires an argument\n"),
+                              argv[0], argv[d->optind - 1]);
+#endif
+                   }
+                 d->__nextchar += strlen (d->__nextchar);
+                 d->optopt = pfound->val;
+                 return optstring[0] == ':' ? ':' : '?';
+               }
+           }
+         d->__nextchar += strlen (d->__nextchar);
+         if (longind != NULL)
+           *longind = option_index;
+         if (pfound->flag)
+           {
+             *(pfound->flag) = pfound->val;
+             return 0;
+           }
+         return pfound->val;
+       }
+
+      /* Can't find it as a long option.  If this is not getopt_long_only,
+         or the option starts with '--' or is not a valid short
+         option, then it's an error.
+         Otherwise interpret it as a short option.  */
+      if (!long_only || argv[d->optind][1] == '-'
+         || strchr (optstring, *d->__nextchar) == NULL)
+       {
+         if (print_errors)
+           {
+#if defined _LIBC && defined USE_IN_LIBIO
+             char *buf;
+             int n;
+#endif
+
+             if (argv[d->optind][1] == '-')
+               {
+                 /* --option */
+#if defined _LIBC && defined USE_IN_LIBIO
+                 n = __asprintf (&buf, _("%s: unrecognized option `--%s'\n"),
+                                 argv[0], d->__nextchar);
+#else
+                 fprintf (stderr, _("%s: unrecognized option `--%s'\n"),
+                          argv[0], d->__nextchar);
+#endif
+               }
+             else
+               {
+                 /* +option or -option */
+#if defined _LIBC && defined USE_IN_LIBIO
+                 n = __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"),
+                                 argv[0], argv[d->optind][0], d->__nextchar);
+#else
+                 fprintf (stderr, _("%s: unrecognized option `%c%s'\n"),
+                          argv[0], argv[d->optind][0], d->__nextchar);
+#endif
+               }
+
+#if defined _LIBC && defined USE_IN_LIBIO
+             if (n >= 0)
+               {
+                 _IO_flockfile (stderr);
+
+                 int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+                 ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+                 if (_IO_fwide (stderr, 0) > 0)
+                   __fwprintf (stderr, L"%s", buf);
+                 else
+                   fputs (buf, stderr);
+
+                 ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+                 _IO_funlockfile (stderr);
+
+                 free (buf);
+               }
+#endif
+           }
+         d->__nextchar = (char *) "";
+         d->optind++;
+         d->optopt = 0;
+         return '?';
+       }
+    }
+
+  /* Look at and handle the next short option-character.  */
+
+  {
+    char c = *d->__nextchar++;
+    char *temp = strchr (optstring, c);
+
+    /* Increment `optind' when we start to process its last character.  */
+    if (*d->__nextchar == '\0')
+      ++d->optind;
+
+    if (temp == NULL || c == ':')
+      {
+       if (print_errors)
+         {
+#if defined _LIBC && defined USE_IN_LIBIO
+           char *buf;
+           int n;
+#endif
+
+           if (d->__posixly_correct)
+             {
+               /* 1003.2 specifies the format of this message.  */
+#if defined _LIBC && defined USE_IN_LIBIO
+               n = __asprintf (&buf, _("%s: illegal option -- %c\n"),
+                               argv[0], c);
+#else
+               fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c);
+#endif
+             }
+           else
+             {
+#if defined _LIBC && defined USE_IN_LIBIO
+               n = __asprintf (&buf, _("%s: invalid option -- %c\n"),
+                               argv[0], c);
+#else
+               fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c);
+#endif
+             }
+
+#if defined _LIBC && defined USE_IN_LIBIO
+           if (n >= 0)
+             {
+               _IO_flockfile (stderr);
+
+               int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+               ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+               if (_IO_fwide (stderr, 0) > 0)
+                 __fwprintf (stderr, L"%s", buf);
+               else
+                 fputs (buf, stderr);
+
+               ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+               _IO_funlockfile (stderr);
+
+               free (buf);
+             }
+#endif
+         }
+       d->optopt = c;
+       return '?';
+      }
+    /* Convenience. Treat POSIX -W foo same as long option --foo */
+    if (temp[0] == 'W' && temp[1] == ';')
+      {
+       char *nameend;
+       const struct option *p;
+       const struct option *pfound = NULL;
+       int exact = 0;
+       int ambig = 0;
+       int indfound = 0;
+       int option_index;
+
+       /* This is an option that requires an argument.  */
+       if (*d->__nextchar != '\0')
+         {
+           d->optarg = d->__nextchar;
+           /* If we end this ARGV-element by taking the rest as an arg,
+              we must advance to the next element now.  */
+           d->optind++;
+         }
+       else if (d->optind == argc)
+         {
+           if (print_errors)
+             {
+               /* 1003.2 specifies the format of this message.  */
+#if defined _LIBC && defined USE_IN_LIBIO
+               char *buf;
+
+               if (__asprintf (&buf,
+                               _("%s: option requires an argument -- %c\n"),
+                               argv[0], c) >= 0)
+                 {
+                   _IO_flockfile (stderr);
+
+                   int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+                   ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+                   if (_IO_fwide (stderr, 0) > 0)
+                     __fwprintf (stderr, L"%s", buf);
+                   else
+                     fputs (buf, stderr);
+
+                   ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+                   _IO_funlockfile (stderr);
+
+                   free (buf);
+                 }
+#else
+               fprintf (stderr, _("%s: option requires an argument -- %c\n"),
+                        argv[0], c);
+#endif
+             }
+           d->optopt = c;
+           if (optstring[0] == ':')
+             c = ':';
+           else
+             c = '?';
+           return c;
+         }
+       else
+         /* We already incremented `d->optind' once;
+            increment it again when taking next ARGV-elt as argument.  */
+         d->optarg = argv[d->optind++];
+
+       /* optarg is now the argument, see if it's in the
+          table of longopts.  */
+
+       for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '=';
+            nameend++)
+         /* Do nothing.  */ ;
+
+       /* Test all long options for either exact match
+          or abbreviated matches.  */
+       for (p = longopts, option_index = 0; p->name; p++, option_index++)
+         if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar))
+           {
+             if ((unsigned int) (nameend - d->__nextchar) ==
+                 strlen (p->name))
+               {
+                 /* Exact match found.  */
+                 pfound = p;
+                 indfound = option_index;
+                 exact = 1;
+                 break;
+               }
+             else if (pfound == NULL)
+               {
+                 /* First nonexact match found.  */
+                 pfound = p;
+                 indfound = option_index;
+               }
+             else
+               /* Second or later nonexact match found.  */
+               ambig = 1;
+           }
+       if (ambig && !exact)
+         {
+           if (print_errors)
+             {
+#if defined _LIBC && defined USE_IN_LIBIO
+               char *buf;
+
+               if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"),
+                               argv[0], argv[d->optind]) >= 0)
+                 {
+                   _IO_flockfile (stderr);
+
+                   int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+                   ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
+
+                   if (_IO_fwide (stderr, 0) > 0)
+                     __fwprintf (stderr, L"%s", buf);
+                   else
+                     fputs (buf, stderr);
+
+                   ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+                   _IO_funlockfile (stderr);
+
+                   free (buf);
+                 }
+#else
+               fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
+                        argv[0], argv[d->optind]);
+#endif
+             }
+           d->__nextchar += strlen (d->__nextchar);
+           d->optind++;
+           return '?';
+         }
+       if (pfound != NULL)
+         {
+           option_index = indfound;
+           if (*nameend)
+             {
+               /* Don't test has_arg with >, because some C compilers don't
+                  allow it to be used on enums.  */
+               if (pfound->has_arg)
+                 d->optarg = nameend + 1;
+               else
+                 {
+                   if (print_errors)
+                     {
+#if defined _LIBC && defined USE_IN_LIBIO
+                       char *buf;
+
+                       if (__asprintf (&buf, _("\
+%s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name) >= 0)
+                         {
+                           _IO_flockfile (stderr);
+
+                           int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+                           ((_IO_FILE *) stderr)->_flags2
+                             |= _IO_FLAGS2_NOTCANCEL;
+
+                           if (_IO_fwide (stderr, 0) > 0)
+                             __fwprintf (stderr, L"%s", buf);
+                           else
+                             fputs (buf, stderr);
+
+                           ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+                           _IO_funlockfile (stderr);
+
+                           free (buf);
+                         }
+#else
+                       fprintf (stderr, _("\
+%s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name);
+#endif
+                     }
+
+                   d->__nextchar += strlen (d->__nextchar);
+                   return '?';
+                 }
+             }
+           else if (pfound->has_arg == 1)
+             {
+               if (d->optind < argc)
+                 d->optarg = argv[d->optind++];
+               else
+                 {
+                   if (print_errors)
+                     {
+#if defined _LIBC && defined USE_IN_LIBIO
+                       char *buf;
+
+                       if (__asprintf (&buf, _("\
+%s: option `%s' requires an argument\n"), argv[0], argv[d->optind - 1]) >= 0)
+                         {
+                           _IO_flockfile (stderr);
+
+                           int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+                           ((_IO_FILE *) stderr)->_flags2
+                             |= _IO_FLAGS2_NOTCANCEL;
+
+                           if (_IO_fwide (stderr, 0) > 0)
+                             __fwprintf (stderr, L"%s", buf);
+                           else
+                             fputs (buf, stderr);
+
+                           ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+                           _IO_funlockfile (stderr);
+
+                           free (buf);
+                         }
+#else
+                       fprintf (stderr,
+                                _("%s: option `%s' requires an argument\n"),
+                                argv[0], argv[d->optind - 1]);
+#endif
+                     }
+                   d->__nextchar += strlen (d->__nextchar);
+                   return optstring[0] == ':' ? ':' : '?';
+                 }
+             }
+           d->__nextchar += strlen (d->__nextchar);
+           if (longind != NULL)
+             *longind = option_index;
+           if (pfound->flag)
+             {
+               *(pfound->flag) = pfound->val;
+               return 0;
+             }
+           return pfound->val;
+         }
+       d->__nextchar = NULL;
+       return 'W';             /* Let the application handle it.   */
+      }
+    if (temp[1] == ':')
+      {
+       if (temp[2] == ':')
+         {
+           /* This is an option that accepts an argument optionally.  */
+           if (*d->__nextchar != '\0')
+             {
+               d->optarg = d->__nextchar;
+               d->optind++;
+             }
+           else
+             d->optarg = NULL;
+           d->__nextchar = NULL;
+         }
+       else
+         {
+           /* This is an option that requires an argument.  */
+           if (*d->__nextchar != '\0')
+             {
+               d->optarg = d->__nextchar;
+               /* If we end this ARGV-element by taking the rest as an arg,
+                  we must advance to the next element now.  */
+               d->optind++;
+             }
+           else if (d->optind == argc)
+             {
+               if (print_errors)
+                 {
+                   /* 1003.2 specifies the format of this message.  */
+#if defined _LIBC && defined USE_IN_LIBIO
+                   char *buf;
+
+                   if (__asprintf (&buf, _("\
+%s: option requires an argument -- %c\n"), argv[0], c) >= 0)
+                     {
+                       _IO_flockfile (stderr);
+
+                       int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
+                       ((_IO_FILE *) stderr)->_flags2 |=
+                         _IO_FLAGS2_NOTCANCEL;
+
+                       if (_IO_fwide (stderr, 0) > 0)
+                         __fwprintf (stderr, L"%s", buf);
+                       else
+                         fputs (buf, stderr);
+
+                       ((_IO_FILE *) stderr)->_flags2 = old_flags2;
+                       _IO_funlockfile (stderr);
+
+                       free (buf);
+                     }
+#else
+                   fprintf (stderr,
+                            _("%s: option requires an argument -- %c\n"),
+                            argv[0], c);
+#endif
+                 }
+               d->optopt = c;
+               if (optstring[0] == ':')
+                 c = ':';
+               else
+                 c = '?';
+             }
+           else
+             /* We already incremented `optind' once;
+                increment it again when taking next ARGV-elt as argument.  */
+             d->optarg = argv[d->optind++];
+           d->__nextchar = NULL;
+         }
+      }
+    return c;
+  }
+}
+
+int
+_getopt_internal (
+  int argc,
+  char *const *argv,
+  const char *optstring,
+  const struct option *longopts,
+  int *longind,
+  int long_only
+)
+{
+  int result;
+
+  getopt_data.optind = optind;
+  getopt_data.opterr = opterr;
+
+  result = _getopt_internal_r (argc, argv, optstring, longopts,
+                              longind, long_only, &getopt_data);
+
+  optind = getopt_data.optind;
+  optarg = getopt_data.optarg;
+  optopt = getopt_data.optopt;
+
+  return result;
+}
+
+int
+getopt (
+  int argc,
+  char *const *argv,
+  const char *optstring
+)
+{
+  return _getopt_internal (argc, argv, optstring,
+                          (const struct option *) 0, (int *) 0, 0);
+}
+
+#endif /* Not ELIDE_CODE.  */
+\f
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+   the above definition of `getopt'.  */
+
+int
+main (
+  int argc,
+  char **argv
+)
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+
+      c = getopt (argc, argv, "abc:d:0123456789");
+      if (c == -1)
+       break;
+
+      switch (c)
+       {
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+         if (digit_optind != 0 && digit_optind != this_option_optind)
+           printf ("digits occur in two different argv-elements.\n");
+         digit_optind = this_option_optind;
+         printf ("option %c\n", c);
+         break;
+
+       case 'a':
+         printf ("option a\n");
+         break;
+
+       case 'b':
+         printf ("option b\n");
+         break;
+
+       case 'c':
+         printf ("option c with value `%s'\n", optarg);
+         break;
+
+       case '?':
+         break;
+
+       default:
+         printf ("?? getopt returned character code 0%o ??\n", c);
+       }
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+       printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
diff --git a/bin/getopt.h b/bin/getopt.h
new file mode 100644 (file)
index 0000000..48ccab4
--- /dev/null
@@ -0,0 +1,187 @@
+/* Declarations for getopt.
+   Copyright (C) 1989-1994,1996-1999,2001,2003,2004
+   Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along
+   with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifndef _GETOPT_H
+
+#ifndef __need_getopt
+# define _GETOPT_H 1
+#endif
+
+/* If __GNU_LIBRARY__ is not already defined, either we are being used
+   standalone, or this is the first header included in the source file.
+   If we are being used with glibc, we need to include <features.h>, but
+   that does not exist if we are standalone.  So: if __GNU_LIBRARY__ is
+   not defined, include <ctype.h>, which will pull in <features.h> for us
+   if it's from glibc.  (Why ctype.h?  It's guaranteed to exist and it
+   doesn't flood the namespace with stuff the way some other headers do.)  */
+#if !defined __GNU_LIBRARY__
+# include <ctype.h>
+#endif
+
+#ifndef __THROW
+# ifndef __GNUC_PREREQ
+#  define __GNUC_PREREQ(maj, min) (0)
+# endif
+# if defined __cplusplus && __GNUC_PREREQ (2,8)
+#  define __THROW      throw ()
+# else
+#  define __THROW
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+  extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns -1, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+  extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+   for unrecognized options.  */
+
+  extern int opterr;
+
+/* Set to an option character which was unrecognized.  */
+
+  extern int optopt;
+
+#ifndef __need_getopt
+/* Describe the long-named options requested by the application.
+   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+   of `struct option' terminated by an element containing a name which is
+   zero.
+
+   The field `has_arg' is:
+   no_argument         (or 0) if the option does not take an argument,
+   required_argument   (or 1) if the option requires an argument,
+   optional_argument   (or 2) if the option takes an optional argument.
+
+   If the field `flag' is not NULL, it points to a variable that is set
+   to the value given in the field `val' when the option is found, but
+   left unchanged if the option is not found.
+
+   To have a long-named option do something other than set an `int' to
+   a compiled-in constant, such as set a value from `optarg', set the
+   option's `flag' field to zero and its `val' field to a nonzero
+   value (the equivalent single-letter option character, if there is
+   one).  For long options that have a zero `flag' field, `getopt'
+   returns the contents of the `val' field.  */
+
+  struct option
+  {
+    const char *name;
+    /* has_arg can't be an enum because some compilers complain about
+       type mismatches in all the code that assumes it is an int.  */
+    int has_arg;
+    int *flag;
+    int val;
+  };
+
+/* Names for the values of the `has_arg' field of `struct option'.  */
+
+# define no_argument           0
+# define required_argument     1
+# define optional_argument     2
+#endif                         /* need getopt */
+
+
+/* Get definitions and prototypes for functions to process the
+   arguments in ARGV (ARGC of them, minus the program name) for
+   options given in OPTS.
+
+   Return the option character from OPTS just read.  Return -1 when
+   there are no more options.  For unrecognized options, or options
+   missing arguments, `optopt' is set to the option letter, and '?' is
+   returned.
+
+   The OPTS string is a list of characters which are recognized option
+   letters, optionally followed by colons, specifying that that letter
+   takes an argument, to be placed in `optarg'.
+
+   If a letter in OPTS is followed by two colons, its argument is
+   optional.  This behavior is specific to the GNU `getopt'.
+
+   The argument `--' causes premature termination of argument
+   scanning, explicitly telling `getopt' that there are no more
+   options.
+
+   If OPTS begins with `--', then non-option arguments are treated as
+   arguments to the option '\0'.  This behavior is specific to the GNU
+   `getopt'.  */
+
+#ifdef __GNU_LIBRARY__
+/* Many other libraries have conflicting prototypes for getopt, with
+   differences in the consts, in stdlib.h.  To avoid compilation
+   errors, only prototype getopt for the GNU C library.  */
+  extern int getopt (
+  int ___argc,
+  char *const *___argv,
+  const char *__shortopts
+  ) __THROW;
+#else                          /* not __GNU_LIBRARY__ */
+  extern int getopt (
+  );
+#endif                         /* __GNU_LIBRARY__ */
+
+#ifndef __need_getopt
+  extern int getopt_long (
+  int ___argc,
+  char *const *___argv,
+  const char *__shortopts,
+  const struct option *__longopts,
+  int *__longind
+  ) __THROW;
+  extern int getopt_long_only (
+  int ___argc,
+  char *const *___argv,
+  const char *__shortopts,
+  const struct option *__longopts,
+  int *__longind
+  ) __THROW;
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+/* Make sure we later can get all the definitions and declarations.  */
+#undef __need_getopt
+
+#endif                         /* getopt.h */
diff --git a/bin/getopt1.c b/bin/getopt1.c
new file mode 100644 (file)
index 0000000..656d556
--- /dev/null
@@ -0,0 +1,213 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+   Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98,2004
+     Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along
+   with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+\f
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef _LIBC
+# include <getopt.h>
+#else
+# include "getopt.h"
+#endif
+#include "getopt_int.h"
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#define GETOPT_INTERFACE_VERSION 2
+#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
+#include <gnu-versions.h>
+#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
+#define ELIDE_CODE
+#endif
+#endif
+
+#ifndef ELIDE_CODE
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef __GNU_LIBRARY__
+#include <stdlib.h>
+#endif
+
+#ifndef        NULL
+#define NULL 0
+#endif
+
+int
+getopt_long (
+  int argc,
+  char *const *argv,
+  const char *options,
+  const struct option *long_options,
+  int *opt_index
+)
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
+}
+
+int
+_getopt_long_r (
+  int argc,
+  char *const *argv,
+  const char *options,
+  const struct option *long_options,
+  int *opt_index,
+  struct _getopt_data *d
+)
+{
+  return _getopt_internal_r (argc, argv, options, long_options, opt_index,
+                            0, d);
+}
+
+/* Like getopt_long, but '-' as well as '--' can indicate a long option.
+   If an option that starts with '-' (not '--') doesn't match a long option,
+   but does match a short option, it is parsed as a short option
+   instead.  */
+
+int
+getopt_long_only (
+  int argc,
+  char *const *argv,
+  const char *options,
+  const struct option *long_options,
+  int *opt_index
+)
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
+}
+
+int
+_getopt_long_only_r (
+  int argc,
+  char *const *argv,
+  const char *options,
+  const struct option *long_options,
+  int *opt_index,
+  struct _getopt_data *d
+)
+{
+  return _getopt_internal_r (argc, argv, options, long_options, opt_index,
+                            1, d);
+}
+
+#endif /* Not ELIDE_CODE.  */
+\f
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main (
+  int argc,
+  char **argv
+)
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+      int option_index = 0;
+      static struct option long_options[] = {
+       {"add", 1, 0, 0},
+       {"append", 0, 0, 0},
+       {"delete", 1, 0, 0},
+       {"verbose", 0, 0, 0},
+       {"create", 0, 0, 0},
+       {"file", 1, 0, 0},
+       {0, 0, 0, 0}
+      };
+
+      c = getopt_long (argc, argv, "abc:d:0123456789",
+                      long_options, &option_index);
+      if (c == -1)
+       break;
+
+      switch (c)
+       {
+       case 0:
+         printf ("option %s", long_options[option_index].name);
+         if (optarg)
+           printf (" with arg %s", optarg);
+         printf ("\n");
+         break;
+
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+         if (digit_optind != 0 && digit_optind != this_option_optind)
+           printf ("digits occur in two different argv-elements.\n");
+         digit_optind = this_option_optind;
+         printf ("option %c\n", c);
+         break;
+
+       case 'a':
+         printf ("option a\n");
+         break;
+
+       case 'b':
+         printf ("option b\n");
+         break;
+
+       case 'c':
+         printf ("option c with value `%s'\n", optarg);
+         break;
+
+       case 'd':
+         printf ("option d with value `%s'\n", optarg);
+         break;
+
+       case '?':
+         break;
+
+       default:
+         printf ("?? getopt returned character code 0%o ??\n", c);
+       }
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+       printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
diff --git a/bin/getopt_int.h b/bin/getopt_int.h
new file mode 100644 (file)
index 0000000..d3da519
--- /dev/null
@@ -0,0 +1,145 @@
+/* Internal declarations for getopt.
+   Copyright (C) 1989-1994,1996-1999,2001,2003,2004
+   Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along
+   with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifndef _GETOPT_INT_H
+#define _GETOPT_INT_H  1
+
+extern int _getopt_internal (
+  int ___argc,
+  char *const *___argv,
+  const char *__shortopts,
+  const struct option *__longopts,
+  int *__longind,
+  int __long_only
+);
+\f
+
+/* Reentrant versions which can handle parsing multiple argument
+   vectors at the same time.  */
+
+/* Data type for reentrant functions.  */
+struct _getopt_data
+{
+  /* These have exactly the same meaning as the corresponding global
+     variables, except that they are used for the reentrant
+     versions of getopt.  */
+  int optind;
+  int opterr;
+  int optopt;
+  char *optarg;
+
+  /* Internal members.  */
+
+  /* True if the internal members have been initialized.  */
+  int __initialized;
+
+  /* The next char to be scanned in the option-element
+     in which the last option character we returned was found.
+     This allows us to pick up the scan where we left off.
+
+     If this is zero, or a null string, it means resume the scan
+     by advancing to the next ARGV-element.  */
+  char *__nextchar;
+
+  /* Describe how to deal with options that follow non-option ARGV-elements.
+
+     If the caller did not specify anything,
+     the default is REQUIRE_ORDER if the environment variable
+     POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+     REQUIRE_ORDER means don't recognize them as options;
+     stop option processing when the first non-option is seen.
+     This is what Unix does.
+     This mode of operation is selected by either setting the environment
+     variable POSIXLY_CORRECT, or using `+' as the first character
+     of the list of option characters.
+
+     PERMUTE is the default.  We permute the contents of ARGV as we
+     scan, so that eventually all the non-options are at the end.
+     This allows options to be given in any order, even with programs
+     that were not written to expect this.
+
+     RETURN_IN_ORDER is an option available to programs that were
+     written to expect options and other ARGV-elements in any order
+     and that care about the ordering of the two.  We describe each
+     non-option ARGV-element as if it were the argument of an option
+     with character code 1.  Using `-' as the first character of the
+     list of option characters selects this mode of operation.
+
+     The special argument `--' forces an end of option-scanning regardless
+     of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
+     `--' can cause `getopt' to return -1 with `optind' != ARGC.  */
+
+  enum
+  {
+    REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+  } __ordering;
+
+  /* If the POSIXLY_CORRECT environment variable is set.  */
+  int __posixly_correct;
+
+
+  /* Handle permutation of arguments.  */
+
+  /* Describe the part of ARGV that contains non-options that have
+     been skipped.  `first_nonopt' is the index in ARGV of the first
+     of them; `last_nonopt' is the index after the last of them.  */
+
+  int __first_nonopt;
+  int __last_nonopt;
+
+#if defined _LIBC && defined USE_NONOPTION_FLAGS
+  int __nonoption_flags_max_len;
+  int __nonoption_flags_len;
+# endif
+};
+
+/* The initializer is necessary to set OPTIND and OPTERR to their
+   default values and to clear the initialization flag.  */
+#define _GETOPT_DATA_INITIALIZER       { 1, 1 }
+
+extern int _getopt_internal_r (
+  int ___argc,
+  char *const *___argv,
+  const char *__shortopts,
+  const struct option *__longopts,
+  int *__longind,
+  int __long_only,
+  struct _getopt_data *__data
+);
+
+extern int _getopt_long_r (
+  int ___argc,
+  char *const *___argv,
+  const char *__shortopts,
+  const struct option *__longopts,
+  int *__longind,
+  struct _getopt_data *__data
+);
+
+extern int _getopt_long_only_r (
+  int ___argc,
+  char *const *___argv,
+  const char *__shortopts,
+  const struct option *__longopts,
+  int *__longind,
+  struct _getopt_data *__data
+);
+
+#endif /* getopt_int.h */
diff --git a/bootstrap b/bootstrap
new file mode 100755 (executable)
index 0000000..698da99
--- /dev/null
+++ b/bootstrap
@@ -0,0 +1,110 @@
+#! /bin/sh
+##############################################################################
+# $Id: bootstrap,v 1.1 2004-04-25 18:47:56 behdad Exp $
+# $Author: behdad
+# $Date: 2004-04-25 18:47:56 $
+# $Revision: 1.1 $
+# $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/bootstrap,v $
+##############################################################################
+#                                               -*- Bootstrap -*-
+# Run this file to produce a configure script.
+
+DEFAULTARGS="--force --install --autoreconf=auto"
+
+for arg in $DEFAULTARGS $*
+do
+       case $arg in
+               -h | --help)
+                       HELP=--help ;;
+               -V | --version)
+                       VERSION=--version ;;
+               -v | --verbose)
+                       VERBOSE=--verbose ;;
+               -d | --debug)
+                       DEBUG=--debug ;;
+               -W | --warning | --warnings=yes)
+                       WARNINGS=--warnings=all ;;
+               --no-warning | --warnings=no)
+                       WARNINGS= ;;
+               --warning=*)
+                       WARNINGS=$arg ;;
+               -f | --force | --force=yes | --force-missing)
+                       FORCE=--force ;;
+               --no-force | --force=no)
+                       FORCE=--no-force ;;
+               -i | --install | --install=yes | -a | --add-missing)
+                       INSTALL=--install ;;
+               --no-install | --install=no)
+                       INSTALL= ;;
+               -s | --symlink | --symlink=yes | --no-copy | --copy=no)
+                       SYMLINK=--symlink ;;
+               --no-symlink | --symlink=no | --copy | --copy=yes)
+                       SYMLINK= ;;
+               -m | --make | --make=yes)
+                       MAKE=--make ;;
+               --no-make | --make=no)
+                       MAKE= ;;
+               -n | --dry-run)
+                       DRYRUN=echo ;;
+               --autoreconf=auto)
+                       AUTORECONF=auto ;;
+               --autoreconf | --autoreconf=yes)
+                       AUTORECONF=yes ;;
+               --no-autoreconf | --autoreconf=no)
+                       AUTORECONF= ;;
+               *)
+                       echo Ignoring unknown parameter $arg
+       esac
+done
+
+test -z "$SYMLINK" && COPY=--copy
+test -n "$INSTALL" && ADDMISSING=--add-missing
+
+# use autoreconf if possible, just check for version 2+
+if test "$AUTORECONF" = auto; then
+       case `autoreconf --version 2>/dev/null` in
+               *"autoreconf (GNU Autoconf) 2."* )
+                       echo Usable autoreconf found, running
+               ;;
+               *)
+                       AUTORECONF=
+               ;;
+       esac
+fi
+
+if test -n "$AUTORECONF";  then
+       $DRYRUN autoreconf $HELP $VERSION $VERBOSE $DEBUG $FORCE $INSTALL $SYMLINK $MAKE $WARNINGS
+       exit $?
+fi
+
+# add files 'config.guess', 'config.sub', 'ltconfig', 'ltmain.sh'
+$DRYRUN libtoolize $HELP $VERSION --automake $COPY $DEBUG $FORCE || exit 1
+
+# generate 'aclocal.m4'
+if test -f configure.ac -o configure.in; then
+       $DRYRUN aclocal $HELP $VERSION $VERBOSE $FORCE || exit 1
+fi
+
+# generate 'config.h.in'
+if test -f configure.ac -o configure.in; then
+       $DRYRUN autoheader $HELP $VERSION $VERBOSE $DEBUG $FORCE $WARNINGS || exit 1
+fi
+
+#  generate Makefile.in's from Makefile.am's
+if test -f Makefile.am; then
+       $DRYRUN automake $HELP $VERSION $VERBOSE $ADDMISSING $COPY $FORCE $WARNINGS || exit 1
+fi
+
+# generate configure from configure.ac
+if test -f configure.ac -o -f configure.in; then
+       $DRYRUN autoconf $HELP $VERSION $VERBOSE $DEBUG $FORCE $WARNINGS || exit 1
+fi
+
+if test -n "$MAKE"; then
+       if test -f ./configure; then
+               $DRYRUN ./configure $HELP $VERSION || exit 1
+       fi
+       if test -f Makefile; then
+               $DRYRUN make || exit 1
+       fi
+fi
diff --git a/charset/Headers.mk b/charset/Headers.mk
new file mode 100644 (file)
index 0000000..2f6fb29
--- /dev/null
@@ -0,0 +1,9 @@
+libfribidi_char_sets_la_headers = \
+       fribidi-char-sets-cap-rtl.h \
+       fribidi-char-sets-cp1255.h \
+       fribidi-char-sets-cp1256.h \
+       fribidi-char-sets.h \
+       fribidi-char-sets-iso8859-6.h \
+       fribidi-char-sets-iso8859-8.h \
+       fribidi-char-sets-list.h \
+       fribidi-char-sets-utf8.h
diff --git a/charset/Makefile.am b/charset/Makefile.am
new file mode 100644 (file)
index 0000000..0c7004f
--- /dev/null
@@ -0,0 +1,48 @@
+noinst_LTLIBRARIES = libfribidi-char-sets.la
+
+AM_CPPFLAGS = \
+               -I$(top_builddir)/lib \
+               -I$(top_srcdir)/lib \
+               $(GLIB_CFLAGS)
+
+pkginclude_HEADERS =
+
+libfribidi_char_sets_la_LDFLAGS = 
+libfribidi_char_sets_la_LIBADD = 
+
+if FRIBIDI_CHARSETS
+
+if PLATFORM_WIN32
+no_undefined = -no-undefined
+endif # PLATFORM_WIN32
+
+libfribidi_char_sets_la_LDFLAGS += $(no_undefined)
+libfribidi_char_sets_la_LIBADD += $(GLIB_LIBS)
+
+if OS_WIN32
+libfribidi_char_sets_la_LDFLAGS += -export-symbols
+endif # OS_WIN32
+
+include Headers.mk
+pkginclude_HEADERS += $(libfribidi_char_sets_la_headers)
+
+else # !FRIBIDI_CHARSETS
+
+libfribidi_char_sets_la_LDFLAGS += -static
+
+endif # !FRIBIDI_CHARSETS
+
+libfribidi_char_sets_la_SOURCES = \
+       fribidi-char-sets-cap-rtl.c \
+       fribidi-char-sets-cp1255.c \
+       fribidi-char-sets-cp1256.c \
+       fribidi-char-sets.c \
+       fribidi-char-sets-iso8859-6.c \
+       fribidi-char-sets-iso8859-8.c \
+       fribidi-char-sets-utf8.c
+
+$(top_builddir)/config.h: $(top_srcdir)/config.h.in
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) config.h
+
+$(top_builddir)/lib/fribidi-config.h: $(top_srcdir)/lib/fribidi-config.h.in
+       cd $(top_builddir)/lib && $(MAKE) $(AM_MAKEFLAGS) fribidi-config.h
diff --git a/charset/fribidi-char-sets-cap-rtl.c b/charset/fribidi-char-sets-cap-rtl.c
new file mode 100644 (file)
index 0000000..9fb46ea
--- /dev/null
@@ -0,0 +1,336 @@
+/* FriBidi
+ * fribidi-char-sets-cap-rtl.c - CapRTL character set conversion routines
+ *
+ * $Id: fribidi-char-sets-cap-rtl.c,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-cap-rtl.c,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#include <fribidi-char-sets-cap-rtl.h>
+
+#include <fribidi-unicode.h>
+#include <fribidi-mirroring.h>
+#include <fribidi-bidi-type.h>
+
+#include <common.h>
+#include <bidi-types.h>
+
+#include <stdio.h>
+
+#define WS FRIBIDI_PROP_TYPE_WS
+#define BS FRIBIDI_PROP_TYPE_BS
+#define EO FRIBIDI_PROP_TYPE_EO
+#define CTL FRIBIDI_PROP_TYPE_CTL
+#define LRE FRIBIDI_PROP_TYPE_LRE
+#define RLE FRIBIDI_PROP_TYPE_RLE
+#define ES FRIBIDI_PROP_TYPE_ES
+#define LRO FRIBIDI_PROP_TYPE_LRO
+#define RLO FRIBIDI_PROP_TYPE_RLO
+#define AL FRIBIDI_PROP_TYPE_AL
+#define SS FRIBIDI_PROP_TYPE_SS
+#define ET FRIBIDI_PROP_TYPE_ET
+#define NSM FRIBIDI_PROP_TYPE_NSM
+#define LTR FRIBIDI_PROP_TYPE_LTR
+#define ON FRIBIDI_PROP_TYPE_ON
+#define AN FRIBIDI_PROP_TYPE_AN
+#define BN FRIBIDI_PROP_TYPE_BN
+#define RTL FRIBIDI_PROP_TYPE_RTL
+#define CS FRIBIDI_PROP_TYPE_CS
+#define PDF FRIBIDI_PROP_TYPE_PDF
+#define EN FRIBIDI_PROP_TYPE_EN
+
+static FriBidiPropCharType CapRTLCharTypes[] = {
+/* *INDENT-OFF* */
+  ON, ON, ON, ON, LTR,RTL,ON, ON, ON, ON, ON, ON, ON, BS, RLO,RLE, /* 00-0f */
+  LRO,LRE,PDF,WS, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,  /* 10-1f */
+  WS, ON, ON, ON, ET, ON, ON, ON, ON, ON, ON, ET, CS, ON, ES, ES,  /* 20-2f */
+  EN, EN, EN, EN, EN, EN, AN, AN, AN, AN, CS, ON, ON, ON, ON, ON,  /* 30-3f */
+  RTL,AL, AL, AL, AL, AL, AL, RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL, /* 40-4f */
+  RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,ON, BS, ON, ON, ON,  /* 50-5f */
+  NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, /* 60-6f */
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON, SS, ON, WS, ON,  /* 70-7f */
+/* *INDENT-ON* */
+};
+
+#undef WS
+#undef BS
+#undef EO
+#undef CTL
+#undef LRE
+#undef RLE
+#undef ES
+#undef LRO
+#undef RLO
+#undef AL
+#undef SS
+#undef ET
+#undef NSM
+#undef LTR
+#undef ON
+#undef AN
+#undef BN
+#undef RTL
+#undef CS
+#undef PDF
+#undef EN
+
+#define CAPRTL_CHARS (sizeof CapRTLCharTypes / sizeof CapRTLCharTypes[0])
+
+static FriBidiChar *caprtl_to_unicode = NULL;
+
+static void
+init_cap_rtl (
+  void
+)
+{
+  int request[_FRIBIDI_PROP_TYPES_COUNT + 1];
+  int i, count;
+
+  caprtl_to_unicode =
+    (FriBidiChar *) fribidi_malloc (CAPRTL_CHARS *
+                                   sizeof caprtl_to_unicode[0]);
+  for (i = 0; i < _FRIBIDI_PROP_TYPES_COUNT; i++)
+    request[i] = 0;
+  for (i = 0; i < CAPRTL_CHARS; i++)
+    if (fribidi_get_mirror_char (i, NULL))
+      caprtl_to_unicode[i] = i;
+  for (count = 0, i = 0; i < CAPRTL_CHARS; i++)
+    if (caprtl_to_unicode[i] == 0)
+      {
+       request[(unsigned char) CapRTLCharTypes[i]]++;
+       count++;
+      }
+  for (i = 1; i < 0x10000 && count; i++)       /* Assign BMP chars to CapRTL entries */
+    if (!fribidi_get_mirror_char (i, NULL))
+      {
+       int j, k;
+       for (j = 0; j < _FRIBIDI_PROP_TYPES_COUNT; j++)
+         if (fribidi_prop_to_type_[j] == fribidi_get_bidi_type (i))
+           break;
+       if (!request[j])        /* Do not need this type */
+         continue;
+       for (k = 0; k < CAPRTL_CHARS; k++)
+         if (!caprtl_to_unicode[k] && j == CapRTLCharTypes[k])
+           break;
+       if (k < CAPRTL_CHARS)
+         {
+           request[j]--;
+           count--;
+           caprtl_to_unicode[k] = i;
+         }
+      }
+}
+
+static char
+fribidi_unicode_to_cap_rtl_c (
+  /* input */
+  FriBidiChar uch
+)
+{
+  int i;
+
+  if (!caprtl_to_unicode)
+    init_cap_rtl ();
+
+  for (i = 0; i < CAPRTL_CHARS; i++)
+    if (uch == caprtl_to_unicode[i])
+      return (char) i;
+  return '?';
+}
+
+FriBidiStrIndex
+fribidi_cap_rtl_to_unicode (
+  /* input */
+  const char *s,
+  FriBidiStrIndex len,
+  /* output */
+  FriBidiChar *us
+)
+{
+  FriBidiStrIndex i, j;
+
+  if (!caprtl_to_unicode)
+    init_cap_rtl ();
+
+  j = 0;
+  for (i = 0; i < len; i++)
+    {
+      char ch;
+
+      ch = s[i];
+      if (ch == '_')
+       {
+         switch (ch = s[++i])
+           {
+           case '>':
+             us[j++] = FRIBIDI_CHAR_LRM;
+             break;
+           case '<':
+             us[j++] = FRIBIDI_CHAR_RLM;
+             break;
+           case 'l':
+             us[j++] = FRIBIDI_CHAR_LRE;
+             break;
+           case 'r':
+             us[j++] = FRIBIDI_CHAR_RLE;
+             break;
+           case 'o':
+             us[j++] = FRIBIDI_CHAR_PDF;
+             break;
+           case 'L':
+             us[j++] = FRIBIDI_CHAR_LRO;
+             break;
+           case 'R':
+             us[j++] = FRIBIDI_CHAR_RLO;
+             break;
+           case '_':
+             us[j++] = '_';
+             break;
+           default:
+             us[j++] = '_';
+             i--;
+             break;
+           }
+       }
+      else
+       us[j++] = caprtl_to_unicode[(int) s[i]];
+    }
+
+  return j;
+}
+
+FriBidiStrIndex
+fribidi_unicode_to_cap_rtl (
+  /* input */
+  const FriBidiChar *us,
+  int len,
+  /* output */
+  char *s
+)
+{
+  int i, j;
+
+  j = 0;
+  for (i = 0; i < len; i++)
+    {
+      FriBidiChar ch = us[i];
+      if (!FRIBIDI_IS_EXPLICIT (fribidi_get_type (ch)) && ch != '_'
+         && ch != FRIBIDI_CHAR_LRM && ch != FRIBIDI_CHAR_RLM)
+       s[j++] = fribidi_unicode_to_cap_rtl_c (ch);
+      else
+       {
+         s[j++] = '_';
+         switch (ch)
+           {
+           case FRIBIDI_CHAR_LRM:
+             s[j++] = '>';
+             break;
+           case FRIBIDI_CHAR_RLM:
+             s[j++] = '<';
+             break;
+           case FRIBIDI_CHAR_LRE:
+             s[j++] = 'l';
+             break;
+           case FRIBIDI_CHAR_RLE:
+             s[j++] = 'r';
+             break;
+           case FRIBIDI_CHAR_PDF:
+             s[j++] = 'o';
+             break;
+           case FRIBIDI_CHAR_LRO:
+             s[j++] = 'L';
+             break;
+           case FRIBIDI_CHAR_RLO:
+             s[j++] = 'R';
+             break;
+           case '_':
+             s[j++] = '_';
+             break;
+           default:
+             j--;
+             if (ch < 256)
+               s[j++] = fribidi_unicode_to_cap_rtl_c (ch);
+             else
+               s[j++] = '?';
+             break;
+           }
+       }
+    }
+  s[j] = 0;
+
+  return j;
+}
+
+const char *
+fribidi_char_set_desc_cap_rtl (
+  void
+)
+{
+  static char *s = 0;
+  int l, i, j;
+
+  if (s)
+    return s;
+
+  l = 10000;
+  s = (char *) fribidi_malloc (l);
+  i = 0;
+  i += sprintf (s + i,         /*l - i, */
+               "CapRTL is a character set for testing with the reference\n"
+               "implementation, with explicit marks escape strings, and\n"
+               "the property that contains all unicode character types in\n"
+               "ASCII range 1-127.\n"
+               "\n"
+               "Warning: CapRTL character types are subject to change.\n"
+               "\n" "CapRTL's character types:\n");
+  for (j = 0; j < CAPRTL_CHARS; j++)
+    {
+      if (j % 4 == 0)
+       s[i++] = '\n';
+      i += sprintf (s + i, /*l - i, */ "  * 0x%02x %c%c %-3s ", j,
+                   j < 0x20 ? '^' : ' ',
+                   j < 0x20 ? j + '@' : j < 0x7f ? j : ' ',
+                   fribidi_type_name (fribidi_prop_to_type_
+                                      [(unsigned char) CapRTLCharTypes[j]]));
+    }
+  i += sprintf (s + i,         /*l - i, */
+               "\n\n"
+               "Escape sequences:\n"
+               "  Character `_' is used to escape explicit marks. The list is:\n"
+               "    * _>  LRM\n" "    * _<  RLM\n"
+               "    * _l  LRE\n" "    * _r  RLE\n"
+               "    * _L  LRO\n" "    * _R  RLO\n"
+               "    * _o  PDF\n" "    * __  `_' itself\n" "\n");
+  return s;
+}
+
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/charset/fribidi-char-sets-cap-rtl.h b/charset/fribidi-char-sets-cap-rtl.h
new file mode 100644 (file)
index 0000000..ebcae45
--- /dev/null
@@ -0,0 +1,70 @@
+/* FriBidi
+ * fribidi-char-sets-cap-rtl.h - CapRTL character set conversion routines
+ *
+ * $Id: fribidi-char-sets-cap-rtl.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-cap-rtl.h,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#ifndef _FRIBIDI_CHAR_SETS_CAP_RTL_H
+#define _FRIBIDI_CHAR_SETS_CAP_RTL_H
+
+#include "fribidi-common.h"
+
+#include "fribidi-types.h"
+
+#define fribidi_char_set_name_cap_rtl "CapRTL"
+#define fribidi_char_set_title_cap_rtl "CapRTL (Test)"
+
+#define fribidi_char_set_desc_cap_rtl FRIBIDI_NAMESPACE(char_set_desc_cap_rtl)
+const char *fribidi_char_set_desc_cap_rtl (
+  void
+);
+
+#define fribidi_cap_rtl_to_unicode FRIBIDI_NAMESPACE(cap_rtl_to_unicode)
+FriBidiStrIndex fribidi_cap_rtl_to_unicode (
+  const char *s,
+  FriBidiStrIndex length,
+  FriBidiChar *us
+);
+
+#define fribidi_unicode_to_cap_rtl FRIBIDI_NAMESPACE(unicode_to_cap_rtl)
+FriBidiStrIndex fribidi_unicode_to_cap_rtl (
+  const FriBidiChar *us,
+  FriBidiStrIndex length,
+  char *s
+);
+
+#include "fribidi-enddecls.h"
+
+#endif /* !_FRIBIDI_CHAR_SETS_CAP_RTL_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/charset/fribidi-char-sets-cp1255.c b/charset/fribidi-char-sets-cp1255.c
new file mode 100644 (file)
index 0000000..02a72ba
--- /dev/null
@@ -0,0 +1,106 @@
+/* FriBidi
+ * fribidi-char-sets-cp1255.c - CP1255 character set conversion routines
+ *
+ * $Id: fribidi-char-sets-cp1255.c,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-cp1255.c,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#include <fribidi-char-sets-cp1255.h>
+
+#include <common.h>
+
+#define ISO_ALEF               0xE0
+#define ISO_TAV                        0xFA
+#define CP1255_SHEVA           0xC0
+#define CP1255_SOF_PASUQ       0xD3
+#define CP1255_DOUBLE_VAV      0xD4
+#define CP1255_GERSHAYIM       0xD8
+
+#define UNI_ALEF               0x05D0
+#define UNI_TAV                        0x05EA
+#define UNI_SHEVA              0x05B0
+#define UNI_SOF_PASUQ          0x05C3
+#define UNI_DOUBLE_VAV         0x05F0
+#define UNI_GERSHAYIM          0x05F4
+
+static FriBidiChar fribidi_cp1255_to_unicode_tab[] = { /* 0x80-0xBF */
+  0x20AC, 0x0081, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+  0x02C6, 0x2030, 0x008a, 0x2039, 0x008c, 0x008d, 0x008e, 0x008f,
+  0x0090, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+  0x02DC, 0x2122, 0x009a, 0x203A, 0x009c, 0x009d, 0x009e, 0x009f,
+  0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7,
+  0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+  0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+  0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF
+};
+
+FriBidiChar
+fribidi_cp1255_to_unicode_c (
+  /* input */
+  char sch
+)
+{
+  register unsigned char ch = (unsigned char) sch;
+  if (ch >= ISO_ALEF && ch <= ISO_TAV)
+    return ch - ISO_ALEF + UNI_ALEF;
+  else if (ch >= CP1255_SHEVA && ch <= CP1255_SOF_PASUQ)
+    return ch - CP1255_SHEVA + UNI_SHEVA;
+  else if (ch >= CP1255_DOUBLE_VAV && ch <= CP1255_GERSHAYIM)
+    return ch - CP1255_DOUBLE_VAV + UNI_DOUBLE_VAV;
+  /* cp1256 specific chars */
+  else if (ch >= 0x80 && ch <= 0xbf)
+    return fribidi_cp1255_to_unicode_tab[ch - 0x80];
+  else
+    return ch;
+}
+
+char
+fribidi_unicode_to_cp1255_c (
+  /* input */
+  FriBidiChar uch
+)
+{
+  if (uch >= UNI_ALEF && uch <= UNI_TAV)
+    return (char) (uch - UNI_ALEF + ISO_ALEF);
+  if (uch >= UNI_SHEVA && uch <= UNI_SOF_PASUQ)
+    return (char) (uch - UNI_SHEVA + CP1255_SHEVA);
+  if (uch >= UNI_DOUBLE_VAV && uch <= UNI_GERSHAYIM)
+    return (char) (uch - UNI_DOUBLE_VAV + CP1255_DOUBLE_VAV);
+  /* TODO: handle pre-composed and presentation chars */
+  else if (uch < 256)
+    return (char) uch;
+  else
+    return '?';
+}
+
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/charset/fribidi-char-sets-cp1255.h b/charset/fribidi-char-sets-cp1255.h
new file mode 100644 (file)
index 0000000..011c913
--- /dev/null
@@ -0,0 +1,62 @@
+/* FriBidi
+ * fribidi-char-sets-cp1255.h - CP1255 character set conversion routines
+ *
+ * $Id: fribidi-char-sets-cp1255.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-cp1255.h,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#ifndef _FRIBIDI_CHAR_SETS_CP1255_H
+#define _FRIBIDI_CHAR_SETS_CP1255_H
+
+#include "fribidi-common.h"
+
+#include "fribidi-types.h"
+
+#define fribidi_char_set_name_cp1255 "CP1255"
+#define fribidi_char_set_title_cp1255 "CP1255 (MS Hebrew/Yiddish)"
+#define fribidi_char_set_desc_cp1255 NULL
+
+#define fribidi_cp1255_to_unicode_c FRIBIDI_NAMESPACE(cp1255_to_unicode_c)
+FriBidiChar fribidi_cp1255_to_unicode_c (
+  char ch
+);
+
+#define fribidi_unicode_to_cp1255_c FRIBIDI_NAMESPACE(unicode_to_cp1255_c)
+char fribidi_unicode_to_cp1255_c (
+  FriBidiChar uch
+);
+
+#include "fribidi-enddecls.h"
+
+#endif /* !_FRIBIDI_CHAR_SETS_CP1255_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/charset/fribidi-char-sets-cp1256.c b/charset/fribidi-char-sets-cp1256.c
new file mode 100644 (file)
index 0000000..1470da3
--- /dev/null
@@ -0,0 +1,223 @@
+/* FriBidi
+ * fribidi-char-sets-cp1256.c - CP1256 character set conversion routines
+ *
+ * $Id: fribidi-char-sets-cp1256.c,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-cp1256.c,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#include <fribidi-char-sets-cp1256.h>
+
+#include <common.h>
+
+#define ISO_HAMZA              0xc1
+#define CP1256_DAD             0xD6
+
+#define UNI_HAMZA              0x0621
+#define UNI_DAD                        0x0636
+
+static FriBidiChar fribidi_cp1256_to_unicode_tab[] = { /* 0x80-0xFF */
+  0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
+  0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,
+  0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+  0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA,
+  0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
+  0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+  0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+  0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F,
+  0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
+  0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
+  0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7,
+  0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643,
+  0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7,
+  0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF,
+  0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7,
+  0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x00ff
+};
+
+FriBidiChar
+fribidi_cp1256_to_unicode_c (
+  /* input */
+  char sch
+)
+{
+  register unsigned char ch = (unsigned char) sch;
+  if (ch >= 0x80)
+    return fribidi_cp1256_to_unicode_tab[ch - 0x80];
+  else
+    return ch;
+}
+
+char
+fribidi_unicode_to_cp1256_c (
+  /* input */
+  FriBidiChar uch
+)
+{
+  if (uch < 256)
+    return (char) uch;
+  if (uch >= UNI_HAMZA && uch <= UNI_DAD)
+    return (char) (uch - UNI_HAMZA + ISO_HAMZA);
+  else
+    switch (uch)
+      {
+      case 0x0152:
+       return (char) 0x8c;
+      case 0x0153:
+       return (char) 0x9c;
+      case 0x0192:
+       return (char) 0x83;
+      case 0x02C6:
+       return (char) 0x88;
+      case 0x060C:
+       return (char) 0xA1;
+      case 0x061B:
+       return (char) 0xBA;
+      case 0x061F:
+       return (char) 0xBF;
+      case 0x0637:
+       return (char) 0xD8;
+      case 0x0638:
+       return (char) 0xD9;
+      case 0x0639:
+       return (char) 0xDA;
+      case 0x063A:
+       return (char) 0xDB;
+      case 0x0640:
+       return (char) 0xDC;
+      case 0x0641:
+       return (char) 0xDD;
+      case 0x0642:
+       return (char) 0xDE;
+      case 0x0643:
+       return (char) 0xDF;
+      case 0x0644:
+       return (char) 0xE1;
+      case 0x0645:
+       return (char) 0xE3;
+      case 0x0646:
+       return (char) 0xE4;
+      case 0x0647:
+       return (char) 0xE5;
+      case 0x0648:
+       return (char) 0xE6;
+      case 0x0649:
+       return (char) 0xEC;
+      case 0x064A:
+       return (char) 0xED;
+      case 0x064B:
+       return (char) 0xF0;
+      case 0x064C:
+       return (char) 0xF1;
+      case 0x064D:
+       return (char) 0xF2;
+      case 0x064E:
+       return (char) 0xF3;
+      case 0x064F:
+       return (char) 0xF5;
+      case 0x0650:
+       return (char) 0xF6;
+      case 0x0651:
+       return (char) 0xF8;
+      case 0x0652:
+       return (char) 0xFA;
+      case 0x0679:
+       return (char) 0x8A;
+      case 0x067E:
+       return (char) 0x81;
+      case 0x0686:
+       return (char) 0x8D;
+      case 0x0688:
+       return (char) 0x8F;
+      case 0x0691:
+       return (char) 0x9A;
+      case 0x0698:
+       return (char) 0x8E;
+      case 0x06A9:
+       return (char) 0x98;
+      case 0x06AF:
+       return (char) 0x90;
+      case 0x06BA:
+       return (char) 0x9F;
+      case 0x06BE:
+       return (char) 0xAA;
+      case 0x06C1:
+       return (char) 0xC0;
+      case 0x200C:
+       return (char) 0x9D;
+      case 0x200D:
+       return (char) 0x9E;
+      case 0x200E:
+       return (char) 0xFD;
+      case 0x200F:
+       return (char) 0xFE;
+      case 0x2013:
+       return (char) 0x96;
+      case 0x2014:
+       return (char) 0x97;
+      case 0x2018:
+       return (char) 0x91;
+      case 0x2019:
+       return (char) 0x92;
+      case 0x201A:
+       return (char) 0x82;
+      case 0x201C:
+       return (char) 0x93;
+      case 0x201D:
+       return (char) 0x94;
+      case 0x201E:
+       return (char) 0x84;
+      case 0x2020:
+       return (char) 0x86;
+      case 0x2021:
+       return (char) 0x87;
+      case 0x2022:
+       return (char) 0x95;
+      case 0x2026:
+       return (char) 0x85;
+      case 0x2030:
+       return (char) 0x89;
+      case 0x2039:
+       return (char) 0x8B;
+      case 0x203A:
+       return (char) 0x9B;
+      case 0x20AC:
+       return (char) 0x80;
+      case 0x2122:
+       return (char) 0x99;
+
+      default:
+       return '?';
+      }
+}
+
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/charset/fribidi-char-sets-cp1256.h b/charset/fribidi-char-sets-cp1256.h
new file mode 100644 (file)
index 0000000..ecf2605
--- /dev/null
@@ -0,0 +1,62 @@
+/* FriBidi
+ * fribidi-char-sets-cp1256.h - CP1256 character set conversion routines
+ *
+ * $Id: fribidi-char-sets-cp1256.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-cp1256.h,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#ifndef _FRIBIDI_CHAR_SETS_CP1256_H
+#define _FRIBIDI_CHAR_SETS_CP1256_H
+
+#include "fribidi-common.h"
+
+#include "fribidi-types.h"
+
+#define fribidi_char_set_name_cp1256 "CP1256"
+#define fribidi_char_set_title_cp1256 "CP1256 (MS Arabic)"
+#define fribidi_char_set_desc_cp1256 NULL
+
+#define fribidi_cp1256_to_unicode_c FRIBIDI_NAMESPACE(cp1256_to_unicode_c)
+FriBidiChar fribidi_cp1256_to_unicode_c (
+  char ch
+);
+
+#define fribidi_unicode_to_cp1256_c FRIBIDI_NAMESPACE(unicode_to_cp1256_c)
+char fribidi_unicode_to_cp1256_c (
+  FriBidiChar uch
+);
+
+#include "fribidi-enddecls.h"
+
+#endif /* !_FRIBIDI_CHAR_SETS_CP1256_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/charset/fribidi-char-sets-iso8859-6.c b/charset/fribidi-char-sets-iso8859-6.c
new file mode 100644 (file)
index 0000000..e238a4b
--- /dev/null
@@ -0,0 +1,81 @@
+/* FriBidi
+ * fribidi-char-sets-iso8859-6.c - ISO8859-6 character set conversion routines
+ *
+ * $Id: fribidi-char-sets-iso8859-6.c,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-iso8859-6.c,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#include <fribidi-char-sets-iso8859-6.h>
+
+#include <common.h>
+
+#define ISO_HAMZA              0xc1
+#define ISO_SUKUN              0xf2
+
+#define UNI_HAMZA              0x0621
+#define UNI_SUKUN              0x0652
+
+FriBidiChar
+fribidi_iso8859_6_to_unicode_c (
+  /* input */
+  char sch
+)
+{
+  register unsigned char ch = (unsigned char) sch;
+  if (ch >= ISO_HAMZA && ch <= ISO_SUKUN)
+    return ch - ISO_HAMZA + UNI_HAMZA;
+  else
+    return ch;
+}
+
+char
+fribidi_unicode_to_iso8859_6_c (
+  /* input */
+  FriBidiChar uch
+)
+{
+  if (uch >= UNI_HAMZA && uch <= UNI_SUKUN)
+    return (char) (uch - UNI_HAMZA + ISO_HAMZA);
+  else if (uch < 256)
+    return (char) uch;
+  else if (uch == 0x060c)
+    return (char) 0xac;
+  else if (uch == 0x061b)
+    return (char) 0xbb;
+  else if (uch == 0x061f)
+    return (char) 0xbf;
+  else
+    return '?';
+}
+
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/charset/fribidi-char-sets-iso8859-6.h b/charset/fribidi-char-sets-iso8859-6.h
new file mode 100644 (file)
index 0000000..159ccbd
--- /dev/null
@@ -0,0 +1,62 @@
+/* FriBidi
+ * fribidi-char-sets-iso8859-6.h - ISO8859-6 character set conversion routines
+ *
+ * $Id: fribidi-char-sets-iso8859-6.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-iso8859-6.h,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#ifndef _FRIBIDI_CHAR_SETS_ISO8859_6_H
+#define _FRIBIDI_CHAR_SETS_ISO8859_6_H
+
+#include "fribidi-common.h"
+
+#include "fribidi-types.h"
+
+#define fribidi_char_set_name_iso8859_6 "ISO8859-6"
+#define fribidi_char_set_title_iso8859_6 "ISO8859-6 (Arabic)"
+#define fribidi_char_set_desc_iso8859_6 NULL
+
+#define fribidi_iso8859_6_to_unicode_c FRIBIDI_NAMESPACE(iso8859_6_to_unicode_c)
+FriBidiChar fribidi_iso8859_6_to_unicode_c (
+  char ch
+);
+
+#define fribidi_unicode_to_iso8859_6_c FRIBIDI_NAMESPACE(unicode_to_iso8859_6_c)
+char fribidi_unicode_to_iso8859_6_c (
+  FriBidiChar uch
+);
+
+#include "fribidi-enddecls.h"
+
+#endif /* !_FRIBIDI_CHAR_SETS_ISO8859_6_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/charset/fribidi-char-sets-iso8859-8.c b/charset/fribidi-char-sets-iso8859-8.c
new file mode 100644 (file)
index 0000000..4b86b94
--- /dev/null
@@ -0,0 +1,120 @@
+/* FriBidi
+ * fribidi-char-sets-iso8859-8.c - ISO8859-8 character set conversion routines
+ *
+ * $Id: fribidi-char-sets-iso8859-8.c,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-iso8859-8.c,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#include <fribidi-char-sets-iso8859-8.h>
+
+#include <fribidi-unicode.h>
+
+#include <common.h>
+
+/* The following are proposed extensions to ISO8859-8. */
+#define ISO_8859_8_LRM         0xFD
+#define ISO_8859_8_RLM         0xFE
+#define ISO_8859_8_LRE         0xFB
+#define ISO_8859_8_RLE         0xFC
+#define ISO_8859_8_PDF         0xDD
+#define ISO_8859_8_LRO         0xDB
+#define ISO_8859_8_RLO         0xDC
+#define ISO_ALEF               0xE0
+#define ISO_TAV                        0xFA
+
+#define UNI_ALEF               0x05D0
+#define UNI_TAV                        0x05EA
+
+FriBidiChar
+fribidi_iso8859_8_to_unicode_c (
+  /* input */
+  char sch
+)
+{
+  register unsigned char ch = (unsigned char) sch;
+  if (ch < ISO_8859_8_LRO)
+    return ch;
+  else if (ch >= ISO_ALEF && ch <= ISO_TAV)
+    return ch - ISO_ALEF + UNI_ALEF;
+  switch (ch)
+    {
+    case ISO_8859_8_RLM:
+      return FRIBIDI_CHAR_RLM;
+    case ISO_8859_8_LRM:
+      return FRIBIDI_CHAR_LRM;
+    case ISO_8859_8_RLO:
+      return FRIBIDI_CHAR_RLO;
+    case ISO_8859_8_LRO:
+      return FRIBIDI_CHAR_LRO;
+    case ISO_8859_8_RLE:
+      return FRIBIDI_CHAR_RLE;
+    case ISO_8859_8_LRE:
+      return FRIBIDI_CHAR_LRE;
+    case ISO_8859_8_PDF:
+      return FRIBIDI_CHAR_PDF;
+    default:
+      return '?';
+    }
+}
+
+char
+fribidi_unicode_to_iso8859_8_c (
+  /* input */
+  FriBidiChar uch
+)
+{
+  if (uch < 128)
+    return (char) uch;
+  if (uch >= UNI_ALEF && uch <= UNI_TAV)
+    return (char) (uch - UNI_ALEF + ISO_ALEF);
+  switch (uch)
+    {
+    case FRIBIDI_CHAR_RLM:
+      return (char) ISO_8859_8_RLM;
+    case FRIBIDI_CHAR_LRM:
+      return (char) ISO_8859_8_LRM;
+    case FRIBIDI_CHAR_RLO:
+      return (char) ISO_8859_8_RLO;
+    case FRIBIDI_CHAR_LRO:
+      return (char) ISO_8859_8_LRO;
+    case FRIBIDI_CHAR_RLE:
+      return (char) ISO_8859_8_RLE;
+    case FRIBIDI_CHAR_LRE:
+      return (char) ISO_8859_8_LRE;
+    case FRIBIDI_CHAR_PDF:
+      return (char) ISO_8859_8_PDF;
+    }
+  return '?';
+}
+
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/charset/fribidi-char-sets-iso8859-8.h b/charset/fribidi-char-sets-iso8859-8.h
new file mode 100644 (file)
index 0000000..ccc7b16
--- /dev/null
@@ -0,0 +1,62 @@
+/* FriBidi
+ * fribidi-char-sets-iso8859-8.h - ISO8859-8 character set conversion routines
+ *
+ * $Id: fribidi-char-sets-iso8859-8.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-iso8859-8.h,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#ifndef _FRIBIDI_CHAR_SETS_ISO8859_8_H
+#define _FRIBIDI_CHAR_SETS_ISO8859_8_H
+
+#include "fribidi-common.h"
+
+#include "fribidi-types.h"
+
+#define fribidi_char_set_name_iso8859_8 "ISO8859-8"
+#define fribidi_char_set_title_iso8859_8 "ISO8859-8 (Hebrew)"
+#define fribidi_char_set_desc_iso8859_8 NULL
+
+#define fribidi_iso8859_8_to_unicode_c FRIBIDI_NAMESPACE(iso8859_8_to_unicode_c)
+FriBidiChar fribidi_iso8859_8_to_unicode_c (
+  char ch
+);
+
+#define fribidi_unicode_to_iso8859_8_c FRIBIDI_NAMESPACE(unicode_to_iso8859_8_c)
+char fribidi_unicode_to_iso8859_8_c (
+  FriBidiChar uch
+);
+
+#include "fribidi-enddecls.h"
+
+#endif /* !_FRIBIDI_CHAR_SETS_ISO8859_8_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/charset/fribidi-char-sets-list.h b/charset/fribidi-char-sets-list.h
new file mode 100644 (file)
index 0000000..c5df751
--- /dev/null
@@ -0,0 +1,56 @@
+#ifndef __C2MAN__
+/* FriBidi
+ * fribidi-char-sets-list.h - list of supported character sets
+ *
+ * $Id: fribidi-char-sets-list.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-list.h,v $
+ *
+ * Author:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc.
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ *
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+/* *INDENT-OFF* */
+
+/* The order of types in this list should not be important at compile time,
+ * but apparently it should not be changed after compilation! */
+#endif /* !__C2MAN__ */
+#ifdef _FRIBIDI_ADD_CHAR_SET
+# define _FRIBIDI_ADD_CHAR_SET_OTHERS _FRIBIDI_ADD_CHAR_SET
+# define _FRIBIDI_ADD_CHAR_SET_ONE2ONE _FRIBIDI_ADD_CHAR_SET
+#endif /* _FRIBIDI_ADD_CHAR_SET */
+_FRIBIDI_ADD_CHAR_SET_OTHERS (UTF8, utf8)              /* UTF-8 (Unicode) */
+_FRIBIDI_ADD_CHAR_SET_OTHERS (CAP_RTL, cap_rtl)                /* CapRTL (Test) */
+_FRIBIDI_ADD_CHAR_SET_ONE2ONE (ISO8859_6, iso8859_6)   /* ISO8859-6 (Arabic) */
+_FRIBIDI_ADD_CHAR_SET_ONE2ONE (ISO8859_8, iso8859_8)   /* ISO8859-8 (Hebrew) */
+_FRIBIDI_ADD_CHAR_SET_ONE2ONE (CP1255, cp1255)         /* CP1255 (MS Hebrew/Yiddish) */
+_FRIBIDI_ADD_CHAR_SET_ONE2ONE (CP1256, cp1256)         /* CP1256 (MS Arabic) */
+#ifdef _FRIBIDI_ADD_CHAR_SET
+# undef _FRIBIDI_ADD_CHAR_SET_OTHERS
+# undef _FRIBIDI_ADD_CHAR_SET_ONE2ONE
+#endif /* _FRIBIDI_ADD_CHAR_SET */
+
+#ifndef __C2MAN__
+/* *INDENT-ON* */
+#endif /* !__C2MAN__ */
diff --git a/charset/fribidi-char-sets-utf8.c b/charset/fribidi-char-sets-utf8.c
new file mode 100644 (file)
index 0000000..79d1ab9
--- /dev/null
@@ -0,0 +1,126 @@
+/* FriBidi
+ * fribidi-char-sets-utf8.c - UTF-8 character set conversion routines
+ *
+ * $Id: fribidi-char-sets-utf8.c,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-utf8.c,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#include <fribidi-char-sets-utf8.h>
+
+#include <fribidi-unicode.h>
+
+#include <common.h>
+
+FriBidiStrIndex
+fribidi_utf8_to_unicode (
+  /* input */
+  const char *ss,
+  FriBidiStrIndex len,
+  /* output */
+  FriBidiChar *us
+)
+{
+  FriBidiStrIndex length;
+  const unsigned char *s = (unsigned char *) ss;
+  const unsigned char *t = s;
+
+  length = 0;
+  while (s - t < len)
+    {
+      register unsigned char ch = *s;
+      if (ch <= 0x7f)          /* one byte */
+       {
+         *us++ = *s++;
+       }
+      else if (ch <= 0xdf)     /* 2 byte */
+       {
+         *us++ = ((*s & 0x1f) << 6) + (*(s + 1) & 0x3f);
+         s += 2;
+       }
+      else                     /* 3 byte */
+       {
+         *us++ =
+           ((int) (*s & 0x0f) << 12) +
+           ((*(s + 1) & 0x3f) << 6) + (*(s + 2) & 0x3f);
+         s += 3;
+       }
+      length++;
+    }
+  return (length);
+}
+
+FriBidiStrIndex
+fribidi_unicode_to_utf8 (
+  /* input */
+  const FriBidiChar *us,
+  FriBidiStrIndex len,
+  /* output */
+  char *ss
+)
+{
+  int i;
+  unsigned char *s = (unsigned char *) ss;
+  unsigned char *t = s;
+
+  for (i = 0; i < len; i++)
+    {
+      FriBidiChar mychar = us[i];
+      if (mychar <= 0x7F)
+       {                       /* 7 sig bits */
+         *t++ = mychar;
+       }
+      else if (mychar <= 0x7FF)
+       {                       /* 11 sig bits */
+         *t++ = 0xC0 | (unsigned char) (mychar >> 6);  /* upper 5 bits */
+         *t++ = 0x80 | (unsigned char) (mychar & 0x3F);        /* lower 6 bits */
+       }
+      else if (mychar <= 0xFFFF)
+       {                       /* 16 sig bits */
+         *t++ = 0xE0 | (unsigned char) (mychar >> 12); /* upper 4 bits */
+         *t++ = 0x80 | (unsigned char) ((mychar >> 6) & 0x3F); /* next 6 bits */
+         *t++ = 0x80 | (unsigned char) (mychar & 0x3F);        /* lowest 6 bits */
+       }
+      else if (mychar < FRIBIDI_UNICODE_CHARS)
+       {                       /* 21 sig bits */
+         *t++ = 0xF0 | (unsigned char) ((mychar >> 18) & 0x07);        /* upper 3 bits */
+         *t++ = 0x80 | (unsigned char) ((mychar >> 12) & 0x3F);        /* next 6 bits */
+         *t++ = 0x80 | (unsigned char) ((mychar >> 6) & 0x3F); /* next 6 bits */
+         *t++ = 0x80 | (unsigned char) (mychar & 0x3F);        /* lowest 6 bits */
+       }
+    }
+  *t = 0;
+
+  return (t - s);
+}
+
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/charset/fribidi-char-sets-utf8.h b/charset/fribidi-char-sets-utf8.h
new file mode 100644 (file)
index 0000000..aaf9a53
--- /dev/null
@@ -0,0 +1,66 @@
+/* FriBidi
+ * fribidi-char-sets-utf8.h - UTF-8 character set conversion routines
+ *
+ * $Id: fribidi-char-sets-utf8.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets-utf8.h,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#ifndef _FRIBIDI_CHAR_SETS_UTF8_H
+#define _FRIBIDI_CHAR_SETS_UTF8_H
+
+#include "fribidi-common.h"
+
+#include "fribidi-types.h"
+
+#define fribidi_char_set_name_utf8 "UTF-8"
+#define fribidi_char_set_title_utf8 "UTF-8 (Unicode)"
+#define fribidi_char_set_desc_utf8 NULL
+
+#define fribidi_utf8_to_unicode FRIBIDI_NAMESPACE(utf8_to_unicode)
+FriBidiStrIndex fribidi_utf8_to_unicode (
+  const char *s,
+  FriBidiStrIndex length,
+  FriBidiChar *us
+);
+
+#define fribidi_unicode_to_utf8 FRIBIDI_NAMESPACE(unicode_to_utf8)
+FriBidiStrIndex fribidi_unicode_to_utf8 (
+  const FriBidiChar *us,
+  FriBidiStrIndex length,
+  char *s
+);
+
+#include "fribidi-enddecls.h"
+
+#endif /* !_FRIBIDI_CHAR_SETS_UTF8_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/charset/fribidi-char-sets.c b/charset/fribidi-char-sets.c
new file mode 100644 (file)
index 0000000..8ef5482
--- /dev/null
@@ -0,0 +1,230 @@
+/* FriBidi
+ * fribidi-char-sets.c - character set conversion routines
+ *
+ * $Id: fribidi-char-sets.c,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets.c,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#include <fribidi-char-sets.h>
+
+#include <common.h>
+
+typedef struct
+{
+  FriBidiChar (
+  *charset_to_unicode_c
+  ) (
+  char ch
+  );
+
+  FriBidiStrIndex (
+  *charset_to_unicode
+  ) (
+  const char *s,
+  FriBidiStrIndex len,
+  FriBidiChar *us
+  );
+
+  char (
+  *unicode_to_charset_c
+  ) (
+  FriBidiChar uch
+  );
+
+  FriBidiStrIndex (
+  *unicode_to_charset
+  ) (
+  const FriBidiChar *us,
+  FriBidiStrIndex len,
+  char *s
+  );
+
+  const char *name;
+
+  const char *title;
+
+  const char *(
+  *desc
+  ) (
+  void
+  );
+}
+FriBidiCharSetHandler;
+
+static FriBidiCharSetHandler char_sets[FRIBIDI_CHAR_SETS_NUM + 1] = {
+  {NULL, NULL, NULL, NULL, "N/A", "Character set not available", NULL},
+# define _FRIBIDI_ADD_CHAR_SET_ONE2ONE(CHAR_SET, char_set) \
+  { \
+    fribidi_##char_set##_to_unicode_c, \
+    NULL, \
+    fribidi_unicode_to_##char_set##_c, \
+    NULL, \
+    fribidi_char_set_name_##char_set, \
+    fribidi_char_set_title_##char_set, \
+    fribidi_char_set_desc_##char_set \
+  },
+# define _FRIBIDI_ADD_CHAR_SET_OTHERS(CHAR_SET, char_set) \
+  { \
+    NULL, \
+    fribidi_##char_set##_to_unicode, \
+    NULL, \
+    fribidi_unicode_to_##char_set, \
+    fribidi_char_set_name_##char_set, \
+    fribidi_char_set_title_##char_set, \
+    fribidi_char_set_desc_##char_set \
+  },
+# include <fribidi-char-sets-list.h>
+# undef _FRIBIDI_ADD_CHAR_SET_OTHERS
+# undef _FRIBIDI_ADD_CHAR_SET_ONE2ONE
+};
+
+#if !FRIBIDI_USE_GLIB
+static char
+toupper (
+  /* input */
+  char c
+)
+{
+  return c < 'a' || c > 'z' ? c : c + 'A' - 'a';
+}
+
+static int
+fribidi_strcasecmp (
+  /* input */
+  const char *s1,
+  const char *s2
+)
+{
+  while (*s1 && toupper (*s1) == toupper (*s2))
+    {
+      s1++;
+      s2++;
+    }
+  return *s1 - *s2;
+}
+#else /* FRIBIDI_USE_GLIB */
+# include <glib/gstrfuncs.h>
+# define fribidi_strcasecmp g_ascii_strcasecmp
+#endif /* FRIBIDI_USE_GLIB */
+
+FRIBIDI_ENTRY FriBidiCharSet
+fribidi_parse_charset (
+  /* input */
+  const char *s
+)
+{
+  int i;
+
+  for (i = FRIBIDI_CHAR_SETS_NUM; i; i--)
+    if (fribidi_strcasecmp (s, char_sets[i].name) == 0)
+      return i;
+
+  return FRIBIDI_CHAR_SET_NOT_FOUND;
+}
+
+FRIBIDI_ENTRY FriBidiStrIndex
+fribidi_charset_to_unicode (
+  /* input */
+  FriBidiCharSet char_set,
+  const char *s,
+  FriBidiStrIndex len,
+  /* output */
+  FriBidiChar *us
+)
+{
+  if (char_sets[char_set].charset_to_unicode)
+    return (*char_sets[char_set].charset_to_unicode) (s, len, us);
+  else if (char_sets[char_set].charset_to_unicode_c)
+    {
+      register FriBidiStrIndex l;
+      for (l = len; l; l--)
+       *us++ = (*char_sets[char_set].charset_to_unicode_c) (*s++);
+      return len;
+    }
+  else
+    return 0;
+}
+
+FRIBIDI_ENTRY FriBidiStrIndex
+fribidi_unicode_to_charset (
+  /* input */
+  FriBidiCharSet char_set,
+  const FriBidiChar *us,
+  FriBidiStrIndex len,
+  /* output */
+  char *s
+)
+{
+  if (char_sets[char_set].unicode_to_charset)
+    return (*char_sets[char_set].unicode_to_charset) (us, len, s);
+  else if (char_sets[char_set].unicode_to_charset_c)
+    {
+      register FriBidiStrIndex l;
+      for (l = len; l; l--)
+       *s++ = (*char_sets[char_set].unicode_to_charset_c) (*us++);
+      *s = '\0';
+      return len;
+    }
+  else
+    return 0;
+}
+
+FRIBIDI_ENTRY const char *
+fribidi_char_set_name (
+  /* input */
+  FriBidiCharSet char_set
+)
+{
+  return char_sets[char_set].name ? char_sets[char_set].name : "";
+}
+
+FRIBIDI_ENTRY const char *
+fribidi_char_set_title (
+  /* input */
+  FriBidiCharSet char_set
+)
+{
+  return char_sets[char_set].title ? char_sets[char_set].
+    title : fribidi_char_set_name (char_set);
+}
+
+FRIBIDI_ENTRY const char *
+fribidi_char_set_desc (
+  /* input */
+  FriBidiCharSet char_set
+)
+{
+  return char_sets[char_set].desc ? char_sets[char_set].desc () : NULL;
+}
+
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/charset/fribidi-char-sets.h b/charset/fribidi-char-sets.h
new file mode 100644 (file)
index 0000000..5508da9
--- /dev/null
@@ -0,0 +1,125 @@
+/* FriBidi
+ * fribidi-char-sets.h - character set conversion routines
+ *
+ * $Id: fribidi-char-sets.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/charset/fribidi-char-sets.h,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+#ifndef _FRIBIDI_CHAR_SETS_H
+#define _FRIBIDI_CHAR_SETS_H
+
+#include "fribidi-common.h"
+
+#include "fribidi-types.h"
+
+#include "fribidi-char-sets-cap-rtl.h"
+#include "fribidi-char-sets-utf8.h"
+#include "fribidi-char-sets-iso8859-6.h"
+#include "fribidi-char-sets-cp1256.h"
+#include "fribidi-char-sets-iso8859-8.h"
+#include "fribidi-char-sets-cp1255.h"
+
+#include "fribidi-begindecls.h"
+
+typedef enum
+{
+  _FRIBIDI_CHAR_SET_NOT_FOUND,
+# define _FRIBIDI_ADD_CHAR_SET(CHAR_SET, char_set) FRIBIDI_CHAR_SET_##CHAR_SET,
+# include "fribidi-char-sets-list.h"
+# undef _FRIBIDI_ADD_CHAR_SET
+  _FRIBIDI_CHAR_SETS_NUM_PLUS_ONE
+}
+FriBidiCharSet;
+
+#define FRIBIDI_CHAR_SET_NOT_FOUND _FRIBIDI_CHAR_SET_NOT_FOUND
+#define FRIBIDI_CHAR_SETS_NUM (_FRIBIDI_CHAR_SETS_NUM_PLUS_ONE - 1)
+
+
+#define fribidi_charset_to_unicode FRIBIDI_NAMESPACE(charset_to_unicode)
+/* fribidi_charset_to_unicode - convert string to Unicode
+ *
+ * This function converts an string from a character set, to a Unicode string.
+ *
+ * Returns: The length of the new string.
+ */
+FRIBIDI_ENTRY FriBidiStrIndex fribidi_charset_to_unicode (
+  FriBidiCharSet char_set,     /* character set to convert from */
+  const char *s,               /* input string encoded in char_set */
+  FriBidiStrIndex len,         /* input string length */
+  FriBidiChar *us              /* output Unicode string */
+);
+
+#define fribidi_unicode_to_charset FRIBIDI_NAMESPACE(unicode_to_charset)
+/* fribidi_unicode_to_charset - convert string from Unicode
+ *
+ * This function converts a Unicode string to an string in another character
+ * set.  It also zero-terminates the output string.
+ *
+ * Returns: The length of the new string.
+ */
+FRIBIDI_ENTRY FriBidiStrIndex fribidi_unicode_to_charset (
+  FriBidiCharSet char_set,     /* character set to conver to */
+  const FriBidiChar *us,       /* input Unicode string */
+  FriBidiStrIndex len,         /* input string length */
+  char *s                      /* output string encoded in char_set */
+);
+
+#define fribidi_parse_charset FRIBIDI_NAMESPACE(parse_charset)
+/* fribidi_parse_charset - parse character set name
+ *
+ * Returns: The character set named s, or FRIBIDI_CHAR_SET_NOT_FOUND if the
+ * character set is not available.
+ */
+FRIBIDI_ENTRY FriBidiCharSet fribidi_parse_charset (
+  const char *s                        /* input name of the character set */
+);
+
+
+#define fribidi_char_set_name FRIBIDI_NAMESPACE(char_set_name)
+FRIBIDI_ENTRY const char *fribidi_char_set_name (
+  FriBidiCharSet char_set
+);
+
+#define fribidi_char_set_title FRIBIDI_NAMESPACE(char_set_title)
+FRIBIDI_ENTRY const char *fribidi_char_set_title (
+  FriBidiCharSet char_set
+);
+
+#define fribidi_char_set_desc FRIBIDI_NAMESPACE(char_set_desc)
+FRIBIDI_ENTRY const char *fribidi_char_set_desc (
+  FriBidiCharSet char_set
+);
+
+#include "fribidi-enddecls.h"
+
+#endif /* !_FRIBIDI_CHAR_SETS_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/configure.ac b/configure.ac
new file mode 100644 (file)
index 0000000..6790762
--- /dev/null
@@ -0,0 +1,208 @@
+##############################################################################
+## $Id: configure.ac,v 1.1 2004-04-25 18:47:56 behdad Exp $
+## $Auther: behdad $
+## $Date: 2004-04-25 18:47:56 $
+## $Revision: 1.1 $
+## $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/configure.ac,v $
+##############################################################################
+##                                               -*- Autoconf -*-
+## Process this file with autoconf to produce a configure script.
+## Use autoupdate to update this file for newer versions of autoconf.
+## Use autoscan to check if you need to add something to this file.
+
+AC_PREREQ(2.59)
+
+dnl Define different version variables.
+dnl
+dnl Making releases:
+dnl   FRIBIDI_MICRO_VERSION++;
+dnl   FRIBIDI_INTERFACE_AGE++;
+dnl   FRIBIDI_RPM_RELEASE = 1;
+dnl
+dnl If any functions have been added:
+dnl   FRIBIDI_INTERFACE_AGE = 0;
+dnl   FRIBIDI_INTERFACE_VERSION++;
+dnl   FRIBIDI_BINARY_AGE++;
+dnl
+dnl If binary backwards compatibility has been broken:
+dnl   FRIBIDI_BINARY_AGE = FRIBIDI_INTERFACE_AGE = 0;
+dnl
+dnl Building RPMs:
+dnl   FRIBIDI_RPM_RELEASE++;
+dnl
+m4_define(fribidi_major_version, 0)dnl
+m4_define(fribidi_minor_version, 19)dnl
+m4_define(fribidi_micro_version, 0)dnl
+m4_define(fribidi_version,fribidi_major_version.fribidi_minor_version.fribidi_micro_version)dnl
+m4_define(fribidi_interface_version, 3)dnl
+m4_define(fribidi_interface_age, 0)dnl
+m4_define(fribidi_binary_age, 3)dnl
+m4_define(fribidi_rpm_release, 1)dnl
+dnl
+
+AC_INIT([GNU FriBidi],fribidi_version(),[http://freedesktop.org/cgi-bin/bugzilla/enter_bug.cgi?product=FriBidi])
+AC_REVISION([$Id: configure.ac,v 1.1 2004-04-25 18:47:56 behdad Exp $])
+AC_CONFIG_SRCDIR(lib/fribidi.h)
+AC_CONFIG_HEADERS(config.h)
+AM_INIT_AUTOMAKE([gnits])
+
+FRIBIDI_MAJOR_VERSION=fribidi_major_version()
+FRIBIDI_MINOR_VERSION=fribidi_minor_version()
+FRIBIDI_MICRO_VERSION=fribidi_micro_version()
+FRIBIDI_VERSION=fribidi_version()
+FRIBIDI_INTERFACE_VERSION=fribidi_interface_version()
+FRIBIDI_INTERFACE_AGE=fribidi_interface_age()
+FRIBIDI_BINARY_AGE=fribidi_binary_age()
+FRIBIDI_RPM_RELEASE=fribidi_rpm_release
+
+AC_SUBST(FRIBIDI_MAJOR_VERSION)
+AC_SUBST(FRIBIDI_MINOR_VERSION)
+AC_SUBST(FRIBIDI_MICRO_VERSION)
+AC_SUBST(FRIBIDI_VERSION)
+AC_SUBST(FRIBIDI_INTERFACE_VERSION)
+AC_SUBST(FRIBIDI_INTERFACE_AGE)
+AC_SUBST(FRIBIDI_BINARY_AGE)
+AC_SUBST(FRIBIDI_RPM_RELEASE)
+
+dnl libtool versioning.
+m4_define(lt_current, fribidi_interface_version())dnl
+m4_define(lt_revision, fribidi_interface_age())dnl
+m4_define(lt_age, fribidi_binary_age())dnl
+LT_VERSION_INFO=lt_current():lt_revision():lt_age()
+LT_CURRENT_MINUS_AGE=m4_eval(lt_current - lt_age)
+
+AC_SUBST(LT_VERSION_INFO)
+AC_SUBST(LT_CURRENT_MINUS_AGE)
+
+dnl ==========================================================================
+
+# Checks for Win32.
+AC_MSG_CHECKING([for native Win32])
+  case "$host" in
+    *-*-mingw*) os_win32=yes ;;
+    *) pango_os_win32=no ;;
+  esac
+AC_MSG_RESULT([$os_win32])
+AM_CONDITIONAL(OS_WIN32, test "$os_win32" = "yes")
+AC_MSG_CHECKING([for some Win32 platform])
+  case "$host" in
+    *-*-mingw*|*-*-cygwin*) platform_win32=yes ;;
+    *) platform_win32=no ;;
+  esac
+AC_MSG_RESULT([$platform_win32])
+AM_CONDITIONAL(PLATFORM_WIN32, test "$platform_win32" = "yes")
+
+# Checks for programs.
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_LIBTOOL_WIN32_DLL
+AC_PROG_LIBTOOL
+
+# Checks for header files.
+AC_HEADER_STDC
+AC_HEADER_TIME
+AC_CHECK_HEADERS([stdlib.h string.h strings.h inttypes.h stdbool.h wchar.h sys/times.h])
+
+# Checks for typedefs and structures.
+AC_C_CONST
+AC_C_INLINE
+AC_CHECK_SIZEOF(int)
+AC_CHECK_SIZEOF(short)
+AC_CHECK_SIZEOF(void *)
+AC_CHECK_SIZEOF(wchar_t)
+
+# Checks for compiler characteristics.
+changequote(,)dnl
+if test "x$GCC" = "xyes"; then
+  case " $CFLAGS " in
+  *[\ \        ]-Wall[\ \      ]*) ;;
+  *) CFLAGS="$CFLAGS -Wall " ;;
+  esac
+  case " $CFLAGS " in
+  *[\ \        ]-pedantic[\ \  ]*) ;;
+  *) CFLAGS="$CFLAGS -pedantic " ;;
+  esac
+fi
+changequote([,])dnl
+
+# Checks for library functions.
+AC_CHECK_FUNCS([memmove memset strdup])
+AC_TYPE_SIGNAL
+
+# Checks for configure options
+
+m4_define(debug_default,
+          m4_if(m4_eval(fribidi_minor_version() % 2),1,yes,minimum))
+
+# --enable-debug
+AC_ARG_ENABLE(debug,
+              AS_HELP_STRING([--enable-debug],
+                             [turn on debugging @<:@default=debug_default()@:>@]),,
+              enableval=debug_default())
+if test x$enableval = xyes; then
+       AC_DEFINE(DEBUG,1,
+                  [Define to 1 if you want to include debug code in the library])
+fi
+
+# --enable-malloc
+AC_ARG_ENABLE(debug,
+              AS_HELP_STRING([--enable-malloc],
+                             [use simple malloc instead of memory chunks]))
+if test x$enable_glib = xyes; then
+       AC_DEFINE(USE_SIMPLE_MALLOC,1,
+                  [Define to 1 if you want to use simple mallocs instead of memory chunks])
+fi
+
+# --disable-charsets
+AC_ARG_ENABLE(charsets,
+              AS_HELP_STRING([--disable-charsets],
+                             [exclude charset conversion codes from the library]))
+if test x$enable_charsets = xno; then
+       FRIBIDI_CHARSETS=0
+else
+       FRIBIDI_CHARSETS=1
+fi
+AC_SUBST(FRIBIDI_CHARSETS)
+AM_CONDITIONAL(FRIBIDI_CHARSETS, test x$FRIBIDI_CHARSETS = x1)
+
+# --without-glib
+AC_ARG_WITH(glib,
+              AS_HELP_STRING([--without-glib],
+                             [do not use Glib]))
+GLIB_PACKAGE=glib-2.0
+GLIB_LIBS=
+GLIB_CFLAGS=
+if test x$with_glib = xyes; then
+       PKG_CHECK_MODULES(GLIB,$GLIB_PACKAGE)
+       FRIBIDI_USE_GLIB=1
+else
+if test x$with_glib = xno; then
+       FRIBIDI_USE_GLIB=0
+else
+       PKG_CHECK_MODULES(GLIB,$GLIB_PACKAGE,
+               FRIBIDI_USE_GLIB=1,
+               FRIBIDI_USE_GLIB=0)
+fi
+fi
+if test x$FRIBIDI_USER_GLIB = x0; then
+       GLIB_PACKAGE=
+fi
+AC_SUBST(GLIB_PACKAGE)
+AC_SUBST(GLIB_LIBS)
+AC_SUBST(GLIB_CFLAGS)
+AC_SUBST(FRIBIDI_USE_GLIB)
+AM_CONDITIONAL(FRIBIDI_USE_GLIB, test "$FRIBIDI_USE_GLIB" = 1)
+
+# Generate output
+AC_CONFIG_FILES([fribidi.pc
+                 fribidi.spec
+                 lib/fribidi-config.h
+                 Makefile
+                tablegen/Makefile
+                tablegen/unidata/Makefile
+                charset/Makefile
+                 lib/Makefile
+                 bin/Makefile
+                doc/Makefile
+                 test/Makefile])
+AC_OUTPUT
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644 (file)
index 0000000..c1db3d6
--- /dev/null
@@ -0,0 +1,27 @@
+
+libfribidi_mans = \
+               fribidi_get_bidi_type.3
+               fribidi_get_bidi_types.3
+               fribidi_log2vis.3
+               fribidi_log2vis_get_embedding_levels.3
+               fribidi_remove_bidi_marks.3
+               fribidi_get_mirror_char.3
+               fribidi_debug_status.3
+               fribidi_set_debug.3
+               fribidi_mirroring_status.3
+               fribidi_set_mirroring.3
+               fribidi_reorder_nsm_status.3
+               fribidi_set_reorder_nsm.3
+
+
+if FRIBIDI_CHARSETS
+
+
+endif
+
+headers = 
+include $(top_srcdir)/charset/Headers.mk
+headers += $(libfribidi_char_sets_la_headers)
+include $(top_srcdir)/lib/Headers.mk
+headers += $(libfribidi_la_headers)
+
diff --git a/fribidi.pc.in b/fribidi.pc.in
new file mode 100644 (file)
index 0000000..5db6e50
--- /dev/null
@@ -0,0 +1,13 @@
+# @configure_input@
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: @PACKAGE_NAME@
+Description: Unicode Bidirectional Algorithm Library
+Requires: @GLIB_PACKAGE@
+Version: @VERSION@
+Libs: -L${libdir} -lfribidi
+Cflags: -I${includedir}/@PACKAGE@
diff --git a/fribidi.spec.in b/fribidi.spec.in
new file mode 100644 (file)
index 0000000..056a7ff
--- /dev/null
@@ -0,0 +1,145 @@
+# This spec file creates three packages:
+#
+#      Everything:
+#              (this is equivalent to two others together)
+#                      @PACKAGE@N-version-release-arch.rpm
+#      Runtime material: Shared library and command line tool
+#                      lib@PACKAGE@N-version-release-arch.rpm
+#      Development material: Static library and header files
+#              (requires lib@PACKAGE@N)
+#                      lib@PACKAGE@N-devel-version-release-arch.rpm
+#      Where N is the major version number.
+
+%define name @PACKAGE@
+%define ver @FRIBIDI_VERSION@
+%define major @FRIBIDI_MAJOR_VERSION@
+%define minor @FRIBIDI_MINOR_VERSION@
+%define micro @FRIBIDI_MICRO_VERSION@
+%define apiver @FRIBIDI_INTERFACE_VERSION@
+%define rel @FRIBIDI_RPM_RELEASE@
+%define prefix %{_prefix}
+
+Name: %{name}
+Version: %{ver}
+Release: %{rel}
+Serial: %{apiver}
+License: LGPL
+Source: http://prdownloads.sourceforge.net/%{name}/%{name}-%{ver}.tar.gz
+URL: http://%{name}.sourceforge.net/
+BuildRoot: %{_tmppath}/%{name}
+Summary: Library implementing the Unicode Bidirectional Algorithm
+Group: System/Libraries
+%description
+A library to handle bidirectional scripts (eg. hebrew, arabic), so that
+the display is done in the proper way; while the text data itself is
+always written in logical order.
+
+%package -n %{name}%{major}
+Summary: Library implementing the Unicode Bidirectional Algorithm
+Group: System/Libraries
+Provides: lib%{name}%{major}
+Provides: lib%{name}%{major}-devel
+%description -n %{name}%{major}
+A library to handle bidirectional scripts (eg. hebrew, arabic), so that
+the display is done in the proper way; while the text data itself is
+always written in logical order.
+
+Install %{name}%{major} if you want to run or develop programs that use %{name}.
+
+
+%package -n lib%{name}%{major}
+Summary: Library implementing the Unicode Bidirectional Algorithm
+Group: System/Libraries
+Conflicts: %{name}%{major}
+%description -n lib%{name}%{major}
+The lib%{name}%{major} package includes the shared libraries for the %{name}%{major} package.
+
+Install lib%{name}%{major} if you want to run programs which use %{name}.
+
+
+%package -n lib%{name}%{major}-devel
+Summary: Library implementing the Unicode Bidirectional Algorithm
+Group: Development/C
+Requires: lib%{name}%{major} = %{ver}
+Conflicts: %{name}%{major}
+%description -n lib%{name}%{major}-devel
+The lib%{name}%{major}-devel package includes the static libraries and header files
+for the %{name}%{major} package.
+
+Install lib%{name}%{major}-devel if you want to develop programs which will use
+%{name}.
+
+
+%prep
+%setup
+
+%build
+if [ ! -x ./configure ];then 
+./bootstrap
+fi
+
+./configure %{_target_platform}                                         \
+       --prefix=%{_prefix}             --exec-prefix=%{_exec_prefix}   \
+       --bindir=%{_bindir}             --sbindir=%{_sbindir}           \
+       --sysconfdir=%{_sysconfdir}     --datadir=%{_datadir}           \
+       --includedir=%{_includedir}                                     \
+       --libdir=%{_libdir}             --libexecdir=%{_libexecdir}     \
+       --mandir=%{_mandir}             --infodir=%{_infodir}           \
+       --localstatedir=%{_localstatedir} --sharedstatedir=%{_sharedstatedir}
+make OPT_CFLAGS="$RPM_OPT_FLAGS"
+
+%install
+rm -rf "$RPM_BUILD_ROOT"
+mkdir -p "$RPM_BUILD_ROOT%{prefix}"
+make DESTDIR="$RPM_BUILD_ROOT" install
+
+
+%clean
+rm -rf "$RPM_BUILD_ROOT"
+
+%post -n %{name}%{major} -p /sbin/ldconfig
+%postun -n %{name}%{major} -p /sbin/ldconfig
+
+%post -n lib%{name}%{major} -p /sbin/ldconfig
+%postun -n lib%{name}%{major} -p /sbin/ldconfig
+
+%files -n %{name}%{major}
+%defattr(-,root,root)
+%doc README AUTHORS COPYING ChangeLog TODO THANKS NEWS
+%{_bindir}/%{name}
+%{_bindir}/%{name}-config
+%{_libdir}/*.so.*
+%{_libdir}/pkgconfig/%{name}.pc
+%{_libdir}/*.a
+%{_libdir}/*.la
+%{_libdir}/*.so
+%{_includedir}/*
+
+%files -n lib%{name}%{major}
+%defattr(-, root, root)
+%doc README AUTHORS COPYING ChangeLog TODO THANKS NEWS
+%{_bindir}/%{name}
+%{_bindir}/%{name}-config
+%{_libdir}/*.so.*
+
+%files -n lib%{name}%{major}-devel
+%defattr(-, root, root)
+%{_libdir}/*.a
+%{_libdir}/*.la
+%{_libdir}/*.so
+%{_includedir}/*
+%{_libdir}/pkgconfig/%{name}.pc
+
+
+%changelog
+
+* Tue Mar 12 2002  Behdad Esfahbod <behdad@bamdad.org>
+- Use License instead of Copyright
+- Moved pkgconfig to devel package instead of lib package.
+
+* Sat Jan 26 2002  Behdad Esfahbod <behdad@bamdad.org>
+- CFLAGS changed to OPT_CFLAGS.
+
+* Wed Jan  9 2002  Behdad Esfahbod <behdad@bamdad.org>
+- First spec released.
diff --git a/gen.tab/Makefile.am b/gen.tab/Makefile.am
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/gen.tab/gen-bidi-type-tab.c b/gen.tab/gen-bidi-type-tab.c
new file mode 100644 (file)
index 0000000..dbfa590
--- /dev/null
@@ -0,0 +1,267 @@
+/* FriBidi - Library of BiDi algorithm
+ * Copyright (C) 2001,2002 Behdad Esfahbod. 
+ * 
+ * This library is free software; you can redistribute it and/or 
+ * modify it under the terms of the GNU Lesser General Public 
+ * License as published by the Free Software Foundation; either 
+ * version 2.1 of the License, or (at your option) any later version. 
+ * 
+ * This library is distributed in the hope that it will be useful, 
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of 
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+ * Lesser General Public License for more details. 
+ * 
+ * You should have received a copy of the GNU Lesser General Public License 
+ * along with this library, in a file named COPYING; if not, write to the 
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+ * Boston, MA 02111-1307, USA  
+ * 
+ * For licensing issues, contact <fwpg@sharif.edu>. 
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "packtab.h"
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "fribidi_unicode.h"
+
+#ifndef SIZEOF_CHAR
+#define SIZEOF_CHAR sizeof (char)
+#endif
+
+static void
+err (
+  char *msg
+)
+{
+  fprintf (stderr, "fribidi_create_char_types: %s\n", msg);
+  exit (1);
+}
+
+static void
+err2 (
+  char *fmt,
+  char *p
+)
+{
+  fprintf (stderr, "fribidi_create_char_types: ");
+  fprintf (stderr, fmt, p);
+  fprintf (stderr, "\n");
+  exit (1);
+}
+
+/* *INDENT-OFF* */
+struct
+{
+  char *name;
+  int key;
+}
+type_names[] =
+{
+  {"LTR", 0}, {"L", 0},
+  {"RTL", 1}, {"R", 1},
+  {"AL", 2},
+  {"ON", 3},
+  {"BN", 4},
+  {"AN", 5},
+  {"BS", 6}, {"B", 6},
+  {"CS", 7},
+  {"EN", 8},
+  {"ES", 9},
+  {"ET", 10},
+  {"LRE", 11},
+  {"LRO", 12},
+  {"NSM", 13},
+  {"PDF", 14},
+  {"RLE", 15},
+  {"RLO", 16},
+  {"SS", 17}, {"S", 17},
+  {"WS", 18},
+};
+/* *INDENT-ON* */
+
+#define type_names_count (sizeof (type_names) / sizeof (type_names[0]))
+
+static char *names[type_names_count];
+
+static char *unidata_file;
+
+static char
+get_type (
+  char *s
+)
+{
+  int i;
+
+  for (i = 0; i < type_names_count; i++)
+    if (!strcmp (s, type_names[i].name))
+      return type_names[i].key;
+  err2 ("type name `%s' not found", s);
+  return 0;
+}
+
+#define table_name "FriBidiPropertyBlock"
+#define key_type_name "FriBidiPropCharType"
+#define macro_name "FRIBIDI_GET_TYPE"
+#define function_name "fribidi_get_type_internal"
+#define char_type_name "FriBidiCharType"
+#define char_name "FriBidiChar"
+#define prop_to_type_name "fribidi_prop_to_type"
+#define default_type "LTR"
+#define export_api "FRIBIDI_API"
+
+static int table[FRIBIDI_UNICODE_CHARS];
+
+static void
+init_table (
+)
+{
+  int i;
+  int deftype = get_type (default_type),
+    RTL = get_type ("RTL"), AL = get_type ("AL");
+
+  for (i = 0; i < type_names_count; i++)
+    names[i] = 0;
+  for (i = type_names_count - 1; i >= 0; i--)
+    names[type_names[i].key] = type_names[i].name;
+
+  /* initialize table */
+  for (i = 0; i < FRIBIDI_UNICODE_CHARS; i++)
+    table[i] = deftype;
+  for (i = 0x590; i < 0x600; i++)
+    table[i] = RTL;
+  for (i = 0xFB1D; i < 0xFB50; i++)
+    table[i] = RTL;
+  for (i = 0x600; i < 0x7C0; i++)
+    table[i] = AL;
+  for (i = 0xFB50; i < 0xFE00; i++)
+    table[i] = AL;
+  for (i = 0xFE70; i < 0xFF00; i++)
+    table[i] = AL;
+}
+
+static void
+read_unicode_data (
+)
+{
+  char s[500], tp[10];
+  unsigned int i;
+  FILE *f;
+
+  printf ("Reading `UnicodeData.txt'\n");
+  if (!(f = fopen (unidata_file, "rt")))
+    err2 ("error: cannot open `%s' for reading", unidata_file);
+  while (fgets (s, sizeof s, f))
+    {
+      sscanf (s, "%x;%*[^;];%*[^;];%*[^;];%[^;]", &i, tp);
+      table[i] = get_type (tp);
+    }
+  fclose (f);
+}
+
+static char *
+headermacro (
+  char *file
+)
+{
+  char *t = strdup (file);
+  char *p = t;
+  while (*p)
+    {
+      if (*p >= 'a' && *p <= 'z')
+       *p += 'A' - 'a';
+      else if ((*p < 'A' || *p > 'Z') && (*p < '0' || *p > '9'))
+       *p = '_';
+      p++;
+    }
+  return t;
+}
+
+static void
+write_char_type (
+  char *file,
+  int max_depth
+)
+{
+  int i;
+  FILE *f;
+  char *FILENAME = headermacro (file);
+
+  printf ("Writing `%s', it may take a few minutes\n", file);
+  if (!(f = fopen (file, "wt")))
+    err2 ("error: cannot open `%s' for writing", file);
+  fprintf (f, "/*\n"
+          "  This file was automatically created from UnicodeData.txt version %s\n"
+          "  by fribidi_create_char_types\n*/\n\n", FRIBIDI_UNICODE_VERSION);
+
+  fprintf (f, "#ifndef %s\n#define %s\n\n#include \"fribidi.h\"\n\n",
+          FILENAME, FILENAME);
+
+  for (i = 0; i < type_names_count; i++)
+    if (names[i])
+      fprintf (f, "#define %s FRIBIDI_PROP_TYPE_%s\n", names[i], names[i]);
+  fprintf (f, "\n");
+
+  fprintf (f, "#define PACKTAB_UINT8 fribidi_uint8\n");
+  fprintf (f, "#define PACKTAB_UINT16 fribidi_uint16\n");
+  fprintf (f, "#define PACKTAB_UINT32 fribidi_uint32\n");
+
+  if (!pack_table
+      (table, FRIBIDI_UNICODE_CHARS, SIZEOF_CHAR, max_depth, 3, names,
+       key_type_name, table_name, macro_name, f))
+    err ("error: insufficient memory, decrease max_depth");
+
+  for (i = type_names_count - 1; i >= 0; i--)
+    if (names[i])
+      fprintf (f, "#undef %s\n", names[i]);
+
+  fprintf (f,
+          "/*======================================================================\n"
+          " *  %s() returns the bidi type of a character.\n"
+          " *----------------------------------------------------------------------*/\n"
+          "%s %s\n"
+          "%s (%s uch)\n"
+          "{\n"
+          "  if (uch < 0x%x)\n"
+          "    return %s[(unsigned char)%s (uch)];\n"
+          "  else\n"
+          "    return FRIBIDI_TYPE_%s;\n"
+          "  /* Non-Unicode chars */\n"
+          "}\n"
+          "\n",
+          function_name, export_api, char_type_name, function_name,
+          char_name, FRIBIDI_UNICODE_CHARS, prop_to_type_name, macro_name,
+          default_type);
+  fprintf (f, "\n#endif /* %s */\n", FILENAME);
+
+  fclose (f);
+}
+
+int
+main (
+  int argc,
+  char **argv
+)
+{
+  int max_depth;
+  char file[50], *p;
+  if (argc < 2)
+    err ("usage: fribidi_create_char_types max_depth [UnicodeData.txt path]");
+  p = (argc >= 3) ? argv[2] : "unidata";
+  unidata_file = malloc (50 + strlen (p));
+  sprintf (unidata_file, "%s/UnicodeData.txt", p);
+  max_depth = atoi (argv[1]);
+  if (!max_depth)
+    err ("invalid depth");
+  if (max_depth < 2 || max_depth > 9)
+    err2 ("invalid max_depth `%s', max_depth should be between 2 and 9",
+         argv[1]);
+  sprintf (file, "fribidi_tab_char_type_%d.i", max_depth);
+  init_table ();
+  read_unicode_data ();
+  write_char_type (file, max_depth);
+  return 0;
+}
diff --git a/gen.tab/gen-mirroring-tab.c b/gen.tab/gen-mirroring-tab.c
new file mode 100644 (file)
index 0000000..611b1b4
--- /dev/null
@@ -0,0 +1,152 @@
+/* FriBidi - Library of BiDi algorithm
+ * Copyright (C) 2001,2002 Behdad Esfahbod. 
+ * 
+ * This library is free software; you can redistribute it and/or 
+ * modify it under the terms of the GNU Lesser General Public 
+ * License as published by the Free Software Foundation; either 
+ * version 2.1 of the License, or (at your option) any later version. 
+ * 
+ * This library is distributed in the hope that it will be useful, 
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of 
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+ * Lesser General Public License for more details. 
+ * 
+ * You should have received a copy of the GNU Lesser General Public License 
+ * along with this library, in a file named COPYING; if not, write to the 
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+ * Boston, MA 02111-1307, USA  
+ * 
+ * For licensing issues, contact <fwpg@sharif.edu>. 
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include "fribidi_unicode.h"
+
+static void
+err2 (
+  char *fmt,
+  char *p
+)
+{
+  fprintf (stderr, "fribidi_create_mirroring: error: ");
+  fprintf (stderr, fmt, p);
+  fprintf (stderr, "\n");
+  exit (1);
+}
+
+static int table[0x110000];
+static char *bidi_mirroring_file;
+
+static int mirroring_count;
+
+static void
+read_bidi_mirroring (
+)
+{
+  char s[500];
+  unsigned int i, j;
+  FILE *f;
+
+  for (i = 0; i < 0x110000; i++)
+    table[i] = 0;
+  mirroring_count = 0;
+  printf ("Reading `BidiMirroring.txt'\n");
+  if (!(f = fopen (bidi_mirroring_file, "rt")))
+    err2 ("cannot open `%s' for reading", bidi_mirroring_file);
+/*  fgets (s, sizeof s, f);
+  sscanf (s, "# BidiMirroring-%s.txt", bidi_mirroring_version = malloc (20));*/
+  while (fgets (s, sizeof s, f))
+    {
+      if (s[0] == '#' || s[0] == '\0' || s[0] == '\n')
+       continue;
+      sscanf (s, "%x; %x", &i, &j);
+      table[i] = j;
+      table[j] = i;
+      mirroring_count++;
+    }
+  fclose (f);
+}
+
+static char *
+headermacro (
+  char *file
+)
+{
+  char *t = strdup (file);
+  char *p = t;
+  while (*p)
+    {
+      if (*p >= 'a' && *p <= 'z')
+       *p += 'A' - 'a';
+      else if ((*p < 'A' || *p > 'Z') && (*p < '0' || *p > '9'))
+       *p = '_';
+      p++;
+    }
+  return t;
+}
+
+static void
+write_mirror (
+  char *file
+)
+{
+  int i;
+  FILE *f;
+  char *FILENAME = headermacro (file);
+
+  printf ("Writing `%s'\n", file);
+  if (!(f = fopen (file, "wt")))
+    err2 ("cannot open `%s' for writing", file);
+  fprintf (f, "/*\n"
+          "  This file was automatically created from BidiMirroring.txt, version %s\n"
+          "  by fribidi_create_mirroring\n*/\n\n", FRIBIDI_UNICODE_VERSION);
+  fprintf (f, "#ifndef %s\n#define %s\n\n#include \"fribidi.h\"\n\n",
+          FILENAME, FILENAME);
+  fprintf (f, "/*\n"
+          "  Mirrored characters include all the characters in the Unicode list\n"
+          "  that have been declared as being mirrored and that have a mirrored\n"
+          "  equivalent.\n"
+          "\n"
+          "  There are lots of characters that are designed as being mirrored\n"
+          "  but do not have any mirrored glyph, e.g. the sign for there exist.\n");
+  fprintf (f,
+          "  Are these used in Arabic? That is are all the mathematical signs\n"
+          "  that are assigned to be mirrorable actually mirrored in Arabic?\n"
+          "  If that is the case, we'll change the below code to include also\n"
+          "  characters that mirror to themself. It will then be the responsibility\n"
+          "  of the display engine to actually mirror these.\n" "*/\n\n");
+  fprintf (f, "/* *INDENT-OFF" "* */\n\n");
+  fprintf (f, "static const struct\n"
+          "{\n"
+          "  FriBidiChar ch, mirrored_ch;\n"
+          "}\n" "FriBidiMirroredChars[] =\n" "{\n");
+  for (i = 0; i < 0x110000; i++)
+    if (table[i])
+      fprintf (f, "  {0x%04X, 0x%04X},\n", i, table[i]);
+  fprintf (f, "} ;\n\n");
+  fprintf (f, "/* *INDE" "NT-ON* */\n\n");
+  fprintf (f, "const int nFriBidiMirroredChars = %d;\n\n", mirroring_count);
+  fprintf (f, "\n#endif /* %s */\n", FILENAME);
+  fclose (f);
+}
+
+int
+main (
+  int argc,
+  char **argv
+)
+{
+  char *p;
+
+  p = (argc >= 2) ? argv[1] : "unidata";
+  bidi_mirroring_file = malloc (50 + strlen (p));
+  sprintf (bidi_mirroring_file, "%s/BidiMirroring.txt", p);
+  read_bidi_mirroring ();
+  write_mirror ("fribidi_tab_mirroring.i");
+  return 0;
+}
diff --git a/gen.tab/packtab.c b/gen.tab/packtab.c
new file mode 100644 (file)
index 0000000..311090a
--- /dev/null
@@ -0,0 +1,364 @@
+/* PackTab - Pack a static table
+ * Copyright (C) 2001 Behdad Esfahbod. 
+ * 
+ * This library is free software; you can redistribute it and/or 
+ * modify it under the terms of the GNU Lesser General Public 
+ * License as published by the Free Software Foundation; either 
+ * version 2.1 of the License, or (at your option) any later version. 
+ * 
+ * This library is distributed in the hope that it will be useful, 
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of 
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+ * Lesser General Public License for more details. 
+ * 
+ * You should have received a copy of the GNU Lesser General Public License 
+ * along with this library, in a file named COPYING; if not, write to the 
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+ * Boston, MA 02111-1307, USA  
+ * 
+ * For licensing issues, contact <fwpg@sharif.edu>. 
+ */
+
+/*
+  8 <= N <= 2^21
+  int key
+  1 <= max_depth <= 21
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "packtab.h"
+
+typedef int uni_table[1024 * 1024 * 2];
+static int n, a, max_depth, N, digits, tab_width, per_row;
+static uni_table temp, x, perm, *tab;
+static int pow[22], cluster, cmpcluster;
+static char **name, *key_type_name, *table_name, *macro_name;
+static FILE *f;
+
+static void
+init (
+  int *base
+)
+{
+  int i;
+  pow[0] = 1;
+  for (i = 1; i <= 21; i++)
+    pow[i] = pow[i - 1] * 2;
+  for (n = 21; pow[n] > N || N % pow[n]; n--)
+    ;
+  digits = (n + 3) / 4;
+  for (i = 6; i; i--)
+    if (pow[i] * (tab_width + 1) < 80)
+      break;
+  per_row = pow[i];
+}
+
+static int
+compare (
+  const void *r,
+  const void *s
+)
+{
+  int i;
+  for (i = 0; i < cmpcluster; i++)
+    if (((int *) r)[i] != ((int *) s)[i])
+      return ((int *) r)[i] - ((int *) s)[i];
+  return 0;
+}
+
+static int lev, p[22], t[22], c[22], clusters[22], s, nn;
+static int best_lev, best_p[22], best_t[22], best_c[22], best_cluster[22],
+  best_s;
+
+static void
+found (
+  void
+)
+{
+  int i;
+
+  if (s < best_s)
+    {
+      best_s = s;
+      best_lev = lev;
+      for (i = 0; i <= lev; i++)
+       {
+         best_p[i] = p[i];
+         best_c[i] = c[i];
+         best_t[i] = t[i];
+         best_cluster[i] = clusters[i];
+       }
+    }
+}
+
+static void
+bt (
+  int node_size
+)
+{
+  int i, j, k, y, sbak, key_bytes;
+
+  if (t[lev] == 1)
+    {
+      found ();
+      return;
+    }
+  if (lev == max_depth)
+    return;
+
+  for (i = 1 - t[lev] % 2; i <= nn + (t[lev] >> nn) % 2; i++)
+    {
+      nn -= (p[lev] = i);
+      clusters[lev] = cluster = (i && nn >= 0) ? pow[i] : t[lev];
+      cmpcluster = cluster + 1;
+
+      t[lev + 1] = (t[lev] - 1) / cluster + 1;
+      for (j = 0; j < t[lev + 1]; j++)
+       {
+         memmove (temp + j * cmpcluster, tab[lev] + j * cluster,
+                  cluster * sizeof (tab[lev][0]));
+         temp[j * cmpcluster + cluster] = j;
+       }
+      qsort (temp, t[lev + 1], cmpcluster * sizeof (temp[0]), compare);
+      for (j = 0; j < t[lev + 1]; j++)
+       {
+         perm[j] = temp[j * cmpcluster + cluster];
+         temp[j * cmpcluster + cluster] = 0;
+       }
+      k = 1;
+      y = 0;
+      tab[lev + 1][perm[0]] = perm[0];
+      for (j = 1; j < t[lev + 1]; j++)
+       {
+         if (compare (temp + y, temp + y + cmpcluster))
+           {
+             k++;
+             tab[lev + 1][perm[j]] = perm[j];
+           }
+         else
+           tab[lev + 1][perm[j]] = tab[lev + 1][perm[j - 1]];
+         y += cmpcluster;
+       }
+      sbak = s;
+      s += k * node_size * cluster;
+      c[lev] = k;
+
+      if (s >= best_s)
+       {
+         s = sbak;
+         nn += i;
+         return;
+       }
+
+      key_bytes = k * cluster;
+      key_bytes = key_bytes < 0xff ? 1 : key_bytes < 0xffff ? 2 : 4;
+      lev++;
+      bt (key_bytes);
+      lev--;
+
+      s = sbak;
+      nn += i;
+    }
+}
+
+static void
+solve (
+  void
+)
+{
+  best_lev = max_depth + 2;
+  best_s = N * a * 2;
+  lev = 0;
+  s = 0;
+  nn = n;
+  t[0] = N;
+  bt (a);
+}
+
+static void
+write_array (
+  int max_key
+)
+{
+  int i, j, k, y, ii, ofs;
+  char *key_type;
+
+  if (best_t[lev] == 1)
+    return;
+
+  nn -= (i = best_p[lev]);
+  cluster = best_cluster[lev];
+  cmpcluster = cluster + 1;
+
+  t[lev + 1] = best_t[lev + 1];
+  for (j = 0; j < t[lev + 1]; j++)
+    {
+      memmove (temp + j * cmpcluster, tab[lev] + j * cluster,
+              cluster * sizeof (tab[lev][0]));
+      temp[j * cmpcluster + cluster] = j;
+    }
+  qsort (temp, t[lev + 1], cmpcluster * sizeof (temp[0]), compare);
+  for (j = 0; j < t[lev + 1]; j++)
+    {
+      perm[j] = temp[j * cmpcluster + cluster];
+      temp[j * cmpcluster + cluster] = 0;
+    }
+  k = 1;
+  y = 0;
+  tab[lev + 1][perm[0]] = x[0] = perm[0];
+  for (j = 1; j < t[lev + 1]; j++)
+    {
+      if (compare (temp + y, temp + y + cmpcluster))
+       {
+         x[k] = perm[j];
+         tab[lev + 1][perm[j]] = x[k];
+         k++;
+       }
+      else
+       tab[lev + 1][perm[j]] = tab[lev + 1][perm[j - 1]];
+      y += cmpcluster;
+    }
+
+  i = 0;
+  for (ii = 1; ii < k; ii++)
+    if (x[ii] < x[i])
+      i = ii;
+
+  key_type = !lev ? key_type_name :
+    max_key <= 0xff ? "PACKTAB_UINT8" :
+    max_key <= 0xffff ? "PACKTAB_UINT16" : "PACKTAB_UINT32";
+  fprintf (f, "static const %s %sLevel%d[%d*%d] = {", key_type, table_name,
+          best_lev - lev - 1, cluster, k);
+  ofs = 0;
+  for (ii = 0; ii < k; ii++)
+    {
+      int kk, jj;
+      fprintf (f, "\n\n#define %sLevel%d_%0*X 0x%0X\n", table_name,
+              best_lev - lev - 1, digits, x[i] * pow[n - nn], ofs);
+      kk = x[i] * cluster;
+      if (!lev)
+       if (name)
+         for (j = 0; j < cluster; j++)
+           {
+             if (!(j % per_row) && j != cluster - 1)
+               fprintf (f, "\n  ");
+             fprintf (f, "%*s,", tab_width, name[tab[lev][kk++]]);
+           }
+       else
+         for (j = 0; j < cluster; j++)
+           {
+             if (!(j % per_row) && j != cluster - 1)
+               fprintf (f, "\n  ");
+             fprintf (f, "%*d,", tab_width, tab[lev][kk++]);
+           }
+      else
+       for (j = 0; j < cluster; j++, kk++)
+         fprintf (f, "\n  %sLevel%d_%0*X,  /* %0*X..%0*X */", table_name,
+                  best_lev - lev, digits,
+                  tab[lev][kk] * pow[n - nn - best_p[lev]], digits,
+                  x[i] * pow[n - nn] + j * pow[n - nn - best_p[lev]], digits,
+                  x[i] * pow[n - nn] + (j + 1) * pow[n - nn - best_p[lev]] -
+                  1);
+      ofs += cluster;
+      jj = i;
+      for (j = 0; j < k; j++)
+       if (x[j] > x[i] && (x[j] < x[jj] || jj == i))
+         jj = j;
+      i = jj;
+    }
+  fprintf (f, "\n};\n\n");
+  lev++;
+  write_array (cluster * k);
+  lev--;
+}
+
+static void
+write_source (
+  void
+)
+{
+  int i, j;
+
+  lev = 0;
+  s = 0;
+  nn = n;
+  t[0] = N;
+  fprintf (f, "\n" "/* *INDENT-OFF* */\n\n");
+  write_array (0);
+  fprintf (f, "/* *INDENT-ON* */\n\n");
+
+  fprintf (f, "#define %s(x)", macro_name);
+  j = 1;
+  for (i = best_lev - 1; i >= 0; i--)
+    {
+      fprintf (f, "\t\\\n\t%sLevel%d[(x)", table_name, i);
+      if (j != 1)
+       fprintf (f, "/%d", j);
+      if (i)
+       fprintf (f, "%%%d +", pow[best_p[best_lev - 1 - i]]);
+      j *= best_cluster[best_lev - 1 - i];
+    }
+  for (i = 0; i < best_lev; i++)
+    fprintf (f, "]");
+  fprintf (f, "\n\n");
+}
+
+static void
+write_out (
+)
+{
+  int i;
+  fprintf (f, "/*\n"
+          "  Automatically generated by packtab.c version %d\n\n"
+          "  just use %s(key)\n\n"
+          "  assumed sizeof(%s) == %d\n"
+          "  required memory: %d\n"
+          "  lookups: %d\n"
+          "  partition shape: %s",
+          packtab_version, macro_name, key_type_name, a, best_s, best_lev,
+          table_name);
+  for (i = best_lev - 1; i >= 0; i--)
+    fprintf (f, "[%d]", best_cluster[i]);
+  fprintf (f, "\n" "  different table entries:");
+  for (i = best_lev - 1; i >= 0; i--)
+    fprintf (f, " %d", best_c[i]);
+  fprintf (f, "\n*/\n");
+  write_source ();
+}
+
+int
+pack_table (
+  int *base,
+  int key_num,
+  int key_size,
+  int p_max_depth,
+  int p_tab_width,
+  char **p_name,
+  char *p_key_type_name,
+  char *p_table_name,
+  char *p_macro_name,
+  FILE * out
+)
+{
+  N = key_num;
+  a = key_size;
+  max_depth = p_max_depth;
+  tab_width = p_tab_width;
+  name = p_name;
+  key_type_name = p_key_type_name;
+  table_name = p_table_name;
+  macro_name = p_macro_name;
+  f = out;
+  init (base);
+  if (!(tab = malloc ((n + 1) * sizeof (tab[0]))))
+    return 0;
+  memmove (tab[0], base, key_num * sizeof (int));
+  solve ();
+  write_out ();
+  free (tab);
+  return 1;
+}
+
+/* End of packtab.c */
diff --git a/gen.tab/packtab.h b/gen.tab/packtab.h
new file mode 100644 (file)
index 0000000..6a80e13
--- /dev/null
@@ -0,0 +1,49 @@
+/* PackTab - Pack a static table
+ * Copyright (C) 2001 Behdad Esfahbod. 
+ * 
+ * This library is free software; you can redistribute it and/or 
+ * modify it under the terms of the GNU Lesser General Public 
+ * License as published by the Free Software Foundation; either 
+ * version 2.1 of the License, or (at your option) any later version. 
+ * 
+ * This library is distributed in the hope that it will be useful, 
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of 
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
+ * Lesser General Public License for more details. 
+ * 
+ * You should have received a copy of the GNU Lesser General Public License 
+ * along with this library, in a file named COPYING; if not, write to the 
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330, 
+ * Boston, MA 02111-1307, USA  
+ * 
+ * For licensing issues, contact <fwpg@sharif.edu>. 
+ */
+
+#ifndef PACKTAB_H
+#define PACKTAB_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define packtab_version 2
+
+  int pack_table (
+  int *base,
+  int key_num,
+  int key_size,
+  int max_depth,
+  int tab_width,
+  char **name,
+  char *key_type_name,
+  char *table_name,
+  char *macro_name,
+  FILE * out
+  );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif                         /* PACKTAB_H */
diff --git a/gen.tab/unidata/BidiMirroring.txt b/gen.tab/unidata/BidiMirroring.txt
new file mode 100644 (file)
index 0000000..f799da1
--- /dev/null
@@ -0,0 +1,525 @@
+# BidiMirroring-4.0.0.txt
+# 
+# This file is an informative supplement to the UnicodeData file. It
+# lists characters that have the mirrored property
+# where there is another Unicode character that typically has a glyph
+# that is the mirror image of the original character's glyph.
+# The repertoire covered by the file is Unicode 4.0.0.
+# 
+# The file contains a list of lines with mappings from one code point
+# to another one for character-based mirroring.
+# Note that for "real" mirroring, a rendering engine needs to select
+# appropriate alternative glyphs, and that many Unicode characters do not
+# have a mirror-image Unicode character.
+# 
+# Each mapping line contains two fields, separated by a semicolon (';').
+# Each of the two fields contains a code point represented as a
+# variable-length hexadecimal value with 4 to 6 digits.
+# A comment indicates where the characters are "BEST FIT" mirroring.
+# 
+# Code points with the "mirrored" property but no appropriate mirrors are
+# listed as comments at the end of the file.
+# 
+# For information on bidi mirroring, see UAX #9: Bidirectional Algorithm,
+# at http://www.unicode.org/unicode/reports/tr9/
+# 
+# This file was originally created by Markus Scherer.
+# Extended for Unicode 3.2 and 4.0 by Ken Whistler.
+# 
+# ############################################################
+
+0028; 0029 # LEFT PARENTHESIS
+0029; 0028 # RIGHT PARENTHESIS
+003C; 003E # LESS-THAN SIGN
+003E; 003C # GREATER-THAN SIGN
+005B; 005D # LEFT SQUARE BRACKET
+005D; 005B # RIGHT SQUARE BRACKET
+007B; 007D # LEFT CURLY BRACKET
+007D; 007B # RIGHT CURLY BRACKET
+00AB; 00BB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BB; 00AB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+2039; 203A # SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A; 2039 # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+2045; 2046 # LEFT SQUARE BRACKET WITH QUILL
+2046; 2045 # RIGHT SQUARE BRACKET WITH QUILL
+207D; 207E # SUPERSCRIPT LEFT PARENTHESIS
+207E; 207D # SUPERSCRIPT RIGHT PARENTHESIS
+208D; 208E # SUBSCRIPT LEFT PARENTHESIS
+208E; 208D # SUBSCRIPT RIGHT PARENTHESIS
+2208; 220B # ELEMENT OF
+2209; 220C # NOT AN ELEMENT OF
+220A; 220D # SMALL ELEMENT OF
+220B; 2208 # CONTAINS AS MEMBER
+220C; 2209 # DOES NOT CONTAIN AS MEMBER
+220D; 220A # SMALL CONTAINS AS MEMBER
+2215; 29F5 # DIVISION SLASH
+223C; 223D # TILDE OPERATOR
+223D; 223C # REVERSED TILDE
+2243; 22CD # ASYMPTOTICALLY EQUAL TO
+2252; 2253 # APPROXIMATELY EQUAL TO OR THE IMAGE OF
+2253; 2252 # IMAGE OF OR APPROXIMATELY EQUAL TO
+2254; 2255 # COLON EQUALS
+2255; 2254 # EQUALS COLON
+2264; 2265 # LESS-THAN OR EQUAL TO
+2265; 2264 # GREATER-THAN OR EQUAL TO
+2266; 2267 # LESS-THAN OVER EQUAL TO
+2267; 2266 # GREATER-THAN OVER EQUAL TO
+2268; 2269 # [BEST FIT] LESS-THAN BUT NOT EQUAL TO
+2269; 2268 # [BEST FIT] GREATER-THAN BUT NOT EQUAL TO
+226A; 226B # MUCH LESS-THAN
+226B; 226A # MUCH GREATER-THAN
+226E; 226F # [BEST FIT] NOT LESS-THAN
+226F; 226E # [BEST FIT] NOT GREATER-THAN
+2270; 2271 # [BEST FIT] NEITHER LESS-THAN NOR EQUAL TO
+2271; 2270 # [BEST FIT] NEITHER GREATER-THAN NOR EQUAL TO
+2272; 2273 # [BEST FIT] LESS-THAN OR EQUIVALENT TO
+2273; 2272 # [BEST FIT] GREATER-THAN OR EQUIVALENT TO
+2274; 2275 # [BEST FIT] NEITHER LESS-THAN NOR EQUIVALENT TO
+2275; 2274 # [BEST FIT] NEITHER GREATER-THAN NOR EQUIVALENT TO
+2276; 2277 # LESS-THAN OR GREATER-THAN
+2277; 2276 # GREATER-THAN OR LESS-THAN
+2278; 2279 # NEITHER LESS-THAN NOR GREATER-THAN
+2279; 2278 # NEITHER GREATER-THAN NOR LESS-THAN
+227A; 227B # PRECEDES
+227B; 227A # SUCCEEDS
+227C; 227D # PRECEDES OR EQUAL TO
+227D; 227C # SUCCEEDS OR EQUAL TO
+227E; 227F # [BEST FIT] PRECEDES OR EQUIVALENT TO
+227F; 227E # [BEST FIT] SUCCEEDS OR EQUIVALENT TO
+2280; 2281 # [BEST FIT] DOES NOT PRECEDE
+2281; 2280 # [BEST FIT] DOES NOT SUCCEED
+2282; 2283 # SUBSET OF
+2283; 2282 # SUPERSET OF
+2284; 2285 # [BEST FIT] NOT A SUBSET OF
+2285; 2284 # [BEST FIT] NOT A SUPERSET OF
+2286; 2287 # SUBSET OF OR EQUAL TO
+2287; 2286 # SUPERSET OF OR EQUAL TO
+2288; 2289 # [BEST FIT] NEITHER A SUBSET OF NOR EQUAL TO
+2289; 2288 # [BEST FIT] NEITHER A SUPERSET OF NOR EQUAL TO
+228A; 228B # [BEST FIT] SUBSET OF WITH NOT EQUAL TO
+228B; 228A # [BEST FIT] SUPERSET OF WITH NOT EQUAL TO
+228F; 2290 # SQUARE IMAGE OF
+2290; 228F # SQUARE ORIGINAL OF
+2291; 2292 # SQUARE IMAGE OF OR EQUAL TO
+2292; 2291 # SQUARE ORIGINAL OF OR EQUAL TO
+2298; 29B8 # CIRCLED DIVISION SLASH
+22A2; 22A3 # RIGHT TACK
+22A3; 22A2 # LEFT TACK
+22A6; 2ADE # ASSERTION
+22A8; 2AE4 # TRUE
+22A9; 2AE3 # FORCES
+22AB; 2AE5 # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22B0; 22B1 # PRECEDES UNDER RELATION
+22B1; 22B0 # SUCCEEDS UNDER RELATION
+22B2; 22B3 # NORMAL SUBGROUP OF
+22B3; 22B2 # CONTAINS AS NORMAL SUBGROUP
+22B4; 22B5 # NORMAL SUBGROUP OF OR EQUAL TO
+22B5; 22B4 # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+22B6; 22B7 # ORIGINAL OF
+22B7; 22B6 # IMAGE OF
+22C9; 22CA # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CA; 22C9 # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+22CB; 22CC # LEFT SEMIDIRECT PRODUCT
+22CC; 22CB # RIGHT SEMIDIRECT PRODUCT
+22CD; 2243 # REVERSED TILDE EQUALS
+22D0; 22D1 # DOUBLE SUBSET
+22D1; 22D0 # DOUBLE SUPERSET
+22D6; 22D7 # LESS-THAN WITH DOT
+22D7; 22D6 # GREATER-THAN WITH DOT
+22D8; 22D9 # VERY MUCH LESS-THAN
+22D9; 22D8 # VERY MUCH GREATER-THAN
+22DA; 22DB # LESS-THAN EQUAL TO OR GREATER-THAN
+22DB; 22DA # GREATER-THAN EQUAL TO OR LESS-THAN
+22DC; 22DD # EQUAL TO OR LESS-THAN
+22DD; 22DC # EQUAL TO OR GREATER-THAN
+22DE; 22DF # EQUAL TO OR PRECEDES
+22DF; 22DE # EQUAL TO OR SUCCEEDS
+22E0; 22E1 # [BEST FIT] DOES NOT PRECEDE OR EQUAL
+22E1; 22E0 # [BEST FIT] DOES NOT SUCCEED OR EQUAL
+22E2; 22E3 # [BEST FIT] NOT SQUARE IMAGE OF OR EQUAL TO
+22E3; 22E2 # [BEST FIT] NOT SQUARE ORIGINAL OF OR EQUAL TO
+22E4; 22E5 # [BEST FIT] SQUARE IMAGE OF OR NOT EQUAL TO
+22E5; 22E4 # [BEST FIT] SQUARE ORIGINAL OF OR NOT EQUAL TO
+22E6; 22E7 # [BEST FIT] LESS-THAN BUT NOT EQUIVALENT TO
+22E7; 22E6 # [BEST FIT] GREATER-THAN BUT NOT EQUIVALENT TO
+22E8; 22E9 # [BEST FIT] PRECEDES BUT NOT EQUIVALENT TO
+22E9; 22E8 # [BEST FIT] SUCCEEDS BUT NOT EQUIVALENT TO
+22EA; 22EB # [BEST FIT] NOT NORMAL SUBGROUP OF
+22EB; 22EA # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP
+22EC; 22ED # [BEST FIT] NOT NORMAL SUBGROUP OF OR EQUAL TO
+22ED; 22EC # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+22F0; 22F1 # UP RIGHT DIAGONAL ELLIPSIS
+22F1; 22F0 # DOWN RIGHT DIAGONAL ELLIPSIS
+22F2; 22FA # ELEMENT OF WITH LONG HORIZONTAL STROKE
+22F3; 22FB # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F4; 22FC # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22F6; 22FD # ELEMENT OF WITH OVERBAR
+22F7; 22FE # SMALL ELEMENT OF WITH OVERBAR
+22FA; 22F2 # CONTAINS WITH LONG HORIZONTAL STROKE
+22FB; 22F3 # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FC; 22F4 # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+22FD; 22F6 # CONTAINS WITH OVERBAR
+22FE; 22F7 # SMALL CONTAINS WITH OVERBAR
+2308; 2309 # LEFT CEILING
+2309; 2308 # RIGHT CEILING
+230A; 230B # LEFT FLOOR
+230B; 230A # RIGHT FLOOR
+2329; 232A # LEFT-POINTING ANGLE BRACKET
+232A; 2329 # RIGHT-POINTING ANGLE BRACKET
+2768; 2769 # MEDIUM LEFT PARENTHESIS ORNAMENT
+2769; 2768 # MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A; 276B # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B; 276A # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C; 276D # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D; 276C # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E; 276F # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F; 276E # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770; 2771 # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771; 2770 # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772; 2773 # LIGHT LEFT TORTOISE SHELL BRACKET
+2773; 2772 # LIGHT RIGHT TORTOISE SHELL BRACKET
+2774; 2775 # MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775; 2774 # MEDIUM RIGHT CURLY BRACKET ORNAMENT
+27D5; 27D6 # LEFT OUTER JOIN
+27D6; 27D5 # RIGHT OUTER JOIN
+27DD; 27DE # LONG RIGHT TACK
+27DE; 27DD # LONG LEFT TACK
+27E2; 27E3 # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+27E3; 27E2 # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+27E4; 27E5 # WHITE SQUARE WITH LEFTWARDS TICK
+27E5; 27E4 # WHITE SQUARE WITH RIGHTWARDS TICK
+27E6; 27E7 # MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7; 27E6 # MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8; 27E9 # MATHEMATICAL LEFT ANGLE BRACKET
+27E9; 27E8 # MATHEMATICAL RIGHT ANGLE BRACKET
+27EA; 27EB # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB; 27EA # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+2983; 2984 # LEFT WHITE CURLY BRACKET
+2984; 2983 # RIGHT WHITE CURLY BRACKET
+2985; 2986 # LEFT WHITE PARENTHESIS
+2986; 2985 # RIGHT WHITE PARENTHESIS
+2987; 2988 # Z NOTATION LEFT IMAGE BRACKET
+2988; 2987 # Z NOTATION RIGHT IMAGE BRACKET
+2989; 298A # Z NOTATION LEFT BINDING BRACKET
+298A; 2989 # Z NOTATION RIGHT BINDING BRACKET
+298B; 298C # LEFT SQUARE BRACKET WITH UNDERBAR
+298C; 298B # RIGHT SQUARE BRACKET WITH UNDERBAR
+298D; 2990 # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E; 298F # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F; 298E # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990; 298D # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991; 2992 # LEFT ANGLE BRACKET WITH DOT
+2992; 2991 # RIGHT ANGLE BRACKET WITH DOT
+2993; 2994 # LEFT ARC LESS-THAN BRACKET
+2994; 2993 # RIGHT ARC GREATER-THAN BRACKET
+2995; 2996 # DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996; 2995 # DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997; 2998 # LEFT BLACK TORTOISE SHELL BRACKET
+2998; 2997 # RIGHT BLACK TORTOISE SHELL BRACKET
+29B8; 2298 # CIRCLED REVERSE SOLIDUS
+29C0; 29C1 # CIRCLED LESS-THAN
+29C1; 29C0 # CIRCLED GREATER-THAN
+29C4; 29C5 # SQUARED RISING DIAGONAL SLASH
+29C5; 29C4 # SQUARED FALLING DIAGONAL SLASH
+29CF; 29D0 # LEFT TRIANGLE BESIDE VERTICAL BAR
+29D0; 29CF # VERTICAL BAR BESIDE RIGHT TRIANGLE
+29D1; 29D2 # BOWTIE WITH LEFT HALF BLACK
+29D2; 29D1 # BOWTIE WITH RIGHT HALF BLACK
+29D4; 29D5 # TIMES WITH LEFT HALF BLACK
+29D5; 29D4 # TIMES WITH RIGHT HALF BLACK
+29D8; 29D9 # LEFT WIGGLY FENCE
+29D9; 29D8 # RIGHT WIGGLY FENCE
+29DA; 29DB # LEFT DOUBLE WIGGLY FENCE
+29DB; 29DA # RIGHT DOUBLE WIGGLY FENCE
+29F5; 2215 # REVERSE SOLIDUS OPERATOR
+29F8; 29F9 # BIG SOLIDUS
+29F9; 29F8 # BIG REVERSE SOLIDUS
+29FC; 29FD # LEFT-POINTING CURVED ANGLE BRACKET
+29FD; 29FC # RIGHT-POINTING CURVED ANGLE BRACKET
+2A2B; 2A2C # MINUS SIGN WITH FALLING DOTS
+2A2C; 2A2B # MINUS SIGN WITH RISING DOTS
+2A2D; 2A2C # PLUS SIGN IN LEFT HALF CIRCLE
+2A2E; 2A2D # PLUS SIGN IN RIGHT HALF CIRCLE
+2A34; 2A35 # MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+2A35; 2A34 # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+2A3C; 2A3D # INTERIOR PRODUCT
+2A3D; 2A3C # RIGHTHAND INTERIOR PRODUCT
+2A64; 2A65 # Z NOTATION DOMAIN ANTIRESTRICTION
+2A65; 2A64 # Z NOTATION RANGE ANTIRESTRICTION
+2A79; 2A7A # LESS-THAN WITH CIRCLE INSIDE
+2A7A; 2A79 # GREATER-THAN WITH CIRCLE INSIDE
+2A7D; 2A7E # LESS-THAN OR SLANTED EQUAL TO
+2A7E; 2A7D # GREATER-THAN OR SLANTED EQUAL TO
+2A7F; 2A80 # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A80; 2A7F # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+2A81; 2A82 # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A82; 2A81 # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+2A83; 2A84 # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+2A84; 2A83 # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+2A8B; 2A8C # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+2A8C; 2A8B # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+2A91; 2A92 # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+2A92; 2A91 # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+2A93; 2A94 # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+2A94; 2A93 # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+2A95; 2A96 # SLANTED EQUAL TO OR LESS-THAN
+2A96; 2A95 # SLANTED EQUAL TO OR GREATER-THAN
+2A97; 2A98 # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+2A98; 2A97 # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+2A99; 2A9A # DOUBLE-LINE EQUAL TO OR LESS-THAN
+2A9A; 2A99 # DOUBLE-LINE EQUAL TO OR GREATER-THAN
+2A9B; 2A9C # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+2A9C; 2A9B # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+2AA1; 2AA2 # DOUBLE NESTED LESS-THAN
+2AA2; 2AA1 # DOUBLE NESTED GREATER-THAN
+2AA6; 2AA7 # LESS-THAN CLOSED BY CURVE
+2AA7; 2AA6 # GREATER-THAN CLOSED BY CURVE
+2AA8; 2AA9 # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AA9; 2AA8 # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+2AAA; 2AAB # SMALLER THAN
+2AAB; 2AAA # LARGER THAN
+2AAC; 2AAD # SMALLER THAN OR EQUAL TO
+2AAD; 2AAC # LARGER THAN OR EQUAL TO
+2AAF; 2AB0 # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+2AB0; 2AAF # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+2AB3; 2AB4 # PRECEDES ABOVE EQUALS SIGN
+2AB4; 2AB3 # SUCCEEDS ABOVE EQUALS SIGN
+2ABB; 2ABC # DOUBLE PRECEDES
+2ABC; 2ABB # DOUBLE SUCCEEDS
+2ABD; 2ABE # SUBSET WITH DOT
+2ABE; 2ABD # SUPERSET WITH DOT
+2ABF; 2AC0 # SUBSET WITH PLUS SIGN BELOW
+2AC0; 2ABF # SUPERSET WITH PLUS SIGN BELOW
+2AC1; 2AC2 # SUBSET WITH MULTIPLICATION SIGN BELOW
+2AC2; 2AC1 # SUPERSET WITH MULTIPLICATION SIGN BELOW
+2AC3; 2AC4 # SUBSET OF OR EQUAL TO WITH DOT ABOVE
+2AC4; 2AC3 # SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+2AC5; 2AC6 # SUBSET OF ABOVE EQUALS SIGN
+2AC6; 2AC5 # SUPERSET OF ABOVE EQUALS SIGN
+2ACD; 2ACE # SQUARE LEFT OPEN BOX OPERATOR
+2ACE; 2ACD # SQUARE RIGHT OPEN BOX OPERATOR
+2ACF; 2AD0 # CLOSED SUBSET
+2AD0; 2ACF # CLOSED SUPERSET
+2AD1; 2AD2 # CLOSED SUBSET OR EQUAL TO
+2AD2; 2AD1 # CLOSED SUPERSET OR EQUAL TO
+2AD3; 2AD4 # SUBSET ABOVE SUPERSET
+2AD4; 2AD3 # SUPERSET ABOVE SUBSET
+2AD5; 2AD6 # SUBSET ABOVE SUBSET
+2AD6; 2AD5 # SUPERSET ABOVE SUPERSET
+2ADE; 22A6 # SHORT LEFT TACK
+2AE3; 22A9 # DOUBLE VERTICAL BAR LEFT TURNSTILE
+2AE4; 22A8 # VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AE5; 22AB # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
+2AEC; 2AED # DOUBLE STROKE NOT SIGN
+2AED; 2AEC # REVERSED DOUBLE STROKE NOT SIGN
+2AF7; 2AF8 # TRIPLE NESTED LESS-THAN
+2AF8; 2AF7 # TRIPLE NESTED GREATER-THAN
+2AF9; 2AFA # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
+2AFA; 2AF9 # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
+3008; 3009 # LEFT ANGLE BRACKET
+3009; 3008 # RIGHT ANGLE BRACKET
+300A; 300B # LEFT DOUBLE ANGLE BRACKET
+300B; 300A # RIGHT DOUBLE ANGLE BRACKET
+300C; 300D # [BEST FIT] LEFT CORNER BRACKET
+300D; 300C # [BEST FIT] RIGHT CORNER BRACKET
+300E; 300F # [BEST FIT] LEFT WHITE CORNER BRACKET
+300F; 300E # [BEST FIT] RIGHT WHITE CORNER BRACKET
+3010; 3011 # LEFT BLACK LENTICULAR BRACKET
+3011; 3010 # RIGHT BLACK LENTICULAR BRACKET
+3014; 3015 # LEFT TORTOISE SHELL BRACKET
+3015; 3014 # RIGHT TORTOISE SHELL BRACKET
+3016; 3017 # LEFT WHITE LENTICULAR BRACKET
+3017; 3016 # RIGHT WHITE LENTICULAR BRACKET
+3018; 3019 # LEFT WHITE TORTOISE SHELL BRACKET
+3019; 3018 # RIGHT WHITE TORTOISE SHELL BRACKET
+301A; 301B # LEFT WHITE SQUARE BRACKET
+301B; 301A # RIGHT WHITE SQUARE BRACKET
+FF08; FF09 # FULLWIDTH LEFT PARENTHESIS
+FF09; FF08 # FULLWIDTH RIGHT PARENTHESIS
+FF1C; FF1E # FULLWIDTH LESS-THAN SIGN
+FF1E; FF1C # FULLWIDTH GREATER-THAN SIGN
+FF3B; FF3D # FULLWIDTH LEFT SQUARE BRACKET
+FF3D; FF3B # FULLWIDTH RIGHT SQUARE BRACKET
+FF5B; FF5D # FULLWIDTH LEFT CURLY BRACKET
+FF5D; FF5B # FULLWIDTH RIGHT CURLY BRACKET
+FF5F; FF60 # FULLWIDTH LEFT WHITE PARENTHESIS
+FF60; FF5F # FULLWIDTH RIGHT WHITE PARENTHESIS
+FF62; FF63 # [BEST FIT] HALFWIDTH LEFT CORNER BRACKET
+FF63; FF62 # [BEST FIT] HALFWIDTH RIGHT CORNER BRACKET
+
+# The following characters have no appropriate mirroring character
+
+# 2140; DOUBLE-STRUCK N-ARY SUMMATION
+# 2201; COMPLEMENT
+# 2202; PARTIAL DIFFERENTIAL
+# 2203; THERE EXISTS
+# 2204; THERE DOES NOT EXIST
+# 2211; N-ARY SUMMATION
+# 2216; SET MINUS
+# 221A; SQUARE ROOT
+# 221B; CUBE ROOT
+# 221C; FOURTH ROOT
+# 221D; PROPORTIONAL TO
+# 221F; RIGHT ANGLE
+# 2220; ANGLE
+# 2221; MEASURED ANGLE
+# 2222; SPHERICAL ANGLE
+# 2224; DOES NOT DIVIDE
+# 2226; NOT PARALLEL TO
+# 222B; INTEGRAL
+# 222C; DOUBLE INTEGRAL
+# 222D; TRIPLE INTEGRAL
+# 222E; CONTOUR INTEGRAL
+# 222F; SURFACE INTEGRAL
+# 2230; VOLUME INTEGRAL
+# 2231; CLOCKWISE INTEGRAL
+# 2232; CLOCKWISE CONTOUR INTEGRAL
+# 2233; ANTICLOCKWISE CONTOUR INTEGRAL
+# 2239; EXCESS
+# 223B; HOMOTHETIC
+# 223E; INVERTED LAZY S
+# 223F; SINE WAVE
+# 2240; WREATH PRODUCT
+# 2241; NOT TILDE
+# 2242; MINUS TILDE
+# 2244; NOT ASYMPTOTICALLY EQUAL TO
+# 2245; APPROXIMATELY EQUAL TO
+# 2246; APPROXIMATELY BUT NOT ACTUALLY EQUAL TO
+# 2247; NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+# 2248; ALMOST EQUAL TO
+# 2249; NOT ALMOST EQUAL TO
+# 224A; ALMOST EQUAL OR EQUAL TO
+# 224B; TRIPLE TILDE
+# 224C; ALL EQUAL TO
+# 225F; QUESTIONED EQUAL TO
+# 2260; NOT EQUAL TO
+# 2262; NOT IDENTICAL TO
+# 228C; MULTISET
+# 22A7; MODELS
+# 22AA; TRIPLE VERTICAL BAR RIGHT TURNSTILE
+# 22AC; DOES NOT PROVE
+# 22AD; NOT TRUE
+# 22AE; DOES NOT FORCE
+# 22AF; NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+# 22B8; MULTIMAP
+# 22BE; RIGHT ANGLE WITH ARC
+# 22BF; RIGHT TRIANGLE
+# 22F5; ELEMENT OF WITH DOT ABOVE
+# 22F8; ELEMENT OF WITH UNDERBAR
+# 22F9; ELEMENT OF WITH TWO HORIZONTAL STROKES
+# 22FF; Z NOTATION BAG MEMBERSHIP
+# 2320; TOP HALF INTEGRAL
+# 2321; BOTTOM HALF INTEGRAL
+# 27D3; LOWER RIGHT CORNER WITH DOT
+# 27D4; UPPER LEFT CORNER WITH DOT
+# 27DC; LEFT MULTIMAP
+# 299B; MEASURED ANGLE OPENING LEFT
+# 299C; RIGHT ANGLE VARIANT WITH SQUARE
+# 299D; MEASURED RIGHT ANGLE WITH DOT
+# 299E; ANGLE WITH S INSIDE
+# 299F; ACUTE ANGLE
+# 29A0; SPHERICAL ANGLE OPENING LEFT
+# 29A1; SPHERICAL ANGLE OPENING UP
+# 29A2; TURNED ANGLE
+# 29A3; REVERSED ANGLE
+# 29A4; ANGLE WITH UNDERBAR
+# 29A5; REVERSED ANGLE WITH UNDERBAR
+# 29A6; OBLIQUE ANGLE OPENING UP
+# 29A7; OBLIQUE ANGLE OPENING DOWN
+# 29A8; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT
+# 29A9; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT
+# 29AA; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT
+# 29AB; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT
+# 29AC; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP
+# 29AD; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP
+# 29AE; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN
+# 29AF; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN
+# 29C2; CIRCLE WITH SMALL CIRCLE TO THE RIGHT
+# 29C3; CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT
+# 29C9; TWO JOINED SQUARES
+# 29CE; RIGHT TRIANGLE ABOVE LEFT TRIANGLE
+# 29DC; INCOMPLETE INFINITY
+# 29E1; INCREASES AS
+# 29E3; EQUALS SIGN AND SLANTED PARALLEL
+# 29E4; EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE
+# 29E5; IDENTICAL TO AND SLANTED PARALLEL
+# 29E8; DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK
+# 29E9; DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK
+# 29F4; RULE-DELAYED
+# 29F6; SOLIDUS WITH OVERBAR
+# 29F7; REVERSE SOLIDUS WITH HORIZONTAL STROKE
+# 2A0A; MODULO TWO SUM
+# 2A0B; SUMMATION WITH INTEGRAL
+# 2A0C; QUADRUPLE INTEGRAL OPERATOR
+# 2A0D; FINITE PART INTEGRAL
+# 2A0E; INTEGRAL WITH DOUBLE STROKE
+# 2A0F; INTEGRAL AVERAGE WITH SLASH
+# 2A10; CIRCULATION FUNCTION
+# 2A11; ANTICLOCKWISE INTEGRATION
+# 2A12; LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE
+# 2A13; LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE
+# 2A14; LINE INTEGRATION NOT INCLUDING THE POLE
+# 2A15; INTEGRAL AROUND A POINT OPERATOR
+# 2A16; QUATERNION INTEGRAL OPERATOR
+# 2A17; INTEGRAL WITH LEFTWARDS ARROW WITH HOOK
+# 2A18; INTEGRAL WITH TIMES SIGN
+# 2A19; INTEGRAL WITH INTERSECTION
+# 2A1A; INTEGRAL WITH UNION
+# 2A1B; INTEGRAL WITH OVERBAR
+# 2A1C; INTEGRAL WITH UNDERBAR
+# 2A1E; LARGE LEFT TRIANGLE OPERATOR
+# 2A1F; Z NOTATION SCHEMA COMPOSITION
+# 2A20; Z NOTATION SCHEMA PIPING
+# 2A21; Z NOTATION SCHEMA PROJECTION
+# 2A24; PLUS SIGN WITH TILDE ABOVE
+# 2A26; PLUS SIGN WITH TILDE BELOW
+# 2A29; MINUS SIGN WITH COMMA ABOVE
+# 2A3E; Z NOTATION RELATIONAL COMPOSITION
+# 2A57; SLOPING LARGE OR
+# 2A58; SLOPING LARGE AND
+# 2A6A; TILDE OPERATOR WITH DOT ABOVE
+# 2A6B; TILDE OPERATOR WITH RISING DOTS
+# 2A6C; SIMILAR MINUS SIMILAR
+# 2A6D; CONGRUENT WITH DOT ABOVE
+# 2A6F; ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT
+# 2A70; APPROXIMATELY EQUAL OR EQUAL TO
+# 2A73; EQUALS SIGN ABOVE TILDE OPERATOR
+# 2A74; DOUBLE COLON EQUAL
+# 2A7B; LESS-THAN WITH QUESTION MARK ABOVE
+# 2A7C; GREATER-THAN WITH QUESTION MARK ABOVE
+# 2A85; LESS-THAN OR APPROXIMATE
+# 2A86; GREATER-THAN OR APPROXIMATE
+# 2A87; LESS-THAN AND SINGLE-LINE NOT EQUAL TO
+# 2A88; GREATER-THAN AND SINGLE-LINE NOT EQUAL TO
+# 2A89; LESS-THAN AND NOT APPROXIMATE
+# 2A8A; GREATER-THAN AND NOT APPROXIMATE
+# 2A8D; LESS-THAN ABOVE SIMILAR OR EQUAL
+# 2A8E; GREATER-THAN ABOVE SIMILAR OR EQUAL
+# 2A8F; LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN
+# 2A90; GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN
+# 2A9D; SIMILAR OR LESS-THAN
+# 2A9E; SIMILAR OR GREATER-THAN
+# 2A9F; SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN
+# 2AA0; SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN
+# 2AA3; DOUBLE NESTED LESS-THAN WITH UNDERBAR
+# 2AB1; PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO
+# 2AB2; SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO
+# 2AB5; PRECEDES ABOVE NOT EQUAL TO
+# 2AB6; SUCCEEDS ABOVE NOT EQUAL TO
+# 2AB7; PRECEDES ABOVE ALMOST EQUAL TO
+# 2AB8; SUCCEEDS ABOVE ALMOST EQUAL TO
+# 2AB9; PRECEDES ABOVE NOT ALMOST EQUAL TO
+# 2ABA; SUCCEEDS ABOVE NOT ALMOST EQUAL TO
+# 2AC7; SUBSET OF ABOVE TILDE OPERATOR
+# 2AC8; SUPERSET OF ABOVE TILDE OPERATOR
+# 2AC9; SUBSET OF ABOVE ALMOST EQUAL TO
+# 2ACA; SUPERSET OF ABOVE ALMOST EQUAL TO
+# 2ACB; SUBSET OF ABOVE NOT EQUAL TO
+# 2ACC; SUPERSET OF ABOVE NOT EQUAL TO
+# 2ADC; FORKING
+# 2AE2; VERTICAL BAR TRIPLE RIGHT TURNSTILE
+# 2AE6; LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL
+# 2AEE; DOES NOT DIVIDE WITH REVERSED NEGATION SLASH
+# 2AF3; PARALLEL WITH TILDE OPERATOR
+# 2AFB; TRIPLE SOLIDUS BINARY RELATION
+# 2AFD; DOUBLE SOLIDUS OPERATOR
diff --git a/gen.tab/unidata/ReadMe.txt b/gen.tab/unidata/ReadMe.txt
new file mode 100644 (file)
index 0000000..763a23f
--- /dev/null
@@ -0,0 +1,40 @@
+2004 March 30
+
+This directory contains the Unicode Character Database
+data files.
+
+Currently, the Unicode Character Database files are at
+the version level:
+
+   Unicode Standard, Version 4.0.1
+
+For information about the standard itself, see:
+
+http://www.unicode.org/versions/Unicode4.0.1/
+
+Detailed documentation of the files constituting the
+Unicode Character Database (contributory data files for
+the standard itself) can be found in UCD.html.
+
+Unihan.txt is a very large file. A zipped version is
+also provided for downloading convenience: Unihan.zip.
+
+The current Unicode 4.0.1 version of Unihan.txt is also available in
+two compressed formats in the Unicode 4.0.1 update directory. See:
+http://www.unicode.org/Public/4.0-Update1/
+or
+ftp://ftp.unicode.org/Public/4.0-Update1/
+
+Unihan-4.0.1.zip for Windows. (Use winzip)
+Unihan-4.0.1.txt.gz  for Unix.    (Use gzip or gunzip)
+
+Note that the files are zipped in
+exactly the same format they have on the server (with Unix
+line endings). From a browser, right-clicking on 
+Unihan.zip will allow automatic download and unzip on a
+Windows system with winzip installed.
+
+
+
+
+
diff --git a/gen.tab/unidata/extracted/DerivedBidiClass.txt b/gen.tab/unidata/extracted/DerivedBidiClass.txt
new file mode 100644 (file)
index 0000000..c1ffc1d
--- /dev/null
@@ -0,0 +1,1299 @@
+# DerivedBidiClass-4.0.1.txt
+# Date: 2004-03-11, 18:33:24 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2004 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+
+# ================================================
+
+# Bidi Class (listing UnicodeData.txt, field 4: see UCD.html)
+
+#  All code points not explicitly listed for Bidi_Class
+#  have the value Left_To_Right (L).
+
+# ================================================
+
+# Bidi_Class=Left_To_Right
+
+0041..005A    ; L # L&  [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
+0061..007A    ; L # L&  [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+00AA          ; L # L&       FEMININE ORDINAL INDICATOR
+00B5          ; L # L&       MICRO SIGN
+00BA          ; L # L&       MASCULINE ORDINAL INDICATOR
+00C0..00D6    ; L # L&  [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8..00F6    ; L # L&  [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS
+00F8..01BA    ; L # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL
+01BB          ; L # Lo       LATIN LETTER TWO WITH STROKE
+01BC..01BF    ; L # L&   [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN
+01C0..01C3    ; L # Lo   [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK
+01C4..0236    ; L # L& [115] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER T WITH CURL
+0250..02AF    ; L # L&  [96] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0..02B8    ; L # Lm   [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y
+02BB..02C1    ; L # Lm   [7] MODIFIER LETTER TURNED COMMA..MODIFIER LETTER REVERSED GLOTTAL STOP
+02D0..02D1    ; L # Lm   [2] MODIFIER LETTER TRIANGULAR COLON..MODIFIER LETTER HALF TRIANGULAR COLON
+02E0..02E4    ; L # Lm   [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+02EE          ; L # Lm       MODIFIER LETTER DOUBLE APOSTROPHE
+037A          ; L # Lm       GREEK YPOGEGRAMMENI
+0386          ; L # L&       GREEK CAPITAL LETTER ALPHA WITH TONOS
+0388..038A    ; L # L&   [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038C          ; L # L&       GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E..03A1    ; L # L&  [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO
+03A3..03CE    ; L # L&  [44] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER OMEGA WITH TONOS
+03D0..03F5    ; L # L&  [38] GREEK BETA SYMBOL..GREEK LUNATE EPSILON SYMBOL
+03F7..03FB    ; L # L&   [5] GREEK CAPITAL LETTER SHO..GREEK SMALL LETTER SAN
+0400..0481    ; L # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA
+0482          ; L # So       CYRILLIC THOUSANDS SIGN
+048A..04CE    ; L # L&  [69] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EM WITH TAIL
+04D0..04F5    ; L # L&  [38] CYRILLIC CAPITAL LETTER A WITH BREVE..CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04F8..04F9    ; L # L&   [2] CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS..CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+0500..050F    ; L # L&  [16] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER KOMI TJE
+0531..0556    ; L # L&  [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
+0559          ; L # Lm       ARMENIAN MODIFIER LETTER LEFT HALF RING
+055A..055F    ; L # Po   [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK
+0561..0587    ; L # L&  [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
+0589          ; L # Po       ARMENIAN FULL STOP
+0903          ; L # Mc       DEVANAGARI SIGN VISARGA
+0904..0939    ; L # Lo  [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA
+093D          ; L # Lo       DEVANAGARI SIGN AVAGRAHA
+093E..0940    ; L # Mc   [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
+0949..094C    ; L # Mc   [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
+0950          ; L # Lo       DEVANAGARI OM
+0958..0961    ; L # Lo  [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL
+0964..0965    ; L # Po   [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
+0966..096F    ; L # Nd  [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE
+0970          ; L # Po       DEVANAGARI ABBREVIATION SIGN
+0982..0983    ; L # Mc   [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
+0985..098C    ; L # Lo   [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L
+098F..0990    ; L # Lo   [2] BENGALI LETTER E..BENGALI LETTER AI
+0993..09A8    ; L # Lo  [22] BENGALI LETTER O..BENGALI LETTER NA
+09AA..09B0    ; L # Lo   [7] BENGALI LETTER PA..BENGALI LETTER RA
+09B2          ; L # Lo       BENGALI LETTER LA
+09B6..09B9    ; L # Lo   [4] BENGALI LETTER SHA..BENGALI LETTER HA
+09BD          ; L # Lo       BENGALI SIGN AVAGRAHA
+09BE..09C0    ; L # Mc   [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II
+09C7..09C8    ; L # Mc   [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
+09CB..09CC    ; L # Mc   [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
+09D7          ; L # Mc       BENGALI AU LENGTH MARK
+09DC..09DD    ; L # Lo   [2] BENGALI LETTER RRA..BENGALI LETTER RHA
+09DF..09E1    ; L # Lo   [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL
+09E6..09EF    ; L # Nd  [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE
+09F0..09F1    ; L # Lo   [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL
+09F4..09F9    ; L # No   [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA          ; L # So       BENGALI ISSHAR
+0A03          ; L # Mc       GURMUKHI SIGN VISARGA
+0A05..0A0A    ; L # Lo   [6] GURMUKHI LETTER A..GURMUKHI LETTER UU
+0A0F..0A10    ; L # Lo   [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI
+0A13..0A28    ; L # Lo  [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA
+0A2A..0A30    ; L # Lo   [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA
+0A32..0A33    ; L # Lo   [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA
+0A35..0A36    ; L # Lo   [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA
+0A38..0A39    ; L # Lo   [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA
+0A3E..0A40    ; L # Mc   [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
+0A59..0A5C    ; L # Lo   [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA
+0A5E          ; L # Lo       GURMUKHI LETTER FA
+0A66..0A6F    ; L # Nd  [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE
+0A72..0A74    ; L # Lo   [3] GURMUKHI IRI..GURMUKHI EK ONKAR
+0A83          ; L # Mc       GUJARATI SIGN VISARGA
+0A85..0A8D    ; L # Lo   [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E
+0A8F..0A91    ; L # Lo   [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O
+0A93..0AA8    ; L # Lo  [22] GUJARATI LETTER O..GUJARATI LETTER NA
+0AAA..0AB0    ; L # Lo   [7] GUJARATI LETTER PA..GUJARATI LETTER RA
+0AB2..0AB3    ; L # Lo   [2] GUJARATI LETTER LA..GUJARATI LETTER LLA
+0AB5..0AB9    ; L # Lo   [5] GUJARATI LETTER VA..GUJARATI LETTER HA
+0ABD          ; L # Lo       GUJARATI SIGN AVAGRAHA
+0ABE..0AC0    ; L # Mc   [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
+0AC9          ; L # Mc       GUJARATI VOWEL SIGN CANDRA O
+0ACB..0ACC    ; L # Mc   [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
+0AD0          ; L # Lo       GUJARATI OM
+0AE0..0AE1    ; L # Lo   [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL
+0AE6..0AEF    ; L # Nd  [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE
+0B02..0B03    ; L # Mc   [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
+0B05..0B0C    ; L # Lo   [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L
+0B0F..0B10    ; L # Lo   [2] ORIYA LETTER E..ORIYA LETTER AI
+0B13..0B28    ; L # Lo  [22] ORIYA LETTER O..ORIYA LETTER NA
+0B2A..0B30    ; L # Lo   [7] ORIYA LETTER PA..ORIYA LETTER RA
+0B32..0B33    ; L # Lo   [2] ORIYA LETTER LA..ORIYA LETTER LLA
+0B35..0B39    ; L # Lo   [5] ORIYA LETTER VA..ORIYA LETTER HA
+0B3D          ; L # Lo       ORIYA SIGN AVAGRAHA
+0B3E          ; L # Mc       ORIYA VOWEL SIGN AA
+0B40          ; L # Mc       ORIYA VOWEL SIGN II
+0B47..0B48    ; L # Mc   [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
+0B4B..0B4C    ; L # Mc   [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
+0B57          ; L # Mc       ORIYA AU LENGTH MARK
+0B5C..0B5D    ; L # Lo   [2] ORIYA LETTER RRA..ORIYA LETTER RHA
+0B5F..0B61    ; L # Lo   [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL
+0B66..0B6F    ; L # Nd  [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE
+0B70          ; L # So       ORIYA ISSHAR
+0B71          ; L # Lo       ORIYA LETTER WA
+0B83          ; L # Lo       TAMIL SIGN VISARGA
+0B85..0B8A    ; L # Lo   [6] TAMIL LETTER A..TAMIL LETTER UU
+0B8E..0B90    ; L # Lo   [3] TAMIL LETTER E..TAMIL LETTER AI
+0B92..0B95    ; L # Lo   [4] TAMIL LETTER O..TAMIL LETTER KA
+0B99..0B9A    ; L # Lo   [2] TAMIL LETTER NGA..TAMIL LETTER CA
+0B9C          ; L # Lo       TAMIL LETTER JA
+0B9E..0B9F    ; L # Lo   [2] TAMIL LETTER NYA..TAMIL LETTER TTA
+0BA3..0BA4    ; L # Lo   [2] TAMIL LETTER NNA..TAMIL LETTER TA
+0BA8..0BAA    ; L # Lo   [3] TAMIL LETTER NA..TAMIL LETTER PA
+0BAE..0BB5    ; L # Lo   [8] TAMIL LETTER MA..TAMIL LETTER VA
+0BB7..0BB9    ; L # Lo   [3] TAMIL LETTER SSA..TAMIL LETTER HA
+0BBE..0BBF    ; L # Mc   [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I
+0BC1..0BC2    ; L # Mc   [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
+0BC6..0BC8    ; L # Mc   [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
+0BCA..0BCC    ; L # Mc   [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
+0BD7          ; L # Mc       TAMIL AU LENGTH MARK
+0BE7..0BEF    ; L # Nd   [9] TAMIL DIGIT ONE..TAMIL DIGIT NINE
+0BF0..0BF2    ; L # No   [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND
+0C01..0C03    ; L # Mc   [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C05..0C0C    ; L # Lo   [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
+0C0E..0C10    ; L # Lo   [3] TELUGU LETTER E..TELUGU LETTER AI
+0C12..0C28    ; L # Lo  [23] TELUGU LETTER O..TELUGU LETTER NA
+0C2A..0C33    ; L # Lo  [10] TELUGU LETTER PA..TELUGU LETTER LLA
+0C35..0C39    ; L # Lo   [5] TELUGU LETTER VA..TELUGU LETTER HA
+0C41..0C44    ; L # Mc   [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
+0C60..0C61    ; L # Lo   [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL
+0C66..0C6F    ; L # Nd  [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE
+0C82..0C83    ; L # Mc   [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
+0C85..0C8C    ; L # Lo   [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
+0C8E..0C90    ; L # Lo   [3] KANNADA LETTER E..KANNADA LETTER AI
+0C92..0CA8    ; L # Lo  [23] KANNADA LETTER O..KANNADA LETTER NA
+0CAA..0CB3    ; L # Lo  [10] KANNADA LETTER PA..KANNADA LETTER LLA
+0CB5..0CB9    ; L # Lo   [5] KANNADA LETTER VA..KANNADA LETTER HA
+0CBD          ; L # Lo       KANNADA SIGN AVAGRAHA
+0CBE          ; L # Mc       KANNADA VOWEL SIGN AA
+0CBF          ; L # Mn       KANNADA VOWEL SIGN I
+0CC0..0CC4    ; L # Mc   [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR
+0CC6          ; L # Mn       KANNADA VOWEL SIGN E
+0CC7..0CC8    ; L # Mc   [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
+0CCA..0CCB    ; L # Mc   [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
+0CD5..0CD6    ; L # Mc   [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0CDE          ; L # Lo       KANNADA LETTER FA
+0CE0..0CE1    ; L # Lo   [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
+0CE6..0CEF    ; L # Nd  [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
+0D02..0D03    ; L # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
+0D05..0D0C    ; L # Lo   [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L
+0D0E..0D10    ; L # Lo   [3] MALAYALAM LETTER E..MALAYALAM LETTER AI
+0D12..0D28    ; L # Lo  [23] MALAYALAM LETTER O..MALAYALAM LETTER NA
+0D2A..0D39    ; L # Lo  [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA
+0D3E..0D40    ; L # Mc   [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
+0D46..0D48    ; L # Mc   [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
+0D4A..0D4C    ; L # Mc   [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
+0D57          ; L # Mc       MALAYALAM AU LENGTH MARK
+0D60..0D61    ; L # Lo   [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL
+0D66..0D6F    ; L # Nd  [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE
+0D82..0D83    ; L # Mc   [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
+0D85..0D96    ; L # Lo  [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA
+0D9A..0DB1    ; L # Lo  [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA
+0DB3..0DBB    ; L # Lo   [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA
+0DBD          ; L # Lo       SINHALA LETTER DANTAJA LAYANNA
+0DC0..0DC6    ; L # Lo   [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA
+0DCF..0DD1    ; L # Mc   [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD8..0DDF    ; L # Mc   [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA
+0DF2..0DF3    ; L # Mc   [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0DF4          ; L # Po       SINHALA PUNCTUATION KUNDDALIYA
+0E01..0E30    ; L # Lo  [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A
+0E32..0E33    ; L # Lo   [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM
+0E40..0E45    ; L # Lo   [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO
+0E46          ; L # Lm       THAI CHARACTER MAIYAMOK
+0E4F          ; L # Po       THAI CHARACTER FONGMAN
+0E50..0E59    ; L # Nd  [10] THAI DIGIT ZERO..THAI DIGIT NINE
+0E5A..0E5B    ; L # Po   [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT
+0E81..0E82    ; L # Lo   [2] LAO LETTER KO..LAO LETTER KHO SUNG
+0E84          ; L # Lo       LAO LETTER KHO TAM
+0E87..0E88    ; L # Lo   [2] LAO LETTER NGO..LAO LETTER CO
+0E8A          ; L # Lo       LAO LETTER SO TAM
+0E8D          ; L # Lo       LAO LETTER NYO
+0E94..0E97    ; L # Lo   [4] LAO LETTER DO..LAO LETTER THO TAM
+0E99..0E9F    ; L # Lo   [7] LAO LETTER NO..LAO LETTER FO SUNG
+0EA1..0EA3    ; L # Lo   [3] LAO LETTER MO..LAO LETTER LO LING
+0EA5          ; L # Lo       LAO LETTER LO LOOT
+0EA7          ; L # Lo       LAO LETTER WO
+0EAA..0EAB    ; L # Lo   [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG
+0EAD..0EB0    ; L # Lo   [4] LAO LETTER O..LAO VOWEL SIGN A
+0EB2..0EB3    ; L # Lo   [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM
+0EBD          ; L # Lo       LAO SEMIVOWEL SIGN NYO
+0EC0..0EC4    ; L # Lo   [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
+0EC6          ; L # Lm       LAO KO LA
+0ED0..0ED9    ; L # Nd  [10] LAO DIGIT ZERO..LAO DIGIT NINE
+0EDC..0EDD    ; L # Lo   [2] LAO HO NO..LAO HO MO
+0F00          ; L # Lo       TIBETAN SYLLABLE OM
+0F01..0F03    ; L # So   [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04..0F12    ; L # Po  [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD
+0F13..0F17    ; L # So   [5] TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F1A..0F1F    ; L # So   [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG
+0F20..0F29    ; L # Nd  [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE
+0F2A..0F33    ; L # No  [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO
+0F34          ; L # So       TIBETAN MARK BSDUS RTAGS
+0F36          ; L # So       TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F38          ; L # So       TIBETAN MARK CHE MGO
+0F3E..0F3F    ; L # Mc   [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES
+0F40..0F47    ; L # Lo   [8] TIBETAN LETTER KA..TIBETAN LETTER JA
+0F49..0F6A    ; L # Lo  [34] TIBETAN LETTER NYA..TIBETAN LETTER FIXED-FORM RA
+0F7F          ; L # Mc       TIBETAN SIGN RNAM BCAD
+0F85          ; L # Po       TIBETAN MARK PALUTA
+0F88..0F8B    ; L # Lo   [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS
+0FBE..0FC5    ; L # So   [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE
+0FC7..0FCC    ; L # So   [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCF          ; L # So       TIBETAN SIGN RDEL NAG GSUM
+1000..1021    ; L # Lo  [34] MYANMAR LETTER KA..MYANMAR LETTER A
+1023..1027    ; L # Lo   [5] MYANMAR LETTER I..MYANMAR LETTER E
+1029..102A    ; L # Lo   [2] MYANMAR LETTER O..MYANMAR LETTER AU
+102C          ; L # Mc       MYANMAR VOWEL SIGN AA
+1031          ; L # Mc       MYANMAR VOWEL SIGN E
+1038          ; L # Mc       MYANMAR SIGN VISARGA
+1040..1049    ; L # Nd  [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE
+104A..104F    ; L # Po   [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE
+1050..1055    ; L # Lo   [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL
+1056..1057    ; L # Mc   [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
+10A0..10C5    ; L # L&  [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
+10D0..10F8    ; L # Lo  [41] GEORGIAN LETTER AN..GEORGIAN LETTER ELIFI
+10FB          ; L # Po       GEORGIAN PARAGRAPH SEPARATOR
+1100..1159    ; L # Lo  [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH
+115F..11A2    ; L # Lo  [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA
+11A8..11F9    ; L # Lo  [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH
+1200..1206    ; L # Lo   [7] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE HO
+1208..1246    ; L # Lo  [63] ETHIOPIC SYLLABLE LA..ETHIOPIC SYLLABLE QO
+1248          ; L # Lo       ETHIOPIC SYLLABLE QWA
+124A..124D    ; L # Lo   [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE
+1250..1256    ; L # Lo   [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO
+1258          ; L # Lo       ETHIOPIC SYLLABLE QHWA
+125A..125D    ; L # Lo   [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE
+1260..1286    ; L # Lo  [39] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XO
+1288          ; L # Lo       ETHIOPIC SYLLABLE XWA
+128A..128D    ; L # Lo   [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE
+1290..12AE    ; L # Lo  [31] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KO
+12B0          ; L # Lo       ETHIOPIC SYLLABLE KWA
+12B2..12B5    ; L # Lo   [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE
+12B8..12BE    ; L # Lo   [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO
+12C0          ; L # Lo       ETHIOPIC SYLLABLE KXWA
+12C2..12C5    ; L # Lo   [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE
+12C8..12CE    ; L # Lo   [7] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE WO
+12D0..12D6    ; L # Lo   [7] ETHIOPIC SYLLABLE PHARYNGEAL A..ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8..12EE    ; L # Lo  [23] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE YO
+12F0..130E    ; L # Lo  [31] ETHIOPIC SYLLABLE DA..ETHIOPIC SYLLABLE GO
+1310          ; L # Lo       ETHIOPIC SYLLABLE GWA
+1312..1315    ; L # Lo   [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE
+1318..131E    ; L # Lo   [7] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE GGO
+1320..1346    ; L # Lo  [39] ETHIOPIC SYLLABLE THA..ETHIOPIC SYLLABLE TZO
+1348..135A    ; L # Lo  [19] ETHIOPIC SYLLABLE FA..ETHIOPIC SYLLABLE FYA
+1361..1368    ; L # Po   [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR
+1369..1371    ; L # Nd   [9] ETHIOPIC DIGIT ONE..ETHIOPIC DIGIT NINE
+1372..137C    ; L # No  [11] ETHIOPIC NUMBER TEN..ETHIOPIC NUMBER TEN THOUSAND
+13A0..13F4    ; L # Lo  [85] CHEROKEE LETTER A..CHEROKEE LETTER YV
+1401..166C    ; L # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA
+166D..166E    ; L # Po   [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP
+166F..1676    ; L # Lo   [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA
+1681..169A    ; L # Lo  [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH
+16A0..16EA    ; L # Lo  [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X
+16EB..16ED    ; L # Po   [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION
+16EE..16F0    ; L # Nl   [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL
+1700..170C    ; L # Lo  [13] TAGALOG LETTER A..TAGALOG LETTER YA
+170E..1711    ; L # Lo   [4] TAGALOG LETTER LA..TAGALOG LETTER HA
+1720..1731    ; L # Lo  [18] HANUNOO LETTER A..HANUNOO LETTER HA
+1735..1736    ; L # Po   [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION
+1740..1751    ; L # Lo  [18] BUHID LETTER A..BUHID LETTER HA
+1760..176C    ; L # Lo  [13] TAGBANWA LETTER A..TAGBANWA LETTER YA
+176E..1770    ; L # Lo   [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA
+1780..17B3    ; L # Lo  [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU
+17B4..17B5    ; L # Cf   [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
+17B6          ; L # Mc       KHMER VOWEL SIGN AA
+17BE..17C5    ; L # Mc   [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
+17C7..17C8    ; L # Mc   [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
+17D4..17D6    ; L # Po   [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH
+17D7          ; L # Lm       KHMER SIGN LEK TOO
+17D8..17DA    ; L # Po   [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT
+17DC          ; L # Lo       KHMER SIGN AVAKRAHASANYA
+17E0..17E9    ; L # Nd  [10] KHMER DIGIT ZERO..KHMER DIGIT NINE
+1810..1819    ; L # Nd  [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE
+1820..1842    ; L # Lo  [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
+1843          ; L # Lm       MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844..1877    ; L # Lo  [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA
+1880..18A8    ; L # Lo  [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA
+1900..191C    ; L # Lo  [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA
+1923..1926    ; L # Mc   [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
+1930..1931    ; L # Mc   [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
+1933..1938    ; L # Mc   [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
+1946..194F    ; L # Nd  [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE
+1950..196D    ; L # Lo  [30] TAI LE LETTER KA..TAI LE LETTER AI
+1970..1974    ; L # Lo   [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6
+1D00..1D2B    ; L # L&  [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL
+1D2C..1D61    ; L # Lm  [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI
+1D62..1D6B    ; L # L&  [10] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER UE
+1E00..1E9B    ; L # L& [156] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1EA0..1EF9    ; L # L&  [90] LATIN CAPITAL LETTER A WITH DOT BELOW..LATIN SMALL LETTER Y WITH TILDE
+1F00..1F15    ; L # L&  [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18..1F1D    ; L # L&   [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20..1F45    ; L # L&  [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48..1F4D    ; L # L&   [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50..1F57    ; L # L&   [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59          ; L # L&       GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B          ; L # L&       GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D          ; L # L&       GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F..1F7D    ; L # L&  [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA
+1F80..1FB4    ; L # L&  [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6..1FBC    ; L # L&   [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBE          ; L # L&       GREEK PROSGEGRAMMENI
+1FC2..1FC4    ; L # L&   [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6..1FCC    ; L # L&   [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FD0..1FD3    ; L # L&   [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6..1FDB    ; L # L&   [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FE0..1FEC    ; L # L&  [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
+1FF2..1FF4    ; L # L&   [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6..1FFC    ; L # L&   [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+200E          ; L # Cf       LEFT-TO-RIGHT MARK
+2071          ; L # L&       SUPERSCRIPT LATIN SMALL LETTER I
+207F          ; L # L&       SUPERSCRIPT LATIN SMALL LETTER N
+2102          ; L # L&       DOUBLE-STRUCK CAPITAL C
+2107          ; L # L&       EULER CONSTANT
+210A..2113    ; L # L&  [10] SCRIPT SMALL G..SCRIPT SMALL L
+2115          ; L # L&       DOUBLE-STRUCK CAPITAL N
+2119..211D    ; L # L&   [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+2124          ; L # L&       DOUBLE-STRUCK CAPITAL Z
+2126          ; L # L&       OHM SIGN
+2128          ; L # L&       BLACK-LETTER CAPITAL Z
+212A..212D    ; L # L&   [4] KELVIN SIGN..BLACK-LETTER CAPITAL C
+212F..2131    ; L # L&   [3] SCRIPT SMALL E..SCRIPT CAPITAL F
+2133..2134    ; L # L&   [2] SCRIPT CAPITAL M..SCRIPT SMALL O
+2135..2138    ; L # Lo   [4] ALEF SYMBOL..DALET SYMBOL
+2139          ; L # L&       INFORMATION SOURCE
+213D..213F    ; L # L&   [3] DOUBLE-STRUCK SMALL GAMMA..DOUBLE-STRUCK CAPITAL PI
+2145..2149    ; L # L&   [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
+2160..2183    ; L # Nl  [36] ROMAN NUMERAL ONE..ROMAN NUMERAL REVERSED ONE HUNDRED
+2336..237A    ; L # So  [69] APL FUNCTIONAL SYMBOL I-BEAM..APL FUNCTIONAL SYMBOL ALPHA
+2395          ; L # So       APL FUNCTIONAL SYMBOL QUAD
+249C..24E9    ; L # So  [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z
+2800..28FF    ; L # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678
+3005          ; L # Lm       IDEOGRAPHIC ITERATION MARK
+3006          ; L # Lo       IDEOGRAPHIC CLOSING MARK
+3007          ; L # Nl       IDEOGRAPHIC NUMBER ZERO
+3021..3029    ; L # Nl   [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
+3031..3035    ; L # Lm   [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF
+3038..303A    ; L # Nl   [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
+303B          ; L # Lm       VERTICAL IDEOGRAPHIC ITERATION MARK
+303C          ; L # Lo       MASU MARK
+3041..3096    ; L # Lo  [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE
+309D..309E    ; L # Lm   [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
+309F          ; L # Lo       HIRAGANA DIGRAPH YORI
+30A1..30FA    ; L # Lo  [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO
+30FC..30FE    ; L # Lm   [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK
+30FF          ; L # Lo       KATAKANA DIGRAPH KOTO
+3105..312C    ; L # Lo  [40] BOPOMOFO LETTER B..BOPOMOFO LETTER GN
+3131..318E    ; L # Lo  [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE
+3190..3191    ; L # So   [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK
+3192..3195    ; L # No   [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK
+3196..319F    ; L # So  [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK
+31A0..31B7    ; L # Lo  [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H
+31F0..31FF    ; L # Lo  [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO
+3200..321C    ; L # So  [29] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED HANGUL CIEUC U
+3220..3229    ; L # No  [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN
+322A..3243    ; L # So  [26] PARENTHESIZED IDEOGRAPH MOON..PARENTHESIZED IDEOGRAPH REACH
+3260..327B    ; L # So  [28] CIRCLED HANGUL KIYEOK..CIRCLED HANGUL HIEUH A
+327F          ; L # So       KOREAN STANDARD SYMBOL
+3280..3289    ; L # No  [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN
+328A..32B0    ; L # So  [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT
+32C0..32CB    ; L # So  [12] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
+32D0..32FE    ; L # So  [47] CIRCLED KATAKANA A..CIRCLED KATAKANA WO
+3300..3376    ; L # So [119] SQUARE APAATO..SQUARE PC
+337B..33DD    ; L # So  [99] SQUARE ERA NAME HEISEI..SQUARE WB
+33E0..33FE    ; L # So  [31] IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE..IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
+3400..4DB5    ; L # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+4E00..9FA5    ; L # Lo [20902] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FA5
+A000..A48C    ; L # Lo [1165] YI SYLLABLE IT..YI SYLLABLE YYR
+AC00..D7A3    ; L # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
+E000..F8FF    ; L # Co [6400] <private-use-E000>..<private-use-F8FF>
+F900..FA2D    ; L # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30..FA6A    ; L # Lo  [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A
+FB00..FB06    ; L # L&   [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FB13..FB17    ; L # L&   [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+FF21..FF3A    ; L # L&  [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
+FF41..FF5A    ; L # L&  [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
+FF66..FF6F    ; L # Lo  [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU
+FF70          ; L # Lm       HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF71..FF9D    ; L # Lo  [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N
+FF9E..FF9F    ; L # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFA0..FFBE    ; L # Lo  [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH
+FFC2..FFC7    ; L # Lo   [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E
+FFCA..FFCF    ; L # Lo   [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE
+FFD2..FFD7    ; L # Lo   [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU
+FFDA..FFDC    ; L # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
+10000..1000B  ; L # Lo  [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE
+1000D..10026  ; L # Lo  [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO
+10028..1003A  ; L # Lo  [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO
+1003C..1003D  ; L # Lo   [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE
+1003F..1004D  ; L # Lo  [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO
+10050..1005D  ; L # Lo  [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089
+10080..100FA  ; L # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305
+10100         ; L # Po       AEGEAN WORD SEPARATOR LINE
+10102         ; L # So       AEGEAN CHECK MARK
+10107..10133  ; L # No  [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND
+10137..1013F  ; L # So   [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT
+10300..1031E  ; L # Lo  [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU
+10320..10323  ; L # No   [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY
+10330..10349  ; L # Lo  [26] GOTHIC LETTER AHSA..GOTHIC LETTER OTHAL
+1034A         ; L # Nl       GOTHIC LETTER NINE HUNDRED
+10380..1039D  ; L # Lo  [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU
+1039F         ; L # Po       UGARITIC WORD DIVIDER
+10400..1044F  ; L # L&  [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW
+10450..1049D  ; L # Lo  [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO
+104A0..104A9  ; L # Nd  [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE
+1D000..1D0F5  ; L # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+1D100..1D126  ; L # So  [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2
+1D12A..1D164  ; L # So  [59] MUSICAL SYMBOL DOUBLE SHARP..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+1D165..1D166  ; L # Mc   [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D16A..1D16C  ; L # So   [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3
+1D16D..1D172  ; L # Mc   [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5
+1D183..1D184  ; L # So   [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN
+1D18C..1D1A9  ; L # So  [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH
+1D1AE..1D1DD  ; L # So  [48] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL PES SUBPUNCTIS
+1D400..1D454  ; L # L&  [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D49C  ; L # L&  [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F  ; L # L&   [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2         ; L # L&       MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6  ; L # L&   [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC  ; L # L&   [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B9  ; L # L&  [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BB         ; L # L&       MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3  ; L # L&   [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D505  ; L # L&  [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A  ; L # L&   [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514  ; L # L&   [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C  ; L # L&   [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E..1D539  ; L # L&  [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E  ; L # L&   [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544  ; L # L&   [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546         ; L # L&       MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550  ; L # L&   [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552..1D6A3  ; L # L& [338] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL MONOSPACE SMALL Z
+1D6A8..1D6C0  ; L # L&  [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C1         ; L # Sm       MATHEMATICAL BOLD NABLA
+1D6C2..1D6DA  ; L # L&  [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DB         ; L # Sm       MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+1D6DC..1D6FA  ; L # L&  [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FB         ; L # Sm       MATHEMATICAL ITALIC NABLA
+1D6FC..1D714  ; L # L&  [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D715         ; L # Sm       MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+1D716..1D734  ; L # L&  [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D735         ; L # Sm       MATHEMATICAL BOLD ITALIC NABLA
+1D736..1D74E  ; L # L&  [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D74F         ; L # Sm       MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+1D750..1D76E  ; L # L&  [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D76F         ; L # Sm       MATHEMATICAL SANS-SERIF BOLD NABLA
+1D770..1D788  ; L # L&  [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D789         ; L # Sm       MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+1D78A..1D7A8  ; L # L&  [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7A9         ; L # Sm       MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
+1D7AA..1D7C2  ; L # L&  [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C3         ; L # Sm       MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+1D7C4..1D7C9  ; L # L&   [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL
+20000..2A6D6  ; L # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+2F800..2FA1D  ; L # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+F0000..FFFFD  ; L # Co [65534] <private-use-F0000>..<private-use-FFFFD>
+100000..10FFFD; L # Co [65534] <private-use-100000>..<private-use-10FFFD>
+
+# The above property value applies to 873851 code points not listed here.
+# Total code points: 1102638
+
+# ================================================
+
+# Bidi_Class=Right_To_Left
+
+0590          ; R # Cn       <reserved-0590>
+05A2          ; R # Cn       <reserved-05A2>
+05BA          ; R # Cn       <reserved-05BA>
+05BE          ; R # Po       HEBREW PUNCTUATION MAQAF
+05C0          ; R # Po       HEBREW PUNCTUATION PASEQ
+05C3          ; R # Po       HEBREW PUNCTUATION SOF PASUQ
+05C5..05CF    ; R # Cn  [11] <reserved-05C5>..<reserved-05CF>
+05D0..05EA    ; R # Lo  [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
+05EB..05EF    ; R # Cn   [5] <reserved-05EB>..<reserved-05EF>
+05F0..05F2    ; R # Lo   [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
+05F3..05F4    ; R # Po   [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM
+05F5..05FF    ; R # Cn  [11] <reserved-05F5>..<reserved-05FF>
+07C0..08FF    ; R # Cn [320] <reserved-07C0>..<reserved-08FF>
+200F          ; R # Cf       RIGHT-TO-LEFT MARK
+FB1D          ; R # Lo       HEBREW LETTER YOD WITH HIRIQ
+FB1F..FB28    ; R # Lo  [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV
+FB2A..FB36    ; R # Lo  [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH
+FB37          ; R # Cn       <reserved-FB37>
+FB38..FB3C    ; R # Lo   [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH
+FB3D          ; R # Cn       <reserved-FB3D>
+FB3E          ; R # Lo       HEBREW LETTER MEM WITH DAGESH
+FB3F          ; R # Cn       <reserved-FB3F>
+FB40..FB41    ; R # Lo   [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH
+FB42          ; R # Cn       <reserved-FB42>
+FB43..FB44    ; R # Lo   [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
+FB45          ; R # Cn       <reserved-FB45>
+FB46..FB4F    ; R # Lo  [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED
+10800..10805  ; R # Lo   [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA
+10806..10807  ; R # Cn   [2] <reserved-10806>..<reserved-10807>
+10808         ; R # Lo       CYPRIOT SYLLABLE JO
+10809         ; R # Cn       <reserved-10809>
+1080A..10835  ; R # Lo  [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO
+10836         ; R # Cn       <reserved-10836>
+10837..10838  ; R # Lo   [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE
+10839..1083B  ; R # Cn   [3] <reserved-10839>..<reserved-1083B>
+1083C         ; R # Lo       CYPRIOT SYLLABLE ZA
+1083D..1083E  ; R # Cn   [2] <reserved-1083D>..<reserved-1083E>
+1083F         ; R # Lo       CYPRIOT SYLLABLE ZO
+10840..10FFF  ; R # Cn [1984] <reserved-10840>..<reserved-10FFF>
+
+# Total code points: 2483
+
+# ================================================
+
+# Bidi_Class=European_Number
+
+0030..0039    ; EN # Nd  [10] DIGIT ZERO..DIGIT NINE
+00B2..00B3    ; EN # No   [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE
+00B9          ; EN # No       SUPERSCRIPT ONE
+06F0..06F9    ; EN # Nd  [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE
+2070          ; EN # No       SUPERSCRIPT ZERO
+2074..2079    ; EN # No   [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE
+2080..2089    ; EN # No  [10] SUBSCRIPT ZERO..SUBSCRIPT NINE
+2488..249B    ; EN # No  [20] DIGIT ONE FULL STOP..NUMBER TWENTY FULL STOP
+FF10..FF19    ; EN # Nd  [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE
+1D7CE..1D7FF  ; EN # Nd  [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
+
+# Total code points: 120
+
+# ================================================
+
+# Bidi_Class=European_Separator
+
+002B          ; ES # Sm       PLUS SIGN
+002D          ; ES # Pd       HYPHEN-MINUS
+FF0F          ; ES # Po       FULLWIDTH SOLIDUS
+
+# Total code points: 3
+
+# ================================================
+
+# Bidi_Class=European_Terminator
+
+0023          ; ET # Po       NUMBER SIGN
+0024          ; ET # Sc       DOLLAR SIGN
+0025          ; ET # Po       PERCENT SIGN
+00A2..00A5    ; ET # Sc   [4] CENT SIGN..YEN SIGN
+00B0          ; ET # So       DEGREE SIGN
+00B1          ; ET # Sm       PLUS-MINUS SIGN
+066A          ; ET # Po       ARABIC PERCENT SIGN
+09F2..09F3    ; ET # Sc   [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN
+0AF1          ; ET # Sc       GUJARATI RUPEE SIGN
+0BF9          ; ET # Sc       TAMIL RUPEE SIGN
+0E3F          ; ET # Sc       THAI CURRENCY SYMBOL BAHT
+17DB          ; ET # Sc       KHMER CURRENCY SYMBOL RIEL
+2030..2034    ; ET # Po   [5] PER MILLE SIGN..TRIPLE PRIME
+207A..207B    ; ET # Sm   [2] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT MINUS
+208A..208B    ; ET # Sm   [2] SUBSCRIPT PLUS SIGN..SUBSCRIPT MINUS
+20A0..20B1    ; ET # Sc  [18] EURO-CURRENCY SIGN..PESO SIGN
+212E          ; ET # So       ESTIMATED SYMBOL
+2212..2213    ; ET # Sm   [2] MINUS SIGN..MINUS-OR-PLUS SIGN
+FB29          ; ET # Sm       HEBREW LETTER ALTERNATIVE PLUS SIGN
+FE5F          ; ET # Po       SMALL NUMBER SIGN
+FE62          ; ET # Sm       SMALL PLUS SIGN
+FE63          ; ET # Pd       SMALL HYPHEN-MINUS
+FE69          ; ET # Sc       SMALL DOLLAR SIGN
+FE6A          ; ET # Po       SMALL PERCENT SIGN
+FF03          ; ET # Po       FULLWIDTH NUMBER SIGN
+FF04          ; ET # Sc       FULLWIDTH DOLLAR SIGN
+FF05          ; ET # Po       FULLWIDTH PERCENT SIGN
+FF0B          ; ET # Sm       FULLWIDTH PLUS SIGN
+FF0D          ; ET # Pd       FULLWIDTH HYPHEN-MINUS
+FFE0..FFE1    ; ET # Sc   [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN
+FFE5..FFE6    ; ET # Sc   [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN
+
+# Total code points: 61
+
+# ================================================
+
+# Bidi_Class=Arabic_Number
+
+0660..0669    ; AN # Nd  [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE
+066B..066C    ; AN # Po   [2] ARABIC DECIMAL SEPARATOR..ARABIC THOUSANDS SEPARATOR
+
+# Total code points: 12
+
+# ================================================
+
+# Bidi_Class=Common_Separator
+
+002C          ; CS # Po       COMMA
+002E..002F    ; CS # Po   [2] FULL STOP..SOLIDUS
+003A          ; CS # Po       COLON
+00A0          ; CS # Zs       NO-BREAK SPACE
+060C          ; CS # Po       ARABIC COMMA
+2044          ; CS # Sm       FRACTION SLASH
+FE50          ; CS # Po       SMALL COMMA
+FE52          ; CS # Po       SMALL FULL STOP
+FE55          ; CS # Po       SMALL COLON
+FF0C          ; CS # Po       FULLWIDTH COMMA
+FF0E          ; CS # Po       FULLWIDTH FULL STOP
+FF1A          ; CS # Po       FULLWIDTH COLON
+
+# Total code points: 13
+
+# ================================================
+
+# Bidi_Class=Paragraph_Separator
+
+000A          ; B # Cc       <control-000A>
+000D          ; B # Cc       <control-000D>
+001C..001E    ; B # Cc   [3] <control-001C>..<control-001E>
+0085          ; B # Cc       <control-0085>
+2029          ; B # Zp       PARAGRAPH SEPARATOR
+
+# Total code points: 7
+
+# ================================================
+
+# Bidi_Class=Segment_Separator
+
+0009          ; S # Cc       <control-0009>
+000B          ; S # Cc       <control-000B>
+001F          ; S # Cc       <control-001F>
+
+# Total code points: 3
+
+# ================================================
+
+# Bidi_Class=White_Space
+
+000C          ; WS # Cc       <control-000C>
+0020          ; WS # Zs       SPACE
+1680          ; WS # Zs       OGHAM SPACE MARK
+180E          ; WS # Zs       MONGOLIAN VOWEL SEPARATOR
+2000..200A    ; WS # Zs  [11] EN QUAD..HAIR SPACE
+2028          ; WS # Zl       LINE SEPARATOR
+202F          ; WS # Zs       NARROW NO-BREAK SPACE
+205F          ; WS # Zs       MEDIUM MATHEMATICAL SPACE
+3000          ; WS # Zs       IDEOGRAPHIC SPACE
+
+# Total code points: 19
+
+# ================================================
+
+# Bidi_Class=Other_Neutral
+
+0021..0022    ; ON # Po   [2] EXCLAMATION MARK..QUOTATION MARK
+0026..0027    ; ON # Po   [2] AMPERSAND..APOSTROPHE
+0028          ; ON # Ps       LEFT PARENTHESIS
+0029          ; ON # Pe       RIGHT PARENTHESIS
+002A          ; ON # Po       ASTERISK
+003B          ; ON # Po       SEMICOLON
+003C..003E    ; ON # Sm   [3] LESS-THAN SIGN..GREATER-THAN SIGN
+003F..0040    ; ON # Po   [2] QUESTION MARK..COMMERCIAL AT
+005B          ; ON # Ps       LEFT SQUARE BRACKET
+005C          ; ON # Po       REVERSE SOLIDUS
+005D          ; ON # Pe       RIGHT SQUARE BRACKET
+005E          ; ON # Sk       CIRCUMFLEX ACCENT
+005F          ; ON # Pc       LOW LINE
+0060          ; ON # Sk       GRAVE ACCENT
+007B          ; ON # Ps       LEFT CURLY BRACKET
+007C          ; ON # Sm       VERTICAL LINE
+007D          ; ON # Pe       RIGHT CURLY BRACKET
+007E          ; ON # Sm       TILDE
+00A1          ; ON # Po       INVERTED EXCLAMATION MARK
+00A6..00A7    ; ON # So   [2] BROKEN BAR..SECTION SIGN
+00A8          ; ON # Sk       DIAERESIS
+00A9          ; ON # So       COPYRIGHT SIGN
+00AB          ; ON # Pi       LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC          ; ON # Sm       NOT SIGN
+00AE          ; ON # So       REGISTERED SIGN
+00AF          ; ON # Sk       MACRON
+00B4          ; ON # Sk       ACUTE ACCENT
+00B6          ; ON # So       PILCROW SIGN
+00B7          ; ON # Po       MIDDLE DOT
+00B8          ; ON # Sk       CEDILLA
+00BB          ; ON # Pf       RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BC..00BE    ; ON # No   [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS
+00BF          ; ON # Po       INVERTED QUESTION MARK
+00D7          ; ON # Sm       MULTIPLICATION SIGN
+00F7          ; ON # Sm       DIVISION SIGN
+02B9..02BA    ; ON # Lm   [2] MODIFIER LETTER PRIME..MODIFIER LETTER DOUBLE PRIME
+02C2..02C5    ; ON # Sk   [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD
+02C6..02CF    ; ON # Lm  [10] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER LOW ACUTE ACCENT
+02D2..02DF    ; ON # Sk  [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT
+02E5..02ED    ; ON # Sk   [9] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER UNASPIRATED
+02EF..02FF    ; ON # Sk  [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW
+0374..0375    ; ON # Sk   [2] GREEK NUMERAL SIGN..GREEK LOWER NUMERAL SIGN
+037E          ; ON # Po       GREEK QUESTION MARK
+0384..0385    ; ON # Sk   [2] GREEK TONOS..GREEK DIALYTIKA TONOS
+0387          ; ON # Po       GREEK ANO TELEIA
+03F6          ; ON # Sm       GREEK REVERSED LUNATE EPSILON SYMBOL
+058A          ; ON # Pd       ARMENIAN HYPHEN
+060E..060F    ; ON # So   [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA
+06E9          ; ON # So       ARABIC PLACE OF SAJDAH
+0BF3..0BF8    ; ON # So   [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN
+0BFA          ; ON # So       TAMIL NUMBER SIGN
+0F3A          ; ON # Ps       TIBETAN MARK GUG RTAGS GYON
+0F3B          ; ON # Pe       TIBETAN MARK GUG RTAGS GYAS
+0F3C          ; ON # Ps       TIBETAN MARK ANG KHANG GYON
+0F3D          ; ON # Pe       TIBETAN MARK ANG KHANG GYAS
+169B          ; ON # Ps       OGHAM FEATHER MARK
+169C          ; ON # Pe       OGHAM REVERSED FEATHER MARK
+17F0..17F9    ; ON # No  [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON
+1800..1805    ; ON # Po   [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS
+1806          ; ON # Pd       MONGOLIAN TODO SOFT HYPHEN
+1807..180A    ; ON # Po   [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU
+1940          ; ON # So       LIMBU SIGN LOO
+1944..1945    ; ON # Po   [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK
+19E0..19FF    ; ON # So  [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC
+1FBD          ; ON # Sk       GREEK KORONIS
+1FBF..1FC1    ; ON # Sk   [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI
+1FCD..1FCF    ; ON # Sk   [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI
+1FDD..1FDF    ; ON # Sk   [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI
+1FED..1FEF    ; ON # Sk   [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA
+1FFD..1FFE    ; ON # Sk   [2] GREEK OXIA..GREEK DASIA
+2010..2015    ; ON # Pd   [6] HYPHEN..HORIZONTAL BAR
+2016..2017    ; ON # Po   [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE
+2018          ; ON # Pi       LEFT SINGLE QUOTATION MARK
+2019          ; ON # Pf       RIGHT SINGLE QUOTATION MARK
+201A          ; ON # Ps       SINGLE LOW-9 QUOTATION MARK
+201B..201C    ; ON # Pi   [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK
+201D          ; ON # Pf       RIGHT DOUBLE QUOTATION MARK
+201E          ; ON # Ps       DOUBLE LOW-9 QUOTATION MARK
+201F          ; ON # Pi       DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020..2027    ; ON # Po   [8] DAGGER..HYPHENATION POINT
+2035..2038    ; ON # Po   [4] REVERSED PRIME..CARET
+2039          ; ON # Pi       SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A          ; ON # Pf       SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B..203E    ; ON # Po   [4] REFERENCE MARK..OVERLINE
+203F..2040    ; ON # Pc   [2] UNDERTIE..CHARACTER TIE
+2041..2043    ; ON # Po   [3] CARET INSERTION POINT..HYPHEN BULLET
+2045          ; ON # Ps       LEFT SQUARE BRACKET WITH QUILL
+2046          ; ON # Pe       RIGHT SQUARE BRACKET WITH QUILL
+2047..2051    ; ON # Po  [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY
+2052          ; ON # Sm       COMMERCIAL MINUS SIGN
+2053          ; ON # Po       SWUNG DASH
+2054          ; ON # Pc       INVERTED UNDERTIE
+2057          ; ON # Po       QUADRUPLE PRIME
+207C          ; ON # Sm       SUPERSCRIPT EQUALS SIGN
+207D          ; ON # Ps       SUPERSCRIPT LEFT PARENTHESIS
+207E          ; ON # Pe       SUPERSCRIPT RIGHT PARENTHESIS
+208C          ; ON # Sm       SUBSCRIPT EQUALS SIGN
+208D          ; ON # Ps       SUBSCRIPT LEFT PARENTHESIS
+208E          ; ON # Pe       SUBSCRIPT RIGHT PARENTHESIS
+2100..2101    ; ON # So   [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT
+2103..2106    ; ON # So   [4] DEGREE CELSIUS..CADA UNA
+2108..2109    ; ON # So   [2] SCRUPLE..DEGREE FAHRENHEIT
+2114          ; ON # So       L B BAR SYMBOL
+2116..2118    ; ON # So   [3] NUMERO SIGN..SCRIPT CAPITAL P
+211E..2123    ; ON # So   [6] PRESCRIPTION TAKE..VERSICLE
+2125          ; ON # So       OUNCE SIGN
+2127          ; ON # So       INVERTED OHM SIGN
+2129          ; ON # So       TURNED GREEK SMALL LETTER IOTA
+2132          ; ON # So       TURNED CAPITAL F
+213A..213B    ; ON # So   [2] ROTATED CAPITAL Q..FACSIMILE SIGN
+2140..2144    ; ON # Sm   [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y
+214A          ; ON # So       PROPERTY LINE
+214B          ; ON # Sm       TURNED AMPERSAND
+2153..215F    ; ON # No  [13] VULGAR FRACTION ONE THIRD..FRACTION NUMERATOR ONE
+2190..2194    ; ON # Sm   [5] LEFTWARDS ARROW..LEFT RIGHT ARROW
+2195..2199    ; ON # So   [5] UP DOWN ARROW..SOUTH WEST ARROW
+219A..219B    ; ON # Sm   [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE
+219C..219F    ; ON # So   [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW
+21A0          ; ON # Sm       RIGHTWARDS TWO HEADED ARROW
+21A1..21A2    ; ON # So   [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL
+21A3          ; ON # Sm       RIGHTWARDS ARROW WITH TAIL
+21A4..21A5    ; ON # So   [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR
+21A6          ; ON # Sm       RIGHTWARDS ARROW FROM BAR
+21A7..21AD    ; ON # So   [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW
+21AE          ; ON # Sm       LEFT RIGHT ARROW WITH STROKE
+21AF..21CD    ; ON # So  [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE..21CF    ; ON # Sm   [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0..21D1    ; ON # So   [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW
+21D2          ; ON # Sm       RIGHTWARDS DOUBLE ARROW
+21D3          ; ON # So       DOWNWARDS DOUBLE ARROW
+21D4          ; ON # Sm       LEFT RIGHT DOUBLE ARROW
+21D5..21F3    ; ON # So  [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW
+21F4..2211    ; ON # Sm  [30] RIGHT ARROW WITH SMALL CIRCLE..N-ARY SUMMATION
+2214..22FF    ; ON # Sm [236] DOT PLUS..Z NOTATION BAG MEMBERSHIP
+2300..2307    ; ON # So   [8] DIAMETER SIGN..WAVY LINE
+2308..230B    ; ON # Sm   [4] LEFT CEILING..RIGHT FLOOR
+230C..231F    ; ON # So  [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER
+2320..2321    ; ON # Sm   [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL
+2322..2328    ; ON # So   [7] FROWN..KEYBOARD
+2329          ; ON # Ps       LEFT-POINTING ANGLE BRACKET
+232A          ; ON # Pe       RIGHT-POINTING ANGLE BRACKET
+232B..2335    ; ON # So  [11] ERASE TO THE LEFT..COUNTERSINK
+237B          ; ON # So       NOT CHECK MARK
+237C          ; ON # Sm       RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D..2394    ; ON # So  [24] SHOULDERED OPEN BOX..SOFTWARE-FUNCTION SYMBOL
+2396..239A    ; ON # So   [5] DECIMAL SEPARATOR KEY SYMBOL..CLEAR SCREEN SYMBOL
+239B..23B3    ; ON # Sm  [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM
+23B4          ; ON # Ps       TOP SQUARE BRACKET
+23B5          ; ON # Pe       BOTTOM SQUARE BRACKET
+23B6          ; ON # Po       BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET
+23B7..23D0    ; ON # So  [26] RADICAL SYMBOL BOTTOM..VERTICAL LINE EXTENSION
+2400..2426    ; ON # So  [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO
+2440..244A    ; ON # So  [11] OCR HOOK..OCR DOUBLE BACKSLASH
+2460..2487    ; ON # No  [40] CIRCLED DIGIT ONE..PARENTHESIZED NUMBER TWENTY
+24EA..24FF    ; ON # No  [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO
+2500..25B6    ; ON # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE
+25B7          ; ON # Sm       WHITE RIGHT-POINTING TRIANGLE
+25B8..25C0    ; ON # So   [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE
+25C1          ; ON # Sm       WHITE LEFT-POINTING TRIANGLE
+25C2..25F7    ; ON # So  [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8..25FF    ; ON # Sm   [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE
+2600..2617    ; ON # So  [24] BLACK SUN WITH RAYS..BLACK SHOGI PIECE
+2619..266E    ; ON # So  [86] REVERSED ROTATED FLORAL HEART BULLET..MUSIC NATURAL SIGN
+266F          ; ON # Sm       MUSIC SHARP SIGN
+2670..267D    ; ON # So  [14] WEST SYRIAC CROSS..PARTIALLY-RECYCLED PAPER SYMBOL
+2680..2691    ; ON # So  [18] DIE FACE-1..BLACK FLAG
+26A0..26A1    ; ON # So   [2] WARNING SIGN..HIGH VOLTAGE SIGN
+2701..2704    ; ON # So   [4] UPPER BLADE SCISSORS..WHITE SCISSORS
+2706..2709    ; ON # So   [4] TELEPHONE LOCATION SIGN..ENVELOPE
+270C..2727    ; ON # So  [28] VICTORY HAND..WHITE FOUR POINTED STAR
+2729..274B    ; ON # So  [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274D          ; ON # So       SHADOWED WHITE CIRCLE
+274F..2752    ; ON # So   [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE
+2756          ; ON # So       BLACK DIAMOND MINUS WHITE X
+2758..275E    ; ON # So   [7] LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761..2767    ; ON # So   [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET
+2768          ; ON # Ps       MEDIUM LEFT PARENTHESIS ORNAMENT
+2769          ; ON # Pe       MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A          ; ON # Ps       MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B          ; ON # Pe       MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C          ; ON # Ps       MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D          ; ON # Pe       MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E          ; ON # Ps       HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F          ; ON # Pe       HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770          ; ON # Ps       HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771          ; ON # Pe       HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772          ; ON # Ps       LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773          ; ON # Pe       LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774          ; ON # Ps       MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775          ; ON # Pe       MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2776..2793    ; ON # No  [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+2794          ; ON # So       HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798..27AF    ; ON # So  [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1..27BE    ; ON # So  [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW
+27D0..27E5    ; ON # Sm  [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK
+27E6          ; ON # Ps       MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7          ; ON # Pe       MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8          ; ON # Ps       MATHEMATICAL LEFT ANGLE BRACKET
+27E9          ; ON # Pe       MATHEMATICAL RIGHT ANGLE BRACKET
+27EA          ; ON # Ps       MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB          ; ON # Pe       MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27F0..27FF    ; ON # Sm  [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW
+2900..2982    ; ON # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON
+2983          ; ON # Ps       LEFT WHITE CURLY BRACKET
+2984          ; ON # Pe       RIGHT WHITE CURLY BRACKET
+2985          ; ON # Ps       LEFT WHITE PARENTHESIS
+2986          ; ON # Pe       RIGHT WHITE PARENTHESIS
+2987          ; ON # Ps       Z NOTATION LEFT IMAGE BRACKET
+2988          ; ON # Pe       Z NOTATION RIGHT IMAGE BRACKET
+2989          ; ON # Ps       Z NOTATION LEFT BINDING BRACKET
+298A          ; ON # Pe       Z NOTATION RIGHT BINDING BRACKET
+298B          ; ON # Ps       LEFT SQUARE BRACKET WITH UNDERBAR
+298C          ; ON # Pe       RIGHT SQUARE BRACKET WITH UNDERBAR
+298D          ; ON # Ps       LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E          ; ON # Pe       RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F          ; ON # Ps       LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990          ; ON # Pe       RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991          ; ON # Ps       LEFT ANGLE BRACKET WITH DOT
+2992          ; ON # Pe       RIGHT ANGLE BRACKET WITH DOT
+2993          ; ON # Ps       LEFT ARC LESS-THAN BRACKET
+2994          ; ON # Pe       RIGHT ARC GREATER-THAN BRACKET
+2995          ; ON # Ps       DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996          ; ON # Pe       DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997          ; ON # Ps       LEFT BLACK TORTOISE SHELL BRACKET
+2998          ; ON # Pe       RIGHT BLACK TORTOISE SHELL BRACKET
+2999..29D7    ; ON # Sm  [63] DOTTED FENCE..BLACK HOURGLASS
+29D8          ; ON # Ps       LEFT WIGGLY FENCE
+29D9          ; ON # Pe       RIGHT WIGGLY FENCE
+29DA          ; ON # Ps       LEFT DOUBLE WIGGLY FENCE
+29DB          ; ON # Pe       RIGHT DOUBLE WIGGLY FENCE
+29DC..29FB    ; ON # Sm  [32] INCOMPLETE INFINITY..TRIPLE PLUS
+29FC          ; ON # Ps       LEFT-POINTING CURVED ANGLE BRACKET
+29FD          ; ON # Pe       RIGHT-POINTING CURVED ANGLE BRACKET
+29FE..2AFF    ; ON # Sm [258] TINY..N-ARY WHITE VERTICAL BAR
+2B00..2B0D    ; ON # So  [14] NORTH EAST WHITE ARROW..UP DOWN BLACK ARROW
+2E80..2E99    ; ON # So  [26] CJK RADICAL REPEAT..CJK RADICAL RAP
+2E9B..2EF3    ; ON # So  [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE
+2F00..2FD5    ; ON # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE
+2FF0..2FFB    ; ON # So  [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3001..3003    ; ON # Po   [3] IDEOGRAPHIC COMMA..DITTO MARK
+3004          ; ON # So       JAPANESE INDUSTRIAL STANDARD SYMBOL
+3008          ; ON # Ps       LEFT ANGLE BRACKET
+3009          ; ON # Pe       RIGHT ANGLE BRACKET
+300A          ; ON # Ps       LEFT DOUBLE ANGLE BRACKET
+300B          ; ON # Pe       RIGHT DOUBLE ANGLE BRACKET
+300C          ; ON # Ps       LEFT CORNER BRACKET
+300D          ; ON # Pe       RIGHT CORNER BRACKET
+300E          ; ON # Ps       LEFT WHITE CORNER BRACKET
+300F          ; ON # Pe       RIGHT WHITE CORNER BRACKET
+3010          ; ON # Ps       LEFT BLACK LENTICULAR BRACKET
+3011          ; ON # Pe       RIGHT BLACK LENTICULAR BRACKET
+3012..3013    ; ON # So   [2] POSTAL MARK..GETA MARK
+3014          ; ON # Ps       LEFT TORTOISE SHELL BRACKET
+3015          ; ON # Pe       RIGHT TORTOISE SHELL BRACKET
+3016          ; ON # Ps       LEFT WHITE LENTICULAR BRACKET
+3017          ; ON # Pe       RIGHT WHITE LENTICULAR BRACKET
+3018          ; ON # Ps       LEFT WHITE TORTOISE SHELL BRACKET
+3019          ; ON # Pe       RIGHT WHITE TORTOISE SHELL BRACKET
+301A          ; ON # Ps       LEFT WHITE SQUARE BRACKET
+301B          ; ON # Pe       RIGHT WHITE SQUARE BRACKET
+301C          ; ON # Pd       WAVE DASH
+301D          ; ON # Ps       REVERSED DOUBLE PRIME QUOTATION MARK
+301E..301F    ; ON # Pe   [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK
+3020          ; ON # So       POSTAL MARK FACE
+3030          ; ON # Pd       WAVY DASH
+3036..3037    ; ON # So   [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+303D          ; ON # Po       PART ALTERNATION MARK
+303E..303F    ; ON # So   [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE
+309B..309C    ; ON # Sk   [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+30A0          ; ON # Pd       KATAKANA-HIRAGANA DOUBLE HYPHEN
+30FB          ; ON # Pc       KATAKANA MIDDLE DOT
+321D..321E    ; ON # So   [2] PARENTHESIZED KOREAN CHARACTER OJEON..PARENTHESIZED KOREAN CHARACTER O HU
+3250          ; ON # So       PARTNERSHIP SIGN
+3251..325F    ; ON # No  [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE
+327C..327D    ; ON # So   [2] CIRCLED KOREAN CHARACTER CHAMKO..CIRCLED KOREAN CHARACTER JUEUI
+32B1..32BF    ; ON # No  [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY
+32CC..32CF    ; ON # So   [4] SQUARE HG..LIMITED LIABILITY SIGN
+3377..337A    ; ON # So   [4] SQUARE DM..SQUARE IU
+33DE..33DF    ; ON # So   [2] SQUARE V OVER M..SQUARE A OVER M
+33FF          ; ON # So       SQUARE GAL
+4DC0..4DFF    ; ON # So  [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION
+A490..A4C6    ; ON # So  [55] YI RADICAL QOT..YI RADICAL KE
+FD3E          ; ON # Ps       ORNATE LEFT PARENTHESIS
+FD3F          ; ON # Pe       ORNATE RIGHT PARENTHESIS
+FDFD          ; ON # So       ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+FE30          ; ON # Po       PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+FE31..FE32    ; ON # Pd   [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH
+FE33..FE34    ; ON # Pc   [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+FE35          ; ON # Ps       PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+FE36          ; ON # Pe       PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+FE37          ; ON # Ps       PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+FE38          ; ON # Pe       PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+FE39          ; ON # Ps       PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+FE3A          ; ON # Pe       PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+FE3B          ; ON # Ps       PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+FE3C          ; ON # Pe       PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+FE3D          ; ON # Ps       PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+FE3E          ; ON # Pe       PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+FE3F          ; ON # Ps       PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+FE40          ; ON # Pe       PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+FE41          ; ON # Ps       PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42          ; ON # Pe       PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43          ; ON # Ps       PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44          ; ON # Pe       PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FE45..FE46    ; ON # Po   [2] SESAME DOT..WHITE SESAME DOT
+FE47          ; ON # Ps       PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+FE48          ; ON # Pe       PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+FE49..FE4C    ; ON # Po   [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE
+FE4D..FE4F    ; ON # Pc   [3] DASHED LOW LINE..WAVY LOW LINE
+FE51          ; ON # Po       SMALL IDEOGRAPHIC COMMA
+FE54          ; ON # Po       SMALL SEMICOLON
+FE56..FE57    ; ON # Po   [2] SMALL QUESTION MARK..SMALL EXCLAMATION MARK
+FE58          ; ON # Pd       SMALL EM DASH
+FE59          ; ON # Ps       SMALL LEFT PARENTHESIS
+FE5A          ; ON # Pe       SMALL RIGHT PARENTHESIS
+FE5B          ; ON # Ps       SMALL LEFT CURLY BRACKET
+FE5C          ; ON # Pe       SMALL RIGHT CURLY BRACKET
+FE5D          ; ON # Ps       SMALL LEFT TORTOISE SHELL BRACKET
+FE5E          ; ON # Pe       SMALL RIGHT TORTOISE SHELL BRACKET
+FE60..FE61    ; ON # Po   [2] SMALL AMPERSAND..SMALL ASTERISK
+FE64..FE66    ; ON # Sm   [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN
+FE68          ; ON # Po       SMALL REVERSE SOLIDUS
+FE6B          ; ON # Po       SMALL COMMERCIAL AT
+FF01..FF02    ; ON # Po   [2] FULLWIDTH EXCLAMATION MARK..FULLWIDTH QUOTATION MARK
+FF06..FF07    ; ON # Po   [2] FULLWIDTH AMPERSAND..FULLWIDTH APOSTROPHE
+FF08          ; ON # Ps       FULLWIDTH LEFT PARENTHESIS
+FF09          ; ON # Pe       FULLWIDTH RIGHT PARENTHESIS
+FF0A          ; ON # Po       FULLWIDTH ASTERISK
+FF1B          ; ON # Po       FULLWIDTH SEMICOLON
+FF1C..FF1E    ; ON # Sm   [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN
+FF1F..FF20    ; ON # Po   [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT
+FF3B          ; ON # Ps       FULLWIDTH LEFT SQUARE BRACKET
+FF3C          ; ON # Po       FULLWIDTH REVERSE SOLIDUS
+FF3D          ; ON # Pe       FULLWIDTH RIGHT SQUARE BRACKET
+FF3E          ; ON # Sk       FULLWIDTH CIRCUMFLEX ACCENT
+FF3F          ; ON # Pc       FULLWIDTH LOW LINE
+FF40          ; ON # Sk       FULLWIDTH GRAVE ACCENT
+FF5B          ; ON # Ps       FULLWIDTH LEFT CURLY BRACKET
+FF5C          ; ON # Sm       FULLWIDTH VERTICAL LINE
+FF5D          ; ON # Pe       FULLWIDTH RIGHT CURLY BRACKET
+FF5E          ; ON # Sm       FULLWIDTH TILDE
+FF5F          ; ON # Ps       FULLWIDTH LEFT WHITE PARENTHESIS
+FF60          ; ON # Pe       FULLWIDTH RIGHT WHITE PARENTHESIS
+FF61          ; ON # Po       HALFWIDTH IDEOGRAPHIC FULL STOP
+FF62          ; ON # Ps       HALFWIDTH LEFT CORNER BRACKET
+FF63          ; ON # Pe       HALFWIDTH RIGHT CORNER BRACKET
+FF64          ; ON # Po       HALFWIDTH IDEOGRAPHIC COMMA
+FF65          ; ON # Pc       HALFWIDTH KATAKANA MIDDLE DOT
+FFE2          ; ON # Sm       FULLWIDTH NOT SIGN
+FFE3          ; ON # Sk       FULLWIDTH MACRON
+FFE4          ; ON # So       FULLWIDTH BROKEN BAR
+FFE8          ; ON # So       HALFWIDTH FORMS LIGHT VERTICAL
+FFE9..FFEC    ; ON # Sm   [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW
+FFED..FFEE    ; ON # So   [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE
+FFF9..FFFB    ; ON # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
+FFFC..FFFD    ; ON # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
+10101         ; ON # Po       AEGEAN WORD SEPARATOR DOT
+1D300..1D356  ; ON # So  [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
+
+# Total code points: 2793
+
+# ================================================
+
+# Bidi_Class=Boundary_Neutral
+
+0000..0008    ; BN # Cc   [9] <control-0000>..<control-0008>
+000E..001B    ; BN # Cc  [14] <control-000E>..<control-001B>
+007F..0084    ; BN # Cc   [6] <control-007F>..<control-0084>
+0086..009F    ; BN # Cc  [26] <control-0086>..<control-009F>
+00AD          ; BN # Cf       SOFT HYPHEN
+070F          ; BN # Cf       SYRIAC ABBREVIATION MARK
+200B..200D    ; BN # Cf   [3] ZERO WIDTH SPACE..ZERO WIDTH JOINER
+2060..2063    ; BN # Cf   [4] WORD JOINER..INVISIBLE SEPARATOR
+2064..2069    ; BN # Cn   [6] <reserved-2064>..<reserved-2069>
+206A..206F    ; BN # Cf   [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES
+FDD0..FDEF    ; BN # Cn  [32] <noncharacter-FDD0>..<noncharacter-FDEF>
+FEFF          ; BN # Cf       ZERO WIDTH NO-BREAK SPACE
+FFF0..FFF8    ; BN # Cn   [9] <reserved-FFF0>..<reserved-FFF8>
+FFFE..FFFF    ; BN # Cn   [2] <noncharacter-FFFE>..<noncharacter-FFFF>
+1D173..1D17A  ; BN # Cf   [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
+1FFFE..1FFFF  ; BN # Cn   [2] <noncharacter-1FFFE>..<noncharacter-1FFFF>
+2FFFE..2FFFF  ; BN # Cn   [2] <noncharacter-2FFFE>..<noncharacter-2FFFF>
+3FFFE..3FFFF  ; BN # Cn   [2] <noncharacter-3FFFE>..<noncharacter-3FFFF>
+4FFFE..4FFFF  ; BN # Cn   [2] <noncharacter-4FFFE>..<noncharacter-4FFFF>
+5FFFE..5FFFF  ; BN # Cn   [2] <noncharacter-5FFFE>..<noncharacter-5FFFF>
+6FFFE..6FFFF  ; BN # Cn   [2] <noncharacter-6FFFE>..<noncharacter-6FFFF>
+7FFFE..7FFFF  ; BN # Cn   [2] <noncharacter-7FFFE>..<noncharacter-7FFFF>
+8FFFE..8FFFF  ; BN # Cn   [2] <noncharacter-8FFFE>..<noncharacter-8FFFF>
+9FFFE..9FFFF  ; BN # Cn   [2] <noncharacter-9FFFE>..<noncharacter-9FFFF>
+AFFFE..AFFFF  ; BN # Cn   [2] <noncharacter-AFFFE>..<noncharacter-AFFFF>
+BFFFE..BFFFF  ; BN # Cn   [2] <noncharacter-BFFFE>..<noncharacter-BFFFF>
+CFFFE..CFFFF  ; BN # Cn   [2] <noncharacter-CFFFE>..<noncharacter-CFFFF>
+DFFFE..E0000  ; BN # Cn   [3] <noncharacter-DFFFE>..<reserved-E0000>
+E0001         ; BN # Cf       LANGUAGE TAG
+E0002..E001F  ; BN # Cn  [30] <reserved-E0002>..<reserved-E001F>
+E0020..E007F  ; BN # Cf  [96] TAG SPACE..CANCEL TAG
+E0080..E00FF  ; BN # Cn [128] <reserved-E0080>..<reserved-E00FF>
+E01F0..E0FFF  ; BN # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
+EFFFE..EFFFF  ; BN # Cn   [2] <noncharacter-EFFFE>..<noncharacter-EFFFF>
+FFFFE..FFFFF  ; BN # Cn   [2] <noncharacter-FFFFE>..<noncharacter-FFFFF>
+10FFFE..10FFFF; BN # Cn   [2] <noncharacter-10FFFE>..<noncharacter-10FFFF>
+
+# Total code points: 4016
+
+# ================================================
+
+# Bidi_Class=Nonspacing_Mark
+
+0300..0357    ; NSM # Mn  [88] COMBINING GRAVE ACCENT..COMBINING RIGHT HALF RING ABOVE
+035D..036F    ; NSM # Mn  [19] COMBINING DOUBLE BREVE..COMBINING LATIN SMALL LETTER X
+0483..0486    ; NSM # Mn   [4] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA
+0488..0489    ; NSM # Me   [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN
+0591..05A1    ; NSM # Mn  [17] HEBREW ACCENT ETNAHTA..HEBREW ACCENT PAZER
+05A3..05B9    ; NSM # Mn  [23] HEBREW ACCENT MUNAH..HEBREW POINT HOLAM
+05BB..05BD    ; NSM # Mn   [3] HEBREW POINT QUBUTS..HEBREW POINT METEG
+05BF          ; NSM # Mn       HEBREW POINT RAFE
+05C1..05C2    ; NSM # Mn   [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C4          ; NSM # Mn       HEBREW MARK UPPER DOT
+0610..0615    ; NSM # Mn   [6] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH
+064B..0658    ; NSM # Mn  [14] ARABIC FATHATAN..ARABIC MARK NOON GHUNNA
+0670          ; NSM # Mn       ARABIC LETTER SUPERSCRIPT ALEF
+06D6..06DC    ; NSM # Mn   [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
+06DE          ; NSM # Me       ARABIC START OF RUB EL HIZB
+06DF..06E4    ; NSM # Mn   [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA
+06E7..06E8    ; NSM # Mn   [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+06EA..06ED    ; NSM # Mn   [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM
+0711          ; NSM # Mn       SYRIAC LETTER SUPERSCRIPT ALAPH
+0730..074A    ; NSM # Mn  [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+07A6..07B0    ; NSM # Mn  [11] THAANA ABAFILI..THAANA SUKUN
+0901..0902    ; NSM # Mn   [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA
+093C          ; NSM # Mn       DEVANAGARI SIGN NUKTA
+0941..0948    ; NSM # Mn   [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
+094D          ; NSM # Mn       DEVANAGARI SIGN VIRAMA
+0951..0954    ; NSM # Mn   [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT
+0962..0963    ; NSM # Mn   [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
+0981          ; NSM # Mn       BENGALI SIGN CANDRABINDU
+09BC          ; NSM # Mn       BENGALI SIGN NUKTA
+09C1..09C4    ; NSM # Mn   [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
+09CD          ; NSM # Mn       BENGALI SIGN VIRAMA
+09E2..09E3    ; NSM # Mn   [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+0A01..0A02    ; NSM # Mn   [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A3C          ; NSM # Mn       GURMUKHI SIGN NUKTA
+0A41..0A42    ; NSM # Mn   [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
+0A47..0A48    ; NSM # Mn   [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A4B..0A4D    ; NSM # Mn   [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
+0A70..0A71    ; NSM # Mn   [2] GURMUKHI TIPPI..GURMUKHI ADDAK
+0A81..0A82    ; NSM # Mn   [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
+0ABC          ; NSM # Mn       GUJARATI SIGN NUKTA
+0AC1..0AC5    ; NSM # Mn   [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
+0AC7..0AC8    ; NSM # Mn   [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0ACD          ; NSM # Mn       GUJARATI SIGN VIRAMA
+0AE2..0AE3    ; NSM # Mn   [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0B01          ; NSM # Mn       ORIYA SIGN CANDRABINDU
+0B3C          ; NSM # Mn       ORIYA SIGN NUKTA
+0B3F          ; NSM # Mn       ORIYA VOWEL SIGN I
+0B41..0B43    ; NSM # Mn   [3] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC R
+0B4D          ; NSM # Mn       ORIYA SIGN VIRAMA
+0B56          ; NSM # Mn       ORIYA AI LENGTH MARK
+0B82          ; NSM # Mn       TAMIL SIGN ANUSVARA
+0BC0          ; NSM # Mn       TAMIL VOWEL SIGN II
+0BCD          ; NSM # Mn       TAMIL SIGN VIRAMA
+0C3E..0C40    ; NSM # Mn   [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
+0C46..0C48    ; NSM # Mn   [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C4A..0C4D    ; NSM # Mn   [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
+0C55..0C56    ; NSM # Mn   [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0CBC          ; NSM # Mn       KANNADA SIGN NUKTA
+0CCC..0CCD    ; NSM # Mn   [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
+0D41..0D43    ; NSM # Mn   [3] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC R
+0D4D          ; NSM # Mn       MALAYALAM SIGN VIRAMA
+0DCA          ; NSM # Mn       SINHALA SIGN AL-LAKUNA
+0DD2..0DD4    ; NSM # Mn   [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6          ; NSM # Mn       SINHALA VOWEL SIGN DIGA PAA-PILLA
+0E31          ; NSM # Mn       THAI CHARACTER MAI HAN-AKAT
+0E34..0E3A    ; NSM # Mn   [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E47..0E4E    ; NSM # Mn   [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
+0EB1          ; NSM # Mn       LAO VOWEL SIGN MAI KAN
+0EB4..0EB9    ; NSM # Mn   [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
+0EBB..0EBC    ; NSM # Mn   [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
+0EC8..0ECD    ; NSM # Mn   [6] LAO TONE MAI EK..LAO NIGGAHITA
+0F18..0F19    ; NSM # Mn   [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F35          ; NSM # Mn       TIBETAN MARK NGAS BZUNG NYI ZLA
+0F37          ; NSM # Mn       TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F39          ; NSM # Mn       TIBETAN MARK TSA -PHRU
+0F71..0F7E    ; NSM # Mn  [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
+0F80..0F84    ; NSM # Mn   [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA
+0F86..0F87    ; NSM # Mn   [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
+0F90..0F97    ; NSM # Mn   [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA
+0F99..0FBC    ; NSM # Mn  [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FC6          ; NSM # Mn       TIBETAN SYMBOL PADMA GDAN
+102D..1030    ; NSM # Mn   [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+1032          ; NSM # Mn       MYANMAR VOWEL SIGN AI
+1036..1037    ; NSM # Mn   [2] MYANMAR SIGN ANUSVARA..MYANMAR SIGN DOT BELOW
+1039          ; NSM # Mn       MYANMAR SIGN VIRAMA
+1058..1059    ; NSM # Mn   [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
+1712..1714    ; NSM # Mn   [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA
+1732..1734    ; NSM # Mn   [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD
+1752..1753    ; NSM # Mn   [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
+1772..1773    ; NSM # Mn   [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+17B7..17BD    ; NSM # Mn   [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
+17C6          ; NSM # Mn       KHMER SIGN NIKAHIT
+17C9..17D3    ; NSM # Mn  [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
+17DD          ; NSM # Mn       KHMER SIGN ATTHACAN
+180B..180D    ; NSM # Mn   [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+18A9          ; NSM # Mn       MONGOLIAN LETTER ALI GALI DAGALGA
+1920..1922    ; NSM # Mn   [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1927..1928    ; NSM # Mn   [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1929..192B    ; NSM # Mc   [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
+1932          ; NSM # Mn       LIMBU SMALL LETTER ANUSVARA
+1939..193B    ; NSM # Mn   [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+20D0..20DC    ; NSM # Mn  [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
+20DD..20E0    ; NSM # Me   [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1          ; NSM # Mn       COMBINING LEFT RIGHT ARROW ABOVE
+20E2..20E4    ; NSM # Me   [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5..20EA    ; NSM # Mn   [6] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING LEFTWARDS ARROW OVERLAY
+302A..302F    ; NSM # Mn   [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK
+3099..309A    ; NSM # Mn   [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+FB1E          ; NSM # Mn       HEBREW POINT JUDEO-SPANISH VARIKA
+FE00..FE0F    ; NSM # Mn  [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+FE20..FE23    ; NSM # Mn   [4] COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF
+1D167..1D169  ; NSM # Mn   [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
+1D17B..1D182  ; NSM # Mn   [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
+1D185..1D18B  ; NSM # Mn   [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D1AA..1D1AD  ; NSM # Mn   [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+E0100..E01EF  ; NSM # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+
+# Total code points: 803
+
+# ================================================
+
+# Bidi_Class=Arabic_Letter
+
+0600..0603    ; AL # Cf   [4] ARABIC NUMBER SIGN..ARABIC SIGN SAFHA
+0604..060B    ; AL # Cn   [8] <reserved-0604>..<reserved-060B>
+060D          ; AL # Po       ARABIC DATE SEPARATOR
+0616..061A    ; AL # Cn   [5] <reserved-0616>..<reserved-061A>
+061B          ; AL # Po       ARABIC SEMICOLON
+061C..061E    ; AL # Cn   [3] <reserved-061C>..<reserved-061E>
+061F          ; AL # Po       ARABIC QUESTION MARK
+0620          ; AL # Cn       <reserved-0620>
+0621..063A    ; AL # Lo  [26] ARABIC LETTER HAMZA..ARABIC LETTER GHAIN
+063B..063F    ; AL # Cn   [5] <reserved-063B>..<reserved-063F>
+0640          ; AL # Lm       ARABIC TATWEEL
+0641..064A    ; AL # Lo  [10] ARABIC LETTER FEH..ARABIC LETTER YEH
+0659..065F    ; AL # Cn   [7] <reserved-0659>..<reserved-065F>
+066D          ; AL # Po       ARABIC FIVE POINTED STAR
+066E..066F    ; AL # Lo   [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF
+0671..06D3    ; AL # Lo  [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D4          ; AL # Po       ARABIC FULL STOP
+06D5          ; AL # Lo       ARABIC LETTER AE
+06DD          ; AL # Cf       ARABIC END OF AYAH
+06E5..06E6    ; AL # Lm   [2] ARABIC SMALL WAW..ARABIC SMALL YEH
+06EE..06EF    ; AL # Lo   [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V
+06FA..06FC    ; AL # Lo   [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW
+06FD..06FE    ; AL # So   [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN
+06FF          ; AL # Lo       ARABIC LETTER HEH WITH INVERTED V
+0700..070D    ; AL # Po  [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS
+070E          ; AL # Cn       <reserved-070E>
+0710          ; AL # Lo       SYRIAC LETTER ALAPH
+0712..072F    ; AL # Lo  [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH
+074B..074C    ; AL # Cn   [2] <reserved-074B>..<reserved-074C>
+074D..074F    ; AL # Lo   [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE
+0750..077F    ; AL # Cn  [48] <reserved-0750>..<reserved-077F>
+0780..07A5    ; AL # Lo  [38] THAANA LETTER HAA..THAANA LETTER WAAVU
+07B1          ; AL # Lo       THAANA LETTER NAA
+07B2..07BF    ; AL # Cn  [14] <reserved-07B2>..<reserved-07BF>
+FB50..FBB1    ; AL # Lo  [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBB2..FBD2    ; AL # Cn  [33] <reserved-FBB2>..<reserved-FBD2>
+FBD3..FD3D    ; AL # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD40..FD4F    ; AL # Cn  [16] <reserved-FD40>..<reserved-FD4F>
+FD50..FD8F    ; AL # Lo  [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD90..FD91    ; AL # Cn   [2] <reserved-FD90>..<reserved-FD91>
+FD92..FDC7    ; AL # Lo  [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDC8..FDCF    ; AL # Cn   [8] <reserved-FDC8>..<reserved-FDCF>
+FDF0..FDFB    ; AL # Lo  [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU
+FDFC          ; AL # Sc       RIAL SIGN
+FDFE..FDFF    ; AL # Cn   [2] <reserved-FDFE>..<reserved-FDFF>
+FE70..FE74    ; AL # Lo   [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM
+FE75          ; AL # Cn       <reserved-FE75>
+FE76..FEFC    ; AL # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+FEFD..FEFE    ; AL # Cn   [2] <reserved-FEFD>..<reserved-FEFE>
+
+# Total code points: 1136
+
+# ================================================
+
+# Bidi_Class=Left_To_Right_Override
+
+202D          ; LRO # Cf       LEFT-TO-RIGHT OVERRIDE
+
+# Total code points: 1
+
+# ================================================
+
+# Bidi_Class=Right_To_Left_Override
+
+202E          ; RLO # Cf       RIGHT-TO-LEFT OVERRIDE
+
+# Total code points: 1
+
+# ================================================
+
+# Bidi_Class=Left_To_Right_Embedding
+
+202A          ; LRE # Cf       LEFT-TO-RIGHT EMBEDDING
+
+# Total code points: 1
+
+# ================================================
+
+# Bidi_Class=Right_To_Left_Embedding
+
+202B          ; RLE # Cf       RIGHT-TO-LEFT EMBEDDING
+
+# Total code points: 1
+
+# ================================================
+
+# Bidi_Class=Pop_Directional_Format
+
+202C          ; PDF # Cf       POP DIRECTIONAL FORMATTING
+
+# Total code points: 1
diff --git a/gen.tab/unidata/extracted/DerivedDecompositionType.txt b/gen.tab/unidata/extracted/DerivedDecompositionType.txt
new file mode 100644 (file)
index 0000000..7b79695
--- /dev/null
@@ -0,0 +1,933 @@
+# DerivedDecompositionType-4.0.1.txt
+# Date: 2004-03-02, 02:41:56 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2004 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+
+# ================================================
+
+# Decomposition_Type (from UnicodeData.txt, field 5: see UCD.html)
+
+#  All code points not explicitly listed for Decomposition_Type
+#  have the value None.
+
+# ================================================
+
+00C0..00C5    ; Canonical # L&   [6] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER A WITH RING ABOVE
+00C7..00CF    ; Canonical # L&   [9] LATIN CAPITAL LETTER C WITH CEDILLA..LATIN CAPITAL LETTER I WITH DIAERESIS
+00D1..00D6    ; Canonical # L&   [6] LATIN CAPITAL LETTER N WITH TILDE..LATIN CAPITAL LETTER O WITH DIAERESIS
+00D9..00DD    ; Canonical # L&   [5] LATIN CAPITAL LETTER U WITH GRAVE..LATIN CAPITAL LETTER Y WITH ACUTE
+00E0..00E5    ; Canonical # L&   [6] LATIN SMALL LETTER A WITH GRAVE..LATIN SMALL LETTER A WITH RING ABOVE
+00E7..00EF    ; Canonical # L&   [9] LATIN SMALL LETTER C WITH CEDILLA..LATIN SMALL LETTER I WITH DIAERESIS
+00F1..00F6    ; Canonical # L&   [6] LATIN SMALL LETTER N WITH TILDE..LATIN SMALL LETTER O WITH DIAERESIS
+00F9..00FD    ; Canonical # L&   [5] LATIN SMALL LETTER U WITH GRAVE..LATIN SMALL LETTER Y WITH ACUTE
+00FF..010F    ; Canonical # L&  [17] LATIN SMALL LETTER Y WITH DIAERESIS..LATIN SMALL LETTER D WITH CARON
+0112..0125    ; Canonical # L&  [20] LATIN CAPITAL LETTER E WITH MACRON..LATIN SMALL LETTER H WITH CIRCUMFLEX
+0128..0130    ; Canonical # L&   [9] LATIN CAPITAL LETTER I WITH TILDE..LATIN CAPITAL LETTER I WITH DOT ABOVE
+0134..0137    ; Canonical # L&   [4] LATIN CAPITAL LETTER J WITH CIRCUMFLEX..LATIN SMALL LETTER K WITH CEDILLA
+0139..013E    ; Canonical # L&   [6] LATIN CAPITAL LETTER L WITH ACUTE..LATIN SMALL LETTER L WITH CARON
+0143..0148    ; Canonical # L&   [6] LATIN CAPITAL LETTER N WITH ACUTE..LATIN SMALL LETTER N WITH CARON
+014C..0151    ; Canonical # L&   [6] LATIN CAPITAL LETTER O WITH MACRON..LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0154..0165    ; Canonical # L&  [18] LATIN CAPITAL LETTER R WITH ACUTE..LATIN SMALL LETTER T WITH CARON
+0168..017E    ; Canonical # L&  [23] LATIN CAPITAL LETTER U WITH TILDE..LATIN SMALL LETTER Z WITH CARON
+01A0..01A1    ; Canonical # L&   [2] LATIN CAPITAL LETTER O WITH HORN..LATIN SMALL LETTER O WITH HORN
+01AF..01B0    ; Canonical # L&   [2] LATIN CAPITAL LETTER U WITH HORN..LATIN SMALL LETTER U WITH HORN
+01CD..01DC    ; Canonical # L&  [16] LATIN CAPITAL LETTER A WITH CARON..LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+01DE..01E3    ; Canonical # L&   [6] LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON..LATIN SMALL LETTER AE WITH MACRON
+01E6..01F0    ; Canonical # L&  [11] LATIN CAPITAL LETTER G WITH CARON..LATIN SMALL LETTER J WITH CARON
+01F4..01F5    ; Canonical # L&   [2] LATIN CAPITAL LETTER G WITH ACUTE..LATIN SMALL LETTER G WITH ACUTE
+01F8..021B    ; Canonical # L&  [36] LATIN CAPITAL LETTER N WITH GRAVE..LATIN SMALL LETTER T WITH COMMA BELOW
+021E..021F    ; Canonical # L&   [2] LATIN CAPITAL LETTER H WITH CARON..LATIN SMALL LETTER H WITH CARON
+0226..0233    ; Canonical # L&  [14] LATIN CAPITAL LETTER A WITH DOT ABOVE..LATIN SMALL LETTER Y WITH MACRON
+0340..0341    ; Canonical # Mn   [2] COMBINING GRAVE TONE MARK..COMBINING ACUTE TONE MARK
+0343..0344    ; Canonical # Mn   [2] COMBINING GREEK KORONIS..COMBINING GREEK DIALYTIKA TONOS
+0374          ; Canonical # Sk       GREEK NUMERAL SIGN
+037E          ; Canonical # Po       GREEK QUESTION MARK
+0385          ; Canonical # Sk       GREEK DIALYTIKA TONOS
+0386          ; Canonical # L&       GREEK CAPITAL LETTER ALPHA WITH TONOS
+0387          ; Canonical # Po       GREEK ANO TELEIA
+0388..038A    ; Canonical # L&   [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038C          ; Canonical # L&       GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E..0390    ; Canonical # L&   [3] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+03AA..03B0    ; Canonical # L&   [7] GREEK CAPITAL LETTER IOTA WITH DIALYTIKA..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+03CA..03CE    ; Canonical # L&   [5] GREEK SMALL LETTER IOTA WITH DIALYTIKA..GREEK SMALL LETTER OMEGA WITH TONOS
+03D3..03D4    ; Canonical # L&   [2] GREEK UPSILON WITH ACUTE AND HOOK SYMBOL..GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+0400..0401    ; Canonical # L&   [2] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC CAPITAL LETTER IO
+0403          ; Canonical # L&       CYRILLIC CAPITAL LETTER GJE
+0407          ; Canonical # L&       CYRILLIC CAPITAL LETTER YI
+040C..040E    ; Canonical # L&   [3] CYRILLIC CAPITAL LETTER KJE..CYRILLIC CAPITAL LETTER SHORT U
+0419          ; Canonical # L&       CYRILLIC CAPITAL LETTER SHORT I
+0439          ; Canonical # L&       CYRILLIC SMALL LETTER SHORT I
+0450..0451    ; Canonical # L&   [2] CYRILLIC SMALL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER IO
+0453          ; Canonical # L&       CYRILLIC SMALL LETTER GJE
+0457          ; Canonical # L&       CYRILLIC SMALL LETTER YI
+045C..045E    ; Canonical # L&   [3] CYRILLIC SMALL LETTER KJE..CYRILLIC SMALL LETTER SHORT U
+0476..0477    ; Canonical # L&   [2] CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT..CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
+04C1..04C2    ; Canonical # L&   [2] CYRILLIC CAPITAL LETTER ZHE WITH BREVE..CYRILLIC SMALL LETTER ZHE WITH BREVE
+04D0..04D3    ; Canonical # L&   [4] CYRILLIC CAPITAL LETTER A WITH BREVE..CYRILLIC SMALL LETTER A WITH DIAERESIS
+04D6..04D7    ; Canonical # L&   [2] CYRILLIC CAPITAL LETTER IE WITH BREVE..CYRILLIC SMALL LETTER IE WITH BREVE
+04DA..04DF    ; Canonical # L&   [6] CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS..CYRILLIC SMALL LETTER ZE WITH DIAERESIS
+04E2..04E7    ; Canonical # L&   [6] CYRILLIC CAPITAL LETTER I WITH MACRON..CYRILLIC SMALL LETTER O WITH DIAERESIS
+04EA..04F5    ; Canonical # L&  [12] CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS..CYRILLIC SMALL LETTER CHE WITH DIAERESIS
+04F8..04F9    ; Canonical # L&   [2] CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS..CYRILLIC SMALL LETTER YERU WITH DIAERESIS
+0622..0626    ; Canonical # Lo   [5] ARABIC LETTER ALEF WITH MADDA ABOVE..ARABIC LETTER YEH WITH HAMZA ABOVE
+06C0          ; Canonical # Lo       ARABIC LETTER HEH WITH YEH ABOVE
+06C2          ; Canonical # Lo       ARABIC LETTER HEH GOAL WITH HAMZA ABOVE
+06D3          ; Canonical # Lo       ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+0929          ; Canonical # Lo       DEVANAGARI LETTER NNNA
+0931          ; Canonical # Lo       DEVANAGARI LETTER RRA
+0934          ; Canonical # Lo       DEVANAGARI LETTER LLLA
+0958..095F    ; Canonical # Lo   [8] DEVANAGARI LETTER QA..DEVANAGARI LETTER YYA
+09CB..09CC    ; Canonical # Mc   [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
+09DC..09DD    ; Canonical # Lo   [2] BENGALI LETTER RRA..BENGALI LETTER RHA
+09DF          ; Canonical # Lo       BENGALI LETTER YYA
+0A33          ; Canonical # Lo       GURMUKHI LETTER LLA
+0A36          ; Canonical # Lo       GURMUKHI LETTER SHA
+0A59..0A5B    ; Canonical # Lo   [3] GURMUKHI LETTER KHHA..GURMUKHI LETTER ZA
+0A5E          ; Canonical # Lo       GURMUKHI LETTER FA
+0B48          ; Canonical # Mc       ORIYA VOWEL SIGN AI
+0B4B..0B4C    ; Canonical # Mc   [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
+0B5C..0B5D    ; Canonical # Lo   [2] ORIYA LETTER RRA..ORIYA LETTER RHA
+0B94          ; Canonical # Lo       TAMIL LETTER AU
+0BCA..0BCC    ; Canonical # Mc   [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
+0C48          ; Canonical # Mn       TELUGU VOWEL SIGN AI
+0CC0          ; Canonical # Mc       KANNADA VOWEL SIGN II
+0CC7..0CC8    ; Canonical # Mc   [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
+0CCA..0CCB    ; Canonical # Mc   [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
+0D4A..0D4C    ; Canonical # Mc   [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
+0DDA          ; Canonical # Mc       SINHALA VOWEL SIGN DIGA KOMBUVA
+0DDC..0DDE    ; Canonical # Mc   [3] SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA
+0F43          ; Canonical # Lo       TIBETAN LETTER GHA
+0F4D          ; Canonical # Lo       TIBETAN LETTER DDHA
+0F52          ; Canonical # Lo       TIBETAN LETTER DHA
+0F57          ; Canonical # Lo       TIBETAN LETTER BHA
+0F5C          ; Canonical # Lo       TIBETAN LETTER DZHA
+0F69          ; Canonical # Lo       TIBETAN LETTER KSSA
+0F73          ; Canonical # Mn       TIBETAN VOWEL SIGN II
+0F75..0F76    ; Canonical # Mn   [2] TIBETAN VOWEL SIGN UU..TIBETAN VOWEL SIGN VOCALIC R
+0F78          ; Canonical # Mn       TIBETAN VOWEL SIGN VOCALIC L
+0F81          ; Canonical # Mn       TIBETAN VOWEL SIGN REVERSED II
+0F93          ; Canonical # Mn       TIBETAN SUBJOINED LETTER GHA
+0F9D          ; Canonical # Mn       TIBETAN SUBJOINED LETTER DDHA
+0FA2          ; Canonical # Mn       TIBETAN SUBJOINED LETTER DHA
+0FA7          ; Canonical # Mn       TIBETAN SUBJOINED LETTER BHA
+0FAC          ; Canonical # Mn       TIBETAN SUBJOINED LETTER DZHA
+0FB9          ; Canonical # Mn       TIBETAN SUBJOINED LETTER KSSA
+1026          ; Canonical # Lo       MYANMAR LETTER UU
+1E00..1E99    ; Canonical # L& [154] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH RING ABOVE
+1E9B          ; Canonical # L&       LATIN SMALL LETTER LONG S WITH DOT ABOVE
+1EA0..1EF9    ; Canonical # L&  [90] LATIN CAPITAL LETTER A WITH DOT BELOW..LATIN SMALL LETTER Y WITH TILDE
+1F00..1F15    ; Canonical # L&  [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18..1F1D    ; Canonical # L&   [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20..1F45    ; Canonical # L&  [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48..1F4D    ; Canonical # L&   [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50..1F57    ; Canonical # L&   [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59          ; Canonical # L&       GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B          ; Canonical # L&       GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D          ; Canonical # L&       GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F..1F7D    ; Canonical # L&  [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA
+1F80..1FB4    ; Canonical # L&  [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6..1FBC    ; Canonical # L&   [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBE          ; Canonical # L&       GREEK PROSGEGRAMMENI
+1FC1          ; Canonical # Sk       GREEK DIALYTIKA AND PERISPOMENI
+1FC2..1FC4    ; Canonical # L&   [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6..1FCC    ; Canonical # L&   [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FCD..1FCF    ; Canonical # Sk   [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI
+1FD0..1FD3    ; Canonical # L&   [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6..1FDB    ; Canonical # L&   [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FDD..1FDF    ; Canonical # Sk   [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI
+1FE0..1FEC    ; Canonical # L&  [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
+1FED..1FEF    ; Canonical # Sk   [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA
+1FF2..1FF4    ; Canonical # L&   [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6..1FFC    ; Canonical # L&   [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+1FFD          ; Canonical # Sk       GREEK OXIA
+2000..2001    ; Canonical # Zs   [2] EN QUAD..EM QUAD
+2126          ; Canonical # L&       OHM SIGN
+212A..212B    ; Canonical # L&   [2] KELVIN SIGN..ANGSTROM SIGN
+219A..219B    ; Canonical # Sm   [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE
+21AE          ; Canonical # Sm       LEFT RIGHT ARROW WITH STROKE
+21CD          ; Canonical # So       LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE..21CF    ; Canonical # Sm   [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE
+2204          ; Canonical # Sm       THERE DOES NOT EXIST
+2209          ; Canonical # Sm       NOT AN ELEMENT OF
+220C          ; Canonical # Sm       DOES NOT CONTAIN AS MEMBER
+2224          ; Canonical # Sm       DOES NOT DIVIDE
+2226          ; Canonical # Sm       NOT PARALLEL TO
+2241          ; Canonical # Sm       NOT TILDE
+2244          ; Canonical # Sm       NOT ASYMPTOTICALLY EQUAL TO
+2247          ; Canonical # Sm       NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+2249          ; Canonical # Sm       NOT ALMOST EQUAL TO
+2260          ; Canonical # Sm       NOT EQUAL TO
+2262          ; Canonical # Sm       NOT IDENTICAL TO
+226D..2271    ; Canonical # Sm   [5] NOT EQUIVALENT TO..NEITHER GREATER-THAN NOR EQUAL TO
+2274..2275    ; Canonical # Sm   [2] NEITHER LESS-THAN NOR EQUIVALENT TO..NEITHER GREATER-THAN NOR EQUIVALENT TO
+2278..2279    ; Canonical # Sm   [2] NEITHER LESS-THAN NOR GREATER-THAN..NEITHER GREATER-THAN NOR LESS-THAN
+2280..2281    ; Canonical # Sm   [2] DOES NOT PRECEDE..DOES NOT SUCCEED
+2284..2285    ; Canonical # Sm   [2] NOT A SUBSET OF..NOT A SUPERSET OF
+2288..2289    ; Canonical # Sm   [2] NEITHER A SUBSET OF NOR EQUAL TO..NEITHER A SUPERSET OF NOR EQUAL TO
+22AC..22AF    ; Canonical # Sm   [4] DOES NOT PROVE..NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+22E0..22E3    ; Canonical # Sm   [4] DOES NOT PRECEDE OR EQUAL..NOT SQUARE ORIGINAL OF OR EQUAL TO
+22EA..22ED    ; Canonical # Sm   [4] NOT NORMAL SUBGROUP OF..DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+2329          ; Canonical # Ps       LEFT-POINTING ANGLE BRACKET
+232A          ; Canonical # Pe       RIGHT-POINTING ANGLE BRACKET
+2ADC          ; Canonical # Sm       FORKING
+304C          ; Canonical # Lo       HIRAGANA LETTER GA
+304E          ; Canonical # Lo       HIRAGANA LETTER GI
+3050          ; Canonical # Lo       HIRAGANA LETTER GU
+3052          ; Canonical # Lo       HIRAGANA LETTER GE
+3054          ; Canonical # Lo       HIRAGANA LETTER GO
+3056          ; Canonical # Lo       HIRAGANA LETTER ZA
+3058          ; Canonical # Lo       HIRAGANA LETTER ZI
+305A          ; Canonical # Lo       HIRAGANA LETTER ZU
+305C          ; Canonical # Lo       HIRAGANA LETTER ZE
+305E          ; Canonical # Lo       HIRAGANA LETTER ZO
+3060          ; Canonical # Lo       HIRAGANA LETTER DA
+3062          ; Canonical # Lo       HIRAGANA LETTER DI
+3065          ; Canonical # Lo       HIRAGANA LETTER DU
+3067          ; Canonical # Lo       HIRAGANA LETTER DE
+3069          ; Canonical # Lo       HIRAGANA LETTER DO
+3070..3071    ; Canonical # Lo   [2] HIRAGANA LETTER BA..HIRAGANA LETTER PA
+3073..3074    ; Canonical # Lo   [2] HIRAGANA LETTER BI..HIRAGANA LETTER PI
+3076..3077    ; Canonical # Lo   [2] HIRAGANA LETTER BU..HIRAGANA LETTER PU
+3079..307A    ; Canonical # Lo   [2] HIRAGANA LETTER BE..HIRAGANA LETTER PE
+307C..307D    ; Canonical # Lo   [2] HIRAGANA LETTER BO..HIRAGANA LETTER PO
+3094          ; Canonical # Lo       HIRAGANA LETTER VU
+309E          ; Canonical # Lm       HIRAGANA VOICED ITERATION MARK
+30AC          ; Canonical # Lo       KATAKANA LETTER GA
+30AE          ; Canonical # Lo       KATAKANA LETTER GI
+30B0          ; Canonical # Lo       KATAKANA LETTER GU
+30B2          ; Canonical # Lo       KATAKANA LETTER GE
+30B4          ; Canonical # Lo       KATAKANA LETTER GO
+30B6          ; Canonical # Lo       KATAKANA LETTER ZA
+30B8          ; Canonical # Lo       KATAKANA LETTER ZI
+30BA          ; Canonical # Lo       KATAKANA LETTER ZU
+30BC          ; Canonical # Lo       KATAKANA LETTER ZE
+30BE          ; Canonical # Lo       KATAKANA LETTER ZO
+30C0          ; Canonical # Lo       KATAKANA LETTER DA
+30C2          ; Canonical # Lo       KATAKANA LETTER DI
+30C5          ; Canonical # Lo       KATAKANA LETTER DU
+30C7          ; Canonical # Lo       KATAKANA LETTER DE
+30C9          ; Canonical # Lo       KATAKANA LETTER DO
+30D0..30D1    ; Canonical # Lo   [2] KATAKANA LETTER BA..KATAKANA LETTER PA
+30D3..30D4    ; Canonical # Lo   [2] KATAKANA LETTER BI..KATAKANA LETTER PI
+30D6..30D7    ; Canonical # Lo   [2] KATAKANA LETTER BU..KATAKANA LETTER PU
+30D9..30DA    ; Canonical # Lo   [2] KATAKANA LETTER BE..KATAKANA LETTER PE
+30DC..30DD    ; Canonical # Lo   [2] KATAKANA LETTER BO..KATAKANA LETTER PO
+30F4          ; Canonical # Lo       KATAKANA LETTER VU
+30F7..30FA    ; Canonical # Lo   [4] KATAKANA LETTER VA..KATAKANA LETTER VO
+30FE          ; Canonical # Lm       KATAKANA VOICED ITERATION MARK
+AC00..D7A3    ; Canonical # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
+F900..FA0D    ; Canonical # Lo [270] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA0D
+FA10          ; Canonical # Lo       CJK COMPATIBILITY IDEOGRAPH-FA10
+FA12          ; Canonical # Lo       CJK COMPATIBILITY IDEOGRAPH-FA12
+FA15..FA1E    ; Canonical # Lo  [10] CJK COMPATIBILITY IDEOGRAPH-FA15..CJK COMPATIBILITY IDEOGRAPH-FA1E
+FA20          ; Canonical # Lo       CJK COMPATIBILITY IDEOGRAPH-FA20
+FA22          ; Canonical # Lo       CJK COMPATIBILITY IDEOGRAPH-FA22
+FA25..FA26    ; Canonical # Lo   [2] CJK COMPATIBILITY IDEOGRAPH-FA25..CJK COMPATIBILITY IDEOGRAPH-FA26
+FA2A..FA2D    ; Canonical # Lo   [4] CJK COMPATIBILITY IDEOGRAPH-FA2A..CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30..FA6A    ; Canonical # Lo  [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A
+FB1D          ; Canonical # Lo       HEBREW LETTER YOD WITH HIRIQ
+FB1F          ; Canonical # Lo       HEBREW LIGATURE YIDDISH YOD YOD PATAH
+FB2A..FB36    ; Canonical # Lo  [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH
+FB38..FB3C    ; Canonical # Lo   [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH
+FB3E          ; Canonical # Lo       HEBREW LETTER MEM WITH DAGESH
+FB40..FB41    ; Canonical # Lo   [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH
+FB43..FB44    ; Canonical # Lo   [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
+FB46..FB4E    ; Canonical # Lo   [9] HEBREW LETTER TSADI WITH DAGESH..HEBREW LETTER PE WITH RAFE
+1D15E..1D164  ; Canonical # So   [7] MUSICAL SYMBOL HALF NOTE..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+1D1BB..1D1C0  ; Canonical # So   [6] MUSICAL SYMBOL MINIMA..MUSICAL SYMBOL FUSA BLACK
+2F800..2FA1D  ; Canonical # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+
+# Total code points: 13098
+
+# ================================================
+
+00A8          ; Compat # Sk       DIAERESIS
+00AF          ; Compat # Sk       MACRON
+00B4          ; Compat # Sk       ACUTE ACCENT
+00B5          ; Compat # L&       MICRO SIGN
+00B8          ; Compat # Sk       CEDILLA
+0132..0133    ; Compat # L&   [2] LATIN CAPITAL LIGATURE IJ..LATIN SMALL LIGATURE IJ
+013F..0140    ; Compat # L&   [2] LATIN CAPITAL LETTER L WITH MIDDLE DOT..LATIN SMALL LETTER L WITH MIDDLE DOT
+0149          ; Compat # L&       LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+017F          ; Compat # L&       LATIN SMALL LETTER LONG S
+01C4..01CC    ; Compat # L&   [9] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER NJ
+01F1..01F3    ; Compat # L&   [3] LATIN CAPITAL LETTER DZ..LATIN SMALL LETTER DZ
+02D8..02DD    ; Compat # Sk   [6] BREVE..DOUBLE ACUTE ACCENT
+037A          ; Compat # Lm       GREEK YPOGEGRAMMENI
+0384          ; Compat # Sk       GREEK TONOS
+03D0..03D2    ; Compat # L&   [3] GREEK BETA SYMBOL..GREEK UPSILON WITH HOOK SYMBOL
+03D5..03D6    ; Compat # L&   [2] GREEK PHI SYMBOL..GREEK PI SYMBOL
+03F0..03F2    ; Compat # L&   [3] GREEK KAPPA SYMBOL..GREEK LUNATE SIGMA SYMBOL
+03F4..03F5    ; Compat # L&   [2] GREEK CAPITAL THETA SYMBOL..GREEK LUNATE EPSILON SYMBOL
+03F9          ; Compat # L&       GREEK CAPITAL LUNATE SIGMA SYMBOL
+0587          ; Compat # L&       ARMENIAN SMALL LIGATURE ECH YIWN
+0675..0678    ; Compat # Lo   [4] ARABIC LETTER HIGH HAMZA ALEF..ARABIC LETTER HIGH HAMZA YEH
+0E33          ; Compat # Lo       THAI CHARACTER SARA AM
+0EB3          ; Compat # Lo       LAO VOWEL SIGN AM
+0EDC..0EDD    ; Compat # Lo   [2] LAO HO NO..LAO HO MO
+0F77          ; Compat # Mn       TIBETAN VOWEL SIGN VOCALIC RR
+0F79          ; Compat # Mn       TIBETAN VOWEL SIGN VOCALIC LL
+1E9A          ; Compat # L&       LATIN SMALL LETTER A WITH RIGHT HALF RING
+1FBD          ; Compat # Sk       GREEK KORONIS
+1FBF..1FC0    ; Compat # Sk   [2] GREEK PSILI..GREEK PERISPOMENI
+1FFE          ; Compat # Sk       GREEK DASIA
+2002..2006    ; Compat # Zs   [5] EN SPACE..SIX-PER-EM SPACE
+2008..200A    ; Compat # Zs   [3] PUNCTUATION SPACE..HAIR SPACE
+2017          ; Compat # Po       DOUBLE LOW LINE
+2024..2026    ; Compat # Po   [3] ONE DOT LEADER..HORIZONTAL ELLIPSIS
+2033..2034    ; Compat # Po   [2] DOUBLE PRIME..TRIPLE PRIME
+2036..2037    ; Compat # Po   [2] REVERSED DOUBLE PRIME..REVERSED TRIPLE PRIME
+203C          ; Compat # Po       DOUBLE EXCLAMATION MARK
+203E          ; Compat # Po       OVERLINE
+2047..2049    ; Compat # Po   [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK
+2057          ; Compat # Po       QUADRUPLE PRIME
+205F          ; Compat # Zs       MEDIUM MATHEMATICAL SPACE
+20A8          ; Compat # Sc       RUPEE SIGN
+2100..2101    ; Compat # So   [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT
+2103          ; Compat # So       DEGREE CELSIUS
+2105..2106    ; Compat # So   [2] CARE OF..CADA UNA
+2107          ; Compat # L&       EULER CONSTANT
+2109          ; Compat # So       DEGREE FAHRENHEIT
+2116          ; Compat # So       NUMERO SIGN
+2121          ; Compat # So       TELEPHONE SIGN
+2135..2138    ; Compat # Lo   [4] ALEF SYMBOL..DALET SYMBOL
+213B          ; Compat # So       FACSIMILE SIGN
+2160..217F    ; Compat # Nl  [32] ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL ONE THOUSAND
+222C..222D    ; Compat # Sm   [2] DOUBLE INTEGRAL..TRIPLE INTEGRAL
+222F..2230    ; Compat # Sm   [2] SURFACE INTEGRAL..VOLUME INTEGRAL
+2474..249B    ; Compat # No  [40] PARENTHESIZED DIGIT ONE..NUMBER TWENTY FULL STOP
+249C..24B5    ; Compat # So  [26] PARENTHESIZED LATIN SMALL LETTER A..PARENTHESIZED LATIN SMALL LETTER Z
+2A0C          ; Compat # Sm       QUADRUPLE INTEGRAL OPERATOR
+2A74..2A76    ; Compat # Sm   [3] DOUBLE COLON EQUAL..THREE CONSECUTIVE EQUALS SIGNS
+2E9F          ; Compat # So       CJK RADICAL MOTHER
+2EF3          ; Compat # So       CJK RADICAL C-SIMPLIFIED TURTLE
+2F00..2FD5    ; Compat # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE
+3036          ; Compat # So       CIRCLED POSTAL MARK
+3038..303A    ; Compat # Nl   [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
+309B..309C    ; Compat # Sk   [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+3131..318E    ; Compat # Lo  [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE
+3200..321E    ; Compat # So  [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU
+3220..3229    ; Compat # No  [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN
+322A..3243    ; Compat # So  [26] PARENTHESIZED IDEOGRAPH MOON..PARENTHESIZED IDEOGRAPH REACH
+32C0..32CB    ; Compat # So  [12] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER
+3358..3370    ; Compat # So  [25] IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO..IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR
+33E0..33FE    ; Compat # So  [31] IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE..IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE
+FB00..FB06    ; Compat # L&   [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FB13..FB17    ; Compat # L&   [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+FB4F          ; Compat # Lo       HEBREW LIGATURE ALEF LAMED
+FE49..FE4C    ; Compat # Po   [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE
+FE4D..FE4F    ; Compat # Pc   [3] DASHED LOW LINE..WAVY LOW LINE
+
+# Total code points: 673
+
+# ================================================
+
+2102          ; Font # L&       DOUBLE-STRUCK CAPITAL C
+210A..2113    ; Font # L&  [10] SCRIPT SMALL G..SCRIPT SMALL L
+2115          ; Font # L&       DOUBLE-STRUCK CAPITAL N
+2119..211D    ; Font # L&   [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+2124          ; Font # L&       DOUBLE-STRUCK CAPITAL Z
+2128          ; Font # L&       BLACK-LETTER CAPITAL Z
+212C..212D    ; Font # L&   [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C
+212F..2131    ; Font # L&   [3] SCRIPT SMALL E..SCRIPT CAPITAL F
+2133..2134    ; Font # L&   [2] SCRIPT CAPITAL M..SCRIPT SMALL O
+2139          ; Font # L&       INFORMATION SOURCE
+213D..213F    ; Font # L&   [3] DOUBLE-STRUCK SMALL GAMMA..DOUBLE-STRUCK CAPITAL PI
+2140          ; Font # Sm       DOUBLE-STRUCK N-ARY SUMMATION
+2145..2149    ; Font # L&   [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
+FB20..FB28    ; Font # Lo   [9] HEBREW LETTER ALTERNATIVE AYIN..HEBREW LETTER WIDE TAV
+FB29          ; Font # Sm       HEBREW LETTER ALTERNATIVE PLUS SIGN
+1D400..1D454  ; Font # L&  [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D49C  ; Font # L&  [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F  ; Font # L&   [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2         ; Font # L&       MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6  ; Font # L&   [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC  ; Font # L&   [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B9  ; Font # L&  [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BB         ; Font # L&       MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3  ; Font # L&   [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D505  ; Font # L&  [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A  ; Font # L&   [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514  ; Font # L&   [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C  ; Font # L&   [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E..1D539  ; Font # L&  [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E  ; Font # L&   [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544  ; Font # L&   [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546         ; Font # L&       MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550  ; Font # L&   [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552..1D6A3  ; Font # L& [338] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL MONOSPACE SMALL Z
+1D6A8..1D6C0  ; Font # L&  [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C1         ; Font # Sm       MATHEMATICAL BOLD NABLA
+1D6C2..1D6DA  ; Font # L&  [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DB         ; Font # Sm       MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+1D6DC..1D6FA  ; Font # L&  [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FB         ; Font # Sm       MATHEMATICAL ITALIC NABLA
+1D6FC..1D714  ; Font # L&  [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D715         ; Font # Sm       MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+1D716..1D734  ; Font # L&  [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D735         ; Font # Sm       MATHEMATICAL BOLD ITALIC NABLA
+1D736..1D74E  ; Font # L&  [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D74F         ; Font # Sm       MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+1D750..1D76E  ; Font # L&  [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D76F         ; Font # Sm       MATHEMATICAL SANS-SERIF BOLD NABLA
+1D770..1D788  ; Font # L&  [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D789         ; Font # Sm       MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+1D78A..1D7A8  ; Font # L&  [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7A9         ; Font # Sm       MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
+1D7AA..1D7C2  ; Font # L&  [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C3         ; Font # Sm       MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+1D7C4..1D7C9  ; Font # L&   [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL
+1D7CE..1D7FF  ; Font # Nd  [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
+
+# Total code points: 1038
+
+# ================================================
+
+00A0          ; Nobreak # Zs       NO-BREAK SPACE
+0F0C          ; Nobreak # Po       TIBETAN MARK DELIMITER TSHEG BSTAR
+2007          ; Nobreak # Zs       FIGURE SPACE
+2011          ; Nobreak # Pd       NON-BREAKING HYPHEN
+202F          ; Nobreak # Zs       NARROW NO-BREAK SPACE
+
+# Total code points: 5
+
+# ================================================
+
+FB54          ; Initial # Lo       ARABIC LETTER BEEH INITIAL FORM
+FB58          ; Initial # Lo       ARABIC LETTER PEH INITIAL FORM
+FB5C          ; Initial # Lo       ARABIC LETTER BEHEH INITIAL FORM
+FB60          ; Initial # Lo       ARABIC LETTER TTEHEH INITIAL FORM
+FB64          ; Initial # Lo       ARABIC LETTER TEHEH INITIAL FORM
+FB68          ; Initial # Lo       ARABIC LETTER TTEH INITIAL FORM
+FB6C          ; Initial # Lo       ARABIC LETTER VEH INITIAL FORM
+FB70          ; Initial # Lo       ARABIC LETTER PEHEH INITIAL FORM
+FB74          ; Initial # Lo       ARABIC LETTER DYEH INITIAL FORM
+FB78          ; Initial # Lo       ARABIC LETTER NYEH INITIAL FORM
+FB7C          ; Initial # Lo       ARABIC LETTER TCHEH INITIAL FORM
+FB80          ; Initial # Lo       ARABIC LETTER TCHEHEH INITIAL FORM
+FB90          ; Initial # Lo       ARABIC LETTER KEHEH INITIAL FORM
+FB94          ; Initial # Lo       ARABIC LETTER GAF INITIAL FORM
+FB98          ; Initial # Lo       ARABIC LETTER GUEH INITIAL FORM
+FB9C          ; Initial # Lo       ARABIC LETTER NGOEH INITIAL FORM
+FBA2          ; Initial # Lo       ARABIC LETTER RNOON INITIAL FORM
+FBA8          ; Initial # Lo       ARABIC LETTER HEH GOAL INITIAL FORM
+FBAC          ; Initial # Lo       ARABIC LETTER HEH DOACHASHMEE INITIAL FORM
+FBD5          ; Initial # Lo       ARABIC LETTER NG INITIAL FORM
+FBE6          ; Initial # Lo       ARABIC LETTER E INITIAL FORM
+FBE8          ; Initial # Lo       ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM
+FBF8          ; Initial # Lo       ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM
+FBFB          ; Initial # Lo       ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM
+FBFE          ; Initial # Lo       ARABIC LETTER FARSI YEH INITIAL FORM
+FC97..FCDE    ; Initial # Lo  [72] ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM..ARABIC LIGATURE YEH WITH HEH INITIAL FORM
+FD2D..FD33    ; Initial # Lo   [7] ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM..ARABIC LIGATURE TAH WITH MEEM INITIAL FORM
+FD50          ; Initial # Lo       ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
+FD52..FD57    ; Initial # Lo   [6] ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM..ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM
+FD59          ; Initial # Lo       ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM
+FD5C..FD5D    ; Initial # Lo   [2] ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM..ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM
+FD60..FD61    ; Initial # Lo   [2] ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM..ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM
+FD63          ; Initial # Lo       ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM
+FD65          ; Initial # Lo       ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM
+FD68          ; Initial # Lo       ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM
+FD6B          ; Initial # Lo       ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM
+FD6D          ; Initial # Lo       ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM
+FD70          ; Initial # Lo       ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM
+FD72..FD73    ; Initial # Lo   [2] ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM..ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM
+FD77          ; Initial # Lo       ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM
+FD7D          ; Initial # Lo       ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM
+FD83          ; Initial # Lo       ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM
+FD86          ; Initial # Lo       ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM
+FD88..FD8A    ; Initial # Lo   [3] ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM..ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM
+FD8C..FD8F    ; Initial # Lo   [4] ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92..FD95    ; Initial # Lo   [4] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM
+FD98          ; Initial # Lo       ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM
+FD9D          ; Initial # Lo       ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM
+FDB4..FDB5    ; Initial # Lo   [2] ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM..ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM
+FDB8          ; Initial # Lo       ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM
+FDBA          ; Initial # Lo       ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM
+FDC3..FDC5    ; Initial # Lo   [3] ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM
+FE8B          ; Initial # Lo       ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM
+FE91          ; Initial # Lo       ARABIC LETTER BEH INITIAL FORM
+FE97          ; Initial # Lo       ARABIC LETTER TEH INITIAL FORM
+FE9B          ; Initial # Lo       ARABIC LETTER THEH INITIAL FORM
+FE9F          ; Initial # Lo       ARABIC LETTER JEEM INITIAL FORM
+FEA3          ; Initial # Lo       ARABIC LETTER HAH INITIAL FORM
+FEA7          ; Initial # Lo       ARABIC LETTER KHAH INITIAL FORM
+FEB3          ; Initial # Lo       ARABIC LETTER SEEN INITIAL FORM
+FEB7          ; Initial # Lo       ARABIC LETTER SHEEN INITIAL FORM
+FEBB          ; Initial # Lo       ARABIC LETTER SAD INITIAL FORM
+FEBF          ; Initial # Lo       ARABIC LETTER DAD INITIAL FORM
+FEC3          ; Initial # Lo       ARABIC LETTER TAH INITIAL FORM
+FEC7          ; Initial # Lo       ARABIC LETTER ZAH INITIAL FORM
+FECB          ; Initial # Lo       ARABIC LETTER AIN INITIAL FORM
+FECF          ; Initial # Lo       ARABIC LETTER GHAIN INITIAL FORM
+FED3          ; Initial # Lo       ARABIC LETTER FEH INITIAL FORM
+FED7          ; Initial # Lo       ARABIC LETTER QAF INITIAL FORM
+FEDB          ; Initial # Lo       ARABIC LETTER KAF INITIAL FORM
+FEDF          ; Initial # Lo       ARABIC LETTER LAM INITIAL FORM
+FEE3          ; Initial # Lo       ARABIC LETTER MEEM INITIAL FORM
+FEE7          ; Initial # Lo       ARABIC LETTER NOON INITIAL FORM
+FEEB          ; Initial # Lo       ARABIC LETTER HEH INITIAL FORM
+FEF3          ; Initial # Lo       ARABIC LETTER YEH INITIAL FORM
+
+# Total code points: 171
+
+# ================================================
+
+FB55          ; Medial # Lo       ARABIC LETTER BEEH MEDIAL FORM
+FB59          ; Medial # Lo       ARABIC LETTER PEH MEDIAL FORM
+FB5D          ; Medial # Lo       ARABIC LETTER BEHEH MEDIAL FORM
+FB61          ; Medial # Lo       ARABIC LETTER TTEHEH MEDIAL FORM
+FB65          ; Medial # Lo       ARABIC LETTER TEHEH MEDIAL FORM
+FB69          ; Medial # Lo       ARABIC LETTER TTEH MEDIAL FORM
+FB6D          ; Medial # Lo       ARABIC LETTER VEH MEDIAL FORM
+FB71          ; Medial # Lo       ARABIC LETTER PEHEH MEDIAL FORM
+FB75          ; Medial # Lo       ARABIC LETTER DYEH MEDIAL FORM
+FB79          ; Medial # Lo       ARABIC LETTER NYEH MEDIAL FORM
+FB7D          ; Medial # Lo       ARABIC LETTER TCHEH MEDIAL FORM
+FB81          ; Medial # Lo       ARABIC LETTER TCHEHEH MEDIAL FORM
+FB91          ; Medial # Lo       ARABIC LETTER KEHEH MEDIAL FORM
+FB95          ; Medial # Lo       ARABIC LETTER GAF MEDIAL FORM
+FB99          ; Medial # Lo       ARABIC LETTER GUEH MEDIAL FORM
+FB9D          ; Medial # Lo       ARABIC LETTER NGOEH MEDIAL FORM
+FBA3          ; Medial # Lo       ARABIC LETTER RNOON MEDIAL FORM
+FBA9          ; Medial # Lo       ARABIC LETTER HEH GOAL MEDIAL FORM
+FBAD          ; Medial # Lo       ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM
+FBD6          ; Medial # Lo       ARABIC LETTER NG MEDIAL FORM
+FBE7          ; Medial # Lo       ARABIC LETTER E MEDIAL FORM
+FBE9          ; Medial # Lo       ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM
+FBFF          ; Medial # Lo       ARABIC LETTER FARSI YEH MEDIAL FORM
+FCDF..FCF4    ; Medial # Lo  [22] ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM..ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM
+FD34..FD3B    ; Medial # Lo   [8] ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM..ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM
+FE71          ; Medial # Lo       ARABIC TATWEEL WITH FATHATAN ABOVE
+FE77          ; Medial # Lo       ARABIC FATHA MEDIAL FORM
+FE79          ; Medial # Lo       ARABIC DAMMA MEDIAL FORM
+FE7B          ; Medial # Lo       ARABIC KASRA MEDIAL FORM
+FE7D          ; Medial # Lo       ARABIC SHADDA MEDIAL FORM
+FE7F          ; Medial # Lo       ARABIC SUKUN MEDIAL FORM
+FE8C          ; Medial # Lo       ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM
+FE92          ; Medial # Lo       ARABIC LETTER BEH MEDIAL FORM
+FE98          ; Medial # Lo       ARABIC LETTER TEH MEDIAL FORM
+FE9C          ; Medial # Lo       ARABIC LETTER THEH MEDIAL FORM
+FEA0          ; Medial # Lo       ARABIC LETTER JEEM MEDIAL FORM
+FEA4          ; Medial # Lo       ARABIC LETTER HAH MEDIAL FORM
+FEA8          ; Medial # Lo       ARABIC LETTER KHAH MEDIAL FORM
+FEB4          ; Medial # Lo       ARABIC LETTER SEEN MEDIAL FORM
+FEB8          ; Medial # Lo       ARABIC LETTER SHEEN MEDIAL FORM
+FEBC          ; Medial # Lo       ARABIC LETTER SAD MEDIAL FORM
+FEC0          ; Medial # Lo       ARABIC LETTER DAD MEDIAL FORM
+FEC4          ; Medial # Lo       ARABIC LETTER TAH MEDIAL FORM
+FEC8          ; Medial # Lo       ARABIC LETTER ZAH MEDIAL FORM
+FECC          ; Medial # Lo       ARABIC LETTER AIN MEDIAL FORM
+FED0          ; Medial # Lo       ARABIC LETTER GHAIN MEDIAL FORM
+FED4          ; Medial # Lo       ARABIC LETTER FEH MEDIAL FORM
+FED8          ; Medial # Lo       ARABIC LETTER QAF MEDIAL FORM
+FEDC          ; Medial # Lo       ARABIC LETTER KAF MEDIAL FORM
+FEE0          ; Medial # Lo       ARABIC LETTER LAM MEDIAL FORM
+FEE4          ; Medial # Lo       ARABIC LETTER MEEM MEDIAL FORM
+FEE8          ; Medial # Lo       ARABIC LETTER NOON MEDIAL FORM
+FEEC          ; Medial # Lo       ARABIC LETTER HEH MEDIAL FORM
+FEF4          ; Medial # Lo       ARABIC LETTER YEH MEDIAL FORM
+
+# Total code points: 82
+
+# ================================================
+
+FB51          ; Final # Lo       ARABIC LETTER ALEF WASLA FINAL FORM
+FB53          ; Final # Lo       ARABIC LETTER BEEH FINAL FORM
+FB57          ; Final # Lo       ARABIC LETTER PEH FINAL FORM
+FB5B          ; Final # Lo       ARABIC LETTER BEHEH FINAL FORM
+FB5F          ; Final # Lo       ARABIC LETTER TTEHEH FINAL FORM
+FB63          ; Final # Lo       ARABIC LETTER TEHEH FINAL FORM
+FB67          ; Final # Lo       ARABIC LETTER TTEH FINAL FORM
+FB6B          ; Final # Lo       ARABIC LETTER VEH FINAL FORM
+FB6F          ; Final # Lo       ARABIC LETTER PEHEH FINAL FORM
+FB73          ; Final # Lo       ARABIC LETTER DYEH FINAL FORM
+FB77          ; Final # Lo       ARABIC LETTER NYEH FINAL FORM
+FB7B          ; Final # Lo       ARABIC LETTER TCHEH FINAL FORM
+FB7F          ; Final # Lo       ARABIC LETTER TCHEHEH FINAL FORM
+FB83          ; Final # Lo       ARABIC LETTER DDAHAL FINAL FORM
+FB85          ; Final # Lo       ARABIC LETTER DAHAL FINAL FORM
+FB87          ; Final # Lo       ARABIC LETTER DUL FINAL FORM
+FB89          ; Final # Lo       ARABIC LETTER DDAL FINAL FORM
+FB8B          ; Final # Lo       ARABIC LETTER JEH FINAL FORM
+FB8D          ; Final # Lo       ARABIC LETTER RREH FINAL FORM
+FB8F          ; Final # Lo       ARABIC LETTER KEHEH FINAL FORM
+FB93          ; Final # Lo       ARABIC LETTER GAF FINAL FORM
+FB97          ; Final # Lo       ARABIC LETTER GUEH FINAL FORM
+FB9B          ; Final # Lo       ARABIC LETTER NGOEH FINAL FORM
+FB9F          ; Final # Lo       ARABIC LETTER NOON GHUNNA FINAL FORM
+FBA1          ; Final # Lo       ARABIC LETTER RNOON FINAL FORM
+FBA5          ; Final # Lo       ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM
+FBA7          ; Final # Lo       ARABIC LETTER HEH GOAL FINAL FORM
+FBAB          ; Final # Lo       ARABIC LETTER HEH DOACHASHMEE FINAL FORM
+FBAF          ; Final # Lo       ARABIC LETTER YEH BARREE FINAL FORM
+FBB1          ; Final # Lo       ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD4          ; Final # Lo       ARABIC LETTER NG FINAL FORM
+FBD8          ; Final # Lo       ARABIC LETTER U FINAL FORM
+FBDA          ; Final # Lo       ARABIC LETTER OE FINAL FORM
+FBDC          ; Final # Lo       ARABIC LETTER YU FINAL FORM
+FBDF          ; Final # Lo       ARABIC LETTER VE FINAL FORM
+FBE1          ; Final # Lo       ARABIC LETTER KIRGHIZ OE FINAL FORM
+FBE3          ; Final # Lo       ARABIC LETTER KIRGHIZ YU FINAL FORM
+FBE5          ; Final # Lo       ARABIC LETTER E FINAL FORM
+FBEB          ; Final # Lo       ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM
+FBED          ; Final # Lo       ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM
+FBEF          ; Final # Lo       ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM
+FBF1          ; Final # Lo       ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM
+FBF3          ; Final # Lo       ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM
+FBF5          ; Final # Lo       ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM
+FBF7          ; Final # Lo       ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM
+FBFA          ; Final # Lo       ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM
+FBFD          ; Final # Lo       ARABIC LETTER FARSI YEH FINAL FORM
+FC64..FC96    ; Final # Lo  [51] ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM..ARABIC LIGATURE YEH WITH YEH FINAL FORM
+FD11..FD2C    ; Final # Lo  [28] ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM..ARABIC LIGATURE DAD WITH REH FINAL FORM
+FD3C          ; Final # Lo       ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM
+FD51          ; Final # Lo       ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM
+FD58          ; Final # Lo       ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM
+FD5A..FD5B    ; Final # Lo   [2] ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM..ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM
+FD5E..FD5F    ; Final # Lo   [2] ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM..ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM
+FD62          ; Final # Lo       ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM
+FD64          ; Final # Lo       ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM
+FD66..FD67    ; Final # Lo   [2] ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM..ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM
+FD69..FD6A    ; Final # Lo   [2] ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM..ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM
+FD6C          ; Final # Lo       ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM
+FD6E..FD6F    ; Final # Lo   [2] ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM..ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM
+FD71          ; Final # Lo       ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM
+FD74..FD76    ; Final # Lo   [3] ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM..ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM
+FD78..FD7C    ; Final # Lo   [5] ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM..ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM
+FD7E..FD82    ; Final # Lo   [5] ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM..ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM
+FD84..FD85    ; Final # Lo   [2] ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM..ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM
+FD87          ; Final # Lo       ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM
+FD8B          ; Final # Lo       ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM
+FD96..FD97    ; Final # Lo   [2] ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM
+FD99..FD9C    ; Final # Lo   [4] ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM..ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM
+FD9E..FDB3    ; Final # Lo  [22] ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM..ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM
+FDB6..FDB7    ; Final # Lo   [2] ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM..ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM
+FDB9          ; Final # Lo       ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM
+FDBB..FDC2    ; Final # Lo   [8] ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM..ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM
+FDC6..FDC7    ; Final # Lo   [2] ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FE82          ; Final # Lo       ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
+FE84          ; Final # Lo       ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
+FE86          ; Final # Lo       ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM
+FE88          ; Final # Lo       ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM
+FE8A          ; Final # Lo       ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM
+FE8E          ; Final # Lo       ARABIC LETTER ALEF FINAL FORM
+FE90          ; Final # Lo       ARABIC LETTER BEH FINAL FORM
+FE94          ; Final # Lo       ARABIC LETTER TEH MARBUTA FINAL FORM
+FE96          ; Final # Lo       ARABIC LETTER TEH FINAL FORM
+FE9A          ; Final # Lo       ARABIC LETTER THEH FINAL FORM
+FE9E          ; Final # Lo       ARABIC LETTER JEEM FINAL FORM
+FEA2          ; Final # Lo       ARABIC LETTER HAH FINAL FORM
+FEA6          ; Final # Lo       ARABIC LETTER KHAH FINAL FORM
+FEAA          ; Final # Lo       ARABIC LETTER DAL FINAL FORM
+FEAC          ; Final # Lo       ARABIC LETTER THAL FINAL FORM
+FEAE          ; Final # Lo       ARABIC LETTER REH FINAL FORM
+FEB0          ; Final # Lo       ARABIC LETTER ZAIN FINAL FORM
+FEB2          ; Final # Lo       ARABIC LETTER SEEN FINAL FORM
+FEB6          ; Final # Lo       ARABIC LETTER SHEEN FINAL FORM
+FEBA          ; Final # Lo       ARABIC LETTER SAD FINAL FORM
+FEBE          ; Final # Lo       ARABIC LETTER DAD FINAL FORM
+FEC2          ; Final # Lo       ARABIC LETTER TAH FINAL FORM
+FEC6          ; Final # Lo       ARABIC LETTER ZAH FINAL FORM
+FECA          ; Final # Lo       ARABIC LETTER AIN FINAL FORM
+FECE          ; Final # Lo       ARABIC LETTER GHAIN FINAL FORM
+FED2          ; Final # Lo       ARABIC LETTER FEH FINAL FORM
+FED6          ; Final # Lo       ARABIC LETTER QAF FINAL FORM
+FEDA          ; Final # Lo       ARABIC LETTER KAF FINAL FORM
+FEDE          ; Final # Lo       ARABIC LETTER LAM FINAL FORM
+FEE2          ; Final # Lo       ARABIC LETTER MEEM FINAL FORM
+FEE6          ; Final # Lo       ARABIC LETTER NOON FINAL FORM
+FEEA          ; Final # Lo       ARABIC LETTER HEH FINAL FORM
+FEEE          ; Final # Lo       ARABIC LETTER WAW FINAL FORM
+FEF0          ; Final # Lo       ARABIC LETTER ALEF MAKSURA FINAL FORM
+FEF2          ; Final # Lo       ARABIC LETTER YEH FINAL FORM
+FEF6          ; Final # Lo       ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM
+FEF8          ; Final # Lo       ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM
+FEFA          ; Final # Lo       ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM
+FEFC          ; Final # Lo       ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+
+# Total code points: 240
+
+# ================================================
+
+FB50          ; Isolated # Lo       ARABIC LETTER ALEF WASLA ISOLATED FORM
+FB52          ; Isolated # Lo       ARABIC LETTER BEEH ISOLATED FORM
+FB56          ; Isolated # Lo       ARABIC LETTER PEH ISOLATED FORM
+FB5A          ; Isolated # Lo       ARABIC LETTER BEHEH ISOLATED FORM
+FB5E          ; Isolated # Lo       ARABIC LETTER TTEHEH ISOLATED FORM
+FB62          ; Isolated # Lo       ARABIC LETTER TEHEH ISOLATED FORM
+FB66          ; Isolated # Lo       ARABIC LETTER TTEH ISOLATED FORM
+FB6A          ; Isolated # Lo       ARABIC LETTER VEH ISOLATED FORM
+FB6E          ; Isolated # Lo       ARABIC LETTER PEHEH ISOLATED FORM
+FB72          ; Isolated # Lo       ARABIC LETTER DYEH ISOLATED FORM
+FB76          ; Isolated # Lo       ARABIC LETTER NYEH ISOLATED FORM
+FB7A          ; Isolated # Lo       ARABIC LETTER TCHEH ISOLATED FORM
+FB7E          ; Isolated # Lo       ARABIC LETTER TCHEHEH ISOLATED FORM
+FB82          ; Isolated # Lo       ARABIC LETTER DDAHAL ISOLATED FORM
+FB84          ; Isolated # Lo       ARABIC LETTER DAHAL ISOLATED FORM
+FB86          ; Isolated # Lo       ARABIC LETTER DUL ISOLATED FORM
+FB88          ; Isolated # Lo       ARABIC LETTER DDAL ISOLATED FORM
+FB8A          ; Isolated # Lo       ARABIC LETTER JEH ISOLATED FORM
+FB8C          ; Isolated # Lo       ARABIC LETTER RREH ISOLATED FORM
+FB8E          ; Isolated # Lo       ARABIC LETTER KEHEH ISOLATED FORM
+FB92          ; Isolated # Lo       ARABIC LETTER GAF ISOLATED FORM
+FB96          ; Isolated # Lo       ARABIC LETTER GUEH ISOLATED FORM
+FB9A          ; Isolated # Lo       ARABIC LETTER NGOEH ISOLATED FORM
+FB9E          ; Isolated # Lo       ARABIC LETTER NOON GHUNNA ISOLATED FORM
+FBA0          ; Isolated # Lo       ARABIC LETTER RNOON ISOLATED FORM
+FBA4          ; Isolated # Lo       ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM
+FBA6          ; Isolated # Lo       ARABIC LETTER HEH GOAL ISOLATED FORM
+FBAA          ; Isolated # Lo       ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM
+FBAE          ; Isolated # Lo       ARABIC LETTER YEH BARREE ISOLATED FORM
+FBB0          ; Isolated # Lo       ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM
+FBD3          ; Isolated # Lo       ARABIC LETTER NG ISOLATED FORM
+FBD7          ; Isolated # Lo       ARABIC LETTER U ISOLATED FORM
+FBD9          ; Isolated # Lo       ARABIC LETTER OE ISOLATED FORM
+FBDB          ; Isolated # Lo       ARABIC LETTER YU ISOLATED FORM
+FBDD..FBDE    ; Isolated # Lo   [2] ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM..ARABIC LETTER VE ISOLATED FORM
+FBE0          ; Isolated # Lo       ARABIC LETTER KIRGHIZ OE ISOLATED FORM
+FBE2          ; Isolated # Lo       ARABIC LETTER KIRGHIZ YU ISOLATED FORM
+FBE4          ; Isolated # Lo       ARABIC LETTER E ISOLATED FORM
+FBEA          ; Isolated # Lo       ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM
+FBEC          ; Isolated # Lo       ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM
+FBEE          ; Isolated # Lo       ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM
+FBF0          ; Isolated # Lo       ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM
+FBF2          ; Isolated # Lo       ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM
+FBF4          ; Isolated # Lo       ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM
+FBF6          ; Isolated # Lo       ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM
+FBF9          ; Isolated # Lo       ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM
+FBFC          ; Isolated # Lo       ARABIC LETTER FARSI YEH ISOLATED FORM
+FC00..FC63    ; Isolated # Lo [100] ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM..ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM
+FCF5..FD10    ; Isolated # Lo  [28] ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM..ARABIC LIGATURE DAD WITH REH ISOLATED FORM
+FD3D          ; Isolated # Lo       ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FDF0..FDFB    ; Isolated # Lo  [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU
+FDFC          ; Isolated # Sc       RIAL SIGN
+FE70          ; Isolated # Lo       ARABIC FATHATAN ISOLATED FORM
+FE72          ; Isolated # Lo       ARABIC DAMMATAN ISOLATED FORM
+FE74          ; Isolated # Lo       ARABIC KASRATAN ISOLATED FORM
+FE76          ; Isolated # Lo       ARABIC FATHA ISOLATED FORM
+FE78          ; Isolated # Lo       ARABIC DAMMA ISOLATED FORM
+FE7A          ; Isolated # Lo       ARABIC KASRA ISOLATED FORM
+FE7C          ; Isolated # Lo       ARABIC SHADDA ISOLATED FORM
+FE7E          ; Isolated # Lo       ARABIC SUKUN ISOLATED FORM
+FE80..FE81    ; Isolated # Lo   [2] ARABIC LETTER HAMZA ISOLATED FORM..ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM
+FE83          ; Isolated # Lo       ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM
+FE85          ; Isolated # Lo       ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM
+FE87          ; Isolated # Lo       ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM
+FE89          ; Isolated # Lo       ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM
+FE8D          ; Isolated # Lo       ARABIC LETTER ALEF ISOLATED FORM
+FE8F          ; Isolated # Lo       ARABIC LETTER BEH ISOLATED FORM
+FE93          ; Isolated # Lo       ARABIC LETTER TEH MARBUTA ISOLATED FORM
+FE95          ; Isolated # Lo       ARABIC LETTER TEH ISOLATED FORM
+FE99          ; Isolated # Lo       ARABIC LETTER THEH ISOLATED FORM
+FE9D          ; Isolated # Lo       ARABIC LETTER JEEM ISOLATED FORM
+FEA1          ; Isolated # Lo       ARABIC LETTER HAH ISOLATED FORM
+FEA5          ; Isolated # Lo       ARABIC LETTER KHAH ISOLATED FORM
+FEA9          ; Isolated # Lo       ARABIC LETTER DAL ISOLATED FORM
+FEAB          ; Isolated # Lo       ARABIC LETTER THAL ISOLATED FORM
+FEAD          ; Isolated # Lo       ARABIC LETTER REH ISOLATED FORM
+FEAF          ; Isolated # Lo       ARABIC LETTER ZAIN ISOLATED FORM
+FEB1          ; Isolated # Lo       ARABIC LETTER SEEN ISOLATED FORM
+FEB5          ; Isolated # Lo       ARABIC LETTER SHEEN ISOLATED FORM
+FEB9          ; Isolated # Lo       ARABIC LETTER SAD ISOLATED FORM
+FEBD          ; Isolated # Lo       ARABIC LETTER DAD ISOLATED FORM
+FEC1          ; Isolated # Lo       ARABIC LETTER TAH ISOLATED FORM
+FEC5          ; Isolated # Lo       ARABIC LETTER ZAH ISOLATED FORM
+FEC9          ; Isolated # Lo       ARABIC LETTER AIN ISOLATED FORM
+FECD          ; Isolated # Lo       ARABIC LETTER GHAIN ISOLATED FORM
+FED1          ; Isolated # Lo       ARABIC LETTER FEH ISOLATED FORM
+FED5          ; Isolated # Lo       ARABIC LETTER QAF ISOLATED FORM
+FED9          ; Isolated # Lo       ARABIC LETTER KAF ISOLATED FORM
+FEDD          ; Isolated # Lo       ARABIC LETTER LAM ISOLATED FORM
+FEE1          ; Isolated # Lo       ARABIC LETTER MEEM ISOLATED FORM
+FEE5          ; Isolated # Lo       ARABIC LETTER NOON ISOLATED FORM
+FEE9          ; Isolated # Lo       ARABIC LETTER HEH ISOLATED FORM
+FEED          ; Isolated # Lo       ARABIC LETTER WAW ISOLATED FORM
+FEEF          ; Isolated # Lo       ARABIC LETTER ALEF MAKSURA ISOLATED FORM
+FEF1          ; Isolated # Lo       ARABIC LETTER YEH ISOLATED FORM
+FEF5          ; Isolated # Lo       ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM
+FEF7          ; Isolated # Lo       ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM
+FEF9          ; Isolated # Lo       ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM
+FEFB          ; Isolated # Lo       ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+
+# Total code points: 238
+
+# ================================================
+
+2460..2473    ; Circle # No  [20] CIRCLED DIGIT ONE..CIRCLED NUMBER TWENTY
+24B6..24E9    ; Circle # So  [52] CIRCLED LATIN CAPITAL LETTER A..CIRCLED LATIN SMALL LETTER Z
+24EA          ; Circle # No       CIRCLED DIGIT ZERO
+3251..325F    ; Circle # No  [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE
+3260..327D    ; Circle # So  [30] CIRCLED HANGUL KIYEOK..CIRCLED KOREAN CHARACTER JUEUI
+3280..3289    ; Circle # No  [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN
+328A..32B0    ; Circle # So  [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT
+32B1..32BF    ; Circle # No  [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY
+32D0..32FE    ; Circle # So  [47] CIRCLED KATAKANA A..CIRCLED KATAKANA WO
+
+# Total code points: 229
+
+# ================================================
+
+00AA          ; Super # L&       FEMININE ORDINAL INDICATOR
+00B2..00B3    ; Super # No   [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE
+00B9          ; Super # No       SUPERSCRIPT ONE
+00BA          ; Super # L&       MASCULINE ORDINAL INDICATOR
+02B0..02B8    ; Super # Lm   [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y
+02E0..02E4    ; Super # Lm   [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+1D2C..1D2E    ; Super # Lm   [3] MODIFIER LETTER CAPITAL A..MODIFIER LETTER CAPITAL B
+1D30..1D3A    ; Super # Lm  [11] MODIFIER LETTER CAPITAL D..MODIFIER LETTER CAPITAL N
+1D3C..1D4D    ; Super # Lm  [18] MODIFIER LETTER CAPITAL O..MODIFIER LETTER SMALL G
+1D4F..1D61    ; Super # Lm  [19] MODIFIER LETTER SMALL K..MODIFIER LETTER SMALL CHI
+2070          ; Super # No       SUPERSCRIPT ZERO
+2071          ; Super # L&       SUPERSCRIPT LATIN SMALL LETTER I
+2074..2079    ; Super # No   [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE
+207A..207C    ; Super # Sm   [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN
+207D          ; Super # Ps       SUPERSCRIPT LEFT PARENTHESIS
+207E          ; Super # Pe       SUPERSCRIPT RIGHT PARENTHESIS
+207F          ; Super # L&       SUPERSCRIPT LATIN SMALL LETTER N
+2120          ; Super # So       SERVICE MARK
+2122          ; Super # So       TRADE MARK SIGN
+3192..3195    ; Super # No   [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK
+3196..319F    ; Super # So  [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK
+
+# Total code points: 100
+
+# ================================================
+
+1D62..1D6A    ; Sub # L&   [9] LATIN SUBSCRIPT SMALL LETTER I..GREEK SUBSCRIPT SMALL LETTER CHI
+2080..2089    ; Sub # No  [10] SUBSCRIPT ZERO..SUBSCRIPT NINE
+208A..208C    ; Sub # Sm   [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN
+208D          ; Sub # Ps       SUBSCRIPT LEFT PARENTHESIS
+208E          ; Sub # Pe       SUBSCRIPT RIGHT PARENTHESIS
+
+# Total code points: 24
+
+# ================================================
+
+309F          ; Vertical # Lo       HIRAGANA DIGRAPH YORI
+30FF          ; Vertical # Lo       KATAKANA DIGRAPH KOTO
+FE30          ; Vertical # Po       PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+FE31..FE32    ; Vertical # Pd   [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH
+FE33..FE34    ; Vertical # Pc   [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+FE35          ; Vertical # Ps       PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+FE36          ; Vertical # Pe       PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+FE37          ; Vertical # Ps       PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+FE38          ; Vertical # Pe       PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+FE39          ; Vertical # Ps       PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+FE3A          ; Vertical # Pe       PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+FE3B          ; Vertical # Ps       PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+FE3C          ; Vertical # Pe       PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+FE3D          ; Vertical # Ps       PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+FE3E          ; Vertical # Pe       PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+FE3F          ; Vertical # Ps       PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+FE40          ; Vertical # Pe       PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+FE41          ; Vertical # Ps       PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42          ; Vertical # Pe       PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43          ; Vertical # Ps       PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44          ; Vertical # Pe       PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FE47          ; Vertical # Ps       PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+FE48          ; Vertical # Pe       PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+
+# Total code points: 25
+
+# ================================================
+
+3000          ; Wide # Zs       IDEOGRAPHIC SPACE
+FF01..FF03    ; Wide # Po   [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN
+FF04          ; Wide # Sc       FULLWIDTH DOLLAR SIGN
+FF05..FF07    ; Wide # Po   [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE
+FF08          ; Wide # Ps       FULLWIDTH LEFT PARENTHESIS
+FF09          ; Wide # Pe       FULLWIDTH RIGHT PARENTHESIS
+FF0A          ; Wide # Po       FULLWIDTH ASTERISK
+FF0B          ; Wide # Sm       FULLWIDTH PLUS SIGN
+FF0C          ; Wide # Po       FULLWIDTH COMMA
+FF0D          ; Wide # Pd       FULLWIDTH HYPHEN-MINUS
+FF0E..FF0F    ; Wide # Po   [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS
+FF10..FF19    ; Wide # Nd  [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE
+FF1A..FF1B    ; Wide # Po   [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON
+FF1C..FF1E    ; Wide # Sm   [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN
+FF1F..FF20    ; Wide # Po   [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT
+FF21..FF3A    ; Wide # L&  [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
+FF3B          ; Wide # Ps       FULLWIDTH LEFT SQUARE BRACKET
+FF3C          ; Wide # Po       FULLWIDTH REVERSE SOLIDUS
+FF3D          ; Wide # Pe       FULLWIDTH RIGHT SQUARE BRACKET
+FF3E          ; Wide # Sk       FULLWIDTH CIRCUMFLEX ACCENT
+FF3F          ; Wide # Pc       FULLWIDTH LOW LINE
+FF40          ; Wide # Sk       FULLWIDTH GRAVE ACCENT
+FF41..FF5A    ; Wide # L&  [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
+FF5B          ; Wide # Ps       FULLWIDTH LEFT CURLY BRACKET
+FF5C          ; Wide # Sm       FULLWIDTH VERTICAL LINE
+FF5D          ; Wide # Pe       FULLWIDTH RIGHT CURLY BRACKET
+FF5E          ; Wide # Sm       FULLWIDTH TILDE
+FF5F          ; Wide # Ps       FULLWIDTH LEFT WHITE PARENTHESIS
+FF60          ; Wide # Pe       FULLWIDTH RIGHT WHITE PARENTHESIS
+FFE0..FFE1    ; Wide # Sc   [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN
+FFE2          ; Wide # Sm       FULLWIDTH NOT SIGN
+FFE3          ; Wide # Sk       FULLWIDTH MACRON
+FFE4          ; Wide # So       FULLWIDTH BROKEN BAR
+FFE5..FFE6    ; Wide # Sc   [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN
+
+# Total code points: 104
+
+# ================================================
+
+FF61          ; Narrow # Po       HALFWIDTH IDEOGRAPHIC FULL STOP
+FF62          ; Narrow # Ps       HALFWIDTH LEFT CORNER BRACKET
+FF63          ; Narrow # Pe       HALFWIDTH RIGHT CORNER BRACKET
+FF64          ; Narrow # Po       HALFWIDTH IDEOGRAPHIC COMMA
+FF65          ; Narrow # Pc       HALFWIDTH KATAKANA MIDDLE DOT
+FF66..FF6F    ; Narrow # Lo  [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU
+FF70          ; Narrow # Lm       HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF71..FF9D    ; Narrow # Lo  [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N
+FF9E..FF9F    ; Narrow # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFA0..FFBE    ; Narrow # Lo  [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH
+FFC2..FFC7    ; Narrow # Lo   [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E
+FFCA..FFCF    ; Narrow # Lo   [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE
+FFD2..FFD7    ; Narrow # Lo   [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU
+FFDA..FFDC    ; Narrow # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
+FFE8          ; Narrow # So       HALFWIDTH FORMS LIGHT VERTICAL
+FFE9..FFEC    ; Narrow # Sm   [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW
+FFED..FFEE    ; Narrow # So   [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE
+
+# Total code points: 122
+
+# ================================================
+
+FE50..FE52    ; Small # Po   [3] SMALL COMMA..SMALL FULL STOP
+FE54..FE57    ; Small # Po   [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK
+FE58          ; Small # Pd       SMALL EM DASH
+FE59          ; Small # Ps       SMALL LEFT PARENTHESIS
+FE5A          ; Small # Pe       SMALL RIGHT PARENTHESIS
+FE5B          ; Small # Ps       SMALL LEFT CURLY BRACKET
+FE5C          ; Small # Pe       SMALL RIGHT CURLY BRACKET
+FE5D          ; Small # Ps       SMALL LEFT TORTOISE SHELL BRACKET
+FE5E          ; Small # Pe       SMALL RIGHT TORTOISE SHELL BRACKET
+FE5F..FE61    ; Small # Po   [3] SMALL NUMBER SIGN..SMALL ASTERISK
+FE62          ; Small # Sm       SMALL PLUS SIGN
+FE63          ; Small # Pd       SMALL HYPHEN-MINUS
+FE64..FE66    ; Small # Sm   [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN
+FE68          ; Small # Po       SMALL REVERSE SOLIDUS
+FE69          ; Small # Sc       SMALL DOLLAR SIGN
+FE6A..FE6B    ; Small # Po   [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT
+
+# Total code points: 26
+
+# ================================================
+
+3250          ; Square # So       PARTNERSHIP SIGN
+32CC..32CF    ; Square # So   [4] SQUARE HG..LIMITED LIABILITY SIGN
+3300..3357    ; Square # So  [88] SQUARE APAATO..SQUARE WATTO
+3371..33DF    ; Square # So [111] SQUARE HPA..SQUARE A OVER M
+33FF          ; Square # So       SQUARE GAL
+
+# Total code points: 205
+
+# ================================================
+
+00BC..00BE    ; Fraction # No   [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS
+2153..215F    ; Fraction # No  [13] VULGAR FRACTION ONE THIRD..FRACTION NUMERATOR ONE
+
+# Total code points: 16
diff --git a/gen.tab/unidata/extracted/DerivedJoiningType.txt b/gen.tab/unidata/extracted/DerivedJoiningType.txt
new file mode 100644 (file)
index 0000000..57e560a
--- /dev/null
@@ -0,0 +1,215 @@
+# DerivedJoiningType-4.0.1.txt
+# Date: 2004-03-02, 02:42:08 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2004 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+
+# ================================================
+
+#      Type T is derived, as described in ArabicShaping.txt
+
+#  All code points not explicitly listed for Joining_Type
+#  have the value Non_Joining (U).
+
+# ================================================
+
+# Joining_Type=Join_Causing
+
+0640          ; C # Lm       ARABIC TATWEEL
+200D          ; C # Cf       ZERO WIDTH JOINER
+
+# Total code points: 2
+
+# ================================================
+
+# Joining_Type=Dual_Joining
+
+0626          ; D # Lo       ARABIC LETTER YEH WITH HAMZA ABOVE
+0628          ; D # Lo       ARABIC LETTER BEH
+062A..062E    ; D # Lo   [5] ARABIC LETTER TEH..ARABIC LETTER KHAH
+0633..063A    ; D # Lo   [8] ARABIC LETTER SEEN..ARABIC LETTER GHAIN
+0641..0647    ; D # Lo   [7] ARABIC LETTER FEH..ARABIC LETTER HEH
+0649..064A    ; D # Lo   [2] ARABIC LETTER ALEF MAKSURA..ARABIC LETTER YEH
+066E..066F    ; D # Lo   [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF
+0678..0687    ; D # Lo  [16] ARABIC LETTER HIGH HAMZA YEH..ARABIC LETTER TCHEHEH
+069A..06BF    ; D # Lo  [38] ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE..ARABIC LETTER TCHEH WITH DOT ABOVE
+06C1          ; D # Lo       ARABIC LETTER HEH GOAL
+06CC          ; D # Lo       ARABIC LETTER FARSI YEH
+06CE          ; D # Lo       ARABIC LETTER YEH WITH SMALL V
+06D0..06D1    ; D # Lo   [2] ARABIC LETTER E..ARABIC LETTER YEH WITH THREE DOTS BELOW
+06FA..06FC    ; D # Lo   [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW
+06FF          ; D # Lo       ARABIC LETTER HEH WITH INVERTED V
+0712..0714    ; D # Lo   [3] SYRIAC LETTER BETH..SYRIAC LETTER GAMAL GARSHUNI
+071A..071D    ; D # Lo   [4] SYRIAC LETTER HETH..SYRIAC LETTER YUDH
+071F..0727    ; D # Lo   [9] SYRIAC LETTER KAPH..SYRIAC LETTER REVERSED PE
+0729          ; D # Lo       SYRIAC LETTER QAPH
+072B          ; D # Lo       SYRIAC LETTER SHIN
+072D..072E    ; D # Lo   [2] SYRIAC LETTER PERSIAN BHETH..SYRIAC LETTER PERSIAN GHAMAL
+074E..074F    ; D # Lo   [2] SYRIAC LETTER SOGDIAN KHAPH..SYRIAC LETTER SOGDIAN FE
+
+# Total code points: 111
+
+# ================================================
+
+# Joining_Type=Right_Joining
+
+0622..0625    ; R # Lo   [4] ARABIC LETTER ALEF WITH MADDA ABOVE..ARABIC LETTER ALEF WITH HAMZA BELOW
+0627          ; R # Lo       ARABIC LETTER ALEF
+0629          ; R # Lo       ARABIC LETTER TEH MARBUTA
+062F..0632    ; R # Lo   [4] ARABIC LETTER DAL..ARABIC LETTER ZAIN
+0648          ; R # Lo       ARABIC LETTER WAW
+0671..0673    ; R # Lo   [3] ARABIC LETTER ALEF WASLA..ARABIC LETTER ALEF WITH WAVY HAMZA BELOW
+0675..0677    ; R # Lo   [3] ARABIC LETTER HIGH HAMZA ALEF..ARABIC LETTER U WITH HAMZA ABOVE
+0688..0699    ; R # Lo  [18] ARABIC LETTER DDAL..ARABIC LETTER REH WITH FOUR DOTS ABOVE
+06C0          ; R # Lo       ARABIC LETTER HEH WITH YEH ABOVE
+06C2..06CB    ; R # Lo  [10] ARABIC LETTER HEH GOAL WITH HAMZA ABOVE..ARABIC LETTER VE
+06CD          ; R # Lo       ARABIC LETTER YEH WITH TAIL
+06CF          ; R # Lo       ARABIC LETTER WAW WITH DOT ABOVE
+06D2..06D3    ; R # Lo   [2] ARABIC LETTER YEH BARREE..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D5          ; R # Lo       ARABIC LETTER AE
+06EE..06EF    ; R # Lo   [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V
+0710          ; R # Lo       SYRIAC LETTER ALAPH
+0715..0719    ; R # Lo   [5] SYRIAC LETTER DALATH..SYRIAC LETTER ZAIN
+071E          ; R # Lo       SYRIAC LETTER YUDH HE
+0728          ; R # Lo       SYRIAC LETTER SADHE
+072A          ; R # Lo       SYRIAC LETTER RISH
+072C          ; R # Lo       SYRIAC LETTER TAW
+072F          ; R # Lo       SYRIAC LETTER PERSIAN DHALATH
+074D          ; R # Lo       SYRIAC LETTER SOGDIAN ZHAIN
+
+# Total code points: 65
+
+# ================================================
+
+# Joining_Type=Transparent
+
+00AD          ; T # Cf       SOFT HYPHEN
+0300..0357    ; T # Mn  [88] COMBINING GRAVE ACCENT..COMBINING RIGHT HALF RING ABOVE
+035D..036F    ; T # Mn  [19] COMBINING DOUBLE BREVE..COMBINING LATIN SMALL LETTER X
+0483..0486    ; T # Mn   [4] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PSILI PNEUMATA
+0591..05A1    ; T # Mn  [17] HEBREW ACCENT ETNAHTA..HEBREW ACCENT PAZER
+05A3..05B9    ; T # Mn  [23] HEBREW ACCENT MUNAH..HEBREW POINT HOLAM
+05BB..05BD    ; T # Mn   [3] HEBREW POINT QUBUTS..HEBREW POINT METEG
+05BF          ; T # Mn       HEBREW POINT RAFE
+05C1..05C2    ; T # Mn   [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C4          ; T # Mn       HEBREW MARK UPPER DOT
+0610..0615    ; T # Mn   [6] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH TAH
+064B..0658    ; T # Mn  [14] ARABIC FATHATAN..ARABIC MARK NOON GHUNNA
+0670          ; T # Mn       ARABIC LETTER SUPERSCRIPT ALEF
+06D6..06DC    ; T # Mn   [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
+06DF..06E4    ; T # Mn   [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA
+06E7..06E8    ; T # Mn   [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+06EA..06ED    ; T # Mn   [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM
+070F          ; T # Cf       SYRIAC ABBREVIATION MARK
+0711          ; T # Mn       SYRIAC LETTER SUPERSCRIPT ALAPH
+0730..074A    ; T # Mn  [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+07A6..07B0    ; T # Mn  [11] THAANA ABAFILI..THAANA SUKUN
+0901..0902    ; T # Mn   [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA
+093C          ; T # Mn       DEVANAGARI SIGN NUKTA
+0941..0948    ; T # Mn   [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
+094D          ; T # Mn       DEVANAGARI SIGN VIRAMA
+0951..0954    ; T # Mn   [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT
+0962..0963    ; T # Mn   [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
+0981          ; T # Mn       BENGALI SIGN CANDRABINDU
+09BC          ; T # Mn       BENGALI SIGN NUKTA
+09C1..09C4    ; T # Mn   [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
+09CD          ; T # Mn       BENGALI SIGN VIRAMA
+09E2..09E3    ; T # Mn   [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+0A01..0A02    ; T # Mn   [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A3C          ; T # Mn       GURMUKHI SIGN NUKTA
+0A41..0A42    ; T # Mn   [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
+0A47..0A48    ; T # Mn   [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A4B..0A4D    ; T # Mn   [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
+0A70..0A71    ; T # Mn   [2] GURMUKHI TIPPI..GURMUKHI ADDAK
+0A81..0A82    ; T # Mn   [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
+0ABC          ; T # Mn       GUJARATI SIGN NUKTA
+0AC1..0AC5    ; T # Mn   [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
+0AC7..0AC8    ; T # Mn   [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0ACD          ; T # Mn       GUJARATI SIGN VIRAMA
+0AE2..0AE3    ; T # Mn   [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0B01          ; T # Mn       ORIYA SIGN CANDRABINDU
+0B3C          ; T # Mn       ORIYA SIGN NUKTA
+0B3F          ; T # Mn       ORIYA VOWEL SIGN I
+0B41..0B43    ; T # Mn   [3] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC R
+0B4D          ; T # Mn       ORIYA SIGN VIRAMA
+0B56          ; T # Mn       ORIYA AI LENGTH MARK
+0B82          ; T # Mn       TAMIL SIGN ANUSVARA
+0BC0          ; T # Mn       TAMIL VOWEL SIGN II
+0BCD          ; T # Mn       TAMIL SIGN VIRAMA
+0C3E..0C40    ; T # Mn   [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
+0C46..0C48    ; T # Mn   [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C4A..0C4D    ; T # Mn   [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
+0C55..0C56    ; T # Mn   [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0CBC          ; T # Mn       KANNADA SIGN NUKTA
+0CBF          ; T # Mn       KANNADA VOWEL SIGN I
+0CC6          ; T # Mn       KANNADA VOWEL SIGN E
+0CCC..0CCD    ; T # Mn   [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
+0D41..0D43    ; T # Mn   [3] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC R
+0D4D          ; T # Mn       MALAYALAM SIGN VIRAMA
+0DCA          ; T # Mn       SINHALA SIGN AL-LAKUNA
+0DD2..0DD4    ; T # Mn   [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6          ; T # Mn       SINHALA VOWEL SIGN DIGA PAA-PILLA
+0E31          ; T # Mn       THAI CHARACTER MAI HAN-AKAT
+0E34..0E3A    ; T # Mn   [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E47..0E4E    ; T # Mn   [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
+0EB1          ; T # Mn       LAO VOWEL SIGN MAI KAN
+0EB4..0EB9    ; T # Mn   [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
+0EBB..0EBC    ; T # Mn   [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
+0EC8..0ECD    ; T # Mn   [6] LAO TONE MAI EK..LAO NIGGAHITA
+0F18..0F19    ; T # Mn   [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F35          ; T # Mn       TIBETAN MARK NGAS BZUNG NYI ZLA
+0F37          ; T # Mn       TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F39          ; T # Mn       TIBETAN MARK TSA -PHRU
+0F71..0F7E    ; T # Mn  [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
+0F80..0F84    ; T # Mn   [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA
+0F86..0F87    ; T # Mn   [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
+0F90..0F97    ; T # Mn   [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA
+0F99..0FBC    ; T # Mn  [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FC6          ; T # Mn       TIBETAN SYMBOL PADMA GDAN
+102D..1030    ; T # Mn   [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+1032          ; T # Mn       MYANMAR VOWEL SIGN AI
+1036..1037    ; T # Mn   [2] MYANMAR SIGN ANUSVARA..MYANMAR SIGN DOT BELOW
+1039          ; T # Mn       MYANMAR SIGN VIRAMA
+1058..1059    ; T # Mn   [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
+1712..1714    ; T # Mn   [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA
+1732..1734    ; T # Mn   [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD
+1752..1753    ; T # Mn   [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
+1772..1773    ; T # Mn   [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+17B4..17B5    ; T # Cf   [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
+17B7..17BD    ; T # Mn   [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
+17C6          ; T # Mn       KHMER SIGN NIKAHIT
+17C9..17D3    ; T # Mn  [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
+17DD          ; T # Mn       KHMER SIGN ATTHACAN
+180B..180D    ; T # Mn   [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+18A9          ; T # Mn       MONGOLIAN LETTER ALI GALI DAGALGA
+1920..1922    ; T # Mn   [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1927..1928    ; T # Mn   [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1932          ; T # Mn       LIMBU SMALL LETTER ANUSVARA
+1939..193B    ; T # Mn   [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+200B          ; T # Cf       ZERO WIDTH SPACE
+200E..200F    ; T # Cf   [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK
+202A..202E    ; T # Cf   [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
+2060..2063    ; T # Cf   [4] WORD JOINER..INVISIBLE SEPARATOR
+206A..206F    ; T # Cf   [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES
+20D0..20DC    ; T # Mn  [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
+20E1          ; T # Mn       COMBINING LEFT RIGHT ARROW ABOVE
+20E5..20EA    ; T # Mn   [6] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING LEFTWARDS ARROW OVERLAY
+302A..302F    ; T # Mn   [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK
+3099..309A    ; T # Mn   [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+FB1E          ; T # Mn       HEBREW POINT JUDEO-SPANISH VARIKA
+FE00..FE0F    ; T # Mn  [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+FE20..FE23    ; T # Mn   [4] COMBINING LIGATURE LEFT HALF..COMBINING DOUBLE TILDE RIGHT HALF
+FEFF          ; T # Cf       ZERO WIDTH NO-BREAK SPACE
+FFF9..FFFB    ; T # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
+1D167..1D169  ; T # Mn   [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
+1D173..1D17A  ; T # Cf   [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
+1D17B..1D182  ; T # Mn   [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
+1D185..1D18B  ; T # Mn   [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D1AA..1D1AD  ; T # Mn   [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+E0001         ; T # Cf       LANGUAGE TAG
+E0020..E007F  ; T # Cf  [96] TAG SPACE..CANCEL TAG
+E0100..E01EF  ; T # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+
+# Total code points: 923
diff --git a/lib/Headers.mk b/lib/Headers.mk
new file mode 100644 (file)
index 0000000..9ea5381
--- /dev/null
@@ -0,0 +1,14 @@
+libfribidi_la_headers = \
+               fribidi-begindecls.h \
+               fribidi-bidi.h \
+               fribidi-bidi-type.h \
+               fribidi-bidi-types.h \
+               fribidi-common.h \
+               fribidi-config.h \
+               fribidi-enddecls.h \
+               fribidi-env.h \
+               fribidi-mirroring.h \
+               fribidi-types.h \
+               fribidi-unicode.h \
+               fribidi-unicode-version.h \
+               fribidi.h # should be the last entry
diff --git a/lib/Makefile.am b/lib/Makefile.am
new file mode 100644 (file)
index 0000000..b260142
--- /dev/null
@@ -0,0 +1,75 @@
+lib_LTLIBRARIES = libfribidi.la
+
+AM_CPPFLAGS = $(GLIB_CFLAGS)
+
+if PLATFORM_WIN32
+no_undefined = -no-undefined
+endif # PLATFORM_WIN32
+
+libfribidi_la_LDFLAGS = -version-info $(LT_VERSION_INFO) $(no_undefined)
+libfribidi_la_LIBADD = $(GLIB_LIBS)
+libfribidi_la_DEPENDENCIES =
+
+if OS_WIN32
+libfribidi_la_LDFLAGS += -export-symbols
+endif # OS_WIN32
+
+if FRIBIDI_CHARSETS
+
+AM_CPPFLAGS += -I$(top_srcdir)/charset
+libfribidi_la_LIBADD += $(top_builddir)/charset/libfribidi-char-sets.la
+libfribidi_la_DEPENDENCIES += $(top_builddir)/charset/libfribidi-char-sets.la
+
+$(top_builddir)/charset/libfribidi-char-sets.la:
+       cd $(top_builddir)/lib && $(MAKE) $(AM_MAKEFLAGS) libfribidi-char-sets.la
+
+endif # FRIBIDI_CHARSETS
+
+include Headers.mk
+pkginclude_HEADERS = $(libfribidi_la_headers)
+
+libfribidi_la_SOURCES =        \
+               bidi-types.h \
+               bidi-types-list.h \
+               bidi-type-table.i \
+               common.h \
+               debug.h \
+               fribidi.c \
+               fribidi-bidi.c \
+               fribidi-bidi-type.c \
+               fribidi-bidi-types.c \
+               fribidi-env.c \
+               fribidi-mem.c \
+               fribidi-mirroring.c \
+               mem.h \
+               mirroring-table.i
+
+BUILT_SOURCES= \
+               bidi-type-table.i \
+               mirroring-table.i \
+               fribidi-config.h \
+               fribidi-unicode-version.h
+
+MAINTAINERCLEANFILES = $(BUILT_SOURCES)
+
+fribidi_tab_mirroring_0.i: $(fribidi_create_mirroring_SOURCES) fribidi_types.h \
+               unidata/BidiMirroring.txt
+       $(MAKE) fribidi_create_mirroring
+       if test -d unidata; then UNIDATA=unidata;       \
+       else UNIDATA="$(srcdir)/unidata"; fi && \
+       ./fribidi_create_mirroring "$$UNIDATA" ||       \
+       ($(RM) "$@"; false)
+
+fribidi_tab_bidi_type.i: $(fribidi_create_char_types_SOURCES)  \
+               unidata/UnicodeData.txt
+       $(MAKE) fribidi_create_char_types
+       if test -d unidata; then UNIDATA=unidata;       \
+       else UNIDATA="$(srcdir)/unidata"; fi && \
+       ./fribidi_create_char_types "`echo "$@" \
+         | $(SED) 's/[^0-9]*//g'`" "$$UNIDATA" ||      \
+       ($(RM) "$@"; false)
+       $(RM) fribidi_tab_char_type_stamp
+       $(MAKE) fribidi_tab_char_type_stamp
+
+$(top_builddir)/config.h: $(top_srcdir)/config.h.in
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) config.h
diff --git a/lib/bidi-type-table.i b/lib/bidi-type-table.i
new file mode 100644 (file)
index 0000000..c37c962
--- /dev/null
@@ -0,0 +1,5228 @@
+/*
+  This file was automatically created from UnicodeData.txt version 3.2.0
+  by fribidi_create_char_types
+*/
+
+#ifndef FRIBIDI_TAB_CHAR_TYPE_2_I
+#define FRIBIDI_TAB_CHAR_TYPE_2_I
+
+#include "bidi-types.h"
+
+#define LTR FRIBIDI_PROP_TYPE_LTR
+#define RTL FRIBIDI_PROP_TYPE_RTL
+#define AL FRIBIDI_PROP_TYPE_AL
+#define ON FRIBIDI_PROP_TYPE_ON
+#define BN FRIBIDI_PROP_TYPE_BN
+#define AN FRIBIDI_PROP_TYPE_AN
+#define BS FRIBIDI_PROP_TYPE_BS
+#define CS FRIBIDI_PROP_TYPE_CS
+#define EN FRIBIDI_PROP_TYPE_EN
+#define ES FRIBIDI_PROP_TYPE_ES
+#define ET FRIBIDI_PROP_TYPE_ET
+#define LRE FRIBIDI_PROP_TYPE_LRE
+#define LRO FRIBIDI_PROP_TYPE_LRO
+#define NSM FRIBIDI_PROP_TYPE_NSM
+#define PDF FRIBIDI_PROP_TYPE_PDF
+#define RLE FRIBIDI_PROP_TYPE_RLE
+#define RLO FRIBIDI_PROP_TYPE_RLO
+#define SS FRIBIDI_PROP_TYPE_SS
+#define WS FRIBIDI_PROP_TYPE_WS
+
+#define PACKTAB_UINT8 fribidi_uint8
+#define PACKTAB_UINT16 fribidi_uint16
+#define PACKTAB_UINT32 fribidi_uint32
+/*
+  Automatically generated by packtab.c version 2
+
+  just use FRIBIDI_GET_TYPE(key)
+
+  assumed sizeof(FriBidiPropCharType) == 1
+  required memory: 19200
+  lookups: 2
+  partition shape: FriBidiPropertyBlock[4352][256]
+  different table entries: 1 41
+*/
+
+/* *INDENT-OFF* */
+
+static const FriBidiPropCharType FriBidiPropertyBlockLevel1[256*41] = {
+
+#define FriBidiPropertyBlockLevel1_0000 0x0
+
+   BN, BN, BN, BN, BN, BN, BN, BN, BN, SS, BS, SS, WS, BS, BN, BN,
+   BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BS, BS, BS, SS,
+   WS, ON, ON, ET, ET, ET, ON, ON, ON, ON, ON, ET, CS, ET, CS, ES,
+   EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, CS, ON, ON, ON, ON, ON,
+   ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON, ON, ON, ON,
+   ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON, ON, ON, BN,
+   BN, BN, BN, BN, BN, BS, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN,
+   BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN,
+   CS, ON, ET, ET, ET, ET, ON, ON, ON, ON,LTR, ON, ON, ON, ON, ON,
+   ET, ET, EN, EN, ON,LTR, ON, ON, ON, EN,LTR, ON, ON, ON, ON, ON,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_0100 0x100
+
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_0200 0x200
+
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+  LTR,LTR, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+  LTR,LTR,LTR,LTR,LTR, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_0300 0x300
+
+  NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+  NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+  NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+  NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+  NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+  LTR,LTR,LTR,LTR, ON, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON,LTR,
+  LTR,LTR,LTR,LTR, ON, ON,LTR, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_0400 0x400
+
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,NSM,NSM,NSM,NSM,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_0500 0x500
+
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON,LTR,LTR,LTR,LTR,LTR,
+  RTL,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+  NSM,NSM,RTL,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+  NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,RTL,NSM,NSM,NSM,RTL,NSM,
+  RTL,NSM,NSM,RTL,NSM,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,
+  RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,
+  RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,
+  RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,
+
+#define FriBidiPropertyBlockLevel1_0600 0x600
+
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, CS, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,NSM,NSM,NSM,NSM,NSM,
+  NSM,NSM,NSM,NSM,NSM,NSM, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AN, AN, AN, AN, AN, AN, AN, AN, AN, AN, ET, AN, AN, AL, AL, AL,
+  NSM, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL,NSM,NSM,NSM,NSM,NSM,NSM,NSM, AL,NSM,NSM,
+  NSM,NSM,NSM,NSM,NSM, AL, AL,NSM,NSM, ON,NSM,NSM,NSM,NSM, AL, AL,
+   EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, AL, AL, AL, AL, AL, AL,
+
+#define FriBidiPropertyBlockLevel1_0700 0x700
+
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, BN,
+   AL,NSM, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+  NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+  NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+  NSM, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_0900 0x800
+
+  LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR,
+  LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,NSM,LTR,LTR,
+  LTR,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR,
+  LTR,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR, ET, ET,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_0A00 0x900
+
+  LTR,LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR,
+  LTR,NSM,NSM,LTR,LTR,LTR,LTR,NSM,NSM,LTR,LTR,NSM,NSM,NSM,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR,
+  LTR,NSM,NSM,NSM,NSM,NSM,LTR,NSM,NSM,LTR,LTR,LTR,LTR,NSM,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_0B00 0xA00
+
+  LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,NSM,
+  LTR,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_0C00 0xB00
+
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,
+  NSM,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,LTR,NSM,NSM,NSM,NSM,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,
+  LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR,LTR,LTR,NSM,NSM,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_0D00 0xC00
+
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,NSM,NSM,NSM,LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_0E00 0xD00
+
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,NSM,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR, ET,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,NSM,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,LTR,NSM,NSM,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_0F00 0xE00
+
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,NSM,LTR,NSM,LTR,NSM, ON, ON, ON, ON,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,
+  NSM,NSM,NSM,NSM,NSM,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+  NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+  NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_1000 0xF00
+
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,
+  NSM,LTR,NSM,LTR,LTR,LTR,NSM,NSM,LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_1600 0x1000
+
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+   WS,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_1700 0x1100
+
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+  NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ET,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_1800 0x1200
+
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,NSM,NSM,NSM, BN,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_1F00 0x1300
+
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON,LTR, ON,
+   ON, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON, ON,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON, ON,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON, ON,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON,LTR,
+
+#define FriBidiPropertyBlockLevel1_2000 0x1400
+
+   WS, WS, WS, WS, WS, WS, WS, WS, WS, WS, WS, BN, BN, BN,LTR,RTL,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, WS, BS,LRE,RLE,PDF,LRO,RLO, WS,
+   ET, ET, ET, ET, ET, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON,LTR,LTR,LTR,LTR, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR, WS,
+   BN, BN, BN, BN,LTR,LTR,LTR,LTR,LTR,LTR, BN, BN, BN, BN, BN, BN,
+   EN,LTR,LTR,LTR, EN, EN, EN, EN, EN, EN, ET, ET, ON, ON, ON,LTR,
+   EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, ET, ET, ON, ON, ON,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+   ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET,
+   ET, ET,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+  NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_2100 0x1500
+
+   ON, ON,LTR, ON, ON, ON, ON,LTR, ON, ON,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR, ON,LTR, ON, ON, ON,LTR,LTR,LTR,LTR,LTR, ON, ON,
+   ON, ON, ON, ON,LTR, ON,LTR, ON,LTR, ON,LTR,LTR,LTR,LTR, ET,LTR,
+  LTR,LTR, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON,LTR,LTR,LTR,LTR,LTR,
+   ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR,LTR, ON, ON,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+
+#define FriBidiPropertyBlockLevel1_2200 0x1600
+
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ET, ET, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+
+#define FriBidiPropertyBlockLevel1_2300 0x1700
+
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON,LTR, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_2400 0x1800
+
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+   EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN,
+   EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN,
+   EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN,
+   EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, EN, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR,
+
+#define FriBidiPropertyBlockLevel1_2500 0x1900
+
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+
+#define FriBidiPropertyBlockLevel1_2600 0x1A00
+
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON,LTR,LTR, ON, ON,LTR, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR,LTR,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_2700 0x1B00
+
+  LTR, ON, ON, ON, ON,LTR, ON, ON, ON, ON,LTR,LTR, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON,LTR, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR, ON,LTR, ON,
+   ON, ON, ON,LTR,LTR,LTR, ON,LTR, ON, ON, ON, ON, ON, ON, ON,LTR,
+  LTR, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON,LTR,LTR,LTR, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+  LTR, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+
+#define FriBidiPropertyBlockLevel1_2E00 0x1C00
+
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_2F00 0x1D00
+
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_3000 0x1E00
+
+   WS, ON, ON, ON, ON,LTR,LTR,LTR, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,
+   ON,LTR,LTR,LTR,LTR,LTR, ON, ON,LTR,LTR,LTR,LTR,LTR, ON, ON, ON,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM, ON, ON,LTR,LTR,LTR,
+   ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_3200 0x1F00
+
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_A400 0x2000
+
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_FB00 0x2100
+
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,RTL,NSM,RTL,
+  RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL, ET,RTL,RTL,RTL,RTL,RTL,RTL,
+  RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,
+  RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+
+#define FriBidiPropertyBlockLevel1_FC00 0x2200
+
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+
+#define FriBidiPropertyBlockLevel1_FD00 0x2300
+
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, ON, ON,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+
+#define FriBidiPropertyBlockLevel1_FE00 0x2400
+
+  NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+   ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON, ON,LTR,LTR, ON, ON, ON, ON, ON, ON, ON,
+   CS, ON, CS,LTR, ON, CS, ON, ON, ON, ON, ON, ON, ON, ON, ON, ET,
+   ON, ON, ET, ET, ON, ON, ON,LTR, ON, ET, ET, ON,LTR,LTR,LTR,LTR,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL,
+   AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, BN,
+
+#define FriBidiPropertyBlockLevel1_FF00 0x2500
+
+  LTR, ON, ON, ET, ET, ET, ON, ON, ON, ON, ON, ET, CS, ET, CS, ES,
+   EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, CS, ON, ON, ON, ON, ON,
+   ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON, ON, ON, ON,
+   ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, ON, ON, ON, ON, ON,
+   ON, ON, ON, ON, ON, ON,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+   ET, ET, ON, ON, ON, ET, ET,LTR, ON, ON, ON, ON, ON, ON, ON,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, BN, BN, BN, ON, ON,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_1D100 0x2600
+
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR, BN, BN, BN, BN, BN, BN, BN, BN,NSM,NSM,NSM,NSM,NSM,
+  NSM,NSM,NSM,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+
+#define FriBidiPropertyBlockLevel1_1D700 0x2700
+
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR, EN, EN,
+   EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN,
+   EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN,
+   EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN,
+
+#define FriBidiPropertyBlockLevel1_E0000 0x2800
+
+  LTR, BN,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+   BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN,
+   BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN,
+   BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN,
+   BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN,
+   BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN,
+   BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+  LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+};
+
+static const PACKTAB_UINT16 FriBidiPropertyBlockLevel0[4352*1] = {
+
+#define FriBidiPropertyBlockLevel0_0000 0x0
+
+  FriBidiPropertyBlockLevel1_0000,  /* 0000..00FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 0100..01FF */
+  FriBidiPropertyBlockLevel1_0200,  /* 0200..02FF */
+  FriBidiPropertyBlockLevel1_0300,  /* 0300..03FF */
+  FriBidiPropertyBlockLevel1_0400,  /* 0400..04FF */
+  FriBidiPropertyBlockLevel1_0500,  /* 0500..05FF */
+  FriBidiPropertyBlockLevel1_0600,  /* 0600..06FF */
+  FriBidiPropertyBlockLevel1_0700,  /* 0700..07FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 0800..08FF */
+  FriBidiPropertyBlockLevel1_0900,  /* 0900..09FF */
+  FriBidiPropertyBlockLevel1_0A00,  /* 0A00..0AFF */
+  FriBidiPropertyBlockLevel1_0B00,  /* 0B00..0BFF */
+  FriBidiPropertyBlockLevel1_0C00,  /* 0C00..0CFF */
+  FriBidiPropertyBlockLevel1_0D00,  /* 0D00..0DFF */
+  FriBidiPropertyBlockLevel1_0E00,  /* 0E00..0EFF */
+  FriBidiPropertyBlockLevel1_0F00,  /* 0F00..0FFF */
+  FriBidiPropertyBlockLevel1_1000,  /* 1000..10FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1100..11FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1200..12FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1300..13FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1400..14FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1500..15FF */
+  FriBidiPropertyBlockLevel1_1600,  /* 1600..16FF */
+  FriBidiPropertyBlockLevel1_1700,  /* 1700..17FF */
+  FriBidiPropertyBlockLevel1_1800,  /* 1800..18FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1900..19FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1A00..1AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1B00..1BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1C00..1CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1D00..1DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1E00..1EFF */
+  FriBidiPropertyBlockLevel1_1F00,  /* 1F00..1FFF */
+  FriBidiPropertyBlockLevel1_2000,  /* 2000..20FF */
+  FriBidiPropertyBlockLevel1_2100,  /* 2100..21FF */
+  FriBidiPropertyBlockLevel1_2200,  /* 2200..22FF */
+  FriBidiPropertyBlockLevel1_2300,  /* 2300..23FF */
+  FriBidiPropertyBlockLevel1_2400,  /* 2400..24FF */
+  FriBidiPropertyBlockLevel1_2500,  /* 2500..25FF */
+  FriBidiPropertyBlockLevel1_2600,  /* 2600..26FF */
+  FriBidiPropertyBlockLevel1_2700,  /* 2700..27FF */
+  FriBidiPropertyBlockLevel1_2500,  /* 2800..28FF */
+  FriBidiPropertyBlockLevel1_2500,  /* 2900..29FF */
+  FriBidiPropertyBlockLevel1_2500,  /* 2A00..2AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2B00..2BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2C00..2CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2D00..2DFF */
+  FriBidiPropertyBlockLevel1_2E00,  /* 2E00..2EFF */
+  FriBidiPropertyBlockLevel1_2F00,  /* 2F00..2FFF */
+  FriBidiPropertyBlockLevel1_3000,  /* 3000..30FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3100..31FF */
+  FriBidiPropertyBlockLevel1_3200,  /* 3200..32FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3300..33FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3400..34FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3500..35FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3600..36FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3700..37FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3800..38FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3900..39FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3A00..3AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3B00..3BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3C00..3CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3D00..3DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3E00..3EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3F00..3FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4000..40FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4100..41FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4200..42FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4300..43FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4400..44FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4500..45FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4600..46FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4700..47FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4800..48FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4900..49FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4A00..4AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4B00..4BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4C00..4CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4D00..4DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4E00..4EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4F00..4FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5000..50FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5100..51FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5200..52FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5300..53FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5400..54FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5500..55FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5600..56FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5700..57FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5800..58FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5900..59FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5A00..5AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5B00..5BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5C00..5CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5D00..5DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5E00..5EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5F00..5FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6000..60FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6100..61FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6200..62FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6300..63FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6400..64FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6500..65FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6600..66FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6700..67FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6800..68FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6900..69FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6A00..6AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6B00..6BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6C00..6CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6D00..6DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6E00..6EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6F00..6FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7000..70FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7100..71FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7200..72FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7300..73FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7400..74FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7500..75FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7600..76FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7700..77FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7800..78FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7900..79FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7A00..7AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7B00..7BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7C00..7CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7D00..7DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7E00..7EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7F00..7FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8000..80FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8100..81FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8200..82FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8300..83FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8400..84FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8500..85FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8600..86FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8700..87FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8800..88FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8900..89FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8A00..8AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8B00..8BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8C00..8CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8D00..8DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8E00..8EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8F00..8FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9000..90FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9100..91FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9200..92FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9300..93FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9400..94FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9500..95FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9600..96FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9700..97FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9800..98FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9900..99FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9A00..9AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9B00..9BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9C00..9CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9D00..9DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9E00..9EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9F00..9FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A000..A0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A100..A1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A200..A2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A300..A3FF */
+  FriBidiPropertyBlockLevel1_A400,  /* A400..A4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A500..A5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A600..A6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A700..A7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A800..A8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A900..A9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AA00..AAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AB00..ABFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AC00..ACFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AD00..ADFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AE00..AEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AF00..AFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B000..B0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B100..B1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B200..B2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B300..B3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B400..B4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B500..B5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B600..B6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B700..B7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B800..B8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B900..B9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BA00..BAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BB00..BBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BC00..BCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BD00..BDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BE00..BEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BF00..BFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C000..C0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C100..C1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C200..C2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C300..C3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C400..C4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C500..C5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C600..C6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C700..C7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C800..C8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C900..C9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CA00..CAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CB00..CBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CC00..CCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CD00..CDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CE00..CEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CF00..CFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D000..D0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D100..D1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D200..D2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D300..D3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D400..D4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D500..D5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D600..D6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D700..D7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D800..D8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D900..D9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DA00..DAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DB00..DBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DC00..DCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DD00..DDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DE00..DEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DF00..DFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E000..E0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E100..E1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E200..E2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E300..E3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E400..E4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E500..E5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E600..E6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E700..E7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E800..E8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E900..E9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EA00..EAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EB00..EBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EC00..ECFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ED00..EDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EE00..EEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EF00..EFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F000..F0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F100..F1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F200..F2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F300..F3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F400..F4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F500..F5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F600..F6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F700..F7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F800..F8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F900..F9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FA00..FAFF */
+  FriBidiPropertyBlockLevel1_FB00,  /* FB00..FBFF */
+  FriBidiPropertyBlockLevel1_FC00,  /* FC00..FCFF */
+  FriBidiPropertyBlockLevel1_FD00,  /* FD00..FDFF */
+  FriBidiPropertyBlockLevel1_FE00,  /* FE00..FEFF */
+  FriBidiPropertyBlockLevel1_FF00,  /* FF00..FFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10000..100FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10100..101FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10200..102FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10300..103FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10400..104FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10500..105FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10600..106FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10700..107FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10800..108FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10900..109FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10A00..10AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10B00..10BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10C00..10CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10D00..10DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10E00..10EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10F00..10FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 11000..110FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 11100..111FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 11200..112FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 11300..113FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 11400..114FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 11500..115FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 11600..116FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 11700..117FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 11800..118FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 11900..119FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 11A00..11AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 11B00..11BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 11C00..11CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 11D00..11DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 11E00..11EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 11F00..11FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 12000..120FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 12100..121FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 12200..122FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 12300..123FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 12400..124FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 12500..125FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 12600..126FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 12700..127FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 12800..128FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 12900..129FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 12A00..12AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 12B00..12BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 12C00..12CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 12D00..12DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 12E00..12EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 12F00..12FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 13000..130FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 13100..131FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 13200..132FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 13300..133FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 13400..134FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 13500..135FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 13600..136FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 13700..137FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 13800..138FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 13900..139FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 13A00..13AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 13B00..13BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 13C00..13CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 13D00..13DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 13E00..13EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 13F00..13FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 14000..140FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 14100..141FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 14200..142FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 14300..143FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 14400..144FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 14500..145FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 14600..146FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 14700..147FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 14800..148FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 14900..149FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 14A00..14AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 14B00..14BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 14C00..14CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 14D00..14DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 14E00..14EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 14F00..14FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 15000..150FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 15100..151FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 15200..152FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 15300..153FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 15400..154FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 15500..155FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 15600..156FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 15700..157FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 15800..158FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 15900..159FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 15A00..15AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 15B00..15BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 15C00..15CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 15D00..15DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 15E00..15EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 15F00..15FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 16000..160FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 16100..161FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 16200..162FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 16300..163FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 16400..164FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 16500..165FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 16600..166FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 16700..167FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 16800..168FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 16900..169FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 16A00..16AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 16B00..16BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 16C00..16CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 16D00..16DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 16E00..16EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 16F00..16FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 17000..170FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 17100..171FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 17200..172FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 17300..173FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 17400..174FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 17500..175FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 17600..176FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 17700..177FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 17800..178FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 17900..179FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 17A00..17AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 17B00..17BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 17C00..17CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 17D00..17DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 17E00..17EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 17F00..17FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 18000..180FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 18100..181FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 18200..182FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 18300..183FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 18400..184FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 18500..185FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 18600..186FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 18700..187FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 18800..188FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 18900..189FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 18A00..18AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 18B00..18BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 18C00..18CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 18D00..18DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 18E00..18EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 18F00..18FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 19000..190FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 19100..191FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 19200..192FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 19300..193FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 19400..194FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 19500..195FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 19600..196FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 19700..197FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 19800..198FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 19900..199FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 19A00..19AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 19B00..19BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 19C00..19CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 19D00..19DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 19E00..19EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 19F00..19FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1A000..1A0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1A100..1A1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1A200..1A2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1A300..1A3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1A400..1A4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1A500..1A5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1A600..1A6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1A700..1A7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1A800..1A8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1A900..1A9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1AA00..1AAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1AB00..1ABFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1AC00..1ACFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1AD00..1ADFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1AE00..1AEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1AF00..1AFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1B000..1B0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1B100..1B1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1B200..1B2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1B300..1B3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1B400..1B4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1B500..1B5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1B600..1B6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1B700..1B7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1B800..1B8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1B900..1B9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1BA00..1BAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1BB00..1BBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1BC00..1BCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1BD00..1BDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1BE00..1BEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1BF00..1BFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1C000..1C0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1C100..1C1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1C200..1C2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1C300..1C3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1C400..1C4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1C500..1C5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1C600..1C6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1C700..1C7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1C800..1C8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1C900..1C9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1CA00..1CAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1CB00..1CBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1CC00..1CCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1CD00..1CDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1CE00..1CEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1CF00..1CFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1D000..1D0FF */
+  FriBidiPropertyBlockLevel1_1D100,  /* 1D100..1D1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1D200..1D2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1D300..1D3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1D400..1D4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1D500..1D5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1D600..1D6FF */
+  FriBidiPropertyBlockLevel1_1D700,  /* 1D700..1D7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1D800..1D8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1D900..1D9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1DA00..1DAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1DB00..1DBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1DC00..1DCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1DD00..1DDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1DE00..1DEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1DF00..1DFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1E000..1E0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1E100..1E1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1E200..1E2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1E300..1E3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1E400..1E4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1E500..1E5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1E600..1E6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1E700..1E7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1E800..1E8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1E900..1E9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1EA00..1EAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1EB00..1EBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1EC00..1ECFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1ED00..1EDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1EE00..1EEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1EF00..1EFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1F000..1F0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1F100..1F1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1F200..1F2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1F300..1F3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1F400..1F4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1F500..1F5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1F600..1F6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1F700..1F7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1F800..1F8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1F900..1F9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1FA00..1FAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1FB00..1FBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1FC00..1FCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1FD00..1FDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1FE00..1FEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 1FF00..1FFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 20000..200FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 20100..201FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 20200..202FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 20300..203FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 20400..204FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 20500..205FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 20600..206FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 20700..207FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 20800..208FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 20900..209FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 20A00..20AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 20B00..20BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 20C00..20CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 20D00..20DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 20E00..20EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 20F00..20FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 21000..210FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 21100..211FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 21200..212FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 21300..213FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 21400..214FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 21500..215FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 21600..216FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 21700..217FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 21800..218FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 21900..219FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 21A00..21AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 21B00..21BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 21C00..21CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 21D00..21DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 21E00..21EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 21F00..21FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 22000..220FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 22100..221FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 22200..222FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 22300..223FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 22400..224FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 22500..225FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 22600..226FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 22700..227FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 22800..228FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 22900..229FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 22A00..22AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 22B00..22BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 22C00..22CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 22D00..22DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 22E00..22EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 22F00..22FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 23000..230FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 23100..231FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 23200..232FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 23300..233FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 23400..234FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 23500..235FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 23600..236FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 23700..237FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 23800..238FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 23900..239FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 23A00..23AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 23B00..23BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 23C00..23CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 23D00..23DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 23E00..23EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 23F00..23FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 24000..240FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 24100..241FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 24200..242FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 24300..243FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 24400..244FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 24500..245FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 24600..246FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 24700..247FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 24800..248FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 24900..249FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 24A00..24AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 24B00..24BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 24C00..24CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 24D00..24DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 24E00..24EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 24F00..24FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 25000..250FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 25100..251FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 25200..252FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 25300..253FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 25400..254FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 25500..255FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 25600..256FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 25700..257FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 25800..258FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 25900..259FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 25A00..25AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 25B00..25BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 25C00..25CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 25D00..25DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 25E00..25EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 25F00..25FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 26000..260FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 26100..261FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 26200..262FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 26300..263FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 26400..264FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 26500..265FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 26600..266FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 26700..267FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 26800..268FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 26900..269FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 26A00..26AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 26B00..26BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 26C00..26CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 26D00..26DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 26E00..26EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 26F00..26FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 27000..270FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 27100..271FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 27200..272FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 27300..273FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 27400..274FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 27500..275FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 27600..276FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 27700..277FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 27800..278FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 27900..279FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 27A00..27AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 27B00..27BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 27C00..27CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 27D00..27DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 27E00..27EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 27F00..27FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 28000..280FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 28100..281FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 28200..282FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 28300..283FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 28400..284FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 28500..285FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 28600..286FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 28700..287FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 28800..288FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 28900..289FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 28A00..28AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 28B00..28BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 28C00..28CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 28D00..28DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 28E00..28EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 28F00..28FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 29000..290FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 29100..291FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 29200..292FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 29300..293FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 29400..294FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 29500..295FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 29600..296FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 29700..297FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 29800..298FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 29900..299FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 29A00..29AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 29B00..29BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 29C00..29CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 29D00..29DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 29E00..29EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 29F00..29FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2A000..2A0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2A100..2A1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2A200..2A2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2A300..2A3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2A400..2A4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2A500..2A5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2A600..2A6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2A700..2A7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2A800..2A8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2A900..2A9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2AA00..2AAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2AB00..2ABFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2AC00..2ACFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2AD00..2ADFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2AE00..2AEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2AF00..2AFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2B000..2B0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2B100..2B1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2B200..2B2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2B300..2B3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2B400..2B4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2B500..2B5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2B600..2B6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2B700..2B7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2B800..2B8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2B900..2B9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2BA00..2BAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2BB00..2BBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2BC00..2BCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2BD00..2BDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2BE00..2BEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2BF00..2BFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2C000..2C0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2C100..2C1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2C200..2C2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2C300..2C3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2C400..2C4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2C500..2C5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2C600..2C6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2C700..2C7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2C800..2C8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2C900..2C9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2CA00..2CAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2CB00..2CBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2CC00..2CCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2CD00..2CDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2CE00..2CEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2CF00..2CFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2D000..2D0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2D100..2D1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2D200..2D2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2D300..2D3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2D400..2D4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2D500..2D5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2D600..2D6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2D700..2D7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2D800..2D8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2D900..2D9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2DA00..2DAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2DB00..2DBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2DC00..2DCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2DD00..2DDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2DE00..2DEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2DF00..2DFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2E000..2E0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2E100..2E1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2E200..2E2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2E300..2E3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2E400..2E4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2E500..2E5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2E600..2E6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2E700..2E7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2E800..2E8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2E900..2E9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2EA00..2EAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2EB00..2EBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2EC00..2ECFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2ED00..2EDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2EE00..2EEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2EF00..2EFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2F000..2F0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2F100..2F1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2F200..2F2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2F300..2F3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2F400..2F4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2F500..2F5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2F600..2F6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2F700..2F7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2F800..2F8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2F900..2F9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2FA00..2FAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2FB00..2FBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2FC00..2FCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2FD00..2FDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2FE00..2FEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 2FF00..2FFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 30000..300FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 30100..301FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 30200..302FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 30300..303FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 30400..304FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 30500..305FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 30600..306FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 30700..307FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 30800..308FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 30900..309FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 30A00..30AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 30B00..30BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 30C00..30CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 30D00..30DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 30E00..30EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 30F00..30FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 31000..310FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 31100..311FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 31200..312FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 31300..313FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 31400..314FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 31500..315FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 31600..316FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 31700..317FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 31800..318FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 31900..319FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 31A00..31AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 31B00..31BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 31C00..31CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 31D00..31DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 31E00..31EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 31F00..31FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 32000..320FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 32100..321FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 32200..322FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 32300..323FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 32400..324FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 32500..325FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 32600..326FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 32700..327FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 32800..328FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 32900..329FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 32A00..32AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 32B00..32BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 32C00..32CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 32D00..32DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 32E00..32EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 32F00..32FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 33000..330FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 33100..331FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 33200..332FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 33300..333FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 33400..334FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 33500..335FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 33600..336FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 33700..337FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 33800..338FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 33900..339FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 33A00..33AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 33B00..33BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 33C00..33CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 33D00..33DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 33E00..33EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 33F00..33FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 34000..340FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 34100..341FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 34200..342FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 34300..343FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 34400..344FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 34500..345FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 34600..346FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 34700..347FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 34800..348FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 34900..349FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 34A00..34AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 34B00..34BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 34C00..34CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 34D00..34DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 34E00..34EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 34F00..34FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 35000..350FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 35100..351FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 35200..352FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 35300..353FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 35400..354FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 35500..355FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 35600..356FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 35700..357FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 35800..358FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 35900..359FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 35A00..35AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 35B00..35BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 35C00..35CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 35D00..35DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 35E00..35EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 35F00..35FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 36000..360FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 36100..361FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 36200..362FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 36300..363FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 36400..364FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 36500..365FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 36600..366FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 36700..367FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 36800..368FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 36900..369FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 36A00..36AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 36B00..36BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 36C00..36CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 36D00..36DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 36E00..36EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 36F00..36FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 37000..370FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 37100..371FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 37200..372FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 37300..373FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 37400..374FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 37500..375FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 37600..376FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 37700..377FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 37800..378FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 37900..379FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 37A00..37AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 37B00..37BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 37C00..37CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 37D00..37DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 37E00..37EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 37F00..37FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 38000..380FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 38100..381FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 38200..382FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 38300..383FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 38400..384FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 38500..385FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 38600..386FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 38700..387FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 38800..388FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 38900..389FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 38A00..38AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 38B00..38BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 38C00..38CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 38D00..38DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 38E00..38EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 38F00..38FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 39000..390FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 39100..391FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 39200..392FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 39300..393FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 39400..394FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 39500..395FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 39600..396FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 39700..397FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 39800..398FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 39900..399FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 39A00..39AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 39B00..39BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 39C00..39CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 39D00..39DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 39E00..39EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 39F00..39FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3A000..3A0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3A100..3A1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3A200..3A2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3A300..3A3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3A400..3A4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3A500..3A5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3A600..3A6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3A700..3A7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3A800..3A8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3A900..3A9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3AA00..3AAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3AB00..3ABFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3AC00..3ACFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3AD00..3ADFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3AE00..3AEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3AF00..3AFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3B000..3B0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3B100..3B1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3B200..3B2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3B300..3B3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3B400..3B4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3B500..3B5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3B600..3B6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3B700..3B7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3B800..3B8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3B900..3B9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3BA00..3BAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3BB00..3BBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3BC00..3BCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3BD00..3BDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3BE00..3BEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3BF00..3BFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3C000..3C0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3C100..3C1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3C200..3C2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3C300..3C3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3C400..3C4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3C500..3C5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3C600..3C6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3C700..3C7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3C800..3C8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3C900..3C9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3CA00..3CAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3CB00..3CBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3CC00..3CCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3CD00..3CDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3CE00..3CEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3CF00..3CFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3D000..3D0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3D100..3D1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3D200..3D2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3D300..3D3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3D400..3D4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3D500..3D5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3D600..3D6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3D700..3D7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3D800..3D8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3D900..3D9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3DA00..3DAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3DB00..3DBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3DC00..3DCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3DD00..3DDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3DE00..3DEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3DF00..3DFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3E000..3E0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3E100..3E1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3E200..3E2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3E300..3E3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3E400..3E4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3E500..3E5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3E600..3E6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3E700..3E7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3E800..3E8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3E900..3E9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3EA00..3EAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3EB00..3EBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3EC00..3ECFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3ED00..3EDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3EE00..3EEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3EF00..3EFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3F000..3F0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3F100..3F1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3F200..3F2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3F300..3F3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3F400..3F4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3F500..3F5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3F600..3F6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3F700..3F7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3F800..3F8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3F900..3F9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3FA00..3FAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3FB00..3FBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3FC00..3FCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3FD00..3FDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3FE00..3FEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 3FF00..3FFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 40000..400FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 40100..401FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 40200..402FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 40300..403FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 40400..404FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 40500..405FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 40600..406FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 40700..407FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 40800..408FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 40900..409FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 40A00..40AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 40B00..40BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 40C00..40CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 40D00..40DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 40E00..40EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 40F00..40FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 41000..410FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 41100..411FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 41200..412FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 41300..413FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 41400..414FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 41500..415FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 41600..416FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 41700..417FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 41800..418FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 41900..419FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 41A00..41AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 41B00..41BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 41C00..41CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 41D00..41DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 41E00..41EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 41F00..41FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 42000..420FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 42100..421FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 42200..422FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 42300..423FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 42400..424FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 42500..425FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 42600..426FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 42700..427FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 42800..428FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 42900..429FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 42A00..42AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 42B00..42BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 42C00..42CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 42D00..42DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 42E00..42EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 42F00..42FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 43000..430FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 43100..431FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 43200..432FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 43300..433FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 43400..434FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 43500..435FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 43600..436FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 43700..437FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 43800..438FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 43900..439FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 43A00..43AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 43B00..43BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 43C00..43CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 43D00..43DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 43E00..43EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 43F00..43FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 44000..440FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 44100..441FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 44200..442FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 44300..443FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 44400..444FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 44500..445FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 44600..446FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 44700..447FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 44800..448FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 44900..449FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 44A00..44AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 44B00..44BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 44C00..44CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 44D00..44DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 44E00..44EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 44F00..44FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 45000..450FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 45100..451FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 45200..452FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 45300..453FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 45400..454FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 45500..455FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 45600..456FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 45700..457FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 45800..458FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 45900..459FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 45A00..45AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 45B00..45BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 45C00..45CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 45D00..45DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 45E00..45EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 45F00..45FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 46000..460FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 46100..461FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 46200..462FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 46300..463FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 46400..464FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 46500..465FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 46600..466FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 46700..467FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 46800..468FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 46900..469FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 46A00..46AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 46B00..46BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 46C00..46CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 46D00..46DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 46E00..46EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 46F00..46FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 47000..470FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 47100..471FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 47200..472FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 47300..473FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 47400..474FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 47500..475FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 47600..476FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 47700..477FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 47800..478FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 47900..479FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 47A00..47AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 47B00..47BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 47C00..47CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 47D00..47DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 47E00..47EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 47F00..47FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 48000..480FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 48100..481FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 48200..482FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 48300..483FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 48400..484FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 48500..485FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 48600..486FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 48700..487FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 48800..488FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 48900..489FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 48A00..48AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 48B00..48BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 48C00..48CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 48D00..48DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 48E00..48EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 48F00..48FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 49000..490FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 49100..491FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 49200..492FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 49300..493FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 49400..494FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 49500..495FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 49600..496FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 49700..497FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 49800..498FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 49900..499FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 49A00..49AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 49B00..49BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 49C00..49CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 49D00..49DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 49E00..49EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 49F00..49FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4A000..4A0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4A100..4A1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4A200..4A2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4A300..4A3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4A400..4A4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4A500..4A5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4A600..4A6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4A700..4A7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4A800..4A8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4A900..4A9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4AA00..4AAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4AB00..4ABFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4AC00..4ACFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4AD00..4ADFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4AE00..4AEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4AF00..4AFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4B000..4B0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4B100..4B1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4B200..4B2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4B300..4B3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4B400..4B4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4B500..4B5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4B600..4B6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4B700..4B7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4B800..4B8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4B900..4B9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4BA00..4BAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4BB00..4BBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4BC00..4BCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4BD00..4BDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4BE00..4BEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4BF00..4BFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4C000..4C0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4C100..4C1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4C200..4C2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4C300..4C3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4C400..4C4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4C500..4C5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4C600..4C6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4C700..4C7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4C800..4C8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4C900..4C9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4CA00..4CAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4CB00..4CBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4CC00..4CCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4CD00..4CDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4CE00..4CEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4CF00..4CFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4D000..4D0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4D100..4D1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4D200..4D2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4D300..4D3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4D400..4D4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4D500..4D5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4D600..4D6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4D700..4D7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4D800..4D8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4D900..4D9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4DA00..4DAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4DB00..4DBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4DC00..4DCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4DD00..4DDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4DE00..4DEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4DF00..4DFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4E000..4E0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4E100..4E1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4E200..4E2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4E300..4E3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4E400..4E4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4E500..4E5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4E600..4E6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4E700..4E7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4E800..4E8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4E900..4E9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4EA00..4EAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4EB00..4EBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4EC00..4ECFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4ED00..4EDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4EE00..4EEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4EF00..4EFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4F000..4F0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4F100..4F1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4F200..4F2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4F300..4F3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4F400..4F4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4F500..4F5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4F600..4F6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4F700..4F7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4F800..4F8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4F900..4F9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4FA00..4FAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4FB00..4FBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4FC00..4FCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4FD00..4FDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4FE00..4FEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 4FF00..4FFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 50000..500FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 50100..501FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 50200..502FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 50300..503FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 50400..504FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 50500..505FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 50600..506FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 50700..507FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 50800..508FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 50900..509FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 50A00..50AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 50B00..50BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 50C00..50CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 50D00..50DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 50E00..50EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 50F00..50FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 51000..510FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 51100..511FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 51200..512FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 51300..513FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 51400..514FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 51500..515FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 51600..516FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 51700..517FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 51800..518FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 51900..519FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 51A00..51AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 51B00..51BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 51C00..51CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 51D00..51DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 51E00..51EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 51F00..51FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 52000..520FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 52100..521FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 52200..522FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 52300..523FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 52400..524FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 52500..525FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 52600..526FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 52700..527FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 52800..528FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 52900..529FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 52A00..52AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 52B00..52BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 52C00..52CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 52D00..52DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 52E00..52EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 52F00..52FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 53000..530FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 53100..531FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 53200..532FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 53300..533FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 53400..534FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 53500..535FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 53600..536FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 53700..537FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 53800..538FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 53900..539FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 53A00..53AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 53B00..53BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 53C00..53CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 53D00..53DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 53E00..53EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 53F00..53FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 54000..540FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 54100..541FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 54200..542FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 54300..543FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 54400..544FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 54500..545FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 54600..546FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 54700..547FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 54800..548FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 54900..549FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 54A00..54AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 54B00..54BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 54C00..54CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 54D00..54DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 54E00..54EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 54F00..54FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 55000..550FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 55100..551FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 55200..552FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 55300..553FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 55400..554FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 55500..555FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 55600..556FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 55700..557FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 55800..558FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 55900..559FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 55A00..55AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 55B00..55BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 55C00..55CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 55D00..55DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 55E00..55EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 55F00..55FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 56000..560FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 56100..561FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 56200..562FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 56300..563FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 56400..564FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 56500..565FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 56600..566FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 56700..567FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 56800..568FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 56900..569FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 56A00..56AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 56B00..56BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 56C00..56CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 56D00..56DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 56E00..56EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 56F00..56FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 57000..570FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 57100..571FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 57200..572FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 57300..573FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 57400..574FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 57500..575FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 57600..576FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 57700..577FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 57800..578FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 57900..579FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 57A00..57AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 57B00..57BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 57C00..57CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 57D00..57DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 57E00..57EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 57F00..57FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 58000..580FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 58100..581FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 58200..582FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 58300..583FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 58400..584FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 58500..585FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 58600..586FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 58700..587FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 58800..588FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 58900..589FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 58A00..58AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 58B00..58BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 58C00..58CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 58D00..58DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 58E00..58EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 58F00..58FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 59000..590FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 59100..591FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 59200..592FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 59300..593FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 59400..594FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 59500..595FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 59600..596FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 59700..597FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 59800..598FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 59900..599FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 59A00..59AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 59B00..59BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 59C00..59CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 59D00..59DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 59E00..59EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 59F00..59FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5A000..5A0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5A100..5A1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5A200..5A2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5A300..5A3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5A400..5A4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5A500..5A5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5A600..5A6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5A700..5A7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5A800..5A8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5A900..5A9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5AA00..5AAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5AB00..5ABFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5AC00..5ACFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5AD00..5ADFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5AE00..5AEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5AF00..5AFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5B000..5B0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5B100..5B1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5B200..5B2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5B300..5B3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5B400..5B4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5B500..5B5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5B600..5B6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5B700..5B7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5B800..5B8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5B900..5B9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5BA00..5BAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5BB00..5BBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5BC00..5BCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5BD00..5BDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5BE00..5BEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5BF00..5BFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5C000..5C0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5C100..5C1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5C200..5C2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5C300..5C3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5C400..5C4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5C500..5C5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5C600..5C6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5C700..5C7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5C800..5C8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5C900..5C9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5CA00..5CAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5CB00..5CBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5CC00..5CCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5CD00..5CDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5CE00..5CEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5CF00..5CFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5D000..5D0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5D100..5D1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5D200..5D2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5D300..5D3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5D400..5D4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5D500..5D5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5D600..5D6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5D700..5D7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5D800..5D8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5D900..5D9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5DA00..5DAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5DB00..5DBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5DC00..5DCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5DD00..5DDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5DE00..5DEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5DF00..5DFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5E000..5E0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5E100..5E1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5E200..5E2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5E300..5E3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5E400..5E4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5E500..5E5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5E600..5E6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5E700..5E7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5E800..5E8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5E900..5E9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5EA00..5EAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5EB00..5EBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5EC00..5ECFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5ED00..5EDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5EE00..5EEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5EF00..5EFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5F000..5F0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5F100..5F1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5F200..5F2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5F300..5F3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5F400..5F4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5F500..5F5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5F600..5F6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5F700..5F7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5F800..5F8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5F900..5F9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5FA00..5FAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5FB00..5FBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5FC00..5FCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5FD00..5FDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5FE00..5FEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 5FF00..5FFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 60000..600FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 60100..601FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 60200..602FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 60300..603FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 60400..604FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 60500..605FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 60600..606FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 60700..607FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 60800..608FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 60900..609FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 60A00..60AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 60B00..60BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 60C00..60CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 60D00..60DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 60E00..60EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 60F00..60FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 61000..610FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 61100..611FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 61200..612FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 61300..613FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 61400..614FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 61500..615FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 61600..616FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 61700..617FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 61800..618FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 61900..619FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 61A00..61AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 61B00..61BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 61C00..61CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 61D00..61DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 61E00..61EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 61F00..61FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 62000..620FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 62100..621FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 62200..622FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 62300..623FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 62400..624FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 62500..625FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 62600..626FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 62700..627FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 62800..628FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 62900..629FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 62A00..62AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 62B00..62BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 62C00..62CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 62D00..62DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 62E00..62EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 62F00..62FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 63000..630FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 63100..631FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 63200..632FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 63300..633FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 63400..634FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 63500..635FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 63600..636FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 63700..637FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 63800..638FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 63900..639FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 63A00..63AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 63B00..63BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 63C00..63CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 63D00..63DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 63E00..63EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 63F00..63FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 64000..640FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 64100..641FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 64200..642FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 64300..643FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 64400..644FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 64500..645FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 64600..646FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 64700..647FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 64800..648FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 64900..649FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 64A00..64AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 64B00..64BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 64C00..64CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 64D00..64DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 64E00..64EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 64F00..64FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 65000..650FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 65100..651FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 65200..652FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 65300..653FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 65400..654FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 65500..655FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 65600..656FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 65700..657FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 65800..658FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 65900..659FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 65A00..65AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 65B00..65BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 65C00..65CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 65D00..65DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 65E00..65EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 65F00..65FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 66000..660FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 66100..661FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 66200..662FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 66300..663FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 66400..664FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 66500..665FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 66600..666FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 66700..667FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 66800..668FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 66900..669FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 66A00..66AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 66B00..66BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 66C00..66CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 66D00..66DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 66E00..66EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 66F00..66FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 67000..670FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 67100..671FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 67200..672FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 67300..673FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 67400..674FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 67500..675FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 67600..676FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 67700..677FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 67800..678FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 67900..679FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 67A00..67AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 67B00..67BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 67C00..67CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 67D00..67DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 67E00..67EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 67F00..67FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 68000..680FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 68100..681FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 68200..682FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 68300..683FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 68400..684FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 68500..685FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 68600..686FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 68700..687FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 68800..688FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 68900..689FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 68A00..68AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 68B00..68BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 68C00..68CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 68D00..68DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 68E00..68EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 68F00..68FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 69000..690FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 69100..691FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 69200..692FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 69300..693FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 69400..694FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 69500..695FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 69600..696FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 69700..697FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 69800..698FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 69900..699FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 69A00..69AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 69B00..69BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 69C00..69CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 69D00..69DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 69E00..69EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 69F00..69FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6A000..6A0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6A100..6A1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6A200..6A2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6A300..6A3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6A400..6A4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6A500..6A5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6A600..6A6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6A700..6A7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6A800..6A8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6A900..6A9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6AA00..6AAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6AB00..6ABFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6AC00..6ACFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6AD00..6ADFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6AE00..6AEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6AF00..6AFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6B000..6B0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6B100..6B1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6B200..6B2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6B300..6B3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6B400..6B4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6B500..6B5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6B600..6B6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6B700..6B7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6B800..6B8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6B900..6B9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6BA00..6BAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6BB00..6BBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6BC00..6BCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6BD00..6BDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6BE00..6BEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6BF00..6BFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6C000..6C0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6C100..6C1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6C200..6C2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6C300..6C3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6C400..6C4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6C500..6C5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6C600..6C6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6C700..6C7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6C800..6C8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6C900..6C9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6CA00..6CAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6CB00..6CBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6CC00..6CCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6CD00..6CDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6CE00..6CEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6CF00..6CFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6D000..6D0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6D100..6D1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6D200..6D2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6D300..6D3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6D400..6D4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6D500..6D5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6D600..6D6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6D700..6D7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6D800..6D8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6D900..6D9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6DA00..6DAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6DB00..6DBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6DC00..6DCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6DD00..6DDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6DE00..6DEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6DF00..6DFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6E000..6E0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6E100..6E1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6E200..6E2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6E300..6E3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6E400..6E4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6E500..6E5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6E600..6E6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6E700..6E7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6E800..6E8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6E900..6E9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6EA00..6EAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6EB00..6EBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6EC00..6ECFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6ED00..6EDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6EE00..6EEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6EF00..6EFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6F000..6F0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6F100..6F1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6F200..6F2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6F300..6F3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6F400..6F4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6F500..6F5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6F600..6F6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6F700..6F7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6F800..6F8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6F900..6F9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6FA00..6FAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6FB00..6FBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6FC00..6FCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6FD00..6FDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6FE00..6FEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 6FF00..6FFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 70000..700FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 70100..701FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 70200..702FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 70300..703FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 70400..704FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 70500..705FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 70600..706FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 70700..707FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 70800..708FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 70900..709FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 70A00..70AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 70B00..70BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 70C00..70CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 70D00..70DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 70E00..70EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 70F00..70FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 71000..710FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 71100..711FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 71200..712FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 71300..713FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 71400..714FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 71500..715FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 71600..716FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 71700..717FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 71800..718FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 71900..719FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 71A00..71AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 71B00..71BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 71C00..71CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 71D00..71DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 71E00..71EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 71F00..71FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 72000..720FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 72100..721FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 72200..722FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 72300..723FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 72400..724FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 72500..725FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 72600..726FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 72700..727FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 72800..728FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 72900..729FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 72A00..72AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 72B00..72BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 72C00..72CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 72D00..72DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 72E00..72EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 72F00..72FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 73000..730FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 73100..731FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 73200..732FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 73300..733FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 73400..734FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 73500..735FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 73600..736FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 73700..737FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 73800..738FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 73900..739FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 73A00..73AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 73B00..73BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 73C00..73CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 73D00..73DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 73E00..73EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 73F00..73FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 74000..740FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 74100..741FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 74200..742FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 74300..743FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 74400..744FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 74500..745FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 74600..746FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 74700..747FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 74800..748FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 74900..749FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 74A00..74AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 74B00..74BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 74C00..74CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 74D00..74DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 74E00..74EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 74F00..74FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 75000..750FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 75100..751FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 75200..752FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 75300..753FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 75400..754FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 75500..755FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 75600..756FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 75700..757FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 75800..758FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 75900..759FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 75A00..75AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 75B00..75BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 75C00..75CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 75D00..75DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 75E00..75EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 75F00..75FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 76000..760FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 76100..761FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 76200..762FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 76300..763FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 76400..764FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 76500..765FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 76600..766FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 76700..767FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 76800..768FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 76900..769FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 76A00..76AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 76B00..76BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 76C00..76CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 76D00..76DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 76E00..76EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 76F00..76FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 77000..770FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 77100..771FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 77200..772FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 77300..773FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 77400..774FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 77500..775FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 77600..776FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 77700..777FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 77800..778FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 77900..779FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 77A00..77AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 77B00..77BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 77C00..77CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 77D00..77DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 77E00..77EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 77F00..77FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 78000..780FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 78100..781FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 78200..782FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 78300..783FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 78400..784FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 78500..785FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 78600..786FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 78700..787FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 78800..788FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 78900..789FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 78A00..78AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 78B00..78BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 78C00..78CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 78D00..78DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 78E00..78EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 78F00..78FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 79000..790FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 79100..791FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 79200..792FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 79300..793FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 79400..794FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 79500..795FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 79600..796FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 79700..797FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 79800..798FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 79900..799FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 79A00..79AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 79B00..79BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 79C00..79CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 79D00..79DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 79E00..79EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 79F00..79FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7A000..7A0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7A100..7A1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7A200..7A2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7A300..7A3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7A400..7A4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7A500..7A5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7A600..7A6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7A700..7A7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7A800..7A8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7A900..7A9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7AA00..7AAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7AB00..7ABFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7AC00..7ACFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7AD00..7ADFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7AE00..7AEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7AF00..7AFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7B000..7B0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7B100..7B1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7B200..7B2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7B300..7B3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7B400..7B4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7B500..7B5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7B600..7B6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7B700..7B7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7B800..7B8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7B900..7B9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7BA00..7BAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7BB00..7BBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7BC00..7BCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7BD00..7BDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7BE00..7BEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7BF00..7BFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7C000..7C0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7C100..7C1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7C200..7C2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7C300..7C3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7C400..7C4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7C500..7C5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7C600..7C6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7C700..7C7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7C800..7C8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7C900..7C9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7CA00..7CAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7CB00..7CBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7CC00..7CCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7CD00..7CDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7CE00..7CEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7CF00..7CFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7D000..7D0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7D100..7D1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7D200..7D2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7D300..7D3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7D400..7D4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7D500..7D5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7D600..7D6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7D700..7D7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7D800..7D8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7D900..7D9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7DA00..7DAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7DB00..7DBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7DC00..7DCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7DD00..7DDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7DE00..7DEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7DF00..7DFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7E000..7E0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7E100..7E1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7E200..7E2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7E300..7E3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7E400..7E4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7E500..7E5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7E600..7E6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7E700..7E7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7E800..7E8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7E900..7E9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7EA00..7EAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7EB00..7EBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7EC00..7ECFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7ED00..7EDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7EE00..7EEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7EF00..7EFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7F000..7F0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7F100..7F1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7F200..7F2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7F300..7F3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7F400..7F4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7F500..7F5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7F600..7F6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7F700..7F7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7F800..7F8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7F900..7F9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7FA00..7FAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7FB00..7FBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7FC00..7FCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7FD00..7FDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7FE00..7FEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 7FF00..7FFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 80000..800FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 80100..801FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 80200..802FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 80300..803FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 80400..804FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 80500..805FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 80600..806FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 80700..807FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 80800..808FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 80900..809FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 80A00..80AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 80B00..80BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 80C00..80CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 80D00..80DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 80E00..80EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 80F00..80FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 81000..810FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 81100..811FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 81200..812FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 81300..813FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 81400..814FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 81500..815FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 81600..816FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 81700..817FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 81800..818FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 81900..819FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 81A00..81AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 81B00..81BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 81C00..81CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 81D00..81DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 81E00..81EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 81F00..81FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 82000..820FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 82100..821FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 82200..822FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 82300..823FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 82400..824FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 82500..825FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 82600..826FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 82700..827FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 82800..828FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 82900..829FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 82A00..82AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 82B00..82BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 82C00..82CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 82D00..82DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 82E00..82EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 82F00..82FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 83000..830FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 83100..831FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 83200..832FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 83300..833FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 83400..834FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 83500..835FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 83600..836FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 83700..837FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 83800..838FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 83900..839FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 83A00..83AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 83B00..83BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 83C00..83CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 83D00..83DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 83E00..83EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 83F00..83FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 84000..840FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 84100..841FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 84200..842FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 84300..843FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 84400..844FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 84500..845FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 84600..846FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 84700..847FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 84800..848FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 84900..849FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 84A00..84AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 84B00..84BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 84C00..84CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 84D00..84DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 84E00..84EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 84F00..84FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 85000..850FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 85100..851FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 85200..852FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 85300..853FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 85400..854FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 85500..855FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 85600..856FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 85700..857FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 85800..858FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 85900..859FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 85A00..85AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 85B00..85BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 85C00..85CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 85D00..85DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 85E00..85EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 85F00..85FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 86000..860FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 86100..861FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 86200..862FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 86300..863FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 86400..864FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 86500..865FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 86600..866FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 86700..867FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 86800..868FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 86900..869FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 86A00..86AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 86B00..86BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 86C00..86CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 86D00..86DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 86E00..86EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 86F00..86FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 87000..870FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 87100..871FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 87200..872FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 87300..873FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 87400..874FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 87500..875FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 87600..876FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 87700..877FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 87800..878FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 87900..879FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 87A00..87AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 87B00..87BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 87C00..87CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 87D00..87DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 87E00..87EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 87F00..87FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 88000..880FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 88100..881FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 88200..882FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 88300..883FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 88400..884FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 88500..885FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 88600..886FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 88700..887FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 88800..888FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 88900..889FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 88A00..88AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 88B00..88BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 88C00..88CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 88D00..88DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 88E00..88EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 88F00..88FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 89000..890FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 89100..891FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 89200..892FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 89300..893FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 89400..894FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 89500..895FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 89600..896FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 89700..897FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 89800..898FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 89900..899FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 89A00..89AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 89B00..89BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 89C00..89CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 89D00..89DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 89E00..89EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 89F00..89FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8A000..8A0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8A100..8A1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8A200..8A2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8A300..8A3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8A400..8A4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8A500..8A5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8A600..8A6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8A700..8A7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8A800..8A8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8A900..8A9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8AA00..8AAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8AB00..8ABFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8AC00..8ACFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8AD00..8ADFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8AE00..8AEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8AF00..8AFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8B000..8B0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8B100..8B1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8B200..8B2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8B300..8B3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8B400..8B4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8B500..8B5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8B600..8B6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8B700..8B7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8B800..8B8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8B900..8B9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8BA00..8BAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8BB00..8BBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8BC00..8BCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8BD00..8BDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8BE00..8BEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8BF00..8BFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8C000..8C0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8C100..8C1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8C200..8C2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8C300..8C3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8C400..8C4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8C500..8C5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8C600..8C6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8C700..8C7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8C800..8C8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8C900..8C9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8CA00..8CAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8CB00..8CBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8CC00..8CCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8CD00..8CDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8CE00..8CEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8CF00..8CFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8D000..8D0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8D100..8D1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8D200..8D2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8D300..8D3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8D400..8D4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8D500..8D5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8D600..8D6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8D700..8D7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8D800..8D8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8D900..8D9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8DA00..8DAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8DB00..8DBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8DC00..8DCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8DD00..8DDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8DE00..8DEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8DF00..8DFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8E000..8E0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8E100..8E1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8E200..8E2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8E300..8E3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8E400..8E4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8E500..8E5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8E600..8E6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8E700..8E7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8E800..8E8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8E900..8E9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8EA00..8EAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8EB00..8EBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8EC00..8ECFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8ED00..8EDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8EE00..8EEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8EF00..8EFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8F000..8F0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8F100..8F1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8F200..8F2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8F300..8F3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8F400..8F4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8F500..8F5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8F600..8F6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8F700..8F7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8F800..8F8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8F900..8F9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8FA00..8FAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8FB00..8FBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8FC00..8FCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8FD00..8FDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8FE00..8FEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 8FF00..8FFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 90000..900FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 90100..901FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 90200..902FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 90300..903FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 90400..904FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 90500..905FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 90600..906FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 90700..907FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 90800..908FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 90900..909FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 90A00..90AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 90B00..90BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 90C00..90CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 90D00..90DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 90E00..90EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 90F00..90FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 91000..910FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 91100..911FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 91200..912FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 91300..913FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 91400..914FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 91500..915FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 91600..916FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 91700..917FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 91800..918FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 91900..919FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 91A00..91AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 91B00..91BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 91C00..91CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 91D00..91DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 91E00..91EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 91F00..91FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 92000..920FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 92100..921FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 92200..922FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 92300..923FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 92400..924FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 92500..925FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 92600..926FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 92700..927FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 92800..928FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 92900..929FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 92A00..92AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 92B00..92BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 92C00..92CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 92D00..92DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 92E00..92EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 92F00..92FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 93000..930FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 93100..931FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 93200..932FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 93300..933FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 93400..934FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 93500..935FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 93600..936FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 93700..937FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 93800..938FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 93900..939FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 93A00..93AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 93B00..93BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 93C00..93CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 93D00..93DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 93E00..93EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 93F00..93FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 94000..940FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 94100..941FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 94200..942FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 94300..943FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 94400..944FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 94500..945FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 94600..946FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 94700..947FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 94800..948FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 94900..949FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 94A00..94AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 94B00..94BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 94C00..94CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 94D00..94DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 94E00..94EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 94F00..94FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 95000..950FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 95100..951FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 95200..952FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 95300..953FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 95400..954FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 95500..955FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 95600..956FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 95700..957FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 95800..958FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 95900..959FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 95A00..95AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 95B00..95BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 95C00..95CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 95D00..95DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 95E00..95EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 95F00..95FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 96000..960FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 96100..961FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 96200..962FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 96300..963FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 96400..964FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 96500..965FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 96600..966FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 96700..967FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 96800..968FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 96900..969FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 96A00..96AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 96B00..96BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 96C00..96CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 96D00..96DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 96E00..96EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 96F00..96FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 97000..970FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 97100..971FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 97200..972FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 97300..973FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 97400..974FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 97500..975FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 97600..976FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 97700..977FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 97800..978FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 97900..979FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 97A00..97AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 97B00..97BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 97C00..97CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 97D00..97DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 97E00..97EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 97F00..97FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 98000..980FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 98100..981FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 98200..982FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 98300..983FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 98400..984FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 98500..985FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 98600..986FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 98700..987FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 98800..988FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 98900..989FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 98A00..98AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 98B00..98BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 98C00..98CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 98D00..98DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 98E00..98EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 98F00..98FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 99000..990FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 99100..991FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 99200..992FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 99300..993FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 99400..994FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 99500..995FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 99600..996FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 99700..997FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 99800..998FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 99900..999FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 99A00..99AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 99B00..99BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 99C00..99CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 99D00..99DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 99E00..99EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 99F00..99FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9A000..9A0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9A100..9A1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9A200..9A2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9A300..9A3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9A400..9A4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9A500..9A5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9A600..9A6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9A700..9A7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9A800..9A8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9A900..9A9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9AA00..9AAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9AB00..9ABFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9AC00..9ACFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9AD00..9ADFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9AE00..9AEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9AF00..9AFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9B000..9B0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9B100..9B1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9B200..9B2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9B300..9B3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9B400..9B4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9B500..9B5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9B600..9B6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9B700..9B7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9B800..9B8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9B900..9B9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9BA00..9BAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9BB00..9BBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9BC00..9BCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9BD00..9BDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9BE00..9BEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9BF00..9BFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9C000..9C0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9C100..9C1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9C200..9C2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9C300..9C3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9C400..9C4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9C500..9C5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9C600..9C6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9C700..9C7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9C800..9C8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9C900..9C9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9CA00..9CAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9CB00..9CBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9CC00..9CCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9CD00..9CDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9CE00..9CEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9CF00..9CFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9D000..9D0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9D100..9D1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9D200..9D2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9D300..9D3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9D400..9D4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9D500..9D5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9D600..9D6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9D700..9D7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9D800..9D8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9D900..9D9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9DA00..9DAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9DB00..9DBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9DC00..9DCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9DD00..9DDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9DE00..9DEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9DF00..9DFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9E000..9E0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9E100..9E1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9E200..9E2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9E300..9E3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9E400..9E4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9E500..9E5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9E600..9E6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9E700..9E7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9E800..9E8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9E900..9E9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9EA00..9EAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9EB00..9EBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9EC00..9ECFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9ED00..9EDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9EE00..9EEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9EF00..9EFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9F000..9F0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9F100..9F1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9F200..9F2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9F300..9F3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9F400..9F4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9F500..9F5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9F600..9F6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9F700..9F7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9F800..9F8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9F900..9F9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9FA00..9FAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9FB00..9FBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9FC00..9FCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9FD00..9FDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9FE00..9FEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 9FF00..9FFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A0000..A00FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A0100..A01FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A0200..A02FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A0300..A03FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A0400..A04FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A0500..A05FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A0600..A06FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A0700..A07FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A0800..A08FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A0900..A09FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A0A00..A0AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A0B00..A0BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A0C00..A0CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A0D00..A0DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A0E00..A0EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A0F00..A0FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A1000..A10FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A1100..A11FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A1200..A12FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A1300..A13FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A1400..A14FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A1500..A15FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A1600..A16FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A1700..A17FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A1800..A18FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A1900..A19FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A1A00..A1AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A1B00..A1BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A1C00..A1CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A1D00..A1DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A1E00..A1EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A1F00..A1FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A2000..A20FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A2100..A21FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A2200..A22FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A2300..A23FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A2400..A24FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A2500..A25FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A2600..A26FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A2700..A27FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A2800..A28FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A2900..A29FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A2A00..A2AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A2B00..A2BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A2C00..A2CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A2D00..A2DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A2E00..A2EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A2F00..A2FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A3000..A30FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A3100..A31FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A3200..A32FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A3300..A33FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A3400..A34FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A3500..A35FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A3600..A36FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A3700..A37FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A3800..A38FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A3900..A39FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A3A00..A3AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A3B00..A3BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A3C00..A3CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A3D00..A3DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A3E00..A3EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A3F00..A3FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A4000..A40FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A4100..A41FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A4200..A42FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A4300..A43FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A4400..A44FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A4500..A45FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A4600..A46FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A4700..A47FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A4800..A48FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A4900..A49FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A4A00..A4AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A4B00..A4BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A4C00..A4CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A4D00..A4DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A4E00..A4EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A4F00..A4FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A5000..A50FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A5100..A51FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A5200..A52FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A5300..A53FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A5400..A54FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A5500..A55FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A5600..A56FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A5700..A57FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A5800..A58FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A5900..A59FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A5A00..A5AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A5B00..A5BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A5C00..A5CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A5D00..A5DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A5E00..A5EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A5F00..A5FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A6000..A60FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A6100..A61FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A6200..A62FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A6300..A63FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A6400..A64FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A6500..A65FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A6600..A66FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A6700..A67FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A6800..A68FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A6900..A69FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A6A00..A6AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A6B00..A6BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A6C00..A6CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A6D00..A6DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A6E00..A6EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A6F00..A6FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A7000..A70FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A7100..A71FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A7200..A72FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A7300..A73FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A7400..A74FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A7500..A75FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A7600..A76FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A7700..A77FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A7800..A78FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A7900..A79FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A7A00..A7AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A7B00..A7BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A7C00..A7CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A7D00..A7DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A7E00..A7EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A7F00..A7FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A8000..A80FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A8100..A81FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A8200..A82FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A8300..A83FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A8400..A84FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A8500..A85FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A8600..A86FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A8700..A87FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A8800..A88FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A8900..A89FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A8A00..A8AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A8B00..A8BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A8C00..A8CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A8D00..A8DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A8E00..A8EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A8F00..A8FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A9000..A90FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A9100..A91FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A9200..A92FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A9300..A93FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A9400..A94FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A9500..A95FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A9600..A96FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A9700..A97FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A9800..A98FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A9900..A99FF */
+  FriBidiPropertyBlockLevel1_0100,  /* A9A00..A9AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A9B00..A9BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A9C00..A9CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A9D00..A9DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A9E00..A9EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* A9F00..A9FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AA000..AA0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AA100..AA1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AA200..AA2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AA300..AA3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AA400..AA4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AA500..AA5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AA600..AA6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AA700..AA7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AA800..AA8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AA900..AA9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AAA00..AAAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AAB00..AABFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AAC00..AACFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AAD00..AADFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AAE00..AAEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AAF00..AAFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AB000..AB0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AB100..AB1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AB200..AB2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AB300..AB3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AB400..AB4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AB500..AB5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AB600..AB6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AB700..AB7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AB800..AB8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AB900..AB9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* ABA00..ABAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ABB00..ABBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ABC00..ABCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ABD00..ABDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ABE00..ABEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ABF00..ABFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AC000..AC0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AC100..AC1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AC200..AC2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AC300..AC3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AC400..AC4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AC500..AC5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AC600..AC6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AC700..AC7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AC800..AC8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AC900..AC9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* ACA00..ACAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ACB00..ACBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ACC00..ACCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ACD00..ACDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ACE00..ACEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ACF00..ACFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AD000..AD0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AD100..AD1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AD200..AD2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AD300..AD3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AD400..AD4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AD500..AD5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AD600..AD6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AD700..AD7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AD800..AD8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AD900..AD9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* ADA00..ADAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ADB00..ADBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ADC00..ADCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ADD00..ADDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ADE00..ADEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ADF00..ADFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AE000..AE0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AE100..AE1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AE200..AE2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AE300..AE3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AE400..AE4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AE500..AE5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AE600..AE6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AE700..AE7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AE800..AE8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AE900..AE9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AEA00..AEAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AEB00..AEBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AEC00..AECFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AED00..AEDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AEE00..AEEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AEF00..AEFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AF000..AF0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AF100..AF1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AF200..AF2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AF300..AF3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AF400..AF4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AF500..AF5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AF600..AF6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AF700..AF7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AF800..AF8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AF900..AF9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* AFA00..AFAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AFB00..AFBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AFC00..AFCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AFD00..AFDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AFE00..AFEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* AFF00..AFFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B0000..B00FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B0100..B01FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B0200..B02FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B0300..B03FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B0400..B04FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B0500..B05FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B0600..B06FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B0700..B07FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B0800..B08FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B0900..B09FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B0A00..B0AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B0B00..B0BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B0C00..B0CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B0D00..B0DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B0E00..B0EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B0F00..B0FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B1000..B10FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B1100..B11FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B1200..B12FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B1300..B13FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B1400..B14FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B1500..B15FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B1600..B16FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B1700..B17FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B1800..B18FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B1900..B19FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B1A00..B1AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B1B00..B1BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B1C00..B1CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B1D00..B1DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B1E00..B1EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B1F00..B1FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B2000..B20FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B2100..B21FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B2200..B22FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B2300..B23FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B2400..B24FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B2500..B25FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B2600..B26FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B2700..B27FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B2800..B28FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B2900..B29FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B2A00..B2AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B2B00..B2BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B2C00..B2CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B2D00..B2DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B2E00..B2EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B2F00..B2FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B3000..B30FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B3100..B31FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B3200..B32FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B3300..B33FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B3400..B34FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B3500..B35FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B3600..B36FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B3700..B37FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B3800..B38FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B3900..B39FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B3A00..B3AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B3B00..B3BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B3C00..B3CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B3D00..B3DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B3E00..B3EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B3F00..B3FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B4000..B40FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B4100..B41FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B4200..B42FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B4300..B43FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B4400..B44FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B4500..B45FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B4600..B46FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B4700..B47FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B4800..B48FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B4900..B49FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B4A00..B4AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B4B00..B4BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B4C00..B4CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B4D00..B4DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B4E00..B4EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B4F00..B4FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B5000..B50FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B5100..B51FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B5200..B52FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B5300..B53FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B5400..B54FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B5500..B55FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B5600..B56FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B5700..B57FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B5800..B58FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B5900..B59FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B5A00..B5AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B5B00..B5BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B5C00..B5CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B5D00..B5DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B5E00..B5EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B5F00..B5FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B6000..B60FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B6100..B61FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B6200..B62FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B6300..B63FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B6400..B64FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B6500..B65FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B6600..B66FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B6700..B67FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B6800..B68FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B6900..B69FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B6A00..B6AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B6B00..B6BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B6C00..B6CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B6D00..B6DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B6E00..B6EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B6F00..B6FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B7000..B70FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B7100..B71FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B7200..B72FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B7300..B73FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B7400..B74FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B7500..B75FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B7600..B76FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B7700..B77FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B7800..B78FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B7900..B79FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B7A00..B7AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B7B00..B7BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B7C00..B7CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B7D00..B7DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B7E00..B7EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B7F00..B7FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B8000..B80FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B8100..B81FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B8200..B82FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B8300..B83FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B8400..B84FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B8500..B85FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B8600..B86FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B8700..B87FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B8800..B88FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B8900..B89FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B8A00..B8AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B8B00..B8BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B8C00..B8CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B8D00..B8DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B8E00..B8EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B8F00..B8FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B9000..B90FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B9100..B91FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B9200..B92FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B9300..B93FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B9400..B94FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B9500..B95FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B9600..B96FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B9700..B97FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B9800..B98FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B9900..B99FF */
+  FriBidiPropertyBlockLevel1_0100,  /* B9A00..B9AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B9B00..B9BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B9C00..B9CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B9D00..B9DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B9E00..B9EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* B9F00..B9FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BA000..BA0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BA100..BA1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BA200..BA2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BA300..BA3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BA400..BA4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BA500..BA5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BA600..BA6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BA700..BA7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BA800..BA8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BA900..BA9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BAA00..BAAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BAB00..BABFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BAC00..BACFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BAD00..BADFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BAE00..BAEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BAF00..BAFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BB000..BB0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BB100..BB1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BB200..BB2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BB300..BB3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BB400..BB4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BB500..BB5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BB600..BB6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BB700..BB7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BB800..BB8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BB900..BB9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BBA00..BBAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BBB00..BBBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BBC00..BBCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BBD00..BBDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BBE00..BBEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BBF00..BBFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BC000..BC0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BC100..BC1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BC200..BC2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BC300..BC3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BC400..BC4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BC500..BC5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BC600..BC6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BC700..BC7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BC800..BC8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BC900..BC9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BCA00..BCAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BCB00..BCBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BCC00..BCCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BCD00..BCDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BCE00..BCEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BCF00..BCFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BD000..BD0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BD100..BD1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BD200..BD2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BD300..BD3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BD400..BD4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BD500..BD5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BD600..BD6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BD700..BD7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BD800..BD8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BD900..BD9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BDA00..BDAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BDB00..BDBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BDC00..BDCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BDD00..BDDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BDE00..BDEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BDF00..BDFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BE000..BE0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BE100..BE1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BE200..BE2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BE300..BE3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BE400..BE4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BE500..BE5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BE600..BE6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BE700..BE7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BE800..BE8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BE900..BE9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BEA00..BEAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BEB00..BEBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BEC00..BECFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BED00..BEDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BEE00..BEEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BEF00..BEFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BF000..BF0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BF100..BF1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BF200..BF2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BF300..BF3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BF400..BF4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BF500..BF5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BF600..BF6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BF700..BF7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BF800..BF8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BF900..BF9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* BFA00..BFAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BFB00..BFBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BFC00..BFCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BFD00..BFDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BFE00..BFEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* BFF00..BFFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C0000..C00FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C0100..C01FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C0200..C02FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C0300..C03FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C0400..C04FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C0500..C05FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C0600..C06FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C0700..C07FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C0800..C08FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C0900..C09FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C0A00..C0AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C0B00..C0BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C0C00..C0CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C0D00..C0DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C0E00..C0EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C0F00..C0FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C1000..C10FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C1100..C11FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C1200..C12FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C1300..C13FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C1400..C14FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C1500..C15FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C1600..C16FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C1700..C17FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C1800..C18FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C1900..C19FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C1A00..C1AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C1B00..C1BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C1C00..C1CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C1D00..C1DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C1E00..C1EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C1F00..C1FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C2000..C20FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C2100..C21FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C2200..C22FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C2300..C23FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C2400..C24FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C2500..C25FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C2600..C26FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C2700..C27FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C2800..C28FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C2900..C29FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C2A00..C2AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C2B00..C2BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C2C00..C2CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C2D00..C2DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C2E00..C2EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C2F00..C2FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C3000..C30FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C3100..C31FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C3200..C32FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C3300..C33FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C3400..C34FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C3500..C35FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C3600..C36FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C3700..C37FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C3800..C38FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C3900..C39FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C3A00..C3AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C3B00..C3BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C3C00..C3CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C3D00..C3DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C3E00..C3EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C3F00..C3FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C4000..C40FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C4100..C41FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C4200..C42FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C4300..C43FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C4400..C44FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C4500..C45FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C4600..C46FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C4700..C47FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C4800..C48FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C4900..C49FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C4A00..C4AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C4B00..C4BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C4C00..C4CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C4D00..C4DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C4E00..C4EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C4F00..C4FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C5000..C50FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C5100..C51FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C5200..C52FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C5300..C53FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C5400..C54FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C5500..C55FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C5600..C56FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C5700..C57FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C5800..C58FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C5900..C59FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C5A00..C5AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C5B00..C5BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C5C00..C5CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C5D00..C5DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C5E00..C5EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C5F00..C5FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C6000..C60FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C6100..C61FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C6200..C62FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C6300..C63FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C6400..C64FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C6500..C65FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C6600..C66FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C6700..C67FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C6800..C68FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C6900..C69FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C6A00..C6AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C6B00..C6BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C6C00..C6CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C6D00..C6DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C6E00..C6EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C6F00..C6FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C7000..C70FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C7100..C71FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C7200..C72FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C7300..C73FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C7400..C74FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C7500..C75FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C7600..C76FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C7700..C77FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C7800..C78FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C7900..C79FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C7A00..C7AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C7B00..C7BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C7C00..C7CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C7D00..C7DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C7E00..C7EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C7F00..C7FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C8000..C80FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C8100..C81FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C8200..C82FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C8300..C83FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C8400..C84FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C8500..C85FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C8600..C86FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C8700..C87FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C8800..C88FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C8900..C89FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C8A00..C8AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C8B00..C8BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C8C00..C8CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C8D00..C8DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C8E00..C8EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C8F00..C8FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C9000..C90FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C9100..C91FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C9200..C92FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C9300..C93FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C9400..C94FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C9500..C95FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C9600..C96FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C9700..C97FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C9800..C98FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C9900..C99FF */
+  FriBidiPropertyBlockLevel1_0100,  /* C9A00..C9AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C9B00..C9BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C9C00..C9CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C9D00..C9DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C9E00..C9EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* C9F00..C9FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CA000..CA0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CA100..CA1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CA200..CA2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CA300..CA3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CA400..CA4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CA500..CA5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CA600..CA6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CA700..CA7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CA800..CA8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CA900..CA9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CAA00..CAAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CAB00..CABFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CAC00..CACFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CAD00..CADFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CAE00..CAEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CAF00..CAFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CB000..CB0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CB100..CB1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CB200..CB2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CB300..CB3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CB400..CB4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CB500..CB5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CB600..CB6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CB700..CB7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CB800..CB8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CB900..CB9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CBA00..CBAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CBB00..CBBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CBC00..CBCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CBD00..CBDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CBE00..CBEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CBF00..CBFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CC000..CC0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CC100..CC1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CC200..CC2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CC300..CC3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CC400..CC4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CC500..CC5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CC600..CC6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CC700..CC7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CC800..CC8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CC900..CC9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CCA00..CCAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CCB00..CCBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CCC00..CCCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CCD00..CCDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CCE00..CCEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CCF00..CCFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CD000..CD0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CD100..CD1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CD200..CD2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CD300..CD3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CD400..CD4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CD500..CD5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CD600..CD6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CD700..CD7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CD800..CD8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CD900..CD9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CDA00..CDAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CDB00..CDBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CDC00..CDCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CDD00..CDDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CDE00..CDEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CDF00..CDFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CE000..CE0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CE100..CE1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CE200..CE2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CE300..CE3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CE400..CE4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CE500..CE5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CE600..CE6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CE700..CE7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CE800..CE8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CE900..CE9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CEA00..CEAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CEB00..CEBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CEC00..CECFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CED00..CEDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CEE00..CEEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CEF00..CEFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CF000..CF0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CF100..CF1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CF200..CF2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CF300..CF3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CF400..CF4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CF500..CF5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CF600..CF6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CF700..CF7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CF800..CF8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CF900..CF9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* CFA00..CFAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CFB00..CFBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CFC00..CFCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CFD00..CFDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CFE00..CFEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* CFF00..CFFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D0000..D00FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D0100..D01FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D0200..D02FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D0300..D03FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D0400..D04FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D0500..D05FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D0600..D06FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D0700..D07FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D0800..D08FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D0900..D09FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D0A00..D0AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D0B00..D0BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D0C00..D0CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D0D00..D0DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D0E00..D0EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D0F00..D0FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D1000..D10FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D1100..D11FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D1200..D12FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D1300..D13FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D1400..D14FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D1500..D15FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D1600..D16FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D1700..D17FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D1800..D18FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D1900..D19FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D1A00..D1AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D1B00..D1BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D1C00..D1CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D1D00..D1DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D1E00..D1EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D1F00..D1FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D2000..D20FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D2100..D21FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D2200..D22FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D2300..D23FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D2400..D24FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D2500..D25FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D2600..D26FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D2700..D27FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D2800..D28FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D2900..D29FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D2A00..D2AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D2B00..D2BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D2C00..D2CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D2D00..D2DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D2E00..D2EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D2F00..D2FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D3000..D30FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D3100..D31FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D3200..D32FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D3300..D33FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D3400..D34FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D3500..D35FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D3600..D36FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D3700..D37FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D3800..D38FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D3900..D39FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D3A00..D3AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D3B00..D3BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D3C00..D3CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D3D00..D3DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D3E00..D3EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D3F00..D3FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D4000..D40FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D4100..D41FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D4200..D42FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D4300..D43FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D4400..D44FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D4500..D45FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D4600..D46FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D4700..D47FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D4800..D48FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D4900..D49FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D4A00..D4AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D4B00..D4BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D4C00..D4CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D4D00..D4DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D4E00..D4EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D4F00..D4FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D5000..D50FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D5100..D51FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D5200..D52FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D5300..D53FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D5400..D54FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D5500..D55FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D5600..D56FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D5700..D57FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D5800..D58FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D5900..D59FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D5A00..D5AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D5B00..D5BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D5C00..D5CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D5D00..D5DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D5E00..D5EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D5F00..D5FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D6000..D60FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D6100..D61FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D6200..D62FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D6300..D63FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D6400..D64FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D6500..D65FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D6600..D66FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D6700..D67FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D6800..D68FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D6900..D69FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D6A00..D6AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D6B00..D6BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D6C00..D6CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D6D00..D6DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D6E00..D6EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D6F00..D6FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D7000..D70FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D7100..D71FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D7200..D72FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D7300..D73FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D7400..D74FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D7500..D75FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D7600..D76FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D7700..D77FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D7800..D78FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D7900..D79FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D7A00..D7AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D7B00..D7BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D7C00..D7CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D7D00..D7DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D7E00..D7EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D7F00..D7FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D8000..D80FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D8100..D81FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D8200..D82FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D8300..D83FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D8400..D84FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D8500..D85FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D8600..D86FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D8700..D87FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D8800..D88FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D8900..D89FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D8A00..D8AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D8B00..D8BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D8C00..D8CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D8D00..D8DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D8E00..D8EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D8F00..D8FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D9000..D90FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D9100..D91FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D9200..D92FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D9300..D93FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D9400..D94FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D9500..D95FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D9600..D96FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D9700..D97FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D9800..D98FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D9900..D99FF */
+  FriBidiPropertyBlockLevel1_0100,  /* D9A00..D9AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D9B00..D9BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D9C00..D9CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D9D00..D9DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D9E00..D9EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* D9F00..D9FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DA000..DA0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DA100..DA1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DA200..DA2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DA300..DA3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DA400..DA4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DA500..DA5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DA600..DA6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DA700..DA7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DA800..DA8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DA900..DA9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DAA00..DAAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DAB00..DABFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DAC00..DACFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DAD00..DADFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DAE00..DAEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DAF00..DAFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DB000..DB0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DB100..DB1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DB200..DB2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DB300..DB3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DB400..DB4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DB500..DB5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DB600..DB6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DB700..DB7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DB800..DB8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DB900..DB9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DBA00..DBAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DBB00..DBBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DBC00..DBCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DBD00..DBDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DBE00..DBEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DBF00..DBFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DC000..DC0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DC100..DC1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DC200..DC2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DC300..DC3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DC400..DC4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DC500..DC5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DC600..DC6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DC700..DC7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DC800..DC8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DC900..DC9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DCA00..DCAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DCB00..DCBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DCC00..DCCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DCD00..DCDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DCE00..DCEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DCF00..DCFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DD000..DD0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DD100..DD1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DD200..DD2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DD300..DD3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DD400..DD4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DD500..DD5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DD600..DD6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DD700..DD7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DD800..DD8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DD900..DD9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DDA00..DDAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DDB00..DDBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DDC00..DDCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DDD00..DDDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DDE00..DDEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DDF00..DDFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DE000..DE0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DE100..DE1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DE200..DE2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DE300..DE3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DE400..DE4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DE500..DE5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DE600..DE6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DE700..DE7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DE800..DE8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DE900..DE9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DEA00..DEAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DEB00..DEBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DEC00..DECFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DED00..DEDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DEE00..DEEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DEF00..DEFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DF000..DF0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DF100..DF1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DF200..DF2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DF300..DF3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DF400..DF4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DF500..DF5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DF600..DF6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DF700..DF7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DF800..DF8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DF900..DF9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* DFA00..DFAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DFB00..DFBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DFC00..DFCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DFD00..DFDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DFE00..DFEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* DFF00..DFFFF */
+  FriBidiPropertyBlockLevel1_E0000,  /* E0000..E00FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E0100..E01FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E0200..E02FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E0300..E03FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E0400..E04FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E0500..E05FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E0600..E06FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E0700..E07FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E0800..E08FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E0900..E09FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E0A00..E0AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E0B00..E0BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E0C00..E0CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E0D00..E0DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E0E00..E0EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E0F00..E0FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E1000..E10FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E1100..E11FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E1200..E12FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E1300..E13FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E1400..E14FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E1500..E15FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E1600..E16FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E1700..E17FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E1800..E18FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E1900..E19FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E1A00..E1AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E1B00..E1BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E1C00..E1CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E1D00..E1DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E1E00..E1EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E1F00..E1FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E2000..E20FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E2100..E21FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E2200..E22FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E2300..E23FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E2400..E24FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E2500..E25FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E2600..E26FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E2700..E27FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E2800..E28FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E2900..E29FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E2A00..E2AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E2B00..E2BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E2C00..E2CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E2D00..E2DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E2E00..E2EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E2F00..E2FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E3000..E30FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E3100..E31FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E3200..E32FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E3300..E33FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E3400..E34FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E3500..E35FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E3600..E36FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E3700..E37FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E3800..E38FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E3900..E39FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E3A00..E3AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E3B00..E3BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E3C00..E3CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E3D00..E3DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E3E00..E3EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E3F00..E3FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E4000..E40FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E4100..E41FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E4200..E42FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E4300..E43FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E4400..E44FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E4500..E45FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E4600..E46FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E4700..E47FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E4800..E48FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E4900..E49FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E4A00..E4AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E4B00..E4BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E4C00..E4CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E4D00..E4DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E4E00..E4EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E4F00..E4FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E5000..E50FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E5100..E51FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E5200..E52FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E5300..E53FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E5400..E54FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E5500..E55FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E5600..E56FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E5700..E57FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E5800..E58FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E5900..E59FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E5A00..E5AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E5B00..E5BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E5C00..E5CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E5D00..E5DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E5E00..E5EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E5F00..E5FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E6000..E60FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E6100..E61FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E6200..E62FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E6300..E63FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E6400..E64FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E6500..E65FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E6600..E66FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E6700..E67FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E6800..E68FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E6900..E69FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E6A00..E6AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E6B00..E6BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E6C00..E6CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E6D00..E6DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E6E00..E6EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E6F00..E6FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E7000..E70FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E7100..E71FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E7200..E72FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E7300..E73FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E7400..E74FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E7500..E75FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E7600..E76FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E7700..E77FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E7800..E78FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E7900..E79FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E7A00..E7AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E7B00..E7BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E7C00..E7CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E7D00..E7DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E7E00..E7EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E7F00..E7FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E8000..E80FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E8100..E81FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E8200..E82FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E8300..E83FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E8400..E84FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E8500..E85FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E8600..E86FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E8700..E87FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E8800..E88FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E8900..E89FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E8A00..E8AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E8B00..E8BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E8C00..E8CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E8D00..E8DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E8E00..E8EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E8F00..E8FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E9000..E90FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E9100..E91FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E9200..E92FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E9300..E93FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E9400..E94FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E9500..E95FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E9600..E96FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E9700..E97FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E9800..E98FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E9900..E99FF */
+  FriBidiPropertyBlockLevel1_0100,  /* E9A00..E9AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E9B00..E9BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E9C00..E9CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E9D00..E9DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E9E00..E9EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* E9F00..E9FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EA000..EA0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EA100..EA1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EA200..EA2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EA300..EA3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EA400..EA4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EA500..EA5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EA600..EA6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EA700..EA7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EA800..EA8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EA900..EA9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EAA00..EAAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EAB00..EABFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EAC00..EACFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EAD00..EADFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EAE00..EAEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EAF00..EAFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EB000..EB0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EB100..EB1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EB200..EB2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EB300..EB3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EB400..EB4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EB500..EB5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EB600..EB6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EB700..EB7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EB800..EB8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EB900..EB9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EBA00..EBAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EBB00..EBBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EBC00..EBCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EBD00..EBDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EBE00..EBEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EBF00..EBFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EC000..EC0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EC100..EC1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EC200..EC2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EC300..EC3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EC400..EC4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EC500..EC5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EC600..EC6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EC700..EC7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EC800..EC8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EC900..EC9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* ECA00..ECAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ECB00..ECBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ECC00..ECCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ECD00..ECDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ECE00..ECEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ECF00..ECFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* ED000..ED0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* ED100..ED1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* ED200..ED2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* ED300..ED3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* ED400..ED4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* ED500..ED5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* ED600..ED6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* ED700..ED7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* ED800..ED8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* ED900..ED9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EDA00..EDAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EDB00..EDBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EDC00..EDCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EDD00..EDDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EDE00..EDEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EDF00..EDFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EE000..EE0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EE100..EE1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EE200..EE2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EE300..EE3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EE400..EE4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EE500..EE5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EE600..EE6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EE700..EE7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EE800..EE8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EE900..EE9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EEA00..EEAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EEB00..EEBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EEC00..EECFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EED00..EEDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EEE00..EEEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EEF00..EEFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EF000..EF0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EF100..EF1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EF200..EF2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EF300..EF3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EF400..EF4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EF500..EF5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EF600..EF6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EF700..EF7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EF800..EF8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EF900..EF9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* EFA00..EFAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EFB00..EFBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EFC00..EFCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EFD00..EFDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EFE00..EFEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* EFF00..EFFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F0000..F00FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F0100..F01FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F0200..F02FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F0300..F03FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F0400..F04FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F0500..F05FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F0600..F06FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F0700..F07FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F0800..F08FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F0900..F09FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F0A00..F0AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F0B00..F0BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F0C00..F0CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F0D00..F0DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F0E00..F0EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F0F00..F0FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F1000..F10FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F1100..F11FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F1200..F12FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F1300..F13FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F1400..F14FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F1500..F15FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F1600..F16FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F1700..F17FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F1800..F18FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F1900..F19FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F1A00..F1AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F1B00..F1BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F1C00..F1CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F1D00..F1DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F1E00..F1EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F1F00..F1FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F2000..F20FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F2100..F21FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F2200..F22FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F2300..F23FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F2400..F24FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F2500..F25FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F2600..F26FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F2700..F27FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F2800..F28FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F2900..F29FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F2A00..F2AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F2B00..F2BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F2C00..F2CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F2D00..F2DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F2E00..F2EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F2F00..F2FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F3000..F30FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F3100..F31FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F3200..F32FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F3300..F33FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F3400..F34FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F3500..F35FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F3600..F36FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F3700..F37FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F3800..F38FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F3900..F39FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F3A00..F3AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F3B00..F3BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F3C00..F3CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F3D00..F3DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F3E00..F3EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F3F00..F3FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F4000..F40FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F4100..F41FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F4200..F42FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F4300..F43FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F4400..F44FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F4500..F45FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F4600..F46FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F4700..F47FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F4800..F48FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F4900..F49FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F4A00..F4AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F4B00..F4BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F4C00..F4CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F4D00..F4DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F4E00..F4EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F4F00..F4FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F5000..F50FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F5100..F51FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F5200..F52FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F5300..F53FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F5400..F54FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F5500..F55FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F5600..F56FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F5700..F57FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F5800..F58FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F5900..F59FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F5A00..F5AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F5B00..F5BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F5C00..F5CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F5D00..F5DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F5E00..F5EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F5F00..F5FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F6000..F60FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F6100..F61FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F6200..F62FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F6300..F63FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F6400..F64FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F6500..F65FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F6600..F66FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F6700..F67FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F6800..F68FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F6900..F69FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F6A00..F6AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F6B00..F6BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F6C00..F6CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F6D00..F6DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F6E00..F6EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F6F00..F6FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F7000..F70FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F7100..F71FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F7200..F72FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F7300..F73FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F7400..F74FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F7500..F75FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F7600..F76FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F7700..F77FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F7800..F78FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F7900..F79FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F7A00..F7AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F7B00..F7BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F7C00..F7CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F7D00..F7DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F7E00..F7EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F7F00..F7FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F8000..F80FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F8100..F81FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F8200..F82FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F8300..F83FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F8400..F84FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F8500..F85FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F8600..F86FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F8700..F87FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F8800..F88FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F8900..F89FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F8A00..F8AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F8B00..F8BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F8C00..F8CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F8D00..F8DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F8E00..F8EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F8F00..F8FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F9000..F90FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F9100..F91FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F9200..F92FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F9300..F93FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F9400..F94FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F9500..F95FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F9600..F96FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F9700..F97FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F9800..F98FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F9900..F99FF */
+  FriBidiPropertyBlockLevel1_0100,  /* F9A00..F9AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F9B00..F9BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F9C00..F9CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F9D00..F9DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F9E00..F9EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* F9F00..F9FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FA000..FA0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FA100..FA1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FA200..FA2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FA300..FA3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FA400..FA4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FA500..FA5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FA600..FA6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FA700..FA7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FA800..FA8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FA900..FA9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FAA00..FAAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FAB00..FABFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FAC00..FACFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FAD00..FADFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FAE00..FAEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FAF00..FAFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FB000..FB0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FB100..FB1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FB200..FB2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FB300..FB3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FB400..FB4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FB500..FB5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FB600..FB6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FB700..FB7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FB800..FB8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FB900..FB9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FBA00..FBAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FBB00..FBBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FBC00..FBCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FBD00..FBDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FBE00..FBEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FBF00..FBFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FC000..FC0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FC100..FC1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FC200..FC2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FC300..FC3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FC400..FC4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FC500..FC5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FC600..FC6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FC700..FC7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FC800..FC8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FC900..FC9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FCA00..FCAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FCB00..FCBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FCC00..FCCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FCD00..FCDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FCE00..FCEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FCF00..FCFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FD000..FD0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FD100..FD1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FD200..FD2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FD300..FD3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FD400..FD4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FD500..FD5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FD600..FD6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FD700..FD7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FD800..FD8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FD900..FD9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FDA00..FDAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FDB00..FDBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FDC00..FDCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FDD00..FDDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FDE00..FDEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FDF00..FDFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FE000..FE0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FE100..FE1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FE200..FE2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FE300..FE3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FE400..FE4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FE500..FE5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FE600..FE6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FE700..FE7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FE800..FE8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FE900..FE9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FEA00..FEAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FEB00..FEBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FEC00..FECFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FED00..FEDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FEE00..FEEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FEF00..FEFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FF000..FF0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FF100..FF1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FF200..FF2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FF300..FF3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FF400..FF4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FF500..FF5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FF600..FF6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FF700..FF7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FF800..FF8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FF900..FF9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* FFA00..FFAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FFB00..FFBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FFC00..FFCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FFD00..FFDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FFE00..FFEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* FFF00..FFFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 100000..1000FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 100100..1001FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 100200..1002FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 100300..1003FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 100400..1004FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 100500..1005FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 100600..1006FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 100700..1007FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 100800..1008FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 100900..1009FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 100A00..100AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 100B00..100BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 100C00..100CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 100D00..100DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 100E00..100EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 100F00..100FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 101000..1010FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 101100..1011FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 101200..1012FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 101300..1013FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 101400..1014FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 101500..1015FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 101600..1016FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 101700..1017FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 101800..1018FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 101900..1019FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 101A00..101AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 101B00..101BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 101C00..101CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 101D00..101DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 101E00..101EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 101F00..101FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 102000..1020FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 102100..1021FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 102200..1022FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 102300..1023FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 102400..1024FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 102500..1025FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 102600..1026FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 102700..1027FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 102800..1028FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 102900..1029FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 102A00..102AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 102B00..102BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 102C00..102CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 102D00..102DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 102E00..102EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 102F00..102FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 103000..1030FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 103100..1031FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 103200..1032FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 103300..1033FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 103400..1034FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 103500..1035FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 103600..1036FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 103700..1037FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 103800..1038FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 103900..1039FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 103A00..103AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 103B00..103BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 103C00..103CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 103D00..103DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 103E00..103EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 103F00..103FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 104000..1040FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 104100..1041FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 104200..1042FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 104300..1043FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 104400..1044FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 104500..1045FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 104600..1046FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 104700..1047FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 104800..1048FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 104900..1049FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 104A00..104AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 104B00..104BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 104C00..104CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 104D00..104DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 104E00..104EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 104F00..104FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 105000..1050FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 105100..1051FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 105200..1052FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 105300..1053FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 105400..1054FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 105500..1055FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 105600..1056FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 105700..1057FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 105800..1058FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 105900..1059FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 105A00..105AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 105B00..105BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 105C00..105CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 105D00..105DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 105E00..105EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 105F00..105FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 106000..1060FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 106100..1061FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 106200..1062FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 106300..1063FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 106400..1064FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 106500..1065FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 106600..1066FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 106700..1067FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 106800..1068FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 106900..1069FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 106A00..106AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 106B00..106BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 106C00..106CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 106D00..106DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 106E00..106EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 106F00..106FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 107000..1070FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 107100..1071FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 107200..1072FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 107300..1073FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 107400..1074FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 107500..1075FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 107600..1076FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 107700..1077FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 107800..1078FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 107900..1079FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 107A00..107AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 107B00..107BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 107C00..107CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 107D00..107DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 107E00..107EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 107F00..107FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 108000..1080FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 108100..1081FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 108200..1082FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 108300..1083FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 108400..1084FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 108500..1085FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 108600..1086FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 108700..1087FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 108800..1088FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 108900..1089FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 108A00..108AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 108B00..108BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 108C00..108CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 108D00..108DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 108E00..108EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 108F00..108FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 109000..1090FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 109100..1091FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 109200..1092FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 109300..1093FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 109400..1094FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 109500..1095FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 109600..1096FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 109700..1097FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 109800..1098FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 109900..1099FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 109A00..109AFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 109B00..109BFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 109C00..109CFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 109D00..109DFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 109E00..109EFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 109F00..109FFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10A000..10A0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10A100..10A1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10A200..10A2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10A300..10A3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10A400..10A4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10A500..10A5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10A600..10A6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10A700..10A7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10A800..10A8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10A900..10A9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10AA00..10AAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10AB00..10ABFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10AC00..10ACFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10AD00..10ADFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10AE00..10AEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10AF00..10AFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10B000..10B0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10B100..10B1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10B200..10B2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10B300..10B3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10B400..10B4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10B500..10B5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10B600..10B6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10B700..10B7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10B800..10B8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10B900..10B9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10BA00..10BAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10BB00..10BBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10BC00..10BCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10BD00..10BDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10BE00..10BEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10BF00..10BFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10C000..10C0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10C100..10C1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10C200..10C2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10C300..10C3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10C400..10C4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10C500..10C5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10C600..10C6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10C700..10C7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10C800..10C8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10C900..10C9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10CA00..10CAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10CB00..10CBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10CC00..10CCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10CD00..10CDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10CE00..10CEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10CF00..10CFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10D000..10D0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10D100..10D1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10D200..10D2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10D300..10D3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10D400..10D4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10D500..10D5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10D600..10D6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10D700..10D7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10D800..10D8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10D900..10D9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10DA00..10DAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10DB00..10DBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10DC00..10DCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10DD00..10DDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10DE00..10DEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10DF00..10DFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10E000..10E0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10E100..10E1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10E200..10E2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10E300..10E3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10E400..10E4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10E500..10E5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10E600..10E6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10E700..10E7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10E800..10E8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10E900..10E9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10EA00..10EAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10EB00..10EBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10EC00..10ECFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10ED00..10EDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10EE00..10EEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10EF00..10EFFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10F000..10F0FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10F100..10F1FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10F200..10F2FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10F300..10F3FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10F400..10F4FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10F500..10F5FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10F600..10F6FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10F700..10F7FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10F800..10F8FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10F900..10F9FF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10FA00..10FAFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10FB00..10FBFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10FC00..10FCFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10FD00..10FDFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10FE00..10FEFF */
+  FriBidiPropertyBlockLevel1_0100,  /* 10FF00..10FFFF */
+};
+
+/* *INDENT-ON* */
+
+#define FRIBIDI_GET_TYPE(x)    \
+       FriBidiPropertyBlockLevel1[(x)%256 +    \
+       FriBidiPropertyBlockLevel0[(x)/256]]
+
+#undef WS
+#undef SS
+#undef RLO
+#undef RLE
+#undef PDF
+#undef NSM
+#undef LRO
+#undef LRE
+#undef ET
+#undef ES
+#undef EN
+#undef CS
+#undef BS
+#undef AN
+#undef BN
+#undef ON
+#undef AL
+#undef RTL
+#undef LTR
+
+static FriBidiCharType
+get_bidi_type (
+  /* input */
+  FriBidiChar uch
+)
+{
+  if (uch < 0x110000)
+    return fribidi_prop_to_type_[(unsigned char) FRIBIDI_GET_TYPE (uch)];
+  else
+    return FRIBIDI_TYPE_LTR;
+  /* Non-Unicode chars */
+}
+
+
+#endif /* FRIBIDI_TAB_CHAR_TYPE_2_I */
diff --git a/lib/bidi-types-list.h b/lib/bidi-types-list.h
new file mode 100644 (file)
index 0000000..7c08d27
--- /dev/null
@@ -0,0 +1,69 @@
+#if !__C2MAN__
+/* FriBidi
+ * bidi-types-list.h - list of bidi types
+ *
+ * $Id: bidi-types-list.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/Attic/bidi-types-list.h,v $
+ *
+ * Author:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc.
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ *
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+/* *INDENT-OFF* */
+#endif /* !__C2MAN__ */
+
+/* Bidi types from the standard. */
+_FRIBIDI_ADD_TYPE (LTR, 'L')   /* Left-To-Right letter */
+_FRIBIDI_ADD_TYPE (RTL, 'R')   /* Right-To-Left letter */
+_FRIBIDI_ADD_TYPE (AL, 'A')    /* Arabic Letter */
+_FRIBIDI_ADD_TYPE (EN, '1')    /* European Numeral */
+_FRIBIDI_ADD_TYPE (AN, '9')    /* Arabic Numeral */
+_FRIBIDI_ADD_TYPE (ES, 'w')    /* European number Separator */
+_FRIBIDI_ADD_TYPE (ET, 'w')    /* European number Terminator */
+_FRIBIDI_ADD_TYPE (CS, 'w')    /* Common Separator */
+_FRIBIDI_ADD_TYPE (NSM, '`')   /* Non Spacing Mark */
+_FRIBIDI_ADD_TYPE (BN, 'b')    /* Boundary Neutral */
+_FRIBIDI_ADD_TYPE (BS, 'B')    /* Block Separator */
+_FRIBIDI_ADD_TYPE (SS, 'S')    /* Segment Separator */
+_FRIBIDI_ADD_TYPE (WS, '_')    /* White-Space */
+_FRIBIDI_ADD_TYPE (ON, 'n')    /* Other Neutral */
+_FRIBIDI_ADD_TYPE (LRE, '+')   /* Left-to-Right Embedding */
+_FRIBIDI_ADD_TYPE (RLE, '+')   /* Right-to-Left Embedding */
+_FRIBIDI_ADD_TYPE (LRO, '+')   /* Left-to-Right Override */
+_FRIBIDI_ADD_TYPE (RLO, '+')   /* Right-to-Left Override */
+_FRIBIDI_ADD_TYPE (PDF, '-')   /* Pop Directional Flag */
+
+/* The following two types are not official Unicode bidi types, but used for
+ * paragraph direction handling only. */
+_FRIBIDI_ADD_TYPE (WL, 'l')    /* Weak Left to right */
+_FRIBIDI_ADD_TYPE (WR, 'r')    /* Weak Right to left */
+
+/* The following two types are used internally only. */
+_FRIBIDI_ADD_TYPE (SOT, '^')   /* Start Of Text */
+_FRIBIDI_ADD_TYPE (EOT, '$')   /* End Of Text */
+
+#if !__C2MAN__
+/* *INDENT-ON* */
+#endif /* !__C2MAN__ */
diff --git a/lib/bidi-types.h b/lib/bidi-types.h
new file mode 100644 (file)
index 0000000..b9b571b
--- /dev/null
@@ -0,0 +1,78 @@
+/* FriBidi
+ * bidi-types.h - define internal bidi types
+ *
+ * $Id: bidi-types.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/bidi-types.h,v $
+ *
+ * Author:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc.
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ *
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+#ifndef _BIDI_TYPES_H
+#define _BIDI_TYPES_H
+
+#include <fribidi-common.h>
+
+#include <fribidi-types.h>
+#include <fribidi-bidi-types.h>
+
+#include "common.h"
+
+#include <fribidi-begindecls.h>
+
+/*
+ * Define character types that char_type_tables use.
+ * define them to be 0, 1, 2, ... and then in fribidi_get_type.c map them
+ * to FriBidiCharTypes.
+ */
+typedef char FriBidiPropCharType;
+
+enum FriBidiPropEnum
+{
+# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) FRIBIDI_PROP_TYPE_##TYPE,
+# include "bidi-types-list.h"
+# undef _FRIBIDI_ADD_TYPE
+  _FRIBIDI_PROP_TYPES_COUNT
+};
+
+#define fribidi_prop_to_type_ FRIBIDI_NAMESPACE(prop_to_type_)
+/* Maps fribidi_prop_types to fribidi_types */
+extern const FriBidiCharType fribidi_prop_to_type_[];
+
+#if DEBUG
+
+#define fribidi_char_from_bidi_type FRIBIDI_NAMESPACE(char_from_bidi_type)
+FRIBIDI_ENTRY char fribidi_char_from_bidi_type (
+  FriBidiCharType t            /* input bidi type */
+);
+
+#endif /* DEBUG */
+
+#include <fribidi-enddecls.h>
+
+#endif /* !_BIDI_TYPES_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/lib/common.h b/lib/common.h
new file mode 100644 (file)
index 0000000..737a1ae
--- /dev/null
@@ -0,0 +1,110 @@
+/* FriBidi
+ * common.h - common include for library sources
+ *
+ * $Id: common.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/common.h,v $
+ *
+ * Author:
+ *   Behdad Esfahbod, 2004
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ *
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+#ifndef _COMMON_H
+#define _COMMON_H
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <fribidi-common.h>
+
+#if WIN32
+# define FRIBIDI_ENTRY __declspec(dllexport)
+#endif /* WIN32 */
+
+#ifndef FALSE
+# define FALSE (0==1)
+#endif /* !FRIBIDI_FALSE */
+
+#ifndef TRUE
+# define TRUE (!FALSE)
+#endif /* !TRUE */
+
+#ifndef NULL
+# define NULL (void *) 0
+#endif /* !NULL */
+
+#if FRIBIDI_USE_GLIB
+# ifndef SIZEOF_LONG
+#  define SIZEOF_LONG GLIB_SIZEOF_LONG
+# endif        /* !SIZEOF_LONG */
+# ifndef SIZEOF_VOID_P
+#  define SIZEOF_VOID_P GLIB_SIZEOF_VOID_P
+# endif        /* !SIZEOF_VOID_P */
+# if !__C2MAN__
+#  include <glib/gmem.h>
+# endif        /* !__C2MAN__ */
+# ifndef fribidi_malloc
+#  define fribidi_malloc g_malloc
+#  define fribidi_free g_free
+# endif        /* !fribidi_malloc */
+#endif /* FRIBIDI_USE_GLIB */
+
+/* fribidi_malloc and fribidi_free should be used instead of malloc and free. 
+ * No need to include any headers. */
+#ifndef fribidi_malloc
+# if HAVE_STDLIB_H
+#  if !__C2MAN__
+#   include <stdlib.h>
+#  endif /* __C2MAN__ */
+#  define fribidi_malloc malloc
+# else /* !HAVE_STDLIB_H */
+#  define fribidi_malloc (void *) malloc
+# endif        /* !HAVE_STDLIB_H */
+# define fribidi_free free
+#endif /* !fribidi_malloc */
+
+/* FRIBIDI_CHUNK_SIZE is the number of bytes in each chunk of memory being
+ * allocated for data structure pools. */
+#ifndef FRIBIDI_CHUNK_SIZE
+# define FRIBIDI_CHUNK_SIZE 4096
+#else /* FRIBIDI_CHUNK_SIZE */
+# if FRIBIDI_CHUNK_SIZE < 256
+#  error FRIBIDI_CHUNK_SIZE now should define the size of a chunk in bytes.
+# endif        /* FRIBIDI_CHUNK_SIZE < 256 */
+#endif /* FRIBIDI_CHUNK_SIZE */
+
+/* FRIBIDI_BEGIN_STMT should be used at the beginning of your macro
+ * definitions that are to behave like simple statements.  Use
+ * FRIBIDI_END_STMT at the end of the macro after the semicolon or brace */
+#ifndef FRIBIDI_BEGIN_STMT
+# define FRIBIDI_BEGIN_STMT do {
+# define FRIBIDI_END_STMT } while (0)
+#endif /* !FRIBIDI_BEGIN_STMT */
+
+#include "debug.h"
+
+#endif /* !_COMMON_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/lib/debug.h b/lib/debug.h
new file mode 100644 (file)
index 0000000..1ff6d87
--- /dev/null
@@ -0,0 +1,87 @@
+/* FriBidi
+ * debug.h - debug-only interfaces
+ *
+ * $Id: debug.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/debug.h,v $
+ *
+ * Author:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc.
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ *
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+#ifndef _DEBUG_H
+#define _DEBUG_H
+
+#include <fribidi-common.h>
+
+#include <fribidi-types.h>
+
+#include "common.h"
+
+#include <fribidi-begindecls.h>
+
+#if DEBUG
+
+#ifndef FRIBIDI_FPRINTF
+# if !__C2MAN__
+#  include <stdio.h>
+# endif        /* !__C2MAN__ */
+# define FRIBIDI_FPRINTF fprintf
+# define FRIBIDI_STDERR_ stderr,
+#endif /* !FRIBIDI_FPRINTF */
+
+#define MSG(s) FRIBIDI_BEGIN_STMT \
+               FRIBIDI_FPRINTF(FRIBIDI_STDERR_ s); \
+       FRIBIDI_END_STMT
+
+#define MSG2(s, t) FRIBIDI_BEGIN_STMT \
+               FRIBIDI_FPRINTF(FRIBIDI_STDERR_ s, t); \
+       FRIBIDI_END_STMT
+
+#define MSG5(s, t, u, v, w) FRIBIDI_BEGIN_STMT \
+               FRIBIDI_FPRINTF(FRIBIDI_STDERR_ s, t, u, v, w); \
+       FRIBIDI_END_STMT
+
+#ifndef DBG
+# define DBG(s) FRIBIDI_BEGIN_STMT \
+       if (fribidi_debug_status()) MSG(FRIBIDI ": " s "\n"); \
+       FRIBIDI_END_STMT
+# define DBG2(s, t) FRIBIDI_BEGIN_STMT \
+       if (fribidi_debug_status()) MSG2(FRIBIDI ": " s "\n", t); \
+       FRIBIDI_END_STMT
+#endif /* !DBG */
+
+#else /* !DEBUG */
+
+#define DBG(s)                 /* empty */
+#define DBG2(s, t)             /* empty */
+
+#endif /* !DEBUG */
+
+#include <fribidi-enddecls.h>
+
+#endif /* !_DEBUG_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/lib/fribidi-begindecls.h b/lib/fribidi-begindecls.h
new file mode 100644 (file)
index 0000000..00f0ec9
--- /dev/null
@@ -0,0 +1 @@
+FRIBIDI_BEGIN_DECLS
diff --git a/lib/fribidi-bidi-type.c b/lib/fribidi-bidi-type.c
new file mode 100644 (file)
index 0000000..9f1b547
--- /dev/null
@@ -0,0 +1,79 @@
+/* FriBidi
+ * fribidi-char-type.c - get character bidi type
+ *
+ * $Id: fribidi-bidi-type.c,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/Attic/fribidi-bidi-type.c,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#include <fribidi-bidi-type.h>
+
+#include "bidi-types.h"
+#include "bidi-type-table.i"
+
+#include "common.h"
+
+FRIBIDI_ENTRY FriBidiCharType
+fribidi_get_bidi_type (
+  /* input */
+  FriBidiChar ch
+)
+{
+  return get_bidi_type (ch);
+}
+
+/* The following is only defined for binary compatibility */
+#define fribidi_get_type_internal FRIBIDI_NAMESPACE(get_type_internal)
+FRIBIDI_ENTRY FriBidiCharType
+fribidi_get_type_internal (
+  /* input */
+  FriBidiChar ch
+)
+{
+  return get_bidi_type (ch);
+}
+
+FRIBIDI_ENTRY void
+fribidi_get_bidi_types (
+  /* input */
+  const FriBidiChar *str,
+  FriBidiStrIndex len,
+  /* output */
+  FriBidiCharType *type
+)
+{
+  for (; len; len--)
+    *type++ = fribidi_get_bidi_type (*str++);
+}
+
+/* Map fribidi_prop_types to fribidi_types. */
+const FriBidiCharType fribidi_prop_to_type_[] = {
+# define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) FRIBIDI_TYPE_##TYPE,
+# include "bidi-types-list.h"
+# undef _FRIBIDI_ADD_TYPE
+};
diff --git a/lib/fribidi-bidi-type.h b/lib/fribidi-bidi-type.h
new file mode 100644 (file)
index 0000000..6a0f20b
--- /dev/null
@@ -0,0 +1,74 @@
+/* FriBidi
+ * fribidi-bidi-type.h - get character bidi type
+ *
+ * $Id: fribidi-bidi-type.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/Attic/fribidi-bidi-type.h,v $
+ *
+ * Author:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+#ifndef _FRIBIDI_BIDI_TYPE_H
+#define _FRIBIDI_BIDI_TYPE_H
+
+#include "fribidi-common.h"
+
+#include "fribidi-types.h"
+#include "fribidi-bidi-types.h"
+
+#include "fribidi-begindecls.h"
+
+/* fribidi_get_type is the old name of fribidi_get_bidi_type */
+#define fribidi_get_type fribidi_get_bidi_type
+
+#define fribidi_get_bidi_type FRIBIDI_NAMESPACE(get_bidi_type)
+/* fribidi_get_bidi_type - get character bidi type
+ *
+ * This function returns the bidi type of a character.
+ */
+FRIBIDI_ENTRY FriBidiCharType fribidi_get_bidi_type (
+  FriBidiChar ch               /* input character */
+);
+
+/* fribidi_get_types is the old name of fribidi_get_bidi_types */
+#define fribidi_get_types fribidi_get_bidi_types
+
+#define fribidi_get_bidi_types FRIBIDI_NAMESPACE(get_bidi_types)
+/* fribidi_get_bidi_types - get bidi types for an string of characters
+ *
+ * This function finds the bidi types of an string of characters.
+ */
+FRIBIDI_ENTRY void fribidi_get_bidi_types (
+  const FriBidiChar *str,      /* input string */
+  FriBidiStrIndex len,         /* input string length */
+  FriBidiCharType *type                /* output bidi types */
+);
+
+#include "fribidi-enddecls.h"
+
+#endif /* !_FRIBIDI_BIDI_TYPE_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/lib/fribidi-bidi-types.c b/lib/fribidi-bidi-types.c
new file mode 100644 (file)
index 0000000..1c3788d
--- /dev/null
@@ -0,0 +1,76 @@
+/* FriBidi
+ * fribidi-bidi-types.c - character bidi types
+ *
+ * $Id: fribidi-bidi-types.c,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-bidi-types.c,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc.
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ *
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#include <fribidi-bidi-types.h>
+
+#include "common.h"
+
+#ifdef DEBUG
+
+FRIBIDI_ENTRY char
+fribidi_char_from_bidi_type (
+  /* input */
+  FriBidiCharType t
+)
+{
+  switch (t)
+    {
+#   define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) case FRIBIDI_TYPE_##TYPE: return SYMBOL;
+#   include "bidi-types-list.h"
+#   undef _FRIBIDI_ADD_TYPE
+    default:
+      return '?';
+    }
+}
+
+#endif
+
+FRIBIDI_ENTRY const char *
+fribidi_bidi_type_name (
+  /* input */
+  FriBidiCharType t
+)
+{
+  switch (t)
+    {
+#   define _FRIBIDI_ADD_TYPE(TYPE,SYMBOL) case FRIBIDI_TYPE_##TYPE: return #TYPE;
+#   include "bidi-types-list.h"
+#   undef _FRIBIDI_ADD_TYPE
+    default:
+      return "?";
+    }
+}
+
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/lib/fribidi-bidi-types.h b/lib/fribidi-bidi-types.h
new file mode 100644 (file)
index 0000000..778ef81
--- /dev/null
@@ -0,0 +1,278 @@
+/* FriBidi
+ * fribidi-bidi-types.h - character bidi types
+ *
+ * $Id: fribidi-bidi-types.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-bidi-types.h,v $
+ *
+ * Author:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc.
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ *
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+#ifndef _FRIBIDI_BIDI_TYPES_H
+#define _FRIBIDI_BIDI_TYPES_H
+
+#include "fribidi-common.h"
+
+#include "fribidi-types.h"
+
+#include "fribidi-begindecls.h"
+
+typedef signed char FriBidiLevel;
+
+typedef fribidi_uint32 FriBidiMaskType;
+typedef FriBidiMaskType FriBidiCharType;
+
+/* 
+ * Define some bit masks, that character types are based on, each one has
+ * only one bit on.
+ */
+
+/* Do not use enum, because 16bit processors do not allow 32bit enum values. */
+
+#define FRIBIDI_MASK_RTL       0x00000001L     /* Is right to left */
+#define FRIBIDI_MASK_ARABIC    0x00000002L     /* Is arabic */
+
+/* Each char can be only one of the three following. */
+#define FRIBIDI_MASK_STRONG    0x00000010L     /* Is strong */
+#define FRIBIDI_MASK_WEAK      0x00000020L     /* Is weak */
+#define FRIBIDI_MASK_NEUTRAL   0x00000040L     /* Is neutral */
+#define FRIBIDI_MASK_SENTINEL  0x00000080L     /* Is sentinel: SOT, EOT */
+/* Sentinels are not valid chars, just identify the start and end of strings. */
+
+/* Each char can be only one of the five following. */
+#define FRIBIDI_MASK_LETTER    0x00000100L     /* Is letter: L, R, AL */
+#define FRIBIDI_MASK_NUMBER    0x00000200L     /* Is number: EN, AN */
+#define FRIBIDI_MASK_NUMSEPTER 0x00000400L     /* Is number separator or terminator: ES, ET, CS */
+#define FRIBIDI_MASK_SPACE     0x00000800L     /* Is space: BN, BS, SS, WS */
+#define FRIBIDI_MASK_EXPLICIT  0x00001000L     /* Is expilict mark: LRE, RLE, LRO, RLO, PDF */
+
+/* Can be on only if FRIBIDI_MASK_SPACE is also on. */
+#define FRIBIDI_MASK_SEPARATOR 0x00002000L     /* Is test separator: BS, SS */
+/* Can be on only if FRIBIDI_MASK_EXPLICIT is also on. */
+#define FRIBIDI_MASK_OVERRIDE  0x00004000L     /* Is explicit override: LRO, RLO */
+
+/* The following must be to make types pairwise different, some of them can
+   be removed but are here because of efficiency (make queries faster). */
+
+#define FRIBIDI_MASK_ES                0x00010000L
+#define FRIBIDI_MASK_ET                0x00020000L
+#define FRIBIDI_MASK_CS                0x00040000L
+
+#define FRIBIDI_MASK_NSM       0x00080000L
+#define FRIBIDI_MASK_BN                0x00100000L
+
+#define FRIBIDI_MASK_BS                0x00200000L
+#define FRIBIDI_MASK_SS                0x00400000L
+#define FRIBIDI_MASK_WS                0x00800000L
+
+/* We reserve the sign bit for user's private use: we will never use it,
+   then negative character types will be never assigned. */
+
+
+/*
+ * Define values for FriBidiCharType
+ */
+
+/* Strong left to right */
+#define FRIBIDI_TYPE_LTR       ( FRIBIDI_MASK_STRONG + FRIBIDI_MASK_LETTER )
+/* Right to left characters */
+#define FRIBIDI_TYPE_RTL       ( FRIBIDI_MASK_STRONG + FRIBIDI_MASK_LETTER \
+                               + FRIBIDI_MASK_RTL)
+/* Arabic characters */
+#define FRIBIDI_TYPE_AL                ( FRIBIDI_MASK_STRONG + FRIBIDI_MASK_LETTER \
+                               + FRIBIDI_MASK_RTL + FRIBIDI_MASK_ARABIC )
+/* Left-To-Right embedding */
+#define FRIBIDI_TYPE_LRE       (FRIBIDI_MASK_STRONG + FRIBIDI_MASK_EXPLICIT)
+/* Right-To-Left embedding */
+#define FRIBIDI_TYPE_RLE       ( FRIBIDI_MASK_STRONG + FRIBIDI_MASK_EXPLICIT \
+                               + FRIBIDI_MASK_RTL )
+/* Left-To-Right override */
+#define FRIBIDI_TYPE_LRO       ( FRIBIDI_MASK_STRONG + FRIBIDI_MASK_EXPLICIT \
+                               + FRIBIDI_MASK_OVERRIDE )
+/* Right-To-Left override */
+#define FRIBIDI_TYPE_RLO       ( FRIBIDI_MASK_STRONG + FRIBIDI_MASK_EXPLICIT \
+                               + FRIBIDI_MASK_RTL + FRIBIDI_MASK_OVERRIDE )
+
+/* Pop directional override */
+#define FRIBIDI_TYPE_PDF       ( FRIBIDI_MASK_WEAK + FRIBIDI_MASK_EXPLICIT )
+/* European digit */
+#define FRIBIDI_TYPE_EN                ( FRIBIDI_MASK_WEAK + FRIBIDI_MASK_NUMBER )
+/* Arabic digit */
+#define FRIBIDI_TYPE_AN                ( FRIBIDI_MASK_WEAK + FRIBIDI_MASK_NUMBER \
+                               + FRIBIDI_MASK_ARABIC )
+/* European number separator */
+#define FRIBIDI_TYPE_ES                ( FRIBIDI_MASK_WEAK + FRIBIDI_MASK_NUMSEPTER \
+                               + FRIBIDI_MASK_ES )
+/* European number terminator */
+#define FRIBIDI_TYPE_ET                ( FRIBIDI_MASK_WEAK + FRIBIDI_MASK_NUMSEPTER \
+                               + FRIBIDI_MASK_ET )
+/* Common Separator */
+#define FRIBIDI_TYPE_CS                ( FRIBIDI_MASK_WEAK + FRIBIDI_MASK_NUMSEPTER \
+                               + FRIBIDI_MASK_CS )
+/* Non spacing mark */
+#define FRIBIDI_TYPE_NSM       ( FRIBIDI_MASK_WEAK + FRIBIDI_MASK_NSM )
+/* Boundary neutral */
+#define FRIBIDI_TYPE_BN                ( FRIBIDI_MASK_WEAK + FRIBIDI_MASK_SPACE \
+                               + FRIBIDI_MASK_BN )
+
+/* Block separator */
+#define FRIBIDI_TYPE_BS                ( FRIBIDI_MASK_NEUTRAL + FRIBIDI_MASK_SPACE \
+                               + FRIBIDI_MASK_SEPARATOR + FRIBIDI_MASK_BS )
+/* Segment separator */
+#define FRIBIDI_TYPE_SS                ( FRIBIDI_MASK_NEUTRAL + FRIBIDI_MASK_SPACE \
+                               + FRIBIDI_MASK_SEPARATOR + FRIBIDI_MASK_SS )
+/* Whitespace */
+#define FRIBIDI_TYPE_WS                ( FRIBIDI_MASK_NEUTRAL + FRIBIDI_MASK_SPACE \
+                               + FRIBIDI_MASK_WS )
+/* Other Neutral */
+#define FRIBIDI_TYPE_ON                ( FRIBIDI_MASK_NEUTRAL )
+
+/* The following are used to identify the paragraph direction,
+   types L, R, N are not used internally anymore, and recommended to use
+   LTR, RTL and ON instead, didn't removed because of compatability. */
+#define FRIBIDI_TYPE_L         ( FRIBIDI_TYPE_LTR )
+#define FRIBIDI_TYPE_R         ( FRIBIDI_TYPE_RTL )
+#define FRIBIDI_TYPE_N         ( FRIBIDI_TYPE_ON )
+/* Weak left to right */
+#define FRIBIDI_TYPE_WL                ( FRIBIDI_MASK_WEAK )
+/* Weak right to left */
+#define FRIBIDI_TYPE_WR                ( FRIBIDI_MASK_WEAK + FRIBIDI_MASK_RTL )
+
+/* The following are only used internally */
+
+/* Start of text */
+#define FRIBIDI_TYPE_SOT       ( FRIBIDI_MASK_SENTINEL )
+/* End of text */
+#define FRIBIDI_TYPE_EOT       ( FRIBIDI_MASK_SENTINEL + FRIBIDI_MASK_RTL )
+
+/*
+ * End of define values for FriBidiCharType
+ */
+
+
+/*
+ * Defining macros for needed queries, It is fully dependent on the 
+ * implementation of FriBidiCharType.
+ */
+
+
+/* Is private-use value? */
+#define FRIBIDI_TYPE_PRIVATE(p)        ((p) < 0)
+
+/* Return the direction of the level number, FRIBIDI_TYPE_LTR for even and
+   FRIBIDI_TYPE_RTL for odds. */
+#define FRIBIDI_LEVEL_TO_DIR(lev) (FRIBIDI_TYPE_LTR | (lev & 1))
+
+/* Return the minimum level of the direction, 0 for FRIBIDI_TYPE_LTR and
+   1 for FRIBIDI_TYPE_RTL and FRIBIDI_TYPE_AL. */
+#define FRIBIDI_DIR_TO_LEVEL(dir) ((FriBidiLevel)(dir & 1))
+
+/* Is right to left? */
+#define FRIBIDI_IS_RTL(p)      ((p) & FRIBIDI_MASK_RTL)
+/* Is arabic? */
+#define FRIBIDI_IS_ARABIC(p)   ((p) & FRIBIDI_MASK_ARABIC)
+
+/* Is strong? */
+#define FRIBIDI_IS_STRONG(p)   ((p) & FRIBIDI_MASK_STRONG)
+/* Is weak? */
+#define FRIBIDI_IS_WEAK(p)     ((p) & FRIBIDI_MASK_WEAK)
+/* Is neutral? */
+#define FRIBIDI_IS_NEUTRAL(p)  ((p) & FRIBIDI_MASK_NEUTRAL)
+/* Is sentinel? */
+#define FRIBIDI_IS_SENTINEL(p) ((p) & FRIBIDI_MASK_SENTINEL)
+
+/* Is letter: L, R, AL? */
+#define FRIBIDI_IS_LETTER(p)   ((p) & FRIBIDI_MASK_LETTER)
+/* Is number: EN, AN? */
+#define FRIBIDI_IS_NUMBER(p)   ((p) & FRIBIDI_MASK_NUMBER)
+/* Is number separator or terminator: ES, ET, CS? */
+#define FRIBIDI_IS_NUMBER_SEPARATOR_OR_TERMINATOR(p) \
+       ((p) & FRIBIDI_MASK_NUMSEPTER)
+/* Is space: BN, BS, SS, WS? */
+#define FRIBIDI_IS_SPACE(p)    ((p) & FRIBIDI_MASK_SPACE)
+/* Is explicit mark: LRE, RLE, LRO, RLO, PDF? */
+#define FRIBIDI_IS_EXPLICIT(p) ((p) & FRIBIDI_MASK_EXPLICIT)
+
+/* Is test separator: BS, SS? */
+#define FRIBIDI_IS_SEPARATOR(p) ((p) & FRIBIDI_MASK_SEPARATOR)
+
+/* Is explicit override: LRO, RLO? */
+#define FRIBIDI_IS_OVERRIDE(p) ((p) & FRIBIDI_MASK_OVERRIDE)
+
+/* Some more: */
+
+/* Is left to right letter: LTR? */
+#define FRIBIDI_IS_LTR_LETTER(p) \
+       ((p) & (FRIBIDI_MASK_LETTER | FRIBIDI_MASK_RTL) == FRIBIDI_MASK_LETTER)
+
+/* Is right to left letter: RTL, AL? */
+#define FRIBIDI_IS_RTL_LETTER(p) \
+       ((p) & (FRIBIDI_MASK_LETTER | FRIBIDI_MASK_RTL) \
+       == (FRIBIDI_MASK_LETTER | FRIBIDI_MASK_RTL))
+
+/* Is ES or CS: ES, CS? */
+#define FRIBIDI_IS_ES_OR_CS(p) \
+       ((p) & (FRIBIDI_MASK_ES | FRIBIDI_MASK_CS))
+
+/* Is explicit or BN: LRE, RLE, LRO, RLO, PDF, BN? */
+#define FRIBIDI_IS_EXPLICIT_OR_BN(p) \
+       ((p) & (FRIBIDI_MASK_EXPLICIT | FRIBIDI_MASK_BN))
+
+/* Is explicit or separator or BN or WS: LRE, RLE, LRO, RLO, PDF, BS, SS, BN, WS? */
+#define FRIBIDI_IS_EXPLICIT_OR_SEPARATOR_OR_BN_OR_WS(p) \
+       ((p) & (FRIBIDI_MASK_EXPLICIT | FRIBIDI_MASK_SEPARATOR \
+               | FRIBIDI_MASK_BN | FRIBIDI_MASK_WS))
+
+/* Define some conversions. */
+
+/* Change numbers: EN, AN to RTL. */
+#define FRIBIDI_CHANGE_NUMBER_TO_RTL(p) \
+       (FRIBIDI_IS_NUMBER(p) ? FRIBIDI_TYPE_RTL : (p))
+
+/* Override status of an explicit mark: LRO->LTR, RLO->RTL, otherwise->ON. */
+#define FRIBIDI_EXPLICIT_TO_OVERRIDE_DIR(p) \
+       (FRIBIDI_IS_OVERRIDE(p) ? FRIBIDI_LEVEL_TO_DIR(FRIBIDI_DIR_TO_LEVEL(p)) \
+                               : FRIBIDI_TYPE_ON)
+
+
+/* fribidi_type_name is the old name of fribidi_bidi_type_name */
+#define fribidi_type_name fribidi_bidi_type_name
+
+#define fribidi_bidi_type_name FRIBIDI_NAMESPACE(bidi_type_name)
+/* fribidi_bidi_type_name - get bidi type name
+ *
+ * This function returns the bidi type name of a character type.  The
+ * returned string is a static string and should not be freed.
+ */
+FRIBIDI_ENTRY const char *fribidi_bidi_type_name (
+  FriBidiCharType t            /* input bidi type */
+);
+
+#include "fribidi-enddecls.h"
+
+#endif /* !_FRIBIDI_BIDI_TYPES_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/lib/fribidi-bidi.c b/lib/fribidi-bidi.c
new file mode 100644 (file)
index 0000000..5a9cfcf
--- /dev/null
@@ -0,0 +1,1424 @@
+/* FriBidi
+ * fribidi-bidi.c - bidirectional algorithm
+ *
+ * $Id: fribidi-bidi.c,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-bidi.c,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#include <fribidi-bidi.h>
+#include <fribidi-bidi-type.h>
+#include <fribidi-mirroring.h>
+#include <fribidi-unicode.h>
+#include <fribidi-env.h>
+
+#include "mem.h"
+
+#include "common.h"
+
+#undef MAX
+#define MAX(a,b) ((a) > (b) ? (a) : (b))
+
+/*======================================================================
+ * Typedef for the run-length list.
+ *----------------------------------------------------------------------*/
+typedef struct _TypeLink TypeLink;
+
+struct _TypeLink
+{
+  TypeLink *prev;
+  TypeLink *next;
+
+  FriBidiCharType type;
+  FriBidiStrIndex pos, len;
+  FriBidiLevel level;
+};
+
+#define FRIBIDI_LEVEL_REMOVED -3
+#define FRIBIDI_LEVEL_START   -2
+#define FRIBIDI_LEVEL_END     -1
+
+typedef struct
+{
+  FriBidiCharType override;    /* only LTR, RTL and ON are valid */
+  FriBidiLevel level;
+}
+LevelInfo;
+
+static void
+bidi_string_reverse (
+  FriBidiChar *str,
+  FriBidiStrIndex len
+)
+{
+  FriBidiStrIndex i;
+  for (i = 0; i < len / 2; i++)
+    {
+      FriBidiChar tmp = str[i];
+      str[i] = str[len - 1 - i];
+      str[len - 1 - i] = tmp;
+    }
+}
+
+static void
+index_array_reverse (
+  FriBidiStrIndex *arr,
+  FriBidiStrIndex len
+)
+{
+  FriBidiStrIndex i;
+  for (i = 0; i < len / 2; i++)
+    {
+      FriBidiStrIndex tmp = arr[i];
+      arr[i] = arr[len - 1 - i];
+      arr[len - 1 - i] = tmp;
+    }
+}
+
+#ifndef USE_SIMPLE_MALLOC
+static TypeLink *free_type_links = NULL;
+#endif /* !USE_SIMPLE_MALLOC */
+
+static TypeLink *
+new_type_link (
+  void
+)
+{
+  TypeLink *link;
+
+#if USE_SIMPLE_MALLOC
+  link = fribidi_malloc (sizeof (TypeLink));
+#else /* !USE_SIMPLE_MALLOC */
+  if (free_type_links)
+    {
+      link = free_type_links;
+      free_type_links = free_type_links->next;
+    }
+  else
+    {
+      static FriBidiMemChunk *mem_chunk = NULL;
+
+      if (!mem_chunk)
+       mem_chunk = fribidi_chunk_new_for_type (TypeLink
+       );
+
+      link = fribidi_chunk_new (TypeLink,
+                               mem_chunk
+      );
+    }
+#endif /* !USE_SIMPLE_MALLOC */
+
+  link->len = 0;
+  link->pos = 0;
+  link->level = 0;
+  link->next = NULL;
+  link->prev = NULL;
+  return link;
+}
+
+static void
+free_type_link (
+  TypeLink *link
+)
+{
+#if USE_SIMPLE_MALLOC
+  fribidi_free (link);
+#else /* !USE_SIMPLE_MALLOC */
+  link->next = free_type_links;
+  free_type_links = link;
+#endif /* !USE_SIMPLE_MALLOC */
+}
+
+#define FRIBIDI_ADD_TYPE_LINK(p,q) \
+       FRIBIDI_BEGIN_STMT      \
+               (p)->len = (q)->pos - (p)->pos; \
+               (p)->next = (q);        \
+               (q)->prev = (p);        \
+               (p) = (q);      \
+       FRIBIDI_END_STMT
+
+static TypeLink *
+run_length_encode_types (
+  FriBidiCharType *char_type,
+  FriBidiStrIndex type_len
+)
+{
+  TypeLink *list, *last, *link;
+
+  FriBidiStrIndex i;
+
+  /* Add the starting link */
+  list = new_type_link ();
+  list->type = FRIBIDI_TYPE_SOT;
+  list->level = FRIBIDI_LEVEL_START;
+  last = list;
+
+  /* Sweep over the string_type s */
+  for (i = 0; i < type_len; i++)
+    if (char_type[i] != last->type)
+      {
+       link = new_type_link ();
+       link->type = char_type[i];
+       link->pos = i;
+       FRIBIDI_ADD_TYPE_LINK (last, link);
+      }
+
+  /* Add the ending link */
+  link = new_type_link ();
+  link->type = FRIBIDI_TYPE_EOT;
+  link->level = FRIBIDI_LEVEL_END;
+  link->pos = type_len;
+  FRIBIDI_ADD_TYPE_LINK (last, link);
+
+  return list;
+}
+
+/* explicits_list is a list like type_rl_list, that holds the explicit
+   codes that are removed from rl_list, to reinsert them later by calling
+   the override_list.
+*/
+static void
+init_list (
+  TypeLink **start,
+  TypeLink **end
+)
+{
+  TypeLink *list;
+  TypeLink *link;
+
+  /* Add the starting link */
+  list = new_type_link ();
+  list->type = FRIBIDI_TYPE_SOT;
+  list->level = FRIBIDI_LEVEL_START;
+  list->len = 0;
+  list->pos = 0;
+
+  /* Add the ending link */
+  link = new_type_link ();
+  link->type = FRIBIDI_TYPE_EOT;
+  link->level = FRIBIDI_LEVEL_END;
+  link->len = 0;
+  link->pos = 0;
+  list->next = link;
+  link->prev = list;
+
+  *start = list;
+  *end = link;
+}
+
+/* move an element before another element in a list, the list must have a
+   previous element, used to update explicits_list.
+   assuming that p have both prev and next or none of them, also update
+   the list that p is currently in, if any.
+*/
+static void
+move_element_before (
+  TypeLink *p,
+  TypeLink *list
+)
+{
+  if (p->prev)
+    {
+      p->prev->next = p->next;
+      p->next->prev = p->prev;
+    }
+  p->prev = list->prev;
+  list->prev->next = p;
+  p->next = list;
+  list->prev = p;
+}
+
+/* override the rl_list 'base', with the elements in the list 'over', to
+   reinsert the previously-removed explicit codes (at X9) from
+   'explicits_list' back into 'type_rl_list'. This is used at the end of I2
+   to restore the explicit marks, and also to reset the character types of
+   characters at L1.
+
+   it is assumed that the 'pos' of the first element in 'base' list is not
+   more than the 'pos' of the first element of the 'over' list, and the
+   'pos' of the last element of the 'base' list is not less than the 'pos'
+   of the last element of the 'over' list. these two conditions are always
+   satisfied for the two usages mentioned above.
+
+   TBD: use some explanatory names instead of p, q, ...
+*/
+static void
+override_list (
+  TypeLink *base,
+  TypeLink *over
+)
+{
+  TypeLink *p = base, *q, *r, *s, *t;
+  FriBidiStrIndex pos = 0, pos2;
+
+  if (!over)
+    return;
+  q = over;
+  while (q)
+    {
+      if (!q->len || q->pos < pos)
+       {
+         t = q;
+         q = q->next;
+         free_type_link (t);
+         continue;
+       }
+      pos = q->pos;
+      while (p->next && p->next->pos <= pos)
+       p = p->next;
+      /* now p is the element that q must be inserted 'in'. */
+      pos2 = pos + q->len;
+      r = p;
+      while (r->next && r->next->pos < pos2)
+       r = r->next;
+      /* now r is the last element that q affects. */
+      if (p == r)
+       {
+         /* split p into at most 3 interval, and insert q in the place of
+            the second interval, set r to be the third part. */
+         /* third part needed? */
+         if (p->next && p->next->pos == pos2)
+           r = r->next;
+         else
+           {
+             r = new_type_link ();
+             *r = *p;
+             if (r->next)
+               {
+                 r->next->prev = r;
+                 r->len = r->next->pos - pos2;
+               }
+             else
+               r->len -= pos - p->pos;
+             r->pos = pos2;
+           }
+         /* first part needed? */
+         if (p->prev && p->pos == pos)
+           {
+             t = p;
+             p = p->prev;
+             free_type_link (t);
+           }
+         else
+           p->len = pos - p->pos;
+       }
+      else
+       {
+         /* cut the end of p. */
+         p->len = pos - p->pos;
+         /* if all of p is cut, remove it. */
+         if (!p->len && p->prev)
+           p = p->prev;
+
+         /* cut the begining of r. */
+         r->pos = pos2;
+         if (r->next)
+           r->len = r->next->pos - pos2;
+         /* if all of r is cut, remove it. */
+         if (!r->len && r->next)
+           r = r->next;
+
+         /* remove the elements between p and r. */
+         for (s = p->next; s != r;)
+           {
+             t = s;
+             s = s->next;
+             free_type_link (t);
+           }
+       }
+      /* before updating the next and prev links to point to the inserted q,
+         we must remember the next element of q in the 'over' list.
+       */
+      t = q;
+      q = q->next;
+      p->next = t;
+      t->prev = p;
+      t->next = r;
+      r->prev = t;
+    }
+}
+
+/* Some convenience macros */
+#define RL_TYPE(list) ((list)->type)
+#define RL_LEN(list) ((list)->len)
+#define RL_POS(list) ((list)->pos)
+#define RL_LEVEL(list) ((list)->level)
+
+static TypeLink *
+merge_with_prev (
+  TypeLink *second
+)
+{
+  TypeLink *first = second->prev;
+  first->next = second->next;
+  first->next->prev = first;
+  RL_LEN (first) += RL_LEN (second);
+  free_type_link (second);
+  return first;
+}
+
+static void
+compact_list (
+  TypeLink *list
+)
+{
+  if (list->next)
+    for (list = list->next; list; list = list->next)
+      if (RL_TYPE (list->prev) == RL_TYPE (list)
+         && RL_LEVEL (list->prev) == RL_LEVEL (list))
+       list = merge_with_prev (list);
+}
+
+static void
+compact_neutrals (
+  TypeLink *list
+)
+{
+  if (list->next)
+    {
+      for (list = list->next; list; list = list->next)
+       {
+         if (RL_LEVEL (list->prev) == RL_LEVEL (list)
+             &&
+             ((RL_TYPE
+               (list->prev) == RL_TYPE (list)
+               || (FRIBIDI_IS_NEUTRAL (RL_TYPE (list->prev))
+                   && FRIBIDI_IS_NEUTRAL (RL_TYPE (list))))))
+           list = merge_with_prev (list);
+       }
+    }
+}
+
+/*=========================================================================
+ * define macros for push and pop the status in to / out of the stack
+ *-------------------------------------------------------------------------*/
+
+/* There's some little points in pushing and poping into the status stack:
+   1. when the embedding level is not valid (more than FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL=61),
+   you must reject it, and not to push into the stack, but when you see a
+   PDF, you must find the matching code, and if it was pushed in the stack,
+   pop it, it means you must pop if and only if you have pushed the
+   matching code, the over_pushed var counts the number of rejected codes yet.
+   2. there's a more confusing point too, when the embedding level is exactly
+   FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL-1=60, an LRO or LRE must be rejected because the new
+   level would be FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL+1=62, that is invalid, but an RLO or RLE
+   must be accepted because the new level is FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL=61, that is
+   valid, so the rejected codes may be not continuous in the logical order,
+   in fact there is at most two continuous intervals of codes, with a RLO or
+   RLE between them.  To support this case, the first_interval var counts the
+   number of rejected codes in the first interval, when it is 0, means that
+   there is only one interval yet.
+*/
+
+/* a. If this new level would be valid, then this embedding code is valid.
+   Remember (push) the current embedding level and override status.
+   Reset current level to this new level, and reset the override status to
+   new_override.
+   b. If the new level would not be valid, then this code is invalid. Don't
+   change the current level or override status.
+*/
+#define PUSH_STATUS \
+    FRIBIDI_BEGIN_STMT \
+      if (new_level <= FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL) \
+        { \
+          if (level == FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL - 1) \
+            first_interval = over_pushed; \
+          status_stack[stack_size].level = level; \
+          status_stack[stack_size].override = override; \
+          stack_size++; \
+          level = new_level; \
+          override = new_override; \
+        } else \
+         over_pushed++; \
+    FRIBIDI_END_STMT
+
+/* If there was a valid matching code, restore (pop) the last remembered
+   (pushed) embedding level and directional override.
+*/
+#define POP_STATUS \
+    FRIBIDI_BEGIN_STMT \
+      if (over_pushed || stack_size) \
+      { \
+        if (over_pushed > first_interval) \
+          over_pushed--; \
+        else \
+          { \
+            if (over_pushed == first_interval) \
+              first_interval = 0; \
+            stack_size--; \
+            level = status_stack[stack_size].level; \
+            override = status_stack[stack_size].override; \
+          } \
+      } \
+    FRIBIDI_END_STMT
+
+/*==========================================================================
+ * There was no support for sor and eor in the absence of Explicit Embedding
+ * Levels, so define macros, to support them, with as less change as needed.
+ *--------------------------------------------------------------------------*/
+
+/* Return the type of previous char or the sor, if already at the start of
+   a run level. */
+#define PREV_TYPE_OR_SOR(pp) \
+    ( \
+     RL_LEVEL(pp->prev) == RL_LEVEL(pp) ? \
+      RL_TYPE(pp->prev) : \
+      FRIBIDI_LEVEL_TO_DIR(MAX(RL_LEVEL(pp->prev), RL_LEVEL(pp))) \
+    )
+
+/* Return the type of next char or the eor, if already at the end of
+   a run level. */
+#define NEXT_TYPE_OR_EOR(pp) \
+    ( \
+     !pp->next ? \
+      FRIBIDI_LEVEL_TO_DIR(RL_LEVEL(pp)) : \
+      (RL_LEVEL(pp->next) == RL_LEVEL(pp) ? \
+        RL_TYPE(pp->next) : \
+        FRIBIDI_LEVEL_TO_DIR(MAX(RL_LEVEL(pp->next), RL_LEVEL(pp))) \
+      ) \
+    )
+
+
+/* Return the embedding direction of a link. */
+#define FRIBIDI_EMBEDDING_DIRECTION(list) \
+    FRIBIDI_LEVEL_TO_DIR(RL_LEVEL(list))
+
+#if DEBUG
+/*======================================================================
+ *  For debugging, define some functions for printing the types and the
+ *  levels.
+ *----------------------------------------------------------------------*/
+
+static char char_from_level_array[] = {
+  '!',                         /* FRIBIDI_LEVEL_REMOVED, internal error, this level shouldn't be seen.  */
+  '^',                         /* FRIBIDI_LEVEL_START, indicating start of string. */
+  '$',                         /* FRIBIDI_LEVEL_END, indicating end of string. */
+  /* 0-9,a-z,A-Z are the the only valid levels before resolving implicits.
+     after that the level @ may be appear too. */
+  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+  'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+  'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
+  'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D',
+  'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
+  'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
+  'Y', 'Z',
+
+  '@',                         /* only must appear after resolving implicits. */
+  '*', '*', '*'                        /* overflows, this levels and higher levels show a bug!. */
+};
+
+#define fribidi_char_from_level(level) char_from_level_array[(level) + 3]
+
+static void
+print_types_re (
+  TypeLink *pp
+)
+{
+  MSG ("  Run types  : ");
+  while (pp)
+    {
+      MSG5 ("%d:l%d(%s)[%d] ",
+           pp->pos, pp->len, fribidi_type_name (pp->type), pp->level);
+      pp = pp->next;
+    }
+  MSG ("\n");
+}
+
+static void
+print_resolved_levels (
+  TypeLink *pp
+)
+{
+  MSG ("  Res. levels: ");
+  while (pp)
+    {
+      FriBidiStrIndex i;
+      for (i = RL_LEN (pp); i; i--)
+       MSG2 ("%c", fribidi_char_from_level (RL_LEVEL (pp)));
+      pp = pp->next;
+    }
+  MSG ("\n");
+}
+
+static void
+print_resolved_types (
+  TypeLink *pp
+)
+{
+  MSG ("  Res. types : ");
+  while (pp)
+    {
+      FriBidiStrIndex i;
+      for (i = RL_LEN (pp); i; i--)
+       MSG2 ("%c", fribidi_char_from_bidi_type (pp->type));
+      pp = pp->next;
+    }
+  MSG ("\n");
+}
+
+static void
+print_bidi_string (
+  /* input */
+  const FriBidiChar *str,
+  FriBidiStrIndex len
+)
+{
+  MSG ("  Org. types : ");
+  for (; len; len--)
+    MSG2 ("%c", fribidi_char_from_bidi_type (fribidi_get_bidi_type (*str++)));
+  MSG ("\n");
+}
+#endif /* DEBUG */
+
+/*======================================================================
+ *  This function should follow the Unicode specification closely!
+ *----------------------------------------------------------------------*/
+static void
+fribidi_analyse_string (
+  /* input */
+  const FriBidiChar *str,
+  FriBidiStrIndex len,
+  /* input and output */
+  FriBidiCharType *pbase_dir,
+  /* output */
+  TypeLink **ptype_rl_list,
+  FriBidiLevel *pmax_level
+)
+{
+  FriBidiLevel base_level, max_level;
+  FriBidiCharType base_dir;
+  FriBidiStrIndex i;
+  TypeLink *type_rl_list, *explicits_list, *explicits_list_end, *pp;
+
+  DBG ("Entering fribidi_analyse_string");
+
+  /* Determinate character types */
+  DBG ("  Determine character types");
+  {
+    FriBidiCharType *char_type =
+      (FriBidiCharType *) fribidi_malloc (len * sizeof (FriBidiCharType));
+    for (i = 0; i < len; i++)
+      char_type[i] = fribidi_get_type (str[i]);
+
+    /* Run length encode the character types */
+    type_rl_list = run_length_encode_types (char_type, len);
+    fribidi_free (char_type);
+  }
+  DBG ("  Determine character types, Done");
+
+  init_list (&explicits_list, &explicits_list_end);
+
+  /* Find base level */
+  DBG ("  Finding the base level");
+  if (FRIBIDI_IS_STRONG (*pbase_dir))
+    base_level = FRIBIDI_DIR_TO_LEVEL (*pbase_dir);
+  /* P2. P3. Search for first strong character and use its direction as
+     base direction */
+  else
+    {
+      /* If no strong base_dir was found, resort to the weak direction
+         that was passed on input. */
+      base_level = FRIBIDI_DIR_TO_LEVEL (*pbase_dir);
+      base_dir = FRIBIDI_TYPE_ON;
+      for (pp = type_rl_list; pp; pp = pp->next)
+       if (FRIBIDI_IS_LETTER (RL_TYPE (pp)))
+         {
+           base_level = FRIBIDI_DIR_TO_LEVEL (RL_TYPE (pp));
+           base_dir = FRIBIDI_LEVEL_TO_DIR (base_level);
+           break;
+         }
+    }
+  base_dir = FRIBIDI_LEVEL_TO_DIR (base_level);
+  DBG2 ("  Base level : %c", fribidi_char_from_level (base_level));
+  DBG2 ("  Base dir   : %c", fribidi_char_from_bidi_type (base_dir));
+  DBG ("  Finding the base level, Done");
+
+# if DEBUG
+  if (fribidi_debug_status ())
+    {
+      print_types_re (type_rl_list);
+    }
+# endif        /* DEBUG */
+
+  /* Explicit Levels and Directions */
+  DBG ("Explicit Levels and Directions");
+  {
+    /* X1. Begin by setting the current embedding level to the paragraph
+       embedding level. Set the directional override status to neutral.
+       Process each character iteratively, applying rules X2 through X9.
+       Only embedding levels from 0 to 61 are valid in this phase. */
+    FriBidiLevel level, new_level;
+    FriBidiCharType override, new_override;
+    FriBidiStrIndex i;
+    int stack_size, over_pushed, first_interval;
+    LevelInfo *status_stack;
+    TypeLink temp_link;
+
+    level = base_level;
+    override = FRIBIDI_TYPE_ON;
+    /* stack */
+    stack_size = 0;
+    over_pushed = 0;
+    first_interval = 0;
+    status_stack =
+      (LevelInfo *) fribidi_malloc (sizeof (LevelInfo) *
+                                   FRIBIDI_BIDI_MAX_RESOLVED_LEVELS);
+
+    for (pp = type_rl_list->next; pp->next; pp = pp->next)
+      {
+       FriBidiCharType this_type = RL_TYPE (pp);
+       if (FRIBIDI_IS_EXPLICIT_OR_BN (this_type))
+         {
+           if (FRIBIDI_IS_STRONG (this_type))
+             {                 /* LRE, RLE, LRO, RLO */
+               /* 1. Explicit Embeddings */
+               /*   X2. With each RLE, compute the least greater odd embedding level. */
+               /*   X3. With each LRE, compute the least greater even embedding level. */
+               /* 2. Explicit Overrides */
+               /*   X4. With each RLO, compute the least greater odd embedding level. */
+               /*   X5. With each LRO, compute the least greater even embedding level. */
+               new_override = FRIBIDI_EXPLICIT_TO_OVERRIDE_DIR (this_type);
+               for (i = RL_LEN (pp); i; i--)
+                 {
+                   new_level =
+                     ((level + FRIBIDI_DIR_TO_LEVEL (this_type) + 2) & ~1) -
+                     FRIBIDI_DIR_TO_LEVEL (this_type);
+                   PUSH_STATUS;
+                 }
+             }
+           else if (this_type == FRIBIDI_TYPE_PDF)
+             {
+               /* 3. Terminating Embeddings and overrides */
+               /*   X7. With each PDF, determine the matching embedding or
+                  override code. */
+               for (i = RL_LEN (pp); i; i--)
+                 POP_STATUS;
+             }
+           /* X9. Remove all RLE, LRE, RLO, LRO, PDF, and BN codes. */
+           /* Remove element and add it to explicits_list */
+           temp_link.next = pp->next;
+           pp->level = FRIBIDI_LEVEL_REMOVED;
+           move_element_before (pp, explicits_list_end);
+           pp = &temp_link;
+         }
+       else
+         {
+           /* X6. For all typed besides RLE, LRE, RLO, LRO, and PDF:
+              a. Set the level of the current character to the current
+              embedding level.
+              b. Whenever the directional override status is not neutral,
+              reset the current character type to the directional override
+              status. */
+           RL_LEVEL (pp) = level;
+           if (!FRIBIDI_IS_NEUTRAL (override))
+             RL_TYPE (pp) = override;
+         }
+       /* X8. All explicit directional embeddings and overrides are
+          completely terminated at the end of each paragraph. Paragraph
+          separators are not included in the embedding. */
+       /* This function is running on a single paragraph, so we can do
+          X8 after all the input is processed. */
+      }
+
+    /* Implementing X8. It has no effect on a single paragraph! */
+    level = base_level;
+    override = FRIBIDI_TYPE_ON;
+    stack_size = 0;
+    over_pushed = 0;
+
+    fribidi_free (status_stack);
+  }
+  /* X10. The remaining rules are applied to each run of characters at the
+     same level. For each run, determine the start-of-level-run (sor) and
+     end-of-level-run (eor) type, either L or R. This depends on the
+     higher of the two levels on either side of the boundary (at the start
+     or end of the paragraph, the level of the 'other' run is the base
+     embedding level). If the higher level is odd, the type is R, otherwise
+     it is L. */
+  /* Resolving Implicit Levels can be done out of X10 loop, so only change
+     of Resolving Weak Types and Resolving Neutral Types is needed. */
+
+  compact_list (type_rl_list);
+
+# if DEBUG
+  if (fribidi_debug_status ())
+    {
+      print_types_re (type_rl_list);
+      print_bidi_string (str, len);
+      print_resolved_levels (type_rl_list);
+      print_resolved_types (type_rl_list);
+    }
+# endif        /* DEBUG */
+
+  /* 4. Resolving weak types */
+  DBG ("Resolving weak types");
+  {
+    FriBidiCharType last_strong, prev_type_org;
+    fribidi_boolean w4;
+
+    last_strong = base_dir;
+
+    for (pp = type_rl_list->next; pp->next; pp = pp->next)
+      {
+       FriBidiCharType prev_type, this_type, next_type;
+
+       prev_type = PREV_TYPE_OR_SOR (pp);
+       this_type = RL_TYPE (pp);
+       next_type = NEXT_TYPE_OR_EOR (pp);
+
+       if (FRIBIDI_IS_STRONG (prev_type))
+         last_strong = prev_type;
+
+       /* W1. NSM
+          Examine each non-spacing mark (NSM) in the level run, and change the
+          type of the NSM to the type of the previous character. If the NSM
+          is at the start of the level run, it will get the type of sor. */
+       /* Implementation note: it is important that if the previous character
+          is not sor, then we should merge this run with the previous,
+          because of rules like W5, that we assume all of a sequence of
+          adjacent ETs are in one TypeLink. */
+       if (this_type == FRIBIDI_TYPE_NSM)
+         {
+           if (RL_LEVEL (pp->prev) == RL_LEVEL (pp))
+             pp = merge_with_prev (pp);
+           else
+             RL_TYPE (pp) = prev_type;
+           continue;           /* As we know the next condition cannot be true. */
+         }
+
+       /* W2: European numbers. */
+       if (this_type == FRIBIDI_TYPE_EN && last_strong == FRIBIDI_TYPE_AL)
+         {
+           RL_TYPE (pp) = FRIBIDI_TYPE_AN;
+
+           /* Resolving dependency of loops for rules W1 and W2, so we
+              can merge them in one loop. */
+           if (next_type == FRIBIDI_TYPE_NSM)
+             RL_TYPE (pp->next) = FRIBIDI_TYPE_AN;
+         }
+      }
+
+
+    last_strong = base_dir;
+    /* Resolving dependency of loops for rules W4 and W5, W5 may
+       want to prevent W4 to take effect in the next turn, do this 
+       through "w4". */
+    w4 = TRUE;
+    /* Resolving dependency of loops for rules W4 and W5 with W7,
+       W7 may change an EN to L but it sets the prev_type_org if needed,
+       so W4 and W5 in next turn can still do their works. */
+    prev_type_org = FRIBIDI_TYPE_ON;
+
+    for (pp = type_rl_list->next; pp->next; pp = pp->next)
+      {
+       FriBidiCharType prev_type, this_type, next_type;
+
+       prev_type = PREV_TYPE_OR_SOR (pp);
+       this_type = RL_TYPE (pp);
+       next_type = NEXT_TYPE_OR_EOR (pp);
+
+       if (FRIBIDI_IS_STRONG (prev_type))
+         last_strong = prev_type;
+
+       /* W3: Change ALs to R. */
+       if (this_type == FRIBIDI_TYPE_AL)
+         {
+           RL_TYPE (pp) = FRIBIDI_TYPE_RTL;
+           w4 = TRUE;
+           prev_type_org = FRIBIDI_TYPE_ON;
+           continue;
+         }
+
+       /* W4. A single european separator changes to a european number.
+          A single common separator between two numbers of the same type
+          changes to that type. */
+       if (w4
+           && RL_LEN (pp) == 1 && FRIBIDI_IS_ES_OR_CS (this_type)
+           && FRIBIDI_IS_NUMBER (prev_type_org) && prev_type_org == next_type
+           && (prev_type_org == FRIBIDI_TYPE_EN
+               || this_type == FRIBIDI_TYPE_CS))
+         {
+           RL_TYPE (pp) = prev_type;
+           this_type = RL_TYPE (pp);
+         }
+       w4 = TRUE;
+
+       /* W5. A sequence of European terminators adjacent to European
+          numbers changes to All European numbers. */
+       if (this_type == FRIBIDI_TYPE_ET
+           && (prev_type_org == FRIBIDI_TYPE_EN
+               || next_type == FRIBIDI_TYPE_EN))
+         {
+           RL_TYPE (pp) = FRIBIDI_TYPE_EN;
+           w4 = FALSE;
+           this_type = RL_TYPE (pp);
+         }
+
+       /* W6. Otherwise change separators and terminators to other neutral. */
+       if (FRIBIDI_IS_NUMBER_SEPARATOR_OR_TERMINATOR (this_type))
+         RL_TYPE (pp) = FRIBIDI_TYPE_ON;
+
+       /* W7. Change european numbers to L. */
+       if (this_type == FRIBIDI_TYPE_EN && last_strong == FRIBIDI_TYPE_LTR)
+         {
+           RL_TYPE (pp) = FRIBIDI_TYPE_LTR;
+           prev_type_org = (RL_LEVEL (pp) == RL_LEVEL (pp->next) ?
+                            FRIBIDI_TYPE_EN : FRIBIDI_TYPE_ON);
+         }
+       else
+         prev_type_org = PREV_TYPE_OR_SOR (pp->next);
+      }
+  }
+
+  compact_neutrals (type_rl_list);
+
+# if DEBUG
+  if (fribidi_debug_status ())
+    {
+      print_resolved_levels (type_rl_list);
+      print_resolved_types (type_rl_list);
+    }
+# endif        /* DEBUG */
+
+  /* 5. Resolving Neutral Types */
+  DBG ("Resolving neutral types");
+  {
+    /* N1. and N2.
+       For each neutral, resolve it. */
+    for (pp = type_rl_list->next; pp->next; pp = pp->next)
+      {
+       FriBidiCharType prev_type, this_type, next_type;
+
+       /* "European and arabic numbers are treated as though they were R"
+          FRIBIDI_CHANGE_NUMBER_TO_RTL does this. */
+       this_type = FRIBIDI_CHANGE_NUMBER_TO_RTL (RL_TYPE (pp));
+       prev_type = FRIBIDI_CHANGE_NUMBER_TO_RTL (PREV_TYPE_OR_SOR (pp));
+       next_type = FRIBIDI_CHANGE_NUMBER_TO_RTL (NEXT_TYPE_OR_EOR (pp));
+
+       if (FRIBIDI_IS_NEUTRAL (this_type))
+         RL_TYPE (pp) = (prev_type == next_type) ?
+           /* N1. */ prev_type :
+           /* N2. */ FRIBIDI_EMBEDDING_DIRECTION (pp);
+      }
+  }
+
+  compact_list (type_rl_list);
+
+# if DEBUG
+  if (fribidi_debug_status ())
+    {
+      print_resolved_levels (type_rl_list);
+      print_resolved_types (type_rl_list);
+    }
+# endif        /* DEBUG */
+
+  /* 6. Resolving implicit levels */
+  DBG ("Resolving implicit levels");
+  {
+    max_level = base_level;
+
+    for (pp = type_rl_list->next; pp->next; pp = pp->next)
+      {
+       FriBidiCharType this_type;
+       int level;
+
+       this_type = RL_TYPE (pp);
+       level = RL_LEVEL (pp);
+
+       /* I1. Even */
+       /* I2. Odd */
+       if (FRIBIDI_IS_NUMBER (this_type))
+         RL_LEVEL (pp) = (level + 2) & ~1;
+       else
+         RL_LEVEL (pp) = (level ^ FRIBIDI_DIR_TO_LEVEL (this_type)) +
+           (level & 1);
+
+       if (RL_LEVEL (pp) > max_level)
+         max_level = RL_LEVEL (pp);
+      }
+  }
+
+  compact_list (type_rl_list);
+
+# if DEBUG
+  if (fribidi_debug_status ())
+    {
+      print_bidi_string (str, len);
+      print_resolved_levels (type_rl_list);
+      print_resolved_types (type_rl_list);
+    }
+# endif        /* DEBUG */
+
+/* Reinsert the explicit codes & bn's that already removed, from the
+   explicits_list to type_rl_list. */
+  DBG ("Reinserting explicit codes");
+  {
+    TypeLink *p;
+
+    override_list (type_rl_list, explicits_list);
+    p = type_rl_list->next;
+    if (p->level < 0)
+      p->level = base_level;
+    for (; p->next; p = p->next)
+      if (p->level < 0)
+       p->level = p->prev->level;
+  }
+
+# if DEBUG
+  if (fribidi_debug_status ())
+    {
+      print_types_re (type_rl_list);
+      print_resolved_levels (type_rl_list);
+      print_resolved_types (type_rl_list);
+    }
+# endif        /* DEBUG */
+
+  DBG ("Reset the embedding levels");
+  {
+    int j, k, state, pos;
+    TypeLink *p, *q, *list, *list_end;
+
+    /* L1. Reset the embedding levels of some chars. */
+    init_list (&list, &list_end);
+    q = list_end;
+    state = 1;
+    pos = len - 1;
+    for (j = len - 1; j >= -1; j--)
+      {
+       /* if state is on at the very first of string, do this too. */
+       if (j >= 0)
+         k = fribidi_get_type (str[j]);
+       else
+         k = FRIBIDI_TYPE_ON;
+       if (!state && FRIBIDI_IS_SEPARATOR (k))
+         {
+           state = 1;
+           pos = j;
+         }
+       else if (state && !FRIBIDI_IS_EXPLICIT_OR_SEPARATOR_OR_BN_OR_WS (k))
+         {
+           state = 0;
+           p = new_type_link ();
+           p->prev = p->next = NULL;
+           p->pos = j + 1;
+           p->len = pos - j;
+           p->type = base_dir;
+           p->level = base_level;
+           move_element_before (p, q);
+           q = p;
+         }
+      }
+    override_list (type_rl_list, list);
+  }
+
+# if DEBUG
+  if (fribidi_debug_status ())
+    {
+      print_types_re (type_rl_list);
+      print_resolved_levels (type_rl_list);
+      print_resolved_types (type_rl_list);
+    }
+# endif        /* DEBUG */
+
+  *ptype_rl_list = type_rl_list;
+  *pmax_level = max_level;
+  *pbase_dir = base_dir;
+
+  DBG ("Leaving fribidi_analyse_string");
+  return;
+}
+
+/*======================================================================
+ *  Frees up the rl_list, must be called after each call to
+ *  fribidi_analyse_string(), after the list is not needed anymore.
+ *----------------------------------------------------------------------*/
+static void
+free_rl_list (
+  TypeLink *type_rl_list
+)
+{
+
+  TypeLink *pp;
+
+  DBG ("Entering free_rl_list");
+
+  if (!type_rl_list)
+    {
+      DBG ("Leaving free_rl_list");
+      return;
+    }
+
+#if USE_SIMPLE_MALLOC
+  pp = type_rl_list;
+  while (pp)
+    {
+      TypeLink *p;
+
+      p = pp;
+      pp = pp->next;
+      free_type_link (p);
+    };
+#else /* !USE_SIMPLE_MALLOC */
+  for (pp = type_rl_list->next; pp->next; pp = pp->next)
+    /* Nothing */ ;
+  pp->next = free_type_links;
+  free_type_links = type_rl_list;
+  type_rl_list = NULL;
+#endif /* !USE_SIMPLE_MALLOC */
+
+  DBG ("Leaving free_rl_list");
+  return;
+}
+
+/*======================================================================
+ *  Here starts the exposed front end functions.
+ *----------------------------------------------------------------------*/
+
+/*======================================================================
+ *  fribidi_remove_bidi_marks() removes bidirectional marks, and returns
+ *  the new length, updates each of other inputs if not NULL.
+ *----------------------------------------------------------------------*/
+FRIBIDI_ENTRY FriBidiStrIndex
+fribidi_remove_bidi_marks (
+  FriBidiChar *str,
+  FriBidiStrIndex length,
+  FriBidiStrIndex *position_to_this_list,
+  FriBidiStrIndex *position_from_this_list,
+  FriBidiLevel *embedding_level_list
+)
+{
+  FriBidiStrIndex i, j;
+  fribidi_boolean private_from_this = FALSE;
+
+  DBG ("Entering fribidi_remove_bidi_marks");
+
+  /* If to_this is to not null, we must have from_this as well. If it is
+     not given by the caller, we have to make a private instance of it. */
+  if (position_to_this_list && !position_from_this_list)
+    {
+      private_from_this = TRUE;
+      position_from_this_list =
+       (FriBidiStrIndex *) fribidi_malloc (sizeof (FriBidiStrIndex) *
+                                           length);
+    }
+
+  j = 0;
+  for (i = 0; i < length; i++)
+    if (!FRIBIDI_IS_EXPLICIT (fribidi_get_type (str[i]))
+       && str[i] != FRIBIDI_CHAR_LRM && str[i] != FRIBIDI_CHAR_RLM)
+      {
+       str[j] = str[i];
+       if (embedding_level_list)
+         embedding_level_list[j] = embedding_level_list[i];
+       if (position_from_this_list)
+         position_from_this_list[j] = position_from_this_list[i];
+       j++;
+      }
+
+  /* Convert the from_this list to to_this */
+  if (position_to_this_list)
+    {
+      DBG ("  Converting from_this list to to_this");
+      for (i = 0; i < length; i++)
+       position_to_this_list[i] = -1;
+      for (i = 0; i < length; i++)
+       position_to_this_list[position_from_this_list[i]] = i;
+      DBG ("  Converting from_this list to to_this, Done");
+    }
+
+  if (private_from_this)
+    fribidi_free (position_from_this_list);
+
+  DBG ("Leaving fribidi_remove_bidi_marks");
+  return j;
+}
+
+
+/*======================================================================
+ *  fribidi_log2vis() calls the function_analyse_string() and then
+ *  does reordering and fills in the output strings.
+ *----------------------------------------------------------------------*/
+FRIBIDI_ENTRY fribidi_boolean
+fribidi_log2vis (
+  /* input */
+  const FriBidiChar *str,
+  FriBidiStrIndex len,
+  /* input and output */
+  FriBidiCharType *pbase_dir,
+  /* output */
+  FriBidiChar *visual_str,
+  FriBidiStrIndex *position_L_to_V_list,
+  FriBidiStrIndex *position_V_to_L_list,
+  FriBidiLevel *embedding_level_list
+)
+{
+  TypeLink *type_rl_list, *pp = NULL;
+  FriBidiLevel max_level;
+  fribidi_boolean private_V_to_L = FALSE;
+
+  DBG ("Entering fribidi_log2vis()\n");
+
+  if (len == 0)
+    {
+      DBG ("Leaving fribidi_log2vis()\n");
+      return TRUE;
+    }
+
+  /* If l2v is to be calculated we must have v2l as well. If it is not
+     given by the caller, we have to make a private instance of it. */
+  if (position_L_to_V_list && !position_V_to_L_list)
+    {
+      private_V_to_L = TRUE;
+      position_V_to_L_list =
+       (FriBidiStrIndex *) fribidi_malloc (sizeof (FriBidiStrIndex) * len);
+    }
+
+  if (len > FRIBIDI_MAX_STRING_LENGTH && position_V_to_L_list)
+    {
+#     if DEBUG
+      MSG2 (FRIBIDI ": cannot handle strings > %ld characters\n",
+           (long) FRIBIDI_MAX_STRING_LENGTH);
+#     endif /* DEBUG */
+      return FALSE;
+    }
+  fribidi_analyse_string (str, len, pbase_dir,
+                         /* output */
+                         &type_rl_list, &max_level);
+
+  /* 7. Reordering resolved levels */
+  DBG ("Reordering resolved levels\n");
+  {
+    FriBidiLevel level_idx;
+    FriBidiStrIndex i;
+
+    /* Set up the ordering array to sorted order */
+    if (position_V_to_L_list)
+      {
+       DBG ("  Initialize position_V_to_L_list\n");
+       for (i = 0; i < len; i++)
+         position_V_to_L_list[i] = i;
+       DBG ("  Initialize position_V_to_L_list, Done\n");
+      }
+    /* Copy the logical string to the visual */
+    if (visual_str)
+      {
+       DBG ("  Initialize visual_str\n");
+       for (i = 0; i < len; i++)
+         visual_str[i] = str[i];
+       visual_str[len] = 0;
+       DBG ("  Initialize visual_str, Done\n");
+      }
+
+    /* Assign the embedding level array */
+    if (embedding_level_list)
+      {
+       DBG ("  Fill the embedding levels array\n");
+       for (pp = type_rl_list->next; pp->next; pp = pp->next)
+         {
+           FriBidiStrIndex i, pos, len;
+           FriBidiLevel level;
+
+           pos = pp->pos;
+           len = pp->len;
+           level = pp->level;
+           for (i = 0; i < len; i++)
+             embedding_level_list[pos + i] = level;
+         }
+       DBG ("  Fill the embedding levels array, Done\n");
+      }
+
+    /* Reorder both the outstring and the order array */
+    if (visual_str || position_V_to_L_list)
+      {
+       if (fribidi_mirroring_status () && visual_str)
+         {
+           /* L4. Mirror all characters that are in odd levels and have mirrors. */
+           DBG ("  Mirroring\n");
+           for (pp = type_rl_list->next; pp->next; pp = pp->next)
+             {
+               if (pp->level & 1)
+                 {
+                   FriBidiStrIndex i;
+                   for (i = RL_POS (pp); i < RL_POS (pp) + RL_LEN (pp); i++)
+                     {
+                       FriBidiChar mirrored_ch;
+                       if (fribidi_get_mirror_char
+                           (visual_str[i], &mirrored_ch))
+                         visual_str[i] = mirrored_ch;
+                     }
+                 }
+             }
+           DBG ("  Mirroring, Done\n");
+         }
+
+       if (fribidi_reorder_nsm_status ())
+         {
+           /* L3. Reorder NSMs. */
+           DBG ("  Reordering NSM sequences\n");
+           /* We apply this rule before L2, so go backward in odd levels. */
+           for (pp = type_rl_list->next; pp->next; pp = pp->next)
+             {
+               if (pp->level & 1)
+                 {
+                   FriBidiStrIndex i, seq_end = 0;
+                   fribidi_boolean is_nsm_seq;
+
+                   is_nsm_seq = FALSE;
+                   for (i = RL_POS (pp) + RL_LEN (pp) - 1; i >= RL_POS (pp);
+                        i--)
+                     {
+                       FriBidiCharType this_type;
+
+                       this_type = fribidi_get_type (str[i]);
+                       if (is_nsm_seq && this_type != FRIBIDI_TYPE_NSM)
+                         {
+                           if (visual_str)
+                             {
+                               bidi_string_reverse (visual_str + i,
+                                                    seq_end - i + 1);
+                             }
+                           if (position_V_to_L_list)
+                             {
+                               index_array_reverse (position_V_to_L_list + i,
+                                                    seq_end - i + 1);
+                             }
+                           is_nsm_seq = 0;
+                         }
+                       else if (!is_nsm_seq && this_type == FRIBIDI_TYPE_NSM)
+                         {
+                           seq_end = i;
+                           is_nsm_seq = 1;
+                         }
+                     }
+                   if (is_nsm_seq)
+                     {
+                       DBG
+                         ("Warning: NSMs at the beggining of run level.\n");
+                     }
+                 }
+             }
+           DBG ("  Reordering NSM sequences, Done\n");
+         }
+
+       /* L2. Reorder. */
+       DBG ("  Reordering\n");
+       for (level_idx = max_level; level_idx > 0; level_idx--)
+         {
+           for (pp = type_rl_list->next; pp->next; pp = pp->next)
+             {
+               if (RL_LEVEL (pp) >= level_idx)
+                 {
+                   /* Find all stretches that are >= level_idx */
+                   FriBidiStrIndex len = RL_LEN (pp), pos = RL_POS (pp);
+                   TypeLink *pp1 = pp->next;
+                   while (pp1->next && RL_LEVEL (pp1) >= level_idx)
+                     {
+                       len += RL_LEN (pp1);
+                       pp1 = pp1->next;
+                     }
+                   pp = pp1->prev;
+                   if (visual_str)
+                     bidi_string_reverse (visual_str + pos, len);
+                   if (position_V_to_L_list)
+                     index_array_reverse (position_V_to_L_list + pos, len);
+                 }
+             }
+         }
+       DBG ("  Reordering, Done\n");
+      }
+
+    /* Convert the v2l list to l2v */
+    if (position_L_to_V_list)
+      {
+       DBG ("  Converting v2l list to l2v\n");
+       for (i = 0; i < len; i++)
+         position_L_to_V_list[position_V_to_L_list[i]] = i;
+       DBG ("  Converting v2l list to l2v, Done\n");
+      }
+  }
+  DBG ("Reordering resolved levels, Done\n");
+
+  if (private_V_to_L)
+    fribidi_free (position_V_to_L_list);
+
+  free_rl_list (type_rl_list);
+
+  DBG ("Leaving fribidi_log2vis()\n");
+  return TRUE;
+
+}
+
+/*======================================================================
+ *  fribidi_log2vis_get_embedding_levels() is used in order to just get
+ *  the embedding levels.
+ *----------------------------------------------------------------------*/
+FRIBIDI_ENTRY fribidi_boolean
+fribidi_log2vis_get_embedding_levels (
+  /* input */
+  const FriBidiChar *str,
+  FriBidiStrIndex len,
+  /* input and output */
+  FriBidiCharType *pbase_dir,
+  /* output */
+  FriBidiLevel *embedding_level_list
+)
+{
+  TypeLink *type_rl_list, *pp;
+  FriBidiLevel max_level;
+
+  DBG ("Entering fribidi_log2vis_get_embedding_levels()\n");
+
+  if (len == 0)
+    {
+      DBG ("Leaving fribidi_log2vis_get_embedding_levels()\n");
+      return TRUE;
+    }
+
+  fribidi_analyse_string (str, len, pbase_dir,
+                         /* output */
+                         &type_rl_list, &max_level);
+
+  for (pp = type_rl_list->next; pp->next; pp = pp->next)
+    {
+      FriBidiStrIndex i, pos = RL_POS (pp), len = RL_LEN (pp);
+      FriBidiLevel level = RL_LEVEL (pp);
+      for (i = 0; i < len; i++)
+       embedding_level_list[pos + i] = level;
+    }
+
+  free_rl_list (type_rl_list);
+
+  DBG ("Leaving fribidi_log2vis_get_embedding_levels()\n");
+  return TRUE;
+}
+
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/lib/fribidi-bidi.h b/lib/fribidi-bidi.h
new file mode 100644 (file)
index 0000000..abbc59e
--- /dev/null
@@ -0,0 +1,112 @@
+/* FriBidi
+ * fribidi-bidi.h - bidirectional algorithm
+ *
+ * $Id: fribidi-bidi.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-bidi.h,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+#ifndef _FRIBIDI_BIDI_H
+#define _FRIBIDI_BIDI_H
+
+#include "fribidi-common.h"
+
+#include "fribidi-types.h"
+#include "fribidi-bidi-types.h"
+
+#include "fribidi-begindecls.h"
+
+#define fribidi_log2vis FRIBIDI_NAMESPACE(log2vis)
+/* fribidi_log2vis - get visual string
+ *
+ * This function converts the logical input string to the visual output
+ * strings as specified by the Unicode Bidirectional Algorithm.  As a side
+ * effect it also generates mapping lists between the two strings, and the
+ * list of embedding levels as defined by the algorithm.  If any of the the
+ * lists are passed as NULL, the list is ignored and not filled.
+ *
+ * Returns: Non-zero if it was successful, or zero if any error occured.
+ */
+FRIBIDI_ENTRY fribidi_boolean fribidi_log2vis (
+  const FriBidiChar *str,      /* input logical string */
+  FriBidiStrIndex len,         /* input string length */
+  FriBidiCharType *pbase_dir,  /* requested and resolved paragraph
+                                * base direction */
+  FriBidiChar *visual_str,     /* output visual string */
+  FriBidiStrIndex *position_L_to_V_list,       /* output mapping from logical to 
+                                                * visual string positions */
+  FriBidiStrIndex *position_V_to_L_list,       /* output mapping from visual string
+                                                * back to the logical string
+                                                * positions */
+  FriBidiLevel *embedding_level_list   /* output list of embedding levels */
+);
+
+#define fribidi_log2vis_get_embedding_levels FRIBIDI_NAMESPACE(log2vis_get_embedding_levels)
+/* fribidi_log2vis_get_embedding_levels - get bidi embedding levels
+ *
+ * This function finds the bidi embedding levels of a single paragraph,
+ * as defined by the Unicode Bidirectional Algorithm.
+ *
+ * Returns: Non-zero if it was successful, or zero if any error occured.
+ */
+FRIBIDI_ENTRY fribidi_boolean fribidi_log2vis_get_embedding_levels (
+  const FriBidiChar *str,      /* input logical string */
+  FriBidiStrIndex len,         /* input string length */
+  FriBidiCharType *pbase_dir,  /* requested and resolved paragraph
+                                * base direction */
+  FriBidiLevel *embedding_level_list   /* output list of embedding levels */
+);
+
+#define fribidi_remove_bidi_marks FRIBIDI_NAMESPACE(remove_bidi_marks)
+/* fribidi_remove_bidi_marks - remove bidi marks out an string
+ *
+ * This function removes the bidi marks out of an string and the
+ * accompanying lists.  If any of the input lists are NULL, the list is
+ * skipped.
+ *
+ * Bugs: It is not clear that if the input string is a logical, or visual
+ * string.  It is know to have problems handling position lists.  In short,
+ * it should be avoided.
+ *
+ * Returns: New length of the string.
+ */
+FRIBIDI_ENTRY FriBidiStrIndex fribidi_remove_bidi_marks (
+  FriBidiChar *str,
+  FriBidiStrIndex length,
+  FriBidiStrIndex *position_to_this_list,
+  FriBidiStrIndex *position_from_this_list,
+  FriBidiLevel *embedding_level_list
+);
+
+#include "fribidi-enddecls.h"
+
+#endif /* !_FRIBIDI_BIDI_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/lib/fribidi-common.h b/lib/fribidi-common.h
new file mode 100644 (file)
index 0000000..0a71af5
--- /dev/null
@@ -0,0 +1,83 @@
+/* FriBidi
+ * fribidi-common.h - common include for library headers
+ *
+ * $Id: fribidi-common.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-common.h,v $
+ *
+ * Author:
+ *   Behdad Esfahbod, 2004
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+#ifndef _FRIBIDI_COMMON_H
+#define _FRIBIDI_COMMON_H
+
+#if !DONT_HAVE_FRIBIDI_CONFIG_H
+# include "fribidi-config.h"
+#else /* DONT_HAVE_FRIBIDI_CONFIG_H */
+# define FRIBIDI "fribidi"
+# define FRIBIDI_NAME "fribidi"
+# define FRIBIDI_VERSION "unknown"
+# define FRIBIDI_INTERFACE_VERSION_STRING "unknown"
+#endif /* DONT_HAVE_FRIBIDI_CONFIG_H */
+
+#if HAVE_FRIBIDI_CUSTOM_H
+# include <fribidi-custom.h>
+#endif /* HAVE_FRIBIDI_CUSTOM_H */
+
+/* FRIBIDI_NAMESPACE is a macro used to name library symbols. */
+#ifndef FRIBIDI_NAMESPACE
+# define FRIBIDI_NAMESPACE(SYMBOL) fribidi_##SYMBOL
+#endif /* !FRIBIDI_NAMESPACE */
+
+/* FRIBIDI_ENTRY is a macro used to declare library entry points. */
+#ifndef FRIBIDI_ENTRY
+# ifdef WIN32
+#  define FRIBIDI_ENTRY __declspec(dllimport)
+# else /* !WIN32 */
+#  define FRIBIDI_ENTRY                /* empty */
+# endif        /* !WIN32 */
+#endif /* !FRIBIDI_ENTRY */
+
+/* FRIBIDI_BEGIN_DECLS should be used at the beginning of your declarations,
+ * so that C++ compilers don't mangle their names.  Use FRIBIDI_END_DECLS at
+ * the end of C declarations. */
+#ifndef FRIBIDI_BEGIN_DECLS
+# ifdef __cplusplus
+#  define FRIBIDI_BEGIN_DECLS extern "C" {
+#  define FRIBIDI_END_DECLS }
+# else /* !__cplusplus */
+#  define FRIBIDI_BEGIN_DECLS  /* empty */
+#  define FRIBIDI_END_DECLS    /* empty */
+# endif        /* !__cplusplus */
+#endif /* !FRIBIDI_BEGIN_DECLS */
+
+
+#define fribidi_version_info FRIBIDI_NAMESPACE(version_info)
+/* An string containing the version information of the library. */
+extern const char *fribidi_version_info;
+
+#endif /* !_FRIBIDI_COMMON_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/lib/fribidi-config.h.in b/lib/fribidi-config.h.in
new file mode 100644 (file)
index 0000000..2d98aaa
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef FRIBIDI_CONFIG_H
+#define FRIBIDI_CONFIG_H
+/* @configure_input@ */
+
+#define FRIBIDI "@PACKAGE@"
+#define FRIBIDI_NAME "@PACKAGE_NAME@"
+#define FRIBIDI_BUGREPORT "@PACKAGE_BUGREPORT@"
+
+#define FRIBIDI_VERSION "@FRIBIDI_VERSION@"
+#define FRIBIDI_MAJOR_VERSION @FRIBIDI_MAJOR_VERSION@
+#define FRIBIDI_MINOR_VERSION @FRIBIDI_MINOR_VERSION@
+#define FRIBIDI_MICRO_VERSION @FRIBIDI_MICRO_VERSION@
+#define FRIBIDI_INTERFACE_VERSION @FRIBIDI_INTERFACE_VERSION@
+#define FRIBIDI_INTERFACE_VERSION_STRING "@FRIBIDI_INTERFACE_VERSION@"
+
+/* Define to 1 if you want charset conversion codes in the library */
+#define FRIBIDI_CHARSETS @FRIBIDI_CHARSETS@
+
+/* Define to 1 if you want to use glib */
+#define FRIBIDI_USE_GLIB @FRIBIDI_USE_GLIB@
+
+#endif /* FRIBIDI_CONFIG_H */
diff --git a/lib/fribidi-enddecls.h b/lib/fribidi-enddecls.h
new file mode 100644 (file)
index 0000000..7c35e15
--- /dev/null
@@ -0,0 +1 @@
+FRIBIDI_END_DECLS
diff --git a/lib/fribidi-env.c b/lib/fribidi-env.c
new file mode 100644 (file)
index 0000000..0a98304
--- /dev/null
@@ -0,0 +1,107 @@
+/* FriBidi
+ * fribidi-mirroring.c - get mirrored character
+ *
+ * $Id: fribidi-env.c,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/Attic/fribidi-env.c,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#include <fribidi-env.h>
+
+#include "common.h"
+
+#if DEBUG
+static fribidi_boolean flag_debug = FALSE;
+#endif
+
+FRIBIDI_ENTRY fribidi_boolean
+fribidi_debug_status (
+  void
+)
+{
+#if DEBUG
+  return flag_debug;
+#else
+  return 0;
+#endif
+}
+
+FRIBIDI_ENTRY fribidi_boolean
+fribidi_set_debug (
+  fribidi_boolean state
+)
+{
+#if DEBUG
+  return flag_debug = state;
+#else
+  return 0;
+#endif
+}
+
+static fribidi_boolean flag_mirroring = TRUE;
+
+FRIBIDI_ENTRY fribidi_boolean
+fribidi_set_mirroring (
+  fribidi_boolean state
+)
+{
+  return flag_mirroring = state;
+}
+
+FRIBIDI_ENTRY fribidi_boolean
+fribidi_mirroring_status (
+  void
+)
+{
+  return flag_mirroring;
+}
+
+static fribidi_boolean flag_reorder_nsm = FALSE;
+
+FRIBIDI_ENTRY fribidi_boolean
+fribidi_set_reorder_nsm (
+  fribidi_boolean state
+)
+{
+  return flag_reorder_nsm = state;
+}
+
+fribidi_boolean
+fribidi_reorder_nsm_status (
+  void
+)
+{
+  return flag_reorder_nsm;
+}
+
+
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/lib/fribidi-env.h b/lib/fribidi-env.h
new file mode 100644 (file)
index 0000000..95722e3
--- /dev/null
@@ -0,0 +1,125 @@
+/* FriBidi
+ * fribidi-env.h - state manipulation routines
+ *
+ * $Id: fribidi-env.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/Attic/fribidi-env.h,v $
+ *
+ * Author:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+#ifndef _FRIBIDI_ENV_H
+#define _FRIBIDI_ENV_H
+
+#include "fribidi-common.h"
+
+#include "fribidi-types.h"
+
+#include "fribidi-begindecls.h"
+
+
+#define fribidi_debug_status FRIBIDI_NAMESPACE(debug_status)
+/* fribidi_debug_status - get current debugging output status */
+FRIBIDI_ENTRY fribidi_boolean fribidi_debug_status (
+  void
+);
+
+#define fribidi_set_debug FRIBIDI_NAMESPACE(set_debug)
+/* fribidi_set_debug - set debugging output on or off
+ *
+ * This function is used to turn debugging output on or off.  To
+ * turn it on, the library should have been compiled with debugging
+ * enabled, or it will fail.  The debugging output goes to the standard
+ * error output.
+ *
+ * This flag is off by default.
+ *
+ * Returns: the new debugging output status.
+ */
+FRIBIDI_ENTRY fribidi_boolean fribidi_set_debug (
+  fribidi_boolean state                /* new state to set */
+);
+
+
+#define fribidi_mirroring_status FRIBIDI_NAMESPACE(mirroring_status)
+/* fribidi_mirroring_status - get current mirroring status */
+FRIBIDI_ENTRY fribidi_boolean fribidi_mirroring_status (
+  void
+);
+
+#define fribidi_set_mirroring FRIBIDI_NAMESPACE(set_mirroring)
+/* fribidi_set_mirroring - set mirroring on or off
+ *
+ * This function is used to turn character mirroring on or off.
+ * Character mirroring is the act of replacing a mirrorable glyph
+ * (character), eg. left paranthesis, with the matching glyph, 
+ * eg. right paranthesis, in a right-to-left resolved context.
+ * If your rendering engine does mirroring itself, you may want to 
+ * turn it off here.
+ *
+ * This flag is on by default.
+ *
+ * Returns: the new mirroring status.
+ */
+FRIBIDI_ENTRY fribidi_boolean fribidi_set_mirroring (
+  fribidi_boolean state                /* new state to set */
+);
+
+
+#define fribidi_reorder_nsm_status FRIBIDI_NAMESPACE(reorder_nsm_status)
+/* fribidi_reorder_nsm_status - get current marks reordering status */
+FRIBIDI_ENTRY fribidi_boolean fribidi_reorder_nsm_status (
+  void
+);
+
+#define fribidi_set_reorder_nsm FRIBIDI_NAMESPACE(set_reorder_nsm)
+/* fribidi_set_reorder_nsm - set marks reordering on or off
+ *
+ * This function is used to turn non-spacing marks reordering on or
+ * off.  Reordering non-spacing marks is the act of placing non-spacing
+ * marks (bidi class NSM) after their base character in a right-to-left
+ * resolved context.  If your rendering engine expects non-spacing marks
+ * always after the base character in the memory representation of the
+ * visual string, you need this option on.  An example of where people
+ * may need it off is when rendering in the console when non-spacing
+ * marks cannot be applied on top of the base character.
+ *
+ * This flag is on by default.
+ *
+ * Returns: the new marks reordering status.
+ */
+FRIBIDI_ENTRY fribidi_boolean fribidi_set_reorder_nsm (
+  fribidi_boolean state                /* new state to set */
+);
+
+
+#include "fribidi-enddecls.h"
+
+#endif /* !_FRIBIDI_ENV_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/lib/fribidi-mem.c b/lib/fribidi-mem.c
new file mode 100644 (file)
index 0000000..49dd08b
--- /dev/null
@@ -0,0 +1,94 @@
+/* FriBidi
+ * mem.h - memory manipulation routines
+ *
+ * $Id: fribidi-mem.c,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-mem.c,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#include "mem.h"
+
+#include "common.h"
+
+#ifndef FRIBIDI_USE_GLIB
+
+struct _FriBidiMemChunk
+{
+  int atom_size;
+  int area_size;
+  int empty_size;
+  void *chunk;
+};
+
+FriBidiMemChunk *
+fribidi_mem_chunk_new (
+  /* input */
+  const char *name,
+  int atom_size,
+  unsigned long area_size,
+  int alloc_type
+)
+{
+  FriBidiMemChunk *m =
+    (FriBidiMemChunk *) fribidi_malloc (sizeof (FriBidiMemChunk));
+
+  m->atom_size = atom_size;
+  m->area_size = area_size;
+  m->empty_size = 0;
+  m->chunk = NULL;
+
+  return m;
+}
+
+void *
+fribidi_mem_chunk_alloc (
+  /* input */
+  FriBidiMemChunk *mem_chunk
+)
+{
+  void *m;
+
+  if (mem_chunk->empty_size < mem_chunk->atom_size)
+    {
+      mem_chunk->chunk = fribidi_malloc (mem_chunk->area_size);
+      mem_chunk->empty_size = mem_chunk->area_size;
+    }
+
+  m = mem_chunk->chunk;
+  mem_chunk->chunk = (void *)
+    ((char *) mem_chunk->chunk + mem_chunk->atom_size);
+  mem_chunk->empty_size -= mem_chunk->atom_size;
+
+  return m;
+}
+
+#endif /* !FRIBIDI_USE_GLIB */
+
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/lib/fribidi-mirroring.c b/lib/fribidi-mirroring.c
new file mode 100644 (file)
index 0000000..85df4db
--- /dev/null
@@ -0,0 +1,90 @@
+/* FriBidi
+ * fribidi-mirroring.c - get mirrored character
+ *
+ * $Id: fribidi-mirroring.c,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-mirroring.c,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#include <fribidi-mirroring.h>
+
+#include "mirroring-table.i"
+
+#include "common.h"
+
+FRIBIDI_ENTRY fribidi_boolean
+fribidi_get_mirror_char (
+  /* input */
+  FriBidiChar ch,
+  /* output */
+  FriBidiChar *mirrored_ch
+)
+{
+  int pos, step;
+  fribidi_boolean found;
+
+  pos = step = (nFriBidiMirroredChars / 2) + 1;
+
+  while (step > 1)
+    {
+      FriBidiChar cmp_ch = FriBidiMirroredChars[pos].ch;
+      step = (step + 1) / 2;
+
+      if (cmp_ch < ch)
+       {
+         pos += step;
+         if (pos > nFriBidiMirroredChars - 1)
+           pos = nFriBidiMirroredChars - 1;
+       }
+      else if (cmp_ch > ch)
+       {
+         pos -= step;
+         if (pos < 0)
+           pos = 0;
+       }
+      else
+       break;
+    }
+  found = FriBidiMirroredChars[pos].ch == ch;
+  if (mirrored_ch)
+    *mirrored_ch = found ? FriBidiMirroredChars[pos].mirrored_ch : ch;
+
+  return found;
+}
+
+/* Editor directions:
+ * Local Variables:
+ *   mode:c
+ *   c-basic-offset: 2
+ *   indent-tabs-mode:t
+ *   tab-width: 8
+ * End:
+ * vim: textwidth=78: autoindent: cindent: shiftwidth=2: tabstop=8
+ */
diff --git a/lib/fribidi-mirroring.h b/lib/fribidi-mirroring.h
new file mode 100644 (file)
index 0000000..51bde94
--- /dev/null
@@ -0,0 +1,67 @@
+/* FriBidi
+ * fribidi-mirroring.h - get mirrored character
+ *
+ * $Id: fribidi-mirroring.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-mirroring.h,v $
+ *
+ * Author:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+#ifndef _FRIBIDI_MIRRORING_H
+#define _FRIBIDI_MIRRORING_H
+
+#include "fribidi-common.h"
+
+#include "fribidi-types.h"
+
+#include "fribidi-begindecls.h"
+
+#define fribidi_get_mirror_char FRIBIDI_NAMESPACE(get_mirror_char)
+/* fribidi_get_mirror_char - get mirrored character
+ *
+ * This function finds the mirrored of a character.  If input character is a
+ * mirroring character, the matching mirrored character is put in the output,
+ * otherwise the input character itself is put.
+ *
+ * Returns: if the character has a mirror or not.
+ */
+FRIBIDI_ENTRY fribidi_boolean fribidi_get_mirror_char (
+  FriBidiChar ch,              /* input character */
+  FriBidiChar *mirrored_ch     /* output mirrored character */
+);
+
+#include "fribidi-enddecls.h"
+
+#endif /* !_FRIBIDI_MIRRORING_H */
+/* Editor directions:
+ * Local Variables:
+ *   mode:c
+ *   c-basic-offset: 2
+ *   indent-tabs-mode:t
+ *   tab-width: 8
+ * End:
+ * vim: textwidth=78: autoindent: cindent: shiftwidth=2: tabstop=8
+ */
diff --git a/lib/fribidi-types.h b/lib/fribidi-types.h
new file mode 100644 (file)
index 0000000..aad8320
--- /dev/null
@@ -0,0 +1,143 @@
+/* FriBidi
+ * fribidi-types.h - define data types for the rest of the library
+ *
+ * $Id: fribidi-types.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-types.h,v $
+ *
+ * Author:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc.
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ *
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+#ifndef _FRIBIDI_TYPES_H
+#define _FRIBIDI_TYPES_H
+
+#include "fribidi-common.h"
+
+#include "fribidi-begindecls.h"
+
+
+#if !FRIBIDI_USE_GLIB
+# if HAVE_INTTYPES_H
+#  if !__C2MAN__
+#   include <inttypes.h>
+#  endif /* !__C2MAN__ */
+#  define FRIBIDI_UINT8_LOCAL          uint8_t
+#  define FRIBIDI_UINT16_LOCAL         uint16_t
+#  define FRIBIDI_UINT32_LOCAL         uint32_t
+# else /* !HAVE_INTTYPES_H */
+#  if HAVE_STDINT_H
+#   if !__C2MAN__
+#    include <stdint.h>
+#   endif /* !__C2MAN__ */
+#   define FRIBIDI_UINT8_LOCAL         uint8_t
+#   define FRIBIDI_UINT16_LOCAL                uint16_t
+#   define FRIBIDI_UINT32_LOCAL                uint32_t
+#  else        /* !HAVE_STDINT_H */
+#   define FRIBIDI_UINT8_LOCAL         unsigned char
+#   if SIZEOF_SHORT >= 2
+#    define FRIBIDI_UINT16_LOCAL       unsigned short
+#   else /* SIZEOF_SHORT < 2 */
+#    define FRIBIDI_UINT16_LOCAL       unsigned int
+#   endif /* SIZEOF_SHORT < 2 */
+#   if SIZEOF_INT >= 4
+#    define FRIBIDI_UINT32_LOCAL       unsigned int
+#   else /* SIZEOF_INT < 4 */
+#    define FRIBIDI_UINT32_LOCAL       unsigned long
+#   endif /* SIZEOF_INT < 4 */
+#  endif /* !HAVE_STDINT_H */
+# endif        /* !HAVE_INTTYPES_H */
+# if HAVE_STDBOOL_H
+#  define FRIBIDI_BOOLEAN_LOCAL                bool
+# else /* !HAVE_STDBOOL_H */
+#  define FRIBIDI_BOOLEAN_LOCAL                int
+# endif        /* !HAVE_STDBOOL_H */
+# if SIZEOF_WCHAR_T >= 4
+#  if !__C2MAN__
+#   if STDC_HEADERS
+#    include <stdlib.h>
+#    include <stddef.h>
+#   else /* !STDC_HEADERS */
+#    if HAVE_STDLIB_H
+#     include <stdlib.h>
+#    endif /* !HAVE_STDLIB_H */
+#   endif /* !STDC_HEADERS */
+#  endif /* !__C2MAN__ */
+#  define FRIBIDI_UNICHAR_LOCAL                wchar_t
+# else /* SIZEOF_WCHAR_T < 4 */
+#  define FRIBIDI_UNICHAR_LOCAL                fribidi_uint32
+# endif        /* SIZEOF_WCHAR_T < 4 */
+#else /* FRIBIDI_USE_GLIB */
+#  if !__C2MAN__
+#   include <glib/gtypes.h>
+#   include <glib/gunicode.h>
+#  endif /* !__C2MAN__ */
+# define FRIBIDI_UINT8_LOCAL           guint8
+# define FRIBIDI_UINT16_LOCAL          guint16
+# define FRIBIDI_UINT32_LOCAL          guint32
+# define FRIBIDI_BOOLEAN_LOCAL         gboolean
+# define FRIBIDI_UNICHAR_LOCAL         gunichar
+#endif /* FRIBIDI_USE_GLIB */
+
+#ifndef FRIBIDI_UINT8
+# define FRIBIDI_UINT8 FRIBIDI_UINT8_LOCAL
+#endif /* !FRIBIDI_UINT8 */
+#ifndef FRIBIDI_UINT16
+# define FRIBIDI_UINT16        FRIBIDI_UINT16_LOCAL
+#endif /* !FRIBIDI_UINT16 */
+#ifndef FRIBIDI_UINT32
+# define FRIBIDI_UINT32        FRIBIDI_UINT32_LOCAL
+#endif /* !FRIBIDI_UINT32 */
+#ifndef FRIBIDI_BOOLEAN
+# define FRIBIDI_BOOLEAN       FRIBIDI_BOOLEAN_LOCAL
+#endif /* !FRIBIDI_BOOLEAN */
+#ifndef FRIBIDI_UNICHAR
+# define FRIBIDI_UNICHAR FRIBIDI_UNICHAR_LOCAL
+#endif /* !FRIBIDI_UNICHAR */
+#ifndef FRIBIDI_STR_INDEX
+# define FRIBIDI_STR_INDEX int
+#endif /* FRIBIDI_STR_INDEX */
+
+
+typedef FRIBIDI_UINT8 fribidi_uint8;
+typedef FRIBIDI_UINT16 fribidi_uint16;
+typedef FRIBIDI_UINT32 fribidi_uint32;
+typedef FRIBIDI_BOOLEAN fribidi_boolean;
+
+typedef FRIBIDI_UNICHAR FriBidiChar;
+typedef FRIBIDI_STR_INDEX FriBidiStrIndex;
+
+
+#ifndef FRIBIDI_MAX_STRING_LENGTH
+# define FRIBIDI_MAX_STRING_LENGTH (sizeof (FriBidiStrIndex) == 2 ?    \
+               0x7FFE : (sizeof (FriBidiStrIndex) == 1 ? \
+               0x7E : 0x8FFFFFFEL))
+#endif
+
+#include "fribidi-enddecls.h"
+
+#endif /* !_FRIBIDI_TYPES_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/lib/fribidi-unicode-version.h b/lib/fribidi-unicode-version.h
new file mode 100644 (file)
index 0000000..9e8ab1a
--- /dev/null
@@ -0,0 +1,4 @@
+#define FRIBIDI_UNICODE_VERSION "4.0.1"
+#define FRIBIDI_UNICODE_MAJOR_VERSION 4
+#define FRIBIDI_UNICODE_MINOR_VERSION 0
+#define FRIBIDI_UNICODE_MICRO_VERSION 1
diff --git a/lib/fribidi-unicode.h b/lib/fribidi-unicode.h
new file mode 100644 (file)
index 0000000..18156b9
--- /dev/null
@@ -0,0 +1,101 @@
+/* FriBidi
+ * fribidi-unicode.h - general Unicode definitions
+ *
+ * $Id: fribidi-unicode.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi-unicode.h,v $
+ *
+ * Author:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+#ifndef _FRIBIDI_UNICODE_H
+#define _FRIBIDI_UNICODE_H
+
+#include "fribidi-common.h"
+
+#include "fribidi-types.h"
+
+#include "fribidi-begindecls.h"
+
+/* We do not support surrogates yet */
+#define FRIBIDI_UNICODE_CHARS  (sizeof(FriBidiChar) >= 4 ? 0x110000 : 0xFFFE)
+/* Unicode version - FRIBIDI_UNICODE_VERSION */
+#if !DONT_HAVE_FRIBIDI_UNICODE_VERSION_H
+# include "fribidi-unicode-version.h"
+#else /* DONT_HAVE_FRIBIDI_UNICODE_VERSION_H */
+# define FRIBIDI_UNICODE_VERSION "unknown"
+#endif /* DONT_HAVE_FRIBIDI_UNICODE_VERSION_H */
+
+/* The maximum embedding level value assigned by explicit marks */
+#define FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL                61
+/* The maximum *number* of different resolved embedding levels: 0-62 */
+#define FRIBIDI_BIDI_MAX_RESOLVED_LEVELS       63
+
+/* Bidirectional marks */
+#define FRIBIDI_CHAR_LRM               0x200E
+#define FRIBIDI_CHAR_RLM               0x200F
+#define FRIBIDI_CHAR_LRE               0x202A
+#define FRIBIDI_CHAR_RLE               0x202B
+#define FRIBIDI_CHAR_PDF               0x202C
+#define FRIBIDI_CHAR_LRO               0x202D
+#define FRIBIDI_CHAR_RLO               0x202E
+
+/* Line and Paragraph Separators */
+#define FRIBIDI_CHAR_LS                        0x2028
+#define FRIBIDI_CHAR_PS                        0x2029
+
+/* Arabic Joining marks */
+#define FRIBIDI_CHAR_ZWNJ              0x200C
+#define FRIBIDI_CHAR_ZWJ               0x200D
+
+/* Hebrew and Arabic */
+#define FRIBIDI_CHAR_HEBREW_ALEF       0x05D0
+#define FRIBIDI_CHAR_ARABIC_ALEF       0x0627
+#define FRIBIDI_CHAR_ARABIC_ZERO       0x0660
+#define FRIBIDI_CHAR_PERSIAN_ZERO      0x06F0
+
+/* These are here just for compatibility. */
+#define UNI_MAX_BIDI_LEVEL     FRIBIDI_BIDI_MAX_EXPLICIT_LEVEL
+#define UNI_LRM                        FRIBIDI_CHAR_LRM
+#define UNI_RLM                        FRIBIDI_CHAR_RLM
+#define UNI_LRE                        FRIBIDI_CHAR_LRE
+#define UNI_RLE                        FRIBIDI_CHAR_RLE
+#define UNI_LRO                        FRIBIDI_CHAR_LRO
+#define UNI_RLO                        FRIBIDI_CHAR_RLO
+#define UNI_LS                 FRIBIDI_CHAR_LS
+#define UNI_PS                 FRIBIDI_CHAR_PS
+#define UNI_ZWNJ               FRIBIDI_CHAR_ZWNJ
+#define UNI_ZWJ                        FRIBIDI_CHAR_ZWJ
+#define UNI_HEBREW_ALEF                FRIBIDI_CHAR_HEBREW_ALEF
+#define UNI_ARABIC_ALEF                FRIBIDI_CHAR_ARABIC_ALEF
+#define UNI_ARABIC_ZERO                FRIBIDI_CHAR_ARABIC_ZERO
+#define UNI_FARSI_ZERO         FRIBIDI_CHAR_PERSIAN_ZERO
+
+#include "fribidi-enddecls.h"
+
+#endif /* !_FRIBIDI_UNICODE_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/lib/fribidi.c b/lib/fribidi.c
new file mode 100644 (file)
index 0000000..8197137
--- /dev/null
@@ -0,0 +1,68 @@
+/* FriBidi
+ * fribidi.c - Unicode bidirectional and Arabic joining algorithms
+ *
+ * $Id: fribidi.c,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi.c,v $
+ *
+ * Authors:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *   Dov Grobgeld, 1999, 2000
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * Copyright (C) 1999,2000 Dov Grobgeld
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+
+#include <fribidi.h>
+
+#include "common.h"
+
+const char *fribidi_version_info =
+  "(" FRIBIDI_NAME ") " FRIBIDI_VERSION "\n"
+  "Interface version " FRIBIDI_INTERFACE_VERSION_STRING ",\n"
+  "Unicode version " FRIBIDI_UNICODE_VERSION ",\n" "Configure options"
+#if DEBUG
+  " --enable-debug"
+#endif /* DEBUG */
+#if USE_SIMPLE_MALLOC
+  " --enable-malloc"
+#endif /* USE_SIMPLE_MALLOC */
+#if !FRIBIDI_CHARSETS
+  " --disable-charsets"
+#endif /* !FRIBIDI_CHARSETS */
+#if FRIBIDI_USE_GLIB
+  " --with-glib"
+#else /* !FRIBIDI_USE_GLIB */
+  " --without-glib"
+#endif /* !FRIBIDI_USE_GLIB */
+  ".\n\n"
+  "Copyright (C) 2004 Sharif FarsiWeb, Inc.\n"
+  FRIBIDI_NAME " comes with ABSOLUTELY NO WARRANTY.\n"
+  "You may redistribute copies of " FRIBIDI_NAME " under the terms of\n"
+  "the GNU Lesser General Public License.\n"
+  "For more information about these matters, see the file named COPYING.\n"
+  "Written by Behdad Esfahbod.\n";
+
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/lib/fribidi.h b/lib/fribidi.h
new file mode 100644 (file)
index 0000000..cbc3a23
--- /dev/null
@@ -0,0 +1,48 @@
+/* FriBidi
+ * fribidi.h - Unicode bidirectional and Arabic joining algorithms
+ *
+ * $Id: fribidi.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/fribidi.h,v $
+ *
+ * Author:
+ *   Behdad Esfahbod, 2004
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+#ifndef _FRIBIDI_H
+#define _FRIBIDI_H
+
+#include "fribidi-bidi.h"
+#include "fribidi-bidi-type.h"
+#include "fribidi-env.h"
+#include "fribidi-mirroring.h"
+#include "fribidi-types.h"
+#include "fribidi-unicode.h"
+#if FRIBIDI_CHARSETS
+# include "fribidi-char-sets.h"
+#endif /* FRIBIDI_CHARSETS */
+
+#endif /* !_FRIBIDI_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/lib/mem.h b/lib/mem.h
new file mode 100644 (file)
index 0000000..80a5a2d
--- /dev/null
+++ b/lib/mem.h
@@ -0,0 +1,90 @@
+/* FriBidi
+ * mem.h - memory manipulation routines
+ *
+ * $Id: mem.h,v 1.1 2004-04-25 18:47:57 behdad Exp $
+ * $Author: behdad $
+ * $Date: 2004-04-25 18:47:57 $
+ * $Revision: 1.1 $
+ * $Source: /home/behdad/src/fdo/fribidi/togit/git/../fribidi/fribidi2/lib/mem.h,v $
+ *
+ * Author:
+ *   Behdad Esfahbod, 2001, 2002, 2004
+ *
+ * Copyright (C) 2004 Sharif FarsiWeb, Inc
+ * Copyright (C) 2001,2002 Behdad Esfahbod
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library, in a file named COPYING; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307, USA
+ * 
+ * For licensing issues, contact <license@farsiweb.info>.
+ */
+#ifndef _MEM_H
+#define _MEM_H
+
+#include <fribidi-common.h>
+
+#include <fribidi-types.h>
+
+#include "common.h"
+
+#include <fribidi-begindecls.h>
+
+#if !FRIBIDI_USE_GLIB
+
+typedef struct _FriBidiMemChunk FriBidiMemChunk;
+
+#define FRIBIDI_ALLOC_ONLY      1
+
+#define fribidi_mem_chunk_new FRIBIDI_NAMESPACE(mem_chunk_new)
+FriBidiMemChunk *fribidi_mem_chunk_new (
+  const char *name,
+  int atom_size,
+  unsigned long area_size,
+  int alloc_type
+);
+
+#define fribidi_mem_chunk_alloc FRIBIDI_NAMESPACE(mem_chunk_alloc)
+void *fribidi_mem_chunk_alloc (
+  FriBidiMemChunk *mem_chunk
+);
+
+#else /* FRIBIDI_USE_GLIB */
+
+#if !__C2MAN__
+# include <glib/gmem.h>
+#endif /* !__C2MAN__ */
+
+#define FriBidiMemChunk GMemChunk
+#define FRIBIDI_ALLOC_ONLY G_ALLOC_ONLY
+#define fribidi_mem_chunk_new g_mem_chunk_new
+#define fribidi_mem_chunk_alloc g_mem_chunk_alloc
+
+#endif /* FRIBIDI_USE_GLIB */
+
+#define fribidi_chunk_new(type, chunk)        ( \
+               (type *) fribidi_mem_chunk_alloc (chunk) \
+       )
+
+#define fribidi_chunk_new_for_type(type) ( \
+               fribidi_mem_chunk_new(FRIBIDI, sizeof (type), \
+                               FRIBIDI_CHUNK_SIZE, FRIBIDI_ALLOC_ONLY) \
+       )
+
+#include <fribidi-enddecls.h>
+
+#endif /* !_MEM_H */
+/* Editor directions:
+ * vim:textwidth=78:tabstop=8:shiftwidth=2:autoindent:cindent
+ */
diff --git a/lib/mirroring-table.i b/lib/mirroring-table.i
new file mode 100644 (file)
index 0000000..6e47900
--- /dev/null
@@ -0,0 +1,358 @@
+/*
+  This file was automatically created from BidiMirroring.txt, version 3.2.0
+  by fribidi_create_mirroring
+*/
+
+#ifndef FRIBIDI_TAB_MIRRORING_I
+#define FRIBIDI_TAB_MIRRORING_I
+
+#include <fribidi-types.h>
+
+/*
+  Mirrored characters include all the characters in the Unicode list
+  that have been declared as being mirrored and that have a mirrored
+  equivalent.
+
+  There are lots of characters that are designed as being mirrored
+  but do not have any mirrored glyph, e.g. the sign for there exist.
+  Are these used in Arabic? That is are all the mathematical signs
+  that are assigned to be mirrorable actually mirrored in Arabic?
+  If that is the case, we'll change the below code to include also
+  characters that mirror to themself. It will then be the responsibility
+  of the display engine to actually mirror these.
+*/
+
+/* *INDENT-OFF* */
+
+static const struct
+{
+  FriBidiChar ch, mirrored_ch;
+}
+FriBidiMirroredChars[] =
+{
+  {0x0028, 0x0029},
+  {0x0029, 0x0028},
+  {0x003C, 0x003E},
+  {0x003E, 0x003C},
+  {0x005B, 0x005D},
+  {0x005D, 0x005B},
+  {0x007B, 0x007D},
+  {0x007D, 0x007B},
+  {0x00AB, 0x00BB},
+  {0x00BB, 0x00AB},
+  {0x2039, 0x203A},
+  {0x203A, 0x2039},
+  {0x2045, 0x2046},
+  {0x2046, 0x2045},
+  {0x207D, 0x207E},
+  {0x207E, 0x207D},
+  {0x208D, 0x208E},
+  {0x208E, 0x208D},
+  {0x2208, 0x220B},
+  {0x2209, 0x220C},
+  {0x220A, 0x220D},
+  {0x220B, 0x2208},
+  {0x220C, 0x2209},
+  {0x220D, 0x220A},
+  {0x2215, 0x29F5},
+  {0x223C, 0x223D},
+  {0x223D, 0x223C},
+  {0x2243, 0x22CD},
+  {0x2252, 0x2253},
+  {0x2253, 0x2252},
+  {0x2254, 0x2255},
+  {0x2255, 0x2254},
+  {0x2264, 0x2265},
+  {0x2265, 0x2264},
+  {0x2266, 0x2267},
+  {0x2267, 0x2266},
+  {0x2268, 0x2269},
+  {0x2269, 0x2268},
+  {0x226A, 0x226B},
+  {0x226B, 0x226A},
+  {0x226E, 0x226F},
+  {0x226F, 0x226E},
+  {0x2270, 0x2271},
+  {0x2271, 0x2270},
+  {0x2272, 0x2273},
+  {0x2273, 0x2272},
+  {0x2274, 0x2275},
+  {0x2275, 0x2274},
+  {0x2276, 0x2277},
+  {0x2277, 0x2276},
+  {0x2278, 0x2279},
+  {0x2279, 0x2278},
+  {0x227A, 0x227B},
+  {0x227B, 0x227A},
+  {0x227C, 0x227D},
+  {0x227D, 0x227C},
+  {0x227E, 0x227F},
+  {0x227F, 0x227E},
+  {0x2280, 0x2281},
+  {0x2281, 0x2280},
+  {0x2282, 0x2283},
+  {0x2283, 0x2282},
+  {0x2284, 0x2285},
+  {0x2285, 0x2284},
+  {0x2286, 0x2287},
+  {0x2287, 0x2286},
+  {0x2288, 0x2289},
+  {0x2289, 0x2288},
+  {0x228A, 0x228B},
+  {0x228B, 0x228A},
+  {0x228F, 0x2290},
+  {0x2290, 0x228F},
+  {0x2291, 0x2292},
+  {0x2292, 0x2291},
+  {0x2298, 0x29B8},
+  {0x22A2, 0x22A3},
+  {0x22A3, 0x22A2},
+  {0x22A6, 0x2ADE},
+  {0x22A8, 0x2AE4},
+  {0x22A9, 0x2AE3},
+  {0x22AB, 0x2AE5},
+  {0x22B0, 0x22B1},
+  {0x22B1, 0x22B0},
+  {0x22B2, 0x22B3},
+  {0x22B3, 0x22B2},
+  {0x22B4, 0x22B5},
+  {0x22B5, 0x22B4},
+  {0x22B6, 0x22B7},
+  {0x22B7, 0x22B6},
+  {0x22C9, 0x22CA},
+  {0x22CA, 0x22C9},
+  {0x22CB, 0x22CC},
+  {0x22CC, 0x22CB},
+  {0x22CD, 0x2243},
+  {0x22D0, 0x22D1},
+  {0x22D1, 0x22D0},
+  {0x22D6, 0x22D7},
+  {0x22D7, 0x22D6},
+  {0x22D8, 0x22D9},
+  {0x22D9, 0x22D8},
+  {0x22DA, 0x22DB},
+  {0x22DB, 0x22DA},
+  {0x22DC, 0x22DD},
+  {0x22DD, 0x22DC},
+  {0x22DE, 0x22DF},
+  {0x22DF, 0x22DE},
+  {0x22E0, 0x22E1},
+  {0x22E1, 0x22E0},
+  {0x22E2, 0x22E3},
+  {0x22E3, 0x22E2},
+  {0x22E4, 0x22E5},
+  {0x22E5, 0x22E4},
+  {0x22E6, 0x22E7},
+  {0x22E7, 0x22E6},
+  {0x22E8, 0x22E9},
+  {0x22E9, 0x22E8},
+  {0x22EA, 0x22EB},
+  {0x22EB, 0x22EA},
+  {0x22EC, 0x22ED},
+  {0x22ED, 0x22EC},
+  {0x22F0, 0x22F1},
+  {0x22F1, 0x22F0},
+  {0x22F2, 0x22FA},
+  {0x22F3, 0x22FB},
+  {0x22F4, 0x22FC},
+  {0x22F6, 0x22FD},
+  {0x22F7, 0x22FE},
+  {0x22FA, 0x22F2},
+  {0x22FB, 0x22F3},
+  {0x22FC, 0x22F4},
+  {0x22FD, 0x22F6},
+  {0x22FE, 0x22F7},
+  {0x2308, 0x2309},
+  {0x2309, 0x2308},
+  {0x230A, 0x230B},
+  {0x230B, 0x230A},
+  {0x2329, 0x232A},
+  {0x232A, 0x2329},
+  {0x2768, 0x2769},
+  {0x2769, 0x2768},
+  {0x276A, 0x276B},
+  {0x276B, 0x276A},
+  {0x276C, 0x276D},
+  {0x276D, 0x276C},
+  {0x276E, 0x276F},
+  {0x276F, 0x276E},
+  {0x2770, 0x2771},
+  {0x2771, 0x2770},
+  {0x2772, 0x2773},
+  {0x2773, 0x2772},
+  {0x2774, 0x2775},
+  {0x2775, 0x2774},
+  {0x27D5, 0x27D6},
+  {0x27D6, 0x27D5},
+  {0x27DD, 0x27DE},
+  {0x27DE, 0x27DD},
+  {0x27E2, 0x27E3},
+  {0x27E3, 0x27E2},
+  {0x27E4, 0x27E5},
+  {0x27E5, 0x27E4},
+  {0x27E6, 0x27E7},
+  {0x27E7, 0x27E6},
+  {0x27E8, 0x27E9},
+  {0x27E9, 0x27E8},
+  {0x27EA, 0x27EB},
+  {0x27EB, 0x27EA},
+  {0x2983, 0x2984},
+  {0x2984, 0x2983},
+  {0x2985, 0x2986},
+  {0x2986, 0x2985},
+  {0x2987, 0x2988},
+  {0x2988, 0x2987},
+  {0x2989, 0x298A},
+  {0x298A, 0x2989},
+  {0x298B, 0x298C},
+  {0x298C, 0x298B},
+  {0x298D, 0x2990},
+  {0x298E, 0x298F},
+  {0x298F, 0x298E},
+  {0x2990, 0x298D},
+  {0x2991, 0x2992},
+  {0x2992, 0x2991},
+  {0x2993, 0x2994},
+  {0x2994, 0x2993},
+  {0x2995, 0x2996},
+  {0x2996, 0x2995},
+  {0x2997, 0x2998},
+  {0x2998, 0x2997},
+  {0x29B8, 0x2298},
+  {0x29C0, 0x29C1},
+  {0x29C1, 0x29C0},
+  {0x29C4, 0x29C5},
+  {0x29C5, 0x29C4},
+  {0x29CF, 0x29D0},
+  {0x29D0, 0x29CF},
+  {0x29D1, 0x29D2},
+  {0x29D2, 0x29D1},
+  {0x29D4, 0x29D5},
+  {0x29D5, 0x29D4},
+  {0x29D8, 0x29D9},
+  {0x29D9, 0x29D8},
+  {0x29DA, 0x29DB},
+  {0x29DB, 0x29DA},
+  {0x29F5, 0x2215},
+  {0x29F8, 0x29F9},
+  {0x29F9, 0x29F8},
+  {0x29FC, 0x29FD},
+  {0x29FD, 0x29FC},
+  {0x2A2B, 0x2A2C},
+  {0x2A2C, 0x2A2D},
+  {0x2A2D, 0x2A2E},
+  {0x2A2E, 0x2A2D},
+  {0x2A34, 0x2A35},
+  {0x2A35, 0x2A34},
+  {0x2A3C, 0x2A3D},
+  {0x2A3D, 0x2A3C},
+  {0x2A64, 0x2A65},
+  {0x2A65, 0x2A64},
+  {0x2A79, 0x2A7A},
+  {0x2A7A, 0x2A79},
+  {0x2A7D, 0x2A7E},
+  {0x2A7E, 0x2A7D},
+  {0x2A7F, 0x2A80},
+  {0x2A80, 0x2A7F},
+  {0x2A81, 0x2A82},
+  {0x2A82, 0x2A81},
+  {0x2A83, 0x2A84},
+  {0x2A84, 0x2A83},
+  {0x2A8B, 0x2A8C},
+  {0x2A8C, 0x2A8B},
+  {0x2A91, 0x2A92},
+  {0x2A92, 0x2A91},
+  {0x2A93, 0x2A94},
+  {0x2A94, 0x2A93},
+  {0x2A95, 0x2A96},
+  {0x2A96, 0x2A95},
+  {0x2A97, 0x2A98},
+  {0x2A98, 0x2A97},
+  {0x2A99, 0x2A9A},
+  {0x2A9A, 0x2A99},
+  {0x2A9B, 0x2A9C},
+  {0x2A9C, 0x2A9B},
+  {0x2AA1, 0x2AA2},
+  {0x2AA2, 0x2AA1},
+  {0x2AA6, 0x2AA7},
+  {0x2AA7, 0x2AA6},
+  {0x2AA8, 0x2AA9},
+  {0x2AA9, 0x2AA8},
+  {0x2AAA, 0x2AAB},
+  {0x2AAB, 0x2AAA},
+  {0x2AAC, 0x2AAD},
+  {0x2AAD, 0x2AAC},
+  {0x2AAF, 0x2AB0},
+  {0x2AB0, 0x2AAF},
+  {0x2AB3, 0x2AB4},
+  {0x2AB4, 0x2AB3},
+  {0x2ABB, 0x2ABC},
+  {0x2ABC, 0x2ABB},
+  {0x2ABD, 0x2ABE},
+  {0x2ABE, 0x2ABD},
+  {0x2ABF, 0x2AC0},
+  {0x2AC0, 0x2ABF},
+  {0x2AC1, 0x2AC2},
+  {0x2AC2, 0x2AC1},
+  {0x2AC3, 0x2AC4},
+  {0x2AC4, 0x2AC3},
+  {0x2AC5, 0x2AC6},
+  {0x2AC6, 0x2AC5},
+  {0x2ACD, 0x2ACE},
+  {0x2ACE, 0x2ACD},
+  {0x2ACF, 0x2AD0},
+  {0x2AD0, 0x2ACF},
+  {0x2AD1, 0x2AD2},
+  {0x2AD2, 0x2AD1},
+  {0x2AD3, 0x2AD4},
+  {0x2AD4, 0x2AD3},
+  {0x2AD5, 0x2AD6},
+  {0x2AD6, 0x2AD5},
+  {0x2ADE, 0x22A6},
+  {0x2AE3, 0x22A9},
+  {0x2AE4, 0x22A8},
+  {0x2AE5, 0x22AB},
+  {0x2AEC, 0x2AED},
+  {0x2AED, 0x2AEC},
+  {0x2AF7, 0x2AF8},
+  {0x2AF8, 0x2AF7},
+  {0x2AF9, 0x2AFA},
+  {0x2AFA, 0x2AF9},
+  {0x3008, 0x3009},
+  {0x3009, 0x3008},
+  {0x300A, 0x300B},
+  {0x300B, 0x300A},
+  {0x300C, 0x300D},
+  {0x300D, 0x300C},
+  {0x300E, 0x300F},
+  {0x300F, 0x300E},
+  {0x3010, 0x3011},
+  {0x3011, 0x3010},
+  {0x3014, 0x3015},
+  {0x3015, 0x3014},
+  {0x3016, 0x3017},
+  {0x3017, 0x3016},
+  {0x3018, 0x3019},
+  {0x3019, 0x3018},
+  {0x301A, 0x301B},
+  {0x301B, 0x301A},
+  {0xFF08, 0xFF09},
+  {0xFF09, 0xFF08},
+  {0xFF1C, 0xFF1E},
+  {0xFF1E, 0xFF1C},
+  {0xFF3B, 0xFF3D},
+  {0xFF3D, 0xFF3B},
+  {0xFF5B, 0xFF5D},
+  {0xFF5D, 0xFF5B},
+  {0xFF5F, 0xFF60},
+  {0xFF60, 0xFF5F},
+  {0xFF62, 0xFF63},
+  {0xFF63, 0xFF62},
+} ;
+
+/* *INDENT-ON* */
+
+static const int nFriBidiMirroredChars = 318;
+
+
+#endif /* FRIBIDI_TAB_MIRRORING_I */
diff --git a/test/Makefile.am b/test/Makefile.am
new file mode 100644 (file)
index 0000000..565a5b2
--- /dev/null
@@ -0,0 +1,33 @@
+
+TESTS = run.tests
+
+check_SCRIPTS = run.tests
+
+TEST_DATAS = \
+       test_CapRTL_explicit.input      \
+       test_CapRTL_explicit.reference  \
+       test_CapRTL_implicit.input      \
+       test_CapRTL_implicit.reference  \
+       test_ISO8859-8_hebrew.input     \
+       test_ISO8859-8_hebrew.reference \
+       test_UTF-8_persian.input        \
+       test_UTF-8_persian.reference
+
+EXTRA_DIST =   \
+       $(TESTS) \
+       $(TEST_DATAS)
+
+test_%.reference: test_%.input
+       testcase="$@" &&        \
+       charset="`echo "$@" | $(SED) 's/_[^_]*$$//;s/.*_//'`" &&        \
+       "$(top_builddir)"/src/fribidi --test --charset "$$charset" "$<" > "$@" || \
+       ($(RM) "$@"; false)
+
+test.reference:
+       for testcase in "$(srcdir)"/test_*.input; do    \
+               test="`echo "$$testcase"        \
+                 | $(SED) 's/\.input$$/.reference/i; s|.*/||;'`" &&    \
+               $(MAKE) "tests/$$test" ||       \
+               exit 1; \
+       done
+
diff --git a/test/run.tests b/test/run.tests
new file mode 100755 (executable)
index 0000000..c8bd759
--- /dev/null
@@ -0,0 +1,74 @@
+#!/bin/bash
+# run.tests - Check that the algorithm does what it is supposed to
+# Copyright (C) 1999,2000 Dov Grobgeld, and
+# Copyright (C) 2001,2002 Behdad Esfahbod.
+# 
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public  
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library is distributed in the hope that it will be useful,  
+# but WITHOUT ANY WARRANTY; without even the implied warranty of   
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public License  
+# along with this library, in a file named COPYING; if not, write to the
+# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+# Boston, MA 02111-1307, USA
+# 
+# For licensing issues, contact <dov@imagic.weizmann.ac.il> and
+# <fwpg@sharif.edu>.
+
+if test -z "$top_builddir"; then
+  top_builddir=..
+fi
+
+if test -z "$srcdir"; then
+  srcdir=.
+fi
+
+test "${VERBOSE+set}" != "set" && VERBOSE=yes
+
+# See how redirections should work.
+if test -z "$VERBOSE"; then
+   exec > /dev/null 2>&1
+fi
+
+if ! test -f "$top_builddir/bin/fribidi"; then
+  echo "run.tests: you must make fribidi first"
+  exit 1
+fi
+
+TEST () {
+  testcase="$1"
+  test="${testcase##*/}"
+  test="${test%.input}"
+  charset="${testcase#*_}"
+  charset="${charset%%_*}"
+  echo -n "=== $test === "
+  if ! "$top_builddir/bin/fribidi" --charset "$charset" </dev/null >/dev/null 2>&1; then
+    echo " [Character set not supported]"
+    return 0
+  fi
+  "$top_builddir/bin/fribidi" --test --charset "$charset" "$testcase" > "$test.output"
+
+  reference="${testcase%.input}.reference";
+  test -f "$reference" || reference="tests/${reference##*/}"
+  if diff -U 0 "$test.output" "$reference"; then
+    rm "$test.output"
+    echo " [Passed]"
+    return 0
+  else
+    echo " [Failed]"
+    return 1
+  fi
+}
+
+retval=0
+for testcase in "$srcdir"/test_*.input; do
+  TEST "$testcase" || retval=1
+done
+
+exit $retval
diff --git a/test/test_CapRTL_explicit.input b/test/test_CapRTL_explicit.input
new file mode 100644 (file)
index 0000000..1cbfac2
--- /dev/null
@@ -0,0 +1,13 @@
+this is _LJUST_o
+a _lsimple _RteST_o th_oat
+HAS A _LPDF missing
+AnD hOw_L AbOuT, 123,987 tHiS_o
+a GOOD - _L_oTEST.
+here_L is_o_o_o _R a good one_o
+And _r 123,987_LTHE_R next_o oNE:
+_R_r and the last _LONE_o IS 
+THE _rbest _lONE and
+A REAL BIG_l_o BUG!
+a _L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_Rbug
+AN ARABIC _l_o 123-456 NICE ONE!
+AN ARABIC _l _o 123-456 PAIR
diff --git a/test/test_CapRTL_explicit.reference b/test/test_CapRTL_explicit.reference
new file mode 100644 (file)
index 0000000..37fb904
--- /dev/null
@@ -0,0 +1,13 @@
+this is _LJUST_o                    => this is JUST
+a _lsimple _RteST_o th_oat          => a simple TSet that
+HAS A _LPDF missing                 =>                   PDF missing A SAH
+AnD hOw_L AbOuT, 123,987 tHiS_o     =>         w AbOuT, 123,987 tHiSOh DnA
+a GOOD - _L_oTEST.                  => a TSET - DOOG.
+here_L is_o_o_o _R a good one_o     => here is eno doog a 
+And _r 123,987_LTHE_R next_o oNE:   =>           987THEtxen  oNE:,123  ndA
+_R_r and the last _LONE_o IS        => SI and the last ONE  
+THE _rbest _lONE and                =>                    best ENO and EHT
+A REAL BIG_l_o BUG!                 =>                     !GUB GIB LAER A
+a _L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_L_Rbug => a gub
+AN ARABIC _l_o 123-456 NICE ONE!    =>        !ENO ECIN 456-123  CIBARA NA
+AN ARABIC _l _o 123-456 PAIR        =>            RIAP   123-456 CIBARA NA
diff --git a/test/test_CapRTL_implicit.input b/test/test_CapRTL_implicit.input
new file mode 100644 (file)
index 0000000..cd5fadf
--- /dev/null
@@ -0,0 +1,26 @@
+car is THE CAR in arabic
+CAR IS the car IN ENGLISH
+he said "IT IS 123, 456, OK"
+he said "IT IS (123, 456), OK"
+he said "IT IS 123,456, OK"
+he said "IT IS (123,456), OK"
+HE SAID "it is 123, 456, ok"
+he said "IT IS 789, 678, OK"
+he said "IT IS (789, 678), OK"
+he said "IT IS 789,678, OK"
+he said "IT IS (789,678), OK"
+HE SAID "it is 789, 678, ok"
+<H123>shalom</H123>
+<h123>SALAAM</h123>
+HE SAID "it is a car!" AND RAN
+HE SAID "it is a car!_>" AND RAN
+-2 CELSIUS IS COLD
+SOLVE 1*5 1-5 1/5 1+5
+THE RANGE IS 2.5..5
+IOU $10
+CHANGE -10%
+-10% CHANGE
+A TEST FOR WEAK TYPES: 123+,456
+ANOTHER FOR WEAK TYPES: A123,456
+MORE WEAK TYPES: hooloo123,456
+and TEST|L1 ||too
diff --git a/test/test_CapRTL_implicit.reference b/test/test_CapRTL_implicit.reference
new file mode 100644 (file)
index 0000000..6ef244a
--- /dev/null
@@ -0,0 +1,26 @@
+car is THE CAR in arabic            => car is RAC EHT in arabic
+CAR IS the car IN ENGLISH           =>           HSILGNE NI the car SI RAC
+he said "IT IS 123, 456, OK"        => he said "KO ,456 ,123 SI TI"
+he said "IT IS (123, 456), OK"      => he said "KO ,(456 ,123) SI TI"
+he said "IT IS 123,456, OK"         => he said "KO ,123,456 SI TI"
+he said "IT IS (123,456), OK"       => he said "KO ,(123,456) SI TI"
+HE SAID "it is 123, 456, ok"        =>        "ok ,it is 123, 456" DIAS EH
+he said "IT IS 789, 678, OK"        => he said "KO ,678 ,789 SI TI"
+he said "IT IS (789, 678), OK"      => he said "KO ,(678 ,789) SI TI"
+he said "IT IS 789,678, OK"         => he said "KO ,789,678 SI TI"
+he said "IT IS (789,678), OK"       => he said "KO ,(789,678) SI TI"
+HE SAID "it is 789, 678, ok"        =>        "ok ,678 ,789 it is" DIAS EH
+<H123>shalom</H123>                 =>                 <123H/>shalom<123H>
+<h123>SALAAM</h123>                 => <h123>MAALAS</h123>
+HE SAID "it is a car!" AND RAN      =>      NAR DNA "!it is a car" DIAS EH
+HE SAID "it is a car!_>" AND RAN    =>      NAR DNA "it is a car!" DIAS EH
+-2 CELSIUS IS COLD                  =>                  DLOC SI SUISLEC 2-
+SOLVE 1*5 1-5 1/5 1+5               =>               5+1 5/1 5-1 5*1 EVLOS
+THE RANGE IS 2.5..5                 =>                 5..2.5 SI EGNAR EHT
+IOU $10                             =>                             $10 UOI
+CHANGE -10%                         =>                         %10- EGNAHC
+-10% CHANGE                         =>                         EGNAHC %10-
+A TEST FOR WEAK TYPES: 123+,456     =>     456,123+ :SEPYT KAEW ROF TSET A
+ANOTHER FOR WEAK TYPES: A123,456    =>    123,456A :SEPYT KAEW ROF REHTONA
+MORE WEAK TYPES: hooloo123,456      =>      hooloo123,456 :SEPYT KAEW EROM
+and TEST|L1 ||too                   => and TSET|1L ||too
diff --git a/test/test_ISO8859-8_hebrew.input b/test/test_ISO8859-8_hebrew.input
new file mode 100644 (file)
index 0000000..b93617a
--- /dev/null
@@ -0,0 +1,17 @@
+ùìåí abc
+abc ùìåí
+abc ùìåí cde
+he said: "æä ìà ðëåï!"
+he said: "æä ìà ðëåï!þ"
+(ùìåí) abc
+abc (ùìåí)
+  #@$ ùìåí
+<h1>ùìåí</h1>
+ùìåí 23 ùìåí abc
+ùìåí ~~~23%%%  ùìåí abc
+ùìåí abc ~~~23%%%  ùìåí abc
+ùìåí abc@23@cde ùìåí
+ùìåí abc 23 cde ùìåí
+ùìåí abc 23 ùìåí abc
+<ùìåí>Shalom</ùìåí>
+ùa 2 ù
diff --git a/test/test_ISO8859-8_hebrew.reference b/test/test_ISO8859-8_hebrew.reference
new file mode 100644 (file)
index 0000000..0579b87
--- /dev/null
@@ -0,0 +1,17 @@
+ùìåí abc                            =>                            abc íåìù
+abc ùìåí                            => abc íåìù
+abc ùìåí cde                        => abc íåìù cde
+he said: "æä ìà ðëåï!"              => he said: "ïåëð àì äæ!"
+he said: "æä ìà ðëåï!þ"             => he said: "!ïåëð àì äæ"
+(ùìåí) abc                          =>                          abc (íåìù)
+abc (ùìåí)                          => abc (íåìù)
+  #@$ ùìåí                          =>                          íåìù $@#  
+<h1>ùìåí</h1>                       => <h1>íåìù</h1>
+ùìåí 23 ùìåí abc                    =>                    abc íåìù 23 íåìù
+ùìåí ~~~23%%%  ùìåí abc             =>             abc íåìù  23%%%~~~ íåìù
+ùìåí abc ~~~23%%%  ùìåí abc         =>         abc íåìù  abc ~~~23%%% íåìù
+ùìåí abc@23@cde ùìåí                =>                íåìù abc@23@cde íåìù
+ùìåí abc 23 cde ùìåí                =>                íåìù abc 23 cde íåìù
+ùìåí abc 23 ùìåí abc                =>                abc íåìù abc 23 íåìù
+<ùìåí>Shalom</ùìåí>                 =>                 <íåìù/>Shalom<íåìù>
+ùa 2 ù                              =>                              ù a 2ù
diff --git a/test/test_UTF-8_persian.input b/test/test_UTF-8_persian.input
new file mode 100644 (file)
index 0000000..194126c
--- /dev/null
@@ -0,0 +1,14 @@
+الا يا ايها الساقی ادر کاسا و ناولها
+که عشق آسان نمود اول ولی افتاد مشکل‌ها
+به بوی نافه‌ای کاخر صبا زان طره بگشايد
+ز تاب جعد مشکينش چه خون افتاد در دل‌ها
+مرا در منزل جانان چه امن عيش چون هر دم
+جرس فرياد می‌دارد که بربنديد محمل‌ها
+به می سجاده رنگين کن گرت پير مغان گويد
+که سالک بی‌خبر نبود ز راه و رسم منزل‌ها
+شب تاريک و بيم موج و گردابی چنين هايل
+کجا دانند حال ما سبکباران ساحل‌ها
+همه کارم ز خود کامی به بدنامی کشيد آخر
+نهان کی ماند آن رازی کز او سازند محفل‌ها
+حضوری گر همی‌خواهی از او غايب مشو حافظ
+متی ما تلق من تهوی دع الدنيا و اهملها
diff --git a/test/test_UTF-8_persian.reference b/test/test_UTF-8_persian.reference
new file mode 100644 (file)
index 0000000..cd45ac2
--- /dev/null
@@ -0,0 +1,14 @@
+الا يا ايها الساقی ادر کاسا و ناولها => اهلوان و اساک ردا یقاسلا اهيا اي الا
+که عشق آسان نمود اول ولی افتاد مشکل‌ها => اه‌لکشم داتفا یلو لوا دومن ناسآ قشع هک
+به بوی نافه‌ای کاخر صبا زان طره بگشايد => دياشگب هرط ناز ابص رخاک یا‌هفان یوب هب
+ز تاب جعد مشکينش چه خون افتاد در دل‌ها => اه‌لد رد داتفا نوخ هچ شنيکشم دعج بات ز
+مرا در منزل جانان چه امن عيش چون هر دم => مد ره نوچ شيع نما هچ ناناج لزنم رد ارم
+جرس فرياد می‌دارد که بربنديد محمل‌ها =>  اه‌لمحم ديدنبرب هک دراد‌یم دايرف سرج
+به می سجاده رنگين کن گرت پير مغان گويد => ديوگ ناغم ريپ ترگ نک نيگنر هداجس یم هب
+که سالک بی‌خبر نبود ز راه و رسم منزل‌ها => اه‌لزنم مسر و هار ز دوبن ربخ‌یب کلاس هک
+شب تاريک و بيم موج و گردابی چنين هايل => لياه نينچ یبادرگ و جوم ميب و کيرات بش
+کجا دانند حال ما سبکباران ساحل‌ها =>    اه‌لحاس نارابکبس ام لاح دنناد اجک
+همه کارم ز خود کامی به بدنامی کشيد آخر => رخآ ديشک یماندب هب یماک دوخ ز مراک همه
+نهان کی ماند آن رازی کز او سازند محفل‌ها => اه‌لفحم دنزاس وا زک یزار نآ دنام یک ناهن
+حضوری گر همی‌خواهی از او غايب مشو حافظ => ظفاح وشم بياغ وا زا یهاوخ‌یمه رگ یروضح
+متی ما تلق من تهوی دع الدنيا و اهملها => اهلمها و ايندلا عد یوهت نم قلت ام یتم
diff --git a/test/test_UTF-8_reordernsm.input b/test/test_UTF-8_reordernsm.input
new file mode 100644 (file)
index 0000000..58653a6
--- /dev/null
@@ -0,0 +1,7 @@
+بِسْمِ ٱللّٰهِ ٱلرَّحْمٰنِ ٱلرَّحِيمِ
+اَلْحَمْدُ لِلّٰهِ رَبِّ الْعَالَمِينَ
+اَلرَّحْمٰنِ الرَّحِيمِ
+مَالِكِ يَوْمِ الدِّينِ
+اِيَّاكَ نَعْبُدُ وَ اِيَّاكَ نَسْتَعِينُ
+اِهْدِنَا الصِّرَاطَ الْمُسْتَقِيمَ
+صِرَاطَ الَّذِينَ اَنْعَمْتَ عَلَيهِمْ غَيْرِ الْمَغْضُوبِ عَلَيْهِم وَ لَا الضَّٓالِّينَ
diff --git a/test/test_UTF-8_reordernsm.reference b/test/test_UTF-8_reordernsm.reference
new file mode 100644 (file)
index 0000000..60e3f51
--- /dev/null
@@ -0,0 +1,7 @@
+بِسْمِ ٱللّٰهِ ٱلرَّحْمٰنِ ٱلرَّحِيمِ =>              مِيحِرَّلٱ نِمٰحْرَّلٱ هِلّٰلٱ مِسْبِ
+اَلْحَمْدُ لِلّٰهِ رَبِّ الْعَالَمِينَ =>               نَيمِلَاعَلْا بِّرَ هِلّٰلِ دُمْحَلْاَ
+اَلرَّحْمٰنِ الرَّحِيمِ =>                       مِيحِرَّلا نِمٰحْرَّلاَ
+مَالِكِ يَوْمِ الدِّينِ =>                      نِيدِّلا مِوْيَ كِلِامَ
+اِيَّاكَ نَعْبُدُ وَ اِيَّاكَ نَسْتَعِينُ =>             نُيعِتَسْنَ كَايَّاِ وَ دُبُعْنَ كَايَّاِ
+اِهْدِنَا الصِّرَاطَ الْمُسْتَقِيمَ =>               مَيقِتَسْمُلْا طَارَصِّلا انَدِهْاِ
+صِرَاطَ الَّذِينَ اَنْعَمْتَ عَلَيهِمْ غَيْرِ الْمَغْضُوبِ عَلَيْهِم وَ لَا الضَّٓالِّينَ => نَيلِّاضَّٓلا الَ وَ مهِيْلَعَ بِوضُغْمَلْا رِيْغَ مْهِيلَعَ تَمْعَنْاَ نَيذِلَّا طَارَصِ