diff --git a/cancel.php b/cancel.php new file mode 100644 index 0000000..5452c5a --- /dev/null +++ b/cancel.php @@ -0,0 +1,30 @@ + + + + + + + Subscription Canceled - Veritune + + + + + + +
+
+

Subscription Canceled

+

Your subscription process has been canceled. You can subscribe anytime from our pricing page.

+ Back to Pricing +
+
+ + + + diff --git a/certificates/.gitignore b/certificates/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/certificates/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/dashboard.php b/dashboard.php new file mode 100644 index 0000000..e2bc874 --- /dev/null +++ b/dashboard.php @@ -0,0 +1,164 @@ + 50000000) { // 50 MB + $upload_error = 'File is too large. Maximum size is 50 MB.'; + } else { + $file_name = uniqid() . '-' . basename($file['name']); + $upload_path = 'uploads/' . $file_name; + + if (move_uploaded_file($file['tmp_name'], $upload_path)) { + try { + $stmt = db()->prepare("INSERT INTO songs (user_id, title, artist, file_path) VALUES (?, ?, ?, ?)"); + $stmt->execute([$user_id, $title, $artist, $upload_path]); + $upload_success = 'Song uploaded successfully!'; + } catch (PDOException $e) { + $upload_error = "Database error: " . $e->getMessage(); + } + } else { + $upload_error = 'Failed to move uploaded file.'; + } + } + } +} + +// Fetch user's songs +$songs = []; +try { + $stmt = db()->prepare("SELECT id, title, artist, uploaded_at FROM songs WHERE user_id = ? ORDER BY uploaded_at DESC"); + $stmt->execute([$user_id]); + $songs = $stmt->fetchAll(); +} catch (PDOException $e) { + // Handle database error +} + +// Fetch user's subscription +$subscription = null; +try { + $stmt = db()->prepare("SELECT plan, status, end_date FROM subscriptions WHERE user_id = ? ORDER BY created_at DESC LIMIT 1"); + $stmt->execute([$user_id]); + $subscription = $stmt->fetch(); +} catch (PDOException $e) { + // Handle database error +} + +?> + + + + + + Dashboard - Veritune + + + + + + +
+
+

Welcome, !

+
+ +
+

Subscription Status

+ +

Plan:

+

Status:

+ +

Next Billing Date:

+ + +

You are currently on the Free plan.

+ Upgrade to Pro + +
+ +
+

Upload a New Song

+ +

+ + +

+ +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ +
+

Your Songs

+ + + + + + + + + + + + + + + + + + + + + + + + + +
TitleArtistUploaded OnAction
You haven't uploaded any songs yet.
Generate Certificate
+
+
+ + + + diff --git a/db/migrations/001_initial_schema.sql b/db/migrations/001_initial_schema.sql new file mode 100644 index 0000000..b4bbe74 --- /dev/null +++ b/db/migrations/001_initial_schema.sql @@ -0,0 +1,49 @@ + +CREATE TABLE IF NOT EXISTS `users` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `name` VARCHAR(255) NOT NULL, + `email` VARCHAR(255) NOT NULL UNIQUE, + `password` VARCHAR(255) NOT NULL, + `stripe_customer_id` VARCHAR(255), + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS `songs` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `user_id` INT NOT NULL, + `title` VARCHAR(255) NOT NULL, + `artist` VARCHAR(255), + `file_path` VARCHAR(255) NOT NULL, + `uploaded_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS `certificates` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `song_id` INT NOT NULL, + `certificate_hash` VARCHAR(255) NOT NULL UNIQUE, + `file_path` VARCHAR(255) NOT NULL, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`song_id`) REFERENCES `songs`(`id`) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS `subscriptions` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `user_id` INT NOT NULL, + `stripe_subscription_id` VARCHAR(255) NOT NULL UNIQUE, + `plan` VARCHAR(50) NOT NULL, + `status` VARCHAR(50) NOT NULL, + `start_date` TIMESTAMP NOT NULL, + `end_date` TIMESTAMP, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS `daily_uploads` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `user_id` INT NOT NULL, + `upload_date` DATE NOT NULL, + `upload_count` INT NOT NULL DEFAULT 0, + UNIQUE KEY `user_date` (`user_id`, `upload_date`), + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE +); diff --git a/dompdf/AUTHORS.md b/dompdf/AUTHORS.md new file mode 100644 index 0000000..6861479 --- /dev/null +++ b/dompdf/AUTHORS.md @@ -0,0 +1,24 @@ +Dompdf was designed and developed by Benj Carson. + +### Current Team + +* **Brian Sweeney** (maintainer) +* **Till Berger** + +### Alumni + +* **Benj Carson** (creator) +* **Fabien Ménager** +* **Simon Berger** +* **Orion Richardson** + +### Contributors +* **Gabriel Bull** +* **Barry vd. Heuvel** +* **Ryan H. Masten** +* **Helmut Tischer** +* [and many more...](https://github.com/dompdf/dompdf/graphs/contributors) + +### Thanks + +Dompdf would not have been possible without strong community support. diff --git a/dompdf/LICENSE.LGPL b/dompdf/LICENSE.LGPL new file mode 100644 index 0000000..6ef5de8 --- /dev/null +++ b/dompdf/LICENSE.LGPL @@ -0,0 +1,456 @@ + 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. + + 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. + + 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. + + 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. + + 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. + + 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. + + 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. + + 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. + + 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. \ No newline at end of file diff --git a/dompdf/README.md b/dompdf/README.md new file mode 100644 index 0000000..41a7dd7 --- /dev/null +++ b/dompdf/README.md @@ -0,0 +1,239 @@ +Dompdf +====== + +[![Build Status](https://github.com/dompdf/dompdf/actions/workflows/test.yml/badge.svg)](https://github.com/dompdf/dompdf/actions/workflows/test.yml) +[![PHP Versions Supported](https://poser.pugx.org/dompdf/dompdf/require/php)](https://packagist.org/packages/dompdf/dompdf) +[![Latest Release](https://poser.pugx.org/dompdf/dompdf/v)](https://packagist.org/packages/dompdf/dompdf) +[![Total Downloads](https://poser.pugx.org/dompdf/dompdf/downloads)](https://packagist.org/packages/dompdf/dompdf) +[![License](https://poser.pugx.org/dompdf/dompdf/license)](https://packagist.org/packages/dompdf/dompdf) + +**Dompdf is an HTML to PDF converter** + +At its heart, dompdf is (mostly) a [CSS 2.1](http://www.w3.org/TR/CSS2/) compliant +HTML layout and rendering engine written in PHP. It is a style-driven renderer: +it will download and read external stylesheets, inline style tags, and the style +attributes of individual HTML elements. It also supports most presentational +HTML attributes. + +*This document applies to the latest stable code which may not reflect the current +release. For released code please +[navigate to the appropriate tag](https://github.com/dompdf/dompdf/tags).* + +---- + +**Check out the [demo](http://eclecticgeek.com/dompdf/debug.php) and ask any +question on [StackOverflow](https://stackoverflow.com/questions/tagged/dompdf) or +in [Discussions](https://github.com/dompdf/dompdf/discussions).** + +Follow us on [![Twitter](http://twitter-badges.s3.amazonaws.com/twitter-a.png)](http://www.twitter.com/dompdf). + +--- + + + +## Features + + * Handles most CSS 2.1 and a few CSS3 properties, including @import, @media & + @page rules + * Supports most presentational HTML 4.0 attributes + * Supports external stylesheets, either local or through http/ftp (via + fopen-wrappers) + * Supports complex tables, including row & column spans, separate & collapsed + border models, individual cell styling + * Image support (gif, png (8, 24 and 32 bit with alpha channel), bmp & jpeg) + * No dependencies on external PDF libraries, thanks to the R&OS PDF class + * Inline PHP support + * Basic SVG support (see "Limitations" below) + +## Requirements + + * PHP version 7.1 or higher + * DOM extension + * MBString extension + * php-font-lib + * php-svg-lib + +Note that some required dependencies may have further dependencies +(notably php-svg-lib requires sabberworm/php-css-parser). + +### Recommendations + + * GD (for image processing) + * Additionally, the IMagick or GMagick extension improves image processing performance for certain image types + * OPcache (OPcache, XCache, APC, etc.): improves performance + +Visit the wiki for more information: +https://github.com/dompdf/dompdf/wiki/Requirements + +## About Fonts & Character Encoding + +PDF documents internally support the following fonts: Helvetica, Times-Roman, +Courier, Zapf-Dingbats, & Symbol. These fonts only support Windows ANSI +encoding. In order for a PDF to display characters that are not available in +Windows ANSI, you must supply an external font. Dompdf will embed any referenced +font in the PDF so long as it has been pre-loaded or is accessible to dompdf and +reference in CSS @font-face rules. See the +[font overview](https://github.com/dompdf/dompdf/wiki/About-Fonts-and-Character-Encoding) +for more information on how to use fonts. + +The [DejaVu TrueType fonts](https://dejavu-fonts.github.io/) have been pre-installed +to give dompdf decent Unicode character coverage by default. To use the DejaVu +fonts reference the font in your stylesheet, e.g. `body { font-family: DejaVu +Sans; }` (for DejaVu Sans). The following DejaVu 2.34 fonts are available: +DejaVu Sans, DejaVu Serif, and DejaVu Sans Mono. + +## Easy Installation + +### Install with composer + +To install with [Composer](https://getcomposer.org/), simply require the +latest version of this package. + +```bash +composer require dompdf/dompdf +``` + +Make sure that the autoload file from Composer is loaded. + +```php +// somewhere early in your project's loading, require the Composer autoloader +// see: http://getcomposer.org/doc/00-intro.md +require 'vendor/autoload.php'; +``` + +### Download and install + +Download a packaged archive of dompdf and extract it into the +directory where dompdf will reside + + * You can download stable copies of dompdf from + https://github.com/dompdf/dompdf/releases + * Or download a nightly (the latest, unreleased code) from + http://eclecticgeek.com/dompdf + +Use the packaged release autoloader to load dompdf, libraries, +and helper functions in your PHP: + +```php +// include autoloader +require_once 'dompdf/autoload.inc.php'; +``` + +Note: packaged releases are named according using semantic +versioning (_dompdf_MAJOR-MINOR-PATCH.zip_). So the 1.0.0 +release would be dompdf_1-0-0.zip. This is the only download +that includes the autoloader for Dompdf and all its dependencies. + +### Install with git + +From the command line, switch to the directory where dompdf will +reside and run the following commands: + +```sh +git clone https://github.com/dompdf/dompdf.git +cd dompdf/lib + +git clone https://github.com/PhenX/php-font-lib.git php-font-lib +cd php-font-lib +git checkout 0.5.1 +cd .. + +git clone https://github.com/PhenX/php-svg-lib.git php-svg-lib +cd php-svg-lib +git checkout v0.3.2 +cd .. + +git clone https://github.com/sabberworm/PHP-CSS-Parser.git php-css-parser +cd php-css-parser +git checkout 8.1.0 +``` + +Require dompdf and it's dependencies in your PHP. +For details see the [autoloader in the utils project](https://github.com/dompdf/utils/blob/master/autoload.inc.php). + +## Framework Integration + +* For Symfony: [nucleos/dompdf-bundle](https://github.com/nucleos/NucleosDompdfBundle) +* For Laravel: [barryvdh/laravel-dompdf](https://github.com/barryvdh/laravel-dompdf) +* For Redaxo: [PdfOut](https://github.com/FriendsOfREDAXO/pdfout) + +## Quick Start + +Just pass your HTML in to dompdf and stream the output: + +```php +// reference the Dompdf namespace +use Dompdf\Dompdf; + +// instantiate and use the dompdf class +$dompdf = new Dompdf(); +$dompdf->loadHtml('hello world'); + +// (Optional) Setup the paper size and orientation +$dompdf->setPaper('A4', 'landscape'); + +// Render the HTML as PDF +$dompdf->render(); + +// Output the generated PDF to Browser +$dompdf->stream(); +``` + +### Setting Options + +Set options during dompdf instantiation: + +```php +use Dompdf\Dompdf; +use Dompdf\Options; + +$options = new Options(); +$options->set('defaultFont', 'Courier'); +$dompdf = new Dompdf($options); +``` + +or at run time + +```php +use Dompdf\Dompdf; + +$dompdf = new Dompdf(); +$options = $dompdf->getOptions(); +$options->setDefaultFont('Courier'); +$dompdf->setOptions($options); +``` + +See [Dompdf\Options](src/Options.php) for a list of available options. + +### Resource Reference Requirements + +In order to protect potentially sensitive information Dompdf imposes +restrictions on files referenced from the local file system or the web. + +Files accessed through web-based protocols have the following requirements: + * The Dompdf option "isRemoteEnabled" must be set to "true" + * PHP must either have the curl extension enabled or the + allow_url_fopen setting set to true + +Files accessed through the local file system have the following requirement: + * The file must fall within the path(s) specified for the Dompdf "chroot" option + +## Limitations (Known Issues) + + * Table cells are not pageable, meaning a table row must fit on a single page: See https://github.com/dompdf/dompdf/issues/98 + * Elements are rendered on the active page when they are parsed. + * Embedding "raw" SVG's (``) isn't working yet: See https://github.com/dompdf/dompdf/issues/320 + Workaround: Either link to an external SVG file, or use a DataURI like this: + ```php + $html = ''; + ``` + * Does not support CSS flexbox: See https://github.com/dompdf/dompdf/issues/971 + * Does not support CSS Grid: See https://github.com/dompdf/dompdf/issues/2988 + * A single Dompdf instance should not be used to render more than one HTML document + because persisted parsing and rendering artifacts can impact future renders. +--- + +[![Donate button](https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif)](http://goo.gl/DSvWf) + +*If you find this project useful, please consider making a donation. +Any funds donated will be used to help further development on this project.)* diff --git a/dompdf/VERSION b/dompdf/VERSION new file mode 100644 index 0000000..0aec50e --- /dev/null +++ b/dompdf/VERSION @@ -0,0 +1 @@ +3.1.4 diff --git a/dompdf/autoload.inc.php b/dompdf/autoload.inc.php new file mode 100644 index 0000000..dc542ab --- /dev/null +++ b/dompdf/autoload.inc.php @@ -0,0 +1 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + /** @var ?string */ + private $vendorDir; + + // PSR-4 + /** + * @var array[] + * @psalm-var array> + */ + private $prefixLengthsPsr4 = array(); + /** + * @var array[] + * @psalm-var array> + */ + private $prefixDirsPsr4 = array(); + /** + * @var array[] + * @psalm-var array + */ + private $fallbackDirsPsr4 = array(); + + // PSR-0 + /** + * @var array[] + * @psalm-var array> + */ + private $prefixesPsr0 = array(); + /** + * @var array[] + * @psalm-var array + */ + private $fallbackDirsPsr0 = array(); + + /** @var bool */ + private $useIncludePath = false; + + /** + * @var string[] + * @psalm-var array + */ + private $classMap = array(); + + /** @var bool */ + private $classMapAuthoritative = false; + + /** + * @var bool[] + * @psalm-var array + */ + private $missingClasses = array(); + + /** @var ?string */ + private $apcuPrefix; + + /** + * @var self[] + */ + private static $registeredLoaders = array(); + + /** + * @param ?string $vendorDir + */ + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + } + + /** + * @return string[] + */ + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + /** + * @return array[] + * @psalm-return array> + */ + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + /** + * @return array[] + * @psalm-return array + */ + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + /** + * @return array[] + * @psalm-return array + */ + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + /** + * @return string[] Array of classname => path + * @psalm-return array + */ + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param string[] $classMap Class to filename map + * @psalm-param array $classMap + * + * @return void + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param string[]|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + * + * @return void + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param string[]|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param string[]|string $paths The PSR-0 base directories + * + * @return void + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param string[]|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + * + * @return void + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + * + * @return void + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + * + * @return void + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + * + * @return void + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } + } + + /** + * Unregisters this instance as an autoloader. + * + * @return void + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return true|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + + return null; + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + /** + * Returns the currently registered loaders indexed by their corresponding vendor directories. + * + * @return self[] + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + + /** + * @param string $class + * @param string $ext + * @return string|false + */ + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + * @private + */ +function includeFile($file) +{ + include $file; +} diff --git a/dompdf/vendor/composer/InstalledVersions.php b/dompdf/vendor/composer/InstalledVersions.php new file mode 100644 index 0000000..d50e0c9 --- /dev/null +++ b/dompdf/vendor/composer/InstalledVersions.php @@ -0,0 +1,350 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer; + +use Composer\Autoload\ClassLoader; +use Composer\Semver\VersionParser; + +/** + * This class is copied in every Composer installed project and available to all + * + * See also https://getcomposer.org/doc/07-runtime.md#installed-versions + * + * To require its presence, you can require `composer-runtime-api ^2.0` + */ +class InstalledVersions +{ + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array}|array{}|null + */ + private static $installed; + + /** + * @var bool|null + */ + private static $canGetVendors; + + /** + * @var array[] + * @psalm-var array}> + */ + private static $installedByVendor = array(); + + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = array_keys($installed['versions']); + } + + if (1 === \count($packages)) { + return $packages[0]; + } + + return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); + } + + /** + * Returns a list of all package names with a specific type e.g. 'library' + * + * @param string $type + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackagesByType($type) + { + $packagesByType = array(); + + foreach (self::getInstalled() as $installed) { + foreach ($installed['versions'] as $name => $package) { + if (isset($package['type']) && $package['type'] === $type) { + $packagesByType[] = $name; + } + } + } + + return $packagesByType; + } + + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @param bool $includeDevRequirements + * @return bool + */ + public static function isInstalled($packageName, $includeDevRequirements = true) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); + } + } + + return false; + } + + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * @return bool + */ + public static function satisfies(VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints($constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + + return $provided->matches($constraint); + } + + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + + return implode(' || ', $ranges); + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + + return $installed['versions'][$packageName]['version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + + return $installed['versions'][$packageName]['pretty_version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + + return $installed['versions'][$packageName]['reference']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. + */ + public static function getInstallPath($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @return array + * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + + return $installed[0]['root']; + } + + /** + * Returns the raw installed.php data for custom implementations + * + * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. + * @return array[] + * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} + */ + public static function getRawData() + { + @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = include __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + + return self::$installed; + } + + /** + * Returns the raw data of all installed.php which are currently loaded for custom implementations + * + * @return array[] + * @psalm-return list}> + */ + public static function getAllRawData() + { + return self::getInstalled(); + } + + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @param array[] $data A vendor/composer/installed.php data set + * @return void + * + * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + + /** + * @return array[] + * @psalm-return list}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); + } + + $installed = array(); + + if (self::$canGetVendors) { + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (is_file($vendorDir.'/composer/installed.php')) { + $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; + if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { + self::$installed = $installed[count($installed) - 1]; + } + } + } + } + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = require __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + $installed[] = self::$installed; + + return $installed; + } +} diff --git a/dompdf/vendor/composer/LICENSE b/dompdf/vendor/composer/LICENSE new file mode 100644 index 0000000..f27399a --- /dev/null +++ b/dompdf/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/dompdf/vendor/composer/autoload_classmap.php b/dompdf/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000..b708d77 --- /dev/null +++ b/dompdf/vendor/composer/autoload_classmap.php @@ -0,0 +1,11 @@ + $vendorDir . '/composer/InstalledVersions.php', + 'Dompdf\\Cpdf' => $vendorDir . '/dompdf/dompdf/lib/Cpdf.php', +); diff --git a/dompdf/vendor/composer/autoload_namespaces.php b/dompdf/vendor/composer/autoload_namespaces.php new file mode 100644 index 0000000..b7fc012 --- /dev/null +++ b/dompdf/vendor/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ + array($vendorDir . '/dompdf/php-svg-lib/src/Svg'), + 'Sabberworm\\CSS\\' => array($vendorDir . '/sabberworm/php-css-parser/src'), + 'Masterminds\\' => array($vendorDir . '/masterminds/html5/src'), + 'FontLib\\' => array($vendorDir . '/dompdf/php-font-lib/src/FontLib'), + 'Dompdf\\' => array($vendorDir . '/dompdf/dompdf/src'), +); diff --git a/dompdf/vendor/composer/autoload_real.php b/dompdf/vendor/composer/autoload_real.php new file mode 100644 index 0000000..efd5a53 --- /dev/null +++ b/dompdf/vendor/composer/autoload_real.php @@ -0,0 +1,57 @@ += 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require __DIR__ . '/autoload_static.php'; + + call_user_func(\Composer\Autoload\ComposerStaticInit4a9d4cf747e4313ccce026c5290258f3::getInitializer($loader)); + } else { + $map = require __DIR__ . '/autoload_namespaces.php'; + foreach ($map as $namespace => $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + } + + $loader->register(true); + + return $loader; + } +} diff --git a/dompdf/vendor/composer/autoload_static.php b/dompdf/vendor/composer/autoload_static.php new file mode 100644 index 0000000..8e0a4e1 --- /dev/null +++ b/dompdf/vendor/composer/autoload_static.php @@ -0,0 +1,66 @@ + + array ( + 'Svg\\' => 4, + 'Sabberworm\\CSS\\' => 15, + ), + 'M' => + array ( + 'Masterminds\\' => 12, + ), + 'F' => + array ( + 'FontLib\\' => 8, + ), + 'D' => + array ( + 'Dompdf\\' => 7, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'Svg\\' => + array ( + 0 => __DIR__ . '/..' . '/dompdf/php-svg-lib/src/Svg', + ), + 'Sabberworm\\CSS\\' => + array ( + 0 => __DIR__ . '/..' . '/sabberworm/php-css-parser/src', + ), + 'Masterminds\\' => + array ( + 0 => __DIR__ . '/..' . '/masterminds/html5/src', + ), + 'FontLib\\' => + array ( + 0 => __DIR__ . '/..' . '/dompdf/php-font-lib/src/FontLib', + ), + 'Dompdf\\' => + array ( + 0 => __DIR__ . '/..' . '/dompdf/dompdf/src', + ), + ); + + public static $classMap = array ( + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'Dompdf\\Cpdf' => __DIR__ . '/..' . '/dompdf/dompdf/lib/Cpdf.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInit4a9d4cf747e4313ccce026c5290258f3::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit4a9d4cf747e4313ccce026c5290258f3::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit4a9d4cf747e4313ccce026c5290258f3::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/dompdf/vendor/composer/installed.json b/dompdf/vendor/composer/installed.json new file mode 100644 index 0000000..6529706 --- /dev/null +++ b/dompdf/vendor/composer/installed.json @@ -0,0 +1,309 @@ +{ + "packages": [ + { + "name": "dompdf/dompdf", + "version": "v3.1.4", + "version_normalized": "3.1.4.0", + "source": { + "type": "git", + "url": "https://github.com/dompdf/dompdf.git", + "reference": "db712c90c5b9868df3600e64e68da62e78a34623" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/db712c90c5b9868df3600e64e68da62e78a34623", + "reference": "db712c90c5b9868df3600e64e68da62e78a34623", + "shasum": "" + }, + "require": { + "dompdf/php-font-lib": "^1.0.0", + "dompdf/php-svg-lib": "^1.0.0", + "ext-dom": "*", + "ext-mbstring": "*", + "masterminds/html5": "^2.0", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "ext-gd": "*", + "ext-json": "*", + "ext-zip": "*", + "mockery/mockery": "^1.3", + "phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11", + "squizlabs/php_codesniffer": "^3.5", + "symfony/process": "^4.4 || ^5.4 || ^6.2 || ^7.0" + }, + "suggest": { + "ext-gd": "Needed to process images", + "ext-gmagick": "Improves image processing performance", + "ext-imagick": "Improves image processing performance", + "ext-zlib": "Needed for pdf stream compression" + }, + "time": "2025-10-29T12:43:30+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Dompdf\\": "src/" + }, + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "The Dompdf Community", + "homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md" + } + ], + "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", + "homepage": "https://github.com/dompdf/dompdf", + "support": { + "issues": "https://github.com/dompdf/dompdf/issues", + "source": "https://github.com/dompdf/dompdf/tree/v3.1.4" + }, + "install-path": "../dompdf/dompdf" + }, + { + "name": "dompdf/php-font-lib", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-font-lib.git", + "reference": "6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d", + "reference": "6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^3 || ^4 || ^5 || ^6" + }, + "time": "2024-12-02T14:37:59+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "FontLib\\": "src/FontLib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "The FontLib Community", + "homepage": "https://github.com/dompdf/php-font-lib/blob/master/AUTHORS.md" + } + ], + "description": "A library to read, parse, export and make subsets of different types of font files.", + "homepage": "https://github.com/dompdf/php-font-lib", + "support": { + "issues": "https://github.com/dompdf/php-font-lib/issues", + "source": "https://github.com/dompdf/php-font-lib/tree/1.0.1" + }, + "install-path": "../dompdf/php-font-lib" + }, + { + "name": "dompdf/php-svg-lib", + "version": "1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/dompdf/php-svg-lib.git", + "reference": "eb045e518185298eb6ff8d80d0d0c6b17aecd9af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/eb045e518185298eb6ff8d80d0d0c6b17aecd9af", + "reference": "eb045e518185298eb6ff8d80d0d0c6b17aecd9af", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^7.1 || ^8.0", + "sabberworm/php-css-parser": "^8.4" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5" + }, + "time": "2024-04-29T13:26:35+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Svg\\": "src/Svg" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "The SvgLib Community", + "homepage": "https://github.com/dompdf/php-svg-lib/blob/master/AUTHORS.md" + } + ], + "description": "A library to read, parse and export to PDF SVG files.", + "homepage": "https://github.com/dompdf/php-svg-lib", + "support": { + "issues": "https://github.com/dompdf/php-svg-lib/issues", + "source": "https://github.com/dompdf/php-svg-lib/tree/1.0.0" + }, + "install-path": "../dompdf/php-svg-lib" + }, + { + "name": "masterminds/html5", + "version": "2.10.0", + "version_normalized": "2.10.0.0", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "fcf91eb64359852f00d921887b219479b4f21251" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251", + "reference": "fcf91eb64359852f00d921887b219479b4f21251", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + }, + "time": "2025-07-25T09:04:22+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.10.0" + }, + "install-path": "../masterminds/html5" + }, + { + "name": "sabberworm/php-css-parser", + "version": "v8.9.0", + "version_normalized": "8.9.0.0", + "source": { + "type": "git", + "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", + "reference": "d8e916507b88e389e26d4ab03c904a082aa66bb9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/d8e916507b88e389e26d4ab03c904a082aa66bb9", + "reference": "d8e916507b88e389e26d4ab03c904a082aa66bb9", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": "^5.6.20 || ^7.0.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "require-dev": { + "phpunit/phpunit": "5.7.27 || 6.5.14 || 7.5.20 || 8.5.41", + "rawr/cross-data-providers": "^2.0.0" + }, + "suggest": { + "ext-mbstring": "for parsing UTF-8 CSS" + }, + "time": "2025-07-11T13:20:48+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Sabberworm\\CSS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raphael Schweikert" + }, + { + "name": "Oliver Klee", + "email": "github@oliverklee.de" + }, + { + "name": "Jake Hotson", + "email": "jake.github@qzdesign.co.uk" + } + ], + "description": "Parser for CSS Files written in PHP", + "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "keywords": [ + "css", + "parser", + "stylesheet" + ], + "support": { + "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues", + "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.9.0" + }, + "install-path": "../sabberworm/php-css-parser" + } + ], + "dev": true, + "dev-package-names": [] +} diff --git a/dompdf/vendor/composer/installed.php b/dompdf/vendor/composer/installed.php new file mode 100644 index 0000000..864f085 --- /dev/null +++ b/dompdf/vendor/composer/installed.php @@ -0,0 +1,68 @@ + array( + 'pretty_version' => '1.0.0+no-version-set', + 'version' => '1.0.0.0', + 'type' => 'project', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'reference' => NULL, + 'name' => '__root__', + 'dev' => true, + ), + 'versions' => array( + '__root__' => array( + 'pretty_version' => '1.0.0+no-version-set', + 'version' => '1.0.0.0', + 'type' => 'project', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'reference' => NULL, + 'dev_requirement' => false, + ), + 'dompdf/dompdf' => array( + 'pretty_version' => 'v3.1.4', + 'version' => '3.1.4.0', + 'type' => 'library', + 'install_path' => __DIR__ . '/../dompdf/dompdf', + 'aliases' => array(), + 'reference' => 'db712c90c5b9868df3600e64e68da62e78a34623', + 'dev_requirement' => false, + ), + 'dompdf/php-font-lib' => array( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'type' => 'library', + 'install_path' => __DIR__ . '/../dompdf/php-font-lib', + 'aliases' => array(), + 'reference' => '6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d', + 'dev_requirement' => false, + ), + 'dompdf/php-svg-lib' => array( + 'pretty_version' => '1.0.0', + 'version' => '1.0.0.0', + 'type' => 'library', + 'install_path' => __DIR__ . '/../dompdf/php-svg-lib', + 'aliases' => array(), + 'reference' => 'eb045e518185298eb6ff8d80d0d0c6b17aecd9af', + 'dev_requirement' => false, + ), + 'masterminds/html5' => array( + 'pretty_version' => '2.10.0', + 'version' => '2.10.0.0', + 'type' => 'library', + 'install_path' => __DIR__ . '/../masterminds/html5', + 'aliases' => array(), + 'reference' => 'fcf91eb64359852f00d921887b219479b4f21251', + 'dev_requirement' => false, + ), + 'sabberworm/php-css-parser' => array( + 'pretty_version' => 'v8.9.0', + 'version' => '8.9.0.0', + 'type' => 'library', + 'install_path' => __DIR__ . '/../sabberworm/php-css-parser', + 'aliases' => array(), + 'reference' => 'd8e916507b88e389e26d4ab03c904a082aa66bb9', + 'dev_requirement' => false, + ), + ), +); diff --git a/dompdf/vendor/composer/platform_check.php b/dompdf/vendor/composer/platform_check.php new file mode 100644 index 0000000..6d3407d --- /dev/null +++ b/dompdf/vendor/composer/platform_check.php @@ -0,0 +1,26 @@ += 70100)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 7.1.0". You are running ' . PHP_VERSION . '.'; +} + +if ($issues) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); + } elseif (!headers_sent()) { + echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; + } + } + trigger_error( + 'Composer detected issues in your platform: ' . implode(' ', $issues), + E_USER_ERROR + ); +} diff --git a/dompdf/vendor/dompdf/dompdf/AUTHORS.md b/dompdf/vendor/dompdf/dompdf/AUTHORS.md new file mode 100644 index 0000000..6861479 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/AUTHORS.md @@ -0,0 +1,24 @@ +Dompdf was designed and developed by Benj Carson. + +### Current Team + +* **Brian Sweeney** (maintainer) +* **Till Berger** + +### Alumni + +* **Benj Carson** (creator) +* **Fabien Ménager** +* **Simon Berger** +* **Orion Richardson** + +### Contributors +* **Gabriel Bull** +* **Barry vd. Heuvel** +* **Ryan H. Masten** +* **Helmut Tischer** +* [and many more...](https://github.com/dompdf/dompdf/graphs/contributors) + +### Thanks + +Dompdf would not have been possible without strong community support. diff --git a/dompdf/vendor/dompdf/dompdf/LICENSE.LGPL b/dompdf/vendor/dompdf/dompdf/LICENSE.LGPL new file mode 100644 index 0000000..6ef5de8 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/LICENSE.LGPL @@ -0,0 +1,456 @@ + 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. + + 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. + + 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. + + 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. + + 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. + + 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. + + 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. + + 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. + + 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. \ No newline at end of file diff --git a/dompdf/vendor/dompdf/dompdf/README.md b/dompdf/vendor/dompdf/dompdf/README.md new file mode 100644 index 0000000..41a7dd7 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/README.md @@ -0,0 +1,239 @@ +Dompdf +====== + +[![Build Status](https://github.com/dompdf/dompdf/actions/workflows/test.yml/badge.svg)](https://github.com/dompdf/dompdf/actions/workflows/test.yml) +[![PHP Versions Supported](https://poser.pugx.org/dompdf/dompdf/require/php)](https://packagist.org/packages/dompdf/dompdf) +[![Latest Release](https://poser.pugx.org/dompdf/dompdf/v)](https://packagist.org/packages/dompdf/dompdf) +[![Total Downloads](https://poser.pugx.org/dompdf/dompdf/downloads)](https://packagist.org/packages/dompdf/dompdf) +[![License](https://poser.pugx.org/dompdf/dompdf/license)](https://packagist.org/packages/dompdf/dompdf) + +**Dompdf is an HTML to PDF converter** + +At its heart, dompdf is (mostly) a [CSS 2.1](http://www.w3.org/TR/CSS2/) compliant +HTML layout and rendering engine written in PHP. It is a style-driven renderer: +it will download and read external stylesheets, inline style tags, and the style +attributes of individual HTML elements. It also supports most presentational +HTML attributes. + +*This document applies to the latest stable code which may not reflect the current +release. For released code please +[navigate to the appropriate tag](https://github.com/dompdf/dompdf/tags).* + +---- + +**Check out the [demo](http://eclecticgeek.com/dompdf/debug.php) and ask any +question on [StackOverflow](https://stackoverflow.com/questions/tagged/dompdf) or +in [Discussions](https://github.com/dompdf/dompdf/discussions).** + +Follow us on [![Twitter](http://twitter-badges.s3.amazonaws.com/twitter-a.png)](http://www.twitter.com/dompdf). + +--- + + + +## Features + + * Handles most CSS 2.1 and a few CSS3 properties, including @import, @media & + @page rules + * Supports most presentational HTML 4.0 attributes + * Supports external stylesheets, either local or through http/ftp (via + fopen-wrappers) + * Supports complex tables, including row & column spans, separate & collapsed + border models, individual cell styling + * Image support (gif, png (8, 24 and 32 bit with alpha channel), bmp & jpeg) + * No dependencies on external PDF libraries, thanks to the R&OS PDF class + * Inline PHP support + * Basic SVG support (see "Limitations" below) + +## Requirements + + * PHP version 7.1 or higher + * DOM extension + * MBString extension + * php-font-lib + * php-svg-lib + +Note that some required dependencies may have further dependencies +(notably php-svg-lib requires sabberworm/php-css-parser). + +### Recommendations + + * GD (for image processing) + * Additionally, the IMagick or GMagick extension improves image processing performance for certain image types + * OPcache (OPcache, XCache, APC, etc.): improves performance + +Visit the wiki for more information: +https://github.com/dompdf/dompdf/wiki/Requirements + +## About Fonts & Character Encoding + +PDF documents internally support the following fonts: Helvetica, Times-Roman, +Courier, Zapf-Dingbats, & Symbol. These fonts only support Windows ANSI +encoding. In order for a PDF to display characters that are not available in +Windows ANSI, you must supply an external font. Dompdf will embed any referenced +font in the PDF so long as it has been pre-loaded or is accessible to dompdf and +reference in CSS @font-face rules. See the +[font overview](https://github.com/dompdf/dompdf/wiki/About-Fonts-and-Character-Encoding) +for more information on how to use fonts. + +The [DejaVu TrueType fonts](https://dejavu-fonts.github.io/) have been pre-installed +to give dompdf decent Unicode character coverage by default. To use the DejaVu +fonts reference the font in your stylesheet, e.g. `body { font-family: DejaVu +Sans; }` (for DejaVu Sans). The following DejaVu 2.34 fonts are available: +DejaVu Sans, DejaVu Serif, and DejaVu Sans Mono. + +## Easy Installation + +### Install with composer + +To install with [Composer](https://getcomposer.org/), simply require the +latest version of this package. + +```bash +composer require dompdf/dompdf +``` + +Make sure that the autoload file from Composer is loaded. + +```php +// somewhere early in your project's loading, require the Composer autoloader +// see: http://getcomposer.org/doc/00-intro.md +require 'vendor/autoload.php'; +``` + +### Download and install + +Download a packaged archive of dompdf and extract it into the +directory where dompdf will reside + + * You can download stable copies of dompdf from + https://github.com/dompdf/dompdf/releases + * Or download a nightly (the latest, unreleased code) from + http://eclecticgeek.com/dompdf + +Use the packaged release autoloader to load dompdf, libraries, +and helper functions in your PHP: + +```php +// include autoloader +require_once 'dompdf/autoload.inc.php'; +``` + +Note: packaged releases are named according using semantic +versioning (_dompdf_MAJOR-MINOR-PATCH.zip_). So the 1.0.0 +release would be dompdf_1-0-0.zip. This is the only download +that includes the autoloader for Dompdf and all its dependencies. + +### Install with git + +From the command line, switch to the directory where dompdf will +reside and run the following commands: + +```sh +git clone https://github.com/dompdf/dompdf.git +cd dompdf/lib + +git clone https://github.com/PhenX/php-font-lib.git php-font-lib +cd php-font-lib +git checkout 0.5.1 +cd .. + +git clone https://github.com/PhenX/php-svg-lib.git php-svg-lib +cd php-svg-lib +git checkout v0.3.2 +cd .. + +git clone https://github.com/sabberworm/PHP-CSS-Parser.git php-css-parser +cd php-css-parser +git checkout 8.1.0 +``` + +Require dompdf and it's dependencies in your PHP. +For details see the [autoloader in the utils project](https://github.com/dompdf/utils/blob/master/autoload.inc.php). + +## Framework Integration + +* For Symfony: [nucleos/dompdf-bundle](https://github.com/nucleos/NucleosDompdfBundle) +* For Laravel: [barryvdh/laravel-dompdf](https://github.com/barryvdh/laravel-dompdf) +* For Redaxo: [PdfOut](https://github.com/FriendsOfREDAXO/pdfout) + +## Quick Start + +Just pass your HTML in to dompdf and stream the output: + +```php +// reference the Dompdf namespace +use Dompdf\Dompdf; + +// instantiate and use the dompdf class +$dompdf = new Dompdf(); +$dompdf->loadHtml('hello world'); + +// (Optional) Setup the paper size and orientation +$dompdf->setPaper('A4', 'landscape'); + +// Render the HTML as PDF +$dompdf->render(); + +// Output the generated PDF to Browser +$dompdf->stream(); +``` + +### Setting Options + +Set options during dompdf instantiation: + +```php +use Dompdf\Dompdf; +use Dompdf\Options; + +$options = new Options(); +$options->set('defaultFont', 'Courier'); +$dompdf = new Dompdf($options); +``` + +or at run time + +```php +use Dompdf\Dompdf; + +$dompdf = new Dompdf(); +$options = $dompdf->getOptions(); +$options->setDefaultFont('Courier'); +$dompdf->setOptions($options); +``` + +See [Dompdf\Options](src/Options.php) for a list of available options. + +### Resource Reference Requirements + +In order to protect potentially sensitive information Dompdf imposes +restrictions on files referenced from the local file system or the web. + +Files accessed through web-based protocols have the following requirements: + * The Dompdf option "isRemoteEnabled" must be set to "true" + * PHP must either have the curl extension enabled or the + allow_url_fopen setting set to true + +Files accessed through the local file system have the following requirement: + * The file must fall within the path(s) specified for the Dompdf "chroot" option + +## Limitations (Known Issues) + + * Table cells are not pageable, meaning a table row must fit on a single page: See https://github.com/dompdf/dompdf/issues/98 + * Elements are rendered on the active page when they are parsed. + * Embedding "raw" SVG's (``) isn't working yet: See https://github.com/dompdf/dompdf/issues/320 + Workaround: Either link to an external SVG file, or use a DataURI like this: + ```php + $html = ''; + ``` + * Does not support CSS flexbox: See https://github.com/dompdf/dompdf/issues/971 + * Does not support CSS Grid: See https://github.com/dompdf/dompdf/issues/2988 + * A single Dompdf instance should not be used to render more than one HTML document + because persisted parsing and rendering artifacts can impact future renders. +--- + +[![Donate button](https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif)](http://goo.gl/DSvWf) + +*If you find this project useful, please consider making a donation. +Any funds donated will be used to help further development on this project.)* diff --git a/dompdf/vendor/dompdf/dompdf/VERSION b/dompdf/vendor/dompdf/dompdf/VERSION new file mode 100644 index 0000000..0aec50e --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/VERSION @@ -0,0 +1 @@ +3.1.4 diff --git a/dompdf/vendor/dompdf/dompdf/composer.json b/dompdf/vendor/dompdf/dompdf/composer.json new file mode 100644 index 0000000..907b33c --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/composer.json @@ -0,0 +1,49 @@ +{ + "name": "dompdf/dompdf", + "type": "library", + "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", + "homepage": "https://github.com/dompdf/dompdf", + "license": "LGPL-2.1", + "authors": [ + { + "name": "The Dompdf Community", + "homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md" + } + ], + "autoload": { + "psr-4": { + "Dompdf\\": "src/" + }, + "classmap": [ + "lib/" + ] + }, + "autoload-dev": { + "psr-4": { + "Dompdf\\Tests\\": "tests/" + } + }, + "require": { + "php": "^7.1 || ^8.0", + "ext-dom": "*", + "ext-mbstring": "*", + "masterminds/html5": "^2.0", + "dompdf/php-font-lib": "^1.0.0", + "dompdf/php-svg-lib": "^1.0.0" + }, + "require-dev": { + "ext-gd": "*", + "ext-json": "*", + "ext-zip": "*", + "phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11", + "squizlabs/php_codesniffer": "^3.5", + "mockery/mockery": "^1.3", + "symfony/process": "^4.4 || ^5.4 || ^6.2 || ^7.0" + }, + "suggest": { + "ext-gd": "Needed to process images", + "ext-imagick": "Improves image processing performance", + "ext-gmagick": "Improves image processing performance", + "ext-zlib": "Needed for pdf stream compression" + } +} diff --git a/dompdf/vendor/dompdf/dompdf/lib/Cpdf.php b/dompdf/vendor/dompdf/dompdf/lib/Cpdf.php new file mode 100644 index 0000000..22dca02 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/Cpdf.php @@ -0,0 +1,6904 @@ + "Normal", "opacity" => 1.0]; + + /** + * @var array|null Current fill transparency (partial graphics state) + */ + public $currentFillTransparency = ["mode" => "Normal", "opacity" => 1.0]; + + /** + * @var array An array which is used to save the state of the document, mainly the colors and styles + * it is used to temporarily change to another state, then change back to what it was before + */ + public $stateStack = []; + + /** + * @var integer Number of elements within the state stack + */ + public $nStateStack = 0; + + /** + * @var integer Number of page objects within the document + */ + public $numPages = 0; + + /** + * @var array Object Id storage stack + */ + public $stack = []; + + /** + * @var integer Number of elements within the object Id storage stack + */ + public $nStack = 0; + + /** + * an array which contains information about the objects which are not firmly attached to pages + * these have been added with the addObject function + */ + public $looseObjects = []; + + /** + * array contains information about how the loose objects are to be added to the document + */ + public $addLooseObjects = []; + + /** + * @var integer The objectId of the information object for the document + * this contains authorship, title etc. + */ + public $infoObject = 0; + + /** + * @var integer Number of images being tracked within the document + */ + public $numImages = 0; + + /** + * @var array An array containing options about the document + * it defaults to turning on the compression of the objects + */ + public $options = ['compression' => true]; + + /** + * @var integer The objectId of the first page of the document + */ + public $firstPageId; + + /** + * @var integer The object Id of the procset object + */ + public $procsetObjectId; + + /** + * @var array Store the information about the relationship between font families + * this used so that the code knows which font is the bold version of another font, etc. + * the value of this array is initialised in the constructor function. + */ + public $fontFamilies = []; + + /** + * @var string Folder for php serialized formats of font metrics files. + * If empty string, use same folder as original metrics files. + * This can be passed in from class creator. + * If this folder does not exist or is not writable, Cpdf will be **much** slower. + * Because of potential trouble with php safe mode, folder cannot be created at runtime. + */ + public $fontcache = ''; + + /** + * @var integer The version of the font metrics cache file. + * This value must be manually incremented whenever the internal font data structure is modified. + */ + public $fontcacheVersion = 6; + + /** + * @var string Temporary folder. + * If empty string, will attempt system tmp folder. + * This can be passed in from class creator. + */ + public $tmp = ''; + + /** + * @var string Track if the current font is bolded or italicised + */ + public $currentTextState = ''; + + /** + * @var string Messages are stored here during processing, these can be selected afterwards to give some useful debug information + */ + public $messages = ''; + + /** + * @var string The encryption array for the document encryption is stored here + */ + public $arc4 = ''; + + /** + * @var integer The object Id of the encryption information + */ + public $arc4_objnum = 0; + + /** + * @var string The file identifier, used to uniquely identify a pdf document + */ + public $fileIdentifier = ''; + + /** + * @var boolean A flag to say if a document is to be encrypted or not + */ + public $encrypted = false; + + /** + * @var string The encryption key for the encryption of all the document content (structure is not encrypted) + */ + public $encryptionKey = ''; + + /** + * @var string The additional XMP RDF data to be added + */ + public $additionalXmpRdf = ''; + + /** + * @var array Array which forms a stack to keep track of nested callback functions + */ + public $callback = []; + + /** + * @var integer The number of callback functions in the callback array + */ + public $nCallback = 0; + + /** + * @var array Store label->id pairs for named destinations, these will be used to replace internal links + * done this way so that destinations can be defined after the location that links to them + */ + public $destinations = []; + + /** + * @var array Store the stack for the transaction commands, each item in here is a record of the values of all the + * publiciables within the class, so that the user can rollback at will (from each 'start' command) + * note that this includes the objects array, so these can be large. + */ + public $checkpoint = ''; + + /** + * @var array Table of Image origin filenames and image labels which were already added with o_image(). + * Allows to merge identical images + */ + public $imagelist = []; + + /** + * @var array Table of already added alpha and plain image files for transparent PNG images. + */ + protected $imageAlphaList = []; + + /** + * @var array List of temporary image files to be deleted after processing. + */ + protected $imageCache = []; + + /** + * @var boolean Whether the text passed in should be treated as Unicode or just local character set. + */ + public $isUnicode = false; + + /** + * @var string the JavaScript code of the document + */ + public $javascript = ''; + + /** + * @var boolean whether the compression is possible + */ + protected $compressionReady = false; + + /** + * @var array Current page size + */ + protected $currentPageSize = ["width" => 0, "height" => 0]; + + /** + * @var array All the chars that will be required in the font subsets + */ + protected $stringSubsets = []; + + /** + * @var string The target internal encoding + */ + protected static $targetEncoding = 'Windows-1252'; + + /** + * @var array + */ + protected $byteRange = array(); + + /** + * @var array The list of the core fonts + */ + protected static $coreFonts = [ + 'courier', + 'courier-bold', + 'courier-oblique', + 'courier-boldoblique', + 'helvetica', + 'helvetica-bold', + 'helvetica-oblique', + 'helvetica-boldoblique', + 'times-roman', + 'times-bold', + 'times-italic', + 'times-bolditalic', + 'symbol', + 'zapfdingbats' + ]; + + /** + * Class constructor + * This will start a new document + * + * @param array $pageSize Array of 4 numbers, defining the bottom left and upper right corner of the page. first two are normally zero. + * @param boolean $isUnicode Whether text will be treated as Unicode or not. + * @param string $fontcache The font cache folder + * @param string $tmp The temporary folder + */ + function __construct($pageSize = [0, 0, 612, 792], $isUnicode = false, $fontcache = '', $tmp = '') + { + $this->isUnicode = $isUnicode; + $this->fontcache = rtrim($fontcache, DIRECTORY_SEPARATOR."/\\"); + $this->tmp = ($tmp !== '' ? $tmp : sys_get_temp_dir()); + $this->newDocument($pageSize); + + $this->compressionReady = function_exists('gzcompress'); + + if (in_array('Windows-1252', mb_list_encodings())) { + self::$targetEncoding = 'Windows-1252'; + } + + // also initialize the font families that are known about already + $this->setFontFamily('init'); + } + + public function __destruct() + { + foreach ($this->imageCache as $file) { + if (file_exists($file)) { + unlink($file); + } + } + } + + /** + * Document object methods (internal use only) + * + * There is about one object method for each type of object in the pdf document + * Each function has the same call list ($id,$action,$options). + * $id = the object ID of the object, or what it is to be if it is being created + * $action = a string specifying the action to be performed, though ALL must support: + * 'new' - create the object with the id $id + * 'out' - produce the output for the pdf object + * $options = optional, a string or array containing the various parameters for the object + * + * These, in conjunction with the output function are the ONLY way for output to be produced + * within the pdf 'file'. + */ + + /** + * Destination object, used to specify the location for the user to jump to, presently on opening + * + * @param $id + * @param $action + * @param string $options + * @return string|null + */ + protected function o_destination($id, $action, $options = '') + { + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'destination', 'info' => []]; + $tmp = ''; + switch ($options['type']) { + case 'XYZ': + /** @noinspection PhpMissingBreakStatementInspection */ + case 'FitR': + $tmp = ' ' . $options['p3'] . $tmp; + case 'FitH': + case 'FitV': + case 'FitBH': + /** @noinspection PhpMissingBreakStatementInspection */ + case 'FitBV': + $tmp = ' ' . $options['p1'] . ' ' . $options['p2'] . $tmp; + case 'Fit': + case 'FitB': + $tmp = $options['type'] . $tmp; + $this->objects[$id]['info']['string'] = $tmp; + $this->objects[$id]['info']['page'] = $options['page']; + } + break; + + case 'out': + $o = &$this->objects[$id]; + + $tmp = $o['info']; + $res = "\n$id 0 obj\n" . '[' . $tmp['page'] . ' 0 R /' . $tmp['string'] . "]\nendobj"; + + return $res; + } + + return null; + } + + /** + * set the viewer preferences + * + * @param $id + * @param $action + * @param string|array $options + * @return string|null + */ + protected function o_viewerPreferences($id, $action, $options = '') + { + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'viewerPreferences', 'info' => []]; + break; + + case 'add': + $o = &$this->objects[$id]; + + foreach ($options as $k => $v) { + switch ($k) { + // Boolean keys + case 'HideToolbar': + case 'HideMenubar': + case 'HideWindowUI': + case 'FitWindow': + case 'CenterWindow': + case 'DisplayDocTitle': + case 'PickTrayByPDFSize': + $o['info'][$k] = (bool)$v; + break; + + // Integer keys + case 'NumCopies': + $o['info'][$k] = (int)$v; + break; + + // Name keys + case 'ViewArea': + case 'ViewClip': + case 'PrintClip': + case 'PrintArea': + $o['info'][$k] = (string)$v; + break; + + // Named with limited valid values + case 'NonFullScreenPageMode': + if (!in_array($v, ['UseNone', 'UseOutlines', 'UseThumbs', 'UseOC'])) { + break; + } + $o['info'][$k] = $v; + break; + + case 'Direction': + if (!in_array($v, ['L2R', 'R2L'])) { + break; + } + $o['info'][$k] = $v; + break; + + case 'PrintScaling': + if (!in_array($v, ['None', 'AppDefault'])) { + break; + } + $o['info'][$k] = $v; + break; + + case 'Duplex': + if (!in_array($v, ['None', 'Simplex', 'DuplexFlipShortEdge', 'DuplexFlipLongEdge'])) { + break; + } + $o['info'][$k] = $v; + break; + + // Integer array + case 'PrintPageRange': + // Cast to integer array + foreach ($v as $vK => $vV) { + $v[$vK] = (int)$vV; + } + $o['info'][$k] = array_values($v); + break; + } + } + break; + + case 'out': + $o = &$this->objects[$id]; + $res = "\n$id 0 obj\n<< "; + + foreach ($o['info'] as $k => $v) { + if (is_string($v)) { + $v = '/' . $v; + } elseif (is_int($v)) { + $v = (string) $v; + } elseif (is_bool($v)) { + $v = ($v ? 'true' : 'false'); + } elseif (is_array($v)) { + $v = '[' . implode(' ', $v) . ']'; + } + $res .= "\n/$k $v"; + } + $res .= "\n>>\nendobj"; + + return $res; + } + + return null; + } + + /** + * define the document catalog, the overall controller for the document + * + * @param $id + * @param $action + * @param string|array $options + * @return string|null + */ + protected function o_catalog($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'catalog', 'info' => []]; + $this->catalogId = $id; + break; + + case 'acroform': + case 'outlines': + case 'pages': + case 'openHere': + case 'names': + $o['info'][$action] = $options; + break; + + case 'viewerPreferences': + if (!isset($o['info']['viewerPreferences'])) { + $this->numObj++; + $this->o_viewerPreferences($this->numObj, 'new'); + $o['info']['viewerPreferences'] = $this->numObj; + } + + $vp = $o['info']['viewerPreferences']; + $this->o_viewerPreferences($vp, 'add', $options); + + break; + + case 'outputIntents': + if (!isset($o['info']['outputIntents'])) { + $o['info']['outputIntents'] = []; + } + + $this->numObj++; + $this->o_contents($this->numObj, 'new'); + $this->objects[$this->numObj]['c'] = $options['iccProfileData']; + $this->o_contents($this->numObj, 'add', [ + 'N' => $options['colorComponentsCount'], + ]); + + $o['info']['outputIntents'][] = [ + 'iccProfileName' => $options['iccProfileName'], + 'destOutputProfile' => $this->numObj, + ]; + + break; + + case 'associatedFiles': + if (!isset($o['info']['associatedFiles'])) { + $o['info']['associatedFiles'] = []; + } + if (!empty($options)) { + $o['info']['associatedFiles'][] = $options; + } + break; + + case 'metadata': + $this->numObj++; + + $o['info']['metadata'] = $this->numObj; + + $this->o_contents($this->numObj, 'new'); + $this->objects[$this->numObj]['c'] = $options; + $this->o_contents($this->numObj, 'add', [ + 'Type' => '/Metadata', + 'Subtype' => '/XML', + ]); + + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /Catalog"; + + foreach ($o['info'] as $k => $v) { + switch ($k) { + case 'outlines': + $res .= "\n/Outlines $v 0 R"; + break; + + case 'pages': + $res .= "\n/Pages $v 0 R"; + break; + + case 'viewerPreferences': + $res .= "\n/ViewerPreferences $v 0 R"; + break; + + case 'openHere': + $res .= "\n/OpenAction $v 0 R"; + break; + + case 'names': + $res .= "\n/Names $v 0 R"; + break; + + case 'acroform': + $res .= "\n/AcroForm $v 0 R"; + break; + + case 'metadata': + $res .= "\n/Metadata $v 0 R"; + break; + + case 'outputIntents': + $res .= "\n/OutputIntents ["; + foreach ($v as $intent) { + $res .= "\n << /Type /OutputIntent /S /GTS_PDFA1 "; + $res .= "/OutputConditionIdentifier (" . $intent['iccProfileName'] . ") /Info (" . $intent['iccProfileName'] . ") "; + $res .= "/DestOutputProfile " . $intent['destOutputProfile'] . " 0 R >>"; + } + $res .= "\n]"; + break; + + case 'associatedFiles': + $res .= "\n/AF ["; + foreach ($v as $ref) { + $res .= "\n $ref"; + } + $res .= "\n]"; + break; + } + } + + $res .= " >>\nendobj"; + + return $res; + } + + return null; + } + + /** + * object which is a parent to the pages in the document + * + * @param $id + * @param $action + * @param string $options + * @return string|null + */ + protected function o_pages($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'pages', 'info' => []]; + $this->o_catalog($this->catalogId, 'pages', $id); + break; + + case 'page': + if (!is_array($options)) { + // then it will just be the id of the new page + $o['info']['pages'][] = $options; + } else { + // then it should be an array having 'id','rid','pos', where rid=the page to which this one will be placed relative + // and pos is either 'before' or 'after', saying where this page will fit. + if (isset($options['id']) && isset($options['rid']) && isset($options['pos'])) { + $i = array_search($options['rid'], $o['info']['pages']); + if (isset($o['info']['pages'][$i]) && $o['info']['pages'][$i] == $options['rid']) { + + // then there is a match + // make a space + switch ($options['pos']) { + case 'before': + $k = $i; + break; + + case 'after': + $k = $i + 1; + break; + + default: + $k = -1; + break; + } + + if ($k >= 0) { + for ($j = count($o['info']['pages']) - 1; $j >= $k; $j--) { + $o['info']['pages'][$j + 1] = $o['info']['pages'][$j]; + } + + $o['info']['pages'][$k] = $options['id']; + } + } + } + } + break; + + case 'procset': + $o['info']['procset'] = $options; + break; + + case 'mediaBox': + $o['info']['mediaBox'] = $options; + // which should be an array of 4 numbers + $this->currentPageSize = ['width' => $options[2], 'height' => $options[3]]; + break; + + case 'font': + $o['info']['fonts'][] = ['objNum' => $options['objNum'], 'fontNum' => $options['fontNum']]; + break; + + case 'extGState': + $o['info']['extGStates'][] = ['objNum' => $options['objNum'], 'stateNum' => $options['stateNum']]; + break; + + case 'xObject': + $o['info']['xObjects'][] = ['objNum' => $options['objNum'], 'label' => $options['label']]; + break; + + case 'out': + if (count($o['info']['pages'])) { + $res = "\n$id 0 obj\n<< /Type /Pages\n/Kids ["; + foreach ($o['info']['pages'] as $v) { + $res .= "$v 0 R\n"; + } + + $res .= "]\n/Count " . count($this->objects[$id]['info']['pages']); + + if ((isset($o['info']['fonts']) && count($o['info']['fonts'])) || + isset($o['info']['procset']) || + (isset($o['info']['extGStates']) && count($o['info']['extGStates'])) + ) { + $res .= "\n/Resources <<"; + + if (isset($o['info']['procset'])) { + $res .= "\n/ProcSet " . $o['info']['procset'] . " 0 R"; + } + + if (isset($o['info']['fonts']) && count($o['info']['fonts'])) { + $res .= "\n/Font << "; + foreach ($o['info']['fonts'] as $finfo) { + $res .= "\n/F" . $finfo['fontNum'] . " " . $finfo['objNum'] . " 0 R"; + } + $res .= "\n>>"; + } + + if (isset($o['info']['xObjects']) && count($o['info']['xObjects'])) { + $res .= "\n/XObject << "; + foreach ($o['info']['xObjects'] as $finfo) { + $res .= "\n/" . $finfo['label'] . " " . $finfo['objNum'] . " 0 R"; + } + $res .= "\n>>"; + } + + if (isset($o['info']['extGStates']) && count($o['info']['extGStates'])) { + $res .= "\n/ExtGState << "; + foreach ($o['info']['extGStates'] as $gstate) { + $res .= "\n/GS" . $gstate['stateNum'] . " " . $gstate['objNum'] . " 0 R"; + } + $res .= "\n>>"; + } + + $res .= "\n>>"; + if (isset($o['info']['mediaBox'])) { + $tmp = $o['info']['mediaBox']; + $res .= "\n/MediaBox [" . sprintf( + '%.3F %.3F %.3F %.3F', + $tmp[0], + $tmp[1], + $tmp[2], + $tmp[3] + ) . ']'; + } + } + + $res .= "\n >>\nendobj"; + } else { + $res = "\n$id 0 obj\n<< /Type /Pages\n/Count 0\n>>\nendobj"; + } + + return $res; + } + + return null; + } + + /** + * define the outlines in the doc, empty for now + * + * @param $id + * @param $action + * @param string $options + * @return string|null + */ + protected function o_outlines($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'outlines', 'info' => ['outlines' => []]]; + $this->o_catalog($this->catalogId, 'outlines', $id); + break; + + case 'outline': + $o['info']['outlines'][] = $options; + break; + + case 'out': + if (count($o['info']['outlines'])) { + $res = "\n$id 0 obj\n<< /Type /Outlines /Kids ["; + foreach ($o['info']['outlines'] as $v) { + $res .= "$v 0 R "; + } + + $res .= "] /Count " . count($o['info']['outlines']) . " >>\nendobj"; + } else { + $res = "\n$id 0 obj\n<< /Type /Outlines /Count 0 >>\nendobj"; + } + + return $res; + } + + return null; + } + + /** + * an object to hold the font description + * + * @param $id + * @param $action + * @param string|array $options + * @return string|null + * @throws FontNotFoundException + */ + protected function o_font($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = [ + 't' => 'font', + 'info' => [ + 'name' => $options['name'], + 'fontFileName' => $options['fontFileName'], + 'SubType' => 'Type1', + 'isSubsetting' => $options['isSubsetting'] + ] + ]; + $fontNum = $this->numFonts; + $this->objects[$id]['info']['fontNum'] = $fontNum; + + // deal with the encoding and the differences + if (isset($options['differences'])) { + // then we'll need an encoding dictionary + $this->numObj++; + $this->o_fontEncoding($this->numObj, 'new', $options); + $this->objects[$id]['info']['encodingDictionary'] = $this->numObj; + } else { + if (isset($options['encoding'])) { + // we can specify encoding here + switch ($options['encoding']) { + case 'WinAnsiEncoding': + case 'MacRomanEncoding': + case 'MacExpertEncoding': + $this->objects[$id]['info']['encoding'] = $options['encoding']; + break; + + case 'none': + break; + + default: + $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding'; + break; + } + } else { + $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding'; + } + } + + if ($this->fonts[$options['fontFileName']]['isUnicode']) { + // For Unicode fonts, we need to incorporate font data into + // sub-sections that are linked from the primary font section. + // Look at o_fontGIDtoCID and o_fontDescendentCID functions + // for more information. + // + // All of this code is adapted from the excellent changes made to + // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/) + + $toUnicodeId = ++$this->numObj; + $this->o_toUnicode($toUnicodeId, 'new'); + $this->objects[$id]['info']['toUnicode'] = $toUnicodeId; + + $cidFontId = ++$this->numObj; + $this->o_fontDescendentCID($cidFontId, 'new', $options); + $this->objects[$id]['info']['cidFont'] = $cidFontId; + } + + // also tell the pages node about the new font + $this->o_pages($this->currentNode, 'font', ['fontNum' => $fontNum, 'objNum' => $id]); + break; + + case 'add': + $font_options = $this->processFont($id, $o['info']); + + if ($font_options !== false) { + foreach ($font_options as $k => $v) { + switch ($k) { + case 'BaseFont': + $o['info']['name'] = $v; + break; + case 'FirstChar': + case 'LastChar': + case 'Widths': + case 'FontDescriptor': + case 'SubType': + $this->addMessage('o_font ' . $k . " : " . $v); + $o['info'][$k] = $v; + break; + } + } + + // pass values down to descendent font + if (isset($o['info']['cidFont'])) { + $this->o_fontDescendentCID($o['info']['cidFont'], 'add', $font_options); + } + } + break; + + case 'out': + if ($this->fonts[$this->objects[$id]['info']['fontFileName']]['isUnicode']) { + // For Unicode fonts, we need to incorporate font data into + // sub-sections that are linked from the primary font section. + // Look at o_fontGIDtoCID and o_fontDescendentCID functions + // for more information. + // + // All of this code is adapted from the excellent changes made to + // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/) + + $res = "\n$id 0 obj\n<fonts[$fontFileName])) { + return false; + } + + $font = &$this->fonts[$fontFileName]; + + $fileSuffix = $font['fileSuffix']; + $fileSuffixLower = strtolower($font['fileSuffix']); + $fbfile = "$fontFileName.$fileSuffix"; + $isTtfFont = $fileSuffixLower === 'ttf'; + $isPfbFont = $fileSuffixLower === 'pfb'; + + $this->addMessage('selectFont: checking for - ' . $fbfile); + + if ($this->pdfa && !file_exists($fbfile)) { + throw new \Exception("A fully embeddable font must be used when generating a document in PDF/A mode"); + } elseif (!$fileSuffix) { + $this->addMessage( + 'selectFont: pfb or ttf file not found, ok if this is one of the 14 standard fonts' + ); + + return false; + } else { + $adobeFontName = isset($font['PostScriptName']) ? $font['PostScriptName'] : $font['FontName']; + // $fontObj = $this->numObj; + $this->addMessage("selectFont: adding font file - $fbfile - $adobeFontName"); + + // find the array of font widths, and put that into an object. + $firstChar = -1; + $lastChar = 0; + $widths = []; + $cid_widths = []; + + foreach ($font['C'] as $num => $d) { + if (intval($num) > 0 || $num == '0') { + if (!$font['isUnicode']) { + // With Unicode, widths array isn't used + if ($lastChar > 0 && $num > $lastChar + 1) { + for ($i = $lastChar + 1; $i < $num; $i++) { + $widths[] = 0; + } + } + } + + $widths[] = $d; + + if ($font['isUnicode']) { + $cid_widths[$num] = $d; + } + + if ($firstChar == -1) { + $firstChar = $num; + } + + $lastChar = $num; + } + } + + // also need to adjust the widths for the differences array + if (isset($object['differences'])) { + foreach ($object['differences'] as $charNum => $charName) { + if ($charNum > $lastChar) { + if (!$object['isUnicode']) { + // With Unicode, widths array isn't used + for ($i = $lastChar + 1; $i <= $charNum; $i++) { + $widths[] = 0; + } + } + + $lastChar = $charNum; + } + + if (isset($font['C'][$charName])) { + $widths[$charNum - $firstChar] = $font['C'][$charName]; + if ($font['isUnicode']) { + $cid_widths[$charName] = $font['C'][$charName]; + } + } + } + } + + if ($font['isUnicode']) { + $font['CIDWidths'] = $cid_widths; + } + + $this->addMessage('selectFont: FirstChar = ' . $firstChar); + $this->addMessage('selectFont: LastChar = ' . $lastChar); + + $widthid = -1; + + if (!$font['isUnicode']) { + // With Unicode, widths array isn't used + + $this->numObj++; + $this->o_contents($this->numObj, 'new', 'raw'); + $this->objects[$this->numObj]['c'] .= '[' . implode(' ', $widths) . ']'; + $widthid = $this->numObj; + } + + $missing_width = 500; + $stemV = 70; + + if (isset($font['MissingWidth'])) { + $missing_width = $font['MissingWidth']; + } elseif (isset($font['IsFixedPitch']) && strtolower($font['IsFixedPitch']) === "true" && isset($font['C'][32])) { + $missing_width = $font['C'][32]; + } + + if (isset($font['StdVW'])) { + $stemV = $font['StdVW']; + } else { + if (isset($font['Weight']) && preg_match('!(bold|black)!i', $font['Weight'])) { + $stemV = 120; + } + } + + // load the pfb file, and put that into an object too. + // note that pdf supports only binary format type 1 font files, though there is a + // simple utility to convert them from pfa to pfb. + if (!$font['isSubsetting']) { + $data = file_get_contents($fbfile); + } else { + $adobeFontName = $this->getFontSubsettingTag($font) . '+' . $adobeFontName; + $this->stringSubsets[$fontFileName][] = 32; // Force space if not in yet + + $subset = $this->stringSubsets[$fontFileName]; + sort($subset); + + // Load font + $font_obj = Font::load($fbfile); + $font_obj->parse(); + + // Define subset + $font_obj->setSubset($subset); + $font_obj->reduce(); + + // Write new font + $tmp_name = @tempnam($this->tmp, "cpdf_subset_"); + $font_obj->open($tmp_name, BinaryStream::modeReadWrite); + $font_obj->encode(["OS/2"]); + $font_obj->close(); + + // Parse the new font to get cid2gid and widths + $font_obj = Font::load($tmp_name); + + // Find Unicode char map table + $subtable = null; + foreach ($font_obj->getData("cmap", "subtables") as $_subtable) { + if ($_subtable["platformID"] == 0 || $_subtable["platformID"] == 3 && $_subtable["platformSpecificID"] == 1) { + $subtable = $_subtable; + break; + } + } + + if ($subtable) { + $glyphIndexArray = $subtable["glyphIndexArray"]; + $hmtx = $font_obj->getData("hmtx"); + + unset($glyphIndexArray[0xFFFF]); + + $cidtogid = str_pad('', max(array_keys($glyphIndexArray)) * 2 + 1, "\x00"); + $font['CIDWidths'] = []; + foreach ($glyphIndexArray as $cid => $gid) { + if ($cid >= 0 && $cid < 0xFFFF && $gid) { + $cidtogid[$cid * 2] = chr($gid >> 8); + $cidtogid[$cid * 2 + 1] = chr($gid & 0xFF); + } + + $width = $font_obj->normalizeFUnit(isset($hmtx[$gid]) ? $hmtx[$gid][0] : $hmtx[0][0]); + $font['CIDWidths'][$cid] = $width; + } + + $font['CIDtoGID'] = base64_encode(gzcompress($cidtogid)); + $font['CIDtoGID_Compressed'] = true; + + $data = file_get_contents($tmp_name); + } else { + $data = file_get_contents($fbfile); + } + + $font_obj->close(); + unlink($tmp_name); + } + + // create the font descriptor + $this->numObj++; + $fontDescriptorId = $this->numObj; + + $this->numObj++; + $pfbid = $this->numObj; + + // determine flags (more than a little flakey, hopefully will not matter much) + $flags = 0; + + if ($font['ItalicAngle'] != 0) { + $flags += pow(2, 6); + } + + if ($font['IsFixedPitch'] === 'true') { + $flags += 1; + } + + $flags += pow(2, 5); // assume non-sybolic + $list = [ + 'Ascent' => 'Ascender', + 'CapHeight' => 'CapHeight', + 'MissingWidth' => 'MissingWidth', + 'Descent' => 'Descender', + 'FontBBox' => 'FontBBox', + 'ItalicAngle' => 'ItalicAngle' + ]; + $fdopt = [ + 'Flags' => $flags, + 'FontName' => $adobeFontName, + 'StemV' => $stemV + ]; + + foreach ($list as $k => $v) { + if (isset($font[$v])) { + $fdopt[$k] = $font[$v]; + } + } + if (!isset($fdopt['CapHeight']) && isset($fdopt['Ascent'])) { + $fdopt['CapHeight'] = $fdopt['Ascent']; + } + + if ($isPfbFont) { + $fdopt['FontFile'] = $pfbid; + } elseif ($isTtfFont) { + $fdopt['FontFile2'] = $pfbid; + } + + $this->o_fontDescriptor($fontDescriptorId, 'new', $fdopt); + + // embed the font program + $this->o_contents($this->numObj, 'new'); + $this->objects[$pfbid]['c'] .= $data; + + // determine the cruicial lengths within this file + if ($isPfbFont) { + $l1 = strpos($data, 'eexec') + 6; + $l2 = strpos($data, '00000000') - $l1; + $l3 = mb_strlen($data, '8bit') - $l2 - $l1; + $this->o_contents( + $this->numObj, + 'add', + ['Length1' => $l1, 'Length2' => $l2, 'Length3' => $l3] + ); + } elseif ($isTtfFont) { + $l1 = mb_strlen($data, '8bit'); + $this->o_contents($this->numObj, 'add', ['Length1' => $l1]); + } + + // tell the font object about all this new stuff + $options = [ + 'BaseFont' => $adobeFontName, + 'MissingWidth' => $missing_width, + 'Widths' => $widthid, + 'FirstChar' => $firstChar, + 'LastChar' => $lastChar, + 'FontDescriptor' => $fontDescriptorId + ]; + + if ($isTtfFont) { + $options['SubType'] = 'TrueType'; + } + + $this->addMessage("adding extra info to font.($fontObjId)"); + + foreach ($options as $fk => $fv) { + $this->addMessage("$fk : $fv"); + } + } + + return $options; + } + + /** + * A toUnicode section, needed for unicode fonts + * + * @param $id + * @param $action + * @return null|string + */ + protected function o_toUnicode($id, $action) + { + switch ($action) { + case 'new': + $this->objects[$id] = [ + 't' => 'toUnicode' + ]; + break; + case 'add': + break; + case 'out': + $ordering = 'UCS'; + $registry = 'Adobe'; + + if ($this->encrypted) { + $this->encryptInit($id); + $ordering = $this->filterText($this->ARC4($ordering), false, false); + $registry = $this->filterText($this->ARC4($registry), false, false); + } + + $stream = <<> def +/CMapName /Adobe-Identity-UCS def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +1 beginbfrange +<0000> <0000> +endbfrange +endcmap +CMapName currentdict /CMap defineresource pop +end +end +EOT; + + $res = "\n$id 0 obj\n"; + $res .= "<>\n"; + $res .= "stream\n" . $stream . "\nendstream" . "\nendobj"; + + return $res; + } + + return null; + } + + /** + * a font descriptor, needed for including additional fonts + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_fontDescriptor($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'fontDescriptor', 'info' => $options]; + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /FontDescriptor\n"; + foreach ($o['info'] as $label => $value) { + switch ($label) { + case 'Ascent': + case 'CapHeight': + case 'Descent': + case 'Flags': + case 'ItalicAngle': + case 'StemV': + case 'AvgWidth': + case 'Leading': + case 'MaxWidth': + case 'MissingWidth': + case 'StemH': + case 'XHeight': + case 'CharSet': + if (mb_strlen($value, '8bit')) { + $res .= "/$label $value\n"; + } + + break; + case 'FontFile': + case 'FontFile2': + case 'FontFile3': + $res .= "/$label $value 0 R\n"; + break; + + case 'FontBBox': + $res .= "/$label [$value[0] $value[1] $value[2] $value[3]]\n"; + break; + + case 'FontName': + $res .= "/$label /$value\n"; + break; + } + } + + $res .= ">>\nendobj"; + + return $res; + } + + return null; + } + + /** + * the font encoding + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_fontEncoding($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + // the options array should contain 'differences' and maybe 'encoding' + $this->objects[$id] = ['t' => 'fontEncoding', 'info' => $options]; + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /Encoding\n"; + if (!isset($o['info']['encoding'])) { + $o['info']['encoding'] = 'WinAnsiEncoding'; + } + + if ($o['info']['encoding'] !== 'none') { + $res .= "/BaseEncoding /" . $o['info']['encoding'] . "\n"; + } + + $res .= "/Differences \n["; + + $onum = -100; + + foreach ($o['info']['differences'] as $num => $label) { + if ($num != $onum + 1) { + // we cannot make use of consecutive numbering + $res .= "\n$num /$label"; + } else { + $res .= " /$label"; + } + + $onum = $num; + } + + $res .= "\n]\n>>\nendobj"; + + return $res; + } + + return null; + } + + /** + * a descendent cid font, needed for unicode fonts + * + * @param $id + * @param $action + * @param string|array $options + * @return null|string + */ + protected function o_fontDescendentCID($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'fontDescendentCID', 'info' => $options]; + + // we need a CID system info section + $cidSystemInfoId = ++$this->numObj; + $this->o_cidSystemInfo($cidSystemInfoId, 'new'); + $this->objects[$id]['info']['cidSystemInfo'] = $cidSystemInfoId; + + // and a CID to GID map + $cidToGidMapId = ++$this->numObj; + $this->o_fontGIDtoCIDMap($cidToGidMapId, 'new', $options); + $this->objects[$id]['info']['cidToGidMap'] = $cidToGidMapId; + break; + + case 'add': + foreach ($options as $k => $v) { + switch ($k) { + case 'BaseFont': + $o['info']['name'] = $v; + break; + + case 'FirstChar': + case 'LastChar': + case 'MissingWidth': + case 'FontDescriptor': + case 'SubType': + $this->addMessage("o_fontDescendentCID $k : $v"); + $o['info'][$k] = $v; + break; + } + } + break; + + case 'out': + $res = "\n$id 0 obj\n"; + $res .= "<fonts[$o['info']['fontFileName']]['CIDWidths'])) { + $cid_widths = &$this->fonts[$o['info']['fontFileName']]['CIDWidths']; + $w = ''; + foreach ($cid_widths as $cid => $width) { + $w .= "$cid [$width] "; + } + $res .= "/W [$w]\n"; + } + + $res .= "/CIDToGIDMap " . $o['info']['cidToGidMap'] . " 0 R\n"; + $res .= ">>\n"; + $res .= "endobj"; + + return $res; + } + + return null; + } + + /** + * CID system info section, needed for unicode fonts + * + * @param $id + * @param $action + * @return null|string + */ + protected function o_cidSystemInfo($id, $action) + { + switch ($action) { + case 'new': + $this->objects[$id] = [ + 't' => 'cidSystemInfo' + ]; + break; + case 'add': + break; + case 'out': + $ordering = 'UCS'; + $registry = 'Adobe'; + + if ($this->encrypted) { + $this->encryptInit($id); + $ordering = $this->filterText($this->ARC4($ordering), false, false); + $registry = $this->filterText($this->ARC4($registry), false, false); + } + + + $res = "\n$id 0 obj\n"; + + $res .= '<objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'fontGIDtoCIDMap', 'info' => $options]; + break; + + case 'out': + $res = "\n$id 0 obj\n"; + $fontFileName = $o['info']['fontFileName']; + $tmp = $this->fonts[$fontFileName]['CIDtoGID'] = base64_decode($this->fonts[$fontFileName]['CIDtoGID']); + + $compressed = isset($this->fonts[$fontFileName]['CIDtoGID_Compressed']) && + $this->fonts[$fontFileName]['CIDtoGID_Compressed']; + + if (!$compressed && isset($o['raw'])) { + $res .= $tmp; + } else { + $res .= "<<"; + + if (!$compressed && $this->compressionReady && $this->options['compression']) { + // then implement ZLIB based compression on this content stream + $compressed = true; + $tmp = gzcompress($tmp, 6); + } + if ($compressed) { + $res .= "\n/Filter /FlateDecode"; + } + + if ($this->encrypted) { + $this->encryptInit($id); + $tmp = $this->ARC4($tmp); + } + + $res .= "\n/Length " . mb_strlen($tmp, '8bit') . ">>\nstream\n$tmp\nendstream"; + } + + $res .= "\nendobj"; + + return $res; + } + + return null; + } + + /** + * the document procset, solves some problems with printing to old PS printers + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_procset($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'procset', 'info' => ['PDF' => 1, 'Text' => 1]]; + $this->o_pages($this->currentNode, 'procset', $id); + $this->procsetObjectId = $id; + break; + + case 'add': + // this is to add new items to the procset list, despite the fact that this is considered + // obsolete, the items are required for printing to some postscript printers + switch ($options) { + case 'ImageB': + case 'ImageC': + case 'ImageI': + $o['info'][$options] = 1; + break; + } + break; + + case 'out': + $res = "\n$id 0 obj\n["; + foreach ($o['info'] as $label => $val) { + $res .= "/$label "; + } + $res .= "]\nendobj"; + + return $res; + } + + return null; + } + + /** + * define the document information + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_info($id, $action, $options = '') + { + switch ($action) { + case 'new': + $this->infoObject = $id; + $date = 'D:' . @date('Ymd'); + $this->objects[$id] = [ + 't' => 'info', + 'info' => [ + 'Producer' => 'CPDF (dompdf)', + 'CreationDate' => $date + ] + ]; + break; + + case 'out': + $encrypted = $this->encrypted; + if ($encrypted) { + $this->encryptInit($id); + } + + $res = "\n$id 0 obj\n<<\n"; + $o = &$this->objects[$id]; + foreach ($o['info'] as $k => $v) { + $res .= "/$k ("; + + // dates must be outputted as-is, without Unicode transformations + if ($k !== 'CreationDate' && $k !== 'ModDate') { + $v = $this->utf8toUtf16BE($v); + } + + if ($encrypted) { + $v = $this->ARC4($v); + } + + $res .= $this->filterText($v, false, false); + $res .= ")\n"; + } + + $res .= ">>\nendobj"; + + return $res; + + case 'Title': + case 'Author': + case 'Subject': + case 'Keywords': + case 'Creator': + case 'Producer': + case 'CreationDate': + case 'ModDate': + case 'Trapped': + default: + $val = "$options"; + if (strlen($val) > 0) { + $this->objects[$id]['info'][$action] = $val; + break; + } + } + + return null; + } + + /** + * an action object, used to link to URLS initially + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_action($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + if (is_array($options)) { + $this->objects[$id] = ['t' => 'action', 'info' => $options, 'type' => $options['type']]; + } else { + // then assume a URI action + $this->objects[$id] = ['t' => 'action', 'info' => $options, 'type' => 'URI']; + } + break; + + case 'out': + if ($this->encrypted) { + $this->encryptInit($id); + } + + $res = "\n$id 0 obj\n<< /Type /Action"; + switch ($o['type']) { + case 'ilink': + if (!isset($this->destinations[(string)$o['info']['label']])) { + break; + } + + // there will be an 'label' setting, this is the name of the destination + $res .= "\n/S /GoTo\n/D " . $this->destinations[(string)$o['info']['label']] . " 0 R"; + break; + + case 'URI': + $res .= "\n/S /URI\n/URI ("; + if ($this->encrypted) { + $res .= $this->filterText($this->ARC4($o['info']), false, false); + } else { + $res .= $this->filterText($o['info'], false, false); + } + + $res .= ")"; + break; + } + + $res .= "\n>>\nendobj"; + + return $res; + } + + return null; + } + + /** + * an annotation object, this will add an annotation to the current page. + * initially will support just link annotations + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_annotation($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + // add the annotation to the current page + $pageId = $this->currentPage; + $this->o_page($pageId, 'annot', $id); + + // and add the action object which is going to be required + switch ($options['type']) { + case 'link': + $this->objects[$id] = ['t' => 'annotation', 'info' => $options]; + $this->numObj++; + $this->o_action($this->numObj, 'new', $options['url']); + $this->objects[$id]['info']['actionId'] = $this->numObj; + break; + + case 'ilink': + // this is to a named internal link + $label = $options['label']; + $this->objects[$id] = ['t' => 'annotation', 'info' => $options]; + $this->numObj++; + $this->o_action($this->numObj, 'new', ['type' => 'ilink', 'label' => $label]); + $this->objects[$id]['info']['actionId'] = $this->numObj; + break; + } + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /Annot"; + switch ($o['info']['type']) { + case 'link': + case 'ilink': + $res .= "\n/Subtype /Link"; + break; + } + $res .= "\n/F 4"; + $res .= "\n/A " . $o['info']['actionId'] . " 0 R"; + $res .= "\n/Border [0 0 0]"; + $res .= "\n/H /I"; + $res .= "\n/Rect [ "; + + foreach ($o['info']['rect'] as $v) { + $res .= sprintf("%.4F ", $v); + } + + $res .= "]"; + $res .= "\n>>\nendobj"; + + return $res; + } + + return null; + } + + /** + * a page object, it also creates a contents object to hold its contents + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_page($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->numPages++; + $this->objects[$id] = [ + 't' => 'page', + 'info' => [ + 'parent' => $this->currentNode, + 'pageNum' => $this->numPages, + 'mediaBox' => $this->objects[$this->currentNode]['info']['mediaBox'] + ] + ]; + + if (is_array($options)) { + // then this must be a page insertion, array should contain 'rid','pos'=[before|after] + $options['id'] = $id; + $this->o_pages($this->currentNode, 'page', $options); + } else { + $this->o_pages($this->currentNode, 'page', $id); + } + + $this->currentPage = $id; + //make a contents object to go with this page + $this->numObj++; + $this->o_contents($this->numObj, 'new', $id); + $this->currentContents = $this->numObj; + $this->objects[$id]['info']['contents'] = []; + $this->objects[$id]['info']['contents'][] = $this->numObj; + + $match = ($this->numPages % 2 ? 'odd' : 'even'); + foreach ($this->addLooseObjects as $oId => $target) { + if ($target === 'all' || $match === $target) { + $this->objects[$id]['info']['contents'][] = $oId; + } + } + break; + + case 'content': + $o['info']['contents'][] = $options; + break; + + case 'annot': + // add an annotation to this page + if (!isset($o['info']['annot'])) { + $o['info']['annot'] = []; + } + + // $options should contain the id of the annotation dictionary + $o['info']['annot'][] = $options; + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /Page"; + if (isset($o['info']['mediaBox'])) { + $tmp = $o['info']['mediaBox']; + $res .= "\n/MediaBox [" . sprintf( + '%.3F %.3F %.3F %.3F', + $tmp[0], + $tmp[1], + $tmp[2], + $tmp[3] + ) . ']'; + } + $res .= "\n/Parent " . $o['info']['parent'] . " 0 R"; + + if (isset($o['info']['annot'])) { + $res .= "\n/Annots ["; + foreach ($o['info']['annot'] as $aId) { + $res .= " $aId 0 R"; + } + $res .= " ]"; + } + + $count = count($o['info']['contents']); + if ($count == 1) { + $res .= "\n/Contents " . $o['info']['contents'][0] . " 0 R"; + } else { + if ($count > 1) { + $res .= "\n/Contents [\n"; + + // reverse the page contents so added objects are below normal content + //foreach (array_reverse($o['info']['contents']) as $cId) { + // Back to normal now that I've got transparency working --Benj + foreach ($o['info']['contents'] as $cId) { + $res .= "$cId 0 R\n"; + } + $res .= "]"; + } + } + + // PDF/A does not allow inheriting Resources, we must explicitly define them on each page + if ($this->pdfa) { + $pagesInfo = $this->objects[$this->currentNode]['info']; + + if ((isset($pagesInfo['fonts']) && count($pagesInfo['fonts'])) || + isset($pagesInfo['procset']) || + (isset($pagesInfo['extGStates']) && count($pagesInfo['extGStates'])) + ) { + $res .= "\n/Resources <<"; + + if (isset($pagesInfo['procset'])) { + $res .= "\n/ProcSet " . $pagesInfo['procset'] . " 0 R"; + } + + if (isset($pagesInfo['fonts']) && count($pagesInfo['fonts'])) { + $res .= "\n/Font << "; + foreach ($pagesInfo['fonts'] as $finfo) { + $res .= "\n/F" . $finfo['fontNum'] . " " . $finfo['objNum'] . " 0 R"; + } + $res .= "\n>>"; + } + + if (isset($pagesInfo['xObjects']) && count($pagesInfo['xObjects'])) { + $res .= "\n/XObject << "; + foreach ($pagesInfo['xObjects'] as $finfo) { + $res .= "\n/" . $finfo['label'] . " " . $finfo['objNum'] . " 0 R"; + } + $res .= "\n>>"; + } + + if (isset($pagesInfo['extGStates']) && count($pagesInfo['extGStates'])) { + $res .= "\n/ExtGState << "; + foreach ($pagesInfo['extGStates'] as $gstate) { + $res .= "\n/GS" . $gstate['stateNum'] . " " . $gstate['objNum'] . " 0 R"; + } + $res .= "\n>>"; + } + + $res .= "\n>>"; + } + } + + $res .= "\n>>\nendobj"; + + return $res; + } + + return null; + } + + /** + * the contents objects hold all of the content which appears on pages + * + * @param $id + * @param $action + * @param string|array $options + * @return null|string + */ + protected function o_contents($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'contents', 'c' => '', 'info' => []]; + if (mb_strlen($options, '8bit') && intval($options)) { + // then this contents is the primary for a page + $this->objects[$id]['onPage'] = $options; + } else { + if ($options === 'raw') { + // then this page contains some other type of system object + $this->objects[$id]['raw'] = 1; + } + } + break; + + case 'add': + // add more options to the declaration + foreach ($options as $k => $v) { + $o['info'][$k] = $v; + } + + case 'out': + $tmp = $o['c']; + $res = "\n$id 0 obj\n"; + + if (isset($this->objects[$id]['raw'])) { + $res .= $tmp; + } else { + $res .= "<<"; + if ($this->compressionReady && $this->options['compression']) { + // then implement ZLIB based compression on this content stream + $res .= " /Filter /FlateDecode"; + $tmp = gzcompress($tmp, 6); + } + + if ($this->encrypted) { + $this->encryptInit($id); + $tmp = $this->ARC4($tmp); + } + + foreach ($o['info'] as $k => $v) { + $res .= "\n/$k $v"; + } + + $res .= "\n/Length " . mb_strlen($tmp, '8bit') . " >>\nstream\n$tmp\nendstream"; + } + + $res .= "\nendobj"; + + return $res; + } + + return null; + } + + /** + * @param $id + * @param $action + * @return string|null + */ + protected function o_embedjs($id, $action) + { + switch ($action) { + case 'new': + $this->objects[$id] = [ + 't' => 'embedjs', + 'info' => [ + 'Names' => '[(EmbeddedJS) ' . ($id + 1) . ' 0 R]' + ] + ]; + break; + + case 'out': + $o = &$this->objects[$id]; + $res = "\n$id 0 obj\n<< "; + foreach ($o['info'] as $k => $v) { + $res .= "\n/$k $v"; + } + $res .= "\n>>\nendobj"; + + return $res; + } + + return null; + } + + /** + * @param $id + * @param $action + * @param string $code + * @return null|string + */ + protected function o_javascript($id, $action, $code = '') + { + switch ($action) { + case 'new': + $this->objects[$id] = [ + 't' => 'javascript', + 'info' => [ + 'S' => '/JavaScript', + 'JS' => '(' . $this->filterText($code, true, false) . ')', + ] + ]; + break; + + case 'out': + $o = &$this->objects[$id]; + $res = "\n$id 0 obj\n<< "; + + foreach ($o['info'] as $k => $v) { + $res .= "\n/$k $v"; + } + $res .= "\n>>\nendobj"; + + return $res; + } + + return null; + } + + /** + * an image object, will be an XObject in the document, includes description and data + * + * @param $id + * @param $action + * @param string $options + * @return null|string + * @throws Exception + */ + protected function o_image($id, $action, $options = '') + { + switch ($action) { + case 'new': + // make the new object + $this->objects[$id] = ['t' => 'image', 'data' => &$options['data'], 'info' => []]; + + $info =& $this->objects[$id]['info']; + + $info['Type'] = '/XObject'; + $info['Subtype'] = '/Image'; + $info['Width'] = $options['iw']; + $info['Height'] = $options['ih']; + + if (isset($options['masked']) && $options['masked']) { + $info['SMask'] = ($this->numObj - 1) . ' 0 R'; + } + + if (!isset($options['type']) || $options['type'] === 'jpg') { + if (!isset($options['channels'])) { + $options['channels'] = 3; + } + + switch ($options['channels']) { + case 1: + $info['ColorSpace'] = '/DeviceGray'; + break; + case 4: + $info['ColorSpace'] = '/DeviceCMYK'; + break; + default: + $info['ColorSpace'] = '/DeviceRGB'; + break; + } + + if ($info['ColorSpace'] === '/DeviceCMYK') { + if ($this->pdfa) { + throw new \Exception("CMYK images are not supported when generating a document in PDF/A mode"); + } + $info['Decode'] = '[1 0 1 0 1 0 1 0]'; + } + + $info['Filter'] = '/DCTDecode'; + $info['BitsPerComponent'] = 8; + } else { + if ($options['type'] === 'png') { + $info['Filter'] = '/FlateDecode'; + $info['DecodeParms'] = '<< /Predictor 15 /Colors ' . $options['ncolor'] . ' /Columns ' . $options['iw'] . ' /BitsPerComponent ' . $options['bitsPerComponent'] . '>>'; + + if ($options['isMask']) { + $info['ColorSpace'] = '/DeviceGray'; + } else { + if (mb_strlen($options['pdata'], '8bit')) { + $tmp = ' [ /Indexed /DeviceRGB ' . (mb_strlen($options['pdata'], '8bit') / 3 - 1) . ' '; + $this->numObj++; + $this->o_contents($this->numObj, 'new'); + $this->objects[$this->numObj]['c'] = $options['pdata']; + $tmp .= $this->numObj . ' 0 R'; + $tmp .= ' ]'; + $info['ColorSpace'] = $tmp; + + if (isset($options['transparency'])) { + $transparency = $options['transparency']; + switch ($transparency['type']) { + case 'indexed': + $tmp = ' [ ' . $transparency['data'] . ' ' . $transparency['data'] . '] '; + $info['Mask'] = $tmp; + break; + + case 'color-key': + $tmp = ' [ ' . + $transparency['r'] . ' ' . $transparency['r'] . + $transparency['g'] . ' ' . $transparency['g'] . + $transparency['b'] . ' ' . $transparency['b'] . + ' ] '; + $info['Mask'] = $tmp; + break; + } + } + } else { + if (isset($options['transparency'])) { + $transparency = $options['transparency']; + + switch ($transparency['type']) { + case 'indexed': + $tmp = ' [ ' . $transparency['data'] . ' ' . $transparency['data'] . '] '; + $info['Mask'] = $tmp; + break; + + case 'color-key': + $tmp = ' [ ' . + $transparency['r'] . ' ' . $transparency['r'] . ' ' . + $transparency['g'] . ' ' . $transparency['g'] . ' ' . + $transparency['b'] . ' ' . $transparency['b'] . + ' ] '; + $info['Mask'] = $tmp; + break; + } + } + $info['ColorSpace'] = '/' . $options['color']; + } + } + + $info['BitsPerComponent'] = $options['bitsPerComponent']; + } + } + + // assign it a place in the named resource dictionary as an external object, according to + // the label passed in with it. + $this->o_pages($this->currentNode, 'xObject', ['label' => $options['label'], 'objNum' => $id]); + + // also make sure that we have the right procset object for it. + $this->o_procset($this->procsetObjectId, 'add', 'ImageC'); + break; + + case 'out': + $o = &$this->objects[$id]; + $tmp = &$o['data']; + $res = "\n$id 0 obj\n<<"; + + foreach ($o['info'] as $k => $v) { + $res .= "\n/$k $v"; + } + + if ($this->encrypted) { + $this->encryptInit($id); + $tmp = $this->ARC4($tmp); + } + + $res .= "\n/Length " . mb_strlen($tmp, '8bit') . ">>\nstream\n$tmp\nendstream\nendobj"; + + return $res; + } + + return null; + } + + /** + * graphics state object + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_extGState($id, $action, $options = "") + { + static $valid_params = [ + "LW", + "LC", + "LC", + "LJ", + "ML", + "D", + "RI", + "OP", + "op", + "OPM", + "Font", + "BG", + "BG2", + "UCR", + "TR", + "TR2", + "HT", + "FL", + "SM", + "SA", + "BM", + "SMask", + "CA", + "ca", + "AIS", + "TK" + ]; + + switch ($action) { + case "new": + $this->objects[$id] = ['t' => 'extGState', 'info' => $options]; + + // Tell the pages about the new resource + $this->numStates++; + $this->o_pages($this->currentNode, 'extGState', ["objNum" => $id, "stateNum" => $this->numStates]); + break; + + case "out": + $o = &$this->objects[$id]; + $res = "\n$id 0 obj\n<< /Type /ExtGState\n"; + + foreach ($o["info"] as $k => $v) { + if (!in_array($k, $valid_params)) { + continue; + } + $res .= "/$k $v\n"; + } + + $res .= ">>\nendobj"; + + return $res; + } + + return null; + } + + /** + * @param integer $id + * @param string $action + * @param mixed $options + * @return string + */ + protected function o_xobject($id, $action, $options = '') + { + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'xobject', 'info' => $options, 'c' => '']; + break; + + case 'procset': + $this->objects[$id]['procset'] = $options; + break; + + case 'font': + $this->objects[$id]['fonts'][$options['fontNum']] = [ + 'objNum' => $options['objNum'], + 'fontNum' => $options['fontNum'] + ]; + break; + + case 'xObject': + $this->objects[$id]['xObjects'][] = ['objNum' => $options['objNum'], 'label' => $options['label']]; + break; + + case 'out': + $o = &$this->objects[$id]; + $res = "\n$id 0 obj\n<< /Type /XObject\n"; + + foreach ($o["info"] as $k => $v) { + switch ($k) { + case 'Subtype': + $res .= "/Subtype /$v\n"; + break; + case 'bbox': + $res .= "/BBox ["; + foreach ($v as $value) { + $res .= sprintf("%.4F ", $value); + } + $res .= "]\n"; + break; + default: + $res .= "/$k $v\n"; + break; + } + } + $res .= "/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]\n"; + + $res .= "/Resources <<"; + if (isset($o['procset'])) { + $res .= "\n/ProcSet " . $o['procset'] . " 0 R"; + } else { + $res .= "\n/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]"; + } + if (isset($o['fonts']) && count($o['fonts'])) { + $res .= "\n/Font << "; + foreach ($o['fonts'] as $finfo) { + $res .= "\n/F" . $finfo['fontNum'] . " " . $finfo['objNum'] . " 0 R"; + } + $res .= "\n>>"; + } + if (isset($o['xObjects']) && count($o['xObjects'])) { + $res .= "\n/XObject << "; + foreach ($o['xObjects'] as $finfo) { + $res .= "\n/" . $finfo['label'] . " " . $finfo['objNum'] . " 0 R"; + } + $res .= "\n>>"; + } + $res .= "\n>>\n"; + + $tmp = $o["c"]; + if ($this->compressionReady && $this->options['compression']) { + // then implement ZLIB based compression on this content stream + $res .= " /Filter /FlateDecode\n"; + $tmp = gzcompress($tmp, 6); + } + + if ($this->encrypted) { + $this->encryptInit($id); + $tmp = $this->ARC4($tmp); + } + + $res .= "/Length " . mb_strlen($tmp, '8bit') . " >>\n"; + $res .= "stream\n" . $tmp . "\nendstream" . "\nendobj"; + + return $res; + } + + return null; + } + + /** + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_acroform($id, $action, $options = '') + { + switch ($action) { + case "new": + $this->o_catalog($this->catalogId, 'acroform', $id); + $this->objects[$id] = array('t' => 'acroform', 'info' => $options); + break; + + case 'addfield': + $this->objects[$id]['info']['Fields'][] = $options; + break; + + case 'font': + $this->objects[$id]['fonts'][$options['fontNum']] = [ + 'objNum' => $options['objNum'], + 'fontNum' => $options['fontNum'] + ]; + break; + + case "out": + $o = &$this->objects[$id]; + $res = "\n$id 0 obj\n<<"; + + foreach ($o["info"] as $k => $v) { + switch ($k) { + case 'Fields': + $res .= " /Fields ["; + foreach ($v as $i) { + $res .= "$i 0 R "; + } + $res .= "]\n"; + break; + default: + $res .= "/$k $v\n"; + } + } + + $res .= "/DR <<\n"; + if (isset($o['fonts']) && count($o['fonts'])) { + $res .= "/Font << \n"; + foreach ($o['fonts'] as $finfo) { + $res .= "/F" . $finfo['fontNum'] . " " . $finfo['objNum'] . " 0 R\n"; + } + $res .= ">>\n"; + } + $res .= ">>\n"; + + $res .= ">>\nendobj"; + + return $res; + } + + return null; + } + + /** + * @param $id + * @param $action + * @param mixed $options + * @return null|string + */ + protected function o_field($id, $action, $options = '') + { + switch ($action) { + case "new": + $this->o_page($options['pageid'], 'annot', $id); + $this->o_acroform($this->acroFormId, 'addfield', $id); + $this->objects[$id] = ['t' => 'field', 'info' => $options]; + break; + + case 'set': + $this->objects[$id]['info'] = array_merge($this->objects[$id]['info'], $options); + break; + + case "out": + $o = &$this->objects[$id]; + $res = "\n$id 0 obj\n<< /Type /Annot /Subtype /Widget \n"; + + $encrypted = $this->encrypted; + if ($encrypted) { + $this->encryptInit($id); + } + + foreach ($o["info"] as $k => $v) { + switch ($k) { + case 'pageid': + $res .= "/P $v 0 R\n"; + break; + case 'value': + if ($encrypted) { + $v = $this->filterText($this->ARC4($v), false, false); + } + $res .= "/V ($v)\n"; + break; + case 'refvalue': + $res .= "/V $v 0 R\n"; + break; + case 'da': + if ($encrypted) { + $v = $this->filterText($this->ARC4($v), false, false); + } + $res .= "/DA ($v)\n"; + break; + case 'options': + $res .= "/Opt [\n"; + foreach ($v as $opt) { + if ($encrypted) { + $opt = $this->filterText($this->ARC4($opt), false, false); + } + $res .= "($opt)\n"; + } + $res .= "]\n"; + break; + case 'rect': + $res .= "/Rect ["; + foreach ($v as $value) { + $res .= sprintf("%.4F ", $value); + } + $res .= "]\n"; + break; + case 'appearance': + $res .= "/AP << "; + foreach ($v as $a => $ref) { + $res .= "/$a $ref 0 R "; + } + $res .= ">>\n"; + break; + case 'T': + if ($encrypted) { + $v = $this->filterText($this->ARC4($v), false, false); + } + $res .= "/T ($v)\n"; + break; + default: + $res .= "/$k $v\n"; + } + + } + + $res .= ">>\nendobj"; + + return $res; + } + + return null; + } + + /** + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_sig($id, $action, $options = '') + { + $sign_maxlen = $this->signatureMaxLen; + + switch ($action) { + case "new": + $this->objects[$id] = array('t' => 'sig', 'info' => $options); + $this->byteRange[$id] = ['t' => 'sig']; + break; + + case 'byterange': + $o = &$this->objects[$id]; + $content =& $options['content']; + $content_len = strlen($content); + $pos = strpos($content, sprintf("/ByteRange [ %'.010d", $id)); + $len = strlen('/ByteRange [ ********** ********** ********** ********** ]'); + $rangeStartPos = $pos + $len + 1 + 10; // before '<' + $content = substr_replace($content, str_pad(sprintf('/ByteRange [ 0 %u %u %u ]', $rangeStartPos, $rangeStartPos + $sign_maxlen + 2, $content_len - 2 - $sign_maxlen - $rangeStartPos), $len, ' ', STR_PAD_RIGHT), $pos, $len); + + $fuid = uniqid(); + $tmpInput = $this->tmp . "/pkcs7.tmp." . $fuid . '.in'; + $tmpOutput = $this->tmp . "/pkcs7.tmp." . $fuid . '.out'; + + if (file_put_contents($tmpInput, substr($content, 0, $rangeStartPos)) === false) { + throw new \Exception("Unable to write temporary file for signing."); + } + if (file_put_contents($tmpInput, substr($content, $rangeStartPos + 2 + $sign_maxlen), + FILE_APPEND) === false) { + throw new \Exception("Unable to write temporary file for signing."); + } + + if (openssl_pkcs7_sign($tmpInput, $tmpOutput, + $o['info']['SignCert'], + array($o['info']['PrivKey'], $o['info']['Password']), + array(), PKCS7_BINARY | PKCS7_DETACHED) === false) { + throw new \Exception("Failed to prepare signature."); + } + + $signature = file_get_contents($tmpOutput); + + unlink($tmpInput); + unlink($tmpOutput); + + $sign = substr($signature, (strpos($signature, "%%EOF\n\n------") + 13)); + list($head, $signature) = explode("\n\n", $sign); + + $signature = base64_decode(trim($signature)); + + $signature = current(unpack('H*', $signature)); + $signature = str_pad($signature, $sign_maxlen, '0'); + $siglen = strlen($signature); + if (strlen($signature) > $sign_maxlen) { + throw new \Exception("Signature length ($siglen) exceeds the $sign_maxlen limit."); + } + + $content = substr_replace($content, $signature, $rangeStartPos + 1, $sign_maxlen); + break; + + case "out": + $res = "\n$id 0 obj\n<<\n"; + + $encrypted = $this->encrypted; + if ($encrypted) { + $this->encryptInit($id); + } + + $res .= "/ByteRange " .sprintf("[ %'.010d ********** ********** ********** ]\n", $id); + $res .= "/Contents <" . str_pad('', $sign_maxlen, '0') . ">\n"; + $res .= "/Filter/Adobe.PPKLite\n"; //PPKMS \n"; + $res .= "/Type/Sig/SubFilter/adbe.pkcs7.detached \n"; + + $date = "D:" . substr_replace(date('YmdHisO'), '\'', -2, 0) . '\''; + if ($encrypted) { + $date = $this->filterText($this->ARC4($date), false, false); + } + + $res .= "/M ($date)\n"; + $res .= "/Prop_Build << /App << /Name /DomPDF >> /Filter << /Name /Adobe.PPKLite >> >>\n"; + + $o = &$this->objects[$id]; + foreach ($o['info'] as $k => $v) { + switch ($k) { + case 'Name': + case 'Location': + case 'Reason': + case 'ContactInfo': + if ($v !== null && $v !== '') { + $res .= "/$k (" . + ($encrypted ? $this->filterText($this->ARC4($v), false, false) : $v) . ") \n"; + } + break; + } + } + $res .= ">>\nendobj"; + + return $res; + } + + return null; + } + + /** + * encryption object. + * + * @param $id + * @param $action + * @param string $options + * @return string|null + */ + protected function o_encryption($id, $action, $options = '') + { + switch ($action) { + case 'new': + // make the new object + $this->objects[$id] = ['t' => 'encryption', 'info' => $options]; + $this->arc4_objnum = $id; + break; + + case 'keys': + // figure out the additional parameters required + $pad = chr(0x28) . chr(0xBF) . chr(0x4E) . chr(0x5E) . chr(0x4E) . chr(0x75) . chr(0x8A) . chr(0x41) + . chr(0x64) . chr(0x00) . chr(0x4E) . chr(0x56) . chr(0xFF) . chr(0xFA) . chr(0x01) . chr(0x08) + . chr(0x2E) . chr(0x2E) . chr(0x00) . chr(0xB6) . chr(0xD0) . chr(0x68) . chr(0x3E) . chr(0x80) + . chr(0x2F) . chr(0x0C) . chr(0xA9) . chr(0xFE) . chr(0x64) . chr(0x53) . chr(0x69) . chr(0x7A); + + $info = $this->objects[$id]['info']; + + $len = mb_strlen($info['owner'], '8bit'); + + if ($len > 32) { + $owner = substr($info['owner'], 0, 32); + } else { + if ($len < 32) { + $owner = $info['owner'] . substr($pad, 0, 32 - $len); + } else { + $owner = $info['owner']; + } + } + + $len = mb_strlen($info['user'], '8bit'); + if ($len > 32) { + $user = substr($info['user'], 0, 32); + } else { + if ($len < 32) { + $user = $info['user'] . substr($pad, 0, 32 - $len); + } else { + $user = $info['user']; + } + } + + $tmp = $this->md5_16($owner); + $okey = substr($tmp, 0, 5); + $this->ARC4_init($okey); + $ovalue = $this->ARC4($user); + $this->objects[$id]['info']['O'] = $ovalue; + + // now make the u value, phew. + $tmp = $this->md5_16( + $user . $ovalue . chr($info['p']) . chr(255) . chr(255) . chr(255) . hex2bin($this->fileIdentifier) + ); + + $ukey = substr($tmp, 0, 5); + $this->ARC4_init($ukey); + $this->encryptionKey = $ukey; + $this->encrypted = true; + $uvalue = $this->ARC4($pad); + $this->objects[$id]['info']['U'] = $uvalue; + // initialize the arc4 array + break; + + case 'out': + $o = &$this->objects[$id]; + + $res = "\n$id 0 obj\n<<"; + $res .= "\n/Filter /Standard"; + $res .= "\n/V 1"; + $res .= "\n/R 2"; + $res .= "\n/O (" . $this->filterText($o['info']['O'], false, false) . ')'; + $res .= "\n/U (" . $this->filterText($o['info']['U'], false, false) . ')'; + // and the p-value needs to be converted to account for the twos-complement approach + $o['info']['p'] = (($o['info']['p'] ^ 255) + 1) * -1; + $res .= "\n/P " . ($o['info']['p']); + $res .= "\n>>\nendobj"; + + return $res; + } + + return null; + } + + protected function o_indirect_references($id, $action, $options = null) + { + switch ($action) { + case 'new': + case 'add': + if ($id === 0) { + $id = ++$this->numObj; + $this->o_catalog($this->catalogId, 'names', $id); + $this->objects[$id] = ['t' => 'indirect_references', 'info' => $options]; + $this->indirectReferenceId = $id; + } else { + $this->objects[$id]['info'] = array_merge($this->objects[$id]['info'], $options); + } + break; + case 'out': + $res = "\n$id 0 obj\n<< "; + + foreach ($this->objects[$id]['info'] as $referenceObjName => $referenceObjId) { + $res .= "/$referenceObjName $referenceObjId 0 R "; + } + + $res .= ">>\nendobj"; + return $res; + } + + return null; + } + + protected function o_names($id, $action, $options = null) + { + switch ($action) { + case 'new': + case 'add': + if ($id === 0) { + $id = ++$this->numObj; + $this->objects[$id] = ['t' => 'names', 'info' => [$options]]; + $this->o_indirect_references($this->indirectReferenceId, 'add', ['EmbeddedFiles' => $id]); + $this->embeddedFilesId = $id; + } else { + $this->objects[$id]['info'][] = $options; + } + break; + case 'out': + $info = &$this->objects[$id]['info']; + $res = ''; + if (count($info) > 0) { + $res = "\n$id 0 obj\n<< /Names [ "; + + if ($this->encrypted) { + $this->encryptInit($id); + } + + foreach ($info as $entry) { + if ($this->encrypted) { + $filename = $this->ARC4($entry['filename']); + } else { + $filename = $entry['filename']; + } + + $filename = $this->filterText($filename, false, false); + + $res .= "($filename) " . $entry['dict_reference'] . " 0 R "; + } + + $res .= "] >>\nendobj"; + } + return $res; + } + + return null; + } + + protected function o_embedded_file_dictionary($id, $action, $options = null) + { + switch ($action) { + case 'new': + $embeddedFileId = ++$this->numObj; + $options['embedded_reference'] = $embeddedFileId; + $this->objects[$id] = ['t' => 'embedded_file_dictionary', 'info' => $options]; + $this->o_embedded_file($embeddedFileId, 'new', $options); + $options['dict_reference'] = $id; + $this->o_names($this->embeddedFilesId, 'add', $options); + break; + case 'afRelationship': + $info = &$this->objects[$id]['info']; + $info["afRelationship"] = $options; + break; + case 'out': + $info = &$this->objects[$id]['info']; + $filename = $this->utf8toUtf16BE($info['filename']); + $description = $this->utf8toUtf16BE($info['description']); + + if ($this->encrypted) { + $this->encryptInit($id); + $filename = $this->ARC4($filename); + $description = $this->ARC4($description); + } + + $filename = $this->filterText($filename, false, false); + $description = $this->filterText($description, false, false); + + $res = "\n$id 0 obj\n<>"; + $res .= " >>\nendobj"; + return $res; + } + + return null; + } + + protected function o_embedded_file($id, $action, $options = null): ?string + { + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'embedded_file', 'info' => $options]; + break; + case 'out': + $info = &$this->objects[$id]['info']; + + $file_content = file_get_contents($info['filepath']); + $created = "D:". substr_replace(date('YmdHisO', filectime($info['filepath'])), '\'', -2, 0) . '\''; + $modified = "D:". substr_replace(date('YmdHisO', filemtime($info['filepath'])), '\'', -2, 0) . '\''; + $file_size = mb_strlen($file_content, '8bit'); + $checksum = md5($file_content); + if ($this->compressionReady && $this->options['compression']) { + $blocks = str_split($file_content, 8192); + $file_content = ''; + $deflateContext = deflate_init(ZLIB_ENCODING_DEFLATE, ['level' => 6]); + foreach ($blocks as $block) { + $file_content .= deflate_add($deflateContext, $block, ZLIB_NO_FLUSH); + } + $file_content .= deflate_add($deflateContext, '', ZLIB_FINISH); + $file_content_size = mb_strlen($file_content, '8bit'); + } else { + $file_content_size = $file_size; + } + + if ($this->encrypted) { + $this->encryptInit($id); + $file_content = $this->ARC4($file_content); + $file_content_size = mb_strlen($file_content, '8bit'); + $checksum = $this->filterText($this->ARC4($checksum), false, false); + $creation = $this->filterText($this->ARC4($creation), false, false); + $modified = $this->filterText($this->ARC4($modified), false, false); + } + + $res = "\n$id 0 obj\n<filterName($info['mimeType']); + } + if ($this->compressionReady && $this->options['compression']) { + $res .= " /Filter/FlateDecode"; + } + $res .= " /Length $file_content_size" . + "\n /Params <>" . + " >>\nstream\n$file_content\nendstream\nendobj"; + + return $res; + } + + return null; + } + + /** + * Enable PDF/A compliance mode + */ + public function enablePdfACompliance() + { + $this->pdfa = true; + + $iccProfilePath = __DIR__ . '/res/sRGB2014.icc'; + $this->o_catalog($this->catalogId, 'outputIntents', [ + 'iccProfileData' => file_get_contents($iccProfilePath), + 'iccProfileName' => basename($iccProfilePath), + 'colorComponentsCount' => '3', + ]); + } + + public function setAdditionalXmpRdf(string $xmlRDFContents): void + { + $this->additionalXmpRdf = $xmlRDFContents; + } + + /** + * Generate the Metadata XMP XML for PDF/A + * + * @return string + */ + function getXmpMetadata() + { + $md = << + + + + +3 +B + + + +EOT; + + $info = $this->objects[$this->infoObject]["info"]; + + if (isset($info['Title'])) { + $md .= "\n"; + $md .= htmlspecialchars($info['Title'], ENT_XML1, 'UTF-8'); + $md .= ""; + } + + if (isset($info['Author'])) { + $md .= "\n"; + $md .= htmlspecialchars($info['Author'], ENT_XML1, 'UTF-8'); + $md .= ""; + } + + if (isset($info['Subject'])) { + $md .= "\n"; + $md .= htmlspecialchars($info['Subject'], ENT_XML1, 'UTF-8'); + $md .= ""; + } + + $md .= "\n"; + $md .= "\n"; + + if (isset($info['Producer'])) { + $md .= "\n"; + $md .= htmlspecialchars($info['Producer'], ENT_XML1, 'UTF-8'); + $md .= ""; + } + + if (isset($info['Keywords'])) { + $md .= "\n"; + $md .= htmlspecialchars($info['Keywords'], ENT_XML1, 'UTF-8'); + $md .= ""; + } + + $md .= "\n"; + $md .= "\n"; + + if (isset($info['Creator'])) { + $md .= "\n"; + $md .= htmlspecialchars($info['Creator'], ENT_XML1, 'UTF-8'); + $md .= ""; + } + + if (isset($info['CreationDate']) && $date = $this->parsePdfDate($info['CreationDate'])) { + $md .= "\n"; + $md .= $date->format("Y-m-d\TH:i:sP"); + $md .= ""; + } + + if (isset($info['ModDate']) && $date = $this->parsePdfDate($info['ModDate'])) { + $md .= "\n"; + $md .= $date->format("Y-m-d\TH:i:sP"); + $md .= ""; + } + + $md .= "\n"; + $md .= $this->additionalXmpRdf; + $md .= "\n\n\n"; + + return $md; + } + + /** + * Parse a PDF formatted date + * + * @param string $date + * @return \DateTime|false + */ + function parsePdfDate($date) + { + $formats = [ + "Y", + "Ym", + "Ymd", + "YmdH", + "YmdHi", + "YmdHis", + "YmdHisO", + ]; + + $date = substr($date, 2); + $date = str_replace("'", "", $date); + + if ($i = strpos($date, "Z")) { + $date = substr($date, 0, $i + 1); + } + + foreach ($formats as $format) { + $parsedDate = \DateTime::createFromFormat($format, $date, new \DateTimeZone("UTC")); + + if ($parsedDate) return $parsedDate; + } + + return false; + } + + /** + * ARC4 functions + * A series of function to implement ARC4 encoding in PHP + */ + + /** + * calculate the 16 byte version of the 128 bit md5 digest of the string + * + * @param $string + * @return string + */ + function md5_16($string) + { + $tmp = md5($string); + $out = ''; + for ($i = 0; $i <= 30; $i = $i + 2) { + $out .= chr(hexdec(substr($tmp, $i, 2))); + } + + return $out; + } + + /** + * initialize the encryption for processing a particular object + * + * @param $id + */ + function encryptInit($id) + { + $tmp = $this->encryptionKey; + $hex = dechex($id); + if (mb_strlen($hex, '8bit') < 6) { + $hex = substr('000000', 0, 6 - mb_strlen($hex, '8bit')) . $hex; + } + $tmp .= chr(hexdec(substr($hex, 4, 2))) + . chr(hexdec(substr($hex, 2, 2))) + . chr(hexdec(substr($hex, 0, 2))) + . chr(0) + . chr(0) + ; + $key = $this->md5_16($tmp); + $this->ARC4_init(substr($key, 0, 10)); + } + + /** + * initialize the ARC4 encryption + * + * @param string $key + */ + function ARC4_init($key = '') + { + $this->arc4 = ''; + + // setup the control array + if (mb_strlen($key, '8bit') == 0) { + return; + } + + $k = ''; + while (mb_strlen($k, '8bit') < 256) { + $k .= $key; + } + + $k = substr($k, 0, 256); + for ($i = 0; $i < 256; $i++) { + $this->arc4 .= chr($i); + } + + $j = 0; + + for ($i = 0; $i < 256; $i++) { + $t = $this->arc4[$i]; + $j = ($j + ord($t) + ord($k[$i])) % 256; + $this->arc4[$i] = $this->arc4[$j]; + $this->arc4[$j] = $t; + } + } + + /** + * ARC4 encrypt a text string + * + * @param $text + * @return string + */ + function ARC4($text) + { + $len = mb_strlen($text, '8bit'); + $a = 0; + $b = 0; + $c = $this->arc4; + $out = ''; + for ($i = 0; $i < $len; $i++) { + $a = ($a + 1) % 256; + $t = $c[$a]; + $b = ($b + ord($t)) % 256; + $c[$a] = $c[$b]; + $c[$b] = $t; + $k = ord($c[(ord($c[$a]) + ord($c[$b])) % 256]); + $out .= chr(ord($text[$i]) ^ $k); + } + + return $out; + } + + /** + * functions which can be called to adjust or add to the document + */ + + /** + * add a link in the document to an external URL + * + * @param $url + * @param $x0 + * @param $y0 + * @param $x1 + * @param $y1 + */ + function addLink($url, $x0, $y0, $x1, $y1) + { + $this->numObj++; + $info = ['type' => 'link', 'url' => $url, 'rect' => [$x0, $y0, $x1, $y1]]; + $this->o_annotation($this->numObj, 'new', $info); + } + + /** + * add a link in the document to an internal destination (ie. within the document) + * + * @param $label + * @param $x0 + * @param $y0 + * @param $x1 + * @param $y1 + */ + function addInternalLink($label, $x0, $y0, $x1, $y1) + { + $this->numObj++; + $info = ['type' => 'ilink', 'label' => $label, 'rect' => [$x0, $y0, $x1, $y1]]; + $this->o_annotation($this->numObj, 'new', $info); + } + + /** + * set the encryption of the document + * can be used to turn it on and/or set the passwords which it will have. + * also the functions that the user will have are set here, such as print, modify, add + * + * @param string $userPass + * @param string $ownerPass + * @param array $pc + */ + function setEncryption($userPass = '', $ownerPass = '', $pc = []) + { + $p = bindec("11000000"); + + $options = ['print' => 4, 'modify' => 8, 'copy' => 16, 'add' => 32]; + + foreach ($pc as $k => $v) { + if ($v && isset($options[$k])) { + $p += $options[$k]; + } else { + if (isset($options[$v])) { + $p += $options[$v]; + } + } + } + + // implement encryption on the document + if (!isset($userPass)) { + $userPass = ""; + } + if ($this->arc4_objnum == 0) { + // then the block does not exist already, add it. + $this->numObj++; + if (!isset($ownerPass) || mb_strlen($ownerPass) === 0) { + $ownerPass = $userPass; + } + + $this->o_encryption($this->numObj, 'new', ['user' => $userPass, 'owner' => $ownerPass, 'p' => $p]); + } + } + + /** + * should be used for internal checks, not implemented as yet + */ + function checkAllHere() + { + } + + /** + * return the pdf stream as a string returned from the function + * + * @param bool $debug + * @return string + */ + function output($debug = false) + { + if ($debug) { + // turn compression off + $this->options['compression'] = false; + } + + if ($this->javascript) { + $this->numObj++; + + $js_id = $this->numObj; + $this->o_embedjs($js_id, 'new'); + $this->o_javascript(++$this->numObj, 'new', $this->javascript); + + $id = $this->catalogId; + + $this->o_indirect_references($this->indirectReferenceId, 'add', ['JavaScript' => $js_id]); + } + + if ($this->pdfa) { + $this->o_catalog($this->catalogId, 'metadata', $this->getXmpMetadata()); + } + + if ($this->fileIdentifier === '') { + $tmp = implode('', $this->objects[$this->infoObject]['info']); + $this->fileIdentifier = md5('DOMPDF' . __FILE__ . $tmp . microtime() . mt_rand()); + } + + if ($this->arc4_objnum) { + $this->o_encryption($this->arc4_objnum, 'keys'); + $this->ARC4_init($this->encryptionKey); + } + + $this->checkAllHere(); + + $xref = []; + $content = '%PDF-' . self::PDF_VERSION; + + if ($this->pdfa) { + // Force binary mode with 4 random bytes above 127 + $content .= "\n%" . chr(rand(128, 255)) . chr(rand(128, 255)) . chr(rand(128, 255)) . chr(rand(128, 255)); + } + + $pos = mb_strlen($content, '8bit'); + + // pre-process o_font objects before output of all objects + foreach ($this->objects as $k => $v) { + if ($v['t'] === 'font') { + $this->o_font($k, 'add'); + } + } + + foreach ($this->objects as $k => $v) { + $tmp = 'o_' . $v['t']; + $cont = $this->$tmp($k, 'out'); + $content .= $cont; + $xref[] = $pos + 1; //+1 to account for \n at the start of each object + $pos += mb_strlen($cont, '8bit'); + } + + $content .= "\nxref\n0 " . (count($xref) + 1) . "\n0000000000 65535 f \n"; + + foreach ($xref as $p) { + $content .= str_pad($p, 10, "0", STR_PAD_LEFT) . " 00000 n \n"; + } + + $content .= "trailer\n<<\n" . + '/Size ' . (count($xref) + 1) . "\n" . + '/Root 1 0 R' . "\n" . + '/Info ' . $this->infoObject . " 0 R\n" + ; + + // if encryption has been applied to this document then add the marker for this dictionary + if ($this->arc4_objnum > 0) { + $content .= '/Encrypt ' . $this->arc4_objnum . " 0 R\n"; + } + + $content .= '/ID[<' . $this->fileIdentifier . '><' . $this->fileIdentifier . ">]\n"; + + // account for \n added at start of xref table + $pos++; + + $content .= ">>\nstartxref\n$pos\n%%EOF\n"; + + if (count($this->byteRange) > 0) { + foreach ($this->byteRange as $k => $v) { + $tmp = 'o_' . $v['t']; + $this->$tmp($k, 'byterange', ['content' => &$content]); + } + } + + return $content; + } + + /** + * initialize a new document + * if this is called on an existing document results may be unpredictable, but the existing document would be lost at minimum + * this function is called automatically by the constructor function + * + * @param array $pageSize + */ + private function newDocument($pageSize = [0, 0, 612, 792]) + { + $this->numObj = 0; + $this->objects = []; + + $this->numObj++; + $this->o_catalog($this->numObj, 'new'); + + $this->numObj++; + $this->o_outlines($this->numObj, 'new'); + + $this->numObj++; + $this->o_pages($this->numObj, 'new'); + + $this->o_pages($this->numObj, 'mediaBox', $pageSize); + $this->currentNode = 3; + + $this->numObj++; + $this->o_procset($this->numObj, 'new'); + + $this->numObj++; + $this->o_info($this->numObj, 'new'); + + $this->numObj++; + $this->o_page($this->numObj, 'new'); + + // need to store the first page id as there is no way to get it to the user during + // startup + $this->firstPageId = $this->currentContents; + } + + /** + * open the font file and return a php structure containing it. + * first check if this one has been done before and saved in a form more suited to php + * note that if a php serialized version does not exist it will try and make one, but will + * require write access to the directory to do it... it is MUCH faster to have these serialized + * files. + * + * @param $font + */ + private function openFont($font) + { + // assume that $font contains the path and file but not the extension + $name = basename($font); + $dir = dirname($font); + + $fontcache = $this->fontcache; + if ($fontcache == '') { + $fontcache = $dir; + } + + //$name filename without folder and extension of font metrics + //$dir folder of font metrics + //$fontcache folder of runtime created php serialized version of font metrics. + // If this is not given, the same folder as the font metrics will be used. + // Storing and reusing serialized versions improves speed much + + $this->addMessage("openFont: $font - $name"); + + if (!$this->isUnicode || in_array(mb_strtolower(basename($name), "UTF-8"), self::$coreFonts)) { + $metrics_name = "$name.afm"; + } else { + $metrics_name = "$name.ufm"; + } + + $cache_name = "$metrics_name.json"; + $this->addMessage("metrics: $metrics_name, cache: $cache_name"); + + if (file_exists($fontcache . '/' . $cache_name)) { + $this->addMessage("openFont: json metrics file exists $fontcache/$cache_name"); + $cached_font_info = json_decode(file_get_contents($fontcache . '/' . $cache_name), true); + if (!isset($cached_font_info['_version_']) || $cached_font_info['_version_'] != $this->fontcacheVersion) { + $this->addMessage('openFont: font cache is out of date, regenerating'); + } else { + $this->fonts[$font] = $cached_font_info; + } + } + + if (!isset($this->fonts[$font]) && file_exists("$dir/$metrics_name")) { + // then rebuild the php_.afm file from the .afm file + $this->addMessage("openFont: build php file from $dir/$metrics_name"); + $data = []; + + // 20 => 'space' + $data['codeToName'] = []; + + // Since we're not going to enable Unicode for the core fonts we need to use a font-based + // setting for Unicode support rather than a global setting. + $data['isUnicode'] = (strtolower(substr($metrics_name, -3)) !== 'afm'); + + $cidtogid = ''; + if ($data['isUnicode']) { + $cidtogid = str_pad('', 256 * 256 * 2, "\x00"); + } + + $file = file("$dir/$metrics_name"); + + foreach ($file as $rowA) { + $row = trim($rowA); + $pos = strpos($row, ' '); + + if ($pos) { + // then there must be some keyword + $key = substr($row, 0, $pos); + switch ($key) { + case 'FontName': + case 'FullName': + case 'FamilyName': + case 'PostScriptName': + case 'Weight': + case 'ItalicAngle': + case 'IsFixedPitch': + case 'CharacterSet': + case 'UnderlinePosition': + case 'UnderlineThickness': + case 'Version': + case 'EncodingScheme': + case 'CapHeight': + case 'XHeight': + case 'Ascender': + case 'Descender': + case 'StdHW': + case 'StdVW': + case 'StartCharMetrics': + case 'FontHeightOffset': // OAR - Added so we can offset the height calculation of a Windows font. Otherwise it's too big. + $data[$key] = trim(substr($row, $pos)); + break; + + case 'FontBBox': + $data[$key] = explode(' ', trim(substr($row, $pos))); + break; + + //C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ; + case 'C': // Found in AFM files + $bits = explode(';', trim($row)); + $dtmp = ['C' => null, 'N' => null, 'WX' => null, 'B' => []]; + + foreach ($bits as $bit) { + $bits2 = explode(' ', trim($bit)); + if (mb_strlen($bits2[0], '8bit') == 0) { + continue; + } + + if (count($bits2) > 2) { + $dtmp[$bits2[0]] = []; + for ($i = 1; $i < count($bits2); $i++) { + $dtmp[$bits2[0]][] = $bits2[$i]; + } + } else { + if (count($bits2) == 2) { + $dtmp[$bits2[0]] = $bits2[1]; + } + } + } + + $c = (int)$dtmp['C']; + $n = $dtmp['N']; + $width = floatval($dtmp['WX']); + + if ($c >= 0) { + if (!ctype_xdigit($n) || $c != hexdec($n)) { + $data['codeToName'][$c] = $n; + } + $data['C'][$c] = $width; + } elseif (isset($n)) { + $data['C'][$n] = $width; + } + + if (!isset($data['MissingWidth']) && $c === -1 && $n === '.notdef') { + $data['MissingWidth'] = $width; + } + + break; + + // U 827 ; WX 0 ; N squaresubnosp ; G 675 ; + case 'U': // Found in UFM files + if (!$data['isUnicode']) { + break; + } + + $bits = explode(';', trim($row)); + $dtmp = ['G' => null, 'N' => null, 'U' => null, 'WX' => null]; + + foreach ($bits as $bit) { + $bits2 = explode(' ', trim($bit)); + if (mb_strlen($bits2[0], '8bit') === 0) { + continue; + } + + if (count($bits2) > 2) { + $dtmp[$bits2[0]] = []; + for ($i = 1; $i < count($bits2); $i++) { + $dtmp[$bits2[0]][] = $bits2[$i]; + } + } else { + if (count($bits2) == 2) { + $dtmp[$bits2[0]] = $bits2[1]; + } + } + } + + $c = (int)$dtmp['U']; + $n = $dtmp['N']; + $glyph = $dtmp['G']; + $width = floatval($dtmp['WX']); + + if ($c >= 0) { + // Set values in CID to GID map + if ($c >= 0 && $c < 0xFFFF && $glyph) { + $cidtogid[$c * 2] = chr($glyph >> 8); + $cidtogid[$c * 2 + 1] = chr($glyph & 0xFF); + } + + if (!ctype_xdigit($n) || $c != hexdec($n)) { + $data['codeToName'][$c] = $n; + } + $data['C'][$c] = $width; + } elseif (isset($n)) { + $data['C'][$n] = $width; + } + + if (!isset($data['MissingWidth']) && $c === -1 && $n === '.notdef') { + $data['MissingWidth'] = $width; + } + + break; + + case 'KPX': + break; // don't include them as they are not used yet + //KPX Adieresis yacute -40 + /*$bits = explode(' ', trim($row)); + $data['KPX'][$bits[1]][$bits[2]] = $bits[3]; + break;*/ + } + } + } + + if ($this->compressionReady && $this->options['compression']) { + // then implement ZLIB based compression on CIDtoGID string + $data['CIDtoGID_Compressed'] = true; + $cidtogid = gzcompress($cidtogid, 6); + } + $data['CIDtoGID'] = base64_encode($cidtogid); + $data['_version_'] = $this->fontcacheVersion; + $this->fonts[$font] = $data; + + //Because of potential trouble with php safe mode, expect that the folder already exists. + //If not existing, this will hit performance because of missing cached results. + if (is_dir($fontcache) && is_writable($fontcache)) { + file_put_contents("$fontcache/$cache_name", json_encode($data, JSON_PRETTY_PRINT)); + } + $data = null; + } + + if (!isset($this->fonts[$font])) { + $this->addMessage("openFont: no font file found for $font. Do you need to run load_font.php?"); + } + } + + /** + * if the font is not loaded then load it and make the required object + * else just make it the current font + * the encoding array can contain 'encoding'=> 'none','WinAnsiEncoding','MacRomanEncoding' or 'MacExpertEncoding' + * note that encoding='none' will need to be used for symbolic fonts + * and 'differences' => an array of mappings between numbers 0->255 and character names. + * + * @param string $fontName + * @param string $encoding + * @param bool $set + * @param bool $isSubsetting + * @return int + * @throws FontNotFoundException + */ + function selectFont($fontName, $encoding = '', $set = true, $isSubsetting = true) + { + $fontName = (string) $fontName; + $ext = substr($fontName, -4); + if ($ext === '.afm' || $ext === '.ufm') { + $fontName = mb_substr($fontName, 0, mb_strlen($fontName, "UTF-8") - 4, "UTF-8"); + } + if ($fontName === '') { + return $this->currentFontNum; + } + + if (!isset($this->fonts[$fontName])) { + $this->addMessage("selectFont: selecting - $fontName - $encoding, $set"); + + // load the file + $this->openFont($fontName); + + if (isset($this->fonts[$fontName])) { + $this->numObj++; + $this->numFonts++; + + $font = &$this->fonts[$fontName]; + + $name = basename($fontName); + $options = ['name' => $name, 'fontFileName' => $fontName, 'isSubsetting' => $isSubsetting]; + + if (is_array($encoding)) { + // then encoding and differences might be set + if (isset($encoding['encoding'])) { + $options['encoding'] = $encoding['encoding']; + } + + if (isset($encoding['differences'])) { + $options['differences'] = $encoding['differences']; + } + } else { + if (mb_strlen($encoding, '8bit')) { + // then perhaps only the encoding has been set + $options['encoding'] = $encoding; + } + } + + $this->o_font($this->numObj, 'new', $options); + + if (file_exists("$fontName.ttf")) { + $fileSuffix = 'ttf'; + } elseif (file_exists("$fontName.TTF")) { + $fileSuffix = 'TTF'; + } elseif (file_exists("$fontName.pfb")) { + $fileSuffix = 'pfb'; + } elseif (file_exists("$fontName.PFB")) { + $fileSuffix = 'PFB'; + } else { + $fileSuffix = ''; + } + + $font['fileSuffix'] = $fileSuffix; + + $font['fontNum'] = $this->numFonts; + $font['isSubsetting'] = $isSubsetting && $font['isUnicode'] && strtolower($fileSuffix) === 'ttf'; + + // also set the differences here, note that this means that these will take effect only the + //first time that a font is selected, else they are ignored + if (isset($options['differences'])) { + $font['differences'] = $options['differences']; + } + } + } + + if ($set && isset($this->fonts[$fontName])) { + // so if for some reason the font was not set in the last one then it will not be selected + $this->currentBaseFont = $fontName; + + // the next lines mean that if a new font is selected, then the current text state will be + // applied to it as well. + $this->currentFont = $this->currentBaseFont; + $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum']; + } + + return $this->currentFontNum; + } + + /** + * sets up the current font, based on the font families, and the current text state + * note that this system is quite flexible, a bold-italic font can be completely different to a + * italic-bold font, and even bold-bold will have to be defined within the family to have meaning + * This function is to be called whenever the currentTextState is changed, it will update + * the currentFont setting to whatever the appropriate family one is. + * If the user calls selectFont themselves then that will reset the currentBaseFont, and the currentFont + * This function will change the currentFont to whatever it should be, but will not change the + * currentBaseFont. + */ + private function setCurrentFont() + { + // if (strlen($this->currentBaseFont) == 0){ + // // then assume an initial font + // $this->selectFont($this->defaultFont); + // } + // $cf = substr($this->currentBaseFont,strrpos($this->currentBaseFont,'/')+1); + // if (strlen($this->currentTextState) + // && isset($this->fontFamilies[$cf]) + // && isset($this->fontFamilies[$cf][$this->currentTextState])){ + // // then we are in some state or another + // // and this font has a family, and the current setting exists within it + // // select the font, then return it + // $nf = substr($this->currentBaseFont,0,strrpos($this->currentBaseFont,'/')+1).$this->fontFamilies[$cf][$this->currentTextState]; + // $this->selectFont($nf,'',0); + // $this->currentFont = $nf; + // $this->currentFontNum = $this->fonts[$nf]['fontNum']; + // } else { + // // the this font must not have the right family member for the current state + // // simply assume the base font + $this->currentFont = $this->currentBaseFont; + $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum']; + // } + } + + /** + * function for the user to find out what the ID is of the first page that was created during + * startup - useful if they wish to add something to it later. + * + * @return int + */ + function getFirstPageId() + { + return $this->firstPageId; + } + + /** + * add content to the currently active object + * + * @param $content + */ + private function addContent($content) + { + $this->objects[$this->currentContents]['c'] .= $content; + } + + /** + * sets the color for fill operations + * + * @param array $color + * @param bool $force + * @throws Exception + */ + function setColor($color, $force = false) + { + $new_color = [$color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null]; + + if (!$force && $this->currentColor == $new_color) { + return; + } + + if (isset($new_color[3])) { + if ($this->pdfa) { + throw new \Exception("CMYK colors are not supported when generating a document in PDF/A mode"); + } + $this->currentColor = $new_color; + $this->addContent(vsprintf("\n%.3F %.3F %.3F %.3F k", $this->currentColor)); + } else { + if (isset($new_color[2])) { + $this->currentColor = $new_color; + $this->addContent(vsprintf("\n%.3F %.3F %.3F rg", $this->currentColor)); + } + } + } + + /** + * sets the color for fill operations + * + * @param string $fillRule + */ + function setFillRule($fillRule) + { + if (!in_array($fillRule, ["nonzero", "evenodd"])) { + return; + } + + $this->fillRule = $fillRule; + } + + /** + * sets the color for stroke operations + * + * @param array $color + * @param bool $force + * @throws Exception + */ + function setStrokeColor($color, $force = false) + { + $new_color = [$color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null]; + + if (!$force && $this->currentStrokeColor == $new_color) { + return; + } + + if (isset($new_color[3])) { + if ($this->pdfa) { + throw new \Exception("CMYK colors are not supported when generating a document in PDF/A mode"); + } + $this->currentStrokeColor = $new_color; + $this->addContent(vsprintf("\n%.3F %.3F %.3F %.3F K", $this->currentStrokeColor)); + } else { + if (isset($new_color[2])) { + $this->currentStrokeColor = $new_color; + $this->addContent(vsprintf("\n%.3F %.3F %.3F RG", $this->currentStrokeColor)); + } + } + } + + /** + * Set the graphics state for compositions + * + * @param $parameters + */ + function setGraphicsState($parameters) + { + // Create a new graphics state object if necessary + if (($gstate = array_search($parameters, $this->gstates)) === false) { + $this->numObj++; + $this->o_extGState($this->numObj, 'new', $parameters); + $gstate = $this->numStates; + $this->gstates[$gstate] = $parameters; + } + $this->addContent("\n/GS$gstate gs"); + } + + /** + * Set current blend mode & opacity for lines. + * + * Valid blend modes are: + * + * Normal, Multiply, Screen, Overlay, Darken, Lighten, + * ColorDogde, ColorBurn, HardLight, SoftLight, Difference, + * Exclusion + * + * @param string $mode The blend mode to use + * @param float $opacity 0.0 fully transparent, 1.0 fully opaque + */ + public function setLineTransparency(string $mode, float $opacity): void + { + static $blendModes = [ + "Normal", + "Multiply", + "Screen", + "Overlay", + "Darken", + "Lighten", + "ColorDogde", + "ColorBurn", + "HardLight", + "SoftLight", + "Difference", + "Exclusion" + ]; + + if (!in_array($mode, $blendModes, true)) { + $mode = "Normal"; + } + + $newState = [ + "mode" => $mode, + "opacity" => $opacity + ]; + + if ($newState === $this->currentLineTransparency) { + return; + } + + $this->currentLineTransparency = $newState; + + $options = [ + "BM" => "/$mode", + "CA" => $opacity + ]; + + $this->setGraphicsState($options); + } + + /** + * Set current blend mode & opacity for filled objects. + * + * Valid blend modes are: + * + * Normal, Multiply, Screen, Overlay, Darken, Lighten, + * ColorDogde, ColorBurn, HardLight, SoftLight, Difference, + * Exclusion + * + * @param string $mode The blend mode to use + * @param float $opacity 0.0 fully transparent, 1.0 fully opaque + */ + public function setFillTransparency(string $mode, float $opacity): void + { + static $blendModes = [ + "Normal", + "Multiply", + "Screen", + "Overlay", + "Darken", + "Lighten", + "ColorDogde", + "ColorBurn", + "HardLight", + "SoftLight", + "Difference", + "Exclusion" + ]; + + if (!in_array($mode, $blendModes, true)) { + $mode = "Normal"; + } + + $newState = [ + "mode" => $mode, + "opacity" => $opacity + ]; + + if ($newState === $this->currentFillTransparency) { + return; + } + + $this->currentFillTransparency = $newState; + + $options = [ + "BM" => "/$mode", + "ca" => $opacity, + ]; + + $this->setGraphicsState($options); + } + + /** + * draw a line from one set of coordinates to another + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @param bool $stroke + */ + function line($x1, $y1, $x2, $y2, $stroke = true) + { + $this->addContent(sprintf("\n%.3F %.3F m %.3F %.3F l", $x1, $y1, $x2, $y2)); + + if ($stroke) { + $this->addContent(' S'); + } + } + + /** + * draw a bezier curve based on 4 control points + * + * @param float $x0 + * @param float $y0 + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @param float $x3 + * @param float $y3 + */ + function curve($x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3) + { + // in the current line style, draw a bezier curve from (x0,y0) to (x3,y3) using the other two points + // as the control points for the curve. + $this->addContent( + sprintf("\n%.3F %.3F m %.3F %.3F %.3F %.3F %.3F %.3F c S", $x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3) + ); + } + + /** + * draw a part of an ellipse + * + * @param float $x0 + * @param float $y0 + * @param float $astart + * @param float $afinish + * @param float $r1 + * @param float $r2 + * @param float $angle + * @param int $nSeg + */ + function partEllipse($x0, $y0, $astart, $afinish, $r1, $r2 = 0, $angle = 0, $nSeg = 8) + { + $this->ellipse($x0, $y0, $r1, $r2, $angle, $nSeg, $astart, $afinish, false); + } + + /** + * draw a filled ellipse + * + * @param float $x0 + * @param float $y0 + * @param float $r1 + * @param float $r2 + * @param float $angle + * @param int $nSeg + * @param float $astart + * @param float $afinish + */ + function filledEllipse($x0, $y0, $r1, $r2 = 0, $angle = 0, $nSeg = 8, $astart = 0, $afinish = 360) + { + $this->ellipse($x0, $y0, $r1, $r2, $angle, $nSeg, $astart, $afinish, true, true); + } + + /** + * @param float $x + * @param float $y + */ + function lineTo($x, $y) + { + $this->addContent(sprintf("\n%.3F %.3F l", $x, $y)); + } + + /** + * @param float $x + * @param float $y + */ + function moveTo($x, $y) + { + $this->addContent(sprintf("\n%.3F %.3F m", $x, $y)); + } + + /** + * draw a bezier curve based on 4 control points + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @param float $x3 + * @param float $y3 + */ + function curveTo($x1, $y1, $x2, $y2, $x3, $y3) + { + $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F %.3F %.3F c", $x1, $y1, $x2, $y2, $x3, $y3)); + } + + /** + * draw a bezier curve based on 4 control points + * + * @param float $cpx + * @param float $cpy + * @param float $x + * @param float $y + */ + function quadTo($cpx, $cpy, $x, $y) + { + $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F v", $cpx, $cpy, $x, $y)); + } + + function closePath() + { + $this->addContent(' h'); + } + + function endPath() + { + $this->addContent(' n'); + } + + /** + * draw an ellipse + * note that the part and filled ellipse are just special cases of this function + * + * draws an ellipse in the current line style + * centered at $x0,$y0, radii $r1,$r2 + * if $r2 is not set, then a circle is drawn + * from $astart to $afinish, measured in degrees, running anti-clockwise from the right hand side of the ellipse. + * nSeg is not allowed to be less than 2, as this will simply draw a line (and will even draw a + * pretty crappy shape at 2, as we are approximating with bezier curves. + * + * @param float $x0 + * @param float $y0 + * @param float $r1 + * @param float $r2 + * @param float $angle + * @param int $nSeg + * @param float $astart + * @param float $afinish + * @param bool $close + * @param bool $fill + * @param bool $stroke + * @param bool $incomplete + */ + function ellipse( + $x0, + $y0, + $r1, + $r2 = 0, + $angle = 0, + $nSeg = 8, + $astart = 0, + $afinish = 360, + $close = true, + $fill = false, + $stroke = true, + $incomplete = false + ) { + if ($r1 == 0) { + return; + } + + if ($r2 == 0) { + $r2 = $r1; + } + + if ($nSeg < 2) { + $nSeg = 2; + } + + $astart = deg2rad((float)$astart); + $afinish = deg2rad((float)$afinish); + $totalAngle = $afinish - $astart; + + $dt = $totalAngle / $nSeg; + $dtm = $dt / 3; + + if ($angle != 0) { + $a = -1 * deg2rad((float)$angle); + + $this->addContent( + sprintf("\n q %.3F %.3F %.3F %.3F %.3F %.3F cm", cos($a), -sin($a), sin($a), cos($a), $x0, $y0) + ); + + $x0 = 0; + $y0 = 0; + } + + $t1 = $astart; + $a0 = $x0 + $r1 * cos($t1); + $b0 = $y0 + $r2 * sin($t1); + $c0 = -$r1 * sin($t1); + $d0 = $r2 * cos($t1); + + if (!$incomplete) { + $this->addContent(sprintf("\n%.3F %.3F m ", $a0, $b0)); + } + + for ($i = 1; $i <= $nSeg; $i++) { + // draw this bit of the total curve + $t1 = $i * $dt + $astart; + $a1 = $x0 + $r1 * cos($t1); + $b1 = $y0 + $r2 * sin($t1); + $c1 = -$r1 * sin($t1); + $d1 = $r2 * cos($t1); + + $this->addContent( + sprintf( + "\n%.3F %.3F %.3F %.3F %.3F %.3F c", + ($a0 + $c0 * $dtm), + ($b0 + $d0 * $dtm), + ($a1 - $c1 * $dtm), + ($b1 - $d1 * $dtm), + $a1, + $b1 + ) + ); + + $a0 = $a1; + $b0 = $b1; + $c0 = $c1; + $d0 = $d1; + } + + if (!$incomplete) { + if ($fill) { + $this->addContent(' f'); + } + + if ($stroke) { + if ($close) { + $this->addContent(' s'); // small 's' signifies closing the path as well + } else { + $this->addContent(' S'); + } + } + } + + if ($angle != 0) { + $this->addContent(' Q'); + } + } + + /** + * this sets the line drawing style. + * width, is the thickness of the line in user units + * cap is the type of cap to put on the line, values can be 'butt','round','square' + * where the diffference between 'square' and 'butt' is that 'square' projects a flat end past the + * end of the line. + * join can be 'miter', 'round', 'bevel' + * dash is an array which sets the dash pattern, is a series of length values, which are the lengths of the + * on and off dashes. + * (2) represents 2 on, 2 off, 2 on , 2 off ... + * (2,1) is 2 on, 1 off, 2 on, 1 off.. etc + * phase is a modifier on the dash pattern which is used to shift the point at which the pattern starts. + * + * @param float $width + * @param string $cap + * @param string $join + * @param array $dash + * @param int $phase + */ + function setLineStyle($width = 1, $cap = '', $join = '', $dash = '', $phase = 0) + { + // this is quite inefficient in that it sets all the parameters whenever 1 is changed, but will fix another day + $string = ''; + + if ($width > 0) { + $string .= "$width w"; + } + + $ca = ['butt' => 0, 'round' => 1, 'square' => 2]; + + if (isset($ca[$cap])) { + $string .= " $ca[$cap] J"; + } + + $ja = ['miter' => 0, 'round' => 1, 'bevel' => 2]; + + if (isset($ja[$join])) { + $string .= " $ja[$join] j"; + } + + if (is_array($dash)) { + $string .= ' [ ' . implode(' ', $dash) . " ] $phase d"; + } + + if ($string === $this->currentLineStyle) { + return; + } + + $this->currentLineStyle = $string; + $this->addContent("\n$string"); + } + + /** + * draw a polygon, the syntax for this is similar to the GD polygon command + * + * @param float[] $p + * @param bool $fill + */ + public function polygon(array $p, bool $fill = false): void + { + $this->addContent(sprintf("\n%.3F %.3F m ", $p[0], $p[1])); + + $n = count($p); + for ($i = 2; $i < $n; $i = $i + 2) { + $this->addContent(sprintf("%.3F %.3F l ", $p[$i], $p[$i + 1])); + } + + if ($fill) { + $this->addContent(' f'); + } else { + $this->addContent(' S'); + } + } + + /** + * a filled rectangle, note that it is the width and height of the rectangle which are the secondary parameters, not + * the coordinates of the upper-right corner + * + * @param float $x1 + * @param float $y1 + * @param float $width + * @param float $height + */ + function filledRectangle($x1, $y1, $width, $height) + { + $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re f", $x1, $y1, $width, $height)); + } + + /** + * draw a rectangle, note that it is the width and height of the rectangle which are the secondary parameters, not + * the coordinates of the upper-right corner + * + * @param float $x1 + * @param float $y1 + * @param float $width + * @param float $height + */ + function rectangle($x1, $y1, $width, $height) + { + $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re S", $x1, $y1, $width, $height)); + } + + /** + * draw a rectangle, note that it is the width and height of the rectangle which are the secondary parameters, not + * the coordinates of the upper-right corner + * + * @param float $x1 + * @param float $y1 + * @param float $width + * @param float $height + */ + function rect($x1, $y1, $width, $height) + { + $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re", $x1, $y1, $width, $height)); + } + + function stroke(bool $close = false) + { + $this->addContent("\n" . ($close ? "s" : "S")); + } + + function fill() + { + $this->addContent("\nf" . ($this->fillRule === "evenodd" ? "*" : "")); + } + + function fillStroke(bool $close = false) + { + $this->addContent("\n" . ($close ? "b" : "B") . ($this->fillRule === "evenodd" ? "*" : "")); + } + + /** + * @param string $subtype + * @param integer $x + * @param integer $y + * @param integer $w + * @param integer $h + * @return int + */ + function addXObject($subtype, $x, $y, $w, $h) + { + $id = ++$this->numObj; + $this->o_xobject($id, 'new', ['Subtype' => $subtype, 'bbox' => [$x, $y, $w, $h]]); + return $id; + } + + /** + * @param integer $numXObject + * @param string $type + * @param array $options + */ + function setXObjectResource($numXObject, $type, $options) + { + if (in_array($type, ['procset', 'font', 'xObject'])) { + $this->o_xobject($numXObject, $type, $options); + } + } + + /** + * add signature + * + * $fieldSigId = $cpdf->addFormField(Cpdf::ACROFORM_FIELD_SIG, 'Signature1', 0, 0, 0, 0, 0); + * + * $signatureId = $cpdf->addSignature([ + * 'signcert' => file_get_contents('dompdf.crt'), + * 'privkey' => file_get_contents('dompdf.key'), + * 'password' => 'password', + * 'name' => 'DomPDF DEMO', + * 'location' => 'Home', + * 'reason' => 'First Form', + * 'contactinfo' => 'info' + * ]); + * $cpdf->setFormFieldValue($fieldSigId, "$signatureId 0 R"); + * + * @param string $signcert + * @param string $privkey + * @param string $password + * @param string|null $name + * @param string|null $location + * @param string|null $reason + * @param string|null $contactinfo + * @return int + */ + function addSignature($signcert, $privkey, $password = '', $name = null, $location = null, $reason = null, $contactinfo = null) { + $sigId = ++$this->numObj; + $this->o_sig($sigId, 'new', [ + 'SignCert' => $signcert, + 'PrivKey' => $privkey, + 'Password' => $password, + 'Name' => $name, + 'Location' => $location, + 'Reason' => $reason, + 'ContactInfo' => $contactinfo + ]); + + return $sigId; + } + + /** + * add field to form + * + * @param string $type ACROFORM_FIELD_* + * @param string $name + * @param $x0 + * @param $y0 + * @param $x1 + * @param $y1 + * @param integer $ff Field Flag ACROFORM_FIELD_*_* + * @param float $size + * @param array $color + * @return int + */ + public function addFormField($type, $name, $x0, $y0, $x1, $y1, $ff = 0, $size = 10.0, $color = [0, 0, 0]) + { + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + $color = implode(' ', $color) . ' rg'; + + $currentFontNum = $this->currentFontNum; + $font = array_filter( + $this->objects[$this->currentNode]['info']['fonts'], + function ($item) use ($currentFontNum) { return $item['fontNum'] == $currentFontNum; } + ); + + $this->o_acroform($this->acroFormId, 'font', + ['objNum' => $font[0]['objNum'], 'fontNum' => $font[0]['fontNum']]); + + $fieldId = ++$this->numObj; + $this->o_field($fieldId, 'new', [ + 'rect' => [$x0, $y0, $x1, $y1], + 'F' => 4, + 'FT' => "/$type", + 'T' => $name, + 'Ff' => $ff, + 'pageid' => $this->currentPage, + 'da' => "$color /F$this->currentFontNum " . sprintf('%.1F Tf ', $size) + ]); + + return $fieldId; + } + + /** + * set Field value + * + * @param integer $numFieldObj + * @param string $value + */ + public function setFormFieldValue($numFieldObj, $value) + { + $this->o_field($numFieldObj, 'set', ['value' => $value]); + } + + /** + * set Field value (reference) + * + * @param integer $numFieldObj + * @param integer $numObj Object number + */ + public function setFormFieldRefValue($numFieldObj, $numObj) + { + $this->o_field($numFieldObj, 'set', ['refvalue' => $numObj]); + } + + /** + * set Field Appearanc (reference) + * + * @param integer $numFieldObj + * @param integer $normalNumObj + * @param integer|null $rolloverNumObj + * @param integer|null $downNumObj + */ + public function setFormFieldAppearance($numFieldObj, $normalNumObj, $rolloverNumObj = null, $downNumObj = null) + { + $appearance['N'] = $normalNumObj; + + if ($rolloverNumObj !== null) { + $appearance['R'] = $rolloverNumObj; + } + + if ($downNumObj !== null) { + $appearance['D'] = $downNumObj; + } + + $this->o_field($numFieldObj, 'set', ['appearance' => $appearance]); + } + + /** + * set Choice Field option values + * + * @param integer $numFieldObj + * @param array $value + */ + public function setFormFieldOpt($numFieldObj, $value) + { + $this->o_field($numFieldObj, 'set', ['options' => $value]); + } + + /** + * add form to document + * + * @param integer $sigFlags + * @param boolean $needAppearances + */ + public function addForm($sigFlags = 0, $needAppearances = false) + { + $this->acroFormId = ++$this->numObj; + $this->o_acroform($this->acroFormId, 'new', [ + 'NeedAppearances' => $needAppearances ? 'true' : 'false', + 'SigFlags' => $sigFlags + ]); + } + + /** + * save the current graphic state + */ + function save() + { + $this->addContent("\nq"); + } + + /** + * restore the last graphic state + */ + function restore() + { + // Reset color and transparency caches, as any changes to the graphics + // state since saving will be discarded + $this->currentColor = null; + $this->currentStrokeColor = null; + $this->currentLineStyle = ''; + $this->currentLineTransparency = null; + $this->currentFillTransparency = null; + $this->addContent("\nQ"); + } + + /** + * draw a clipping rectangle, all the elements added after this will be clipped + * + * @param float $x1 + * @param float $y1 + * @param float $width + * @param float $height + */ + function clippingRectangle($x1, $y1, $width, $height) + { + $this->save(); + $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re W n", $x1, $y1, $width, $height)); + } + + /** + * draw a clipping rounded rectangle, all the elements added after this will be clipped + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + * @param float $rTL + * @param float $rTR + * @param float $rBR + * @param float $rBL + */ + function clippingRectangleRounded($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL) + { + $this->save(); + + // start: top edge, left end + $this->addContent(sprintf("\n%.3F %.3F m ", $x1, $y1 - $rTL + $h)); + + // line: bottom edge, left end + $this->addContent(sprintf("\n%.3F %.3F l ", $x1, $y1 + $rBL)); + + // curve: bottom-left corner + $this->ellipse($x1 + $rBL, $y1 + $rBL, $rBL, 0, 0, 8, 180, 270, false, false, false, true); + + // line: right edge, bottom end + $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $w - $rBR, $y1)); + + // curve: bottom-right corner + $this->ellipse($x1 + $w - $rBR, $y1 + $rBR, $rBR, 0, 0, 8, 270, 360, false, false, false, true); + + // line: right edge, top end + $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $w, $y1 + $h - $rTR)); + + // curve: bottom-right corner + $this->ellipse($x1 + $w - $rTR, $y1 + $h - $rTR, $rTR, 0, 0, 8, 0, 90, false, false, false, true); + + // line: bottom edge, right end + $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $rTL, $y1 + $h)); + + // curve: top-right corner + $this->ellipse($x1 + $rTL, $y1 + $h - $rTL, $rTL, 0, 0, 8, 90, 180, false, false, false, true); + + // line: top edge, left end + $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $rBL, $y1)); + + // Close & clip + $this->addContent(" W n"); + } + + /** + * draw a clipping polygon, the syntax for this is similar to the GD polygon command + * + * @param float[] $p + */ + public function clippingPolygon(array $p): void + { + $this->save(); + + $this->addContent(sprintf("\n%.3F %.3F m ", $p[0], $p[1])); + + $n = count($p); + for ($i = 2; $i < $n; $i = $i + 2) { + $this->addContent(sprintf("%.3F %.3F l ", $p[$i], $p[$i + 1])); + } + + $this->addContent("W n"); + } + + /** + * ends the last clipping shape + */ + function clippingEnd() + { + $this->restore(); + } + + /** + * scale + * + * @param float $s_x scaling factor for width as percent + * @param float $s_y scaling factor for height as percent + * @param float $x Origin abscissa + * @param float $y Origin ordinate + */ + function scale($s_x, $s_y, $x, $y) + { + $y = $this->currentPageSize["height"] - $y; + + $tm = [ + $s_x, + 0, + 0, + $s_y, + $x * (1 - $s_x), + $y * (1 - $s_y) + ]; + + $this->transform($tm); + } + + /** + * translate + * + * @param float $t_x movement to the right + * @param float $t_y movement to the bottom + */ + function translate($t_x, $t_y) + { + $tm = [ + 1, + 0, + 0, + 1, + $t_x, + -$t_y + ]; + + $this->transform($tm); + } + + /** + * rotate + * + * @param float $angle angle in degrees for counter-clockwise rotation + * @param float $x Origin abscissa + * @param float $y Origin ordinate + */ + function rotate($angle, $x, $y) + { + $y = $this->currentPageSize["height"] - $y; + + $a = deg2rad($angle); + $cos_a = cos($a); + $sin_a = sin($a); + + $tm = [ + $cos_a, + -$sin_a, + $sin_a, + $cos_a, + $x - $sin_a * $y - $cos_a * $x, + $y - $cos_a * $y + $sin_a * $x, + ]; + + $this->transform($tm); + } + + /** + * skew + * + * @param float $angle_x + * @param float $angle_y + * @param float $x Origin abscissa + * @param float $y Origin ordinate + */ + function skew($angle_x, $angle_y, $x, $y) + { + $y = $this->currentPageSize["height"] - $y; + + $tan_x = tan(deg2rad($angle_x)); + $tan_y = tan(deg2rad($angle_y)); + + $tm = [ + 1, + -$tan_y, + -$tan_x, + 1, + $tan_x * $y, + $tan_y * $x, + ]; + + $this->transform($tm); + } + + /** + * apply graphic transformations + * + * @param array $tm transformation matrix + */ + function transform($tm) + { + $this->addContent(vsprintf("\n %.3F %.3F %.3F %.3F %.3F %.3F cm", $tm)); + } + + /** + * add a new page to the document + * this also makes the new page the current active object + * + * @param int $insert + * @param int $id + * @param string $pos + * @return int + */ + function newPage($insert = 0, $id = 0, $pos = 'after') + { + // if there is a state saved, then go up the stack closing them + // then on the new page, re-open them with the right setings + + if ($this->nStateStack) { + for ($i = $this->nStateStack; $i >= 1; $i--) { + $this->restoreState($i); + } + } + + $this->numObj++; + + if ($insert) { + // the id from the ezPdf class is the id of the contents of the page, not the page object itself + // query that object to find the parent + $rid = $this->objects[$id]['onPage']; + $opt = ['rid' => $rid, 'pos' => $pos]; + $this->o_page($this->numObj, 'new', $opt); + } else { + $this->o_page($this->numObj, 'new'); + } + + // if there is a stack saved, then put that onto the page + if ($this->nStateStack) { + for ($i = 1; $i <= $this->nStateStack; $i++) { + $this->saveState($i); + } + } + + // and if there has been a stroke or fill color set, then transfer them + if (isset($this->currentColor)) { + $this->setColor($this->currentColor, true); + } + + if (isset($this->currentStrokeColor)) { + $this->setStrokeColor($this->currentStrokeColor, true); + } + + // if there is a line style set, then put this in too + if ($this->currentLineStyle !== '') { + $this->addContent("\n$this->currentLineStyle"); + } + + // the call to the o_page object set currentContents to the present page, so this can be returned as the page id + return $this->currentContents; + } + + /** + * Streams the PDF to the client. + * + * @param string $filename The filename to present to the client. + * @param array $options Associative array: 'compress' => 1 or 0 (default 1); 'Attachment' => 1 or 0 (default 1). + */ + function stream($filename = "document.pdf", $options = []) + { + if (headers_sent()) { + die("Unable to stream pdf: headers already sent"); + } + + if (!isset($options["compress"])) $options["compress"] = true; + if (!isset($options["Attachment"])) $options["Attachment"] = true; + + $debug = !$options['compress']; + $tmp = ltrim($this->output($debug)); + + header("Content-Type: application/pdf"); + header("Content-Length: " . mb_strlen($tmp, "8bit")); + + $filename = str_replace(["\n", "'"], "", basename($filename, ".pdf")) . ".pdf"; + $attachment = $options["Attachment"] ? "attachment" : "inline"; + + $encoding = mb_detect_encoding($filename); + $fallbackfilename = mb_convert_encoding($filename, "ISO-8859-1", $encoding); + $fallbackfilename = str_replace("\"", "", $fallbackfilename); + $encodedfilename = rawurlencode($filename); + + $contentDisposition = "Content-Disposition: $attachment; filename=\"$fallbackfilename\""; + if ($fallbackfilename !== $filename) { + $contentDisposition .= "; filename*=UTF-8''$encodedfilename"; + } + header($contentDisposition); + + echo $tmp; + flush(); + } + + /** + * return the height in units of the current font in the given size + * + * @param float $size + * + * @return float + */ + public function getFontHeight(float $size): float + { + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + $font = $this->fonts[$this->currentFont]; + + // for the current font, and the given size, what is the height of the font in user units + if (isset($font['Ascender']) && isset($font['Descender'])) { + $h = $font['Ascender'] - $font['Descender']; + } else { + $h = $font['FontBBox'][3] - $font['FontBBox'][1]; + } + + // have to adjust by a font offset for Windows fonts. unfortunately it looks like + // the bounding box calculations are wrong and I don't know why. + if (isset($font['FontHeightOffset'])) { + // For CourierNew from Windows this needs to be -646 to match the + // Adobe native Courier font. + // + // For FreeMono from GNU this needs to be -337 to match the + // Courier font. + // + // Both have been added manually to the .afm and .ufm files. + $h += (int)$font['FontHeightOffset']; + } + + return $size * $h / 1000; + } + + /** + * @param float $size + * + * @return float + */ + public function getFontXHeight(float $size): float + { + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + $font = $this->fonts[$this->currentFont]; + + // for the current font, and the given size, what is the height of the font in user units + if (isset($font['XHeight'])) { + $xh = $font['Ascender'] - $font['Descender']; + } else { + $xh = $this->getFontHeight($size) / 2; + } + + return $size * $xh / 1000; + } + + /** + * return the font descender, this will normally return a negative number + * if you add this number to the baseline, you get the level of the bottom of the font + * it is in the pdf user units + * + * @param float $size + * + * @return float + */ + public function getFontDescender(float $size): float + { + // note that this will most likely return a negative value + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + //$h = $this->fonts[$this->currentFont]['FontBBox'][1]; + $h = $this->fonts[$this->currentFont]['Descender']; + + return $size * $h / 1000; + } + + /** + * Filter a PDF name for inclusion in the PDF document. + * Escapes (per section 3.2.4) characters whose codes + * are outside the range 33 (!) to 126 (~). + * + * @param $text + * @return string + */ + function filterName($text) + { + $name = ''; + $char_array = []; + $delimeters = ['(', ')', '<', '>', '[', ']', '{', '}', '/', '%']; + if (function_exists("mb_str_split")) { + $char_array = mb_str_split($text, 1, "UTF-8"); + } else { + $char_array = preg_split("//u", $text, -1, PREG_SPLIT_NO_EMPTY); + } + $start_index = 0; + $char_index = -1; + while (isset($char_array[++$char_index])) { + $char = $char_array[$char_index]; + $dec = ord($char); + if ($dec >= 33 && $dec <= 126 && !in_array($char, $delimeters, true)) { + $name .= $char; + } else { + $name .= '#' . strtoupper(dechex($dec)); + } + } + return $name; + } + + /** + * filter the text, this is applied to all text just before being inserted into the pdf document + * it escapes the various things that need to be escaped, and so on + * + * @param $text + * @param bool $bom + * @param bool $convert_encoding + * @return string + */ + function filterText($text, $bom = true, $convert_encoding = true) + { + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + if ($convert_encoding) { + $cf = $this->currentFont; + if (isset($this->fonts[$cf]) && $this->fonts[$cf]['isUnicode']) { + $text = $this->utf8toUtf16BE($text, $bom); + } else { + //$text = html_entity_decode($text, ENT_QUOTES); + $text = mb_convert_encoding($text, self::$targetEncoding, 'UTF-8'); + } + } elseif ($bom) { + $text = $this->utf8toUtf16BE($text, $bom); + } + + // the chr(13) substitution fixes a bug seen in TCPDF (bug #1421290) + return strtr($text, [')' => '\\)', '(' => '\\(', '\\' => '\\\\', chr(13) => '\r']); + } + + /** + * return array containing codepoints (UTF-8 character values) for the + * string passed in. + * + * based on the excellent TCPDF code by Nicola Asuni and the + * RFC for UTF-8 at http://www.faqs.org/rfcs/rfc3629.html + * + * @param string $text UTF-8 string to process + * @return array UTF-8 codepoints array for the string + */ + function utf8toCodePointsArray(&$text) + { + $length = mb_strlen($text, '8bit'); // http://www.php.net/manual/en/function.mb-strlen.php#77040 + $unicode = []; // array containing unicode values + $bytes = []; // array containing single character byte sequences + $numbytes = 1; // number of octets needed to represent the UTF-8 character + + for ($i = 0; $i < $length; $i++) { + $c = ord($text[$i]); // get one string character at time + if (count($bytes) === 0) { // get starting octect + if ($c <= 0x7F) { + $unicode[] = $c; // use the character "as is" because is ASCII + $numbytes = 1; + } elseif (($c >> 0x05) === 0x06) { // 2 bytes character (0x06 = 110 BIN) + $bytes[] = ($c - 0xC0) << 0x06; + $numbytes = 2; + } elseif (($c >> 0x04) === 0x0E) { // 3 bytes character (0x0E = 1110 BIN) + $bytes[] = ($c - 0xE0) << 0x0C; + $numbytes = 3; + } elseif (($c >> 0x03) === 0x1E) { // 4 bytes character (0x1E = 11110 BIN) + $bytes[] = ($c - 0xF0) << 0x12; + $numbytes = 4; + } else { + // use replacement character for other invalid sequences + $unicode[] = 0xFFFD; + $bytes = []; + $numbytes = 1; + } + } elseif (($c >> 0x06) === 0x02) { // bytes 2, 3 and 4 must start with 0x02 = 10 BIN + $bytes[] = $c - 0x80; + if (count($bytes) === $numbytes) { + // compose UTF-8 bytes to a single unicode value + $c = $bytes[0]; + for ($j = 1; $j < $numbytes; $j++) { + $c += ($bytes[$j] << (($numbytes - $j - 1) * 0x06)); + } + if ((($c >= 0xD800) and ($c <= 0xDFFF)) or ($c >= 0x10FFFF)) { + // The definition of UTF-8 prohibits encoding character numbers between + // U+D800 and U+DFFF, which are reserved for use with the UTF-16 + // encoding form (as surrogate pairs) and do not directly represent + // characters. + $unicode[] = 0xFFFD; // use replacement character + } else { + $unicode[] = $c; // add char to array + } + // reset data for next char + $bytes = []; + $numbytes = 1; + } + } else { + // use replacement character for other invalid sequences + $unicode[] = 0xFFFD; + $bytes = []; + $numbytes = 1; + } + } + + return $unicode; + } + + /** + * convert UTF-8 to UTF-16 with an additional byte order marker + * at the front if required. + * + * based on the excellent TCPDF code by Nicola Asuni and the + * RFC for UTF-8 at http://www.faqs.org/rfcs/rfc3629.html + * + * @param string $text UTF-8 string to process + * @param boolean $bom whether to add the byte order marker + * @return string UTF-16 result string + */ + function utf8toUtf16BE(&$text, $bom = true) + { + $out = $bom ? "\xFE\xFF" : ''; + + $unicode = $this->utf8toCodePointsArray($text); + foreach ($unicode as $c) { + if ($c === 0xFFFD) { + $out .= "\xFF\xFD"; // replacement character + } elseif ($c < 0x10000) { + $out .= chr($c >> 0x08) . chr($c & 0xFF); + } else { + $c -= 0x10000; + $w1 = 0xD800 | ($c >> 0x10); + $w2 = 0xDC00 | ($c & 0x3FF); + $out .= chr($w1 >> 0x08) . chr($w1 & 0xFF) . chr($w2 >> 0x08) . chr($w2 & 0xFF); + } + } + + return $out; + } + + /** + * given a start position and information about how text is to be laid out, calculate where + * on the page the text will end + * + * @param $x + * @param $y + * @param $angle + * @param $size + * @param $wa + * @param $text + * @return array + */ + private function getTextPosition($x, $y, $angle, $size, $wa, $text) + { + // given this information return an array containing x and y for the end position as elements 0 and 1 + $w = $this->getTextWidth($size, $text); + + // need to adjust for the number of spaces in this text + $words = explode(' ', $text); + $nspaces = count($words) - 1; + $w += $wa * $nspaces; + $a = deg2rad((float)$angle); + + return [cos($a) * $w + $x, -sin($a) * $w + $y]; + } + + /** + * Callback method used by smallCaps + * + * @param array $matches + * + * @return string + */ + function toUpper($matches) + { + return mb_strtoupper($matches[0], 'UTF-8'); + } + + function concatMatches($matches) + { + $str = ""; + foreach ($matches as $match) { + $str .= $match[0]; + } + + return $str; + } + + /** + * register text for font subsetting + * + * @param string $font + * @param string $text + */ + function registerText($font, $text) + { + if (!$this->isUnicode || in_array(mb_strtolower(basename($font), "UTF-8"), self::$coreFonts)) { + return; + } + + if (!isset($this->stringSubsets[$font])) { + $base_subset = "\u{fffd}\u{fffe}\u{ffff}"; // fffd => replacement character, fffe/ffff => not a character + $this->stringSubsets[$font] = $this->utf8toCodePointsArray($base_subset); + } + + $this->stringSubsets[$font] = array_unique( + array_merge($this->stringSubsets[$font], $this->utf8toCodePointsArray($text)) + ); + } + + /** + * add text to the document, at a specified location, size and angle on the page + * + * @param float $x + * @param float $y + * @param float $size + * @param string $text + * @param float $angle + * @param float $wordSpaceAdjust + * @param float $charSpaceAdjust + * @param bool $smallCaps + */ + function addText($x, $y, $size, $text, $angle = 0, $wordSpaceAdjust = 0, $charSpaceAdjust = 0, $smallCaps = false) + { + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + $text = str_replace(["\r", "\n"], "", $text); + + // if ($smallCaps) { + // preg_match_all("/(\P{Ll}+)/u", $text, $matches, PREG_SET_ORDER); + // $lower = $this->concatMatches($matches); + // d($lower); + + // preg_match_all("/(\p{Ll}+)/u", $text, $matches, PREG_SET_ORDER); + // $other = $this->concatMatches($matches); + // d($other); + + // $text = preg_replace_callback("/\p{Ll}/u", array($this, "toUpper"), $text); + // } + + // if there are any open callbacks, then they should be called, to show the start of the line + if ($this->nCallback > 0) { + for ($i = $this->nCallback; $i > 0; $i--) { + // call each function + $info = [ + 'x' => $x, + 'y' => $y, + 'angle' => $angle, + 'status' => 'sol', + 'p' => $this->callback[$i]['p'], + 'nCallback' => $this->callback[$i]['nCallback'], + 'height' => $this->callback[$i]['height'], + 'descender' => $this->callback[$i]['descender'] + ]; + + $func = $this->callback[$i]['f']; + $this->$func($info); + } + } + + if ($angle == 0) { + $this->addContent(sprintf("\nBT %.3F %.3F Td", $x, $y)); + } else { + $a = deg2rad((float)$angle); + $this->addContent( + sprintf("\nBT %.3F %.3F %.3F %.3F %.3F %.3F Tm", cos($a), -sin($a), sin($a), cos($a), $x, $y) + ); + } + + if ($wordSpaceAdjust != 0) { + $this->addContent(sprintf(" %.3F Tw", $wordSpaceAdjust)); + } + + if ($charSpaceAdjust != 0) { + $this->addContent(sprintf(" %.3F Tc", $charSpaceAdjust)); + } + + if (strlen($text) > 0) { + $part = $text; + $place_text = $this->filterText($part, false); + // modify unicode text so that extra word spacing is manually implemented (bug #) + if ($this->fonts[$this->currentFont]['isUnicode'] && $wordSpaceAdjust != 0) { + $space_scale = 1000 / $size; + $place_text = str_replace("\x00\x20", "\x00\x20)\x00\x20" . (-round($space_scale * $wordSpaceAdjust)) . "\x00\x20(", $place_text); + } + $this->addContent(" /F$this->currentFontNum " . sprintf('%.1F Tf ', $size)); + $this->addContent(" [($place_text)] TJ"); + } + + if ($wordSpaceAdjust != 0) { + $this->addContent(sprintf(" %.3F Tw", 0)); + } + + if ($charSpaceAdjust != 0) { + $this->addContent(sprintf(" %.3F Tc", 0)); + } + + $this->addContent(' ET'); + + // if there are any open callbacks, then they should be called, to show the end of the line + if ($this->nCallback > 0) { + for ($i = $this->nCallback; $i > 0; $i--) { + // call each function + $tmp = $this->getTextPosition($x, $y, $angle, $size, $wordSpaceAdjust, $text); + $info = [ + 'x' => $tmp[0], + 'y' => $tmp[1], + 'angle' => $angle, + 'status' => 'eol', + 'p' => $this->callback[$i]['p'], + 'nCallback' => $this->callback[$i]['nCallback'], + 'height' => $this->callback[$i]['height'], + 'descender' => $this->callback[$i]['descender'] + ]; + $func = $this->callback[$i]['f']; + $this->$func($info); + } + } + + if ($this->fonts[$this->currentFont]['isSubsetting']) { + $this->registerText($this->currentFont, $text); + } + } + + /** + * calculate how wide a given text string will be on a page, at a given size. + * this can be called externally, but is also used by the other class functions + * + * @param float $size + * @param string $text + * @param float $wordSpacing + * @param float $charSpacing + * + * @return float + */ + public function getTextWidth(float $size, string $text, float $wordSpacing = 0.0, float $charSpacing = 0.0): float + { + static $ord_cache = []; + + // this function should not change any of the settings, though it will need to + // track any directives which change during calculation, so copy them at the start + // and put them back at the end. + $store_currentTextState = $this->currentTextState; + + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + // remove non-printable characters since they have no width + $text = preg_replace('/[\x00-\x1F\x7F]/u', '', $text); + + // hmm, this is where it all starts to get tricky - use the font information to + // calculate the width of each character, add them up and convert to user units + $w = 0; + $cf = $this->currentFont; + $current_font = $this->fonts[$cf]; + $space_scale = 1000 / ($size > 0 ? $size : 1); + + if ($current_font['isUnicode']) { + // for Unicode, use the code points array to calculate width rather + // than just the string itself + $unicode = $this->utf8toCodePointsArray($text); + + foreach ($unicode as $char) { + // check if we have to replace character + if (isset($current_font['differences'][$char])) { + $char = $current_font['differences'][$char]; + } + + if (isset($current_font['C'][$char])) { + $char_width = $current_font['C'][$char]; + } elseif (isset($current_font['C'][0xFFFD])) { + // fffd => replacement character + $char_width = $current_font['C'][0xFFFD]; + } else { + $char_width = $current_font['C'][0x0020]; + } + + // add the character width + $w += $char_width; + + // add additional padding for space + if (isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space') { // Space + $w += $wordSpacing * $space_scale; + } + } + + // add additional char spacing + if ($charSpacing != 0) { + $w += $charSpacing * $space_scale * count($unicode); + } + + } else { + // If CPDF is in Unicode mode but the current font does not support Unicode we need to convert the character set to Windows-1252 + if ($this->isUnicode) { + $text = mb_convert_encoding($text, 'Windows-1252', 'UTF-8'); + } + + $len = mb_strlen($text, 'Windows-1252'); + + for ($i = 0; $i < $len; $i++) { + $c = $text[$i]; + $char = isset($ord_cache[$c]) ? $ord_cache[$c] : ($ord_cache[$c] = ord($c)); + + // check if we have to replace character + if (isset($current_font['differences'][$char])) { + $char = $current_font['differences'][$char]; + } + + if (isset($current_font['C'][$char])) { + $char_width = $current_font['C'][$char]; + } elseif (isset($current_font['C'][0xFFFD])) { + // fffd => replacement character + $char_width = $current_font['C'][0xFFFD]; + } else { + $char_width = $current_font['C'][0x0020]; + } + + // add the character width + $w += $char_width; + + // add additional padding for space + if (isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space') { // Space + $w += $wordSpacing * $space_scale; + } + } + + // add additional char spacing + if ($charSpacing != 0) { + $w += $charSpacing * $space_scale * $len; + } + } + + $this->currentTextState = $store_currentTextState; + $this->setCurrentFont(); + + return $w * $size / 1000; + } + + /** + * this will be called at a new page to return the state to what it was on the + * end of the previous page, before the stack was closed down + * This is to get around not being able to have open 'q' across pages + * + * @param int $pageEnd + */ + function saveState($pageEnd = 0) + { + if ($pageEnd) { + // this will be called at a new page to return the state to what it was on the + // end of the previous page, before the stack was closed down + // This is to get around not being able to have open 'q' across pages + $opt = $this->stateStack[$pageEnd]; + // ok to use this as stack starts numbering at 1 + $this->setColor($opt['col'], true); + $this->setStrokeColor($opt['str'], true); + $this->addContent("\n" . $opt['lin']); + // $this->currentLineStyle = $opt['lin']; + } else { + $this->nStateStack++; + $this->stateStack[$this->nStateStack] = [ + 'col' => $this->currentColor, + 'str' => $this->currentStrokeColor, + 'lin' => $this->currentLineStyle + ]; + } + + $this->save(); + } + + /** + * restore a previously saved state + * + * @param int $pageEnd + */ + function restoreState($pageEnd = 0) + { + if (!$pageEnd) { + $n = $this->nStateStack; + $this->currentColor = $this->stateStack[$n]['col']; + $this->currentStrokeColor = $this->stateStack[$n]['str']; + $this->addContent("\n" . $this->stateStack[$n]['lin']); + $this->currentLineStyle = $this->stateStack[$n]['lin']; + $this->stateStack[$n] = null; + unset($this->stateStack[$n]); + $this->nStateStack--; + } + + $this->restore(); + } + + /** + * make a loose object, the output will go into this object, until it is closed, then will revert to + * the current one. + * this object will not appear until it is included within a page. + * the function will return the object number + * + * @return int + */ + function openObject() + { + $this->nStack++; + $this->stack[$this->nStack] = ['c' => $this->currentContents, 'p' => $this->currentPage]; + // add a new object of the content type, to hold the data flow + $this->numObj++; + $this->o_contents($this->numObj, 'new'); + $this->currentContents = $this->numObj; + $this->looseObjects[$this->numObj] = 1; + + return $this->numObj; + } + + /** + * open an existing object for editing + * + * @param $id + */ + function reopenObject($id) + { + $this->nStack++; + $this->stack[$this->nStack] = ['c' => $this->currentContents, 'p' => $this->currentPage]; + $this->currentContents = $id; + + // also if this object is the primary contents for a page, then set the current page to its parent + if (isset($this->objects[$id]['onPage'])) { + $this->currentPage = $this->objects[$id]['onPage']; + } + } + + /** + * close an object + */ + function closeObject() + { + // close the object, as long as there was one open in the first place, which will be indicated by + // an objectId on the stack. + if ($this->nStack > 0) { + $this->currentContents = $this->stack[$this->nStack]['c']; + $this->currentPage = $this->stack[$this->nStack]['p']; + $this->nStack--; + // easier to probably not worry about removing the old entries, they will be overwritten + // if there are new ones. + } + } + + /** + * stop an object from appearing on pages from this point on + * + * @param $id + */ + function stopObject($id) + { + // if an object has been appearing on pages up to now, then stop it, this page will + // be the last one that could contain it. + if (isset($this->addLooseObjects[$id])) { + $this->addLooseObjects[$id] = ''; + } + } + + /** + * after an object has been created, it wil only show if it has been added, using this function. + * + * @param $id + * @param string $options + */ + function addObject($id, $options = 'add') + { + // add the specified object to the page + if (isset($this->looseObjects[$id]) && $this->currentContents != $id) { + // then it is a valid object, and it is not being added to itself + switch ($options) { + case 'all': + // then this object is to be added to this page (done in the next block) and + // all future new pages. + $this->addLooseObjects[$id] = 'all'; + + case 'add': + if (isset($this->objects[$this->currentContents]['onPage'])) { + // then the destination contents is the primary for the page + // (though this object is actually added to that page) + $this->o_page($this->objects[$this->currentContents]['onPage'], 'content', $id); + } + break; + + case 'even': + $this->addLooseObjects[$id] = 'even'; + $pageObjectId = $this->objects[$this->currentContents]['onPage']; + if ($this->objects[$pageObjectId]['info']['pageNum'] % 2 == 0) { + $this->addObject($id); + // hacky huh :) + } + break; + + case 'odd': + $this->addLooseObjects[$id] = 'odd'; + $pageObjectId = $this->objects[$this->currentContents]['onPage']; + if ($this->objects[$pageObjectId]['info']['pageNum'] % 2 == 1) { + $this->addObject($id); + // hacky huh :) + } + break; + + case 'next': + $this->addLooseObjects[$id] = 'all'; + break; + + case 'nexteven': + $this->addLooseObjects[$id] = 'even'; + break; + + case 'nextodd': + $this->addLooseObjects[$id] = 'odd'; + break; + } + } + } + + /** + * return a storable representation of a specific object + * + * @param $id + * @return string|null + */ + function serializeObject($id) + { + if (array_key_exists($id, $this->objects)) { + return serialize($this->objects[$id]); + } + + return null; + } + + /** + * restore an object from its stored representation. Returns its new object id. + * + * @param $obj + * @return int + */ + function restoreSerializedObject($obj) + { + $obj_id = $this->openObject(); + $this->objects[$obj_id] = unserialize($obj); + $this->closeObject(); + + return $obj_id; + } + + /** + * Embeds a file inside the PDF + * + * @param string $filepath path to the file to store inside the PDF + * @param string $embeddedFilename the filename displayed in the list of embedded files + * @param string $description a description in the list of embedded files + * @param string $mimeType the mime type of the file + * @param array $relatedTo relationship of the embedded file to other PDF objects; the key is the object ID generated by Cpdf when the related object was added to the document and the value is a string (constrained list) naming the relationship type. + * @phpstan-param array $relatedTo + */ + public function addEmbeddedFile(string $filepath, string $embeddedFilename, string $description, string $mimeType = "application/octet-stream", array $relatedTo = []): void + { + $efDictId = ++$this->numObj; + $this->o_embedded_file_dictionary( + $efDictId, + 'new', + [ + 'filepath' => $filepath, + 'filename' => $embeddedFilename, + 'description' => $description, + 'mimeType' => $mimeType + ] + ); + + if ($relatedTo !== []) { + foreach ($relatedTo as $objId => $relationship) { + $this->associateFile($efDictId, $objId, $relationship); + } + } + } + + /** + * Associated an embedded file with an existing PDF object. + * + * @param int $fileId The PDF object ID of the file dictionary + * @param int $objectId The PDF object ID of the object the file is related to + * @param string $relationship The relationship type, valid values are defined in section 7.11.3 of ISO-32000-2 + * @phpstan-param 'Source'|'Data'|'Alternative'|'EncryptedPayload'|'FormData'|'Schema'|'Unspecified' $relationship + */ + public function associateFile(int $fileId, int $objectId, ?string $relationship = "Unspecified"): void + { + $relationship = $relationship ?? "Unspecified"; + $obj = $this->objects[$objectId]; + $type = 'o_' . $obj['t']; + $this->$type($objectId, "associatedFiles", "$fileId 0 R"); + $this->o_embedded_file_dictionary($fileId, "afRelationship", $relationship); + } + + /** + * Add content to the documents info object + * + * @param string|array $label + * @param string $value + */ + public function addInfo($label, string $value = ""): void + { + // this will only work if the label is one of the valid ones. + // modify this so that arrays can be passed as well. + // if $label is an array then assume that it is key => value pairs + // else assume that they are both scalar, anything else will probably error + if (is_array($label)) { + foreach ($label as $l => $v) { + $this->o_info($this->infoObject, $l, (string) $v); + } + } else { + $this->o_info($this->infoObject, $label, $value); + } + } + + /** + * set the viewer preferences of the document, it is up to the browser to obey these. + * + * @param $label + * @param int $value + */ + function setPreferences($label, $value = 0) + { + // this will only work if the label is one of the valid ones. + if (is_array($label)) { + foreach ($label as $l => $v) { + $this->o_catalog($this->catalogId, 'viewerPreferences', [$l => $v]); + } + } else { + $this->o_catalog($this->catalogId, 'viewerPreferences', [$label => $value]); + } + } + + /** + * extract an integer from a position in a byte stream + * + * @param $data + * @param $pos + * @param $num + * @return int + */ + private function getBytes(&$data, $pos, $num) + { + // return the integer represented by $num bytes from $pos within $data + $ret = 0; + for ($i = 0; $i < $num; $i++) { + $ret *= 256; + $ret += ord($data[$pos + $i]); + } + + return $ret; + } + + /** + * Check if image already added to pdf image directory. + * If yes, need not to create again (pass empty data) + * + * @param string $imgname + * @return bool + */ + function image_iscached($imgname) + { + return isset($this->imagelist[$imgname]); + } + + /** + * add a PNG image into the document, from a GD object + * this should work with remote files + * + * @param \GdImage|resource $img A GD resource + * @param string $file The PNG file + * @param float $x X position + * @param float $y Y position + * @param float $w Width + * @param float $h Height + * @param bool $is_mask true if the image is a mask + * @param bool $mask true if the image is masked + * @throws Exception + */ + function addImagePng(&$img, $file, $x, $y, $w = 0.0, $h = 0.0, $is_mask = false, $mask = null) + { + if (!function_exists("imagepng")) { + throw new \Exception("The PHP GD extension is required, but is not installed."); + } + + //if already cached, need not to read again + if (isset($this->imagelist[$file])) { + $data = null; + } else { + // Example for transparency handling on new image. Retain for current image + // $tIndex = imagecolortransparent($img); + // if ($tIndex > 0) { + // $tColor = imagecolorsforindex($img, $tIndex); + // $new_tIndex = imagecolorallocate($new_img, $tColor['red'], $tColor['green'], $tColor['blue']); + // imagefill($new_img, 0, 0, $new_tIndex); + // imagecolortransparent($new_img, $new_tIndex); + // } + // blending mode (literal/blending) on drawing into current image. not relevant when not saved or not drawn + //imagealphablending($img, true); + + //default, but explicitely set to ensure pdf compatibility + imagesavealpha($img, false/*!$is_mask && !$mask*/); + + $error = 0; + //DEBUG_IMG_TEMP + //debugpng + if (defined("DEBUGPNG") && DEBUGPNG) { + print '[addImagePng ' . $file . ']'; + } + + ob_start(); + @imagepng($img); + $data = ob_get_clean(); + + if ($data == '') { + $error = 1; + $errormsg = 'trouble writing file from GD'; + //DEBUG_IMG_TEMP + //debugpng + if (defined("DEBUGPNG") && DEBUGPNG) { + print 'trouble writing file from GD'; + } + } + + if ($error) { + $this->addMessage('PNG error - (' . $file . ') ' . $errormsg); + + return; + } + } //End isset($this->imagelist[$file]) (png Duplicate removal) + + $this->addPngFromBuf($data, $file, $x, $y, $w, $h, $is_mask, $mask); + } + + /** + * @param $file + * @param $x + * @param $y + * @param $w + * @param $h + * @param $byte + */ + protected function addImagePngAlpha($file, $x, $y, $w, $h, $byte) + { + // generate images + $img = @imagecreatefrompng($file); + + if ($img === false) { + return; + } + + // FIXME The pixel transformation doesn't work well with 8bit PNGs + $eight_bit = ($byte & 4) !== 4; + + $wpx = imagesx($img); + $hpx = imagesy($img); + + imagesavealpha($img, false); + + // create temp alpha file + $tempfile_alpha = @tempnam($this->tmp, "cpdf_img_"); + @unlink($tempfile_alpha); + $tempfile_alpha = "$tempfile_alpha.png"; + + // create temp plain file + $tempfile_plain = @tempnam($this->tmp, "cpdf_img_"); + @unlink($tempfile_plain); + $tempfile_plain = "$tempfile_plain.png"; + + $imgalpha = imagecreate($wpx, $hpx); + imagesavealpha($imgalpha, false); + + // generate gray scale palette (0 -> 255) + for ($c = 0; $c < 256; ++$c) { + imagecolorallocate($imgalpha, $c, $c, $c); + } + + // Use PECL gmagick + Graphics Magic to process transparent PNG images + if (extension_loaded("gmagick")) { + $gmagick = new \Gmagick($file); + $gmagick->setimageformat('png'); + + // Get opacity channel (negative of alpha channel) + $alpha_channel_neg = clone $gmagick; + $alpha_channel_neg->separateimagechannel(\Gmagick::CHANNEL_OPACITY); + + // Negate opacity channel + $alpha_channel = new \Gmagick(); + $alpha_channel->newimage($wpx, $hpx, "#FFFFFF", "png"); + $alpha_channel->compositeimage($alpha_channel_neg, \Gmagick::COMPOSITE_DIFFERENCE, 0, 0); + $alpha_channel->separateimagechannel(\Gmagick::CHANNEL_RED); + $alpha_channel->writeimage($tempfile_alpha); + + // Cast to 8bit+palette + $imgalpha_ = @imagecreatefrompng($tempfile_alpha); + imagecopy($imgalpha, $imgalpha_, 0, 0, 0, 0, $wpx, $hpx); + if (PHP_MAJOR_VERSION < 8) { + imagedestroy($imgalpha_); + } + imagepng($imgalpha, $tempfile_alpha); + + // Make opaque image + $color_channels = new \Gmagick(); + $color_channels->newimage($wpx, $hpx, "#FFFFFF", "png"); + $color_channels->compositeimage($gmagick, \Gmagick::COMPOSITE_COPYRED, 0, 0); + $color_channels->compositeimage($gmagick, \Gmagick::COMPOSITE_COPYGREEN, 0, 0); + $color_channels->compositeimage($gmagick, \Gmagick::COMPOSITE_COPYBLUE, 0, 0); + $color_channels->writeimage($tempfile_plain); + + $imgplain = @imagecreatefrompng($tempfile_plain); + } + // Use PECL imagick + ImageMagic to process transparent PNG images + elseif (extension_loaded("imagick")) { + // Native cloning was added to pecl-imagick in svn commit 263814 + // the first version containing it was 3.0.1RC1 + static $imagickClonable = null; + if ($imagickClonable === null) { + $imagickClonable = true; + if (defined('Imagick::IMAGICK_EXTVER')) { + $imagickVersion = \Imagick::IMAGICK_EXTVER; + } else { + $imagickVersion = '0'; + } + if (version_compare($imagickVersion, '0.0.1', '>=')) { + $imagickClonable = version_compare($imagickVersion, '3.0.1rc1', '>='); + } + } + + $imagick = new \Imagick(); + $imagick->setRegistry('temporary-path', $this->tmp); + $imagick->setFormat('PNG'); + $imagick->readImage($file); + + // Get opacity channel (negative of alpha channel) + if ($imagick->getImageAlphaChannel()) { + $alpha_channel = $imagickClonable ? clone $imagick : $imagick->clone(); + $alpha_channel->separateImageChannel(\Imagick::CHANNEL_ALPHA); + // Since ImageMagick7 negate invert transparency as default + if (\Imagick::getVersion()['versionNumber'] < 1800) { + $alpha_channel->negateImage(true); + } + + try { + $alpha_channel->writeImage($tempfile_alpha); + } catch (\ImagickException $th) { + // Backwards compatible retry attempt in case the IMagick policy is still configured in lowercase + $alpha_channel->setFormat('png'); + $alpha_channel->writeImage($tempfile_alpha); + } + + // Cast to 8bit+palette + $imgalpha_ = @imagecreatefrompng($tempfile_alpha); + imagecopy($imgalpha, $imgalpha_, 0, 0, 0, 0, $wpx, $hpx); + if (PHP_MAJOR_VERSION < 8) { + imagedestroy($imgalpha_); + } + imagepng($imgalpha, $tempfile_alpha); + } else { + $tempfile_alpha = null; + } + + // Make opaque image + $color_channels = new \Imagick(); + $color_channels->setRegistry('temporary-path', $this->tmp); + $color_channels->newImage($wpx, $hpx, "#FFFFFF", "png"); + $color_channels->compositeImage($imagick, \Imagick::COMPOSITE_COPYRED, 0, 0); + $color_channels->compositeImage($imagick, \Imagick::COMPOSITE_COPYGREEN, 0, 0); + $color_channels->compositeImage($imagick, \Imagick::COMPOSITE_COPYBLUE, 0, 0); + $color_channels->writeImage($tempfile_plain); + + $imgplain = @imagecreatefrompng($tempfile_plain); + } else { + // allocated colors cache + $allocated_colors = []; + + // extract alpha channel + for ($xpx = 0; $xpx < $wpx; ++$xpx) { + for ($ypx = 0; $ypx < $hpx; ++$ypx) { + $color = imagecolorat($img, $xpx, $ypx); + $col = imagecolorsforindex($img, $color); + $alpha = $col['alpha']; + + if ($eight_bit) { + // with gamma correction + $gammacorr = 2.2; + $pixel = round(pow((((127 - $alpha) * 255 / 127) / 255), $gammacorr) * 255); + } else { + // without gamma correction + $pixel = (127 - $alpha) * 2; + + $key = $col['red'] . $col['green'] . $col['blue']; + + if (!isset($allocated_colors[$key])) { + $pixel_img = imagecolorallocate($img, $col['red'], $col['green'], $col['blue']); + $allocated_colors[$key] = $pixel_img; + } else { + $pixel_img = $allocated_colors[$key]; + } + + imagesetpixel($img, $xpx, $ypx, $pixel_img); + } + + imagesetpixel($imgalpha, $xpx, $ypx, $pixel); + } + } + + // extract image without alpha channel + $imgplain = imagecreatetruecolor($wpx, $hpx); + imagecopy($imgplain, $img, 0, 0, 0, 0, $wpx, $hpx); + if (PHP_MAJOR_VERSION < 8) { + imagedestroy($img); + } + + imagepng($imgalpha, $tempfile_alpha); + imagepng($imgplain, $tempfile_plain); + } + + $this->imageAlphaList[$file] = [$tempfile_alpha, $tempfile_plain]; + + // embed mask image + if ($tempfile_alpha) { + $this->addImagePng($imgalpha, $tempfile_alpha, $x, $y, $w, $h, true); + if (PHP_MAJOR_VERSION < 8) { + imagedestroy($imgalpha); + } + $this->imageCache[] = $tempfile_alpha; + } + + // embed image, masked with previously embedded mask + $this->addImagePng($imgplain, $tempfile_plain, $x, $y, $w, $h, false, ($tempfile_alpha !== null)); + if (PHP_MAJOR_VERSION < 8) { + imagedestroy($imgplain); + } + $this->imageCache[] = $tempfile_plain; + } + + /** + * add a PNG image into the document, from a file + * this should work with remote files + * + * @param $file + * @param $x + * @param $y + * @param int $w + * @param int $h + * @throws Exception + */ + function addPngFromFile($file, $x, $y, $w = 0, $h = 0) + { + if (!function_exists("imagecreatefrompng")) { + throw new \Exception("The PHP GD extension is required, but is not installed."); + } + + if (isset($this->imageAlphaList[$file])) { + [$alphaFile, $plainFile] = $this->imageAlphaList[$file]; + + if ($alphaFile) { + $img = null; + $this->addImagePng($img, $alphaFile, $x, $y, $w, $h, true); + } + + $img = null; + $this->addImagePng($img, $plainFile, $x, $y, $w, $h, false, ($plainFile !== null)); + return; + } + + //if already cached, need not to read again + if (isset($this->imagelist[$file])) { + $img = null; + } else { + $info = file_get_contents($file, false, null, 24, 5); + $meta = unpack("CbitDepth/CcolorType/CcompressionMethod/CfilterMethod/CinterlaceMethod", $info); + $bit_depth = $meta["bitDepth"]; + $color_type = $meta["colorType"]; + + // http://www.w3.org/TR/PNG/#11IHDR + // 3 => indexed + // 4 => greyscale with alpha + // 6 => fullcolor with alpha + $is_alpha = in_array($color_type, [4, 6]) || ($color_type == 3 && $bit_depth != 4); + + if ($is_alpha) { // exclude grayscale alpha + $this->addImagePngAlpha($file, $x, $y, $w, $h, $color_type); + return; + } + + //png files typically contain an alpha channel. + //pdf file format or class.pdf does not support alpha blending. + //on alpha blended images, more transparent areas have a color near black. + //This appears in the result on not storing the alpha channel. + //Correct would be the box background image or its parent when transparent. + //But this would make the image dependent on the background. + //Therefore create an image with white background and copy in + //A more natural background than black is white. + //Therefore create an empty image with white background and merge the + //image in with alpha blending. + $imgtmp = @imagecreatefrompng($file); + if (!$imgtmp) { + return; + } + $sx = imagesx($imgtmp); + $sy = imagesy($imgtmp); + $img = imagecreatetruecolor($sx, $sy); + imagealphablending($img, true); + + // @todo is it still needed ?? + $ti = imagecolortransparent($imgtmp); + if ($ti >= 0) { + $tc = imagecolorsforindex($imgtmp, $ti); + $ti = imagecolorallocate($img, $tc['red'], $tc['green'], $tc['blue']); + imagefill($img, 0, 0, $ti); + imagecolortransparent($img, $ti); + } else { + imagefill($img, 1, 1, imagecolorallocate($img, 255, 255, 255)); + } + + imagecopy($img, $imgtmp, 0, 0, 0, 0, $sx, $sy); + if (PHP_MAJOR_VERSION < 8) { + imagedestroy($imgtmp); + } + } + $this->addImagePng($img, $file, $x, $y, $w, $h); + + if ($img && PHP_MAJOR_VERSION < 8) { + imagedestroy($img); + } + } + + /** + * add an SVG image into the document from a file + * + * @param $file + * @param $x + * @param $y + * @param int $w + * @param int $h + */ + function addSvgFromFile($file, $x, $y, $w = 0, $h = 0) + { + $doc = new \Svg\Document(); + $doc->loadFile($file); + $dimensions = $doc->getDimensions(); + + $this->save(); + + $this->transform([$w / $dimensions["width"], 0, 0, $h / $dimensions["height"], $x, $y]); + + $surface = new \Svg\Surface\SurfaceCpdf($doc, $this); + $doc->render($surface); + + $this->restore(); + } + + /** + * add a PNG image into the document, from a memory buffer of the file + * + * @param $data + * @param $file + * @param $x + * @param $y + * @param float $w + * @param float $h + * @param bool $is_mask + * @param null $mask + */ + function addPngFromBuf(&$data, $file, $x, $y, $w = 0.0, $h = 0.0, $is_mask = false, $mask = null) + { + if (isset($this->imagelist[$file])) { + $data = null; + $info['width'] = $this->imagelist[$file]['w']; + $info['height'] = $this->imagelist[$file]['h']; + $label = $this->imagelist[$file]['label']; + } else { + if ($data == null) { + $this->addMessage('addPngFromBuf error - data not present!'); + + return; + } + + $error = 0; + + if (!$error) { + $header = chr(137) . chr(80) . chr(78) . chr(71) . chr(13) . chr(10) . chr(26) . chr(10); + + if (mb_substr($data, 0, 8, '8bit') != $header) { + $error = 1; + + if (defined("DEBUGPNG") && DEBUGPNG) { + print '[addPngFromFile this file does not have a valid header ' . $file . ']'; + } + + $errormsg = 'this file does not have a valid header'; + } + } + + if (!$error) { + // set pointer + $p = 8; + $len = mb_strlen($data, '8bit'); + + // cycle through the file, identifying chunks + $haveHeader = 0; + $info = []; + $idata = ''; + $pdata = ''; + + while ($p < $len) { + $chunkLen = $this->getBytes($data, $p, 4); + $chunkType = mb_substr($data, $p + 4, 4, '8bit'); + + switch ($chunkType) { + case 'IHDR': + // this is where all the file information comes from + $info['width'] = $this->getBytes($data, $p + 8, 4); + $info['height'] = $this->getBytes($data, $p + 12, 4); + $info['bitDepth'] = ord($data[$p + 16]); + $info['colorType'] = ord($data[$p + 17]); + $info['compressionMethod'] = ord($data[$p + 18]); + $info['filterMethod'] = ord($data[$p + 19]); + $info['interlaceMethod'] = ord($data[$p + 20]); + + //print_r($info); + $haveHeader = 1; + if ($info['compressionMethod'] != 0) { + $error = 1; + + //debugpng + if (defined("DEBUGPNG") && DEBUGPNG) { + print '[addPngFromFile unsupported compression method ' . $file . ']'; + } + + $errormsg = 'unsupported compression method'; + } + + if ($info['filterMethod'] != 0) { + $error = 1; + + //debugpng + if (defined("DEBUGPNG") && DEBUGPNG) { + print '[addPngFromFile unsupported filter method ' . $file . ']'; + } + + $errormsg = 'unsupported filter method'; + } + break; + + case 'PLTE': + $pdata .= mb_substr($data, $p + 8, $chunkLen, '8bit'); + break; + + case 'IDAT': + $idata .= mb_substr($data, $p + 8, $chunkLen, '8bit'); + break; + + case 'tRNS': + //this chunk can only occur once and it must occur after the PLTE chunk and before IDAT chunk + //print "tRNS found, color type = ".$info['colorType']."\n"; + $transparency = []; + + switch ($info['colorType']) { + // indexed color, rbg + case 3: + /* corresponding to entries in the plte chunk + Alpha for palette index 0: 1 byte + Alpha for palette index 1: 1 byte + ...etc... + */ + // there will be one entry for each palette entry. up until the last non-opaque entry. + // set up an array, stretching over all palette entries which will be o (opaque) or 1 (transparent) + $transparency['type'] = 'indexed'; + $trans = 0; + + for ($i = $chunkLen; $i >= 0; $i--) { + if (ord($data[$p + 8 + $i]) == 0) { + $trans = $i; + } + } + + $transparency['data'] = $trans; + break; + + // grayscale + case 0: + /* corresponding to entries in the plte chunk + Gray: 2 bytes, range 0 .. (2^bitdepth)-1 + */ + // $transparency['grayscale'] = $this->PRVT_getBytes($data,$p+8,2); // g = grayscale + $transparency['type'] = 'indexed'; + $transparency['data'] = ord($data[$p + 8 + 1]); + break; + + // truecolor + case 2: + /* corresponding to entries in the plte chunk + Red: 2 bytes, range 0 .. (2^bitdepth)-1 + Green: 2 bytes, range 0 .. (2^bitdepth)-1 + Blue: 2 bytes, range 0 .. (2^bitdepth)-1 + */ + $transparency['r'] = $this->getBytes($data, $p + 8, 2); + // r from truecolor + $transparency['g'] = $this->getBytes($data, $p + 10, 2); + // g from truecolor + $transparency['b'] = $this->getBytes($data, $p + 12, 2); + // b from truecolor + + $transparency['type'] = 'color-key'; + break; + + //unsupported transparency type + default: + if (defined("DEBUGPNG") && DEBUGPNG) { + print '[addPngFromFile unsupported transparency type ' . $file . ']'; + } + break; + } + + // KS End new code + break; + + default: + break; + } + + $p += $chunkLen + 12; + } + + if (!$haveHeader) { + $error = 1; + + //debugpng + if (defined("DEBUGPNG") && DEBUGPNG) { + print '[addPngFromFile information header is missing ' . $file . ']'; + } + + $errormsg = 'information header is missing'; + } + + if (isset($info['interlaceMethod']) && $info['interlaceMethod']) { + $error = 1; + + //debugpng + if (defined("DEBUGPNG") && DEBUGPNG) { + print '[addPngFromFile no support for interlaced images in pdf ' . $file . ']'; + } + + $errormsg = 'There appears to be no support for interlaced images in pdf.'; + } + } + + if (!$error && $info['bitDepth'] > 8) { + $error = 1; + + //debugpng + if (defined("DEBUGPNG") && DEBUGPNG) { + print '[addPngFromFile bit depth of 8 or less is supported ' . $file . ']'; + } + + $errormsg = 'only bit depth of 8 or less is supported'; + } + + if (!$error) { + switch ($info['colorType']) { + case 3: + $color = 'DeviceRGB'; + $ncolor = 1; + break; + + case 2: + $color = 'DeviceRGB'; + $ncolor = 3; + break; + + case 0: + $color = 'DeviceGray'; + $ncolor = 1; + break; + + default: + $error = 1; + + //debugpng + if (defined("DEBUGPNG") && DEBUGPNG) { + print '[addPngFromFile alpha channel not supported: ' . $info['colorType'] . ' ' . $file . ']'; + } + + $errormsg = 'transparency alpha channel not supported, transparency only supported for palette images.'; + } + } + + if ($error) { + $this->addMessage('PNG error - (' . $file . ') ' . $errormsg); + + return; + } + + //print_r($info); + // so this image is ok... add it in. + $this->numImages++; + $im = $this->numImages; + $label = "I$im"; + $this->numObj++; + + // $this->o_image($this->numObj,'new',array('label' => $label,'data' => $idata,'iw' => $w,'ih' => $h,'type' => 'png','ic' => $info['width'])); + $options = [ + 'label' => $label, + 'data' => $idata, + 'bitsPerComponent' => $info['bitDepth'], + 'pdata' => $pdata, + 'iw' => $info['width'], + 'ih' => $info['height'], + 'type' => 'png', + 'color' => $color, + 'ncolor' => $ncolor, + 'masked' => $mask, + 'isMask' => $is_mask + ]; + + if (isset($transparency)) { + $options['transparency'] = $transparency; + } + + $this->o_image($this->numObj, 'new', $options); + $this->imagelist[$file] = ['label' => $label, 'w' => $info['width'], 'h' => $info['height']]; + } + + if ($is_mask) { + return; + } + + if ($w <= 0 && $h <= 0) { + $w = $info['width']; + $h = $info['height']; + } + + if ($w <= 0) { + $w = $h / $info['height'] * $info['width']; + } + + if ($h <= 0) { + $h = $w * $info['height'] / $info['width']; + } + + $this->addContent(sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\nQ", $w, $h, $x, $y, $label)); + } + + /** + * add a JPEG image into the document, from a file + * + * @param $img + * @param $x + * @param $y + * @param int $w + * @param int $h + */ + function addJpegFromFile($img, $x, $y, $w = 0, $h = 0) + { + // attempt to add a jpeg image straight from a file, using no GD commands + // note that this function is unable to operate on a remote file. + + if (substr($img, 0, 5) == 'data:') { + $filename = 'data-' . hash('md4', $img); + } else { + if (!file_exists($img)) { + return; + } + $filename = $img; + } + + if ($this->image_iscached($filename)) { + $data = null; + $imageWidth = $this->imagelist[$filename]['w']; + $imageHeight = $this->imagelist[$filename]['h']; + $channels = $this->imagelist[$filename]['c']; + } else { + $tmp = @getimagesize($img); + if ($tmp === false) { + return; + } + $imageWidth = $tmp[0]; + $imageHeight = $tmp[1]; + + if (isset($tmp['channels'])) { + $channels = $tmp['channels']; + } else { + $channels = 3; + } + + $data = file_get_contents($img); + } + + if ($w <= 0 && $h <= 0) { + $w = $imageWidth; + } + + if ($w == 0) { + $w = $h / $imageHeight * $imageWidth; + } + + if ($h == 0) { + $h = $w * $imageHeight / $imageWidth; + } + + $this->addJpegImage_common($data, $filename, $imageWidth, $imageHeight, $x, $y, $w, $h, $channels); + } + + /** + * common code used by the two JPEG adding functions + * @param $data + * @param $imgname + * @param $imageWidth + * @param $imageHeight + * @param $x + * @param $y + * @param int $w + * @param int $h + * @param int $channels + */ + private function addJpegImage_common( + &$data, + $imgname, + $imageWidth, + $imageHeight, + $x, + $y, + $w = 0, + $h = 0, + $channels = 3 + ) { + if ($this->image_iscached($imgname)) { + $label = $this->imagelist[$imgname]['label']; + //debugpng + //if (DEBUGPNG) print '[addJpegImage_common Duplicate '.$imgname.']'; + + } else { + if ($data == null) { + $this->addMessage('addJpegImage_common error - (' . $imgname . ') data not present!'); + + return; + } + + // note that this function is not to be called externally + // it is just the common code between the GD and the file options + $this->numImages++; + $im = $this->numImages; + $label = "I$im"; + $this->numObj++; + + $this->o_image( + $this->numObj, + 'new', + [ + 'label' => $label, + 'data' => &$data, + 'iw' => $imageWidth, + 'ih' => $imageHeight, + 'channels' => $channels + ] + ); + + $this->imagelist[$imgname] = [ + 'label' => $label, + 'w' => $imageWidth, + 'h' => $imageHeight, + 'c' => $channels + ]; + } + + $this->addContent(sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\nQ ", $w, $h, $x, $y, $label)); + } + + /** + * specify where the document should open when it first starts + * + * @param $style + * @param int $a + * @param int $b + * @param int $c + */ + function openHere($style, $a = 0, $b = 0, $c = 0) + { + // this function will open the document at a specified page, in a specified style + // the values for style, and the required parameters are: + // 'XYZ' left, top, zoom + // 'Fit' + // 'FitH' top + // 'FitV' left + // 'FitR' left,bottom,right + // 'FitB' + // 'FitBH' top + // 'FitBV' left + $this->numObj++; + $this->o_destination( + $this->numObj, + 'new', + ['page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c] + ); + $id = $this->catalogId; + $this->o_catalog($id, 'openHere', $this->numObj); + } + + /** + * Add JavaScript code to the PDF document + * + * @param string $code + */ + function addJavascript($code) + { + $this->javascript .= $code; + } + + /** + * create a labelled destination within the document + * + * @param $label + * @param $style + * @param int $a + * @param int $b + * @param int $c + */ + function addDestination($label, $style, $a = 0, $b = 0, $c = 0) + { + // associates the given label with the destination, it is done this way so that a destination can be specified after + // it has been linked to + // styles are the same as the 'openHere' function + $this->numObj++; + $this->o_destination( + $this->numObj, + 'new', + ['page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c] + ); + $id = $this->numObj; + + // store the label->idf relationship, note that this means that labels can be used only once + $this->destinations["$label"] = $id; + } + + /** + * define font families, this is used to initialize the font families for the default fonts + * and for the user to add new ones for their fonts. The default bahavious can be overridden should + * that be desired. + * + * @param $family + * @param string $options + */ + function setFontFamily($family, $options = '') + { + if (!is_array($options)) { + if ($family === 'init') { + // set the known family groups + // these font families will be used to enable bold and italic markers to be included + // within text streams. html forms will be used... + $this->fontFamilies['Helvetica.afm'] = + [ + 'b' => 'Helvetica-Bold.afm', + 'i' => 'Helvetica-Oblique.afm', + 'bi' => 'Helvetica-BoldOblique.afm', + 'ib' => 'Helvetica-BoldOblique.afm' + ]; + + $this->fontFamilies['Courier.afm'] = + [ + 'b' => 'Courier-Bold.afm', + 'i' => 'Courier-Oblique.afm', + 'bi' => 'Courier-BoldOblique.afm', + 'ib' => 'Courier-BoldOblique.afm' + ]; + + $this->fontFamilies['Times-Roman.afm'] = + [ + 'b' => 'Times-Bold.afm', + 'i' => 'Times-Italic.afm', + 'bi' => 'Times-BoldItalic.afm', + 'ib' => 'Times-BoldItalic.afm' + ]; + } + } else { + + // the user is trying to set a font family + // note that this can also be used to set the base ones to something else + if (isset($family) && mb_strlen($family)) { + $this->fontFamilies[$family] = $options; + } + } + } + + /** + * used to add messages for use in debugging + * + * @param $message + */ + function addMessage($message) + { + $this->messages .= $message . "\n"; + } + + /** + * a few functions which should allow the document to be treated transactionally. + * + * @param $action + */ + function transaction($action) + { + switch ($action) { + case 'start': + // store all the data away into the checkpoint variable + $data = get_object_vars($this); + $this->checkpoint = $data; + unset($data); + break; + + case 'commit': + if (is_array($this->checkpoint) && isset($this->checkpoint['checkpoint'])) { + $tmp = $this->checkpoint['checkpoint']; + $this->checkpoint = $tmp; + unset($tmp); + } else { + $this->checkpoint = ''; + } + break; + + case 'rewind': + // do not destroy the current checkpoint, but move us back to the state then, so that we can try again + if (is_array($this->checkpoint)) { + // can only abort if were inside a checkpoint + $tmp = $this->checkpoint; + + foreach ($tmp as $k => $v) { + if ($k !== 'checkpoint') { + $this->$k = $v; + } + } + unset($tmp); + } + break; + + case 'abort': + if (is_array($this->checkpoint)) { + // can only abort if were inside a checkpoint + $tmp = $this->checkpoint; + foreach ($tmp as $k => $v) { + $this->$k = $v; + } + unset($tmp); + } + break; + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/Courier-Bold.afm b/dompdf/vendor/dompdf/dompdf/lib/fonts/Courier-Bold.afm new file mode 100644 index 0000000..1f1d8e6 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/Courier-Bold.afm @@ -0,0 +1,344 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Mon Jun 23 16:28:00 0:00:00 +Comment UniqueID 43048 +Comment VMusage 41139 52164 +FontName Courier-Bold +FullName Courier Bold +FamilyName Courier +Weight Bold +ItalicAngle 0 +IsFixedPitch true +CharacterSet ExtendedRoman +FontBBox -113 -250 749 801 +UnderlinePosition -100 +UnderlineThickness 50 +Version 003.000 +Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +EncodingScheme WinAnsiEncoding +CapHeight 562 +XHeight 439 +Ascender 629 +Descender -157 +StdHW 84 +StdVW 106 +StartCharMetrics 317 +C 32 ; WX 600 ; N space ; B 0 0 0 0 ; +C 160 ; WX 600 ; N space ; B 0 0 0 0 ; +C 33 ; WX 600 ; N exclam ; B 202 -15 398 572 ; +C 34 ; WX 600 ; N quotedbl ; B 135 277 465 562 ; +C 35 ; WX 600 ; N numbersign ; B 56 -45 544 651 ; +C 36 ; WX 600 ; N dollar ; B 82 -126 519 666 ; +C 37 ; WX 600 ; N percent ; B 5 -15 595 616 ; +C 38 ; WX 600 ; N ampersand ; B 36 -15 546 543 ; +C 146 ; WX 600 ; N quoteright ; B 171 277 423 562 ; +C 40 ; WX 600 ; N parenleft ; B 219 -102 461 616 ; +C 41 ; WX 600 ; N parenright ; B 139 -102 381 616 ; +C 42 ; WX 600 ; N asterisk ; B 91 219 509 601 ; +C 43 ; WX 600 ; N plus ; B 71 39 529 478 ; +C 44 ; WX 600 ; N comma ; B 123 -111 393 174 ; +C 45 ; WX 600 ; N hyphen ; B 100 203 500 313 ; +C 173 ; WX 600 ; N hyphen ; B 100 203 500 313 ; +C 46 ; WX 600 ; N period ; B 192 -15 408 171 ; +C 47 ; WX 600 ; N slash ; B 98 -77 502 626 ; +C 48 ; WX 600 ; N zero ; B 87 -15 513 616 ; +C 49 ; WX 600 ; N one ; B 81 0 539 616 ; +C 50 ; WX 600 ; N two ; B 61 0 499 616 ; +C 51 ; WX 600 ; N three ; B 63 -15 501 616 ; +C 52 ; WX 600 ; N four ; B 53 0 507 616 ; +C 53 ; WX 600 ; N five ; B 70 -15 521 601 ; +C 54 ; WX 600 ; N six ; B 90 -15 521 616 ; +C 55 ; WX 600 ; N seven ; B 55 0 494 601 ; +C 56 ; WX 600 ; N eight ; B 83 -15 517 616 ; +C 57 ; WX 600 ; N nine ; B 79 -15 510 616 ; +C 58 ; WX 600 ; N colon ; B 191 -15 407 425 ; +C 59 ; WX 600 ; N semicolon ; B 123 -111 408 425 ; +C 60 ; WX 600 ; N less ; B 66 15 523 501 ; +C 61 ; WX 600 ; N equal ; B 71 118 529 398 ; +C 62 ; WX 600 ; N greater ; B 77 15 534 501 ; +C 63 ; WX 600 ; N question ; B 98 -14 501 580 ; +C 64 ; WX 600 ; N at ; B 16 -15 584 616 ; +C 65 ; WX 600 ; N A ; B -9 0 609 562 ; +C 66 ; WX 600 ; N B ; B 30 0 573 562 ; +C 67 ; WX 600 ; N C ; B 22 -18 560 580 ; +C 68 ; WX 600 ; N D ; B 30 0 594 562 ; +C 69 ; WX 600 ; N E ; B 25 0 560 562 ; +C 70 ; WX 600 ; N F ; B 39 0 570 562 ; +C 71 ; WX 600 ; N G ; B 22 -18 594 580 ; +C 72 ; WX 600 ; N H ; B 20 0 580 562 ; +C 73 ; WX 600 ; N I ; B 77 0 523 562 ; +C 74 ; WX 600 ; N J ; B 37 -18 601 562 ; +C 75 ; WX 600 ; N K ; B 21 0 599 562 ; +C 76 ; WX 600 ; N L ; B 39 0 578 562 ; +C 77 ; WX 600 ; N M ; B -2 0 602 562 ; +C 78 ; WX 600 ; N N ; B 8 -12 610 562 ; +C 79 ; WX 600 ; N O ; B 22 -18 578 580 ; +C 80 ; WX 600 ; N P ; B 48 0 559 562 ; +C 81 ; WX 600 ; N Q ; B 32 -138 578 580 ; +C 82 ; WX 600 ; N R ; B 24 0 599 562 ; +C 83 ; WX 600 ; N S ; B 47 -22 553 582 ; +C 84 ; WX 600 ; N T ; B 21 0 579 562 ; +C 85 ; WX 600 ; N U ; B 4 -18 596 562 ; +C 86 ; WX 600 ; N V ; B -13 0 613 562 ; +C 87 ; WX 600 ; N W ; B -18 0 618 562 ; +C 88 ; WX 600 ; N X ; B 12 0 588 562 ; +C 89 ; WX 600 ; N Y ; B 12 0 589 562 ; +C 90 ; WX 600 ; N Z ; B 62 0 539 562 ; +C 91 ; WX 600 ; N bracketleft ; B 245 -102 475 616 ; +C 92 ; WX 600 ; N backslash ; B 99 -77 503 626 ; +C 93 ; WX 600 ; N bracketright ; B 125 -102 355 616 ; +C 94 ; WX 600 ; N asciicircum ; B 108 250 492 616 ; +C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ; +C 145 ; WX 600 ; N quoteleft ; B 178 277 428 562 ; +C 97 ; WX 600 ; N a ; B 35 -15 570 454 ; +C 98 ; WX 600 ; N b ; B 0 -15 584 626 ; +C 99 ; WX 600 ; N c ; B 40 -15 545 459 ; +C 100 ; WX 600 ; N d ; B 20 -15 591 626 ; +C 101 ; WX 600 ; N e ; B 40 -15 563 454 ; +C 102 ; WX 600 ; N f ; B 83 0 547 626 ; L i fi ; L l fl ; +C 103 ; WX 600 ; N g ; B 30 -146 580 454 ; +C 104 ; WX 600 ; N h ; B 5 0 592 626 ; +C 105 ; WX 600 ; N i ; B 77 0 523 658 ; +C 106 ; WX 600 ; N j ; B 63 -146 440 658 ; +C 107 ; WX 600 ; N k ; B 20 0 585 626 ; +C 108 ; WX 600 ; N l ; B 77 0 523 626 ; +C 109 ; WX 600 ; N m ; B -22 0 626 454 ; +C 110 ; WX 600 ; N n ; B 18 0 592 454 ; +C 111 ; WX 600 ; N o ; B 30 -15 570 454 ; +C 112 ; WX 600 ; N p ; B -1 -142 570 454 ; +C 113 ; WX 600 ; N q ; B 20 -142 591 454 ; +C 114 ; WX 600 ; N r ; B 47 0 580 454 ; +C 115 ; WX 600 ; N s ; B 68 -17 535 459 ; +C 116 ; WX 600 ; N t ; B 47 -15 532 562 ; +C 117 ; WX 600 ; N u ; B -1 -15 569 439 ; +C 118 ; WX 600 ; N v ; B -1 0 601 439 ; +C 119 ; WX 600 ; N w ; B -18 0 618 439 ; +C 120 ; WX 600 ; N x ; B 6 0 594 439 ; +C 121 ; WX 600 ; N y ; B -4 -142 601 439 ; +C 122 ; WX 600 ; N z ; B 81 0 520 439 ; +C 123 ; WX 600 ; N braceleft ; B 160 -102 464 616 ; +C 124 ; WX 600 ; N bar ; B 255 -250 345 750 ; +C 125 ; WX 600 ; N braceright ; B 136 -102 440 616 ; +C 126 ; WX 600 ; N asciitilde ; B 71 153 530 356 ; +C 161 ; WX 600 ; N exclamdown ; B 202 -146 398 449 ; +C 162 ; WX 600 ; N cent ; B 66 -49 518 614 ; +C 163 ; WX 600 ; N sterling ; B 72 -28 558 611 ; +C -1 ; WX 600 ; N fraction ; B 25 -60 576 661 ; +C 165 ; WX 600 ; N yen ; B 10 0 590 562 ; +C 131 ; WX 600 ; N florin ; B -30 -131 572 616 ; +C 167 ; WX 600 ; N section ; B 83 -70 517 580 ; +C 164 ; WX 600 ; N currency ; B 54 49 546 517 ; +C 39 ; WX 600 ; N quotesingle ; B 227 277 373 562 ; +C 147 ; WX 600 ; N quotedblleft ; B 71 277 535 562 ; +C 171 ; WX 600 ; N guillemotleft ; B 8 70 553 446 ; +C 139 ; WX 600 ; N guilsinglleft ; B 141 70 459 446 ; +C 155 ; WX 600 ; N guilsinglright ; B 141 70 459 446 ; +C -1 ; WX 600 ; N fi ; B 12 0 593 626 ; +C -1 ; WX 600 ; N fl ; B 12 0 593 626 ; +C 150 ; WX 600 ; N endash ; B 65 203 535 313 ; +C 134 ; WX 600 ; N dagger ; B 106 -70 494 580 ; +C 135 ; WX 600 ; N daggerdbl ; B 106 -70 494 580 ; +C 183 ; WX 600 ; N periodcentered ; B 196 165 404 351 ; +C 182 ; WX 600 ; N paragraph ; B 6 -70 576 580 ; +C 149 ; WX 600 ; N bullet ; B 140 132 460 430 ; +C 130 ; WX 600 ; N quotesinglbase ; B 175 -142 427 143 ; +C 132 ; WX 600 ; N quotedblbase ; B 65 -142 529 143 ; +C 148 ; WX 600 ; N quotedblright ; B 61 277 525 562 ; +C 187 ; WX 600 ; N guillemotright ; B 47 70 592 446 ; +C 133 ; WX 600 ; N ellipsis ; B 26 -15 574 116 ; +C 137 ; WX 600 ; N perthousand ; B -113 -15 713 616 ; +C 191 ; WX 600 ; N questiondown ; B 99 -146 502 449 ; +C 96 ; WX 600 ; N grave ; B 132 508 395 661 ; +C 180 ; WX 600 ; N acute ; B 205 508 468 661 ; +C 136 ; WX 600 ; N circumflex ; B 103 483 497 657 ; +C 152 ; WX 600 ; N tilde ; B 89 493 512 636 ; +C 175 ; WX 600 ; N macron ; B 88 505 512 585 ; +C -1 ; WX 600 ; N breve ; B 83 468 517 631 ; +C -1 ; WX 600 ; N dotaccent ; B 230 498 370 638 ; +C 168 ; WX 600 ; N dieresis ; B 128 498 472 638 ; +C -1 ; WX 600 ; N ring ; B 198 481 402 678 ; +C 184 ; WX 600 ; N cedilla ; B 205 -206 387 0 ; +C -1 ; WX 600 ; N hungarumlaut ; B 68 488 588 661 ; +C -1 ; WX 600 ; N ogonek ; B 169 -199 400 0 ; +C -1 ; WX 600 ; N caron ; B 103 493 497 667 ; +C 151 ; WX 600 ; N emdash ; B -10 203 610 313 ; +C 198 ; WX 600 ; N AE ; B -29 0 602 562 ; +C 170 ; WX 600 ; N ordfeminine ; B 147 196 453 580 ; +C -1 ; WX 600 ; N Lslash ; B 39 0 578 562 ; +C 216 ; WX 600 ; N Oslash ; B 22 -22 578 584 ; +C 140 ; WX 600 ; N OE ; B -25 0 595 562 ; +C 186 ; WX 600 ; N ordmasculine ; B 147 196 453 580 ; +C 230 ; WX 600 ; N ae ; B -4 -15 601 454 ; +C -1 ; WX 600 ; N dotlessi ; B 77 0 523 439 ; +C -1 ; WX 600 ; N lslash ; B 77 0 523 626 ; +C 248 ; WX 600 ; N oslash ; B 30 -24 570 463 ; +C 156 ; WX 600 ; N oe ; B -18 -15 611 454 ; +C 223 ; WX 600 ; N germandbls ; B 22 -15 596 626 ; +C 207 ; WX 600 ; N Idieresis ; B 77 0 523 761 ; +C 233 ; WX 600 ; N eacute ; B 40 -15 563 661 ; +C -1 ; WX 600 ; N abreve ; B 35 -15 570 661 ; +C -1 ; WX 600 ; N uhungarumlaut ; B -1 -15 628 661 ; +C -1 ; WX 600 ; N ecaron ; B 40 -15 563 667 ; +C 159 ; WX 600 ; N Ydieresis ; B 12 0 589 761 ; +C 247 ; WX 600 ; N divide ; B 71 16 529 500 ; +C 221 ; WX 600 ; N Yacute ; B 12 0 589 784 ; +C 194 ; WX 600 ; N Acircumflex ; B -9 0 609 780 ; +C 225 ; WX 600 ; N aacute ; B 35 -15 570 661 ; +C 219 ; WX 600 ; N Ucircumflex ; B 4 -18 596 780 ; +C 253 ; WX 600 ; N yacute ; B -4 -142 601 661 ; +C -1 ; WX 600 ; N scommaaccent ; B 68 -250 535 459 ; +C 234 ; WX 600 ; N ecircumflex ; B 40 -15 563 657 ; +C -1 ; WX 600 ; N Uring ; B 4 -18 596 801 ; +C 220 ; WX 600 ; N Udieresis ; B 4 -18 596 761 ; +C -1 ; WX 600 ; N aogonek ; B 35 -199 586 454 ; +C 218 ; WX 600 ; N Uacute ; B 4 -18 596 784 ; +C -1 ; WX 600 ; N uogonek ; B -1 -199 585 439 ; +C 203 ; WX 600 ; N Edieresis ; B 25 0 560 761 ; +C -1 ; WX 600 ; N Dcroat ; B 30 0 594 562 ; +C -1 ; WX 600 ; N commaaccent ; B 205 -250 397 -57 ; +C 169 ; WX 600 ; N copyright ; B 0 -18 600 580 ; +C -1 ; WX 600 ; N Emacron ; B 25 0 560 708 ; +C -1 ; WX 600 ; N ccaron ; B 40 -15 545 667 ; +C 229 ; WX 600 ; N aring ; B 35 -15 570 678 ; +C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 610 562 ; +C -1 ; WX 600 ; N lacute ; B 77 0 523 801 ; +C 224 ; WX 600 ; N agrave ; B 35 -15 570 661 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 21 -250 579 562 ; +C -1 ; WX 600 ; N Cacute ; B 22 -18 560 784 ; +C 227 ; WX 600 ; N atilde ; B 35 -15 570 636 ; +C -1 ; WX 600 ; N Edotaccent ; B 25 0 560 761 ; +C 154 ; WX 600 ; N scaron ; B 68 -17 535 667 ; +C -1 ; WX 600 ; N scedilla ; B 68 -206 535 459 ; +C 237 ; WX 600 ; N iacute ; B 77 0 523 661 ; +C -1 ; WX 600 ; N lozenge ; B 66 0 534 740 ; +C -1 ; WX 600 ; N Rcaron ; B 24 0 599 790 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 22 -250 594 580 ; +C 251 ; WX 600 ; N ucircumflex ; B -1 -15 569 657 ; +C 226 ; WX 600 ; N acircumflex ; B 35 -15 570 657 ; +C -1 ; WX 600 ; N Amacron ; B -9 0 609 708 ; +C -1 ; WX 600 ; N rcaron ; B 47 0 580 667 ; +C 231 ; WX 600 ; N ccedilla ; B 40 -206 545 459 ; +C -1 ; WX 600 ; N Zdotaccent ; B 62 0 539 761 ; +C 222 ; WX 600 ; N Thorn ; B 48 0 557 562 ; +C -1 ; WX 600 ; N Omacron ; B 22 -18 578 708 ; +C -1 ; WX 600 ; N Racute ; B 24 0 599 784 ; +C -1 ; WX 600 ; N Sacute ; B 47 -22 553 784 ; +C -1 ; WX 600 ; N dcaron ; B 20 -15 727 626 ; +C -1 ; WX 600 ; N Umacron ; B 4 -18 596 708 ; +C -1 ; WX 600 ; N uring ; B -1 -15 569 678 ; +C 179 ; WX 600 ; N threesuperior ; B 138 222 433 616 ; +C 210 ; WX 600 ; N Ograve ; B 22 -18 578 784 ; +C 192 ; WX 600 ; N Agrave ; B -9 0 609 784 ; +C -1 ; WX 600 ; N Abreve ; B -9 0 609 784 ; +C 215 ; WX 600 ; N multiply ; B 81 39 520 478 ; +C 250 ; WX 600 ; N uacute ; B -1 -15 569 661 ; +C -1 ; WX 600 ; N Tcaron ; B 21 0 579 790 ; +C -1 ; WX 600 ; N partialdiff ; B 63 -38 537 728 ; +C 255 ; WX 600 ; N ydieresis ; B -4 -142 601 638 ; +C -1 ; WX 600 ; N Nacute ; B 8 -12 610 784 ; +C 238 ; WX 600 ; N icircumflex ; B 73 0 523 657 ; +C 202 ; WX 600 ; N Ecircumflex ; B 25 0 560 780 ; +C 228 ; WX 600 ; N adieresis ; B 35 -15 570 638 ; +C 235 ; WX 600 ; N edieresis ; B 40 -15 563 638 ; +C -1 ; WX 600 ; N cacute ; B 40 -15 545 661 ; +C -1 ; WX 600 ; N nacute ; B 18 0 592 661 ; +C -1 ; WX 600 ; N umacron ; B -1 -15 569 585 ; +C -1 ; WX 600 ; N Ncaron ; B 8 -12 610 790 ; +C 205 ; WX 600 ; N Iacute ; B 77 0 523 784 ; +C 177 ; WX 600 ; N plusminus ; B 71 24 529 515 ; +C 166 ; WX 600 ; N brokenbar ; B 255 -175 345 675 ; +C 174 ; WX 600 ; N registered ; B 0 -18 600 580 ; +C -1 ; WX 600 ; N Gbreve ; B 22 -18 594 784 ; +C -1 ; WX 600 ; N Idotaccent ; B 77 0 523 761 ; +C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ; +C 200 ; WX 600 ; N Egrave ; B 25 0 560 784 ; +C -1 ; WX 600 ; N racute ; B 47 0 580 661 ; +C -1 ; WX 600 ; N omacron ; B 30 -15 570 585 ; +C -1 ; WX 600 ; N Zacute ; B 62 0 539 784 ; +C 142 ; WX 600 ; N Zcaron ; B 62 0 539 790 ; +C -1 ; WX 600 ; N greaterequal ; B 26 0 523 696 ; +C 208 ; WX 600 ; N Eth ; B 30 0 594 562 ; +C 199 ; WX 600 ; N Ccedilla ; B 22 -206 560 580 ; +C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 523 626 ; +C -1 ; WX 600 ; N tcaron ; B 47 -15 532 703 ; +C -1 ; WX 600 ; N eogonek ; B 40 -199 563 454 ; +C -1 ; WX 600 ; N Uogonek ; B 4 -199 596 562 ; +C 193 ; WX 600 ; N Aacute ; B -9 0 609 784 ; +C 196 ; WX 600 ; N Adieresis ; B -9 0 609 761 ; +C 232 ; WX 600 ; N egrave ; B 40 -15 563 661 ; +C -1 ; WX 600 ; N zacute ; B 81 0 520 661 ; +C -1 ; WX 600 ; N iogonek ; B 77 -199 523 658 ; +C 211 ; WX 600 ; N Oacute ; B 22 -18 578 784 ; +C 243 ; WX 600 ; N oacute ; B 30 -15 570 661 ; +C -1 ; WX 600 ; N amacron ; B 35 -15 570 585 ; +C -1 ; WX 600 ; N sacute ; B 68 -17 535 661 ; +C 239 ; WX 600 ; N idieresis ; B 77 0 523 618 ; +C 212 ; WX 600 ; N Ocircumflex ; B 22 -18 578 780 ; +C 217 ; WX 600 ; N Ugrave ; B 4 -18 596 784 ; +C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ; +C 254 ; WX 600 ; N thorn ; B -14 -142 570 626 ; +C 178 ; WX 600 ; N twosuperior ; B 143 230 436 616 ; +C 214 ; WX 600 ; N Odieresis ; B 22 -18 578 761 ; +C 181 ; WX 600 ; N mu ; B -1 -142 569 439 ; +C 236 ; WX 600 ; N igrave ; B 77 0 523 661 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 30 -15 668 661 ; +C -1 ; WX 600 ; N Eogonek ; B 25 -199 576 562 ; +C -1 ; WX 600 ; N dcroat ; B 20 -15 591 626 ; +C 190 ; WX 600 ; N threequarters ; B -47 -60 648 661 ; +C -1 ; WX 600 ; N Scedilla ; B 47 -206 553 582 ; +C -1 ; WX 600 ; N lcaron ; B 77 0 597 626 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 599 562 ; +C -1 ; WX 600 ; N Lacute ; B 39 0 578 784 ; +C 153 ; WX 600 ; N trademark ; B -9 230 749 562 ; +C -1 ; WX 600 ; N edotaccent ; B 40 -15 563 638 ; +C 204 ; WX 600 ; N Igrave ; B 77 0 523 784 ; +C -1 ; WX 600 ; N Imacron ; B 77 0 523 708 ; +C -1 ; WX 600 ; N Lcaron ; B 39 0 637 562 ; +C 189 ; WX 600 ; N onehalf ; B -47 -60 648 661 ; +C -1 ; WX 600 ; N lessequal ; B 26 0 523 696 ; +C 244 ; WX 600 ; N ocircumflex ; B 30 -15 570 657 ; +C 241 ; WX 600 ; N ntilde ; B 18 0 592 636 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 4 -18 638 784 ; +C 201 ; WX 600 ; N Eacute ; B 25 0 560 784 ; +C -1 ; WX 600 ; N emacron ; B 40 -15 563 585 ; +C -1 ; WX 600 ; N gbreve ; B 30 -146 580 661 ; +C 188 ; WX 600 ; N onequarter ; B -56 -60 656 661 ; +C 138 ; WX 600 ; N Scaron ; B 47 -22 553 790 ; +C -1 ; WX 600 ; N Scommaaccent ; B 47 -250 553 582 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 22 -18 628 784 ; +C 176 ; WX 600 ; N degree ; B 86 243 474 616 ; +C 242 ; WX 600 ; N ograve ; B 30 -15 570 661 ; +C -1 ; WX 600 ; N Ccaron ; B 22 -18 560 790 ; +C 249 ; WX 600 ; N ugrave ; B -1 -15 569 661 ; +C -1 ; WX 600 ; N radical ; B -19 -104 473 778 ; +C -1 ; WX 600 ; N Dcaron ; B 30 0 594 790 ; +C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 580 454 ; +C 209 ; WX 600 ; N Ntilde ; B 8 -12 610 759 ; +C 245 ; WX 600 ; N otilde ; B 30 -15 570 636 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 599 562 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 578 562 ; +C 195 ; WX 600 ; N Atilde ; B -9 0 609 759 ; +C -1 ; WX 600 ; N Aogonek ; B -9 -199 625 562 ; +C 197 ; WX 600 ; N Aring ; B -9 0 609 801 ; +C 213 ; WX 600 ; N Otilde ; B 22 -18 578 759 ; +C -1 ; WX 600 ; N zdotaccent ; B 81 0 520 638 ; +C -1 ; WX 600 ; N Ecaron ; B 25 0 560 790 ; +C -1 ; WX 600 ; N Iogonek ; B 77 -199 523 562 ; +C -1 ; WX 600 ; N kcommaaccent ; B 20 -250 585 626 ; +C -1 ; WX 600 ; N minus ; B 71 203 529 313 ; +C 206 ; WX 600 ; N Icircumflex ; B 77 0 523 780 ; +C -1 ; WX 600 ; N ncaron ; B 18 0 592 667 ; +C -1 ; WX 600 ; N tcommaaccent ; B 47 -250 532 562 ; +C 172 ; WX 600 ; N logicalnot ; B 71 103 529 413 ; +C 246 ; WX 600 ; N odieresis ; B 30 -15 570 638 ; +C 252 ; WX 600 ; N udieresis ; B -1 -15 569 638 ; +C -1 ; WX 600 ; N notequal ; B 12 -47 537 563 ; +C -1 ; WX 600 ; N gcommaaccent ; B 30 -146 580 714 ; +C 240 ; WX 600 ; N eth ; B 58 -27 543 626 ; +C 158 ; WX 600 ; N zcaron ; B 81 0 520 667 ; +C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 592 454 ; +C 185 ; WX 600 ; N onesuperior ; B 153 230 447 616 ; +C -1 ; WX 600 ; N imacron ; B 77 0 523 585 ; +C 128 ; WX 600 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/Courier-BoldOblique.afm b/dompdf/vendor/dompdf/dompdf/lib/fonts/Courier-BoldOblique.afm new file mode 100644 index 0000000..914680a --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/Courier-BoldOblique.afm @@ -0,0 +1,344 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Mon Jun 23 16:28:46 0:00:00 +Comment UniqueID 43049 +Comment VMusage 17529 79244 +FontName Courier-BoldOblique +FullName Courier Bold Oblique +FamilyName Courier +Weight Bold +ItalicAngle -12 +IsFixedPitch true +CharacterSet ExtendedRoman +FontBBox -57 -250 869 801 +UnderlinePosition -100 +UnderlineThickness 50 +Version 3 +Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +EncodingScheme WinAnsiEncoding +CapHeight 562 +XHeight 439 +Ascender 629 +Descender -157 +StdHW 84 +StdVW 106 +StartCharMetrics 317 +C 32 ; WX 600 ; N space ; B 0 0 0 0 ; +C 160 ; WX 600 ; N space ; B 0 0 0 0 ; +C 33 ; WX 600 ; N exclam ; B 215 -15 495 572 ; +C 34 ; WX 600 ; N quotedbl ; B 211 277 585 562 ; +C 35 ; WX 600 ; N numbersign ; B 88 -45 641 651 ; +C 36 ; WX 600 ; N dollar ; B 87 -126 630 666 ; +C 37 ; WX 600 ; N percent ; B 101 -15 625 616 ; +C 38 ; WX 600 ; N ampersand ; B 61 -15 595 543 ; +C 146 ; WX 600 ; N quoteright ; B 229 277 543 562 ; +C 40 ; WX 600 ; N parenleft ; B 265 -102 592 616 ; +C 41 ; WX 600 ; N parenright ; B 117 -102 444 616 ; +C 42 ; WX 600 ; N asterisk ; B 179 219 598 601 ; +C 43 ; WX 600 ; N plus ; B 114 39 596 478 ; +C 44 ; WX 600 ; N comma ; B 99 -111 430 174 ; +C 45 ; WX 600 ; N hyphen ; B 143 203 567 313 ; +C 173 ; WX 600 ; N hyphen ; B 143 203 567 313 ; +C 46 ; WX 600 ; N period ; B 206 -15 427 171 ; +C 47 ; WX 600 ; N slash ; B 90 -77 626 626 ; +C 48 ; WX 600 ; N zero ; B 135 -15 593 616 ; +C 49 ; WX 600 ; N one ; B 93 0 562 616 ; +C 50 ; WX 600 ; N two ; B 61 0 594 616 ; +C 51 ; WX 600 ; N three ; B 71 -15 571 616 ; +C 52 ; WX 600 ; N four ; B 81 0 559 616 ; +C 53 ; WX 600 ; N five ; B 77 -15 621 601 ; +C 54 ; WX 600 ; N six ; B 135 -15 652 616 ; +C 55 ; WX 600 ; N seven ; B 147 0 622 601 ; +C 56 ; WX 600 ; N eight ; B 115 -15 604 616 ; +C 57 ; WX 600 ; N nine ; B 75 -15 592 616 ; +C 58 ; WX 600 ; N colon ; B 205 -15 480 425 ; +C 59 ; WX 600 ; N semicolon ; B 99 -111 481 425 ; +C 60 ; WX 600 ; N less ; B 120 15 613 501 ; +C 61 ; WX 600 ; N equal ; B 96 118 614 398 ; +C 62 ; WX 600 ; N greater ; B 97 15 589 501 ; +C 63 ; WX 600 ; N question ; B 183 -14 592 580 ; +C 64 ; WX 600 ; N at ; B 65 -15 642 616 ; +C 65 ; WX 600 ; N A ; B -9 0 632 562 ; +C 66 ; WX 600 ; N B ; B 30 0 630 562 ; +C 67 ; WX 600 ; N C ; B 74 -18 675 580 ; +C 68 ; WX 600 ; N D ; B 30 0 664 562 ; +C 69 ; WX 600 ; N E ; B 25 0 670 562 ; +C 70 ; WX 600 ; N F ; B 39 0 684 562 ; +C 71 ; WX 600 ; N G ; B 74 -18 675 580 ; +C 72 ; WX 600 ; N H ; B 20 0 700 562 ; +C 73 ; WX 600 ; N I ; B 77 0 643 562 ; +C 74 ; WX 600 ; N J ; B 58 -18 721 562 ; +C 75 ; WX 600 ; N K ; B 21 0 692 562 ; +C 76 ; WX 600 ; N L ; B 39 0 636 562 ; +C 77 ; WX 600 ; N M ; B -2 0 722 562 ; +C 78 ; WX 600 ; N N ; B 8 -12 730 562 ; +C 79 ; WX 600 ; N O ; B 74 -18 645 580 ; +C 80 ; WX 600 ; N P ; B 48 0 643 562 ; +C 81 ; WX 600 ; N Q ; B 83 -138 636 580 ; +C 82 ; WX 600 ; N R ; B 24 0 617 562 ; +C 83 ; WX 600 ; N S ; B 54 -22 673 582 ; +C 84 ; WX 600 ; N T ; B 86 0 679 562 ; +C 85 ; WX 600 ; N U ; B 101 -18 716 562 ; +C 86 ; WX 600 ; N V ; B 84 0 733 562 ; +C 87 ; WX 600 ; N W ; B 79 0 738 562 ; +C 88 ; WX 600 ; N X ; B 12 0 690 562 ; +C 89 ; WX 600 ; N Y ; B 109 0 709 562 ; +C 90 ; WX 600 ; N Z ; B 62 0 637 562 ; +C 91 ; WX 600 ; N bracketleft ; B 223 -102 606 616 ; +C 92 ; WX 600 ; N backslash ; B 222 -77 496 626 ; +C 93 ; WX 600 ; N bracketright ; B 103 -102 486 616 ; +C 94 ; WX 600 ; N asciicircum ; B 171 250 556 616 ; +C 95 ; WX 600 ; N underscore ; B -27 -125 585 -75 ; +C 145 ; WX 600 ; N quoteleft ; B 297 277 487 562 ; +C 97 ; WX 600 ; N a ; B 61 -15 593 454 ; +C 98 ; WX 600 ; N b ; B 13 -15 636 626 ; +C 99 ; WX 600 ; N c ; B 81 -15 631 459 ; +C 100 ; WX 600 ; N d ; B 60 -15 645 626 ; +C 101 ; WX 600 ; N e ; B 81 -15 605 454 ; +C 102 ; WX 600 ; N f ; B 83 0 677 626 ; L i fi ; L l fl ; +C 103 ; WX 600 ; N g ; B 40 -146 674 454 ; +C 104 ; WX 600 ; N h ; B 18 0 615 626 ; +C 105 ; WX 600 ; N i ; B 77 0 546 658 ; +C 106 ; WX 600 ; N j ; B 36 -146 580 658 ; +C 107 ; WX 600 ; N k ; B 33 0 643 626 ; +C 108 ; WX 600 ; N l ; B 77 0 546 626 ; +C 109 ; WX 600 ; N m ; B -22 0 649 454 ; +C 110 ; WX 600 ; N n ; B 18 0 615 454 ; +C 111 ; WX 600 ; N o ; B 71 -15 622 454 ; +C 112 ; WX 600 ; N p ; B -32 -142 622 454 ; +C 113 ; WX 600 ; N q ; B 60 -142 685 454 ; +C 114 ; WX 600 ; N r ; B 47 0 655 454 ; +C 115 ; WX 600 ; N s ; B 66 -17 608 459 ; +C 116 ; WX 600 ; N t ; B 118 -15 567 562 ; +C 117 ; WX 600 ; N u ; B 70 -15 592 439 ; +C 118 ; WX 600 ; N v ; B 70 0 695 439 ; +C 119 ; WX 600 ; N w ; B 53 0 712 439 ; +C 120 ; WX 600 ; N x ; B 6 0 671 439 ; +C 121 ; WX 600 ; N y ; B -21 -142 695 439 ; +C 122 ; WX 600 ; N z ; B 81 0 614 439 ; +C 123 ; WX 600 ; N braceleft ; B 203 -102 595 616 ; +C 124 ; WX 600 ; N bar ; B 201 -250 505 750 ; +C 125 ; WX 600 ; N braceright ; B 114 -102 506 616 ; +C 126 ; WX 600 ; N asciitilde ; B 120 153 590 356 ; +C 161 ; WX 600 ; N exclamdown ; B 196 -146 477 449 ; +C 162 ; WX 600 ; N cent ; B 121 -49 605 614 ; +C 163 ; WX 600 ; N sterling ; B 106 -28 650 611 ; +C -1 ; WX 600 ; N fraction ; B 22 -60 708 661 ; +C 165 ; WX 600 ; N yen ; B 98 0 710 562 ; +C 131 ; WX 600 ; N florin ; B -57 -131 702 616 ; +C 167 ; WX 600 ; N section ; B 74 -70 620 580 ; +C 164 ; WX 600 ; N currency ; B 77 49 644 517 ; +C 39 ; WX 600 ; N quotesingle ; B 303 277 493 562 ; +C 147 ; WX 600 ; N quotedblleft ; B 190 277 594 562 ; +C 171 ; WX 600 ; N guillemotleft ; B 62 70 639 446 ; +C 139 ; WX 600 ; N guilsinglleft ; B 195 70 545 446 ; +C 155 ; WX 600 ; N guilsinglright ; B 165 70 514 446 ; +C -1 ; WX 600 ; N fi ; B 12 0 644 626 ; +C -1 ; WX 600 ; N fl ; B 12 0 644 626 ; +C 150 ; WX 600 ; N endash ; B 108 203 602 313 ; +C 134 ; WX 600 ; N dagger ; B 175 -70 586 580 ; +C 135 ; WX 600 ; N daggerdbl ; B 121 -70 587 580 ; +C 183 ; WX 600 ; N periodcentered ; B 248 165 461 351 ; +C 182 ; WX 600 ; N paragraph ; B 61 -70 700 580 ; +C 149 ; WX 600 ; N bullet ; B 196 132 523 430 ; +C 130 ; WX 600 ; N quotesinglbase ; B 144 -142 458 143 ; +C 132 ; WX 600 ; N quotedblbase ; B 34 -142 560 143 ; +C 148 ; WX 600 ; N quotedblright ; B 119 277 645 562 ; +C 187 ; WX 600 ; N guillemotright ; B 71 70 647 446 ; +C 133 ; WX 600 ; N ellipsis ; B 35 -15 587 116 ; +C 137 ; WX 600 ; N perthousand ; B -45 -15 743 616 ; +C 191 ; WX 600 ; N questiondown ; B 100 -146 509 449 ; +C 96 ; WX 600 ; N grave ; B 272 508 503 661 ; +C 180 ; WX 600 ; N acute ; B 312 508 609 661 ; +C 136 ; WX 600 ; N circumflex ; B 212 483 607 657 ; +C 152 ; WX 600 ; N tilde ; B 199 493 643 636 ; +C 175 ; WX 600 ; N macron ; B 195 505 637 585 ; +C -1 ; WX 600 ; N breve ; B 217 468 652 631 ; +C -1 ; WX 600 ; N dotaccent ; B 348 498 493 638 ; +C 168 ; WX 600 ; N dieresis ; B 246 498 595 638 ; +C -1 ; WX 600 ; N ring ; B 319 481 528 678 ; +C 184 ; WX 600 ; N cedilla ; B 168 -206 368 0 ; +C -1 ; WX 600 ; N hungarumlaut ; B 171 488 729 661 ; +C -1 ; WX 600 ; N ogonek ; B 143 -199 367 0 ; +C -1 ; WX 600 ; N caron ; B 238 493 633 667 ; +C 151 ; WX 600 ; N emdash ; B 33 203 677 313 ; +C 198 ; WX 600 ; N AE ; B -29 0 708 562 ; +C 170 ; WX 600 ; N ordfeminine ; B 188 196 526 580 ; +C -1 ; WX 600 ; N Lslash ; B 39 0 636 562 ; +C 216 ; WX 600 ; N Oslash ; B 48 -22 673 584 ; +C 140 ; WX 600 ; N OE ; B 26 0 701 562 ; +C 186 ; WX 600 ; N ordmasculine ; B 188 196 543 580 ; +C 230 ; WX 600 ; N ae ; B 21 -15 652 454 ; +C -1 ; WX 600 ; N dotlessi ; B 77 0 546 439 ; +C -1 ; WX 600 ; N lslash ; B 77 0 587 626 ; +C 248 ; WX 600 ; N oslash ; B 54 -24 638 463 ; +C 156 ; WX 600 ; N oe ; B 18 -15 662 454 ; +C 223 ; WX 600 ; N germandbls ; B 22 -15 629 626 ; +C 207 ; WX 600 ; N Idieresis ; B 77 0 643 761 ; +C 233 ; WX 600 ; N eacute ; B 81 -15 609 661 ; +C -1 ; WX 600 ; N abreve ; B 61 -15 658 661 ; +C -1 ; WX 600 ; N uhungarumlaut ; B 70 -15 769 661 ; +C -1 ; WX 600 ; N ecaron ; B 81 -15 633 667 ; +C 159 ; WX 600 ; N Ydieresis ; B 109 0 709 761 ; +C 247 ; WX 600 ; N divide ; B 114 16 596 500 ; +C 221 ; WX 600 ; N Yacute ; B 109 0 709 784 ; +C 194 ; WX 600 ; N Acircumflex ; B -9 0 632 780 ; +C 225 ; WX 600 ; N aacute ; B 61 -15 609 661 ; +C 219 ; WX 600 ; N Ucircumflex ; B 101 -18 716 780 ; +C 253 ; WX 600 ; N yacute ; B -21 -142 695 661 ; +C -1 ; WX 600 ; N scommaaccent ; B 66 -250 608 459 ; +C 234 ; WX 600 ; N ecircumflex ; B 81 -15 607 657 ; +C -1 ; WX 600 ; N Uring ; B 101 -18 716 801 ; +C 220 ; WX 600 ; N Udieresis ; B 101 -18 716 761 ; +C -1 ; WX 600 ; N aogonek ; B 61 -199 593 454 ; +C 218 ; WX 600 ; N Uacute ; B 101 -18 716 784 ; +C -1 ; WX 600 ; N uogonek ; B 70 -199 592 439 ; +C 203 ; WX 600 ; N Edieresis ; B 25 0 670 761 ; +C -1 ; WX 600 ; N Dcroat ; B 30 0 664 562 ; +C -1 ; WX 600 ; N commaaccent ; B 151 -250 385 -57 ; +C 169 ; WX 600 ; N copyright ; B 53 -18 667 580 ; +C -1 ; WX 600 ; N Emacron ; B 25 0 670 708 ; +C -1 ; WX 600 ; N ccaron ; B 81 -15 633 667 ; +C 229 ; WX 600 ; N aring ; B 61 -15 593 678 ; +C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 730 562 ; +C -1 ; WX 600 ; N lacute ; B 77 0 639 801 ; +C 224 ; WX 600 ; N agrave ; B 61 -15 593 661 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 86 -250 679 562 ; +C -1 ; WX 600 ; N Cacute ; B 74 -18 675 784 ; +C 227 ; WX 600 ; N atilde ; B 61 -15 643 636 ; +C -1 ; WX 600 ; N Edotaccent ; B 25 0 670 761 ; +C 154 ; WX 600 ; N scaron ; B 66 -17 633 667 ; +C -1 ; WX 600 ; N scedilla ; B 66 -206 608 459 ; +C 237 ; WX 600 ; N iacute ; B 77 0 609 661 ; +C -1 ; WX 600 ; N lozenge ; B 145 0 614 740 ; +C -1 ; WX 600 ; N Rcaron ; B 24 0 659 790 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 74 -250 675 580 ; +C 251 ; WX 600 ; N ucircumflex ; B 70 -15 597 657 ; +C 226 ; WX 600 ; N acircumflex ; B 61 -15 607 657 ; +C -1 ; WX 600 ; N Amacron ; B -9 0 633 708 ; +C -1 ; WX 600 ; N rcaron ; B 47 0 655 667 ; +C 231 ; WX 600 ; N ccedilla ; B 81 -206 631 459 ; +C -1 ; WX 600 ; N Zdotaccent ; B 62 0 637 761 ; +C 222 ; WX 600 ; N Thorn ; B 48 0 620 562 ; +C -1 ; WX 600 ; N Omacron ; B 74 -18 663 708 ; +C -1 ; WX 600 ; N Racute ; B 24 0 665 784 ; +C -1 ; WX 600 ; N Sacute ; B 54 -22 673 784 ; +C -1 ; WX 600 ; N dcaron ; B 60 -15 861 626 ; +C -1 ; WX 600 ; N Umacron ; B 101 -18 716 708 ; +C -1 ; WX 600 ; N uring ; B 70 -15 592 678 ; +C 179 ; WX 600 ; N threesuperior ; B 193 222 526 616 ; +C 210 ; WX 600 ; N Ograve ; B 74 -18 645 784 ; +C 192 ; WX 600 ; N Agrave ; B -9 0 632 784 ; +C -1 ; WX 600 ; N Abreve ; B -9 0 684 784 ; +C 215 ; WX 600 ; N multiply ; B 104 39 606 478 ; +C 250 ; WX 600 ; N uacute ; B 70 -15 599 661 ; +C -1 ; WX 600 ; N Tcaron ; B 86 0 679 790 ; +C -1 ; WX 600 ; N partialdiff ; B 91 -38 627 728 ; +C 255 ; WX 600 ; N ydieresis ; B -21 -142 695 638 ; +C -1 ; WX 600 ; N Nacute ; B 8 -12 730 784 ; +C 238 ; WX 600 ; N icircumflex ; B 77 0 577 657 ; +C 202 ; WX 600 ; N Ecircumflex ; B 25 0 670 780 ; +C 228 ; WX 600 ; N adieresis ; B 61 -15 595 638 ; +C 235 ; WX 600 ; N edieresis ; B 81 -15 605 638 ; +C -1 ; WX 600 ; N cacute ; B 81 -15 649 661 ; +C -1 ; WX 600 ; N nacute ; B 18 0 639 661 ; +C -1 ; WX 600 ; N umacron ; B 70 -15 637 585 ; +C -1 ; WX 600 ; N Ncaron ; B 8 -12 730 790 ; +C 205 ; WX 600 ; N Iacute ; B 77 0 643 784 ; +C 177 ; WX 600 ; N plusminus ; B 76 24 614 515 ; +C 166 ; WX 600 ; N brokenbar ; B 217 -175 489 675 ; +C 174 ; WX 600 ; N registered ; B 53 -18 667 580 ; +C -1 ; WX 600 ; N Gbreve ; B 74 -18 684 784 ; +C -1 ; WX 600 ; N Idotaccent ; B 77 0 643 761 ; +C -1 ; WX 600 ; N summation ; B 15 -10 672 706 ; +C 200 ; WX 600 ; N Egrave ; B 25 0 670 784 ; +C -1 ; WX 600 ; N racute ; B 47 0 655 661 ; +C -1 ; WX 600 ; N omacron ; B 71 -15 637 585 ; +C -1 ; WX 600 ; N Zacute ; B 62 0 665 784 ; +C 142 ; WX 600 ; N Zcaron ; B 62 0 659 790 ; +C -1 ; WX 600 ; N greaterequal ; B 26 0 627 696 ; +C 208 ; WX 600 ; N Eth ; B 30 0 664 562 ; +C 199 ; WX 600 ; N Ccedilla ; B 74 -206 675 580 ; +C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 546 626 ; +C -1 ; WX 600 ; N tcaron ; B 118 -15 627 703 ; +C -1 ; WX 600 ; N eogonek ; B 81 -199 605 454 ; +C -1 ; WX 600 ; N Uogonek ; B 101 -199 716 562 ; +C 193 ; WX 600 ; N Aacute ; B -9 0 655 784 ; +C 196 ; WX 600 ; N Adieresis ; B -9 0 632 761 ; +C 232 ; WX 600 ; N egrave ; B 81 -15 605 661 ; +C -1 ; WX 600 ; N zacute ; B 81 0 614 661 ; +C -1 ; WX 600 ; N iogonek ; B 77 -199 546 658 ; +C 211 ; WX 600 ; N Oacute ; B 74 -18 645 784 ; +C 243 ; WX 600 ; N oacute ; B 71 -15 649 661 ; +C -1 ; WX 600 ; N amacron ; B 61 -15 637 585 ; +C -1 ; WX 600 ; N sacute ; B 66 -17 609 661 ; +C 239 ; WX 600 ; N idieresis ; B 77 0 561 618 ; +C 212 ; WX 600 ; N Ocircumflex ; B 74 -18 645 780 ; +C 217 ; WX 600 ; N Ugrave ; B 101 -18 716 784 ; +C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ; +C 254 ; WX 600 ; N thorn ; B -32 -142 622 626 ; +C 178 ; WX 600 ; N twosuperior ; B 191 230 542 616 ; +C 214 ; WX 600 ; N Odieresis ; B 74 -18 645 761 ; +C 181 ; WX 600 ; N mu ; B 49 -142 592 439 ; +C 236 ; WX 600 ; N igrave ; B 77 0 546 661 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 71 -15 809 661 ; +C -1 ; WX 600 ; N Eogonek ; B 25 -199 670 562 ; +C -1 ; WX 600 ; N dcroat ; B 60 -15 712 626 ; +C 190 ; WX 600 ; N threequarters ; B 8 -60 699 661 ; +C -1 ; WX 600 ; N Scedilla ; B 54 -206 673 582 ; +C -1 ; WX 600 ; N lcaron ; B 77 0 731 626 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 692 562 ; +C -1 ; WX 600 ; N Lacute ; B 39 0 636 784 ; +C 153 ; WX 600 ; N trademark ; B 86 230 869 562 ; +C -1 ; WX 600 ; N edotaccent ; B 81 -15 605 638 ; +C 204 ; WX 600 ; N Igrave ; B 77 0 643 784 ; +C -1 ; WX 600 ; N Imacron ; B 77 0 663 708 ; +C -1 ; WX 600 ; N Lcaron ; B 39 0 757 562 ; +C 189 ; WX 600 ; N onehalf ; B 22 -60 716 661 ; +C -1 ; WX 600 ; N lessequal ; B 26 0 671 696 ; +C 244 ; WX 600 ; N ocircumflex ; B 71 -15 622 657 ; +C 241 ; WX 600 ; N ntilde ; B 18 0 643 636 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 101 -18 805 784 ; +C 201 ; WX 600 ; N Eacute ; B 25 0 670 784 ; +C -1 ; WX 600 ; N emacron ; B 81 -15 637 585 ; +C -1 ; WX 600 ; N gbreve ; B 40 -146 674 661 ; +C 188 ; WX 600 ; N onequarter ; B 13 -60 707 661 ; +C 138 ; WX 600 ; N Scaron ; B 54 -22 689 790 ; +C -1 ; WX 600 ; N Scommaaccent ; B 54 -250 673 582 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 74 -18 795 784 ; +C 176 ; WX 600 ; N degree ; B 173 243 570 616 ; +C 242 ; WX 600 ; N ograve ; B 71 -15 622 661 ; +C -1 ; WX 600 ; N Ccaron ; B 74 -18 689 790 ; +C 249 ; WX 600 ; N ugrave ; B 70 -15 592 661 ; +C -1 ; WX 600 ; N radical ; B 67 -104 635 778 ; +C -1 ; WX 600 ; N Dcaron ; B 30 0 664 790 ; +C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 655 454 ; +C 209 ; WX 600 ; N Ntilde ; B 8 -12 730 759 ; +C 245 ; WX 600 ; N otilde ; B 71 -15 643 636 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 617 562 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 636 562 ; +C 195 ; WX 600 ; N Atilde ; B -9 0 669 759 ; +C -1 ; WX 600 ; N Aogonek ; B -9 -199 632 562 ; +C 197 ; WX 600 ; N Aring ; B -9 0 632 801 ; +C 213 ; WX 600 ; N Otilde ; B 74 -18 669 759 ; +C -1 ; WX 600 ; N zdotaccent ; B 81 0 614 638 ; +C -1 ; WX 600 ; N Ecaron ; B 25 0 670 790 ; +C -1 ; WX 600 ; N Iogonek ; B 77 -199 643 562 ; +C -1 ; WX 600 ; N kcommaaccent ; B 33 -250 643 626 ; +C -1 ; WX 600 ; N minus ; B 114 203 596 313 ; +C 206 ; WX 600 ; N Icircumflex ; B 77 0 643 780 ; +C -1 ; WX 600 ; N ncaron ; B 18 0 633 667 ; +C -1 ; WX 600 ; N tcommaaccent ; B 118 -250 567 562 ; +C 172 ; WX 600 ; N logicalnot ; B 135 103 617 413 ; +C 246 ; WX 600 ; N odieresis ; B 71 -15 622 638 ; +C 252 ; WX 600 ; N udieresis ; B 70 -15 595 638 ; +C -1 ; WX 600 ; N notequal ; B 30 -47 626 563 ; +C -1 ; WX 600 ; N gcommaaccent ; B 40 -146 674 714 ; +C 240 ; WX 600 ; N eth ; B 93 -27 661 626 ; +C 158 ; WX 600 ; N zcaron ; B 81 0 643 667 ; +C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 615 454 ; +C 185 ; WX 600 ; N onesuperior ; B 212 230 514 616 ; +C -1 ; WX 600 ; N imacron ; B 77 0 575 585 ; +C 128 ; WX 600 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/Courier-Oblique.afm b/dompdf/vendor/dompdf/dompdf/lib/fonts/Courier-Oblique.afm new file mode 100644 index 0000000..87e2154 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/Courier-Oblique.afm @@ -0,0 +1,344 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 0:00:00 17:37:52 1997 +Comment UniqueID 43051 +Comment VMusage 16248 75829 +FontName Courier-Oblique +FullName Courier Oblique +FamilyName Courier +Weight Medium +ItalicAngle -12 +IsFixedPitch true +CharacterSet ExtendedRoman +FontBBox -27 -250 849 805 +UnderlinePosition -100 +UnderlineThickness 50 +Version 003.000 +Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +EncodingScheme WinAnsiEncoding +CapHeight 562 +XHeight 426 +Ascender 629 +Descender -157 +StdHW 51 +StdVW 51 +StartCharMetrics 317 +C 32 ; WX 600 ; N space ; B 0 0 0 0 ; +C 160 ; WX 600 ; N space ; B 0 0 0 0 ; +C 33 ; WX 600 ; N exclam ; B 243 -15 464 572 ; +C 34 ; WX 600 ; N quotedbl ; B 273 328 532 562 ; +C 35 ; WX 600 ; N numbersign ; B 133 -32 596 639 ; +C 36 ; WX 600 ; N dollar ; B 108 -126 596 662 ; +C 37 ; WX 600 ; N percent ; B 134 -15 599 622 ; +C 38 ; WX 600 ; N ampersand ; B 87 -15 580 543 ; +C 146 ; WX 600 ; N quoteright ; B 283 328 495 562 ; +C 40 ; WX 600 ; N parenleft ; B 313 -108 572 622 ; +C 41 ; WX 600 ; N parenright ; B 137 -108 396 622 ; +C 42 ; WX 600 ; N asterisk ; B 212 257 580 607 ; +C 43 ; WX 600 ; N plus ; B 129 44 580 470 ; +C 44 ; WX 600 ; N comma ; B 157 -112 370 122 ; +C 45 ; WX 600 ; N hyphen ; B 152 231 558 285 ; +C 173 ; WX 600 ; N hyphen ; B 152 231 558 285 ; +C 46 ; WX 600 ; N period ; B 238 -15 382 109 ; +C 47 ; WX 600 ; N slash ; B 112 -80 604 629 ; +C 48 ; WX 600 ; N zero ; B 154 -15 575 622 ; +C 49 ; WX 600 ; N one ; B 98 0 515 622 ; +C 50 ; WX 600 ; N two ; B 70 0 568 622 ; +C 51 ; WX 600 ; N three ; B 82 -15 538 622 ; +C 52 ; WX 600 ; N four ; B 108 0 541 622 ; +C 53 ; WX 600 ; N five ; B 99 -15 589 607 ; +C 54 ; WX 600 ; N six ; B 155 -15 629 622 ; +C 55 ; WX 600 ; N seven ; B 182 0 612 607 ; +C 56 ; WX 600 ; N eight ; B 132 -15 588 622 ; +C 57 ; WX 600 ; N nine ; B 93 -15 574 622 ; +C 58 ; WX 600 ; N colon ; B 238 -15 441 385 ; +C 59 ; WX 600 ; N semicolon ; B 157 -112 441 385 ; +C 60 ; WX 600 ; N less ; B 96 42 610 472 ; +C 61 ; WX 600 ; N equal ; B 109 138 600 376 ; +C 62 ; WX 600 ; N greater ; B 85 42 599 472 ; +C 63 ; WX 600 ; N question ; B 222 -15 583 572 ; +C 64 ; WX 600 ; N at ; B 127 -15 582 622 ; +C 65 ; WX 600 ; N A ; B 3 0 607 562 ; +C 66 ; WX 600 ; N B ; B 43 0 616 562 ; +C 67 ; WX 600 ; N C ; B 93 -18 655 580 ; +C 68 ; WX 600 ; N D ; B 43 0 645 562 ; +C 69 ; WX 600 ; N E ; B 53 0 660 562 ; +C 70 ; WX 600 ; N F ; B 53 0 660 562 ; +C 71 ; WX 600 ; N G ; B 83 -18 645 580 ; +C 72 ; WX 600 ; N H ; B 32 0 687 562 ; +C 73 ; WX 600 ; N I ; B 96 0 623 562 ; +C 74 ; WX 600 ; N J ; B 52 -18 685 562 ; +C 75 ; WX 600 ; N K ; B 38 0 671 562 ; +C 76 ; WX 600 ; N L ; B 47 0 607 562 ; +C 77 ; WX 600 ; N M ; B 4 0 715 562 ; +C 78 ; WX 600 ; N N ; B 7 -13 712 562 ; +C 79 ; WX 600 ; N O ; B 94 -18 625 580 ; +C 80 ; WX 600 ; N P ; B 79 0 644 562 ; +C 81 ; WX 600 ; N Q ; B 95 -138 625 580 ; +C 82 ; WX 600 ; N R ; B 38 0 598 562 ; +C 83 ; WX 600 ; N S ; B 76 -20 650 580 ; +C 84 ; WX 600 ; N T ; B 108 0 665 562 ; +C 85 ; WX 600 ; N U ; B 125 -18 702 562 ; +C 86 ; WX 600 ; N V ; B 105 -13 723 562 ; +C 87 ; WX 600 ; N W ; B 106 -13 722 562 ; +C 88 ; WX 600 ; N X ; B 23 0 675 562 ; +C 89 ; WX 600 ; N Y ; B 133 0 695 562 ; +C 90 ; WX 600 ; N Z ; B 86 0 610 562 ; +C 91 ; WX 600 ; N bracketleft ; B 246 -108 574 622 ; +C 92 ; WX 600 ; N backslash ; B 249 -80 468 629 ; +C 93 ; WX 600 ; N bracketright ; B 135 -108 463 622 ; +C 94 ; WX 600 ; N asciicircum ; B 175 354 587 622 ; +C 95 ; WX 600 ; N underscore ; B -27 -125 584 -75 ; +C 145 ; WX 600 ; N quoteleft ; B 343 328 457 562 ; +C 97 ; WX 600 ; N a ; B 76 -15 569 441 ; +C 98 ; WX 600 ; N b ; B 29 -15 625 629 ; +C 99 ; WX 600 ; N c ; B 106 -15 608 441 ; +C 100 ; WX 600 ; N d ; B 85 -15 640 629 ; +C 101 ; WX 600 ; N e ; B 106 -15 598 441 ; +C 102 ; WX 600 ; N f ; B 114 0 662 629 ; L i fi ; L l fl ; +C 103 ; WX 600 ; N g ; B 61 -157 657 441 ; +C 104 ; WX 600 ; N h ; B 33 0 592 629 ; +C 105 ; WX 600 ; N i ; B 95 0 515 657 ; +C 106 ; WX 600 ; N j ; B 52 -157 550 657 ; +C 107 ; WX 600 ; N k ; B 58 0 633 629 ; +C 108 ; WX 600 ; N l ; B 95 0 515 629 ; +C 109 ; WX 600 ; N m ; B -5 0 615 441 ; +C 110 ; WX 600 ; N n ; B 26 0 585 441 ; +C 111 ; WX 600 ; N o ; B 102 -15 588 441 ; +C 112 ; WX 600 ; N p ; B -24 -157 605 441 ; +C 113 ; WX 600 ; N q ; B 85 -157 682 441 ; +C 114 ; WX 600 ; N r ; B 60 0 636 441 ; +C 115 ; WX 600 ; N s ; B 78 -15 584 441 ; +C 116 ; WX 600 ; N t ; B 167 -15 561 561 ; +C 117 ; WX 600 ; N u ; B 101 -15 572 426 ; +C 118 ; WX 600 ; N v ; B 90 -10 681 426 ; +C 119 ; WX 600 ; N w ; B 76 -10 695 426 ; +C 120 ; WX 600 ; N x ; B 20 0 655 426 ; +C 121 ; WX 600 ; N y ; B -4 -157 683 426 ; +C 122 ; WX 600 ; N z ; B 99 0 593 426 ; +C 123 ; WX 600 ; N braceleft ; B 233 -108 569 622 ; +C 124 ; WX 600 ; N bar ; B 222 -250 485 750 ; +C 125 ; WX 600 ; N braceright ; B 140 -108 477 622 ; +C 126 ; WX 600 ; N asciitilde ; B 116 197 600 320 ; +C 161 ; WX 600 ; N exclamdown ; B 225 -157 445 430 ; +C 162 ; WX 600 ; N cent ; B 151 -49 588 614 ; +C 163 ; WX 600 ; N sterling ; B 124 -21 621 611 ; +C -1 ; WX 600 ; N fraction ; B 84 -57 646 665 ; +C 165 ; WX 600 ; N yen ; B 120 0 693 562 ; +C 131 ; WX 600 ; N florin ; B -26 -143 671 622 ; +C 167 ; WX 600 ; N section ; B 104 -78 590 580 ; +C 164 ; WX 600 ; N currency ; B 94 58 628 506 ; +C 39 ; WX 600 ; N quotesingle ; B 345 328 460 562 ; +C 147 ; WX 600 ; N quotedblleft ; B 262 328 541 562 ; +C 171 ; WX 600 ; N guillemotleft ; B 92 70 652 446 ; +C 139 ; WX 600 ; N guilsinglleft ; B 204 70 540 446 ; +C 155 ; WX 600 ; N guilsinglright ; B 170 70 506 446 ; +C -1 ; WX 600 ; N fi ; B 3 0 619 629 ; +C -1 ; WX 600 ; N fl ; B 3 0 619 629 ; +C 150 ; WX 600 ; N endash ; B 124 231 586 285 ; +C 134 ; WX 600 ; N dagger ; B 217 -78 546 580 ; +C 135 ; WX 600 ; N daggerdbl ; B 163 -78 546 580 ; +C 183 ; WX 600 ; N periodcentered ; B 275 189 434 327 ; +C 182 ; WX 600 ; N paragraph ; B 100 -78 630 562 ; +C 149 ; WX 600 ; N bullet ; B 224 130 485 383 ; +C 130 ; WX 600 ; N quotesinglbase ; B 185 -134 397 100 ; +C 132 ; WX 600 ; N quotedblbase ; B 115 -134 478 100 ; +C 148 ; WX 600 ; N quotedblright ; B 213 328 576 562 ; +C 187 ; WX 600 ; N guillemotright ; B 58 70 618 446 ; +C 133 ; WX 600 ; N ellipsis ; B 46 -15 575 111 ; +C 137 ; WX 600 ; N perthousand ; B 59 -15 627 622 ; +C 191 ; WX 600 ; N questiondown ; B 105 -157 466 430 ; +C 96 ; WX 600 ; N grave ; B 294 497 484 672 ; +C 180 ; WX 600 ; N acute ; B 348 497 612 672 ; +C 136 ; WX 600 ; N circumflex ; B 229 477 581 654 ; +C 152 ; WX 600 ; N tilde ; B 212 489 629 606 ; +C 175 ; WX 600 ; N macron ; B 232 525 600 565 ; +C -1 ; WX 600 ; N breve ; B 279 501 576 609 ; +C -1 ; WX 600 ; N dotaccent ; B 373 537 478 640 ; +C 168 ; WX 600 ; N dieresis ; B 272 537 579 640 ; +C -1 ; WX 600 ; N ring ; B 332 463 500 627 ; +C 184 ; WX 600 ; N cedilla ; B 197 -151 344 10 ; +C -1 ; WX 600 ; N hungarumlaut ; B 239 497 683 672 ; +C -1 ; WX 600 ; N ogonek ; B 189 -172 377 4 ; +C -1 ; WX 600 ; N caron ; B 262 492 614 669 ; +C 151 ; WX 600 ; N emdash ; B 49 231 661 285 ; +C 198 ; WX 600 ; N AE ; B 3 0 655 562 ; +C 170 ; WX 600 ; N ordfeminine ; B 209 249 512 580 ; +C -1 ; WX 600 ; N Lslash ; B 47 0 607 562 ; +C 216 ; WX 600 ; N Oslash ; B 94 -80 625 629 ; +C 140 ; WX 600 ; N OE ; B 59 0 672 562 ; +C 186 ; WX 600 ; N ordmasculine ; B 210 249 535 580 ; +C 230 ; WX 600 ; N ae ; B 41 -15 626 441 ; +C -1 ; WX 600 ; N dotlessi ; B 95 0 515 426 ; +C -1 ; WX 600 ; N lslash ; B 95 0 587 629 ; +C 248 ; WX 600 ; N oslash ; B 102 -80 588 506 ; +C 156 ; WX 600 ; N oe ; B 54 -15 615 441 ; +C 223 ; WX 600 ; N germandbls ; B 48 -15 617 629 ; +C 207 ; WX 600 ; N Idieresis ; B 96 0 623 753 ; +C 233 ; WX 600 ; N eacute ; B 106 -15 612 672 ; +C -1 ; WX 600 ; N abreve ; B 76 -15 576 609 ; +C -1 ; WX 600 ; N uhungarumlaut ; B 101 -15 723 672 ; +C -1 ; WX 600 ; N ecaron ; B 106 -15 614 669 ; +C 159 ; WX 600 ; N Ydieresis ; B 133 0 695 753 ; +C 247 ; WX 600 ; N divide ; B 136 48 573 467 ; +C 221 ; WX 600 ; N Yacute ; B 133 0 695 805 ; +C 194 ; WX 600 ; N Acircumflex ; B 3 0 607 787 ; +C 225 ; WX 600 ; N aacute ; B 76 -15 612 672 ; +C 219 ; WX 600 ; N Ucircumflex ; B 125 -18 702 787 ; +C 253 ; WX 600 ; N yacute ; B -4 -157 683 672 ; +C -1 ; WX 600 ; N scommaaccent ; B 78 -250 584 441 ; +C 234 ; WX 600 ; N ecircumflex ; B 106 -15 598 654 ; +C -1 ; WX 600 ; N Uring ; B 125 -18 702 760 ; +C 220 ; WX 600 ; N Udieresis ; B 125 -18 702 753 ; +C -1 ; WX 600 ; N aogonek ; B 76 -172 569 441 ; +C 218 ; WX 600 ; N Uacute ; B 125 -18 702 805 ; +C -1 ; WX 600 ; N uogonek ; B 101 -172 572 426 ; +C 203 ; WX 600 ; N Edieresis ; B 53 0 660 753 ; +C -1 ; WX 600 ; N Dcroat ; B 43 0 645 562 ; +C -1 ; WX 600 ; N commaaccent ; B 145 -250 323 -58 ; +C 169 ; WX 600 ; N copyright ; B 53 -18 667 580 ; +C -1 ; WX 600 ; N Emacron ; B 53 0 660 698 ; +C -1 ; WX 600 ; N ccaron ; B 106 -15 614 669 ; +C 229 ; WX 600 ; N aring ; B 76 -15 569 627 ; +C -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 712 562 ; +C -1 ; WX 600 ; N lacute ; B 95 0 640 805 ; +C 224 ; WX 600 ; N agrave ; B 76 -15 569 672 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 108 -250 665 562 ; +C -1 ; WX 600 ; N Cacute ; B 93 -18 655 805 ; +C 227 ; WX 600 ; N atilde ; B 76 -15 629 606 ; +C -1 ; WX 600 ; N Edotaccent ; B 53 0 660 753 ; +C 154 ; WX 600 ; N scaron ; B 78 -15 614 669 ; +C -1 ; WX 600 ; N scedilla ; B 78 -151 584 441 ; +C 237 ; WX 600 ; N iacute ; B 95 0 612 672 ; +C -1 ; WX 600 ; N lozenge ; B 94 0 519 706 ; +C -1 ; WX 600 ; N Rcaron ; B 38 0 642 802 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 83 -250 645 580 ; +C 251 ; WX 600 ; N ucircumflex ; B 101 -15 572 654 ; +C 226 ; WX 600 ; N acircumflex ; B 76 -15 581 654 ; +C -1 ; WX 600 ; N Amacron ; B 3 0 607 698 ; +C -1 ; WX 600 ; N rcaron ; B 60 0 636 669 ; +C 231 ; WX 600 ; N ccedilla ; B 106 -151 614 441 ; +C -1 ; WX 600 ; N Zdotaccent ; B 86 0 610 753 ; +C 222 ; WX 600 ; N Thorn ; B 79 0 606 562 ; +C -1 ; WX 600 ; N Omacron ; B 94 -18 628 698 ; +C -1 ; WX 600 ; N Racute ; B 38 0 670 805 ; +C -1 ; WX 600 ; N Sacute ; B 76 -20 650 805 ; +C -1 ; WX 600 ; N dcaron ; B 85 -15 849 629 ; +C -1 ; WX 600 ; N Umacron ; B 125 -18 702 698 ; +C -1 ; WX 600 ; N uring ; B 101 -15 572 627 ; +C 179 ; WX 600 ; N threesuperior ; B 213 240 501 622 ; +C 210 ; WX 600 ; N Ograve ; B 94 -18 625 805 ; +C 192 ; WX 600 ; N Agrave ; B 3 0 607 805 ; +C -1 ; WX 600 ; N Abreve ; B 3 0 607 732 ; +C 215 ; WX 600 ; N multiply ; B 103 43 607 470 ; +C 250 ; WX 600 ; N uacute ; B 101 -15 602 672 ; +C -1 ; WX 600 ; N Tcaron ; B 108 0 665 802 ; +C -1 ; WX 600 ; N partialdiff ; B 45 -38 546 710 ; +C 255 ; WX 600 ; N ydieresis ; B -4 -157 683 620 ; +C -1 ; WX 600 ; N Nacute ; B 7 -13 712 805 ; +C 238 ; WX 600 ; N icircumflex ; B 95 0 551 654 ; +C 202 ; WX 600 ; N Ecircumflex ; B 53 0 660 787 ; +C 228 ; WX 600 ; N adieresis ; B 76 -15 575 620 ; +C 235 ; WX 600 ; N edieresis ; B 106 -15 598 620 ; +C -1 ; WX 600 ; N cacute ; B 106 -15 612 672 ; +C -1 ; WX 600 ; N nacute ; B 26 0 602 672 ; +C -1 ; WX 600 ; N umacron ; B 101 -15 600 565 ; +C -1 ; WX 600 ; N Ncaron ; B 7 -13 712 802 ; +C 205 ; WX 600 ; N Iacute ; B 96 0 640 805 ; +C 177 ; WX 600 ; N plusminus ; B 96 44 594 558 ; +C 166 ; WX 600 ; N brokenbar ; B 238 -175 469 675 ; +C 174 ; WX 600 ; N registered ; B 53 -18 667 580 ; +C -1 ; WX 600 ; N Gbreve ; B 83 -18 645 732 ; +C -1 ; WX 600 ; N Idotaccent ; B 96 0 623 753 ; +C -1 ; WX 600 ; N summation ; B 15 -10 670 706 ; +C 200 ; WX 600 ; N Egrave ; B 53 0 660 805 ; +C -1 ; WX 600 ; N racute ; B 60 0 636 672 ; +C -1 ; WX 600 ; N omacron ; B 102 -15 600 565 ; +C -1 ; WX 600 ; N Zacute ; B 86 0 670 805 ; +C 142 ; WX 600 ; N Zcaron ; B 86 0 642 802 ; +C -1 ; WX 600 ; N greaterequal ; B 98 0 594 710 ; +C 208 ; WX 600 ; N Eth ; B 43 0 645 562 ; +C 199 ; WX 600 ; N Ccedilla ; B 93 -151 658 580 ; +C -1 ; WX 600 ; N lcommaaccent ; B 95 -250 515 629 ; +C -1 ; WX 600 ; N tcaron ; B 167 -15 587 717 ; +C -1 ; WX 600 ; N eogonek ; B 106 -172 598 441 ; +C -1 ; WX 600 ; N Uogonek ; B 124 -172 702 562 ; +C 193 ; WX 600 ; N Aacute ; B 3 0 660 805 ; +C 196 ; WX 600 ; N Adieresis ; B 3 0 607 753 ; +C 232 ; WX 600 ; N egrave ; B 106 -15 598 672 ; +C -1 ; WX 600 ; N zacute ; B 99 0 612 672 ; +C -1 ; WX 600 ; N iogonek ; B 95 -172 515 657 ; +C 211 ; WX 600 ; N Oacute ; B 94 -18 640 805 ; +C 243 ; WX 600 ; N oacute ; B 102 -15 612 672 ; +C -1 ; WX 600 ; N amacron ; B 76 -15 600 565 ; +C -1 ; WX 600 ; N sacute ; B 78 -15 612 672 ; +C 239 ; WX 600 ; N idieresis ; B 95 0 545 620 ; +C 212 ; WX 600 ; N Ocircumflex ; B 94 -18 625 787 ; +C 217 ; WX 600 ; N Ugrave ; B 125 -18 702 805 ; +C -1 ; WX 600 ; N Delta ; B 6 0 598 688 ; +C 254 ; WX 600 ; N thorn ; B -24 -157 605 629 ; +C 178 ; WX 600 ; N twosuperior ; B 230 249 535 622 ; +C 214 ; WX 600 ; N Odieresis ; B 94 -18 625 753 ; +C 181 ; WX 600 ; N mu ; B 72 -157 572 426 ; +C 236 ; WX 600 ; N igrave ; B 95 0 515 672 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 102 -15 723 672 ; +C -1 ; WX 600 ; N Eogonek ; B 53 -172 660 562 ; +C -1 ; WX 600 ; N dcroat ; B 85 -15 704 629 ; +C 190 ; WX 600 ; N threequarters ; B 73 -56 659 666 ; +C -1 ; WX 600 ; N Scedilla ; B 76 -151 650 580 ; +C -1 ; WX 600 ; N lcaron ; B 95 0 667 629 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 671 562 ; +C -1 ; WX 600 ; N Lacute ; B 47 0 607 805 ; +C 153 ; WX 600 ; N trademark ; B 75 263 742 562 ; +C -1 ; WX 600 ; N edotaccent ; B 106 -15 598 620 ; +C 204 ; WX 600 ; N Igrave ; B 96 0 623 805 ; +C -1 ; WX 600 ; N Imacron ; B 96 0 628 698 ; +C -1 ; WX 600 ; N Lcaron ; B 47 0 632 562 ; +C 189 ; WX 600 ; N onehalf ; B 65 -57 669 665 ; +C -1 ; WX 600 ; N lessequal ; B 98 0 645 710 ; +C 244 ; WX 600 ; N ocircumflex ; B 102 -15 588 654 ; +C 241 ; WX 600 ; N ntilde ; B 26 0 629 606 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 125 -18 761 805 ; +C 201 ; WX 600 ; N Eacute ; B 53 0 670 805 ; +C -1 ; WX 600 ; N emacron ; B 106 -15 600 565 ; +C -1 ; WX 600 ; N gbreve ; B 61 -157 657 609 ; +C 188 ; WX 600 ; N onequarter ; B 65 -57 674 665 ; +C 138 ; WX 600 ; N Scaron ; B 76 -20 672 802 ; +C -1 ; WX 600 ; N Scommaaccent ; B 76 -250 650 580 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 94 -18 751 805 ; +C 176 ; WX 600 ; N degree ; B 214 269 576 622 ; +C 242 ; WX 600 ; N ograve ; B 102 -15 588 672 ; +C -1 ; WX 600 ; N Ccaron ; B 93 -18 672 802 ; +C 249 ; WX 600 ; N ugrave ; B 101 -15 572 672 ; +C -1 ; WX 600 ; N radical ; B 85 -15 765 792 ; +C -1 ; WX 600 ; N Dcaron ; B 43 0 645 802 ; +C -1 ; WX 600 ; N rcommaaccent ; B 60 -250 636 441 ; +C 209 ; WX 600 ; N Ntilde ; B 7 -13 712 729 ; +C 245 ; WX 600 ; N otilde ; B 102 -15 629 606 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 598 562 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 607 562 ; +C 195 ; WX 600 ; N Atilde ; B 3 0 655 729 ; +C -1 ; WX 600 ; N Aogonek ; B 3 -172 607 562 ; +C 197 ; WX 600 ; N Aring ; B 3 0 607 750 ; +C 213 ; WX 600 ; N Otilde ; B 94 -18 655 729 ; +C -1 ; WX 600 ; N zdotaccent ; B 99 0 593 620 ; +C -1 ; WX 600 ; N Ecaron ; B 53 0 660 802 ; +C -1 ; WX 600 ; N Iogonek ; B 96 -172 623 562 ; +C -1 ; WX 600 ; N kcommaaccent ; B 58 -250 633 629 ; +C -1 ; WX 600 ; N minus ; B 129 232 580 283 ; +C 206 ; WX 600 ; N Icircumflex ; B 96 0 623 787 ; +C -1 ; WX 600 ; N ncaron ; B 26 0 614 669 ; +C -1 ; WX 600 ; N tcommaaccent ; B 165 -250 561 561 ; +C 172 ; WX 600 ; N logicalnot ; B 155 108 591 369 ; +C 246 ; WX 600 ; N odieresis ; B 102 -15 588 620 ; +C 252 ; WX 600 ; N udieresis ; B 101 -15 575 620 ; +C -1 ; WX 600 ; N notequal ; B 43 -16 621 529 ; +C -1 ; WX 600 ; N gcommaaccent ; B 61 -157 657 708 ; +C 240 ; WX 600 ; N eth ; B 102 -15 639 629 ; +C 158 ; WX 600 ; N zcaron ; B 99 0 624 669 ; +C -1 ; WX 600 ; N ncommaaccent ; B 26 -250 585 441 ; +C 185 ; WX 600 ; N onesuperior ; B 231 249 491 622 ; +C -1 ; WX 600 ; N imacron ; B 95 0 543 565 ; +C 128 ; WX 600 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/Courier.afm b/dompdf/vendor/dompdf/dompdf/lib/fonts/Courier.afm new file mode 100644 index 0000000..9e7982e --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/Courier.afm @@ -0,0 +1,344 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 17:27:09 1997 +Comment UniqueID 43050 +Comment VMusage 39754 50779 +FontName Courier +FullName Courier +FamilyName Courier +Weight Medium +ItalicAngle 0 +IsFixedPitch true +CharacterSet ExtendedRoman +FontBBox -23 -250 715 805 +UnderlinePosition -100 +UnderlineThickness 50 +Version 003.000 +Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +EncodingScheme WinAnsiEncoding +CapHeight 562 +XHeight 426 +Ascender 629 +Descender -157 +StdHW 51 +StdVW 51 +StartCharMetrics 317 +C 32 ; WX 600 ; N space ; B 0 0 0 0 ; +C 160 ; WX 600 ; N space ; B 0 0 0 0 ; +C 33 ; WX 600 ; N exclam ; B 236 -15 364 572 ; +C 34 ; WX 600 ; N quotedbl ; B 187 328 413 562 ; +C 35 ; WX 600 ; N numbersign ; B 93 -32 507 639 ; +C 36 ; WX 600 ; N dollar ; B 105 -126 496 662 ; +C 37 ; WX 600 ; N percent ; B 81 -15 518 622 ; +C 38 ; WX 600 ; N ampersand ; B 63 -15 538 543 ; +C 146 ; WX 600 ; N quoteright ; B 213 328 376 562 ; +C 40 ; WX 600 ; N parenleft ; B 269 -108 440 622 ; +C 41 ; WX 600 ; N parenright ; B 160 -108 331 622 ; +C 42 ; WX 600 ; N asterisk ; B 116 257 484 607 ; +C 43 ; WX 600 ; N plus ; B 80 44 520 470 ; +C 44 ; WX 600 ; N comma ; B 181 -112 344 122 ; +C 45 ; WX 600 ; N hyphen ; B 103 231 497 285 ; +C 173 ; WX 600 ; N hyphen ; B 103 231 497 285 ; +C 46 ; WX 600 ; N period ; B 229 -15 371 109 ; +C 47 ; WX 600 ; N slash ; B 125 -80 475 629 ; +C 48 ; WX 600 ; N zero ; B 106 -15 494 622 ; +C 49 ; WX 600 ; N one ; B 96 0 505 622 ; +C 50 ; WX 600 ; N two ; B 70 0 471 622 ; +C 51 ; WX 600 ; N three ; B 75 -15 466 622 ; +C 52 ; WX 600 ; N four ; B 78 0 500 622 ; +C 53 ; WX 600 ; N five ; B 92 -15 497 607 ; +C 54 ; WX 600 ; N six ; B 111 -15 497 622 ; +C 55 ; WX 600 ; N seven ; B 82 0 483 607 ; +C 56 ; WX 600 ; N eight ; B 102 -15 498 622 ; +C 57 ; WX 600 ; N nine ; B 96 -15 489 622 ; +C 58 ; WX 600 ; N colon ; B 229 -15 371 385 ; +C 59 ; WX 600 ; N semicolon ; B 181 -112 371 385 ; +C 60 ; WX 600 ; N less ; B 41 42 519 472 ; +C 61 ; WX 600 ; N equal ; B 80 138 520 376 ; +C 62 ; WX 600 ; N greater ; B 66 42 544 472 ; +C 63 ; WX 600 ; N question ; B 129 -15 492 572 ; +C 64 ; WX 600 ; N at ; B 77 -15 533 622 ; +C 65 ; WX 600 ; N A ; B 3 0 597 562 ; +C 66 ; WX 600 ; N B ; B 43 0 559 562 ; +C 67 ; WX 600 ; N C ; B 41 -18 540 580 ; +C 68 ; WX 600 ; N D ; B 43 0 574 562 ; +C 69 ; WX 600 ; N E ; B 53 0 550 562 ; +C 70 ; WX 600 ; N F ; B 53 0 545 562 ; +C 71 ; WX 600 ; N G ; B 31 -18 575 580 ; +C 72 ; WX 600 ; N H ; B 32 0 568 562 ; +C 73 ; WX 600 ; N I ; B 96 0 504 562 ; +C 74 ; WX 600 ; N J ; B 34 -18 566 562 ; +C 75 ; WX 600 ; N K ; B 38 0 582 562 ; +C 76 ; WX 600 ; N L ; B 47 0 554 562 ; +C 77 ; WX 600 ; N M ; B 4 0 596 562 ; +C 78 ; WX 600 ; N N ; B 7 -13 593 562 ; +C 79 ; WX 600 ; N O ; B 43 -18 557 580 ; +C 80 ; WX 600 ; N P ; B 79 0 558 562 ; +C 81 ; WX 600 ; N Q ; B 43 -138 557 580 ; +C 82 ; WX 600 ; N R ; B 38 0 588 562 ; +C 83 ; WX 600 ; N S ; B 72 -20 529 580 ; +C 84 ; WX 600 ; N T ; B 38 0 563 562 ; +C 85 ; WX 600 ; N U ; B 17 -18 583 562 ; +C 86 ; WX 600 ; N V ; B -4 -13 604 562 ; +C 87 ; WX 600 ; N W ; B -3 -13 603 562 ; +C 88 ; WX 600 ; N X ; B 23 0 577 562 ; +C 89 ; WX 600 ; N Y ; B 24 0 576 562 ; +C 90 ; WX 600 ; N Z ; B 86 0 514 562 ; +C 91 ; WX 600 ; N bracketleft ; B 269 -108 442 622 ; +C 92 ; WX 600 ; N backslash ; B 118 -80 482 629 ; +C 93 ; WX 600 ; N bracketright ; B 158 -108 331 622 ; +C 94 ; WX 600 ; N asciicircum ; B 94 354 506 622 ; +C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ; +C 145 ; WX 600 ; N quoteleft ; B 224 328 387 562 ; +C 97 ; WX 600 ; N a ; B 53 -15 559 441 ; +C 98 ; WX 600 ; N b ; B 14 -15 575 629 ; +C 99 ; WX 600 ; N c ; B 66 -15 529 441 ; +C 100 ; WX 600 ; N d ; B 45 -15 591 629 ; +C 101 ; WX 600 ; N e ; B 66 -15 548 441 ; +C 102 ; WX 600 ; N f ; B 114 0 531 629 ; L i fi ; L l fl ; +C 103 ; WX 600 ; N g ; B 45 -157 566 441 ; +C 104 ; WX 600 ; N h ; B 18 0 582 629 ; +C 105 ; WX 600 ; N i ; B 95 0 505 657 ; +C 106 ; WX 600 ; N j ; B 82 -157 410 657 ; +C 107 ; WX 600 ; N k ; B 43 0 580 629 ; +C 108 ; WX 600 ; N l ; B 95 0 505 629 ; +C 109 ; WX 600 ; N m ; B -5 0 605 441 ; +C 110 ; WX 600 ; N n ; B 26 0 575 441 ; +C 111 ; WX 600 ; N o ; B 62 -15 538 441 ; +C 112 ; WX 600 ; N p ; B 9 -157 555 441 ; +C 113 ; WX 600 ; N q ; B 45 -157 591 441 ; +C 114 ; WX 600 ; N r ; B 60 0 559 441 ; +C 115 ; WX 600 ; N s ; B 80 -15 513 441 ; +C 116 ; WX 600 ; N t ; B 87 -15 530 561 ; +C 117 ; WX 600 ; N u ; B 21 -15 562 426 ; +C 118 ; WX 600 ; N v ; B 10 -10 590 426 ; +C 119 ; WX 600 ; N w ; B -4 -10 604 426 ; +C 120 ; WX 600 ; N x ; B 20 0 580 426 ; +C 121 ; WX 600 ; N y ; B 7 -157 592 426 ; +C 122 ; WX 600 ; N z ; B 99 0 502 426 ; +C 123 ; WX 600 ; N braceleft ; B 182 -108 437 622 ; +C 124 ; WX 600 ; N bar ; B 275 -250 326 750 ; +C 125 ; WX 600 ; N braceright ; B 163 -108 418 622 ; +C 126 ; WX 600 ; N asciitilde ; B 63 197 540 320 ; +C 161 ; WX 600 ; N exclamdown ; B 236 -157 364 430 ; +C 162 ; WX 600 ; N cent ; B 96 -49 500 614 ; +C 163 ; WX 600 ; N sterling ; B 84 -21 521 611 ; +C -1 ; WX 600 ; N fraction ; B 92 -57 509 665 ; +C 165 ; WX 600 ; N yen ; B 26 0 574 562 ; +C 131 ; WX 600 ; N florin ; B 4 -143 539 622 ; +C 167 ; WX 600 ; N section ; B 113 -78 488 580 ; +C 164 ; WX 600 ; N currency ; B 73 58 527 506 ; +C 39 ; WX 600 ; N quotesingle ; B 259 328 341 562 ; +C 147 ; WX 600 ; N quotedblleft ; B 143 328 471 562 ; +C 171 ; WX 600 ; N guillemotleft ; B 37 70 563 446 ; +C 139 ; WX 600 ; N guilsinglleft ; B 149 70 451 446 ; +C 155 ; WX 600 ; N guilsinglright ; B 149 70 451 446 ; +C -1 ; WX 600 ; N fi ; B 3 0 597 629 ; +C -1 ; WX 600 ; N fl ; B 3 0 597 629 ; +C 150 ; WX 600 ; N endash ; B 75 231 525 285 ; +C 134 ; WX 600 ; N dagger ; B 141 -78 459 580 ; +C 135 ; WX 600 ; N daggerdbl ; B 141 -78 459 580 ; +C 183 ; WX 600 ; N periodcentered ; B 222 189 378 327 ; +C 182 ; WX 600 ; N paragraph ; B 50 -78 511 562 ; +C 149 ; WX 600 ; N bullet ; B 172 130 428 383 ; +C 130 ; WX 600 ; N quotesinglbase ; B 213 -134 376 100 ; +C 132 ; WX 600 ; N quotedblbase ; B 143 -134 457 100 ; +C 148 ; WX 600 ; N quotedblright ; B 143 328 457 562 ; +C 187 ; WX 600 ; N guillemotright ; B 37 70 563 446 ; +C 133 ; WX 600 ; N ellipsis ; B 37 -15 563 111 ; +C 137 ; WX 600 ; N perthousand ; B 3 -15 600 622 ; +C 191 ; WX 600 ; N questiondown ; B 108 -157 471 430 ; +C 96 ; WX 600 ; N grave ; B 151 497 378 672 ; +C 180 ; WX 600 ; N acute ; B 242 497 469 672 ; +C 136 ; WX 600 ; N circumflex ; B 124 477 476 654 ; +C 152 ; WX 600 ; N tilde ; B 105 489 503 606 ; +C 175 ; WX 600 ; N macron ; B 120 525 480 565 ; +C -1 ; WX 600 ; N breve ; B 153 501 447 609 ; +C -1 ; WX 600 ; N dotaccent ; B 249 537 352 640 ; +C 168 ; WX 600 ; N dieresis ; B 148 537 453 640 ; +C -1 ; WX 600 ; N ring ; B 218 463 382 627 ; +C 184 ; WX 600 ; N cedilla ; B 224 -151 362 10 ; +C -1 ; WX 600 ; N hungarumlaut ; B 133 497 540 672 ; +C -1 ; WX 600 ; N ogonek ; B 211 -172 407 4 ; +C -1 ; WX 600 ; N caron ; B 124 492 476 669 ; +C 151 ; WX 600 ; N emdash ; B 0 231 600 285 ; +C 198 ; WX 600 ; N AE ; B 3 0 550 562 ; +C 170 ; WX 600 ; N ordfeminine ; B 156 249 442 580 ; +C -1 ; WX 600 ; N Lslash ; B 47 0 554 562 ; +C 216 ; WX 600 ; N Oslash ; B 43 -80 557 629 ; +C 140 ; WX 600 ; N OE ; B 7 0 567 562 ; +C 186 ; WX 600 ; N ordmasculine ; B 157 249 443 580 ; +C 230 ; WX 600 ; N ae ; B 19 -15 570 441 ; +C -1 ; WX 600 ; N dotlessi ; B 95 0 505 426 ; +C -1 ; WX 600 ; N lslash ; B 95 0 505 629 ; +C 248 ; WX 600 ; N oslash ; B 62 -80 538 506 ; +C 156 ; WX 600 ; N oe ; B 19 -15 559 441 ; +C 223 ; WX 600 ; N germandbls ; B 48 -15 588 629 ; +C 207 ; WX 600 ; N Idieresis ; B 96 0 504 753 ; +C 233 ; WX 600 ; N eacute ; B 66 -15 548 672 ; +C -1 ; WX 600 ; N abreve ; B 53 -15 559 609 ; +C -1 ; WX 600 ; N uhungarumlaut ; B 21 -15 580 672 ; +C -1 ; WX 600 ; N ecaron ; B 66 -15 548 669 ; +C 159 ; WX 600 ; N Ydieresis ; B 24 0 576 753 ; +C 247 ; WX 600 ; N divide ; B 87 48 513 467 ; +C 221 ; WX 600 ; N Yacute ; B 24 0 576 805 ; +C 194 ; WX 600 ; N Acircumflex ; B 3 0 597 787 ; +C 225 ; WX 600 ; N aacute ; B 53 -15 559 672 ; +C 219 ; WX 600 ; N Ucircumflex ; B 17 -18 583 787 ; +C 253 ; WX 600 ; N yacute ; B 7 -157 592 672 ; +C -1 ; WX 600 ; N scommaaccent ; B 80 -250 513 441 ; +C 234 ; WX 600 ; N ecircumflex ; B 66 -15 548 654 ; +C -1 ; WX 600 ; N Uring ; B 17 -18 583 760 ; +C 220 ; WX 600 ; N Udieresis ; B 17 -18 583 753 ; +C -1 ; WX 600 ; N aogonek ; B 53 -172 587 441 ; +C 218 ; WX 600 ; N Uacute ; B 17 -18 583 805 ; +C -1 ; WX 600 ; N uogonek ; B 21 -172 590 426 ; +C 203 ; WX 600 ; N Edieresis ; B 53 0 550 753 ; +C -1 ; WX 600 ; N Dcroat ; B 30 0 574 562 ; +C -1 ; WX 600 ; N commaaccent ; B 198 -250 335 -58 ; +C 169 ; WX 600 ; N copyright ; B 0 -18 600 580 ; +C -1 ; WX 600 ; N Emacron ; B 53 0 550 698 ; +C -1 ; WX 600 ; N ccaron ; B 66 -15 529 669 ; +C 229 ; WX 600 ; N aring ; B 53 -15 559 627 ; +C -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 593 562 ; +C -1 ; WX 600 ; N lacute ; B 95 0 505 805 ; +C 224 ; WX 600 ; N agrave ; B 53 -15 559 672 ; +C -1 ; WX 600 ; N Tcommaaccent ; B 38 -250 563 562 ; +C -1 ; WX 600 ; N Cacute ; B 41 -18 540 805 ; +C 227 ; WX 600 ; N atilde ; B 53 -15 559 606 ; +C -1 ; WX 600 ; N Edotaccent ; B 53 0 550 753 ; +C 154 ; WX 600 ; N scaron ; B 80 -15 513 669 ; +C -1 ; WX 600 ; N scedilla ; B 80 -151 513 441 ; +C 237 ; WX 600 ; N iacute ; B 95 0 505 672 ; +C -1 ; WX 600 ; N lozenge ; B 18 0 443 706 ; +C -1 ; WX 600 ; N Rcaron ; B 38 0 588 802 ; +C -1 ; WX 600 ; N Gcommaaccent ; B 31 -250 575 580 ; +C 251 ; WX 600 ; N ucircumflex ; B 21 -15 562 654 ; +C 226 ; WX 600 ; N acircumflex ; B 53 -15 559 654 ; +C -1 ; WX 600 ; N Amacron ; B 3 0 597 698 ; +C -1 ; WX 600 ; N rcaron ; B 60 0 559 669 ; +C 231 ; WX 600 ; N ccedilla ; B 66 -151 529 441 ; +C -1 ; WX 600 ; N Zdotaccent ; B 86 0 514 753 ; +C 222 ; WX 600 ; N Thorn ; B 79 0 538 562 ; +C -1 ; WX 600 ; N Omacron ; B 43 -18 557 698 ; +C -1 ; WX 600 ; N Racute ; B 38 0 588 805 ; +C -1 ; WX 600 ; N Sacute ; B 72 -20 529 805 ; +C -1 ; WX 600 ; N dcaron ; B 45 -15 715 629 ; +C -1 ; WX 600 ; N Umacron ; B 17 -18 583 698 ; +C -1 ; WX 600 ; N uring ; B 21 -15 562 627 ; +C 179 ; WX 600 ; N threesuperior ; B 155 240 406 622 ; +C 210 ; WX 600 ; N Ograve ; B 43 -18 557 805 ; +C 192 ; WX 600 ; N Agrave ; B 3 0 597 805 ; +C -1 ; WX 600 ; N Abreve ; B 3 0 597 732 ; +C 215 ; WX 600 ; N multiply ; B 87 43 515 470 ; +C 250 ; WX 600 ; N uacute ; B 21 -15 562 672 ; +C -1 ; WX 600 ; N Tcaron ; B 38 0 563 802 ; +C -1 ; WX 600 ; N partialdiff ; B 17 -38 459 710 ; +C 255 ; WX 600 ; N ydieresis ; B 7 -157 592 620 ; +C -1 ; WX 600 ; N Nacute ; B 7 -13 593 805 ; +C 238 ; WX 600 ; N icircumflex ; B 94 0 505 654 ; +C 202 ; WX 600 ; N Ecircumflex ; B 53 0 550 787 ; +C 228 ; WX 600 ; N adieresis ; B 53 -15 559 620 ; +C 235 ; WX 600 ; N edieresis ; B 66 -15 548 620 ; +C -1 ; WX 600 ; N cacute ; B 66 -15 529 672 ; +C -1 ; WX 600 ; N nacute ; B 26 0 575 672 ; +C -1 ; WX 600 ; N umacron ; B 21 -15 562 565 ; +C -1 ; WX 600 ; N Ncaron ; B 7 -13 593 802 ; +C 205 ; WX 600 ; N Iacute ; B 96 0 504 805 ; +C 177 ; WX 600 ; N plusminus ; B 87 44 513 558 ; +C 166 ; WX 600 ; N brokenbar ; B 275 -175 326 675 ; +C 174 ; WX 600 ; N registered ; B 0 -18 600 580 ; +C -1 ; WX 600 ; N Gbreve ; B 31 -18 575 732 ; +C -1 ; WX 600 ; N Idotaccent ; B 96 0 504 753 ; +C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ; +C 200 ; WX 600 ; N Egrave ; B 53 0 550 805 ; +C -1 ; WX 600 ; N racute ; B 60 0 559 672 ; +C -1 ; WX 600 ; N omacron ; B 62 -15 538 565 ; +C -1 ; WX 600 ; N Zacute ; B 86 0 514 805 ; +C 142 ; WX 600 ; N Zcaron ; B 86 0 514 802 ; +C -1 ; WX 600 ; N greaterequal ; B 98 0 502 710 ; +C 208 ; WX 600 ; N Eth ; B 30 0 574 562 ; +C 199 ; WX 600 ; N Ccedilla ; B 41 -151 540 580 ; +C -1 ; WX 600 ; N lcommaaccent ; B 95 -250 505 629 ; +C -1 ; WX 600 ; N tcaron ; B 87 -15 530 717 ; +C -1 ; WX 600 ; N eogonek ; B 66 -172 548 441 ; +C -1 ; WX 600 ; N Uogonek ; B 17 -172 583 562 ; +C 193 ; WX 600 ; N Aacute ; B 3 0 597 805 ; +C 196 ; WX 600 ; N Adieresis ; B 3 0 597 753 ; +C 232 ; WX 600 ; N egrave ; B 66 -15 548 672 ; +C -1 ; WX 600 ; N zacute ; B 99 0 502 672 ; +C -1 ; WX 600 ; N iogonek ; B 95 -172 505 657 ; +C 211 ; WX 600 ; N Oacute ; B 43 -18 557 805 ; +C 243 ; WX 600 ; N oacute ; B 62 -15 538 672 ; +C -1 ; WX 600 ; N amacron ; B 53 -15 559 565 ; +C -1 ; WX 600 ; N sacute ; B 80 -15 513 672 ; +C 239 ; WX 600 ; N idieresis ; B 95 0 505 620 ; +C 212 ; WX 600 ; N Ocircumflex ; B 43 -18 557 787 ; +C 217 ; WX 600 ; N Ugrave ; B 17 -18 583 805 ; +C -1 ; WX 600 ; N Delta ; B 6 0 598 688 ; +C 254 ; WX 600 ; N thorn ; B -6 -157 555 629 ; +C 178 ; WX 600 ; N twosuperior ; B 177 249 424 622 ; +C 214 ; WX 600 ; N Odieresis ; B 43 -18 557 753 ; +C 181 ; WX 600 ; N mu ; B 21 -157 562 426 ; +C 236 ; WX 600 ; N igrave ; B 95 0 505 672 ; +C -1 ; WX 600 ; N ohungarumlaut ; B 62 -15 580 672 ; +C -1 ; WX 600 ; N Eogonek ; B 53 -172 561 562 ; +C -1 ; WX 600 ; N dcroat ; B 45 -15 591 629 ; +C 190 ; WX 600 ; N threequarters ; B 8 -56 593 666 ; +C -1 ; WX 600 ; N Scedilla ; B 72 -151 529 580 ; +C -1 ; WX 600 ; N lcaron ; B 95 0 533 629 ; +C -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 582 562 ; +C -1 ; WX 600 ; N Lacute ; B 47 0 554 805 ; +C 153 ; WX 600 ; N trademark ; B -23 263 623 562 ; +C -1 ; WX 600 ; N edotaccent ; B 66 -15 548 620 ; +C 204 ; WX 600 ; N Igrave ; B 96 0 504 805 ; +C -1 ; WX 600 ; N Imacron ; B 96 0 504 698 ; +C -1 ; WX 600 ; N Lcaron ; B 47 0 554 562 ; +C 189 ; WX 600 ; N onehalf ; B 0 -57 611 665 ; +C -1 ; WX 600 ; N lessequal ; B 98 0 502 710 ; +C 244 ; WX 600 ; N ocircumflex ; B 62 -15 538 654 ; +C 241 ; WX 600 ; N ntilde ; B 26 0 575 606 ; +C -1 ; WX 600 ; N Uhungarumlaut ; B 17 -18 590 805 ; +C 201 ; WX 600 ; N Eacute ; B 53 0 550 805 ; +C -1 ; WX 600 ; N emacron ; B 66 -15 548 565 ; +C -1 ; WX 600 ; N gbreve ; B 45 -157 566 609 ; +C 188 ; WX 600 ; N onequarter ; B 0 -57 600 665 ; +C 138 ; WX 600 ; N Scaron ; B 72 -20 529 802 ; +C -1 ; WX 600 ; N Scommaaccent ; B 72 -250 529 580 ; +C -1 ; WX 600 ; N Ohungarumlaut ; B 43 -18 580 805 ; +C 176 ; WX 600 ; N degree ; B 123 269 477 622 ; +C 242 ; WX 600 ; N ograve ; B 62 -15 538 672 ; +C -1 ; WX 600 ; N Ccaron ; B 41 -18 540 802 ; +C 249 ; WX 600 ; N ugrave ; B 21 -15 562 672 ; +C -1 ; WX 600 ; N radical ; B 3 -15 597 792 ; +C -1 ; WX 600 ; N Dcaron ; B 43 0 574 802 ; +C -1 ; WX 600 ; N rcommaaccent ; B 60 -250 559 441 ; +C 209 ; WX 600 ; N Ntilde ; B 7 -13 593 729 ; +C 245 ; WX 600 ; N otilde ; B 62 -15 538 606 ; +C -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 588 562 ; +C -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 554 562 ; +C 195 ; WX 600 ; N Atilde ; B 3 0 597 729 ; +C -1 ; WX 600 ; N Aogonek ; B 3 -172 608 562 ; +C 197 ; WX 600 ; N Aring ; B 3 0 597 750 ; +C 213 ; WX 600 ; N Otilde ; B 43 -18 557 729 ; +C -1 ; WX 600 ; N zdotaccent ; B 99 0 502 620 ; +C -1 ; WX 600 ; N Ecaron ; B 53 0 550 802 ; +C -1 ; WX 600 ; N Iogonek ; B 96 -172 504 562 ; +C -1 ; WX 600 ; N kcommaaccent ; B 43 -250 580 629 ; +C -1 ; WX 600 ; N minus ; B 80 232 520 283 ; +C 206 ; WX 600 ; N Icircumflex ; B 96 0 504 787 ; +C -1 ; WX 600 ; N ncaron ; B 26 0 575 669 ; +C -1 ; WX 600 ; N tcommaaccent ; B 87 -250 530 561 ; +C 172 ; WX 600 ; N logicalnot ; B 87 108 513 369 ; +C 246 ; WX 600 ; N odieresis ; B 62 -15 538 620 ; +C 252 ; WX 600 ; N udieresis ; B 21 -15 562 620 ; +C -1 ; WX 600 ; N notequal ; B 15 -16 540 529 ; +C -1 ; WX 600 ; N gcommaaccent ; B 45 -157 566 708 ; +C 240 ; WX 600 ; N eth ; B 62 -15 538 629 ; +C 158 ; WX 600 ; N zcaron ; B 99 0 502 669 ; +C -1 ; WX 600 ; N ncommaaccent ; B 26 -250 575 441 ; +C 185 ; WX 600 ; N onesuperior ; B 172 249 428 622 ; +C -1 ; WX 600 ; N imacron ; B 95 0 505 565 ; +C 128 ; WX 600 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Bold.ttf b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Bold.ttf new file mode 100644 index 0000000..6d65fa7 Binary files /dev/null and b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Bold.ttf differ diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Bold.ufm b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Bold.ufm new file mode 100644 index 0000000..e927992 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Bold.ufm @@ -0,0 +1,6067 @@ +StartFontMetrics 4.1 +Notice Converted by PHP-font-lib +Comment https://github.com/PhenX/php-font-lib +EncodingScheme FontSpecific +FontName DejaVu Sans +FontSubfamily Bold +UniqueID DejaVu Sans Bold +FullName DejaVu Sans Bold +Version Version 2.37 +PostScriptName DejaVuSans-Bold +Manufacturer DejaVu fonts team +FontVendorURL http://dejavu.sourceforge.net +LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License +PreferredFamily DejaVu Sans +PreferredSubfamily Bold +Weight Bold +ItalicAngle 0 +IsFixedPitch false +UnderlineThickness 44 +UnderlinePosition -63 +FontHeightOffset 0 +Ascender 928 +Descender -236 +FontBBox -1069 -415 1975 1174 +StartCharMetrics 6196 +U 32 ; WX 348 ; N space ; G 3 +U 33 ; WX 456 ; N exclam ; G 4 +U 34 ; WX 521 ; N quotedbl ; G 5 +U 35 ; WX 838 ; N numbersign ; G 6 +U 36 ; WX 696 ; N dollar ; G 7 +U 37 ; WX 1002 ; N percent ; G 8 +U 38 ; WX 872 ; N ampersand ; G 9 +U 39 ; WX 306 ; N quotesingle ; G 10 +U 40 ; WX 457 ; N parenleft ; G 11 +U 41 ; WX 457 ; N parenright ; G 12 +U 42 ; WX 523 ; N asterisk ; G 13 +U 43 ; WX 838 ; N plus ; G 14 +U 44 ; WX 380 ; N comma ; G 15 +U 45 ; WX 415 ; N hyphen ; G 16 +U 46 ; WX 380 ; N period ; G 17 +U 47 ; WX 365 ; N slash ; G 18 +U 48 ; WX 696 ; N zero ; G 19 +U 49 ; WX 696 ; N one ; G 20 +U 50 ; WX 696 ; N two ; G 21 +U 51 ; WX 696 ; N three ; G 22 +U 52 ; WX 696 ; N four ; G 23 +U 53 ; WX 696 ; N five ; G 24 +U 54 ; WX 696 ; N six ; G 25 +U 55 ; WX 696 ; N seven ; G 26 +U 56 ; WX 696 ; N eight ; G 27 +U 57 ; WX 696 ; N nine ; G 28 +U 58 ; WX 400 ; N colon ; G 29 +U 59 ; WX 400 ; N semicolon ; G 30 +U 60 ; WX 838 ; N less ; G 31 +U 61 ; WX 838 ; N equal ; G 32 +U 62 ; WX 838 ; N greater ; G 33 +U 63 ; WX 580 ; N question ; G 34 +U 64 ; WX 1000 ; N at ; G 35 +U 65 ; WX 774 ; N A ; G 36 +U 66 ; WX 762 ; N B ; G 37 +U 67 ; WX 734 ; N C ; G 38 +U 68 ; WX 830 ; N D ; G 39 +U 69 ; WX 683 ; N E ; G 40 +U 70 ; WX 683 ; N F ; G 41 +U 71 ; WX 821 ; N G ; G 42 +U 72 ; WX 837 ; N H ; G 43 +U 73 ; WX 372 ; N I ; G 44 +U 74 ; WX 372 ; N J ; G 45 +U 75 ; WX 775 ; N K ; G 46 +U 76 ; WX 637 ; N L ; G 47 +U 77 ; WX 995 ; N M ; G 48 +U 78 ; WX 837 ; N N ; G 49 +U 79 ; WX 850 ; N O ; G 50 +U 80 ; WX 733 ; N P ; G 51 +U 81 ; WX 850 ; N Q ; G 52 +U 82 ; WX 770 ; N R ; G 53 +U 83 ; WX 720 ; N S ; G 54 +U 84 ; WX 682 ; N T ; G 55 +U 85 ; WX 812 ; N U ; G 56 +U 86 ; WX 774 ; N V ; G 57 +U 87 ; WX 1103 ; N W ; G 58 +U 88 ; WX 771 ; N X ; G 59 +U 89 ; WX 724 ; N Y ; G 60 +U 90 ; WX 725 ; N Z ; G 61 +U 91 ; WX 457 ; N bracketleft ; G 62 +U 92 ; WX 365 ; N backslash ; G 63 +U 93 ; WX 457 ; N bracketright ; G 64 +U 94 ; WX 838 ; N asciicircum ; G 65 +U 95 ; WX 500 ; N underscore ; G 66 +U 96 ; WX 500 ; N grave ; G 67 +U 97 ; WX 675 ; N a ; G 68 +U 98 ; WX 716 ; N b ; G 69 +U 99 ; WX 593 ; N c ; G 70 +U 100 ; WX 716 ; N d ; G 71 +U 101 ; WX 678 ; N e ; G 72 +U 102 ; WX 435 ; N f ; G 73 +U 103 ; WX 716 ; N g ; G 74 +U 104 ; WX 712 ; N h ; G 75 +U 105 ; WX 343 ; N i ; G 76 +U 106 ; WX 343 ; N j ; G 77 +U 107 ; WX 665 ; N k ; G 78 +U 108 ; WX 343 ; N l ; G 79 +U 109 ; WX 1042 ; N m ; G 80 +U 110 ; WX 712 ; N n ; G 81 +U 111 ; WX 687 ; N o ; G 82 +U 112 ; WX 716 ; N p ; G 83 +U 113 ; WX 716 ; N q ; G 84 +U 114 ; WX 493 ; N r ; G 85 +U 115 ; WX 595 ; N s ; G 86 +U 116 ; WX 478 ; N t ; G 87 +U 117 ; WX 712 ; N u ; G 88 +U 118 ; WX 652 ; N v ; G 89 +U 119 ; WX 924 ; N w ; G 90 +U 120 ; WX 645 ; N x ; G 91 +U 121 ; WX 652 ; N y ; G 92 +U 122 ; WX 582 ; N z ; G 93 +U 123 ; WX 712 ; N braceleft ; G 94 +U 124 ; WX 365 ; N bar ; G 95 +U 125 ; WX 712 ; N braceright ; G 96 +U 126 ; WX 838 ; N asciitilde ; G 97 +U 160 ; WX 348 ; N nbspace ; G 98 +U 161 ; WX 456 ; N exclamdown ; G 99 +U 162 ; WX 696 ; N cent ; G 100 +U 163 ; WX 696 ; N sterling ; G 101 +U 164 ; WX 636 ; N currency ; G 102 +U 165 ; WX 696 ; N yen ; G 103 +U 166 ; WX 365 ; N brokenbar ; G 104 +U 167 ; WX 500 ; N section ; G 105 +U 168 ; WX 500 ; N dieresis ; G 106 +U 169 ; WX 1000 ; N copyright ; G 107 +U 170 ; WX 564 ; N ordfeminine ; G 108 +U 171 ; WX 646 ; N guillemotleft ; G 109 +U 172 ; WX 838 ; N logicalnot ; G 110 +U 173 ; WX 415 ; N sfthyphen ; G 111 +U 174 ; WX 1000 ; N registered ; G 112 +U 175 ; WX 500 ; N macron ; G 113 +U 176 ; WX 500 ; N degree ; G 114 +U 177 ; WX 838 ; N plusminus ; G 115 +U 178 ; WX 438 ; N twosuperior ; G 116 +U 179 ; WX 438 ; N threesuperior ; G 117 +U 180 ; WX 500 ; N acute ; G 118 +U 181 ; WX 736 ; N mu ; G 119 +U 182 ; WX 636 ; N paragraph ; G 120 +U 183 ; WX 380 ; N periodcentered ; G 121 +U 184 ; WX 500 ; N cedilla ; G 122 +U 185 ; WX 438 ; N onesuperior ; G 123 +U 186 ; WX 564 ; N ordmasculine ; G 124 +U 187 ; WX 646 ; N guillemotright ; G 125 +U 188 ; WX 1035 ; N onequarter ; G 126 +U 189 ; WX 1035 ; N onehalf ; G 127 +U 190 ; WX 1035 ; N threequarters ; G 128 +U 191 ; WX 580 ; N questiondown ; G 129 +U 192 ; WX 774 ; N Agrave ; G 130 +U 193 ; WX 774 ; N Aacute ; G 131 +U 194 ; WX 774 ; N Acircumflex ; G 132 +U 195 ; WX 774 ; N Atilde ; G 133 +U 196 ; WX 774 ; N Adieresis ; G 134 +U 197 ; WX 774 ; N Aring ; G 135 +U 198 ; WX 1085 ; N AE ; G 136 +U 199 ; WX 734 ; N Ccedilla ; G 137 +U 200 ; WX 683 ; N Egrave ; G 138 +U 201 ; WX 683 ; N Eacute ; G 139 +U 202 ; WX 683 ; N Ecircumflex ; G 140 +U 203 ; WX 683 ; N Edieresis ; G 141 +U 204 ; WX 372 ; N Igrave ; G 142 +U 205 ; WX 372 ; N Iacute ; G 143 +U 206 ; WX 372 ; N Icircumflex ; G 144 +U 207 ; WX 372 ; N Idieresis ; G 145 +U 208 ; WX 838 ; N Eth ; G 146 +U 209 ; WX 837 ; N Ntilde ; G 147 +U 210 ; WX 850 ; N Ograve ; G 148 +U 211 ; WX 850 ; N Oacute ; G 149 +U 212 ; WX 850 ; N Ocircumflex ; G 150 +U 213 ; WX 850 ; N Otilde ; G 151 +U 214 ; WX 850 ; N Odieresis ; G 152 +U 215 ; WX 838 ; N multiply ; G 153 +U 216 ; WX 850 ; N Oslash ; G 154 +U 217 ; WX 812 ; N Ugrave ; G 155 +U 218 ; WX 812 ; N Uacute ; G 156 +U 219 ; WX 812 ; N Ucircumflex ; G 157 +U 220 ; WX 812 ; N Udieresis ; G 158 +U 221 ; WX 724 ; N Yacute ; G 159 +U 222 ; WX 738 ; N Thorn ; G 160 +U 223 ; WX 719 ; N germandbls ; G 161 +U 224 ; WX 675 ; N agrave ; G 162 +U 225 ; WX 675 ; N aacute ; G 163 +U 226 ; WX 675 ; N acircumflex ; G 164 +U 227 ; WX 675 ; N atilde ; G 165 +U 228 ; WX 675 ; N adieresis ; G 166 +U 229 ; WX 675 ; N aring ; G 167 +U 230 ; WX 1048 ; N ae ; G 168 +U 231 ; WX 593 ; N ccedilla ; G 169 +U 232 ; WX 678 ; N egrave ; G 170 +U 233 ; WX 678 ; N eacute ; G 171 +U 234 ; WX 678 ; N ecircumflex ; G 172 +U 235 ; WX 678 ; N edieresis ; G 173 +U 236 ; WX 343 ; N igrave ; G 174 +U 237 ; WX 343 ; N iacute ; G 175 +U 238 ; WX 343 ; N icircumflex ; G 176 +U 239 ; WX 343 ; N idieresis ; G 177 +U 240 ; WX 687 ; N eth ; G 178 +U 241 ; WX 712 ; N ntilde ; G 179 +U 242 ; WX 687 ; N ograve ; G 180 +U 243 ; WX 687 ; N oacute ; G 181 +U 244 ; WX 687 ; N ocircumflex ; G 182 +U 245 ; WX 687 ; N otilde ; G 183 +U 246 ; WX 687 ; N odieresis ; G 184 +U 247 ; WX 838 ; N divide ; G 185 +U 248 ; WX 687 ; N oslash ; G 186 +U 249 ; WX 712 ; N ugrave ; G 187 +U 250 ; WX 712 ; N uacute ; G 188 +U 251 ; WX 712 ; N ucircumflex ; G 189 +U 252 ; WX 712 ; N udieresis ; G 190 +U 253 ; WX 652 ; N yacute ; G 191 +U 254 ; WX 716 ; N thorn ; G 192 +U 255 ; WX 652 ; N ydieresis ; G 193 +U 256 ; WX 774 ; N Amacron ; G 194 +U 257 ; WX 675 ; N amacron ; G 195 +U 258 ; WX 774 ; N Abreve ; G 196 +U 259 ; WX 675 ; N abreve ; G 197 +U 260 ; WX 774 ; N Aogonek ; G 198 +U 261 ; WX 675 ; N aogonek ; G 199 +U 262 ; WX 734 ; N Cacute ; G 200 +U 263 ; WX 593 ; N cacute ; G 201 +U 264 ; WX 734 ; N Ccircumflex ; G 202 +U 265 ; WX 593 ; N ccircumflex ; G 203 +U 266 ; WX 734 ; N Cdotaccent ; G 204 +U 267 ; WX 593 ; N cdotaccent ; G 205 +U 268 ; WX 734 ; N Ccaron ; G 206 +U 269 ; WX 593 ; N ccaron ; G 207 +U 270 ; WX 830 ; N Dcaron ; G 208 +U 271 ; WX 716 ; N dcaron ; G 209 +U 272 ; WX 838 ; N Dcroat ; G 210 +U 273 ; WX 716 ; N dmacron ; G 211 +U 274 ; WX 683 ; N Emacron ; G 212 +U 275 ; WX 678 ; N emacron ; G 213 +U 276 ; WX 683 ; N Ebreve ; G 214 +U 277 ; WX 678 ; N ebreve ; G 215 +U 278 ; WX 683 ; N Edotaccent ; G 216 +U 279 ; WX 678 ; N edotaccent ; G 217 +U 280 ; WX 683 ; N Eogonek ; G 218 +U 281 ; WX 678 ; N eogonek ; G 219 +U 282 ; WX 683 ; N Ecaron ; G 220 +U 283 ; WX 678 ; N ecaron ; G 221 +U 284 ; WX 821 ; N Gcircumflex ; G 222 +U 285 ; WX 716 ; N gcircumflex ; G 223 +U 286 ; WX 821 ; N Gbreve ; G 224 +U 287 ; WX 716 ; N gbreve ; G 225 +U 288 ; WX 821 ; N Gdotaccent ; G 226 +U 289 ; WX 716 ; N gdotaccent ; G 227 +U 290 ; WX 821 ; N Gcommaaccent ; G 228 +U 291 ; WX 716 ; N gcommaaccent ; G 229 +U 292 ; WX 837 ; N Hcircumflex ; G 230 +U 293 ; WX 712 ; N hcircumflex ; G 231 +U 294 ; WX 974 ; N Hbar ; G 232 +U 295 ; WX 790 ; N hbar ; G 233 +U 296 ; WX 372 ; N Itilde ; G 234 +U 297 ; WX 343 ; N itilde ; G 235 +U 298 ; WX 372 ; N Imacron ; G 236 +U 299 ; WX 343 ; N imacron ; G 237 +U 300 ; WX 372 ; N Ibreve ; G 238 +U 301 ; WX 343 ; N ibreve ; G 239 +U 302 ; WX 372 ; N Iogonek ; G 240 +U 303 ; WX 343 ; N iogonek ; G 241 +U 304 ; WX 372 ; N Idot ; G 242 +U 305 ; WX 343 ; N dotlessi ; G 243 +U 306 ; WX 744 ; N IJ ; G 244 +U 307 ; WX 686 ; N ij ; G 245 +U 308 ; WX 372 ; N Jcircumflex ; G 246 +U 309 ; WX 343 ; N jcircumflex ; G 247 +U 310 ; WX 775 ; N Kcommaaccent ; G 248 +U 311 ; WX 665 ; N kcommaaccent ; G 249 +U 312 ; WX 665 ; N kgreenlandic ; G 250 +U 313 ; WX 637 ; N Lacute ; G 251 +U 314 ; WX 343 ; N lacute ; G 252 +U 315 ; WX 637 ; N Lcommaaccent ; G 253 +U 316 ; WX 343 ; N lcommaaccent ; G 254 +U 317 ; WX 637 ; N Lcaron ; G 255 +U 318 ; WX 479 ; N lcaron ; G 256 +U 319 ; WX 637 ; N Ldot ; G 257 +U 320 ; WX 557 ; N ldot ; G 258 +U 321 ; WX 642 ; N Lslash ; G 259 +U 322 ; WX 371 ; N lslash ; G 260 +U 323 ; WX 837 ; N Nacute ; G 261 +U 324 ; WX 712 ; N nacute ; G 262 +U 325 ; WX 837 ; N Ncommaaccent ; G 263 +U 326 ; WX 712 ; N ncommaaccent ; G 264 +U 327 ; WX 837 ; N Ncaron ; G 265 +U 328 ; WX 712 ; N ncaron ; G 266 +U 329 ; WX 983 ; N napostrophe ; G 267 +U 330 ; WX 837 ; N Eng ; G 268 +U 331 ; WX 712 ; N eng ; G 269 +U 332 ; WX 850 ; N Omacron ; G 270 +U 333 ; WX 687 ; N omacron ; G 271 +U 334 ; WX 850 ; N Obreve ; G 272 +U 335 ; WX 687 ; N obreve ; G 273 +U 336 ; WX 850 ; N Ohungarumlaut ; G 274 +U 337 ; WX 687 ; N ohungarumlaut ; G 275 +U 338 ; WX 1167 ; N OE ; G 276 +U 339 ; WX 1094 ; N oe ; G 277 +U 340 ; WX 770 ; N Racute ; G 278 +U 341 ; WX 493 ; N racute ; G 279 +U 342 ; WX 770 ; N Rcommaaccent ; G 280 +U 343 ; WX 493 ; N rcommaaccent ; G 281 +U 344 ; WX 770 ; N Rcaron ; G 282 +U 345 ; WX 493 ; N rcaron ; G 283 +U 346 ; WX 720 ; N Sacute ; G 284 +U 347 ; WX 595 ; N sacute ; G 285 +U 348 ; WX 720 ; N Scircumflex ; G 286 +U 349 ; WX 595 ; N scircumflex ; G 287 +U 350 ; WX 720 ; N Scedilla ; G 288 +U 351 ; WX 595 ; N scedilla ; G 289 +U 352 ; WX 720 ; N Scaron ; G 290 +U 353 ; WX 595 ; N scaron ; G 291 +U 354 ; WX 682 ; N Tcommaaccent ; G 292 +U 355 ; WX 478 ; N tcommaaccent ; G 293 +U 356 ; WX 682 ; N Tcaron ; G 294 +U 357 ; WX 478 ; N tcaron ; G 295 +U 358 ; WX 682 ; N Tbar ; G 296 +U 359 ; WX 478 ; N tbar ; G 297 +U 360 ; WX 812 ; N Utilde ; G 298 +U 361 ; WX 712 ; N utilde ; G 299 +U 362 ; WX 812 ; N Umacron ; G 300 +U 363 ; WX 712 ; N umacron ; G 301 +U 364 ; WX 812 ; N Ubreve ; G 302 +U 365 ; WX 712 ; N ubreve ; G 303 +U 366 ; WX 812 ; N Uring ; G 304 +U 367 ; WX 712 ; N uring ; G 305 +U 368 ; WX 812 ; N Uhungarumlaut ; G 306 +U 369 ; WX 712 ; N uhungarumlaut ; G 307 +U 370 ; WX 812 ; N Uogonek ; G 308 +U 371 ; WX 712 ; N uogonek ; G 309 +U 372 ; WX 1103 ; N Wcircumflex ; G 310 +U 373 ; WX 924 ; N wcircumflex ; G 311 +U 374 ; WX 724 ; N Ycircumflex ; G 312 +U 375 ; WX 652 ; N ycircumflex ; G 313 +U 376 ; WX 724 ; N Ydieresis ; G 314 +U 377 ; WX 725 ; N Zacute ; G 315 +U 378 ; WX 582 ; N zacute ; G 316 +U 379 ; WX 725 ; N Zdotaccent ; G 317 +U 380 ; WX 582 ; N zdotaccent ; G 318 +U 381 ; WX 725 ; N Zcaron ; G 319 +U 382 ; WX 582 ; N zcaron ; G 320 +U 383 ; WX 435 ; N longs ; G 321 +U 384 ; WX 716 ; N uni0180 ; G 322 +U 385 ; WX 811 ; N uni0181 ; G 323 +U 386 ; WX 762 ; N uni0182 ; G 324 +U 387 ; WX 716 ; N uni0183 ; G 325 +U 388 ; WX 762 ; N uni0184 ; G 326 +U 389 ; WX 716 ; N uni0185 ; G 327 +U 390 ; WX 734 ; N uni0186 ; G 328 +U 391 ; WX 734 ; N uni0187 ; G 329 +U 392 ; WX 593 ; N uni0188 ; G 330 +U 393 ; WX 838 ; N uni0189 ; G 331 +U 394 ; WX 879 ; N uni018A ; G 332 +U 395 ; WX 757 ; N uni018B ; G 333 +U 396 ; WX 716 ; N uni018C ; G 334 +U 397 ; WX 688 ; N uni018D ; G 335 +U 398 ; WX 683 ; N uni018E ; G 336 +U 399 ; WX 849 ; N uni018F ; G 337 +U 400 ; WX 696 ; N uni0190 ; G 338 +U 401 ; WX 683 ; N uni0191 ; G 339 +U 402 ; WX 435 ; N florin ; G 340 +U 403 ; WX 821 ; N uni0193 ; G 341 +U 404 ; WX 793 ; N uni0194 ; G 342 +U 405 ; WX 1045 ; N uni0195 ; G 343 +U 406 ; WX 436 ; N uni0196 ; G 344 +U 407 ; WX 389 ; N uni0197 ; G 345 +U 408 ; WX 775 ; N uni0198 ; G 346 +U 409 ; WX 665 ; N uni0199 ; G 347 +U 410 ; WX 360 ; N uni019A ; G 348 +U 411 ; WX 592 ; N uni019B ; G 349 +U 412 ; WX 1042 ; N uni019C ; G 350 +U 413 ; WX 837 ; N uni019D ; G 351 +U 414 ; WX 712 ; N uni019E ; G 352 +U 415 ; WX 850 ; N uni019F ; G 353 +U 416 ; WX 874 ; N Ohorn ; G 354 +U 417 ; WX 687 ; N ohorn ; G 355 +U 418 ; WX 1083 ; N uni01A2 ; G 356 +U 419 ; WX 912 ; N uni01A3 ; G 357 +U 420 ; WX 782 ; N uni01A4 ; G 358 +U 421 ; WX 716 ; N uni01A5 ; G 359 +U 422 ; WX 770 ; N uni01A6 ; G 360 +U 423 ; WX 720 ; N uni01A7 ; G 361 +U 424 ; WX 595 ; N uni01A8 ; G 362 +U 425 ; WX 683 ; N uni01A9 ; G 363 +U 426 ; WX 552 ; N uni01AA ; G 364 +U 427 ; WX 478 ; N uni01AB ; G 365 +U 428 ; WX 707 ; N uni01AC ; G 366 +U 429 ; WX 478 ; N uni01AD ; G 367 +U 430 ; WX 682 ; N uni01AE ; G 368 +U 431 ; WX 835 ; N Uhorn ; G 369 +U 432 ; WX 712 ; N uhorn ; G 370 +U 433 ; WX 850 ; N uni01B1 ; G 371 +U 434 ; WX 813 ; N uni01B2 ; G 372 +U 435 ; WX 797 ; N uni01B3 ; G 373 +U 436 ; WX 778 ; N uni01B4 ; G 374 +U 437 ; WX 725 ; N uni01B5 ; G 375 +U 438 ; WX 582 ; N uni01B6 ; G 376 +U 439 ; WX 772 ; N uni01B7 ; G 377 +U 440 ; WX 772 ; N uni01B8 ; G 378 +U 441 ; WX 641 ; N uni01B9 ; G 379 +U 442 ; WX 582 ; N uni01BA ; G 380 +U 443 ; WX 696 ; N uni01BB ; G 381 +U 444 ; WX 772 ; N uni01BC ; G 382 +U 445 ; WX 641 ; N uni01BD ; G 383 +U 446 ; WX 573 ; N uni01BE ; G 384 +U 447 ; WX 716 ; N uni01BF ; G 385 +U 448 ; WX 372 ; N uni01C0 ; G 386 +U 449 ; WX 659 ; N uni01C1 ; G 387 +U 450 ; WX 544 ; N uni01C2 ; G 388 +U 451 ; WX 372 ; N uni01C3 ; G 389 +U 452 ; WX 1555 ; N uni01C4 ; G 390 +U 453 ; WX 1412 ; N uni01C5 ; G 391 +U 454 ; WX 1298 ; N uni01C6 ; G 392 +U 455 ; WX 1009 ; N uni01C7 ; G 393 +U 456 ; WX 980 ; N uni01C8 ; G 394 +U 457 ; WX 686 ; N uni01C9 ; G 395 +U 458 ; WX 1209 ; N uni01CA ; G 396 +U 459 ; WX 1180 ; N uni01CB ; G 397 +U 460 ; WX 1055 ; N uni01CC ; G 398 +U 461 ; WX 774 ; N uni01CD ; G 399 +U 462 ; WX 675 ; N uni01CE ; G 400 +U 463 ; WX 372 ; N uni01CF ; G 401 +U 464 ; WX 343 ; N uni01D0 ; G 402 +U 465 ; WX 850 ; N uni01D1 ; G 403 +U 466 ; WX 687 ; N uni01D2 ; G 404 +U 467 ; WX 812 ; N uni01D3 ; G 405 +U 468 ; WX 712 ; N uni01D4 ; G 406 +U 469 ; WX 812 ; N uni01D5 ; G 407 +U 470 ; WX 712 ; N uni01D6 ; G 408 +U 471 ; WX 812 ; N uni01D7 ; G 409 +U 472 ; WX 712 ; N uni01D8 ; G 410 +U 473 ; WX 812 ; N uni01D9 ; G 411 +U 474 ; WX 712 ; N uni01DA ; G 412 +U 475 ; WX 812 ; N uni01DB ; G 413 +U 476 ; WX 712 ; N uni01DC ; G 414 +U 477 ; WX 678 ; N uni01DD ; G 415 +U 478 ; WX 774 ; N uni01DE ; G 416 +U 479 ; WX 675 ; N uni01DF ; G 417 +U 480 ; WX 774 ; N uni01E0 ; G 418 +U 481 ; WX 675 ; N uni01E1 ; G 419 +U 482 ; WX 1085 ; N uni01E2 ; G 420 +U 483 ; WX 1048 ; N uni01E3 ; G 421 +U 484 ; WX 821 ; N uni01E4 ; G 422 +U 485 ; WX 716 ; N uni01E5 ; G 423 +U 486 ; WX 821 ; N Gcaron ; G 424 +U 487 ; WX 716 ; N gcaron ; G 425 +U 488 ; WX 775 ; N uni01E8 ; G 426 +U 489 ; WX 665 ; N uni01E9 ; G 427 +U 490 ; WX 850 ; N uni01EA ; G 428 +U 491 ; WX 687 ; N uni01EB ; G 429 +U 492 ; WX 850 ; N uni01EC ; G 430 +U 493 ; WX 687 ; N uni01ED ; G 431 +U 494 ; WX 772 ; N uni01EE ; G 432 +U 495 ; WX 582 ; N uni01EF ; G 433 +U 496 ; WX 343 ; N uni01F0 ; G 434 +U 497 ; WX 1555 ; N uni01F1 ; G 435 +U 498 ; WX 1412 ; N uni01F2 ; G 436 +U 499 ; WX 1298 ; N uni01F3 ; G 437 +U 500 ; WX 821 ; N uni01F4 ; G 438 +U 501 ; WX 716 ; N uni01F5 ; G 439 +U 502 ; WX 1289 ; N uni01F6 ; G 440 +U 503 ; WX 787 ; N uni01F7 ; G 441 +U 504 ; WX 837 ; N uni01F8 ; G 442 +U 505 ; WX 712 ; N uni01F9 ; G 443 +U 506 ; WX 774 ; N Aringacute ; G 444 +U 507 ; WX 675 ; N aringacute ; G 445 +U 508 ; WX 1085 ; N AEacute ; G 446 +U 509 ; WX 1048 ; N aeacute ; G 447 +U 510 ; WX 850 ; N Oslashacute ; G 448 +U 511 ; WX 687 ; N oslashacute ; G 449 +U 512 ; WX 774 ; N uni0200 ; G 450 +U 513 ; WX 675 ; N uni0201 ; G 451 +U 514 ; WX 774 ; N uni0202 ; G 452 +U 515 ; WX 675 ; N uni0203 ; G 453 +U 516 ; WX 683 ; N uni0204 ; G 454 +U 517 ; WX 678 ; N uni0205 ; G 455 +U 518 ; WX 683 ; N uni0206 ; G 456 +U 519 ; WX 678 ; N uni0207 ; G 457 +U 520 ; WX 372 ; N uni0208 ; G 458 +U 521 ; WX 343 ; N uni0209 ; G 459 +U 522 ; WX 372 ; N uni020A ; G 460 +U 523 ; WX 343 ; N uni020B ; G 461 +U 524 ; WX 850 ; N uni020C ; G 462 +U 525 ; WX 687 ; N uni020D ; G 463 +U 526 ; WX 850 ; N uni020E ; G 464 +U 527 ; WX 687 ; N uni020F ; G 465 +U 528 ; WX 770 ; N uni0210 ; G 466 +U 529 ; WX 493 ; N uni0211 ; G 467 +U 530 ; WX 770 ; N uni0212 ; G 468 +U 531 ; WX 493 ; N uni0213 ; G 469 +U 532 ; WX 812 ; N uni0214 ; G 470 +U 533 ; WX 712 ; N uni0215 ; G 471 +U 534 ; WX 812 ; N uni0216 ; G 472 +U 535 ; WX 712 ; N uni0217 ; G 473 +U 536 ; WX 720 ; N Scommaaccent ; G 474 +U 537 ; WX 595 ; N scommaaccent ; G 475 +U 538 ; WX 682 ; N uni021A ; G 476 +U 539 ; WX 478 ; N uni021B ; G 477 +U 540 ; WX 690 ; N uni021C ; G 478 +U 541 ; WX 607 ; N uni021D ; G 479 +U 542 ; WX 837 ; N uni021E ; G 480 +U 543 ; WX 712 ; N uni021F ; G 481 +U 544 ; WX 837 ; N uni0220 ; G 482 +U 545 ; WX 865 ; N uni0221 ; G 483 +U 546 ; WX 809 ; N uni0222 ; G 484 +U 547 ; WX 659 ; N uni0223 ; G 485 +U 548 ; WX 725 ; N uni0224 ; G 486 +U 549 ; WX 582 ; N uni0225 ; G 487 +U 550 ; WX 774 ; N uni0226 ; G 488 +U 551 ; WX 675 ; N uni0227 ; G 489 +U 552 ; WX 683 ; N uni0228 ; G 490 +U 553 ; WX 678 ; N uni0229 ; G 491 +U 554 ; WX 850 ; N uni022A ; G 492 +U 555 ; WX 687 ; N uni022B ; G 493 +U 556 ; WX 850 ; N uni022C ; G 494 +U 557 ; WX 687 ; N uni022D ; G 495 +U 558 ; WX 850 ; N uni022E ; G 496 +U 559 ; WX 687 ; N uni022F ; G 497 +U 560 ; WX 850 ; N uni0230 ; G 498 +U 561 ; WX 687 ; N uni0231 ; G 499 +U 562 ; WX 724 ; N uni0232 ; G 500 +U 563 ; WX 652 ; N uni0233 ; G 501 +U 564 ; WX 492 ; N uni0234 ; G 502 +U 565 ; WX 867 ; N uni0235 ; G 503 +U 566 ; WX 512 ; N uni0236 ; G 504 +U 567 ; WX 343 ; N dotlessj ; G 505 +U 568 ; WX 1088 ; N uni0238 ; G 506 +U 569 ; WX 1088 ; N uni0239 ; G 507 +U 570 ; WX 774 ; N uni023A ; G 508 +U 571 ; WX 734 ; N uni023B ; G 509 +U 572 ; WX 593 ; N uni023C ; G 510 +U 573 ; WX 637 ; N uni023D ; G 511 +U 574 ; WX 682 ; N uni023E ; G 512 +U 575 ; WX 595 ; N uni023F ; G 513 +U 576 ; WX 582 ; N uni0240 ; G 514 +U 577 ; WX 782 ; N uni0241 ; G 515 +U 578 ; WX 614 ; N uni0242 ; G 516 +U 579 ; WX 762 ; N uni0243 ; G 517 +U 580 ; WX 812 ; N uni0244 ; G 518 +U 581 ; WX 774 ; N uni0245 ; G 519 +U 582 ; WX 683 ; N uni0246 ; G 520 +U 583 ; WX 678 ; N uni0247 ; G 521 +U 584 ; WX 372 ; N uni0248 ; G 522 +U 585 ; WX 343 ; N uni0249 ; G 523 +U 586 ; WX 860 ; N uni024A ; G 524 +U 587 ; WX 791 ; N uni024B ; G 525 +U 588 ; WX 770 ; N uni024C ; G 526 +U 589 ; WX 493 ; N uni024D ; G 527 +U 590 ; WX 724 ; N uni024E ; G 528 +U 591 ; WX 652 ; N uni024F ; G 529 +U 592 ; WX 675 ; N uni0250 ; G 530 +U 593 ; WX 716 ; N uni0251 ; G 531 +U 594 ; WX 716 ; N uni0252 ; G 532 +U 595 ; WX 716 ; N uni0253 ; G 533 +U 596 ; WX 593 ; N uni0254 ; G 534 +U 597 ; WX 593 ; N uni0255 ; G 535 +U 598 ; WX 717 ; N uni0256 ; G 536 +U 599 ; WX 792 ; N uni0257 ; G 537 +U 600 ; WX 678 ; N uni0258 ; G 538 +U 601 ; WX 678 ; N uni0259 ; G 539 +U 602 ; WX 876 ; N uni025A ; G 540 +U 603 ; WX 557 ; N uni025B ; G 541 +U 604 ; WX 545 ; N uni025C ; G 542 +U 605 ; WX 815 ; N uni025D ; G 543 +U 606 ; WX 731 ; N uni025E ; G 544 +U 607 ; WX 343 ; N uni025F ; G 545 +U 608 ; WX 792 ; N uni0260 ; G 546 +U 609 ; WX 716 ; N uni0261 ; G 547 +U 610 ; WX 627 ; N uni0262 ; G 548 +U 611 ; WX 644 ; N uni0263 ; G 549 +U 612 ; WX 635 ; N uni0264 ; G 550 +U 613 ; WX 712 ; N uni0265 ; G 551 +U 614 ; WX 712 ; N uni0266 ; G 552 +U 615 ; WX 712 ; N uni0267 ; G 553 +U 616 ; WX 545 ; N uni0268 ; G 554 +U 617 ; WX 440 ; N uni0269 ; G 555 +U 618 ; WX 545 ; N uni026A ; G 556 +U 619 ; WX 559 ; N uni026B ; G 557 +U 620 ; WX 693 ; N uni026C ; G 558 +U 621 ; WX 343 ; N uni026D ; G 559 +U 622 ; WX 841 ; N uni026E ; G 560 +U 623 ; WX 1042 ; N uni026F ; G 561 +U 624 ; WX 1042 ; N uni0270 ; G 562 +U 625 ; WX 1042 ; N uni0271 ; G 563 +U 626 ; WX 712 ; N uni0272 ; G 564 +U 627 ; WX 793 ; N uni0273 ; G 565 +U 628 ; WX 707 ; N uni0274 ; G 566 +U 629 ; WX 687 ; N uni0275 ; G 567 +U 630 ; WX 909 ; N uni0276 ; G 568 +U 631 ; WX 681 ; N uni0277 ; G 569 +U 632 ; WX 796 ; N uni0278 ; G 570 +U 633 ; WX 538 ; N uni0279 ; G 571 +U 634 ; WX 538 ; N uni027A ; G 572 +U 635 ; WX 650 ; N uni027B ; G 573 +U 636 ; WX 493 ; N uni027C ; G 574 +U 637 ; WX 493 ; N uni027D ; G 575 +U 638 ; WX 596 ; N uni027E ; G 576 +U 639 ; WX 596 ; N uni027F ; G 577 +U 640 ; WX 642 ; N uni0280 ; G 578 +U 641 ; WX 642 ; N uni0281 ; G 579 +U 642 ; WX 595 ; N uni0282 ; G 580 +U 643 ; WX 415 ; N uni0283 ; G 581 +U 644 ; WX 435 ; N uni0284 ; G 582 +U 645 ; WX 605 ; N uni0285 ; G 583 +U 646 ; WX 552 ; N uni0286 ; G 584 +U 647 ; WX 478 ; N uni0287 ; G 585 +U 648 ; WX 478 ; N uni0288 ; G 586 +U 649 ; WX 920 ; N uni0289 ; G 587 +U 650 ; WX 772 ; N uni028A ; G 588 +U 651 ; WX 670 ; N uni028B ; G 589 +U 652 ; WX 652 ; N uni028C ; G 590 +U 653 ; WX 924 ; N uni028D ; G 591 +U 654 ; WX 652 ; N uni028E ; G 592 +U 655 ; WX 724 ; N uni028F ; G 593 +U 656 ; WX 694 ; N uni0290 ; G 594 +U 657 ; WX 684 ; N uni0291 ; G 595 +U 658 ; WX 641 ; N uni0292 ; G 596 +U 659 ; WX 641 ; N uni0293 ; G 597 +U 660 ; WX 573 ; N uni0294 ; G 598 +U 661 ; WX 573 ; N uni0295 ; G 599 +U 662 ; WX 573 ; N uni0296 ; G 600 +U 663 ; WX 573 ; N uni0297 ; G 601 +U 664 ; WX 850 ; N uni0298 ; G 602 +U 665 ; WX 633 ; N uni0299 ; G 603 +U 666 ; WX 731 ; N uni029A ; G 604 +U 667 ; WX 685 ; N uni029B ; G 605 +U 668 ; WX 691 ; N uni029C ; G 606 +U 669 ; WX 343 ; N uni029D ; G 607 +U 670 ; WX 732 ; N uni029E ; G 608 +U 671 ; WX 539 ; N uni029F ; G 609 +U 672 ; WX 792 ; N uni02A0 ; G 610 +U 673 ; WX 573 ; N uni02A1 ; G 611 +U 674 ; WX 573 ; N uni02A2 ; G 612 +U 675 ; WX 1156 ; N uni02A3 ; G 613 +U 676 ; WX 1214 ; N uni02A4 ; G 614 +U 677 ; WX 1155 ; N uni02A5 ; G 615 +U 678 ; WX 975 ; N uni02A6 ; G 616 +U 679 ; WX 769 ; N uni02A7 ; G 617 +U 680 ; WX 929 ; N uni02A8 ; G 618 +U 681 ; WX 1026 ; N uni02A9 ; G 619 +U 682 ; WX 862 ; N uni02AA ; G 620 +U 683 ; WX 780 ; N uni02AB ; G 621 +U 684 ; WX 591 ; N uni02AC ; G 622 +U 685 ; WX 415 ; N uni02AD ; G 623 +U 686 ; WX 677 ; N uni02AE ; G 624 +U 687 ; WX 789 ; N uni02AF ; G 625 +U 688 ; WX 456 ; N uni02B0 ; G 626 +U 689 ; WX 456 ; N uni02B1 ; G 627 +U 690 ; WX 219 ; N uni02B2 ; G 628 +U 691 ; WX 315 ; N uni02B3 ; G 629 +U 692 ; WX 315 ; N uni02B4 ; G 630 +U 693 ; WX 315 ; N uni02B5 ; G 631 +U 694 ; WX 411 ; N uni02B6 ; G 632 +U 695 ; WX 591 ; N uni02B7 ; G 633 +U 696 ; WX 417 ; N uni02B8 ; G 634 +U 697 ; WX 302 ; N uni02B9 ; G 635 +U 698 ; WX 521 ; N uni02BA ; G 636 +U 699 ; WX 380 ; N uni02BB ; G 637 +U 700 ; WX 380 ; N uni02BC ; G 638 +U 701 ; WX 380 ; N uni02BD ; G 639 +U 702 ; WX 366 ; N uni02BE ; G 640 +U 703 ; WX 366 ; N uni02BF ; G 641 +U 704 ; WX 326 ; N uni02C0 ; G 642 +U 705 ; WX 326 ; N uni02C1 ; G 643 +U 706 ; WX 500 ; N uni02C2 ; G 644 +U 707 ; WX 500 ; N uni02C3 ; G 645 +U 708 ; WX 500 ; N uni02C4 ; G 646 +U 709 ; WX 500 ; N uni02C5 ; G 647 +U 710 ; WX 500 ; N circumflex ; G 648 +U 711 ; WX 500 ; N caron ; G 649 +U 712 ; WX 306 ; N uni02C8 ; G 650 +U 713 ; WX 500 ; N uni02C9 ; G 651 +U 714 ; WX 500 ; N uni02CA ; G 652 +U 715 ; WX 500 ; N uni02CB ; G 653 +U 716 ; WX 306 ; N uni02CC ; G 654 +U 717 ; WX 500 ; N uni02CD ; G 655 +U 718 ; WX 500 ; N uni02CE ; G 656 +U 719 ; WX 500 ; N uni02CF ; G 657 +U 720 ; WX 337 ; N uni02D0 ; G 658 +U 721 ; WX 337 ; N uni02D1 ; G 659 +U 722 ; WX 366 ; N uni02D2 ; G 660 +U 723 ; WX 366 ; N uni02D3 ; G 661 +U 724 ; WX 500 ; N uni02D4 ; G 662 +U 725 ; WX 500 ; N uni02D5 ; G 663 +U 726 ; WX 416 ; N uni02D6 ; G 664 +U 727 ; WX 328 ; N uni02D7 ; G 665 +U 728 ; WX 500 ; N breve ; G 666 +U 729 ; WX 500 ; N dotaccent ; G 667 +U 730 ; WX 500 ; N ring ; G 668 +U 731 ; WX 500 ; N ogonek ; G 669 +U 732 ; WX 500 ; N tilde ; G 670 +U 733 ; WX 500 ; N hungarumlaut ; G 671 +U 734 ; WX 351 ; N uni02DE ; G 672 +U 735 ; WX 500 ; N uni02DF ; G 673 +U 736 ; WX 412 ; N uni02E0 ; G 674 +U 737 ; WX 219 ; N uni02E1 ; G 675 +U 738 ; WX 381 ; N uni02E2 ; G 676 +U 739 ; WX 413 ; N uni02E3 ; G 677 +U 740 ; WX 326 ; N uni02E4 ; G 678 +U 741 ; WX 500 ; N uni02E5 ; G 679 +U 742 ; WX 500 ; N uni02E6 ; G 680 +U 743 ; WX 500 ; N uni02E7 ; G 681 +U 744 ; WX 500 ; N uni02E8 ; G 682 +U 745 ; WX 500 ; N uni02E9 ; G 683 +U 748 ; WX 500 ; N uni02EC ; G 684 +U 749 ; WX 500 ; N uni02ED ; G 685 +U 750 ; WX 657 ; N uni02EE ; G 686 +U 755 ; WX 500 ; N uni02F3 ; G 687 +U 759 ; WX 500 ; N uni02F7 ; G 688 +U 768 ; WX 0 ; N gravecomb ; G 689 +U 769 ; WX 0 ; N acutecomb ; G 690 +U 770 ; WX 0 ; N uni0302 ; G 691 +U 771 ; WX 0 ; N tildecomb ; G 692 +U 772 ; WX 0 ; N uni0304 ; G 693 +U 773 ; WX 0 ; N uni0305 ; G 694 +U 774 ; WX 0 ; N uni0306 ; G 695 +U 775 ; WX 0 ; N uni0307 ; G 696 +U 776 ; WX 0 ; N uni0308 ; G 697 +U 777 ; WX 0 ; N hookabovecomb ; G 698 +U 778 ; WX 0 ; N uni030A ; G 699 +U 779 ; WX 0 ; N uni030B ; G 700 +U 780 ; WX 0 ; N uni030C ; G 701 +U 781 ; WX 0 ; N uni030D ; G 702 +U 782 ; WX 0 ; N uni030E ; G 703 +U 783 ; WX 0 ; N uni030F ; G 704 +U 784 ; WX 0 ; N uni0310 ; G 705 +U 785 ; WX 0 ; N uni0311 ; G 706 +U 786 ; WX 0 ; N uni0312 ; G 707 +U 787 ; WX 0 ; N uni0313 ; G 708 +U 788 ; WX 0 ; N uni0314 ; G 709 +U 789 ; WX 0 ; N uni0315 ; G 710 +U 790 ; WX 0 ; N uni0316 ; G 711 +U 791 ; WX 0 ; N uni0317 ; G 712 +U 792 ; WX 0 ; N uni0318 ; G 713 +U 793 ; WX 0 ; N uni0319 ; G 714 +U 794 ; WX 0 ; N uni031A ; G 715 +U 795 ; WX 0 ; N uni031B ; G 716 +U 796 ; WX 0 ; N uni031C ; G 717 +U 797 ; WX 0 ; N uni031D ; G 718 +U 798 ; WX 0 ; N uni031E ; G 719 +U 799 ; WX 0 ; N uni031F ; G 720 +U 800 ; WX 0 ; N uni0320 ; G 721 +U 801 ; WX 0 ; N uni0321 ; G 722 +U 802 ; WX 0 ; N uni0322 ; G 723 +U 803 ; WX 0 ; N dotbelowcomb ; G 724 +U 804 ; WX 0 ; N uni0324 ; G 725 +U 805 ; WX 0 ; N uni0325 ; G 726 +U 806 ; WX 0 ; N uni0326 ; G 727 +U 807 ; WX 0 ; N uni0327 ; G 728 +U 808 ; WX 0 ; N uni0328 ; G 729 +U 809 ; WX 0 ; N uni0329 ; G 730 +U 810 ; WX 0 ; N uni032A ; G 731 +U 811 ; WX 0 ; N uni032B ; G 732 +U 812 ; WX 0 ; N uni032C ; G 733 +U 813 ; WX 0 ; N uni032D ; G 734 +U 814 ; WX 0 ; N uni032E ; G 735 +U 815 ; WX 0 ; N uni032F ; G 736 +U 816 ; WX 0 ; N uni0330 ; G 737 +U 817 ; WX 0 ; N uni0331 ; G 738 +U 818 ; WX 0 ; N uni0332 ; G 739 +U 819 ; WX 0 ; N uni0333 ; G 740 +U 820 ; WX 0 ; N uni0334 ; G 741 +U 821 ; WX 0 ; N uni0335 ; G 742 +U 822 ; WX 0 ; N uni0336 ; G 743 +U 823 ; WX 0 ; N uni0337 ; G 744 +U 824 ; WX 0 ; N uni0338 ; G 745 +U 825 ; WX 0 ; N uni0339 ; G 746 +U 826 ; WX 0 ; N uni033A ; G 747 +U 827 ; WX 0 ; N uni033B ; G 748 +U 828 ; WX 0 ; N uni033C ; G 749 +U 829 ; WX 0 ; N uni033D ; G 750 +U 830 ; WX 0 ; N uni033E ; G 751 +U 831 ; WX 0 ; N uni033F ; G 752 +U 832 ; WX 0 ; N uni0340 ; G 753 +U 833 ; WX 0 ; N uni0341 ; G 754 +U 834 ; WX 0 ; N uni0342 ; G 755 +U 835 ; WX 0 ; N uni0343 ; G 756 +U 836 ; WX 0 ; N uni0344 ; G 757 +U 837 ; WX 0 ; N uni0345 ; G 758 +U 838 ; WX 0 ; N uni0346 ; G 759 +U 839 ; WX 0 ; N uni0347 ; G 760 +U 840 ; WX 0 ; N uni0348 ; G 761 +U 841 ; WX 0 ; N uni0349 ; G 762 +U 842 ; WX 0 ; N uni034A ; G 763 +U 843 ; WX 0 ; N uni034B ; G 764 +U 844 ; WX 0 ; N uni034C ; G 765 +U 845 ; WX 0 ; N uni034D ; G 766 +U 846 ; WX 0 ; N uni034E ; G 767 +U 847 ; WX 0 ; N uni034F ; G 768 +U 849 ; WX 0 ; N uni0351 ; G 769 +U 850 ; WX 0 ; N uni0352 ; G 770 +U 851 ; WX 0 ; N uni0353 ; G 771 +U 855 ; WX 0 ; N uni0357 ; G 772 +U 856 ; WX 0 ; N uni0358 ; G 773 +U 858 ; WX 0 ; N uni035A ; G 774 +U 860 ; WX 0 ; N uni035C ; G 775 +U 861 ; WX 0 ; N uni035D ; G 776 +U 862 ; WX 0 ; N uni035E ; G 777 +U 863 ; WX 0 ; N uni035F ; G 778 +U 864 ; WX 0 ; N uni0360 ; G 779 +U 865 ; WX 0 ; N uni0361 ; G 780 +U 866 ; WX 0 ; N uni0362 ; G 781 +U 880 ; WX 698 ; N uni0370 ; G 782 +U 881 ; WX 565 ; N uni0371 ; G 783 +U 882 ; WX 1022 ; N uni0372 ; G 784 +U 883 ; WX 836 ; N uni0373 ; G 785 +U 884 ; WX 302 ; N uni0374 ; G 786 +U 885 ; WX 302 ; N uni0375 ; G 787 +U 886 ; WX 837 ; N uni0376 ; G 788 +U 887 ; WX 701 ; N uni0377 ; G 789 +U 890 ; WX 500 ; N uni037A ; G 790 +U 891 ; WX 593 ; N uni037B ; G 791 +U 892 ; WX 550 ; N uni037C ; G 792 +U 893 ; WX 549 ; N uni037D ; G 793 +U 894 ; WX 400 ; N uni037E ; G 794 +U 895 ; WX 372 ; N uni037F ; G 795 +U 900 ; WX 441 ; N tonos ; G 796 +U 901 ; WX 500 ; N dieresistonos ; G 797 +U 902 ; WX 797 ; N Alphatonos ; G 798 +U 903 ; WX 380 ; N anoteleia ; G 799 +U 904 ; WX 846 ; N Epsilontonos ; G 800 +U 905 ; WX 1009 ; N Etatonos ; G 801 +U 906 ; WX 563 ; N Iotatonos ; G 802 +U 908 ; WX 891 ; N Omicrontonos ; G 803 +U 910 ; WX 980 ; N Upsilontonos ; G 804 +U 911 ; WX 894 ; N Omegatonos ; G 805 +U 912 ; WX 390 ; N iotadieresistonos ; G 806 +U 913 ; WX 774 ; N Alpha ; G 807 +U 914 ; WX 762 ; N Beta ; G 808 +U 915 ; WX 637 ; N Gamma ; G 809 +U 916 ; WX 774 ; N uni0394 ; G 810 +U 917 ; WX 683 ; N Epsilon ; G 811 +U 918 ; WX 725 ; N Zeta ; G 812 +U 919 ; WX 837 ; N Eta ; G 813 +U 920 ; WX 850 ; N Theta ; G 814 +U 921 ; WX 372 ; N Iota ; G 815 +U 922 ; WX 775 ; N Kappa ; G 816 +U 923 ; WX 774 ; N Lambda ; G 817 +U 924 ; WX 995 ; N Mu ; G 818 +U 925 ; WX 837 ; N Nu ; G 819 +U 926 ; WX 632 ; N Xi ; G 820 +U 927 ; WX 850 ; N Omicron ; G 821 +U 928 ; WX 837 ; N Pi ; G 822 +U 929 ; WX 733 ; N Rho ; G 823 +U 931 ; WX 683 ; N Sigma ; G 824 +U 932 ; WX 682 ; N Tau ; G 825 +U 933 ; WX 724 ; N Upsilon ; G 826 +U 934 ; WX 850 ; N Phi ; G 827 +U 935 ; WX 771 ; N Chi ; G 828 +U 936 ; WX 850 ; N Psi ; G 829 +U 937 ; WX 850 ; N Omega ; G 830 +U 938 ; WX 372 ; N Iotadieresis ; G 831 +U 939 ; WX 724 ; N Upsilondieresis ; G 832 +U 940 ; WX 687 ; N alphatonos ; G 833 +U 941 ; WX 557 ; N epsilontonos ; G 834 +U 942 ; WX 712 ; N etatonos ; G 835 +U 943 ; WX 390 ; N iotatonos ; G 836 +U 944 ; WX 675 ; N upsilondieresistonos ; G 837 +U 945 ; WX 687 ; N alpha ; G 838 +U 946 ; WX 716 ; N beta ; G 839 +U 947 ; WX 681 ; N gamma ; G 840 +U 948 ; WX 687 ; N delta ; G 841 +U 949 ; WX 557 ; N epsilon ; G 842 +U 950 ; WX 591 ; N zeta ; G 843 +U 951 ; WX 712 ; N eta ; G 844 +U 952 ; WX 687 ; N theta ; G 845 +U 953 ; WX 390 ; N iota ; G 846 +U 954 ; WX 710 ; N kappa ; G 847 +U 955 ; WX 633 ; N lambda ; G 848 +U 956 ; WX 736 ; N uni03BC ; G 849 +U 957 ; WX 681 ; N nu ; G 850 +U 958 ; WX 591 ; N xi ; G 851 +U 959 ; WX 687 ; N omicron ; G 852 +U 960 ; WX 791 ; N pi ; G 853 +U 961 ; WX 716 ; N rho ; G 854 +U 962 ; WX 593 ; N sigma1 ; G 855 +U 963 ; WX 779 ; N sigma ; G 856 +U 964 ; WX 638 ; N tau ; G 857 +U 965 ; WX 675 ; N upsilon ; G 858 +U 966 ; WX 782 ; N phi ; G 859 +U 967 ; WX 645 ; N chi ; G 860 +U 968 ; WX 794 ; N psi ; G 861 +U 969 ; WX 869 ; N omega ; G 862 +U 970 ; WX 390 ; N iotadieresis ; G 863 +U 971 ; WX 675 ; N upsilondieresis ; G 864 +U 972 ; WX 687 ; N omicrontonos ; G 865 +U 973 ; WX 675 ; N upsilontonos ; G 866 +U 974 ; WX 869 ; N omegatonos ; G 867 +U 975 ; WX 775 ; N uni03CF ; G 868 +U 976 ; WX 651 ; N uni03D0 ; G 869 +U 977 ; WX 661 ; N theta1 ; G 870 +U 978 ; WX 746 ; N Upsilon1 ; G 871 +U 979 ; WX 981 ; N uni03D3 ; G 872 +U 980 ; WX 746 ; N uni03D4 ; G 873 +U 981 ; WX 796 ; N phi1 ; G 874 +U 982 ; WX 869 ; N omega1 ; G 875 +U 983 ; WX 744 ; N uni03D7 ; G 876 +U 984 ; WX 850 ; N uni03D8 ; G 877 +U 985 ; WX 687 ; N uni03D9 ; G 878 +U 986 ; WX 734 ; N uni03DA ; G 879 +U 987 ; WX 593 ; N uni03DB ; G 880 +U 988 ; WX 683 ; N uni03DC ; G 881 +U 989 ; WX 494 ; N uni03DD ; G 882 +U 990 ; WX 702 ; N uni03DE ; G 883 +U 991 ; WX 660 ; N uni03DF ; G 884 +U 992 ; WX 919 ; N uni03E0 ; G 885 +U 993 ; WX 627 ; N uni03E1 ; G 886 +U 994 ; WX 1093 ; N uni03E2 ; G 887 +U 995 ; WX 837 ; N uni03E3 ; G 888 +U 996 ; WX 832 ; N uni03E4 ; G 889 +U 997 ; WX 716 ; N uni03E5 ; G 890 +U 998 ; WX 928 ; N uni03E6 ; G 891 +U 999 ; WX 744 ; N uni03E7 ; G 892 +U 1000 ; WX 733 ; N uni03E8 ; G 893 +U 1001 ; WX 650 ; N uni03E9 ; G 894 +U 1002 ; WX 789 ; N uni03EA ; G 895 +U 1003 ; WX 671 ; N uni03EB ; G 896 +U 1004 ; WX 752 ; N uni03EC ; G 897 +U 1005 ; WX 716 ; N uni03ED ; G 898 +U 1006 ; WX 682 ; N uni03EE ; G 899 +U 1007 ; WX 590 ; N uni03EF ; G 900 +U 1008 ; WX 744 ; N uni03F0 ; G 901 +U 1009 ; WX 716 ; N uni03F1 ; G 902 +U 1010 ; WX 593 ; N uni03F2 ; G 903 +U 1011 ; WX 343 ; N uni03F3 ; G 904 +U 1012 ; WX 850 ; N uni03F4 ; G 905 +U 1013 ; WX 645 ; N uni03F5 ; G 906 +U 1014 ; WX 644 ; N uni03F6 ; G 907 +U 1015 ; WX 738 ; N uni03F7 ; G 908 +U 1016 ; WX 716 ; N uni03F8 ; G 909 +U 1017 ; WX 734 ; N uni03F9 ; G 910 +U 1018 ; WX 995 ; N uni03FA ; G 911 +U 1019 ; WX 732 ; N uni03FB ; G 912 +U 1020 ; WX 716 ; N uni03FC ; G 913 +U 1021 ; WX 698 ; N uni03FD ; G 914 +U 1022 ; WX 734 ; N uni03FE ; G 915 +U 1023 ; WX 698 ; N uni03FF ; G 916 +U 1024 ; WX 683 ; N uni0400 ; G 917 +U 1025 ; WX 683 ; N uni0401 ; G 918 +U 1026 ; WX 878 ; N uni0402 ; G 919 +U 1027 ; WX 637 ; N uni0403 ; G 920 +U 1028 ; WX 734 ; N uni0404 ; G 921 +U 1029 ; WX 720 ; N uni0405 ; G 922 +U 1030 ; WX 372 ; N uni0406 ; G 923 +U 1031 ; WX 372 ; N uni0407 ; G 924 +U 1032 ; WX 372 ; N uni0408 ; G 925 +U 1033 ; WX 1154 ; N uni0409 ; G 926 +U 1034 ; WX 1130 ; N uni040A ; G 927 +U 1035 ; WX 878 ; N uni040B ; G 928 +U 1036 ; WX 817 ; N uni040C ; G 929 +U 1037 ; WX 837 ; N uni040D ; G 930 +U 1038 ; WX 771 ; N uni040E ; G 931 +U 1039 ; WX 837 ; N uni040F ; G 932 +U 1040 ; WX 774 ; N uni0410 ; G 933 +U 1041 ; WX 762 ; N uni0411 ; G 934 +U 1042 ; WX 762 ; N uni0412 ; G 935 +U 1043 ; WX 637 ; N uni0413 ; G 936 +U 1044 ; WX 891 ; N uni0414 ; G 937 +U 1045 ; WX 683 ; N uni0415 ; G 938 +U 1046 ; WX 1224 ; N uni0416 ; G 939 +U 1047 ; WX 710 ; N uni0417 ; G 940 +U 1048 ; WX 837 ; N uni0418 ; G 941 +U 1049 ; WX 837 ; N uni0419 ; G 942 +U 1050 ; WX 817 ; N uni041A ; G 943 +U 1051 ; WX 831 ; N uni041B ; G 944 +U 1052 ; WX 995 ; N uni041C ; G 945 +U 1053 ; WX 837 ; N uni041D ; G 946 +U 1054 ; WX 850 ; N uni041E ; G 947 +U 1055 ; WX 837 ; N uni041F ; G 948 +U 1056 ; WX 733 ; N uni0420 ; G 949 +U 1057 ; WX 734 ; N uni0421 ; G 950 +U 1058 ; WX 682 ; N uni0422 ; G 951 +U 1059 ; WX 771 ; N uni0423 ; G 952 +U 1060 ; WX 992 ; N uni0424 ; G 953 +U 1061 ; WX 771 ; N uni0425 ; G 954 +U 1062 ; WX 928 ; N uni0426 ; G 955 +U 1063 ; WX 808 ; N uni0427 ; G 956 +U 1064 ; WX 1235 ; N uni0428 ; G 957 +U 1065 ; WX 1326 ; N uni0429 ; G 958 +U 1066 ; WX 939 ; N uni042A ; G 959 +U 1067 ; WX 1036 ; N uni042B ; G 960 +U 1068 ; WX 762 ; N uni042C ; G 961 +U 1069 ; WX 734 ; N uni042D ; G 962 +U 1070 ; WX 1174 ; N uni042E ; G 963 +U 1071 ; WX 770 ; N uni042F ; G 964 +U 1072 ; WX 675 ; N uni0430 ; G 965 +U 1073 ; WX 698 ; N uni0431 ; G 966 +U 1074 ; WX 633 ; N uni0432 ; G 967 +U 1075 ; WX 522 ; N uni0433 ; G 968 +U 1076 ; WX 808 ; N uni0434 ; G 969 +U 1077 ; WX 678 ; N uni0435 ; G 970 +U 1078 ; WX 995 ; N uni0436 ; G 971 +U 1079 ; WX 581 ; N uni0437 ; G 972 +U 1080 ; WX 701 ; N uni0438 ; G 973 +U 1081 ; WX 701 ; N uni0439 ; G 974 +U 1082 ; WX 679 ; N uni043A ; G 975 +U 1083 ; WX 732 ; N uni043B ; G 976 +U 1084 ; WX 817 ; N uni043C ; G 977 +U 1085 ; WX 691 ; N uni043D ; G 978 +U 1086 ; WX 687 ; N uni043E ; G 979 +U 1087 ; WX 691 ; N uni043F ; G 980 +U 1088 ; WX 716 ; N uni0440 ; G 981 +U 1089 ; WX 593 ; N uni0441 ; G 982 +U 1090 ; WX 580 ; N uni0442 ; G 983 +U 1091 ; WX 652 ; N uni0443 ; G 984 +U 1092 ; WX 992 ; N uni0444 ; G 985 +U 1093 ; WX 645 ; N uni0445 ; G 986 +U 1094 ; WX 741 ; N uni0446 ; G 987 +U 1095 ; WX 687 ; N uni0447 ; G 988 +U 1096 ; WX 1062 ; N uni0448 ; G 989 +U 1097 ; WX 1105 ; N uni0449 ; G 990 +U 1098 ; WX 751 ; N uni044A ; G 991 +U 1099 ; WX 904 ; N uni044B ; G 992 +U 1100 ; WX 632 ; N uni044C ; G 993 +U 1101 ; WX 593 ; N uni044D ; G 994 +U 1102 ; WX 972 ; N uni044E ; G 995 +U 1103 ; WX 642 ; N uni044F ; G 996 +U 1104 ; WX 678 ; N uni0450 ; G 997 +U 1105 ; WX 678 ; N uni0451 ; G 998 +U 1106 ; WX 714 ; N uni0452 ; G 999 +U 1107 ; WX 522 ; N uni0453 ; G 1000 +U 1108 ; WX 593 ; N uni0454 ; G 1001 +U 1109 ; WX 595 ; N uni0455 ; G 1002 +U 1110 ; WX 343 ; N uni0456 ; G 1003 +U 1111 ; WX 343 ; N uni0457 ; G 1004 +U 1112 ; WX 343 ; N uni0458 ; G 1005 +U 1113 ; WX 991 ; N uni0459 ; G 1006 +U 1114 ; WX 956 ; N uni045A ; G 1007 +U 1115 ; WX 734 ; N uni045B ; G 1008 +U 1116 ; WX 679 ; N uni045C ; G 1009 +U 1117 ; WX 701 ; N uni045D ; G 1010 +U 1118 ; WX 652 ; N uni045E ; G 1011 +U 1119 ; WX 691 ; N uni045F ; G 1012 +U 1120 ; WX 1093 ; N uni0460 ; G 1013 +U 1121 ; WX 869 ; N uni0461 ; G 1014 +U 1122 ; WX 840 ; N uni0462 ; G 1015 +U 1123 ; WX 736 ; N uni0463 ; G 1016 +U 1124 ; WX 1012 ; N uni0464 ; G 1017 +U 1125 ; WX 839 ; N uni0465 ; G 1018 +U 1126 ; WX 992 ; N uni0466 ; G 1019 +U 1127 ; WX 832 ; N uni0467 ; G 1020 +U 1128 ; WX 1358 ; N uni0468 ; G 1021 +U 1129 ; WX 1121 ; N uni0469 ; G 1022 +U 1130 ; WX 850 ; N uni046A ; G 1023 +U 1131 ; WX 687 ; N uni046B ; G 1024 +U 1132 ; WX 1236 ; N uni046C ; G 1025 +U 1133 ; WX 1007 ; N uni046D ; G 1026 +U 1134 ; WX 696 ; N uni046E ; G 1027 +U 1135 ; WX 557 ; N uni046F ; G 1028 +U 1136 ; WX 1075 ; N uni0470 ; G 1029 +U 1137 ; WX 1061 ; N uni0471 ; G 1030 +U 1138 ; WX 850 ; N uni0472 ; G 1031 +U 1139 ; WX 687 ; N uni0473 ; G 1032 +U 1140 ; WX 850 ; N uni0474 ; G 1033 +U 1141 ; WX 695 ; N uni0475 ; G 1034 +U 1142 ; WX 850 ; N uni0476 ; G 1035 +U 1143 ; WX 695 ; N uni0477 ; G 1036 +U 1144 ; WX 1148 ; N uni0478 ; G 1037 +U 1145 ; WX 1043 ; N uni0479 ; G 1038 +U 1146 ; WX 1074 ; N uni047A ; G 1039 +U 1147 ; WX 863 ; N uni047B ; G 1040 +U 1148 ; WX 1405 ; N uni047C ; G 1041 +U 1149 ; WX 1173 ; N uni047D ; G 1042 +U 1150 ; WX 1093 ; N uni047E ; G 1043 +U 1151 ; WX 869 ; N uni047F ; G 1044 +U 1152 ; WX 734 ; N uni0480 ; G 1045 +U 1153 ; WX 593 ; N uni0481 ; G 1046 +U 1154 ; WX 652 ; N uni0482 ; G 1047 +U 1155 ; WX 0 ; N uni0483 ; G 1048 +U 1156 ; WX 0 ; N uni0484 ; G 1049 +U 1157 ; WX 0 ; N uni0485 ; G 1050 +U 1158 ; WX 0 ; N uni0486 ; G 1051 +U 1159 ; WX 0 ; N uni0487 ; G 1052 +U 1160 ; WX 418 ; N uni0488 ; G 1053 +U 1161 ; WX 418 ; N uni0489 ; G 1054 +U 1162 ; WX 957 ; N uni048A ; G 1055 +U 1163 ; WX 807 ; N uni048B ; G 1056 +U 1164 ; WX 762 ; N uni048C ; G 1057 +U 1165 ; WX 611 ; N uni048D ; G 1058 +U 1166 ; WX 733 ; N uni048E ; G 1059 +U 1167 ; WX 716 ; N uni048F ; G 1060 +U 1168 ; WX 637 ; N uni0490 ; G 1061 +U 1169 ; WX 522 ; N uni0491 ; G 1062 +U 1170 ; WX 666 ; N uni0492 ; G 1063 +U 1171 ; WX 543 ; N uni0493 ; G 1064 +U 1172 ; WX 808 ; N uni0494 ; G 1065 +U 1173 ; WX 669 ; N uni0495 ; G 1066 +U 1174 ; WX 1224 ; N uni0496 ; G 1067 +U 1175 ; WX 995 ; N uni0497 ; G 1068 +U 1176 ; WX 710 ; N uni0498 ; G 1069 +U 1177 ; WX 581 ; N uni0499 ; G 1070 +U 1178 ; WX 775 ; N uni049A ; G 1071 +U 1179 ; WX 679 ; N uni049B ; G 1072 +U 1180 ; WX 817 ; N uni049C ; G 1073 +U 1181 ; WX 679 ; N uni049D ; G 1074 +U 1182 ; WX 817 ; N uni049E ; G 1075 +U 1183 ; WX 679 ; N uni049F ; G 1076 +U 1184 ; WX 1015 ; N uni04A0 ; G 1077 +U 1185 ; WX 826 ; N uni04A1 ; G 1078 +U 1186 ; WX 956 ; N uni04A2 ; G 1079 +U 1187 ; WX 808 ; N uni04A3 ; G 1080 +U 1188 ; WX 1103 ; N uni04A4 ; G 1081 +U 1189 ; WX 874 ; N uni04A5 ; G 1082 +U 1190 ; WX 1273 ; N uni04A6 ; G 1083 +U 1191 ; WX 1017 ; N uni04A7 ; G 1084 +U 1192 ; WX 952 ; N uni04A8 ; G 1085 +U 1193 ; WX 858 ; N uni04A9 ; G 1086 +U 1194 ; WX 734 ; N uni04AA ; G 1087 +U 1195 ; WX 593 ; N uni04AB ; G 1088 +U 1196 ; WX 682 ; N uni04AC ; G 1089 +U 1197 ; WX 580 ; N uni04AD ; G 1090 +U 1198 ; WX 724 ; N uni04AE ; G 1091 +U 1199 ; WX 652 ; N uni04AF ; G 1092 +U 1200 ; WX 724 ; N uni04B0 ; G 1093 +U 1201 ; WX 652 ; N uni04B1 ; G 1094 +U 1202 ; WX 771 ; N uni04B2 ; G 1095 +U 1203 ; WX 645 ; N uni04B3 ; G 1096 +U 1204 ; WX 1112 ; N uni04B4 ; G 1097 +U 1205 ; WX 1000 ; N uni04B5 ; G 1098 +U 1206 ; WX 808 ; N uni04B6 ; G 1099 +U 1207 ; WX 687 ; N uni04B7 ; G 1100 +U 1208 ; WX 808 ; N uni04B8 ; G 1101 +U 1209 ; WX 687 ; N uni04B9 ; G 1102 +U 1210 ; WX 808 ; N uni04BA ; G 1103 +U 1211 ; WX 712 ; N uni04BB ; G 1104 +U 1212 ; WX 1026 ; N uni04BC ; G 1105 +U 1213 ; WX 810 ; N uni04BD ; G 1106 +U 1214 ; WX 1026 ; N uni04BE ; G 1107 +U 1215 ; WX 810 ; N uni04BF ; G 1108 +U 1216 ; WX 372 ; N uni04C0 ; G 1109 +U 1217 ; WX 1224 ; N uni04C1 ; G 1110 +U 1218 ; WX 995 ; N uni04C2 ; G 1111 +U 1219 ; WX 775 ; N uni04C3 ; G 1112 +U 1220 ; WX 630 ; N uni04C4 ; G 1113 +U 1221 ; WX 951 ; N uni04C5 ; G 1114 +U 1222 ; WX 805 ; N uni04C6 ; G 1115 +U 1223 ; WX 837 ; N uni04C7 ; G 1116 +U 1224 ; WX 691 ; N uni04C8 ; G 1117 +U 1225 ; WX 957 ; N uni04C9 ; G 1118 +U 1226 ; WX 807 ; N uni04CA ; G 1119 +U 1227 ; WX 808 ; N uni04CB ; G 1120 +U 1228 ; WX 687 ; N uni04CC ; G 1121 +U 1229 ; WX 1115 ; N uni04CD ; G 1122 +U 1230 ; WX 933 ; N uni04CE ; G 1123 +U 1231 ; WX 343 ; N uni04CF ; G 1124 +U 1232 ; WX 774 ; N uni04D0 ; G 1125 +U 1233 ; WX 675 ; N uni04D1 ; G 1126 +U 1234 ; WX 774 ; N uni04D2 ; G 1127 +U 1235 ; WX 675 ; N uni04D3 ; G 1128 +U 1236 ; WX 1085 ; N uni04D4 ; G 1129 +U 1237 ; WX 1048 ; N uni04D5 ; G 1130 +U 1238 ; WX 683 ; N uni04D6 ; G 1131 +U 1239 ; WX 678 ; N uni04D7 ; G 1132 +U 1240 ; WX 849 ; N uni04D8 ; G 1133 +U 1241 ; WX 678 ; N uni04D9 ; G 1134 +U 1242 ; WX 849 ; N uni04DA ; G 1135 +U 1243 ; WX 678 ; N uni04DB ; G 1136 +U 1244 ; WX 1224 ; N uni04DC ; G 1137 +U 1245 ; WX 995 ; N uni04DD ; G 1138 +U 1246 ; WX 710 ; N uni04DE ; G 1139 +U 1247 ; WX 581 ; N uni04DF ; G 1140 +U 1248 ; WX 772 ; N uni04E0 ; G 1141 +U 1249 ; WX 641 ; N uni04E1 ; G 1142 +U 1250 ; WX 837 ; N uni04E2 ; G 1143 +U 1251 ; WX 701 ; N uni04E3 ; G 1144 +U 1252 ; WX 837 ; N uni04E4 ; G 1145 +U 1253 ; WX 701 ; N uni04E5 ; G 1146 +U 1254 ; WX 850 ; N uni04E6 ; G 1147 +U 1255 ; WX 687 ; N uni04E7 ; G 1148 +U 1256 ; WX 850 ; N uni04E8 ; G 1149 +U 1257 ; WX 687 ; N uni04E9 ; G 1150 +U 1258 ; WX 850 ; N uni04EA ; G 1151 +U 1259 ; WX 687 ; N uni04EB ; G 1152 +U 1260 ; WX 734 ; N uni04EC ; G 1153 +U 1261 ; WX 593 ; N uni04ED ; G 1154 +U 1262 ; WX 771 ; N uni04EE ; G 1155 +U 1263 ; WX 652 ; N uni04EF ; G 1156 +U 1264 ; WX 771 ; N uni04F0 ; G 1157 +U 1265 ; WX 652 ; N uni04F1 ; G 1158 +U 1266 ; WX 771 ; N uni04F2 ; G 1159 +U 1267 ; WX 652 ; N uni04F3 ; G 1160 +U 1268 ; WX 808 ; N uni04F4 ; G 1161 +U 1269 ; WX 687 ; N uni04F5 ; G 1162 +U 1270 ; WX 637 ; N uni04F6 ; G 1163 +U 1271 ; WX 522 ; N uni04F7 ; G 1164 +U 1272 ; WX 1036 ; N uni04F8 ; G 1165 +U 1273 ; WX 904 ; N uni04F9 ; G 1166 +U 1274 ; WX 666 ; N uni04FA ; G 1167 +U 1275 ; WX 543 ; N uni04FB ; G 1168 +U 1276 ; WX 771 ; N uni04FC ; G 1169 +U 1277 ; WX 645 ; N uni04FD ; G 1170 +U 1278 ; WX 771 ; N uni04FE ; G 1171 +U 1279 ; WX 645 ; N uni04FF ; G 1172 +U 1280 ; WX 762 ; N uni0500 ; G 1173 +U 1281 ; WX 608 ; N uni0501 ; G 1174 +U 1282 ; WX 1159 ; N uni0502 ; G 1175 +U 1283 ; WX 893 ; N uni0503 ; G 1176 +U 1284 ; WX 1119 ; N uni0504 ; G 1177 +U 1285 ; WX 920 ; N uni0505 ; G 1178 +U 1286 ; WX 828 ; N uni0506 ; G 1179 +U 1287 ; WX 693 ; N uni0507 ; G 1180 +U 1288 ; WX 1242 ; N uni0508 ; G 1181 +U 1289 ; WX 1017 ; N uni0509 ; G 1182 +U 1290 ; WX 1289 ; N uni050A ; G 1183 +U 1291 ; WX 1013 ; N uni050B ; G 1184 +U 1292 ; WX 839 ; N uni050C ; G 1185 +U 1293 ; WX 638 ; N uni050D ; G 1186 +U 1294 ; WX 938 ; N uni050E ; G 1187 +U 1295 ; WX 803 ; N uni050F ; G 1188 +U 1296 ; WX 696 ; N uni0510 ; G 1189 +U 1297 ; WX 557 ; N uni0511 ; G 1190 +U 1298 ; WX 831 ; N uni0512 ; G 1191 +U 1299 ; WX 732 ; N uni0513 ; G 1192 +U 1300 ; WX 1286 ; N uni0514 ; G 1193 +U 1301 ; WX 1068 ; N uni0515 ; G 1194 +U 1302 ; WX 1065 ; N uni0516 ; G 1195 +U 1303 ; WX 979 ; N uni0517 ; G 1196 +U 1304 ; WX 1082 ; N uni0518 ; G 1197 +U 1305 ; WX 1013 ; N uni0519 ; G 1198 +U 1306 ; WX 850 ; N uni051A ; G 1199 +U 1307 ; WX 716 ; N uni051B ; G 1200 +U 1308 ; WX 1103 ; N uni051C ; G 1201 +U 1309 ; WX 924 ; N uni051D ; G 1202 +U 1310 ; WX 817 ; N uni051E ; G 1203 +U 1311 ; WX 679 ; N uni051F ; G 1204 +U 1312 ; WX 1267 ; N uni0520 ; G 1205 +U 1313 ; WX 1059 ; N uni0521 ; G 1206 +U 1314 ; WX 1273 ; N uni0522 ; G 1207 +U 1315 ; WX 1017 ; N uni0523 ; G 1208 +U 1316 ; WX 957 ; N uni0524 ; G 1209 +U 1317 ; WX 807 ; N uni0525 ; G 1210 +U 1329 ; WX 813 ; N uni0531 ; G 1211 +U 1330 ; WX 729 ; N uni0532 ; G 1212 +U 1331 ; WX 728 ; N uni0533 ; G 1213 +U 1332 ; WX 731 ; N uni0534 ; G 1214 +U 1333 ; WX 729 ; N uni0535 ; G 1215 +U 1334 ; WX 733 ; N uni0536 ; G 1216 +U 1335 ; WX 652 ; N uni0537 ; G 1217 +U 1336 ; WX 720 ; N uni0538 ; G 1218 +U 1337 ; WX 903 ; N uni0539 ; G 1219 +U 1338 ; WX 728 ; N uni053A ; G 1220 +U 1339 ; WX 666 ; N uni053B ; G 1221 +U 1340 ; WX 558 ; N uni053C ; G 1222 +U 1341 ; WX 961 ; N uni053D ; G 1223 +U 1342 ; WX 788 ; N uni053E ; G 1224 +U 1343 ; WX 713 ; N uni053F ; G 1225 +U 1344 ; WX 651 ; N uni0540 ; G 1226 +U 1345 ; WX 730 ; N uni0541 ; G 1227 +U 1346 ; WX 715 ; N uni0542 ; G 1228 +U 1347 ; WX 704 ; N uni0543 ; G 1229 +U 1348 ; WX 780 ; N uni0544 ; G 1230 +U 1349 ; WX 689 ; N uni0545 ; G 1231 +U 1350 ; WX 715 ; N uni0546 ; G 1232 +U 1351 ; WX 708 ; N uni0547 ; G 1233 +U 1352 ; WX 731 ; N uni0548 ; G 1234 +U 1353 ; WX 677 ; N uni0549 ; G 1235 +U 1354 ; WX 867 ; N uni054A ; G 1236 +U 1355 ; WX 711 ; N uni054B ; G 1237 +U 1356 ; WX 780 ; N uni054C ; G 1238 +U 1357 ; WX 731 ; N uni054D ; G 1239 +U 1358 ; WX 715 ; N uni054E ; G 1240 +U 1359 ; WX 693 ; N uni054F ; G 1241 +U 1360 ; WX 666 ; N uni0550 ; G 1242 +U 1361 ; WX 698 ; N uni0551 ; G 1243 +U 1362 ; WX 576 ; N uni0552 ; G 1244 +U 1363 ; WX 833 ; N uni0553 ; G 1245 +U 1364 ; WX 698 ; N uni0554 ; G 1246 +U 1365 ; WX 763 ; N uni0555 ; G 1247 +U 1366 ; WX 855 ; N uni0556 ; G 1248 +U 1369 ; WX 330 ; N uni0559 ; G 1249 +U 1370 ; WX 342 ; N uni055A ; G 1250 +U 1371 ; WX 308 ; N uni055B ; G 1251 +U 1372 ; WX 374 ; N uni055C ; G 1252 +U 1373 ; WX 313 ; N uni055D ; G 1253 +U 1374 ; WX 461 ; N uni055E ; G 1254 +U 1375 ; WX 468 ; N uni055F ; G 1255 +U 1377 ; WX 938 ; N uni0561 ; G 1256 +U 1378 ; WX 642 ; N uni0562 ; G 1257 +U 1379 ; WX 704 ; N uni0563 ; G 1258 +U 1380 ; WX 708 ; N uni0564 ; G 1259 +U 1381 ; WX 642 ; N uni0565 ; G 1260 +U 1382 ; WX 644 ; N uni0566 ; G 1261 +U 1383 ; WX 565 ; N uni0567 ; G 1262 +U 1384 ; WX 642 ; N uni0568 ; G 1263 +U 1385 ; WX 756 ; N uni0569 ; G 1264 +U 1386 ; WX 704 ; N uni056A ; G 1265 +U 1387 ; WX 643 ; N uni056B ; G 1266 +U 1388 ; WX 310 ; N uni056C ; G 1267 +U 1389 ; WX 984 ; N uni056D ; G 1268 +U 1390 ; WX 638 ; N uni056E ; G 1269 +U 1391 ; WX 643 ; N uni056F ; G 1270 +U 1392 ; WX 643 ; N uni0570 ; G 1271 +U 1393 ; WX 603 ; N uni0571 ; G 1272 +U 1394 ; WX 643 ; N uni0572 ; G 1273 +U 1395 ; WX 642 ; N uni0573 ; G 1274 +U 1396 ; WX 643 ; N uni0574 ; G 1275 +U 1397 ; WX 309 ; N uni0575 ; G 1276 +U 1398 ; WX 643 ; N uni0576 ; G 1277 +U 1399 ; WX 486 ; N uni0577 ; G 1278 +U 1400 ; WX 643 ; N uni0578 ; G 1279 +U 1401 ; WX 366 ; N uni0579 ; G 1280 +U 1402 ; WX 938 ; N uni057A ; G 1281 +U 1403 ; WX 573 ; N uni057B ; G 1282 +U 1404 ; WX 666 ; N uni057C ; G 1283 +U 1405 ; WX 643 ; N uni057D ; G 1284 +U 1406 ; WX 643 ; N uni057E ; G 1285 +U 1407 ; WX 934 ; N uni057F ; G 1286 +U 1408 ; WX 643 ; N uni0580 ; G 1287 +U 1409 ; WX 643 ; N uni0581 ; G 1288 +U 1410 ; WX 479 ; N uni0582 ; G 1289 +U 1411 ; WX 934 ; N uni0583 ; G 1290 +U 1412 ; WX 648 ; N uni0584 ; G 1291 +U 1413 ; WX 620 ; N uni0585 ; G 1292 +U 1414 ; WX 813 ; N uni0586 ; G 1293 +U 1415 ; WX 812 ; N uni0587 ; G 1294 +U 1417 ; WX 360 ; N uni0589 ; G 1295 +U 1418 ; WX 374 ; N uni058A ; G 1296 +U 1456 ; WX 0 ; N uni05B0 ; G 1297 +U 1457 ; WX 0 ; N uni05B1 ; G 1298 +U 1458 ; WX 0 ; N uni05B2 ; G 1299 +U 1459 ; WX 0 ; N uni05B3 ; G 1300 +U 1460 ; WX 0 ; N uni05B4 ; G 1301 +U 1461 ; WX 0 ; N uni05B5 ; G 1302 +U 1462 ; WX 0 ; N uni05B6 ; G 1303 +U 1463 ; WX 0 ; N uni05B7 ; G 1304 +U 1464 ; WX 0 ; N uni05B8 ; G 1305 +U 1465 ; WX 0 ; N uni05B9 ; G 1306 +U 1466 ; WX 0 ; N uni05BA ; G 1307 +U 1467 ; WX 0 ; N uni05BB ; G 1308 +U 1468 ; WX 0 ; N uni05BC ; G 1309 +U 1469 ; WX 0 ; N uni05BD ; G 1310 +U 1470 ; WX 415 ; N uni05BE ; G 1311 +U 1471 ; WX 0 ; N uni05BF ; G 1312 +U 1472 ; WX 372 ; N uni05C0 ; G 1313 +U 1473 ; WX 0 ; N uni05C1 ; G 1314 +U 1474 ; WX 0 ; N uni05C2 ; G 1315 +U 1475 ; WX 372 ; N uni05C3 ; G 1316 +U 1478 ; WX 497 ; N uni05C6 ; G 1317 +U 1479 ; WX 0 ; N uni05C7 ; G 1318 +U 1488 ; WX 728 ; N uni05D0 ; G 1319 +U 1489 ; WX 610 ; N uni05D1 ; G 1320 +U 1490 ; WX 447 ; N uni05D2 ; G 1321 +U 1491 ; WX 588 ; N uni05D3 ; G 1322 +U 1492 ; WX 687 ; N uni05D4 ; G 1323 +U 1493 ; WX 343 ; N uni05D5 ; G 1324 +U 1494 ; WX 400 ; N uni05D6 ; G 1325 +U 1495 ; WX 687 ; N uni05D7 ; G 1326 +U 1496 ; WX 679 ; N uni05D8 ; G 1327 +U 1497 ; WX 294 ; N uni05D9 ; G 1328 +U 1498 ; WX 578 ; N uni05DA ; G 1329 +U 1499 ; WX 566 ; N uni05DB ; G 1330 +U 1500 ; WX 605 ; N uni05DC ; G 1331 +U 1501 ; WX 696 ; N uni05DD ; G 1332 +U 1502 ; WX 724 ; N uni05DE ; G 1333 +U 1503 ; WX 343 ; N uni05DF ; G 1334 +U 1504 ; WX 453 ; N uni05E0 ; G 1335 +U 1505 ; WX 680 ; N uni05E1 ; G 1336 +U 1506 ; WX 666 ; N uni05E2 ; G 1337 +U 1507 ; WX 675 ; N uni05E3 ; G 1338 +U 1508 ; WX 658 ; N uni05E4 ; G 1339 +U 1509 ; WX 661 ; N uni05E5 ; G 1340 +U 1510 ; WX 653 ; N uni05E6 ; G 1341 +U 1511 ; WX 736 ; N uni05E7 ; G 1342 +U 1512 ; WX 602 ; N uni05E8 ; G 1343 +U 1513 ; WX 758 ; N uni05E9 ; G 1344 +U 1514 ; WX 683 ; N uni05EA ; G 1345 +U 1520 ; WX 664 ; N uni05F0 ; G 1346 +U 1521 ; WX 567 ; N uni05F1 ; G 1347 +U 1522 ; WX 519 ; N uni05F2 ; G 1348 +U 1523 ; WX 444 ; N uni05F3 ; G 1349 +U 1524 ; WX 710 ; N uni05F4 ; G 1350 +U 1542 ; WX 667 ; N uni0606 ; G 1351 +U 1543 ; WX 667 ; N uni0607 ; G 1352 +U 1545 ; WX 884 ; N uni0609 ; G 1353 +U 1546 ; WX 1157 ; N uni060A ; G 1354 +U 1548 ; WX 380 ; N uni060C ; G 1355 +U 1557 ; WX 0 ; N uni0615 ; G 1356 +U 1563 ; WX 400 ; N uni061B ; G 1357 +U 1567 ; WX 580 ; N uni061F ; G 1358 +U 1569 ; WX 511 ; N uni0621 ; G 1359 +U 1570 ; WX 343 ; N uni0622 ; G 1360 +U 1571 ; WX 343 ; N uni0623 ; G 1361 +U 1572 ; WX 622 ; N uni0624 ; G 1362 +U 1573 ; WX 343 ; N uni0625 ; G 1363 +U 1574 ; WX 917 ; N uni0626 ; G 1364 +U 1575 ; WX 343 ; N uni0627 ; G 1365 +U 1576 ; WX 1005 ; N uni0628 ; G 1366 +U 1577 ; WX 590 ; N uni0629 ; G 1367 +U 1578 ; WX 1005 ; N uni062A ; G 1368 +U 1579 ; WX 1005 ; N uni062B ; G 1369 +U 1580 ; WX 721 ; N uni062C ; G 1370 +U 1581 ; WX 721 ; N uni062D ; G 1371 +U 1582 ; WX 721 ; N uni062E ; G 1372 +U 1583 ; WX 513 ; N uni062F ; G 1373 +U 1584 ; WX 513 ; N uni0630 ; G 1374 +U 1585 ; WX 576 ; N uni0631 ; G 1375 +U 1586 ; WX 576 ; N uni0632 ; G 1376 +U 1587 ; WX 1380 ; N uni0633 ; G 1377 +U 1588 ; WX 1380 ; N uni0634 ; G 1378 +U 1589 ; WX 1345 ; N uni0635 ; G 1379 +U 1590 ; WX 1345 ; N uni0636 ; G 1380 +U 1591 ; WX 1039 ; N uni0637 ; G 1381 +U 1592 ; WX 1039 ; N uni0638 ; G 1382 +U 1593 ; WX 683 ; N uni0639 ; G 1383 +U 1594 ; WX 683 ; N uni063A ; G 1384 +U 1600 ; WX 342 ; N uni0640 ; G 1385 +U 1601 ; WX 1162 ; N uni0641 ; G 1386 +U 1602 ; WX 894 ; N uni0642 ; G 1387 +U 1603 ; WX 917 ; N uni0643 ; G 1388 +U 1604 ; WX 868 ; N uni0644 ; G 1389 +U 1605 ; WX 733 ; N uni0645 ; G 1390 +U 1606 ; WX 854 ; N uni0646 ; G 1391 +U 1607 ; WX 590 ; N uni0647 ; G 1392 +U 1608 ; WX 622 ; N uni0648 ; G 1393 +U 1609 ; WX 917 ; N uni0649 ; G 1394 +U 1610 ; WX 917 ; N uni064A ; G 1395 +U 1611 ; WX 0 ; N uni064B ; G 1396 +U 1612 ; WX 0 ; N uni064C ; G 1397 +U 1613 ; WX 0 ; N uni064D ; G 1398 +U 1614 ; WX 0 ; N uni064E ; G 1399 +U 1615 ; WX 0 ; N uni064F ; G 1400 +U 1616 ; WX 0 ; N uni0650 ; G 1401 +U 1617 ; WX 0 ; N uni0651 ; G 1402 +U 1618 ; WX 0 ; N uni0652 ; G 1403 +U 1619 ; WX 0 ; N uni0653 ; G 1404 +U 1620 ; WX 0 ; N uni0654 ; G 1405 +U 1621 ; WX 0 ; N uni0655 ; G 1406 +U 1623 ; WX 0 ; N uni0657 ; G 1407 +U 1626 ; WX 500 ; N uni065A ; G 1408 +U 1632 ; WX 610 ; N uni0660 ; G 1409 +U 1633 ; WX 610 ; N uni0661 ; G 1410 +U 1634 ; WX 610 ; N uni0662 ; G 1411 +U 1635 ; WX 610 ; N uni0663 ; G 1412 +U 1636 ; WX 610 ; N uni0664 ; G 1413 +U 1637 ; WX 610 ; N uni0665 ; G 1414 +U 1638 ; WX 610 ; N uni0666 ; G 1415 +U 1639 ; WX 610 ; N uni0667 ; G 1416 +U 1640 ; WX 610 ; N uni0668 ; G 1417 +U 1641 ; WX 610 ; N uni0669 ; G 1418 +U 1642 ; WX 610 ; N uni066A ; G 1419 +U 1643 ; WX 374 ; N uni066B ; G 1420 +U 1644 ; WX 380 ; N uni066C ; G 1421 +U 1645 ; WX 545 ; N uni066D ; G 1422 +U 1646 ; WX 1005 ; N uni066E ; G 1423 +U 1647 ; WX 894 ; N uni066F ; G 1424 +U 1648 ; WX 0 ; N uni0670 ; G 1425 +U 1652 ; WX 292 ; N uni0674 ; G 1426 +U 1657 ; WX 1005 ; N uni0679 ; G 1427 +U 1658 ; WX 1005 ; N uni067A ; G 1428 +U 1659 ; WX 1005 ; N uni067B ; G 1429 +U 1660 ; WX 1005 ; N uni067C ; G 1430 +U 1661 ; WX 1005 ; N uni067D ; G 1431 +U 1662 ; WX 1005 ; N uni067E ; G 1432 +U 1663 ; WX 1005 ; N uni067F ; G 1433 +U 1664 ; WX 1005 ; N uni0680 ; G 1434 +U 1665 ; WX 721 ; N uni0681 ; G 1435 +U 1666 ; WX 721 ; N uni0682 ; G 1436 +U 1667 ; WX 721 ; N uni0683 ; G 1437 +U 1668 ; WX 721 ; N uni0684 ; G 1438 +U 1669 ; WX 721 ; N uni0685 ; G 1439 +U 1670 ; WX 721 ; N uni0686 ; G 1440 +U 1671 ; WX 721 ; N uni0687 ; G 1441 +U 1672 ; WX 445 ; N uni0688 ; G 1442 +U 1673 ; WX 445 ; N uni0689 ; G 1443 +U 1674 ; WX 445 ; N uni068A ; G 1444 +U 1675 ; WX 445 ; N uni068B ; G 1445 +U 1676 ; WX 445 ; N uni068C ; G 1446 +U 1677 ; WX 445 ; N uni068D ; G 1447 +U 1678 ; WX 445 ; N uni068E ; G 1448 +U 1679 ; WX 445 ; N uni068F ; G 1449 +U 1680 ; WX 445 ; N uni0690 ; G 1450 +U 1681 ; WX 576 ; N uni0691 ; G 1451 +U 1682 ; WX 576 ; N uni0692 ; G 1452 +U 1683 ; WX 576 ; N uni0693 ; G 1453 +U 1684 ; WX 576 ; N uni0694 ; G 1454 +U 1685 ; WX 681 ; N uni0695 ; G 1455 +U 1686 ; WX 576 ; N uni0696 ; G 1456 +U 1687 ; WX 576 ; N uni0697 ; G 1457 +U 1688 ; WX 576 ; N uni0698 ; G 1458 +U 1689 ; WX 576 ; N uni0699 ; G 1459 +U 1690 ; WX 1380 ; N uni069A ; G 1460 +U 1691 ; WX 1380 ; N uni069B ; G 1461 +U 1692 ; WX 1380 ; N uni069C ; G 1462 +U 1693 ; WX 1345 ; N uni069D ; G 1463 +U 1694 ; WX 1345 ; N uni069E ; G 1464 +U 1695 ; WX 1039 ; N uni069F ; G 1465 +U 1696 ; WX 683 ; N uni06A0 ; G 1466 +U 1697 ; WX 1162 ; N uni06A1 ; G 1467 +U 1698 ; WX 1162 ; N uni06A2 ; G 1468 +U 1699 ; WX 1162 ; N uni06A3 ; G 1469 +U 1700 ; WX 1162 ; N uni06A4 ; G 1470 +U 1701 ; WX 1162 ; N uni06A5 ; G 1471 +U 1702 ; WX 1162 ; N uni06A6 ; G 1472 +U 1703 ; WX 894 ; N uni06A7 ; G 1473 +U 1704 ; WX 894 ; N uni06A8 ; G 1474 +U 1705 ; WX 1024 ; N uni06A9 ; G 1475 +U 1706 ; WX 1271 ; N uni06AA ; G 1476 +U 1707 ; WX 1024 ; N uni06AB ; G 1477 +U 1708 ; WX 917 ; N uni06AC ; G 1478 +U 1709 ; WX 917 ; N uni06AD ; G 1479 +U 1710 ; WX 917 ; N uni06AE ; G 1480 +U 1711 ; WX 1024 ; N uni06AF ; G 1481 +U 1712 ; WX 1024 ; N uni06B0 ; G 1482 +U 1713 ; WX 1024 ; N uni06B1 ; G 1483 +U 1714 ; WX 1024 ; N uni06B2 ; G 1484 +U 1715 ; WX 1024 ; N uni06B3 ; G 1485 +U 1716 ; WX 1024 ; N uni06B4 ; G 1486 +U 1717 ; WX 868 ; N uni06B5 ; G 1487 +U 1718 ; WX 868 ; N uni06B6 ; G 1488 +U 1719 ; WX 868 ; N uni06B7 ; G 1489 +U 1720 ; WX 868 ; N uni06B8 ; G 1490 +U 1721 ; WX 854 ; N uni06B9 ; G 1491 +U 1722 ; WX 854 ; N uni06BA ; G 1492 +U 1723 ; WX 854 ; N uni06BB ; G 1493 +U 1724 ; WX 854 ; N uni06BC ; G 1494 +U 1725 ; WX 854 ; N uni06BD ; G 1495 +U 1726 ; WX 938 ; N uni06BE ; G 1496 +U 1727 ; WX 721 ; N uni06BF ; G 1497 +U 1734 ; WX 622 ; N uni06C6 ; G 1498 +U 1735 ; WX 622 ; N uni06C7 ; G 1499 +U 1736 ; WX 622 ; N uni06C8 ; G 1500 +U 1739 ; WX 622 ; N uni06CB ; G 1501 +U 1740 ; WX 917 ; N uni06CC ; G 1502 +U 1742 ; WX 917 ; N uni06CE ; G 1503 +U 1744 ; WX 917 ; N uni06D0 ; G 1504 +U 1749 ; WX 590 ; N uni06D5 ; G 1505 +U 1776 ; WX 610 ; N uni06F0 ; G 1506 +U 1777 ; WX 610 ; N uni06F1 ; G 1507 +U 1778 ; WX 610 ; N uni06F2 ; G 1508 +U 1779 ; WX 610 ; N uni06F3 ; G 1509 +U 1780 ; WX 610 ; N uni06F4 ; G 1510 +U 1781 ; WX 610 ; N uni06F5 ; G 1511 +U 1782 ; WX 610 ; N uni06F6 ; G 1512 +U 1783 ; WX 610 ; N uni06F7 ; G 1513 +U 1784 ; WX 610 ; N uni06F8 ; G 1514 +U 1785 ; WX 610 ; N uni06F9 ; G 1515 +U 1984 ; WX 696 ; N uni07C0 ; G 1516 +U 1985 ; WX 696 ; N uni07C1 ; G 1517 +U 1986 ; WX 696 ; N uni07C2 ; G 1518 +U 1987 ; WX 696 ; N uni07C3 ; G 1519 +U 1988 ; WX 696 ; N uni07C4 ; G 1520 +U 1989 ; WX 696 ; N uni07C5 ; G 1521 +U 1990 ; WX 696 ; N uni07C6 ; G 1522 +U 1991 ; WX 696 ; N uni07C7 ; G 1523 +U 1992 ; WX 696 ; N uni07C8 ; G 1524 +U 1993 ; WX 696 ; N uni07C9 ; G 1525 +U 1994 ; WX 343 ; N uni07CA ; G 1526 +U 1995 ; WX 547 ; N uni07CB ; G 1527 +U 1996 ; WX 543 ; N uni07CC ; G 1528 +U 1997 ; WX 652 ; N uni07CD ; G 1529 +U 1998 ; WX 691 ; N uni07CE ; G 1530 +U 1999 ; WX 691 ; N uni07CF ; G 1531 +U 2000 ; WX 594 ; N uni07D0 ; G 1532 +U 2001 ; WX 691 ; N uni07D1 ; G 1533 +U 2002 ; WX 904 ; N uni07D2 ; G 1534 +U 2003 ; WX 551 ; N uni07D3 ; G 1535 +U 2004 ; WX 551 ; N uni07D4 ; G 1536 +U 2005 ; WX 627 ; N uni07D5 ; G 1537 +U 2006 ; WX 688 ; N uni07D6 ; G 1538 +U 2007 ; WX 444 ; N uni07D7 ; G 1539 +U 2008 ; WX 1022 ; N uni07D8 ; G 1540 +U 2009 ; WX 506 ; N uni07D9 ; G 1541 +U 2010 ; WX 826 ; N uni07DA ; G 1542 +U 2011 ; WX 691 ; N uni07DB ; G 1543 +U 2012 ; WX 652 ; N uni07DC ; G 1544 +U 2013 ; WX 912 ; N uni07DD ; G 1545 +U 2014 ; WX 627 ; N uni07DE ; G 1546 +U 2015 ; WX 707 ; N uni07DF ; G 1547 +U 2016 ; WX 506 ; N uni07E0 ; G 1548 +U 2017 ; WX 652 ; N uni07E1 ; G 1549 +U 2018 ; WX 574 ; N uni07E2 ; G 1550 +U 2019 ; WX 627 ; N uni07E3 ; G 1551 +U 2020 ; WX 627 ; N uni07E4 ; G 1552 +U 2021 ; WX 627 ; N uni07E5 ; G 1553 +U 2022 ; WX 574 ; N uni07E6 ; G 1554 +U 2023 ; WX 574 ; N uni07E7 ; G 1555 +U 2027 ; WX 0 ; N uni07EB ; G 1556 +U 2028 ; WX 0 ; N uni07EC ; G 1557 +U 2029 ; WX 0 ; N uni07ED ; G 1558 +U 2030 ; WX 0 ; N uni07EE ; G 1559 +U 2031 ; WX 0 ; N uni07EF ; G 1560 +U 2032 ; WX 0 ; N uni07F0 ; G 1561 +U 2033 ; WX 0 ; N uni07F1 ; G 1562 +U 2034 ; WX 0 ; N uni07F2 ; G 1563 +U 2035 ; WX 0 ; N uni07F3 ; G 1564 +U 2036 ; WX 380 ; N uni07F4 ; G 1565 +U 2037 ; WX 380 ; N uni07F5 ; G 1566 +U 2040 ; WX 691 ; N uni07F8 ; G 1567 +U 2041 ; WX 691 ; N uni07F9 ; G 1568 +U 2042 ; WX 415 ; N uni07FA ; G 1569 +U 3647 ; WX 696 ; N uni0E3F ; G 1570 +U 3713 ; WX 790 ; N uni0E81 ; G 1571 +U 3714 ; WX 748 ; N uni0E82 ; G 1572 +U 3716 ; WX 749 ; N uni0E84 ; G 1573 +U 3719 ; WX 569 ; N uni0E87 ; G 1574 +U 3720 ; WX 742 ; N uni0E88 ; G 1575 +U 3722 ; WX 744 ; N uni0E8A ; G 1576 +U 3725 ; WX 761 ; N uni0E8D ; G 1577 +U 3732 ; WX 706 ; N uni0E94 ; G 1578 +U 3733 ; WX 704 ; N uni0E95 ; G 1579 +U 3734 ; WX 747 ; N uni0E96 ; G 1580 +U 3735 ; WX 819 ; N uni0E97 ; G 1581 +U 3737 ; WX 730 ; N uni0E99 ; G 1582 +U 3738 ; WX 727 ; N uni0E9A ; G 1583 +U 3739 ; WX 727 ; N uni0E9B ; G 1584 +U 3740 ; WX 922 ; N uni0E9C ; G 1585 +U 3741 ; WX 827 ; N uni0E9D ; G 1586 +U 3742 ; WX 866 ; N uni0E9E ; G 1587 +U 3743 ; WX 866 ; N uni0E9F ; G 1588 +U 3745 ; WX 836 ; N uni0EA1 ; G 1589 +U 3746 ; WX 761 ; N uni0EA2 ; G 1590 +U 3747 ; WX 770 ; N uni0EA3 ; G 1591 +U 3749 ; WX 769 ; N uni0EA5 ; G 1592 +U 3751 ; WX 713 ; N uni0EA7 ; G 1593 +U 3754 ; WX 827 ; N uni0EAA ; G 1594 +U 3755 ; WX 1031 ; N uni0EAB ; G 1595 +U 3757 ; WX 724 ; N uni0EAD ; G 1596 +U 3758 ; WX 784 ; N uni0EAE ; G 1597 +U 3759 ; WX 934 ; N uni0EAF ; G 1598 +U 3760 ; WX 688 ; N uni0EB0 ; G 1599 +U 3761 ; WX 0 ; N uni0EB1 ; G 1600 +U 3762 ; WX 610 ; N uni0EB2 ; G 1601 +U 3763 ; WX 610 ; N uni0EB3 ; G 1602 +U 3764 ; WX 0 ; N uni0EB4 ; G 1603 +U 3765 ; WX 0 ; N uni0EB5 ; G 1604 +U 3766 ; WX 0 ; N uni0EB6 ; G 1605 +U 3767 ; WX 0 ; N uni0EB7 ; G 1606 +U 3768 ; WX 0 ; N uni0EB8 ; G 1607 +U 3769 ; WX 0 ; N uni0EB9 ; G 1608 +U 3771 ; WX 0 ; N uni0EBB ; G 1609 +U 3772 ; WX 0 ; N uni0EBC ; G 1610 +U 3773 ; WX 670 ; N uni0EBD ; G 1611 +U 3776 ; WX 516 ; N uni0EC0 ; G 1612 +U 3777 ; WX 860 ; N uni0EC1 ; G 1613 +U 3778 ; WX 516 ; N uni0EC2 ; G 1614 +U 3779 ; WX 650 ; N uni0EC3 ; G 1615 +U 3780 ; WX 632 ; N uni0EC4 ; G 1616 +U 3782 ; WX 759 ; N uni0EC6 ; G 1617 +U 3784 ; WX 0 ; N uni0EC8 ; G 1618 +U 3785 ; WX 0 ; N uni0EC9 ; G 1619 +U 3786 ; WX 0 ; N uni0ECA ; G 1620 +U 3787 ; WX 0 ; N uni0ECB ; G 1621 +U 3788 ; WX 0 ; N uni0ECC ; G 1622 +U 3789 ; WX 0 ; N uni0ECD ; G 1623 +U 3792 ; WX 771 ; N uni0ED0 ; G 1624 +U 3793 ; WX 771 ; N uni0ED1 ; G 1625 +U 3794 ; WX 693 ; N uni0ED2 ; G 1626 +U 3795 ; WX 836 ; N uni0ED3 ; G 1627 +U 3796 ; WX 729 ; N uni0ED4 ; G 1628 +U 3797 ; WX 729 ; N uni0ED5 ; G 1629 +U 3798 ; WX 849 ; N uni0ED6 ; G 1630 +U 3799 ; WX 790 ; N uni0ED7 ; G 1631 +U 3800 ; WX 759 ; N uni0ED8 ; G 1632 +U 3801 ; WX 910 ; N uni0ED9 ; G 1633 +U 3804 ; WX 1363 ; N uni0EDC ; G 1634 +U 3805 ; WX 1363 ; N uni0EDD ; G 1635 +U 4256 ; WX 874 ; N uni10A0 ; G 1636 +U 4257 ; WX 733 ; N uni10A1 ; G 1637 +U 4258 ; WX 679 ; N uni10A2 ; G 1638 +U 4259 ; WX 834 ; N uni10A3 ; G 1639 +U 4260 ; WX 615 ; N uni10A4 ; G 1640 +U 4261 ; WX 768 ; N uni10A5 ; G 1641 +U 4262 ; WX 753 ; N uni10A6 ; G 1642 +U 4263 ; WX 914 ; N uni10A7 ; G 1643 +U 4264 ; WX 453 ; N uni10A8 ; G 1644 +U 4265 ; WX 620 ; N uni10A9 ; G 1645 +U 4266 ; WX 843 ; N uni10AA ; G 1646 +U 4267 ; WX 882 ; N uni10AB ; G 1647 +U 4268 ; WX 625 ; N uni10AC ; G 1648 +U 4269 ; WX 854 ; N uni10AD ; G 1649 +U 4270 ; WX 781 ; N uni10AE ; G 1650 +U 4271 ; WX 629 ; N uni10AF ; G 1651 +U 4272 ; WX 912 ; N uni10B0 ; G 1652 +U 4273 ; WX 621 ; N uni10B1 ; G 1653 +U 4274 ; WX 620 ; N uni10B2 ; G 1654 +U 4275 ; WX 854 ; N uni10B3 ; G 1655 +U 4276 ; WX 866 ; N uni10B4 ; G 1656 +U 4277 ; WX 724 ; N uni10B5 ; G 1657 +U 4278 ; WX 630 ; N uni10B6 ; G 1658 +U 4279 ; WX 621 ; N uni10B7 ; G 1659 +U 4280 ; WX 625 ; N uni10B8 ; G 1660 +U 4281 ; WX 620 ; N uni10B9 ; G 1661 +U 4282 ; WX 818 ; N uni10BA ; G 1662 +U 4283 ; WX 874 ; N uni10BB ; G 1663 +U 4284 ; WX 615 ; N uni10BC ; G 1664 +U 4285 ; WX 623 ; N uni10BD ; G 1665 +U 4286 ; WX 625 ; N uni10BE ; G 1666 +U 4287 ; WX 725 ; N uni10BF ; G 1667 +U 4288 ; WX 844 ; N uni10C0 ; G 1668 +U 4289 ; WX 596 ; N uni10C1 ; G 1669 +U 4290 ; WX 688 ; N uni10C2 ; G 1670 +U 4291 ; WX 596 ; N uni10C3 ; G 1671 +U 4292 ; WX 594 ; N uni10C4 ; G 1672 +U 4293 ; WX 738 ; N uni10C5 ; G 1673 +U 4304 ; WX 554 ; N uni10D0 ; G 1674 +U 4305 ; WX 563 ; N uni10D1 ; G 1675 +U 4306 ; WX 622 ; N uni10D2 ; G 1676 +U 4307 ; WX 834 ; N uni10D3 ; G 1677 +U 4308 ; WX 555 ; N uni10D4 ; G 1678 +U 4309 ; WX 564 ; N uni10D5 ; G 1679 +U 4310 ; WX 551 ; N uni10D6 ; G 1680 +U 4311 ; WX 828 ; N uni10D7 ; G 1681 +U 4312 ; WX 563 ; N uni10D8 ; G 1682 +U 4313 ; WX 556 ; N uni10D9 ; G 1683 +U 4314 ; WX 1074 ; N uni10DA ; G 1684 +U 4315 ; WX 568 ; N uni10DB ; G 1685 +U 4316 ; WX 568 ; N uni10DC ; G 1686 +U 4317 ; WX 814 ; N uni10DD ; G 1687 +U 4318 ; WX 554 ; N uni10DE ; G 1688 +U 4319 ; WX 563 ; N uni10DF ; G 1689 +U 4320 ; WX 823 ; N uni10E0 ; G 1690 +U 4321 ; WX 568 ; N uni10E1 ; G 1691 +U 4322 ; WX 700 ; N uni10E2 ; G 1692 +U 4323 ; WX 591 ; N uni10E3 ; G 1693 +U 4324 ; WX 852 ; N uni10E4 ; G 1694 +U 4325 ; WX 560 ; N uni10E5 ; G 1695 +U 4326 ; WX 814 ; N uni10E6 ; G 1696 +U 4327 ; WX 563 ; N uni10E7 ; G 1697 +U 4328 ; WX 553 ; N uni10E8 ; G 1698 +U 4329 ; WX 568 ; N uni10E9 ; G 1699 +U 4330 ; WX 622 ; N uni10EA ; G 1700 +U 4331 ; WX 568 ; N uni10EB ; G 1701 +U 4332 ; WX 553 ; N uni10EC ; G 1702 +U 4333 ; WX 566 ; N uni10ED ; G 1703 +U 4334 ; WX 568 ; N uni10EE ; G 1704 +U 4335 ; WX 540 ; N uni10EF ; G 1705 +U 4336 ; WX 554 ; N uni10F0 ; G 1706 +U 4337 ; WX 559 ; N uni10F1 ; G 1707 +U 4338 ; WX 553 ; N uni10F2 ; G 1708 +U 4339 ; WX 554 ; N uni10F3 ; G 1709 +U 4340 ; WX 553 ; N uni10F4 ; G 1710 +U 4341 ; WX 587 ; N uni10F5 ; G 1711 +U 4342 ; WX 853 ; N uni10F6 ; G 1712 +U 4343 ; WX 604 ; N uni10F7 ; G 1713 +U 4344 ; WX 563 ; N uni10F8 ; G 1714 +U 4345 ; WX 622 ; N uni10F9 ; G 1715 +U 4346 ; WX 554 ; N uni10FA ; G 1716 +U 4347 ; WX 448 ; N uni10FB ; G 1717 +U 4348 ; WX 324 ; N uni10FC ; G 1718 +U 5121 ; WX 774 ; N uni1401 ; G 1719 +U 5122 ; WX 774 ; N uni1402 ; G 1720 +U 5123 ; WX 774 ; N uni1403 ; G 1721 +U 5124 ; WX 774 ; N uni1404 ; G 1722 +U 5125 ; WX 905 ; N uni1405 ; G 1723 +U 5126 ; WX 905 ; N uni1406 ; G 1724 +U 5127 ; WX 905 ; N uni1407 ; G 1725 +U 5129 ; WX 905 ; N uni1409 ; G 1726 +U 5130 ; WX 905 ; N uni140A ; G 1727 +U 5131 ; WX 905 ; N uni140B ; G 1728 +U 5132 ; WX 1018 ; N uni140C ; G 1729 +U 5133 ; WX 1009 ; N uni140D ; G 1730 +U 5134 ; WX 1018 ; N uni140E ; G 1731 +U 5135 ; WX 1009 ; N uni140F ; G 1732 +U 5136 ; WX 1018 ; N uni1410 ; G 1733 +U 5137 ; WX 1009 ; N uni1411 ; G 1734 +U 5138 ; WX 1149 ; N uni1412 ; G 1735 +U 5139 ; WX 1140 ; N uni1413 ; G 1736 +U 5140 ; WX 1149 ; N uni1414 ; G 1737 +U 5141 ; WX 1140 ; N uni1415 ; G 1738 +U 5142 ; WX 905 ; N uni1416 ; G 1739 +U 5143 ; WX 1149 ; N uni1417 ; G 1740 +U 5144 ; WX 1142 ; N uni1418 ; G 1741 +U 5145 ; WX 1149 ; N uni1419 ; G 1742 +U 5146 ; WX 1142 ; N uni141A ; G 1743 +U 5147 ; WX 905 ; N uni141B ; G 1744 +U 5149 ; WX 310 ; N uni141D ; G 1745 +U 5150 ; WX 529 ; N uni141E ; G 1746 +U 5151 ; WX 425 ; N uni141F ; G 1747 +U 5152 ; WX 425 ; N uni1420 ; G 1748 +U 5153 ; WX 395 ; N uni1421 ; G 1749 +U 5154 ; WX 395 ; N uni1422 ; G 1750 +U 5155 ; WX 395 ; N uni1423 ; G 1751 +U 5156 ; WX 395 ; N uni1424 ; G 1752 +U 5157 ; WX 564 ; N uni1425 ; G 1753 +U 5158 ; WX 470 ; N uni1426 ; G 1754 +U 5159 ; WX 310 ; N uni1427 ; G 1755 +U 5160 ; WX 395 ; N uni1428 ; G 1756 +U 5161 ; WX 395 ; N uni1429 ; G 1757 +U 5162 ; WX 395 ; N uni142A ; G 1758 +U 5163 ; WX 1213 ; N uni142B ; G 1759 +U 5164 ; WX 986 ; N uni142C ; G 1760 +U 5165 ; WX 1216 ; N uni142D ; G 1761 +U 5166 ; WX 1297 ; N uni142E ; G 1762 +U 5167 ; WX 774 ; N uni142F ; G 1763 +U 5168 ; WX 774 ; N uni1430 ; G 1764 +U 5169 ; WX 774 ; N uni1431 ; G 1765 +U 5170 ; WX 774 ; N uni1432 ; G 1766 +U 5171 ; WX 886 ; N uni1433 ; G 1767 +U 5172 ; WX 886 ; N uni1434 ; G 1768 +U 5173 ; WX 886 ; N uni1435 ; G 1769 +U 5175 ; WX 886 ; N uni1437 ; G 1770 +U 5176 ; WX 886 ; N uni1438 ; G 1771 +U 5177 ; WX 886 ; N uni1439 ; G 1772 +U 5178 ; WX 1018 ; N uni143A ; G 1773 +U 5179 ; WX 1009 ; N uni143B ; G 1774 +U 5180 ; WX 1018 ; N uni143C ; G 1775 +U 5181 ; WX 1009 ; N uni143D ; G 1776 +U 5182 ; WX 1018 ; N uni143E ; G 1777 +U 5183 ; WX 1009 ; N uni143F ; G 1778 +U 5184 ; WX 1149 ; N uni1440 ; G 1779 +U 5185 ; WX 1140 ; N uni1441 ; G 1780 +U 5186 ; WX 1149 ; N uni1442 ; G 1781 +U 5187 ; WX 1140 ; N uni1443 ; G 1782 +U 5188 ; WX 1149 ; N uni1444 ; G 1783 +U 5189 ; WX 1142 ; N uni1445 ; G 1784 +U 5190 ; WX 1149 ; N uni1446 ; G 1785 +U 5191 ; WX 1142 ; N uni1447 ; G 1786 +U 5192 ; WX 886 ; N uni1448 ; G 1787 +U 5193 ; WX 576 ; N uni1449 ; G 1788 +U 5194 ; WX 229 ; N uni144A ; G 1789 +U 5196 ; WX 812 ; N uni144C ; G 1790 +U 5197 ; WX 812 ; N uni144D ; G 1791 +U 5198 ; WX 812 ; N uni144E ; G 1792 +U 5199 ; WX 812 ; N uni144F ; G 1793 +U 5200 ; WX 815 ; N uni1450 ; G 1794 +U 5201 ; WX 815 ; N uni1451 ; G 1795 +U 5202 ; WX 815 ; N uni1452 ; G 1796 +U 5204 ; WX 815 ; N uni1454 ; G 1797 +U 5205 ; WX 815 ; N uni1455 ; G 1798 +U 5206 ; WX 815 ; N uni1456 ; G 1799 +U 5207 ; WX 1056 ; N uni1457 ; G 1800 +U 5208 ; WX 1048 ; N uni1458 ; G 1801 +U 5209 ; WX 1056 ; N uni1459 ; G 1802 +U 5210 ; WX 1048 ; N uni145A ; G 1803 +U 5211 ; WX 1056 ; N uni145B ; G 1804 +U 5212 ; WX 1048 ; N uni145C ; G 1805 +U 5213 ; WX 1060 ; N uni145D ; G 1806 +U 5214 ; WX 1054 ; N uni145E ; G 1807 +U 5215 ; WX 1060 ; N uni145F ; G 1808 +U 5216 ; WX 1054 ; N uni1460 ; G 1809 +U 5217 ; WX 1060 ; N uni1461 ; G 1810 +U 5218 ; WX 1052 ; N uni1462 ; G 1811 +U 5219 ; WX 1060 ; N uni1463 ; G 1812 +U 5220 ; WX 1052 ; N uni1464 ; G 1813 +U 5221 ; WX 1060 ; N uni1465 ; G 1814 +U 5222 ; WX 483 ; N uni1466 ; G 1815 +U 5223 ; WX 1005 ; N uni1467 ; G 1816 +U 5224 ; WX 1005 ; N uni1468 ; G 1817 +U 5225 ; WX 1023 ; N uni1469 ; G 1818 +U 5226 ; WX 1017 ; N uni146A ; G 1819 +U 5227 ; WX 743 ; N uni146B ; G 1820 +U 5228 ; WX 743 ; N uni146C ; G 1821 +U 5229 ; WX 743 ; N uni146D ; G 1822 +U 5230 ; WX 743 ; N uni146E ; G 1823 +U 5231 ; WX 743 ; N uni146F ; G 1824 +U 5232 ; WX 743 ; N uni1470 ; G 1825 +U 5233 ; WX 743 ; N uni1471 ; G 1826 +U 5234 ; WX 743 ; N uni1472 ; G 1827 +U 5235 ; WX 743 ; N uni1473 ; G 1828 +U 5236 ; WX 1029 ; N uni1474 ; G 1829 +U 5237 ; WX 975 ; N uni1475 ; G 1830 +U 5238 ; WX 980 ; N uni1476 ; G 1831 +U 5239 ; WX 975 ; N uni1477 ; G 1832 +U 5240 ; WX 980 ; N uni1478 ; G 1833 +U 5241 ; WX 975 ; N uni1479 ; G 1834 +U 5242 ; WX 1029 ; N uni147A ; G 1835 +U 5243 ; WX 975 ; N uni147B ; G 1836 +U 5244 ; WX 1029 ; N uni147C ; G 1837 +U 5245 ; WX 975 ; N uni147D ; G 1838 +U 5246 ; WX 980 ; N uni147E ; G 1839 +U 5247 ; WX 975 ; N uni147F ; G 1840 +U 5248 ; WX 980 ; N uni1480 ; G 1841 +U 5249 ; WX 975 ; N uni1481 ; G 1842 +U 5250 ; WX 980 ; N uni1482 ; G 1843 +U 5251 ; WX 501 ; N uni1483 ; G 1844 +U 5252 ; WX 501 ; N uni1484 ; G 1845 +U 5253 ; WX 938 ; N uni1485 ; G 1846 +U 5254 ; WX 938 ; N uni1486 ; G 1847 +U 5255 ; WX 938 ; N uni1487 ; G 1848 +U 5256 ; WX 938 ; N uni1488 ; G 1849 +U 5257 ; WX 743 ; N uni1489 ; G 1850 +U 5258 ; WX 743 ; N uni148A ; G 1851 +U 5259 ; WX 743 ; N uni148B ; G 1852 +U 5260 ; WX 743 ; N uni148C ; G 1853 +U 5261 ; WX 743 ; N uni148D ; G 1854 +U 5262 ; WX 743 ; N uni148E ; G 1855 +U 5263 ; WX 743 ; N uni148F ; G 1856 +U 5264 ; WX 743 ; N uni1490 ; G 1857 +U 5265 ; WX 743 ; N uni1491 ; G 1858 +U 5266 ; WX 1029 ; N uni1492 ; G 1859 +U 5267 ; WX 975 ; N uni1493 ; G 1860 +U 5268 ; WX 1029 ; N uni1494 ; G 1861 +U 5269 ; WX 975 ; N uni1495 ; G 1862 +U 5270 ; WX 1029 ; N uni1496 ; G 1863 +U 5271 ; WX 975 ; N uni1497 ; G 1864 +U 5272 ; WX 1029 ; N uni1498 ; G 1865 +U 5273 ; WX 975 ; N uni1499 ; G 1866 +U 5274 ; WX 1029 ; N uni149A ; G 1867 +U 5275 ; WX 975 ; N uni149B ; G 1868 +U 5276 ; WX 1029 ; N uni149C ; G 1869 +U 5277 ; WX 975 ; N uni149D ; G 1870 +U 5278 ; WX 1029 ; N uni149E ; G 1871 +U 5279 ; WX 975 ; N uni149F ; G 1872 +U 5280 ; WX 1029 ; N uni14A0 ; G 1873 +U 5281 ; WX 501 ; N uni14A1 ; G 1874 +U 5282 ; WX 501 ; N uni14A2 ; G 1875 +U 5283 ; WX 626 ; N uni14A3 ; G 1876 +U 5284 ; WX 626 ; N uni14A4 ; G 1877 +U 5285 ; WX 626 ; N uni14A5 ; G 1878 +U 5286 ; WX 626 ; N uni14A6 ; G 1879 +U 5287 ; WX 626 ; N uni14A7 ; G 1880 +U 5288 ; WX 626 ; N uni14A8 ; G 1881 +U 5289 ; WX 626 ; N uni14A9 ; G 1882 +U 5290 ; WX 626 ; N uni14AA ; G 1883 +U 5291 ; WX 626 ; N uni14AB ; G 1884 +U 5292 ; WX 881 ; N uni14AC ; G 1885 +U 5293 ; WX 854 ; N uni14AD ; G 1886 +U 5294 ; WX 863 ; N uni14AE ; G 1887 +U 5295 ; WX 874 ; N uni14AF ; G 1888 +U 5296 ; WX 863 ; N uni14B0 ; G 1889 +U 5297 ; WX 874 ; N uni14B1 ; G 1890 +U 5298 ; WX 881 ; N uni14B2 ; G 1891 +U 5299 ; WX 874 ; N uni14B3 ; G 1892 +U 5300 ; WX 881 ; N uni14B4 ; G 1893 +U 5301 ; WX 874 ; N uni14B5 ; G 1894 +U 5302 ; WX 863 ; N uni14B6 ; G 1895 +U 5303 ; WX 874 ; N uni14B7 ; G 1896 +U 5304 ; WX 863 ; N uni14B8 ; G 1897 +U 5305 ; WX 874 ; N uni14B9 ; G 1898 +U 5306 ; WX 863 ; N uni14BA ; G 1899 +U 5307 ; WX 436 ; N uni14BB ; G 1900 +U 5308 ; WX 548 ; N uni14BC ; G 1901 +U 5309 ; WX 436 ; N uni14BD ; G 1902 +U 5312 ; WX 988 ; N uni14C0 ; G 1903 +U 5313 ; WX 988 ; N uni14C1 ; G 1904 +U 5314 ; WX 988 ; N uni14C2 ; G 1905 +U 5315 ; WX 988 ; N uni14C3 ; G 1906 +U 5316 ; WX 931 ; N uni14C4 ; G 1907 +U 5317 ; WX 931 ; N uni14C5 ; G 1908 +U 5318 ; WX 931 ; N uni14C6 ; G 1909 +U 5319 ; WX 931 ; N uni14C7 ; G 1910 +U 5320 ; WX 931 ; N uni14C8 ; G 1911 +U 5321 ; WX 1238 ; N uni14C9 ; G 1912 +U 5322 ; WX 1247 ; N uni14CA ; G 1913 +U 5323 ; WX 1200 ; N uni14CB ; G 1914 +U 5324 ; WX 1228 ; N uni14CC ; G 1915 +U 5325 ; WX 1200 ; N uni14CD ; G 1916 +U 5326 ; WX 1228 ; N uni14CE ; G 1917 +U 5327 ; WX 931 ; N uni14CF ; G 1918 +U 5328 ; WX 660 ; N uni14D0 ; G 1919 +U 5329 ; WX 497 ; N uni14D1 ; G 1920 +U 5330 ; WX 660 ; N uni14D2 ; G 1921 +U 5331 ; WX 988 ; N uni14D3 ; G 1922 +U 5332 ; WX 988 ; N uni14D4 ; G 1923 +U 5333 ; WX 988 ; N uni14D5 ; G 1924 +U 5334 ; WX 988 ; N uni14D6 ; G 1925 +U 5335 ; WX 931 ; N uni14D7 ; G 1926 +U 5336 ; WX 931 ; N uni14D8 ; G 1927 +U 5337 ; WX 931 ; N uni14D9 ; G 1928 +U 5338 ; WX 931 ; N uni14DA ; G 1929 +U 5339 ; WX 931 ; N uni14DB ; G 1930 +U 5340 ; WX 1231 ; N uni14DC ; G 1931 +U 5341 ; WX 1247 ; N uni14DD ; G 1932 +U 5342 ; WX 1283 ; N uni14DE ; G 1933 +U 5343 ; WX 1228 ; N uni14DF ; G 1934 +U 5344 ; WX 1283 ; N uni14E0 ; G 1935 +U 5345 ; WX 1228 ; N uni14E1 ; G 1936 +U 5346 ; WX 1228 ; N uni14E2 ; G 1937 +U 5347 ; WX 1214 ; N uni14E3 ; G 1938 +U 5348 ; WX 1228 ; N uni14E4 ; G 1939 +U 5349 ; WX 1214 ; N uni14E5 ; G 1940 +U 5350 ; WX 1283 ; N uni14E6 ; G 1941 +U 5351 ; WX 1228 ; N uni14E7 ; G 1942 +U 5352 ; WX 1283 ; N uni14E8 ; G 1943 +U 5353 ; WX 1228 ; N uni14E9 ; G 1944 +U 5354 ; WX 660 ; N uni14EA ; G 1945 +U 5356 ; WX 886 ; N uni14EC ; G 1946 +U 5357 ; WX 730 ; N uni14ED ; G 1947 +U 5358 ; WX 730 ; N uni14EE ; G 1948 +U 5359 ; WX 730 ; N uni14EF ; G 1949 +U 5360 ; WX 730 ; N uni14F0 ; G 1950 +U 5361 ; WX 730 ; N uni14F1 ; G 1951 +U 5362 ; WX 730 ; N uni14F2 ; G 1952 +U 5363 ; WX 730 ; N uni14F3 ; G 1953 +U 5364 ; WX 730 ; N uni14F4 ; G 1954 +U 5365 ; WX 730 ; N uni14F5 ; G 1955 +U 5366 ; WX 998 ; N uni14F6 ; G 1956 +U 5367 ; WX 958 ; N uni14F7 ; G 1957 +U 5368 ; WX 967 ; N uni14F8 ; G 1958 +U 5369 ; WX 989 ; N uni14F9 ; G 1959 +U 5370 ; WX 967 ; N uni14FA ; G 1960 +U 5371 ; WX 989 ; N uni14FB ; G 1961 +U 5372 ; WX 998 ; N uni14FC ; G 1962 +U 5373 ; WX 958 ; N uni14FD ; G 1963 +U 5374 ; WX 998 ; N uni14FE ; G 1964 +U 5375 ; WX 958 ; N uni14FF ; G 1965 +U 5376 ; WX 967 ; N uni1500 ; G 1966 +U 5377 ; WX 989 ; N uni1501 ; G 1967 +U 5378 ; WX 967 ; N uni1502 ; G 1968 +U 5379 ; WX 989 ; N uni1503 ; G 1969 +U 5380 ; WX 967 ; N uni1504 ; G 1970 +U 5381 ; WX 493 ; N uni1505 ; G 1971 +U 5382 ; WX 460 ; N uni1506 ; G 1972 +U 5383 ; WX 493 ; N uni1507 ; G 1973 +U 5392 ; WX 923 ; N uni1510 ; G 1974 +U 5393 ; WX 923 ; N uni1511 ; G 1975 +U 5394 ; WX 923 ; N uni1512 ; G 1976 +U 5395 ; WX 1136 ; N uni1513 ; G 1977 +U 5396 ; WX 1136 ; N uni1514 ; G 1978 +U 5397 ; WX 1136 ; N uni1515 ; G 1979 +U 5398 ; WX 1136 ; N uni1516 ; G 1980 +U 5399 ; WX 1209 ; N uni1517 ; G 1981 +U 5400 ; WX 1202 ; N uni1518 ; G 1982 +U 5401 ; WX 1209 ; N uni1519 ; G 1983 +U 5402 ; WX 1202 ; N uni151A ; G 1984 +U 5403 ; WX 1209 ; N uni151B ; G 1985 +U 5404 ; WX 1202 ; N uni151C ; G 1986 +U 5405 ; WX 1431 ; N uni151D ; G 1987 +U 5406 ; WX 1420 ; N uni151E ; G 1988 +U 5407 ; WX 1431 ; N uni151F ; G 1989 +U 5408 ; WX 1420 ; N uni1520 ; G 1990 +U 5409 ; WX 1431 ; N uni1521 ; G 1991 +U 5410 ; WX 1420 ; N uni1522 ; G 1992 +U 5411 ; WX 1431 ; N uni1523 ; G 1993 +U 5412 ; WX 1420 ; N uni1524 ; G 1994 +U 5413 ; WX 746 ; N uni1525 ; G 1995 +U 5414 ; WX 776 ; N uni1526 ; G 1996 +U 5415 ; WX 776 ; N uni1527 ; G 1997 +U 5416 ; WX 776 ; N uni1528 ; G 1998 +U 5417 ; WX 776 ; N uni1529 ; G 1999 +U 5418 ; WX 776 ; N uni152A ; G 2000 +U 5419 ; WX 776 ; N uni152B ; G 2001 +U 5420 ; WX 776 ; N uni152C ; G 2002 +U 5421 ; WX 776 ; N uni152D ; G 2003 +U 5422 ; WX 776 ; N uni152E ; G 2004 +U 5423 ; WX 1003 ; N uni152F ; G 2005 +U 5424 ; WX 1003 ; N uni1530 ; G 2006 +U 5425 ; WX 1013 ; N uni1531 ; G 2007 +U 5426 ; WX 996 ; N uni1532 ; G 2008 +U 5427 ; WX 1013 ; N uni1533 ; G 2009 +U 5428 ; WX 996 ; N uni1534 ; G 2010 +U 5429 ; WX 1003 ; N uni1535 ; G 2011 +U 5430 ; WX 1003 ; N uni1536 ; G 2012 +U 5431 ; WX 1003 ; N uni1537 ; G 2013 +U 5432 ; WX 1003 ; N uni1538 ; G 2014 +U 5433 ; WX 1013 ; N uni1539 ; G 2015 +U 5434 ; WX 996 ; N uni153A ; G 2016 +U 5435 ; WX 1013 ; N uni153B ; G 2017 +U 5436 ; WX 996 ; N uni153C ; G 2018 +U 5437 ; WX 1013 ; N uni153D ; G 2019 +U 5438 ; WX 495 ; N uni153E ; G 2020 +U 5440 ; WX 395 ; N uni1540 ; G 2021 +U 5441 ; WX 510 ; N uni1541 ; G 2022 +U 5442 ; WX 1033 ; N uni1542 ; G 2023 +U 5443 ; WX 1033 ; N uni1543 ; G 2024 +U 5444 ; WX 976 ; N uni1544 ; G 2025 +U 5445 ; WX 976 ; N uni1545 ; G 2026 +U 5446 ; WX 976 ; N uni1546 ; G 2027 +U 5447 ; WX 976 ; N uni1547 ; G 2028 +U 5448 ; WX 733 ; N uni1548 ; G 2029 +U 5449 ; WX 733 ; N uni1549 ; G 2030 +U 5450 ; WX 733 ; N uni154A ; G 2031 +U 5451 ; WX 733 ; N uni154B ; G 2032 +U 5452 ; WX 733 ; N uni154C ; G 2033 +U 5453 ; WX 733 ; N uni154D ; G 2034 +U 5454 ; WX 1003 ; N uni154E ; G 2035 +U 5455 ; WX 959 ; N uni154F ; G 2036 +U 5456 ; WX 495 ; N uni1550 ; G 2037 +U 5458 ; WX 886 ; N uni1552 ; G 2038 +U 5459 ; WX 774 ; N uni1553 ; G 2039 +U 5460 ; WX 774 ; N uni1554 ; G 2040 +U 5461 ; WX 774 ; N uni1555 ; G 2041 +U 5462 ; WX 774 ; N uni1556 ; G 2042 +U 5463 ; WX 928 ; N uni1557 ; G 2043 +U 5464 ; WX 928 ; N uni1558 ; G 2044 +U 5465 ; WX 928 ; N uni1559 ; G 2045 +U 5466 ; WX 928 ; N uni155A ; G 2046 +U 5467 ; WX 1172 ; N uni155B ; G 2047 +U 5468 ; WX 1142 ; N uni155C ; G 2048 +U 5469 ; WX 602 ; N uni155D ; G 2049 +U 5470 ; WX 812 ; N uni155E ; G 2050 +U 5471 ; WX 812 ; N uni155F ; G 2051 +U 5472 ; WX 812 ; N uni1560 ; G 2052 +U 5473 ; WX 812 ; N uni1561 ; G 2053 +U 5474 ; WX 812 ; N uni1562 ; G 2054 +U 5475 ; WX 812 ; N uni1563 ; G 2055 +U 5476 ; WX 815 ; N uni1564 ; G 2056 +U 5477 ; WX 815 ; N uni1565 ; G 2057 +U 5478 ; WX 815 ; N uni1566 ; G 2058 +U 5479 ; WX 815 ; N uni1567 ; G 2059 +U 5480 ; WX 1060 ; N uni1568 ; G 2060 +U 5481 ; WX 1052 ; N uni1569 ; G 2061 +U 5482 ; WX 548 ; N uni156A ; G 2062 +U 5492 ; WX 977 ; N uni1574 ; G 2063 +U 5493 ; WX 977 ; N uni1575 ; G 2064 +U 5494 ; WX 977 ; N uni1576 ; G 2065 +U 5495 ; WX 977 ; N uni1577 ; G 2066 +U 5496 ; WX 977 ; N uni1578 ; G 2067 +U 5497 ; WX 977 ; N uni1579 ; G 2068 +U 5498 ; WX 977 ; N uni157A ; G 2069 +U 5499 ; WX 618 ; N uni157B ; G 2070 +U 5500 ; WX 837 ; N uni157C ; G 2071 +U 5501 ; WX 510 ; N uni157D ; G 2072 +U 5502 ; WX 1238 ; N uni157E ; G 2073 +U 5503 ; WX 1238 ; N uni157F ; G 2074 +U 5504 ; WX 1238 ; N uni1580 ; G 2075 +U 5505 ; WX 1238 ; N uni1581 ; G 2076 +U 5506 ; WX 1238 ; N uni1582 ; G 2077 +U 5507 ; WX 1238 ; N uni1583 ; G 2078 +U 5508 ; WX 1238 ; N uni1584 ; G 2079 +U 5509 ; WX 989 ; N uni1585 ; G 2080 +U 5514 ; WX 977 ; N uni158A ; G 2081 +U 5515 ; WX 977 ; N uni158B ; G 2082 +U 5516 ; WX 977 ; N uni158C ; G 2083 +U 5517 ; WX 977 ; N uni158D ; G 2084 +U 5518 ; WX 1591 ; N uni158E ; G 2085 +U 5519 ; WX 1591 ; N uni158F ; G 2086 +U 5520 ; WX 1591 ; N uni1590 ; G 2087 +U 5521 ; WX 1295 ; N uni1591 ; G 2088 +U 5522 ; WX 1295 ; N uni1592 ; G 2089 +U 5523 ; WX 1591 ; N uni1593 ; G 2090 +U 5524 ; WX 1591 ; N uni1594 ; G 2091 +U 5525 ; WX 848 ; N uni1595 ; G 2092 +U 5526 ; WX 1273 ; N uni1596 ; G 2093 +U 5536 ; WX 988 ; N uni15A0 ; G 2094 +U 5537 ; WX 988 ; N uni15A1 ; G 2095 +U 5538 ; WX 931 ; N uni15A2 ; G 2096 +U 5539 ; WX 931 ; N uni15A3 ; G 2097 +U 5540 ; WX 931 ; N uni15A4 ; G 2098 +U 5541 ; WX 931 ; N uni15A5 ; G 2099 +U 5542 ; WX 660 ; N uni15A6 ; G 2100 +U 5543 ; WX 776 ; N uni15A7 ; G 2101 +U 5544 ; WX 776 ; N uni15A8 ; G 2102 +U 5545 ; WX 776 ; N uni15A9 ; G 2103 +U 5546 ; WX 776 ; N uni15AA ; G 2104 +U 5547 ; WX 776 ; N uni15AB ; G 2105 +U 5548 ; WX 776 ; N uni15AC ; G 2106 +U 5549 ; WX 776 ; N uni15AD ; G 2107 +U 5550 ; WX 495 ; N uni15AE ; G 2108 +U 5551 ; WX 743 ; N uni15AF ; G 2109 +U 5598 ; WX 830 ; N uni15DE ; G 2110 +U 5601 ; WX 830 ; N uni15E1 ; G 2111 +U 5702 ; WX 496 ; N uni1646 ; G 2112 +U 5703 ; WX 496 ; N uni1647 ; G 2113 +U 5742 ; WX 413 ; N uni166E ; G 2114 +U 5743 ; WX 1238 ; N uni166F ; G 2115 +U 5744 ; WX 1591 ; N uni1670 ; G 2116 +U 5745 ; WX 2016 ; N uni1671 ; G 2117 +U 5746 ; WX 2016 ; N uni1672 ; G 2118 +U 5747 ; WX 1720 ; N uni1673 ; G 2119 +U 5748 ; WX 1678 ; N uni1674 ; G 2120 +U 5749 ; WX 2016 ; N uni1675 ; G 2121 +U 5750 ; WX 2016 ; N uni1676 ; G 2122 +U 5760 ; WX 543 ; N uni1680 ; G 2123 +U 5761 ; WX 637 ; N uni1681 ; G 2124 +U 5762 ; WX 945 ; N uni1682 ; G 2125 +U 5763 ; WX 1254 ; N uni1683 ; G 2126 +U 5764 ; WX 1563 ; N uni1684 ; G 2127 +U 5765 ; WX 1871 ; N uni1685 ; G 2128 +U 5766 ; WX 627 ; N uni1686 ; G 2129 +U 5767 ; WX 936 ; N uni1687 ; G 2130 +U 5768 ; WX 1254 ; N uni1688 ; G 2131 +U 5769 ; WX 1559 ; N uni1689 ; G 2132 +U 5770 ; WX 1871 ; N uni168A ; G 2133 +U 5771 ; WX 569 ; N uni168B ; G 2134 +U 5772 ; WX 877 ; N uni168C ; G 2135 +U 5773 ; WX 1187 ; N uni168D ; G 2136 +U 5774 ; WX 1497 ; N uni168E ; G 2137 +U 5775 ; WX 1807 ; N uni168F ; G 2138 +U 5776 ; WX 637 ; N uni1690 ; G 2139 +U 5777 ; WX 945 ; N uni1691 ; G 2140 +U 5778 ; WX 1240 ; N uni1692 ; G 2141 +U 5779 ; WX 1555 ; N uni1693 ; G 2142 +U 5780 ; WX 1871 ; N uni1694 ; G 2143 +U 5781 ; WX 569 ; N uni1695 ; G 2144 +U 5782 ; WX 569 ; N uni1696 ; G 2145 +U 5783 ; WX 789 ; N uni1697 ; G 2146 +U 5784 ; WX 1234 ; N uni1698 ; G 2147 +U 5785 ; WX 1559 ; N uni1699 ; G 2148 +U 5786 ; WX 740 ; N uni169A ; G 2149 +U 5787 ; WX 638 ; N uni169B ; G 2150 +U 5788 ; WX 638 ; N uni169C ; G 2151 +U 7424 ; WX 652 ; N uni1D00 ; G 2152 +U 7425 ; WX 833 ; N uni1D01 ; G 2153 +U 7426 ; WX 1048 ; N uni1D02 ; G 2154 +U 7427 ; WX 608 ; N uni1D03 ; G 2155 +U 7428 ; WX 593 ; N uni1D04 ; G 2156 +U 7429 ; WX 676 ; N uni1D05 ; G 2157 +U 7430 ; WX 676 ; N uni1D06 ; G 2158 +U 7431 ; WX 559 ; N uni1D07 ; G 2159 +U 7432 ; WX 557 ; N uni1D08 ; G 2160 +U 7433 ; WX 343 ; N uni1D09 ; G 2161 +U 7434 ; WX 494 ; N uni1D0A ; G 2162 +U 7435 ; WX 665 ; N uni1D0B ; G 2163 +U 7436 ; WX 539 ; N uni1D0C ; G 2164 +U 7437 ; WX 817 ; N uni1D0D ; G 2165 +U 7438 ; WX 701 ; N uni1D0E ; G 2166 +U 7439 ; WX 687 ; N uni1D0F ; G 2167 +U 7440 ; WX 593 ; N uni1D10 ; G 2168 +U 7441 ; WX 660 ; N uni1D11 ; G 2169 +U 7442 ; WX 660 ; N uni1D12 ; G 2170 +U 7443 ; WX 660 ; N uni1D13 ; G 2171 +U 7444 ; WX 1094 ; N uni1D14 ; G 2172 +U 7446 ; WX 687 ; N uni1D16 ; G 2173 +U 7447 ; WX 687 ; N uni1D17 ; G 2174 +U 7448 ; WX 556 ; N uni1D18 ; G 2175 +U 7449 ; WX 642 ; N uni1D19 ; G 2176 +U 7450 ; WX 642 ; N uni1D1A ; G 2177 +U 7451 ; WX 580 ; N uni1D1B ; G 2178 +U 7452 ; WX 634 ; N uni1D1C ; G 2179 +U 7453 ; WX 737 ; N uni1D1D ; G 2180 +U 7454 ; WX 948 ; N uni1D1E ; G 2181 +U 7455 ; WX 695 ; N uni1D1F ; G 2182 +U 7456 ; WX 652 ; N uni1D20 ; G 2183 +U 7457 ; WX 924 ; N uni1D21 ; G 2184 +U 7458 ; WX 582 ; N uni1D22 ; G 2185 +U 7459 ; WX 646 ; N uni1D23 ; G 2186 +U 7462 ; WX 539 ; N uni1D26 ; G 2187 +U 7463 ; WX 652 ; N uni1D27 ; G 2188 +U 7464 ; WX 691 ; N uni1D28 ; G 2189 +U 7465 ; WX 556 ; N uni1D29 ; G 2190 +U 7466 ; WX 781 ; N uni1D2A ; G 2191 +U 7467 ; WX 732 ; N uni1D2B ; G 2192 +U 7468 ; WX 487 ; N uni1D2C ; G 2193 +U 7469 ; WX 683 ; N uni1D2D ; G 2194 +U 7470 ; WX 480 ; N uni1D2E ; G 2195 +U 7472 ; WX 523 ; N uni1D30 ; G 2196 +U 7473 ; WX 430 ; N uni1D31 ; G 2197 +U 7474 ; WX 430 ; N uni1D32 ; G 2198 +U 7475 ; WX 517 ; N uni1D33 ; G 2199 +U 7476 ; WX 527 ; N uni1D34 ; G 2200 +U 7477 ; WX 234 ; N uni1D35 ; G 2201 +U 7478 ; WX 234 ; N uni1D36 ; G 2202 +U 7479 ; WX 488 ; N uni1D37 ; G 2203 +U 7480 ; WX 401 ; N uni1D38 ; G 2204 +U 7481 ; WX 626 ; N uni1D39 ; G 2205 +U 7482 ; WX 527 ; N uni1D3A ; G 2206 +U 7483 ; WX 527 ; N uni1D3B ; G 2207 +U 7484 ; WX 535 ; N uni1D3C ; G 2208 +U 7485 ; WX 509 ; N uni1D3D ; G 2209 +U 7486 ; WX 461 ; N uni1D3E ; G 2210 +U 7487 ; WX 485 ; N uni1D3F ; G 2211 +U 7488 ; WX 430 ; N uni1D40 ; G 2212 +U 7489 ; WX 511 ; N uni1D41 ; G 2213 +U 7490 ; WX 695 ; N uni1D42 ; G 2214 +U 7491 ; WX 458 ; N uni1D43 ; G 2215 +U 7492 ; WX 458 ; N uni1D44 ; G 2216 +U 7493 ; WX 479 ; N uni1D45 ; G 2217 +U 7494 ; WX 712 ; N uni1D46 ; G 2218 +U 7495 ; WX 479 ; N uni1D47 ; G 2219 +U 7496 ; WX 479 ; N uni1D48 ; G 2220 +U 7497 ; WX 479 ; N uni1D49 ; G 2221 +U 7498 ; WX 479 ; N uni1D4A ; G 2222 +U 7499 ; WX 386 ; N uni1D4B ; G 2223 +U 7500 ; WX 386 ; N uni1D4C ; G 2224 +U 7501 ; WX 479 ; N uni1D4D ; G 2225 +U 7502 ; WX 219 ; N uni1D4E ; G 2226 +U 7503 ; WX 487 ; N uni1D4F ; G 2227 +U 7504 ; WX 664 ; N uni1D50 ; G 2228 +U 7505 ; WX 456 ; N uni1D51 ; G 2229 +U 7506 ; WX 488 ; N uni1D52 ; G 2230 +U 7507 ; WX 414 ; N uni1D53 ; G 2231 +U 7508 ; WX 488 ; N uni1D54 ; G 2232 +U 7509 ; WX 488 ; N uni1D55 ; G 2233 +U 7510 ; WX 479 ; N uni1D56 ; G 2234 +U 7511 ; WX 388 ; N uni1D57 ; G 2235 +U 7512 ; WX 456 ; N uni1D58 ; G 2236 +U 7513 ; WX 462 ; N uni1D59 ; G 2237 +U 7514 ; WX 664 ; N uni1D5A ; G 2238 +U 7515 ; WX 501 ; N uni1D5B ; G 2239 +U 7517 ; WX 451 ; N uni1D5D ; G 2240 +U 7518 ; WX 429 ; N uni1D5E ; G 2241 +U 7519 ; WX 433 ; N uni1D5F ; G 2242 +U 7520 ; WX 493 ; N uni1D60 ; G 2243 +U 7521 ; WX 406 ; N uni1D61 ; G 2244 +U 7522 ; WX 219 ; N uni1D62 ; G 2245 +U 7523 ; WX 315 ; N uni1D63 ; G 2246 +U 7524 ; WX 456 ; N uni1D64 ; G 2247 +U 7525 ; WX 501 ; N uni1D65 ; G 2248 +U 7526 ; WX 451 ; N uni1D66 ; G 2249 +U 7527 ; WX 429 ; N uni1D67 ; G 2250 +U 7528 ; WX 451 ; N uni1D68 ; G 2251 +U 7529 ; WX 493 ; N uni1D69 ; G 2252 +U 7530 ; WX 406 ; N uni1D6A ; G 2253 +U 7543 ; WX 716 ; N uni1D77 ; G 2254 +U 7544 ; WX 527 ; N uni1D78 ; G 2255 +U 7547 ; WX 545 ; N uni1D7B ; G 2256 +U 7549 ; WX 747 ; N uni1D7D ; G 2257 +U 7557 ; WX 514 ; N uni1D85 ; G 2258 +U 7579 ; WX 479 ; N uni1D9B ; G 2259 +U 7580 ; WX 414 ; N uni1D9C ; G 2260 +U 7581 ; WX 414 ; N uni1D9D ; G 2261 +U 7582 ; WX 488 ; N uni1D9E ; G 2262 +U 7583 ; WX 386 ; N uni1D9F ; G 2263 +U 7584 ; WX 377 ; N uni1DA0 ; G 2264 +U 7585 ; WX 348 ; N uni1DA1 ; G 2265 +U 7586 ; WX 479 ; N uni1DA2 ; G 2266 +U 7587 ; WX 456 ; N uni1DA3 ; G 2267 +U 7588 ; WX 347 ; N uni1DA4 ; G 2268 +U 7589 ; WX 281 ; N uni1DA5 ; G 2269 +U 7590 ; WX 347 ; N uni1DA6 ; G 2270 +U 7591 ; WX 347 ; N uni1DA7 ; G 2271 +U 7592 ; WX 431 ; N uni1DA8 ; G 2272 +U 7593 ; WX 326 ; N uni1DA9 ; G 2273 +U 7594 ; WX 330 ; N uni1DAA ; G 2274 +U 7595 ; WX 370 ; N uni1DAB ; G 2275 +U 7596 ; WX 664 ; N uni1DAC ; G 2276 +U 7597 ; WX 664 ; N uni1DAD ; G 2277 +U 7598 ; WX 562 ; N uni1DAE ; G 2278 +U 7599 ; WX 562 ; N uni1DAF ; G 2279 +U 7600 ; WX 448 ; N uni1DB0 ; G 2280 +U 7601 ; WX 488 ; N uni1DB1 ; G 2281 +U 7602 ; WX 542 ; N uni1DB2 ; G 2282 +U 7603 ; WX 422 ; N uni1DB3 ; G 2283 +U 7604 ; WX 396 ; N uni1DB4 ; G 2284 +U 7605 ; WX 388 ; N uni1DB5 ; G 2285 +U 7606 ; WX 583 ; N uni1DB6 ; G 2286 +U 7607 ; WX 494 ; N uni1DB7 ; G 2287 +U 7608 ; WX 399 ; N uni1DB8 ; G 2288 +U 7609 ; WX 451 ; N uni1DB9 ; G 2289 +U 7610 ; WX 501 ; N uni1DBA ; G 2290 +U 7611 ; WX 417 ; N uni1DBB ; G 2291 +U 7612 ; WX 523 ; N uni1DBC ; G 2292 +U 7613 ; WX 470 ; N uni1DBD ; G 2293 +U 7614 ; WX 455 ; N uni1DBE ; G 2294 +U 7615 ; WX 425 ; N uni1DBF ; G 2295 +U 7620 ; WX 0 ; N uni1DC4 ; G 2296 +U 7621 ; WX 0 ; N uni1DC5 ; G 2297 +U 7622 ; WX 0 ; N uni1DC6 ; G 2298 +U 7623 ; WX 0 ; N uni1DC7 ; G 2299 +U 7624 ; WX 0 ; N uni1DC8 ; G 2300 +U 7625 ; WX 0 ; N uni1DC9 ; G 2301 +U 7680 ; WX 774 ; N uni1E00 ; G 2302 +U 7681 ; WX 675 ; N uni1E01 ; G 2303 +U 7682 ; WX 762 ; N uni1E02 ; G 2304 +U 7683 ; WX 716 ; N uni1E03 ; G 2305 +U 7684 ; WX 762 ; N uni1E04 ; G 2306 +U 7685 ; WX 716 ; N uni1E05 ; G 2307 +U 7686 ; WX 762 ; N uni1E06 ; G 2308 +U 7687 ; WX 716 ; N uni1E07 ; G 2309 +U 7688 ; WX 734 ; N uni1E08 ; G 2310 +U 7689 ; WX 593 ; N uni1E09 ; G 2311 +U 7690 ; WX 830 ; N uni1E0A ; G 2312 +U 7691 ; WX 716 ; N uni1E0B ; G 2313 +U 7692 ; WX 830 ; N uni1E0C ; G 2314 +U 7693 ; WX 716 ; N uni1E0D ; G 2315 +U 7694 ; WX 830 ; N uni1E0E ; G 2316 +U 7695 ; WX 716 ; N uni1E0F ; G 2317 +U 7696 ; WX 830 ; N uni1E10 ; G 2318 +U 7697 ; WX 716 ; N uni1E11 ; G 2319 +U 7698 ; WX 830 ; N uni1E12 ; G 2320 +U 7699 ; WX 716 ; N uni1E13 ; G 2321 +U 7700 ; WX 683 ; N uni1E14 ; G 2322 +U 7701 ; WX 678 ; N uni1E15 ; G 2323 +U 7702 ; WX 683 ; N uni1E16 ; G 2324 +U 7703 ; WX 678 ; N uni1E17 ; G 2325 +U 7704 ; WX 683 ; N uni1E18 ; G 2326 +U 7705 ; WX 678 ; N uni1E19 ; G 2327 +U 7706 ; WX 683 ; N uni1E1A ; G 2328 +U 7707 ; WX 678 ; N uni1E1B ; G 2329 +U 7708 ; WX 683 ; N uni1E1C ; G 2330 +U 7709 ; WX 678 ; N uni1E1D ; G 2331 +U 7710 ; WX 683 ; N uni1E1E ; G 2332 +U 7711 ; WX 435 ; N uni1E1F ; G 2333 +U 7712 ; WX 821 ; N uni1E20 ; G 2334 +U 7713 ; WX 716 ; N uni1E21 ; G 2335 +U 7714 ; WX 837 ; N uni1E22 ; G 2336 +U 7715 ; WX 712 ; N uni1E23 ; G 2337 +U 7716 ; WX 837 ; N uni1E24 ; G 2338 +U 7717 ; WX 712 ; N uni1E25 ; G 2339 +U 7718 ; WX 837 ; N uni1E26 ; G 2340 +U 7719 ; WX 712 ; N uni1E27 ; G 2341 +U 7720 ; WX 837 ; N uni1E28 ; G 2342 +U 7721 ; WX 712 ; N uni1E29 ; G 2343 +U 7722 ; WX 837 ; N uni1E2A ; G 2344 +U 7723 ; WX 712 ; N uni1E2B ; G 2345 +U 7724 ; WX 372 ; N uni1E2C ; G 2346 +U 7725 ; WX 343 ; N uni1E2D ; G 2347 +U 7726 ; WX 372 ; N uni1E2E ; G 2348 +U 7727 ; WX 343 ; N uni1E2F ; G 2349 +U 7728 ; WX 775 ; N uni1E30 ; G 2350 +U 7729 ; WX 665 ; N uni1E31 ; G 2351 +U 7730 ; WX 775 ; N uni1E32 ; G 2352 +U 7731 ; WX 665 ; N uni1E33 ; G 2353 +U 7732 ; WX 775 ; N uni1E34 ; G 2354 +U 7733 ; WX 665 ; N uni1E35 ; G 2355 +U 7734 ; WX 637 ; N uni1E36 ; G 2356 +U 7735 ; WX 343 ; N uni1E37 ; G 2357 +U 7736 ; WX 637 ; N uni1E38 ; G 2358 +U 7737 ; WX 343 ; N uni1E39 ; G 2359 +U 7738 ; WX 637 ; N uni1E3A ; G 2360 +U 7739 ; WX 343 ; N uni1E3B ; G 2361 +U 7740 ; WX 637 ; N uni1E3C ; G 2362 +U 7741 ; WX 343 ; N uni1E3D ; G 2363 +U 7742 ; WX 995 ; N uni1E3E ; G 2364 +U 7743 ; WX 1042 ; N uni1E3F ; G 2365 +U 7744 ; WX 995 ; N uni1E40 ; G 2366 +U 7745 ; WX 1042 ; N uni1E41 ; G 2367 +U 7746 ; WX 995 ; N uni1E42 ; G 2368 +U 7747 ; WX 1042 ; N uni1E43 ; G 2369 +U 7748 ; WX 837 ; N uni1E44 ; G 2370 +U 7749 ; WX 712 ; N uni1E45 ; G 2371 +U 7750 ; WX 837 ; N uni1E46 ; G 2372 +U 7751 ; WX 712 ; N uni1E47 ; G 2373 +U 7752 ; WX 837 ; N uni1E48 ; G 2374 +U 7753 ; WX 712 ; N uni1E49 ; G 2375 +U 7754 ; WX 837 ; N uni1E4A ; G 2376 +U 7755 ; WX 712 ; N uni1E4B ; G 2377 +U 7756 ; WX 850 ; N uni1E4C ; G 2378 +U 7757 ; WX 687 ; N uni1E4D ; G 2379 +U 7758 ; WX 850 ; N uni1E4E ; G 2380 +U 7759 ; WX 687 ; N uni1E4F ; G 2381 +U 7760 ; WX 850 ; N uni1E50 ; G 2382 +U 7761 ; WX 687 ; N uni1E51 ; G 2383 +U 7762 ; WX 850 ; N uni1E52 ; G 2384 +U 7763 ; WX 687 ; N uni1E53 ; G 2385 +U 7764 ; WX 733 ; N uni1E54 ; G 2386 +U 7765 ; WX 716 ; N uni1E55 ; G 2387 +U 7766 ; WX 733 ; N uni1E56 ; G 2388 +U 7767 ; WX 716 ; N uni1E57 ; G 2389 +U 7768 ; WX 770 ; N uni1E58 ; G 2390 +U 7769 ; WX 493 ; N uni1E59 ; G 2391 +U 7770 ; WX 770 ; N uni1E5A ; G 2392 +U 7771 ; WX 493 ; N uni1E5B ; G 2393 +U 7772 ; WX 770 ; N uni1E5C ; G 2394 +U 7773 ; WX 493 ; N uni1E5D ; G 2395 +U 7774 ; WX 770 ; N uni1E5E ; G 2396 +U 7775 ; WX 493 ; N uni1E5F ; G 2397 +U 7776 ; WX 720 ; N uni1E60 ; G 2398 +U 7777 ; WX 595 ; N uni1E61 ; G 2399 +U 7778 ; WX 720 ; N uni1E62 ; G 2400 +U 7779 ; WX 595 ; N uni1E63 ; G 2401 +U 7780 ; WX 720 ; N uni1E64 ; G 2402 +U 7781 ; WX 595 ; N uni1E65 ; G 2403 +U 7782 ; WX 720 ; N uni1E66 ; G 2404 +U 7783 ; WX 595 ; N uni1E67 ; G 2405 +U 7784 ; WX 720 ; N uni1E68 ; G 2406 +U 7785 ; WX 595 ; N uni1E69 ; G 2407 +U 7786 ; WX 682 ; N uni1E6A ; G 2408 +U 7787 ; WX 478 ; N uni1E6B ; G 2409 +U 7788 ; WX 682 ; N uni1E6C ; G 2410 +U 7789 ; WX 478 ; N uni1E6D ; G 2411 +U 7790 ; WX 682 ; N uni1E6E ; G 2412 +U 7791 ; WX 478 ; N uni1E6F ; G 2413 +U 7792 ; WX 682 ; N uni1E70 ; G 2414 +U 7793 ; WX 478 ; N uni1E71 ; G 2415 +U 7794 ; WX 812 ; N uni1E72 ; G 2416 +U 7795 ; WX 712 ; N uni1E73 ; G 2417 +U 7796 ; WX 812 ; N uni1E74 ; G 2418 +U 7797 ; WX 712 ; N uni1E75 ; G 2419 +U 7798 ; WX 812 ; N uni1E76 ; G 2420 +U 7799 ; WX 712 ; N uni1E77 ; G 2421 +U 7800 ; WX 812 ; N uni1E78 ; G 2422 +U 7801 ; WX 712 ; N uni1E79 ; G 2423 +U 7802 ; WX 812 ; N uni1E7A ; G 2424 +U 7803 ; WX 712 ; N uni1E7B ; G 2425 +U 7804 ; WX 774 ; N uni1E7C ; G 2426 +U 7805 ; WX 652 ; N uni1E7D ; G 2427 +U 7806 ; WX 774 ; N uni1E7E ; G 2428 +U 7807 ; WX 652 ; N uni1E7F ; G 2429 +U 7808 ; WX 1103 ; N Wgrave ; G 2430 +U 7809 ; WX 924 ; N wgrave ; G 2431 +U 7810 ; WX 1103 ; N Wacute ; G 2432 +U 7811 ; WX 924 ; N wacute ; G 2433 +U 7812 ; WX 1103 ; N Wdieresis ; G 2434 +U 7813 ; WX 924 ; N wdieresis ; G 2435 +U 7814 ; WX 1103 ; N uni1E86 ; G 2436 +U 7815 ; WX 924 ; N uni1E87 ; G 2437 +U 7816 ; WX 1103 ; N uni1E88 ; G 2438 +U 7817 ; WX 924 ; N uni1E89 ; G 2439 +U 7818 ; WX 771 ; N uni1E8A ; G 2440 +U 7819 ; WX 645 ; N uni1E8B ; G 2441 +U 7820 ; WX 771 ; N uni1E8C ; G 2442 +U 7821 ; WX 645 ; N uni1E8D ; G 2443 +U 7822 ; WX 724 ; N uni1E8E ; G 2444 +U 7823 ; WX 652 ; N uni1E8F ; G 2445 +U 7824 ; WX 725 ; N uni1E90 ; G 2446 +U 7825 ; WX 582 ; N uni1E91 ; G 2447 +U 7826 ; WX 725 ; N uni1E92 ; G 2448 +U 7827 ; WX 582 ; N uni1E93 ; G 2449 +U 7828 ; WX 725 ; N uni1E94 ; G 2450 +U 7829 ; WX 582 ; N uni1E95 ; G 2451 +U 7830 ; WX 712 ; N uni1E96 ; G 2452 +U 7831 ; WX 478 ; N uni1E97 ; G 2453 +U 7832 ; WX 924 ; N uni1E98 ; G 2454 +U 7833 ; WX 652 ; N uni1E99 ; G 2455 +U 7834 ; WX 675 ; N uni1E9A ; G 2456 +U 7835 ; WX 435 ; N uni1E9B ; G 2457 +U 7836 ; WX 435 ; N uni1E9C ; G 2458 +U 7837 ; WX 435 ; N uni1E9D ; G 2459 +U 7838 ; WX 896 ; N uni1E9E ; G 2460 +U 7839 ; WX 687 ; N uni1E9F ; G 2461 +U 7840 ; WX 774 ; N uni1EA0 ; G 2462 +U 7841 ; WX 675 ; N uni1EA1 ; G 2463 +U 7842 ; WX 774 ; N uni1EA2 ; G 2464 +U 7843 ; WX 675 ; N uni1EA3 ; G 2465 +U 7844 ; WX 774 ; N uni1EA4 ; G 2466 +U 7845 ; WX 675 ; N uni1EA5 ; G 2467 +U 7846 ; WX 774 ; N uni1EA6 ; G 2468 +U 7847 ; WX 675 ; N uni1EA7 ; G 2469 +U 7848 ; WX 774 ; N uni1EA8 ; G 2470 +U 7849 ; WX 675 ; N uni1EA9 ; G 2471 +U 7850 ; WX 774 ; N uni1EAA ; G 2472 +U 7851 ; WX 675 ; N uni1EAB ; G 2473 +U 7852 ; WX 774 ; N uni1EAC ; G 2474 +U 7853 ; WX 675 ; N uni1EAD ; G 2475 +U 7854 ; WX 774 ; N uni1EAE ; G 2476 +U 7855 ; WX 675 ; N uni1EAF ; G 2477 +U 7856 ; WX 774 ; N uni1EB0 ; G 2478 +U 7857 ; WX 675 ; N uni1EB1 ; G 2479 +U 7858 ; WX 774 ; N uni1EB2 ; G 2480 +U 7859 ; WX 675 ; N uni1EB3 ; G 2481 +U 7860 ; WX 774 ; N uni1EB4 ; G 2482 +U 7861 ; WX 675 ; N uni1EB5 ; G 2483 +U 7862 ; WX 774 ; N uni1EB6 ; G 2484 +U 7863 ; WX 675 ; N uni1EB7 ; G 2485 +U 7864 ; WX 683 ; N uni1EB8 ; G 2486 +U 7865 ; WX 678 ; N uni1EB9 ; G 2487 +U 7866 ; WX 683 ; N uni1EBA ; G 2488 +U 7867 ; WX 678 ; N uni1EBB ; G 2489 +U 7868 ; WX 683 ; N uni1EBC ; G 2490 +U 7869 ; WX 678 ; N uni1EBD ; G 2491 +U 7870 ; WX 683 ; N uni1EBE ; G 2492 +U 7871 ; WX 678 ; N uni1EBF ; G 2493 +U 7872 ; WX 683 ; N uni1EC0 ; G 2494 +U 7873 ; WX 678 ; N uni1EC1 ; G 2495 +U 7874 ; WX 683 ; N uni1EC2 ; G 2496 +U 7875 ; WX 678 ; N uni1EC3 ; G 2497 +U 7876 ; WX 683 ; N uni1EC4 ; G 2498 +U 7877 ; WX 678 ; N uni1EC5 ; G 2499 +U 7878 ; WX 683 ; N uni1EC6 ; G 2500 +U 7879 ; WX 678 ; N uni1EC7 ; G 2501 +U 7880 ; WX 372 ; N uni1EC8 ; G 2502 +U 7881 ; WX 343 ; N uni1EC9 ; G 2503 +U 7882 ; WX 372 ; N uni1ECA ; G 2504 +U 7883 ; WX 343 ; N uni1ECB ; G 2505 +U 7884 ; WX 850 ; N uni1ECC ; G 2506 +U 7885 ; WX 687 ; N uni1ECD ; G 2507 +U 7886 ; WX 850 ; N uni1ECE ; G 2508 +U 7887 ; WX 687 ; N uni1ECF ; G 2509 +U 7888 ; WX 850 ; N uni1ED0 ; G 2510 +U 7889 ; WX 687 ; N uni1ED1 ; G 2511 +U 7890 ; WX 850 ; N uni1ED2 ; G 2512 +U 7891 ; WX 687 ; N uni1ED3 ; G 2513 +U 7892 ; WX 850 ; N uni1ED4 ; G 2514 +U 7893 ; WX 687 ; N uni1ED5 ; G 2515 +U 7894 ; WX 850 ; N uni1ED6 ; G 2516 +U 7895 ; WX 687 ; N uni1ED7 ; G 2517 +U 7896 ; WX 850 ; N uni1ED8 ; G 2518 +U 7897 ; WX 687 ; N uni1ED9 ; G 2519 +U 7898 ; WX 874 ; N uni1EDA ; G 2520 +U 7899 ; WX 687 ; N uni1EDB ; G 2521 +U 7900 ; WX 874 ; N uni1EDC ; G 2522 +U 7901 ; WX 687 ; N uni1EDD ; G 2523 +U 7902 ; WX 874 ; N uni1EDE ; G 2524 +U 7903 ; WX 687 ; N uni1EDF ; G 2525 +U 7904 ; WX 874 ; N uni1EE0 ; G 2526 +U 7905 ; WX 687 ; N uni1EE1 ; G 2527 +U 7906 ; WX 874 ; N uni1EE2 ; G 2528 +U 7907 ; WX 687 ; N uni1EE3 ; G 2529 +U 7908 ; WX 812 ; N uni1EE4 ; G 2530 +U 7909 ; WX 712 ; N uni1EE5 ; G 2531 +U 7910 ; WX 812 ; N uni1EE6 ; G 2532 +U 7911 ; WX 712 ; N uni1EE7 ; G 2533 +U 7912 ; WX 835 ; N uni1EE8 ; G 2534 +U 7913 ; WX 712 ; N uni1EE9 ; G 2535 +U 7914 ; WX 835 ; N uni1EEA ; G 2536 +U 7915 ; WX 712 ; N uni1EEB ; G 2537 +U 7916 ; WX 835 ; N uni1EEC ; G 2538 +U 7917 ; WX 712 ; N uni1EED ; G 2539 +U 7918 ; WX 835 ; N uni1EEE ; G 2540 +U 7919 ; WX 712 ; N uni1EEF ; G 2541 +U 7920 ; WX 835 ; N uni1EF0 ; G 2542 +U 7921 ; WX 712 ; N uni1EF1 ; G 2543 +U 7922 ; WX 724 ; N Ygrave ; G 2544 +U 7923 ; WX 652 ; N ygrave ; G 2545 +U 7924 ; WX 724 ; N uni1EF4 ; G 2546 +U 7925 ; WX 652 ; N uni1EF5 ; G 2547 +U 7926 ; WX 724 ; N uni1EF6 ; G 2548 +U 7927 ; WX 652 ; N uni1EF7 ; G 2549 +U 7928 ; WX 724 ; N uni1EF8 ; G 2550 +U 7929 ; WX 652 ; N uni1EF9 ; G 2551 +U 7930 ; WX 953 ; N uni1EFA ; G 2552 +U 7931 ; WX 644 ; N uni1EFB ; G 2553 +U 7936 ; WX 687 ; N uni1F00 ; G 2554 +U 7937 ; WX 687 ; N uni1F01 ; G 2555 +U 7938 ; WX 687 ; N uni1F02 ; G 2556 +U 7939 ; WX 687 ; N uni1F03 ; G 2557 +U 7940 ; WX 687 ; N uni1F04 ; G 2558 +U 7941 ; WX 687 ; N uni1F05 ; G 2559 +U 7942 ; WX 687 ; N uni1F06 ; G 2560 +U 7943 ; WX 687 ; N uni1F07 ; G 2561 +U 7944 ; WX 774 ; N uni1F08 ; G 2562 +U 7945 ; WX 774 ; N uni1F09 ; G 2563 +U 7946 ; WX 1041 ; N uni1F0A ; G 2564 +U 7947 ; WX 1043 ; N uni1F0B ; G 2565 +U 7948 ; WX 935 ; N uni1F0C ; G 2566 +U 7949 ; WX 963 ; N uni1F0D ; G 2567 +U 7950 ; WX 835 ; N uni1F0E ; G 2568 +U 7951 ; WX 859 ; N uni1F0F ; G 2569 +U 7952 ; WX 557 ; N uni1F10 ; G 2570 +U 7953 ; WX 557 ; N uni1F11 ; G 2571 +U 7954 ; WX 557 ; N uni1F12 ; G 2572 +U 7955 ; WX 557 ; N uni1F13 ; G 2573 +U 7956 ; WX 557 ; N uni1F14 ; G 2574 +U 7957 ; WX 557 ; N uni1F15 ; G 2575 +U 7960 ; WX 792 ; N uni1F18 ; G 2576 +U 7961 ; WX 794 ; N uni1F19 ; G 2577 +U 7962 ; WX 1100 ; N uni1F1A ; G 2578 +U 7963 ; WX 1096 ; N uni1F1B ; G 2579 +U 7964 ; WX 1023 ; N uni1F1C ; G 2580 +U 7965 ; WX 1052 ; N uni1F1D ; G 2581 +U 7968 ; WX 712 ; N uni1F20 ; G 2582 +U 7969 ; WX 712 ; N uni1F21 ; G 2583 +U 7970 ; WX 712 ; N uni1F22 ; G 2584 +U 7971 ; WX 712 ; N uni1F23 ; G 2585 +U 7972 ; WX 712 ; N uni1F24 ; G 2586 +U 7973 ; WX 712 ; N uni1F25 ; G 2587 +U 7974 ; WX 712 ; N uni1F26 ; G 2588 +U 7975 ; WX 712 ; N uni1F27 ; G 2589 +U 7976 ; WX 945 ; N uni1F28 ; G 2590 +U 7977 ; WX 951 ; N uni1F29 ; G 2591 +U 7978 ; WX 1250 ; N uni1F2A ; G 2592 +U 7979 ; WX 1250 ; N uni1F2B ; G 2593 +U 7980 ; WX 1180 ; N uni1F2C ; G 2594 +U 7981 ; WX 1206 ; N uni1F2D ; G 2595 +U 7982 ; WX 1054 ; N uni1F2E ; G 2596 +U 7983 ; WX 1063 ; N uni1F2F ; G 2597 +U 7984 ; WX 390 ; N uni1F30 ; G 2598 +U 7985 ; WX 390 ; N uni1F31 ; G 2599 +U 7986 ; WX 390 ; N uni1F32 ; G 2600 +U 7987 ; WX 390 ; N uni1F33 ; G 2601 +U 7988 ; WX 390 ; N uni1F34 ; G 2602 +U 7989 ; WX 390 ; N uni1F35 ; G 2603 +U 7990 ; WX 390 ; N uni1F36 ; G 2604 +U 7991 ; WX 390 ; N uni1F37 ; G 2605 +U 7992 ; WX 483 ; N uni1F38 ; G 2606 +U 7993 ; WX 489 ; N uni1F39 ; G 2607 +U 7994 ; WX 777 ; N uni1F3A ; G 2608 +U 7995 ; WX 785 ; N uni1F3B ; G 2609 +U 7996 ; WX 712 ; N uni1F3C ; G 2610 +U 7997 ; WX 738 ; N uni1F3D ; G 2611 +U 7998 ; WX 604 ; N uni1F3E ; G 2612 +U 7999 ; WX 604 ; N uni1F3F ; G 2613 +U 8000 ; WX 687 ; N uni1F40 ; G 2614 +U 8001 ; WX 687 ; N uni1F41 ; G 2615 +U 8002 ; WX 687 ; N uni1F42 ; G 2616 +U 8003 ; WX 687 ; N uni1F43 ; G 2617 +U 8004 ; WX 687 ; N uni1F44 ; G 2618 +U 8005 ; WX 687 ; N uni1F45 ; G 2619 +U 8008 ; WX 892 ; N uni1F48 ; G 2620 +U 8009 ; WX 933 ; N uni1F49 ; G 2621 +U 8010 ; WX 1221 ; N uni1F4A ; G 2622 +U 8011 ; WX 1224 ; N uni1F4B ; G 2623 +U 8012 ; WX 1053 ; N uni1F4C ; G 2624 +U 8013 ; WX 1082 ; N uni1F4D ; G 2625 +U 8016 ; WX 675 ; N uni1F50 ; G 2626 +U 8017 ; WX 675 ; N uni1F51 ; G 2627 +U 8018 ; WX 675 ; N uni1F52 ; G 2628 +U 8019 ; WX 675 ; N uni1F53 ; G 2629 +U 8020 ; WX 675 ; N uni1F54 ; G 2630 +U 8021 ; WX 675 ; N uni1F55 ; G 2631 +U 8022 ; WX 675 ; N uni1F56 ; G 2632 +U 8023 ; WX 675 ; N uni1F57 ; G 2633 +U 8025 ; WX 930 ; N uni1F59 ; G 2634 +U 8027 ; WX 1184 ; N uni1F5B ; G 2635 +U 8029 ; WX 1199 ; N uni1F5D ; G 2636 +U 8031 ; WX 1049 ; N uni1F5F ; G 2637 +U 8032 ; WX 869 ; N uni1F60 ; G 2638 +U 8033 ; WX 869 ; N uni1F61 ; G 2639 +U 8034 ; WX 869 ; N uni1F62 ; G 2640 +U 8035 ; WX 869 ; N uni1F63 ; G 2641 +U 8036 ; WX 869 ; N uni1F64 ; G 2642 +U 8037 ; WX 869 ; N uni1F65 ; G 2643 +U 8038 ; WX 869 ; N uni1F66 ; G 2644 +U 8039 ; WX 869 ; N uni1F67 ; G 2645 +U 8040 ; WX 909 ; N uni1F68 ; G 2646 +U 8041 ; WX 958 ; N uni1F69 ; G 2647 +U 8042 ; WX 1246 ; N uni1F6A ; G 2648 +U 8043 ; WX 1251 ; N uni1F6B ; G 2649 +U 8044 ; WX 1076 ; N uni1F6C ; G 2650 +U 8045 ; WX 1105 ; N uni1F6D ; G 2651 +U 8046 ; WX 1028 ; N uni1F6E ; G 2652 +U 8047 ; WX 1076 ; N uni1F6F ; G 2653 +U 8048 ; WX 687 ; N uni1F70 ; G 2654 +U 8049 ; WX 687 ; N uni1F71 ; G 2655 +U 8050 ; WX 557 ; N uni1F72 ; G 2656 +U 8051 ; WX 557 ; N uni1F73 ; G 2657 +U 8052 ; WX 712 ; N uni1F74 ; G 2658 +U 8053 ; WX 712 ; N uni1F75 ; G 2659 +U 8054 ; WX 390 ; N uni1F76 ; G 2660 +U 8055 ; WX 390 ; N uni1F77 ; G 2661 +U 8056 ; WX 687 ; N uni1F78 ; G 2662 +U 8057 ; WX 687 ; N uni1F79 ; G 2663 +U 8058 ; WX 675 ; N uni1F7A ; G 2664 +U 8059 ; WX 675 ; N uni1F7B ; G 2665 +U 8060 ; WX 869 ; N uni1F7C ; G 2666 +U 8061 ; WX 869 ; N uni1F7D ; G 2667 +U 8064 ; WX 687 ; N uni1F80 ; G 2668 +U 8065 ; WX 687 ; N uni1F81 ; G 2669 +U 8066 ; WX 687 ; N uni1F82 ; G 2670 +U 8067 ; WX 687 ; N uni1F83 ; G 2671 +U 8068 ; WX 687 ; N uni1F84 ; G 2672 +U 8069 ; WX 687 ; N uni1F85 ; G 2673 +U 8070 ; WX 687 ; N uni1F86 ; G 2674 +U 8071 ; WX 687 ; N uni1F87 ; G 2675 +U 8072 ; WX 774 ; N uni1F88 ; G 2676 +U 8073 ; WX 774 ; N uni1F89 ; G 2677 +U 8074 ; WX 1041 ; N uni1F8A ; G 2678 +U 8075 ; WX 1043 ; N uni1F8B ; G 2679 +U 8076 ; WX 935 ; N uni1F8C ; G 2680 +U 8077 ; WX 963 ; N uni1F8D ; G 2681 +U 8078 ; WX 835 ; N uni1F8E ; G 2682 +U 8079 ; WX 859 ; N uni1F8F ; G 2683 +U 8080 ; WX 712 ; N uni1F90 ; G 2684 +U 8081 ; WX 712 ; N uni1F91 ; G 2685 +U 8082 ; WX 712 ; N uni1F92 ; G 2686 +U 8083 ; WX 712 ; N uni1F93 ; G 2687 +U 8084 ; WX 712 ; N uni1F94 ; G 2688 +U 8085 ; WX 712 ; N uni1F95 ; G 2689 +U 8086 ; WX 712 ; N uni1F96 ; G 2690 +U 8087 ; WX 712 ; N uni1F97 ; G 2691 +U 8088 ; WX 945 ; N uni1F98 ; G 2692 +U 8089 ; WX 951 ; N uni1F99 ; G 2693 +U 8090 ; WX 1250 ; N uni1F9A ; G 2694 +U 8091 ; WX 1250 ; N uni1F9B ; G 2695 +U 8092 ; WX 1180 ; N uni1F9C ; G 2696 +U 8093 ; WX 1206 ; N uni1F9D ; G 2697 +U 8094 ; WX 1054 ; N uni1F9E ; G 2698 +U 8095 ; WX 1063 ; N uni1F9F ; G 2699 +U 8096 ; WX 869 ; N uni1FA0 ; G 2700 +U 8097 ; WX 869 ; N uni1FA1 ; G 2701 +U 8098 ; WX 869 ; N uni1FA2 ; G 2702 +U 8099 ; WX 869 ; N uni1FA3 ; G 2703 +U 8100 ; WX 869 ; N uni1FA4 ; G 2704 +U 8101 ; WX 869 ; N uni1FA5 ; G 2705 +U 8102 ; WX 869 ; N uni1FA6 ; G 2706 +U 8103 ; WX 869 ; N uni1FA7 ; G 2707 +U 8104 ; WX 909 ; N uni1FA8 ; G 2708 +U 8105 ; WX 958 ; N uni1FA9 ; G 2709 +U 8106 ; WX 1246 ; N uni1FAA ; G 2710 +U 8107 ; WX 1251 ; N uni1FAB ; G 2711 +U 8108 ; WX 1076 ; N uni1FAC ; G 2712 +U 8109 ; WX 1105 ; N uni1FAD ; G 2713 +U 8110 ; WX 1028 ; N uni1FAE ; G 2714 +U 8111 ; WX 1076 ; N uni1FAF ; G 2715 +U 8112 ; WX 687 ; N uni1FB0 ; G 2716 +U 8113 ; WX 687 ; N uni1FB1 ; G 2717 +U 8114 ; WX 687 ; N uni1FB2 ; G 2718 +U 8115 ; WX 687 ; N uni1FB3 ; G 2719 +U 8116 ; WX 687 ; N uni1FB4 ; G 2720 +U 8118 ; WX 687 ; N uni1FB6 ; G 2721 +U 8119 ; WX 687 ; N uni1FB7 ; G 2722 +U 8120 ; WX 774 ; N uni1FB8 ; G 2723 +U 8121 ; WX 774 ; N uni1FB9 ; G 2724 +U 8122 ; WX 876 ; N uni1FBA ; G 2725 +U 8123 ; WX 797 ; N uni1FBB ; G 2726 +U 8124 ; WX 774 ; N uni1FBC ; G 2727 +U 8125 ; WX 500 ; N uni1FBD ; G 2728 +U 8126 ; WX 500 ; N uni1FBE ; G 2729 +U 8127 ; WX 500 ; N uni1FBF ; G 2730 +U 8128 ; WX 500 ; N uni1FC0 ; G 2731 +U 8129 ; WX 500 ; N uni1FC1 ; G 2732 +U 8130 ; WX 712 ; N uni1FC2 ; G 2733 +U 8131 ; WX 712 ; N uni1FC3 ; G 2734 +U 8132 ; WX 712 ; N uni1FC4 ; G 2735 +U 8134 ; WX 712 ; N uni1FC6 ; G 2736 +U 8135 ; WX 712 ; N uni1FC7 ; G 2737 +U 8136 ; WX 929 ; N uni1FC8 ; G 2738 +U 8137 ; WX 846 ; N uni1FC9 ; G 2739 +U 8138 ; WX 1080 ; N uni1FCA ; G 2740 +U 8139 ; WX 1009 ; N uni1FCB ; G 2741 +U 8140 ; WX 837 ; N uni1FCC ; G 2742 +U 8141 ; WX 500 ; N uni1FCD ; G 2743 +U 8142 ; WX 500 ; N uni1FCE ; G 2744 +U 8143 ; WX 500 ; N uni1FCF ; G 2745 +U 8144 ; WX 390 ; N uni1FD0 ; G 2746 +U 8145 ; WX 390 ; N uni1FD1 ; G 2747 +U 8146 ; WX 390 ; N uni1FD2 ; G 2748 +U 8147 ; WX 390 ; N uni1FD3 ; G 2749 +U 8150 ; WX 390 ; N uni1FD6 ; G 2750 +U 8151 ; WX 390 ; N uni1FD7 ; G 2751 +U 8152 ; WX 372 ; N uni1FD8 ; G 2752 +U 8153 ; WX 372 ; N uni1FD9 ; G 2753 +U 8154 ; WX 621 ; N uni1FDA ; G 2754 +U 8155 ; WX 563 ; N uni1FDB ; G 2755 +U 8157 ; WX 500 ; N uni1FDD ; G 2756 +U 8158 ; WX 500 ; N uni1FDE ; G 2757 +U 8159 ; WX 500 ; N uni1FDF ; G 2758 +U 8160 ; WX 675 ; N uni1FE0 ; G 2759 +U 8161 ; WX 675 ; N uni1FE1 ; G 2760 +U 8162 ; WX 675 ; N uni1FE2 ; G 2761 +U 8163 ; WX 675 ; N uni1FE3 ; G 2762 +U 8164 ; WX 716 ; N uni1FE4 ; G 2763 +U 8165 ; WX 716 ; N uni1FE5 ; G 2764 +U 8166 ; WX 675 ; N uni1FE6 ; G 2765 +U 8167 ; WX 675 ; N uni1FE7 ; G 2766 +U 8168 ; WX 724 ; N uni1FE8 ; G 2767 +U 8169 ; WX 724 ; N uni1FE9 ; G 2768 +U 8170 ; WX 1020 ; N uni1FEA ; G 2769 +U 8171 ; WX 980 ; N uni1FEB ; G 2770 +U 8172 ; WX 838 ; N uni1FEC ; G 2771 +U 8173 ; WX 500 ; N uni1FED ; G 2772 +U 8174 ; WX 500 ; N uni1FEE ; G 2773 +U 8175 ; WX 500 ; N uni1FEF ; G 2774 +U 8178 ; WX 869 ; N uni1FF2 ; G 2775 +U 8179 ; WX 869 ; N uni1FF3 ; G 2776 +U 8180 ; WX 869 ; N uni1FF4 ; G 2777 +U 8182 ; WX 869 ; N uni1FF6 ; G 2778 +U 8183 ; WX 869 ; N uni1FF7 ; G 2779 +U 8184 ; WX 1065 ; N uni1FF8 ; G 2780 +U 8185 ; WX 891 ; N uni1FF9 ; G 2781 +U 8186 ; WX 1084 ; N uni1FFA ; G 2782 +U 8187 ; WX 894 ; N uni1FFB ; G 2783 +U 8188 ; WX 850 ; N uni1FFC ; G 2784 +U 8189 ; WX 500 ; N uni1FFD ; G 2785 +U 8190 ; WX 500 ; N uni1FFE ; G 2786 +U 8192 ; WX 500 ; N uni2000 ; G 2787 +U 8193 ; WX 1000 ; N uni2001 ; G 2788 +U 8194 ; WX 500 ; N uni2002 ; G 2789 +U 8195 ; WX 1000 ; N uni2003 ; G 2790 +U 8196 ; WX 330 ; N uni2004 ; G 2791 +U 8197 ; WX 250 ; N uni2005 ; G 2792 +U 8198 ; WX 167 ; N uni2006 ; G 2793 +U 8199 ; WX 696 ; N uni2007 ; G 2794 +U 8200 ; WX 380 ; N uni2008 ; G 2795 +U 8201 ; WX 200 ; N uni2009 ; G 2796 +U 8202 ; WX 100 ; N uni200A ; G 2797 +U 8203 ; WX 0 ; N uni200B ; G 2798 +U 8204 ; WX 0 ; N uni200C ; G 2799 +U 8205 ; WX 0 ; N uni200D ; G 2800 +U 8206 ; WX 0 ; N uni200E ; G 2801 +U 8207 ; WX 0 ; N uni200F ; G 2802 +U 8208 ; WX 415 ; N uni2010 ; G 2803 +U 8209 ; WX 415 ; N uni2011 ; G 2804 +U 8210 ; WX 696 ; N figuredash ; G 2805 +U 8211 ; WX 500 ; N endash ; G 2806 +U 8212 ; WX 1000 ; N emdash ; G 2807 +U 8213 ; WX 1000 ; N uni2015 ; G 2808 +U 8214 ; WX 500 ; N uni2016 ; G 2809 +U 8215 ; WX 500 ; N underscoredbl ; G 2810 +U 8216 ; WX 380 ; N quoteleft ; G 2811 +U 8217 ; WX 380 ; N quoteright ; G 2812 +U 8218 ; WX 380 ; N quotesinglbase ; G 2813 +U 8219 ; WX 380 ; N quotereversed ; G 2814 +U 8220 ; WX 657 ; N quotedblleft ; G 2815 +U 8221 ; WX 657 ; N quotedblright ; G 2816 +U 8222 ; WX 657 ; N quotedblbase ; G 2817 +U 8223 ; WX 657 ; N uni201F ; G 2818 +U 8224 ; WX 500 ; N dagger ; G 2819 +U 8225 ; WX 500 ; N daggerdbl ; G 2820 +U 8226 ; WX 639 ; N bullet ; G 2821 +U 8227 ; WX 639 ; N uni2023 ; G 2822 +U 8228 ; WX 333 ; N onedotenleader ; G 2823 +U 8229 ; WX 667 ; N twodotenleader ; G 2824 +U 8230 ; WX 1000 ; N ellipsis ; G 2825 +U 8231 ; WX 348 ; N uni2027 ; G 2826 +U 8232 ; WX 0 ; N uni2028 ; G 2827 +U 8233 ; WX 0 ; N uni2029 ; G 2828 +U 8234 ; WX 0 ; N uni202A ; G 2829 +U 8235 ; WX 0 ; N uni202B ; G 2830 +U 8236 ; WX 0 ; N uni202C ; G 2831 +U 8237 ; WX 0 ; N uni202D ; G 2832 +U 8238 ; WX 0 ; N uni202E ; G 2833 +U 8239 ; WX 200 ; N uni202F ; G 2834 +U 8240 ; WX 1440 ; N perthousand ; G 2835 +U 8241 ; WX 1887 ; N uni2031 ; G 2836 +U 8242 ; WX 264 ; N minute ; G 2837 +U 8243 ; WX 447 ; N second ; G 2838 +U 8244 ; WX 630 ; N uni2034 ; G 2839 +U 8245 ; WX 264 ; N uni2035 ; G 2840 +U 8246 ; WX 447 ; N uni2036 ; G 2841 +U 8247 ; WX 630 ; N uni2037 ; G 2842 +U 8248 ; WX 733 ; N uni2038 ; G 2843 +U 8249 ; WX 412 ; N guilsinglleft ; G 2844 +U 8250 ; WX 412 ; N guilsinglright ; G 2845 +U 8251 ; WX 972 ; N uni203B ; G 2846 +U 8252 ; WX 627 ; N exclamdbl ; G 2847 +U 8253 ; WX 580 ; N uni203D ; G 2848 +U 8254 ; WX 500 ; N uni203E ; G 2849 +U 8255 ; WX 828 ; N uni203F ; G 2850 +U 8256 ; WX 828 ; N uni2040 ; G 2851 +U 8257 ; WX 329 ; N uni2041 ; G 2852 +U 8258 ; WX 1023 ; N uni2042 ; G 2853 +U 8259 ; WX 500 ; N uni2043 ; G 2854 +U 8260 ; WX 167 ; N fraction ; G 2855 +U 8261 ; WX 457 ; N uni2045 ; G 2856 +U 8262 ; WX 457 ; N uni2046 ; G 2857 +U 8263 ; WX 1030 ; N uni2047 ; G 2858 +U 8264 ; WX 829 ; N uni2048 ; G 2859 +U 8265 ; WX 829 ; N uni2049 ; G 2860 +U 8266 ; WX 513 ; N uni204A ; G 2861 +U 8267 ; WX 636 ; N uni204B ; G 2862 +U 8268 ; WX 500 ; N uni204C ; G 2863 +U 8269 ; WX 500 ; N uni204D ; G 2864 +U 8270 ; WX 523 ; N uni204E ; G 2865 +U 8271 ; WX 400 ; N uni204F ; G 2866 +U 8272 ; WX 828 ; N uni2050 ; G 2867 +U 8273 ; WX 523 ; N uni2051 ; G 2868 +U 8274 ; WX 556 ; N uni2052 ; G 2869 +U 8275 ; WX 1000 ; N uni2053 ; G 2870 +U 8276 ; WX 828 ; N uni2054 ; G 2871 +U 8277 ; WX 838 ; N uni2055 ; G 2872 +U 8278 ; WX 684 ; N uni2056 ; G 2873 +U 8279 ; WX 813 ; N uni2057 ; G 2874 +U 8280 ; WX 838 ; N uni2058 ; G 2875 +U 8281 ; WX 838 ; N uni2059 ; G 2876 +U 8282 ; WX 380 ; N uni205A ; G 2877 +U 8283 ; WX 872 ; N uni205B ; G 2878 +U 8284 ; WX 838 ; N uni205C ; G 2879 +U 8285 ; WX 380 ; N uni205D ; G 2880 +U 8286 ; WX 380 ; N uni205E ; G 2881 +U 8287 ; WX 222 ; N uni205F ; G 2882 +U 8288 ; WX 0 ; N uni2060 ; G 2883 +U 8289 ; WX 0 ; N uni2061 ; G 2884 +U 8290 ; WX 0 ; N uni2062 ; G 2885 +U 8291 ; WX 0 ; N uni2063 ; G 2886 +U 8292 ; WX 0 ; N uni2064 ; G 2887 +U 8298 ; WX 0 ; N uni206A ; G 2888 +U 8299 ; WX 0 ; N uni206B ; G 2889 +U 8300 ; WX 0 ; N uni206C ; G 2890 +U 8301 ; WX 0 ; N uni206D ; G 2891 +U 8302 ; WX 0 ; N uni206E ; G 2892 +U 8303 ; WX 0 ; N uni206F ; G 2893 +U 8304 ; WX 438 ; N uni2070 ; G 2894 +U 8305 ; WX 219 ; N uni2071 ; G 2895 +U 8308 ; WX 438 ; N uni2074 ; G 2896 +U 8309 ; WX 438 ; N uni2075 ; G 2897 +U 8310 ; WX 438 ; N uni2076 ; G 2898 +U 8311 ; WX 438 ; N uni2077 ; G 2899 +U 8312 ; WX 438 ; N uni2078 ; G 2900 +U 8313 ; WX 438 ; N uni2079 ; G 2901 +U 8314 ; WX 528 ; N uni207A ; G 2902 +U 8315 ; WX 528 ; N uni207B ; G 2903 +U 8316 ; WX 528 ; N uni207C ; G 2904 +U 8317 ; WX 288 ; N uni207D ; G 2905 +U 8318 ; WX 288 ; N uni207E ; G 2906 +U 8319 ; WX 456 ; N uni207F ; G 2907 +U 8320 ; WX 438 ; N uni2080 ; G 2908 +U 8321 ; WX 438 ; N uni2081 ; G 2909 +U 8322 ; WX 438 ; N uni2082 ; G 2910 +U 8323 ; WX 438 ; N uni2083 ; G 2911 +U 8324 ; WX 438 ; N uni2084 ; G 2912 +U 8325 ; WX 438 ; N uni2085 ; G 2913 +U 8326 ; WX 438 ; N uni2086 ; G 2914 +U 8327 ; WX 438 ; N uni2087 ; G 2915 +U 8328 ; WX 438 ; N uni2088 ; G 2916 +U 8329 ; WX 438 ; N uni2089 ; G 2917 +U 8330 ; WX 528 ; N uni208A ; G 2918 +U 8331 ; WX 528 ; N uni208B ; G 2919 +U 8332 ; WX 528 ; N uni208C ; G 2920 +U 8333 ; WX 288 ; N uni208D ; G 2921 +U 8334 ; WX 288 ; N uni208E ; G 2922 +U 8336 ; WX 458 ; N uni2090 ; G 2923 +U 8337 ; WX 479 ; N uni2091 ; G 2924 +U 8338 ; WX 488 ; N uni2092 ; G 2925 +U 8339 ; WX 413 ; N uni2093 ; G 2926 +U 8340 ; WX 479 ; N uni2094 ; G 2927 +U 8341 ; WX 456 ; N uni2095 ; G 2928 +U 8342 ; WX 487 ; N uni2096 ; G 2929 +U 8343 ; WX 219 ; N uni2097 ; G 2930 +U 8344 ; WX 664 ; N uni2098 ; G 2931 +U 8345 ; WX 456 ; N uni2099 ; G 2932 +U 8346 ; WX 479 ; N uni209A ; G 2933 +U 8347 ; WX 381 ; N uni209B ; G 2934 +U 8348 ; WX 388 ; N uni209C ; G 2935 +U 8352 ; WX 929 ; N uni20A0 ; G 2936 +U 8353 ; WX 696 ; N colonmonetary ; G 2937 +U 8354 ; WX 696 ; N uni20A2 ; G 2938 +U 8355 ; WX 696 ; N franc ; G 2939 +U 8356 ; WX 696 ; N lira ; G 2940 +U 8357 ; WX 1042 ; N uni20A5 ; G 2941 +U 8358 ; WX 696 ; N uni20A6 ; G 2942 +U 8359 ; WX 1518 ; N peseta ; G 2943 +U 8360 ; WX 1205 ; N uni20A8 ; G 2944 +U 8361 ; WX 1103 ; N uni20A9 ; G 2945 +U 8362 ; WX 904 ; N uni20AA ; G 2946 +U 8363 ; WX 696 ; N dong ; G 2947 +U 8364 ; WX 696 ; N Euro ; G 2948 +U 8365 ; WX 696 ; N uni20AD ; G 2949 +U 8366 ; WX 696 ; N uni20AE ; G 2950 +U 8367 ; WX 1392 ; N uni20AF ; G 2951 +U 8368 ; WX 696 ; N uni20B0 ; G 2952 +U 8369 ; WX 696 ; N uni20B1 ; G 2953 +U 8370 ; WX 696 ; N uni20B2 ; G 2954 +U 8371 ; WX 696 ; N uni20B3 ; G 2955 +U 8372 ; WX 859 ; N uni20B4 ; G 2956 +U 8373 ; WX 696 ; N uni20B5 ; G 2957 +U 8376 ; WX 696 ; N uni20B8 ; G 2958 +U 8377 ; WX 696 ; N uni20B9 ; G 2959 +U 8378 ; WX 696 ; N uni20BA ; G 2960 +U 8381 ; WX 696 ; N uni20BD ; G 2961 +U 8400 ; WX 0 ; N uni20D0 ; G 2962 +U 8401 ; WX 0 ; N uni20D1 ; G 2963 +U 8406 ; WX 0 ; N uni20D6 ; G 2964 +U 8407 ; WX 0 ; N uni20D7 ; G 2965 +U 8411 ; WX 0 ; N uni20DB ; G 2966 +U 8412 ; WX 0 ; N uni20DC ; G 2967 +U 8417 ; WX 0 ; N uni20E1 ; G 2968 +U 8448 ; WX 1120 ; N uni2100 ; G 2969 +U 8449 ; WX 1170 ; N uni2101 ; G 2970 +U 8450 ; WX 734 ; N uni2102 ; G 2971 +U 8451 ; WX 1211 ; N uni2103 ; G 2972 +U 8452 ; WX 896 ; N uni2104 ; G 2973 +U 8453 ; WX 1091 ; N uni2105 ; G 2974 +U 8454 ; WX 1144 ; N uni2106 ; G 2975 +U 8455 ; WX 614 ; N uni2107 ; G 2976 +U 8456 ; WX 698 ; N uni2108 ; G 2977 +U 8457 ; WX 1086 ; N uni2109 ; G 2978 +U 8459 ; WX 1073 ; N uni210B ; G 2979 +U 8460 ; WX 913 ; N uni210C ; G 2980 +U 8461 ; WX 888 ; N uni210D ; G 2981 +U 8462 ; WX 712 ; N uni210E ; G 2982 +U 8463 ; WX 712 ; N uni210F ; G 2983 +U 8464 ; WX 597 ; N uni2110 ; G 2984 +U 8465 ; WX 697 ; N Ifraktur ; G 2985 +U 8466 ; WX 856 ; N uni2112 ; G 2986 +U 8467 ; WX 472 ; N uni2113 ; G 2987 +U 8468 ; WX 974 ; N uni2114 ; G 2988 +U 8469 ; WX 837 ; N uni2115 ; G 2989 +U 8470 ; WX 1203 ; N uni2116 ; G 2990 +U 8471 ; WX 1000 ; N uni2117 ; G 2991 +U 8472 ; WX 697 ; N weierstrass ; G 2992 +U 8473 ; WX 750 ; N uni2119 ; G 2993 +U 8474 ; WX 850 ; N uni211A ; G 2994 +U 8475 ; WX 938 ; N uni211B ; G 2995 +U 8476 ; WX 814 ; N Rfraktur ; G 2996 +U 8477 ; WX 801 ; N uni211D ; G 2997 +U 8478 ; WX 896 ; N prescription ; G 2998 +U 8479 ; WX 710 ; N uni211F ; G 2999 +U 8480 ; WX 1020 ; N uni2120 ; G 3000 +U 8481 ; WX 1281 ; N uni2121 ; G 3001 +U 8482 ; WX 1000 ; N trademark ; G 3002 +U 8483 ; WX 755 ; N uni2123 ; G 3003 +U 8484 ; WX 754 ; N uni2124 ; G 3004 +U 8485 ; WX 578 ; N uni2125 ; G 3005 +U 8486 ; WX 850 ; N uni2126 ; G 3006 +U 8487 ; WX 850 ; N uni2127 ; G 3007 +U 8488 ; WX 763 ; N uni2128 ; G 3008 +U 8489 ; WX 338 ; N uni2129 ; G 3009 +U 8490 ; WX 775 ; N uni212A ; G 3010 +U 8491 ; WX 774 ; N uni212B ; G 3011 +U 8492 ; WX 928 ; N uni212C ; G 3012 +U 8493 ; WX 818 ; N uni212D ; G 3013 +U 8494 ; WX 854 ; N estimated ; G 3014 +U 8495 ; WX 636 ; N uni212F ; G 3015 +U 8496 ; WX 729 ; N uni2130 ; G 3016 +U 8497 ; WX 808 ; N uni2131 ; G 3017 +U 8498 ; WX 683 ; N uni2132 ; G 3018 +U 8499 ; WX 1184 ; N uni2133 ; G 3019 +U 8500 ; WX 465 ; N uni2134 ; G 3020 +U 8501 ; WX 794 ; N aleph ; G 3021 +U 8502 ; WX 731 ; N uni2136 ; G 3022 +U 8503 ; WX 494 ; N uni2137 ; G 3023 +U 8504 ; WX 684 ; N uni2138 ; G 3024 +U 8505 ; WX 380 ; N uni2139 ; G 3025 +U 8506 ; WX 945 ; N uni213A ; G 3026 +U 8507 ; WX 1348 ; N uni213B ; G 3027 +U 8508 ; WX 790 ; N uni213C ; G 3028 +U 8509 ; WX 737 ; N uni213D ; G 3029 +U 8510 ; WX 654 ; N uni213E ; G 3030 +U 8511 ; WX 863 ; N uni213F ; G 3031 +U 8512 ; WX 840 ; N uni2140 ; G 3032 +U 8513 ; WX 775 ; N uni2141 ; G 3033 +U 8514 ; WX 557 ; N uni2142 ; G 3034 +U 8515 ; WX 637 ; N uni2143 ; G 3035 +U 8516 ; WX 760 ; N uni2144 ; G 3036 +U 8517 ; WX 830 ; N uni2145 ; G 3037 +U 8518 ; WX 716 ; N uni2146 ; G 3038 +U 8519 ; WX 678 ; N uni2147 ; G 3039 +U 8520 ; WX 343 ; N uni2148 ; G 3040 +U 8521 ; WX 343 ; N uni2149 ; G 3041 +U 8523 ; WX 872 ; N uni214B ; G 3042 +U 8526 ; WX 547 ; N uni214E ; G 3043 +U 8528 ; WX 1035 ; N uni2150 ; G 3044 +U 8529 ; WX 1035 ; N uni2151 ; G 3045 +U 8530 ; WX 1483 ; N uni2152 ; G 3046 +U 8531 ; WX 1035 ; N onethird ; G 3047 +U 8532 ; WX 1035 ; N twothirds ; G 3048 +U 8533 ; WX 1035 ; N uni2155 ; G 3049 +U 8534 ; WX 1035 ; N uni2156 ; G 3050 +U 8535 ; WX 1035 ; N uni2157 ; G 3051 +U 8536 ; WX 1035 ; N uni2158 ; G 3052 +U 8537 ; WX 1035 ; N uni2159 ; G 3053 +U 8538 ; WX 1035 ; N uni215A ; G 3054 +U 8539 ; WX 1035 ; N oneeighth ; G 3055 +U 8540 ; WX 1035 ; N threeeighths ; G 3056 +U 8541 ; WX 1035 ; N fiveeighths ; G 3057 +U 8542 ; WX 1035 ; N seveneighths ; G 3058 +U 8543 ; WX 615 ; N uni215F ; G 3059 +U 8544 ; WX 372 ; N uni2160 ; G 3060 +U 8545 ; WX 659 ; N uni2161 ; G 3061 +U 8546 ; WX 945 ; N uni2162 ; G 3062 +U 8547 ; WX 1099 ; N uni2163 ; G 3063 +U 8548 ; WX 774 ; N uni2164 ; G 3064 +U 8549 ; WX 1099 ; N uni2165 ; G 3065 +U 8550 ; WX 1386 ; N uni2166 ; G 3066 +U 8551 ; WX 1672 ; N uni2167 ; G 3067 +U 8552 ; WX 1121 ; N uni2168 ; G 3068 +U 8553 ; WX 771 ; N uni2169 ; G 3069 +U 8554 ; WX 1120 ; N uni216A ; G 3070 +U 8555 ; WX 1407 ; N uni216B ; G 3071 +U 8556 ; WX 637 ; N uni216C ; G 3072 +U 8557 ; WX 734 ; N uni216D ; G 3073 +U 8558 ; WX 830 ; N uni216E ; G 3074 +U 8559 ; WX 995 ; N uni216F ; G 3075 +U 8560 ; WX 343 ; N uni2170 ; G 3076 +U 8561 ; WX 607 ; N uni2171 ; G 3077 +U 8562 ; WX 872 ; N uni2172 ; G 3078 +U 8563 ; WX 984 ; N uni2173 ; G 3079 +U 8564 ; WX 652 ; N uni2174 ; G 3080 +U 8565 ; WX 962 ; N uni2175 ; G 3081 +U 8566 ; WX 1227 ; N uni2176 ; G 3082 +U 8567 ; WX 1491 ; N uni2177 ; G 3083 +U 8568 ; WX 969 ; N uni2178 ; G 3084 +U 8569 ; WX 645 ; N uni2179 ; G 3085 +U 8570 ; WX 969 ; N uni217A ; G 3086 +U 8571 ; WX 1233 ; N uni217B ; G 3087 +U 8572 ; WX 343 ; N uni217C ; G 3088 +U 8573 ; WX 593 ; N uni217D ; G 3089 +U 8574 ; WX 716 ; N uni217E ; G 3090 +U 8575 ; WX 1042 ; N uni217F ; G 3091 +U 8576 ; WX 1289 ; N uni2180 ; G 3092 +U 8577 ; WX 830 ; N uni2181 ; G 3093 +U 8578 ; WX 1289 ; N uni2182 ; G 3094 +U 8579 ; WX 734 ; N uni2183 ; G 3095 +U 8580 ; WX 593 ; N uni2184 ; G 3096 +U 8581 ; WX 734 ; N uni2185 ; G 3097 +U 8585 ; WX 1035 ; N uni2189 ; G 3098 +U 8592 ; WX 838 ; N arrowleft ; G 3099 +U 8593 ; WX 838 ; N arrowup ; G 3100 +U 8594 ; WX 838 ; N arrowright ; G 3101 +U 8595 ; WX 838 ; N arrowdown ; G 3102 +U 8596 ; WX 838 ; N arrowboth ; G 3103 +U 8597 ; WX 838 ; N arrowupdn ; G 3104 +U 8598 ; WX 838 ; N uni2196 ; G 3105 +U 8599 ; WX 838 ; N uni2197 ; G 3106 +U 8600 ; WX 838 ; N uni2198 ; G 3107 +U 8601 ; WX 838 ; N uni2199 ; G 3108 +U 8602 ; WX 838 ; N uni219A ; G 3109 +U 8603 ; WX 838 ; N uni219B ; G 3110 +U 8604 ; WX 838 ; N uni219C ; G 3111 +U 8605 ; WX 838 ; N uni219D ; G 3112 +U 8606 ; WX 838 ; N uni219E ; G 3113 +U 8607 ; WX 838 ; N uni219F ; G 3114 +U 8608 ; WX 838 ; N uni21A0 ; G 3115 +U 8609 ; WX 838 ; N uni21A1 ; G 3116 +U 8610 ; WX 838 ; N uni21A2 ; G 3117 +U 8611 ; WX 838 ; N uni21A3 ; G 3118 +U 8612 ; WX 838 ; N uni21A4 ; G 3119 +U 8613 ; WX 838 ; N uni21A5 ; G 3120 +U 8614 ; WX 838 ; N uni21A6 ; G 3121 +U 8615 ; WX 838 ; N uni21A7 ; G 3122 +U 8616 ; WX 838 ; N arrowupdnbse ; G 3123 +U 8617 ; WX 838 ; N uni21A9 ; G 3124 +U 8618 ; WX 838 ; N uni21AA ; G 3125 +U 8619 ; WX 838 ; N uni21AB ; G 3126 +U 8620 ; WX 838 ; N uni21AC ; G 3127 +U 8621 ; WX 838 ; N uni21AD ; G 3128 +U 8622 ; WX 838 ; N uni21AE ; G 3129 +U 8623 ; WX 838 ; N uni21AF ; G 3130 +U 8624 ; WX 838 ; N uni21B0 ; G 3131 +U 8625 ; WX 838 ; N uni21B1 ; G 3132 +U 8626 ; WX 838 ; N uni21B2 ; G 3133 +U 8627 ; WX 838 ; N uni21B3 ; G 3134 +U 8628 ; WX 838 ; N uni21B4 ; G 3135 +U 8629 ; WX 838 ; N carriagereturn ; G 3136 +U 8630 ; WX 838 ; N uni21B6 ; G 3137 +U 8631 ; WX 838 ; N uni21B7 ; G 3138 +U 8632 ; WX 838 ; N uni21B8 ; G 3139 +U 8633 ; WX 838 ; N uni21B9 ; G 3140 +U 8634 ; WX 838 ; N uni21BA ; G 3141 +U 8635 ; WX 838 ; N uni21BB ; G 3142 +U 8636 ; WX 838 ; N uni21BC ; G 3143 +U 8637 ; WX 838 ; N uni21BD ; G 3144 +U 8638 ; WX 838 ; N uni21BE ; G 3145 +U 8639 ; WX 838 ; N uni21BF ; G 3146 +U 8640 ; WX 838 ; N uni21C0 ; G 3147 +U 8641 ; WX 838 ; N uni21C1 ; G 3148 +U 8642 ; WX 838 ; N uni21C2 ; G 3149 +U 8643 ; WX 838 ; N uni21C3 ; G 3150 +U 8644 ; WX 838 ; N uni21C4 ; G 3151 +U 8645 ; WX 838 ; N uni21C5 ; G 3152 +U 8646 ; WX 838 ; N uni21C6 ; G 3153 +U 8647 ; WX 838 ; N uni21C7 ; G 3154 +U 8648 ; WX 838 ; N uni21C8 ; G 3155 +U 8649 ; WX 838 ; N uni21C9 ; G 3156 +U 8650 ; WX 838 ; N uni21CA ; G 3157 +U 8651 ; WX 838 ; N uni21CB ; G 3158 +U 8652 ; WX 838 ; N uni21CC ; G 3159 +U 8653 ; WX 838 ; N uni21CD ; G 3160 +U 8654 ; WX 838 ; N uni21CE ; G 3161 +U 8655 ; WX 838 ; N uni21CF ; G 3162 +U 8656 ; WX 838 ; N arrowdblleft ; G 3163 +U 8657 ; WX 838 ; N arrowdblup ; G 3164 +U 8658 ; WX 838 ; N arrowdblright ; G 3165 +U 8659 ; WX 838 ; N arrowdbldown ; G 3166 +U 8660 ; WX 838 ; N arrowdblboth ; G 3167 +U 8661 ; WX 838 ; N uni21D5 ; G 3168 +U 8662 ; WX 838 ; N uni21D6 ; G 3169 +U 8663 ; WX 838 ; N uni21D7 ; G 3170 +U 8664 ; WX 838 ; N uni21D8 ; G 3171 +U 8665 ; WX 838 ; N uni21D9 ; G 3172 +U 8666 ; WX 838 ; N uni21DA ; G 3173 +U 8667 ; WX 838 ; N uni21DB ; G 3174 +U 8668 ; WX 838 ; N uni21DC ; G 3175 +U 8669 ; WX 838 ; N uni21DD ; G 3176 +U 8670 ; WX 838 ; N uni21DE ; G 3177 +U 8671 ; WX 838 ; N uni21DF ; G 3178 +U 8672 ; WX 838 ; N uni21E0 ; G 3179 +U 8673 ; WX 838 ; N uni21E1 ; G 3180 +U 8674 ; WX 838 ; N uni21E2 ; G 3181 +U 8675 ; WX 838 ; N uni21E3 ; G 3182 +U 8676 ; WX 838 ; N uni21E4 ; G 3183 +U 8677 ; WX 838 ; N uni21E5 ; G 3184 +U 8678 ; WX 838 ; N uni21E6 ; G 3185 +U 8679 ; WX 838 ; N uni21E7 ; G 3186 +U 8680 ; WX 838 ; N uni21E8 ; G 3187 +U 8681 ; WX 838 ; N uni21E9 ; G 3188 +U 8682 ; WX 838 ; N uni21EA ; G 3189 +U 8683 ; WX 838 ; N uni21EB ; G 3190 +U 8684 ; WX 838 ; N uni21EC ; G 3191 +U 8685 ; WX 838 ; N uni21ED ; G 3192 +U 8686 ; WX 838 ; N uni21EE ; G 3193 +U 8687 ; WX 838 ; N uni21EF ; G 3194 +U 8688 ; WX 838 ; N uni21F0 ; G 3195 +U 8689 ; WX 838 ; N uni21F1 ; G 3196 +U 8690 ; WX 838 ; N uni21F2 ; G 3197 +U 8691 ; WX 838 ; N uni21F3 ; G 3198 +U 8692 ; WX 838 ; N uni21F4 ; G 3199 +U 8693 ; WX 838 ; N uni21F5 ; G 3200 +U 8694 ; WX 838 ; N uni21F6 ; G 3201 +U 8695 ; WX 838 ; N uni21F7 ; G 3202 +U 8696 ; WX 838 ; N uni21F8 ; G 3203 +U 8697 ; WX 838 ; N uni21F9 ; G 3204 +U 8698 ; WX 838 ; N uni21FA ; G 3205 +U 8699 ; WX 838 ; N uni21FB ; G 3206 +U 8700 ; WX 838 ; N uni21FC ; G 3207 +U 8701 ; WX 838 ; N uni21FD ; G 3208 +U 8702 ; WX 838 ; N uni21FE ; G 3209 +U 8703 ; WX 838 ; N uni21FF ; G 3210 +U 8704 ; WX 774 ; N universal ; G 3211 +U 8705 ; WX 696 ; N uni2201 ; G 3212 +U 8706 ; WX 544 ; N partialdiff ; G 3213 +U 8707 ; WX 683 ; N existential ; G 3214 +U 8708 ; WX 683 ; N uni2204 ; G 3215 +U 8709 ; WX 856 ; N emptyset ; G 3216 +U 8710 ; WX 697 ; N increment ; G 3217 +U 8711 ; WX 697 ; N gradient ; G 3218 +U 8712 ; WX 896 ; N element ; G 3219 +U 8713 ; WX 896 ; N notelement ; G 3220 +U 8714 ; WX 750 ; N uni220A ; G 3221 +U 8715 ; WX 896 ; N suchthat ; G 3222 +U 8716 ; WX 896 ; N uni220C ; G 3223 +U 8717 ; WX 750 ; N uni220D ; G 3224 +U 8718 ; WX 636 ; N uni220E ; G 3225 +U 8719 ; WX 787 ; N product ; G 3226 +U 8720 ; WX 787 ; N uni2210 ; G 3227 +U 8721 ; WX 718 ; N summation ; G 3228 +U 8722 ; WX 838 ; N minus ; G 3229 +U 8723 ; WX 838 ; N uni2213 ; G 3230 +U 8724 ; WX 696 ; N uni2214 ; G 3231 +U 8725 ; WX 365 ; N uni2215 ; G 3232 +U 8726 ; WX 696 ; N uni2216 ; G 3233 +U 8727 ; WX 838 ; N asteriskmath ; G 3234 +U 8728 ; WX 626 ; N uni2218 ; G 3235 +U 8729 ; WX 380 ; N uni2219 ; G 3236 +U 8730 ; WX 667 ; N radical ; G 3237 +U 8731 ; WX 667 ; N uni221B ; G 3238 +U 8732 ; WX 667 ; N uni221C ; G 3239 +U 8733 ; WX 712 ; N proportional ; G 3240 +U 8734 ; WX 833 ; N infinity ; G 3241 +U 8735 ; WX 838 ; N orthogonal ; G 3242 +U 8736 ; WX 896 ; N angle ; G 3243 +U 8737 ; WX 896 ; N uni2221 ; G 3244 +U 8738 ; WX 838 ; N uni2222 ; G 3245 +U 8739 ; WX 500 ; N uni2223 ; G 3246 +U 8740 ; WX 500 ; N uni2224 ; G 3247 +U 8741 ; WX 500 ; N uni2225 ; G 3248 +U 8742 ; WX 500 ; N uni2226 ; G 3249 +U 8743 ; WX 812 ; N logicaland ; G 3250 +U 8744 ; WX 812 ; N logicalor ; G 3251 +U 8745 ; WX 812 ; N intersection ; G 3252 +U 8746 ; WX 812 ; N union ; G 3253 +U 8747 ; WX 610 ; N integral ; G 3254 +U 8748 ; WX 929 ; N uni222C ; G 3255 +U 8749 ; WX 1295 ; N uni222D ; G 3256 +U 8750 ; WX 563 ; N uni222E ; G 3257 +U 8751 ; WX 977 ; N uni222F ; G 3258 +U 8752 ; WX 1313 ; N uni2230 ; G 3259 +U 8753 ; WX 563 ; N uni2231 ; G 3260 +U 8754 ; WX 563 ; N uni2232 ; G 3261 +U 8755 ; WX 563 ; N uni2233 ; G 3262 +U 8756 ; WX 696 ; N therefore ; G 3263 +U 8757 ; WX 696 ; N uni2235 ; G 3264 +U 8758 ; WX 294 ; N uni2236 ; G 3265 +U 8759 ; WX 696 ; N uni2237 ; G 3266 +U 8760 ; WX 838 ; N uni2238 ; G 3267 +U 8761 ; WX 838 ; N uni2239 ; G 3268 +U 8762 ; WX 838 ; N uni223A ; G 3269 +U 8763 ; WX 838 ; N uni223B ; G 3270 +U 8764 ; WX 838 ; N similar ; G 3271 +U 8765 ; WX 838 ; N uni223D ; G 3272 +U 8766 ; WX 838 ; N uni223E ; G 3273 +U 8767 ; WX 838 ; N uni223F ; G 3274 +U 8768 ; WX 375 ; N uni2240 ; G 3275 +U 8769 ; WX 838 ; N uni2241 ; G 3276 +U 8770 ; WX 838 ; N uni2242 ; G 3277 +U 8771 ; WX 838 ; N uni2243 ; G 3278 +U 8772 ; WX 838 ; N uni2244 ; G 3279 +U 8773 ; WX 838 ; N congruent ; G 3280 +U 8774 ; WX 838 ; N uni2246 ; G 3281 +U 8775 ; WX 838 ; N uni2247 ; G 3282 +U 8776 ; WX 838 ; N approxequal ; G 3283 +U 8777 ; WX 838 ; N uni2249 ; G 3284 +U 8778 ; WX 838 ; N uni224A ; G 3285 +U 8779 ; WX 838 ; N uni224B ; G 3286 +U 8780 ; WX 838 ; N uni224C ; G 3287 +U 8781 ; WX 838 ; N uni224D ; G 3288 +U 8782 ; WX 838 ; N uni224E ; G 3289 +U 8783 ; WX 838 ; N uni224F ; G 3290 +U 8784 ; WX 838 ; N uni2250 ; G 3291 +U 8785 ; WX 838 ; N uni2251 ; G 3292 +U 8786 ; WX 838 ; N uni2252 ; G 3293 +U 8787 ; WX 838 ; N uni2253 ; G 3294 +U 8788 ; WX 1063 ; N uni2254 ; G 3295 +U 8789 ; WX 1063 ; N uni2255 ; G 3296 +U 8790 ; WX 838 ; N uni2256 ; G 3297 +U 8791 ; WX 838 ; N uni2257 ; G 3298 +U 8792 ; WX 838 ; N uni2258 ; G 3299 +U 8793 ; WX 838 ; N uni2259 ; G 3300 +U 8794 ; WX 838 ; N uni225A ; G 3301 +U 8795 ; WX 838 ; N uni225B ; G 3302 +U 8796 ; WX 838 ; N uni225C ; G 3303 +U 8797 ; WX 838 ; N uni225D ; G 3304 +U 8798 ; WX 838 ; N uni225E ; G 3305 +U 8799 ; WX 838 ; N uni225F ; G 3306 +U 8800 ; WX 838 ; N notequal ; G 3307 +U 8801 ; WX 838 ; N equivalence ; G 3308 +U 8802 ; WX 838 ; N uni2262 ; G 3309 +U 8803 ; WX 838 ; N uni2263 ; G 3310 +U 8804 ; WX 838 ; N lessequal ; G 3311 +U 8805 ; WX 838 ; N greaterequal ; G 3312 +U 8806 ; WX 838 ; N uni2266 ; G 3313 +U 8807 ; WX 838 ; N uni2267 ; G 3314 +U 8808 ; WX 841 ; N uni2268 ; G 3315 +U 8809 ; WX 841 ; N uni2269 ; G 3316 +U 8810 ; WX 1047 ; N uni226A ; G 3317 +U 8811 ; WX 1047 ; N uni226B ; G 3318 +U 8812 ; WX 500 ; N uni226C ; G 3319 +U 8813 ; WX 838 ; N uni226D ; G 3320 +U 8814 ; WX 838 ; N uni226E ; G 3321 +U 8815 ; WX 838 ; N uni226F ; G 3322 +U 8816 ; WX 838 ; N uni2270 ; G 3323 +U 8817 ; WX 838 ; N uni2271 ; G 3324 +U 8818 ; WX 838 ; N uni2272 ; G 3325 +U 8819 ; WX 838 ; N uni2273 ; G 3326 +U 8820 ; WX 838 ; N uni2274 ; G 3327 +U 8821 ; WX 838 ; N uni2275 ; G 3328 +U 8822 ; WX 838 ; N uni2276 ; G 3329 +U 8823 ; WX 838 ; N uni2277 ; G 3330 +U 8824 ; WX 838 ; N uni2278 ; G 3331 +U 8825 ; WX 838 ; N uni2279 ; G 3332 +U 8826 ; WX 838 ; N uni227A ; G 3333 +U 8827 ; WX 838 ; N uni227B ; G 3334 +U 8828 ; WX 838 ; N uni227C ; G 3335 +U 8829 ; WX 838 ; N uni227D ; G 3336 +U 8830 ; WX 838 ; N uni227E ; G 3337 +U 8831 ; WX 838 ; N uni227F ; G 3338 +U 8832 ; WX 838 ; N uni2280 ; G 3339 +U 8833 ; WX 838 ; N uni2281 ; G 3340 +U 8834 ; WX 838 ; N propersubset ; G 3341 +U 8835 ; WX 838 ; N propersuperset ; G 3342 +U 8836 ; WX 838 ; N notsubset ; G 3343 +U 8837 ; WX 838 ; N uni2285 ; G 3344 +U 8838 ; WX 838 ; N reflexsubset ; G 3345 +U 8839 ; WX 838 ; N reflexsuperset ; G 3346 +U 8840 ; WX 838 ; N uni2288 ; G 3347 +U 8841 ; WX 838 ; N uni2289 ; G 3348 +U 8842 ; WX 838 ; N uni228A ; G 3349 +U 8843 ; WX 838 ; N uni228B ; G 3350 +U 8844 ; WX 812 ; N uni228C ; G 3351 +U 8845 ; WX 812 ; N uni228D ; G 3352 +U 8846 ; WX 812 ; N uni228E ; G 3353 +U 8847 ; WX 838 ; N uni228F ; G 3354 +U 8848 ; WX 838 ; N uni2290 ; G 3355 +U 8849 ; WX 838 ; N uni2291 ; G 3356 +U 8850 ; WX 838 ; N uni2292 ; G 3357 +U 8851 ; WX 796 ; N uni2293 ; G 3358 +U 8852 ; WX 796 ; N uni2294 ; G 3359 +U 8853 ; WX 838 ; N circleplus ; G 3360 +U 8854 ; WX 838 ; N uni2296 ; G 3361 +U 8855 ; WX 838 ; N circlemultiply ; G 3362 +U 8856 ; WX 838 ; N uni2298 ; G 3363 +U 8857 ; WX 838 ; N uni2299 ; G 3364 +U 8858 ; WX 838 ; N uni229A ; G 3365 +U 8859 ; WX 838 ; N uni229B ; G 3366 +U 8860 ; WX 838 ; N uni229C ; G 3367 +U 8861 ; WX 838 ; N uni229D ; G 3368 +U 8862 ; WX 838 ; N uni229E ; G 3369 +U 8863 ; WX 838 ; N uni229F ; G 3370 +U 8864 ; WX 838 ; N uni22A0 ; G 3371 +U 8865 ; WX 838 ; N uni22A1 ; G 3372 +U 8866 ; WX 914 ; N uni22A2 ; G 3373 +U 8867 ; WX 914 ; N uni22A3 ; G 3374 +U 8868 ; WX 914 ; N uni22A4 ; G 3375 +U 8869 ; WX 914 ; N perpendicular ; G 3376 +U 8870 ; WX 542 ; N uni22A6 ; G 3377 +U 8871 ; WX 542 ; N uni22A7 ; G 3378 +U 8872 ; WX 914 ; N uni22A8 ; G 3379 +U 8873 ; WX 914 ; N uni22A9 ; G 3380 +U 8874 ; WX 914 ; N uni22AA ; G 3381 +U 8875 ; WX 914 ; N uni22AB ; G 3382 +U 8876 ; WX 914 ; N uni22AC ; G 3383 +U 8877 ; WX 914 ; N uni22AD ; G 3384 +U 8878 ; WX 914 ; N uni22AE ; G 3385 +U 8879 ; WX 914 ; N uni22AF ; G 3386 +U 8880 ; WX 838 ; N uni22B0 ; G 3387 +U 8881 ; WX 838 ; N uni22B1 ; G 3388 +U 8882 ; WX 838 ; N uni22B2 ; G 3389 +U 8883 ; WX 838 ; N uni22B3 ; G 3390 +U 8884 ; WX 838 ; N uni22B4 ; G 3391 +U 8885 ; WX 838 ; N uni22B5 ; G 3392 +U 8886 ; WX 1000 ; N uni22B6 ; G 3393 +U 8887 ; WX 1000 ; N uni22B7 ; G 3394 +U 8888 ; WX 838 ; N uni22B8 ; G 3395 +U 8889 ; WX 838 ; N uni22B9 ; G 3396 +U 8890 ; WX 542 ; N uni22BA ; G 3397 +U 8891 ; WX 812 ; N uni22BB ; G 3398 +U 8892 ; WX 812 ; N uni22BC ; G 3399 +U 8893 ; WX 812 ; N uni22BD ; G 3400 +U 8894 ; WX 838 ; N uni22BE ; G 3401 +U 8895 ; WX 838 ; N uni22BF ; G 3402 +U 8896 ; WX 843 ; N uni22C0 ; G 3403 +U 8897 ; WX 843 ; N uni22C1 ; G 3404 +U 8898 ; WX 843 ; N uni22C2 ; G 3405 +U 8899 ; WX 843 ; N uni22C3 ; G 3406 +U 8900 ; WX 626 ; N uni22C4 ; G 3407 +U 8901 ; WX 380 ; N dotmath ; G 3408 +U 8902 ; WX 626 ; N uni22C6 ; G 3409 +U 8903 ; WX 838 ; N uni22C7 ; G 3410 +U 8904 ; WX 1000 ; N uni22C8 ; G 3411 +U 8905 ; WX 1000 ; N uni22C9 ; G 3412 +U 8906 ; WX 1000 ; N uni22CA ; G 3413 +U 8907 ; WX 1000 ; N uni22CB ; G 3414 +U 8908 ; WX 1000 ; N uni22CC ; G 3415 +U 8909 ; WX 838 ; N uni22CD ; G 3416 +U 8910 ; WX 812 ; N uni22CE ; G 3417 +U 8911 ; WX 812 ; N uni22CF ; G 3418 +U 8912 ; WX 838 ; N uni22D0 ; G 3419 +U 8913 ; WX 838 ; N uni22D1 ; G 3420 +U 8914 ; WX 838 ; N uni22D2 ; G 3421 +U 8915 ; WX 838 ; N uni22D3 ; G 3422 +U 8916 ; WX 838 ; N uni22D4 ; G 3423 +U 8917 ; WX 838 ; N uni22D5 ; G 3424 +U 8918 ; WX 838 ; N uni22D6 ; G 3425 +U 8919 ; WX 838 ; N uni22D7 ; G 3426 +U 8920 ; WX 1422 ; N uni22D8 ; G 3427 +U 8921 ; WX 1422 ; N uni22D9 ; G 3428 +U 8922 ; WX 838 ; N uni22DA ; G 3429 +U 8923 ; WX 838 ; N uni22DB ; G 3430 +U 8924 ; WX 838 ; N uni22DC ; G 3431 +U 8925 ; WX 838 ; N uni22DD ; G 3432 +U 8926 ; WX 838 ; N uni22DE ; G 3433 +U 8927 ; WX 838 ; N uni22DF ; G 3434 +U 8928 ; WX 838 ; N uni22E0 ; G 3435 +U 8929 ; WX 838 ; N uni22E1 ; G 3436 +U 8930 ; WX 838 ; N uni22E2 ; G 3437 +U 8931 ; WX 838 ; N uni22E3 ; G 3438 +U 8932 ; WX 838 ; N uni22E4 ; G 3439 +U 8933 ; WX 838 ; N uni22E5 ; G 3440 +U 8934 ; WX 838 ; N uni22E6 ; G 3441 +U 8935 ; WX 838 ; N uni22E7 ; G 3442 +U 8936 ; WX 838 ; N uni22E8 ; G 3443 +U 8937 ; WX 838 ; N uni22E9 ; G 3444 +U 8938 ; WX 838 ; N uni22EA ; G 3445 +U 8939 ; WX 838 ; N uni22EB ; G 3446 +U 8940 ; WX 838 ; N uni22EC ; G 3447 +U 8941 ; WX 838 ; N uni22ED ; G 3448 +U 8942 ; WX 1000 ; N uni22EE ; G 3449 +U 8943 ; WX 1000 ; N uni22EF ; G 3450 +U 8944 ; WX 1000 ; N uni22F0 ; G 3451 +U 8945 ; WX 1000 ; N uni22F1 ; G 3452 +U 8946 ; WX 1158 ; N uni22F2 ; G 3453 +U 8947 ; WX 896 ; N uni22F3 ; G 3454 +U 8948 ; WX 750 ; N uni22F4 ; G 3455 +U 8949 ; WX 896 ; N uni22F5 ; G 3456 +U 8950 ; WX 896 ; N uni22F6 ; G 3457 +U 8951 ; WX 750 ; N uni22F7 ; G 3458 +U 8952 ; WX 896 ; N uni22F8 ; G 3459 +U 8953 ; WX 896 ; N uni22F9 ; G 3460 +U 8954 ; WX 1158 ; N uni22FA ; G 3461 +U 8955 ; WX 896 ; N uni22FB ; G 3462 +U 8956 ; WX 750 ; N uni22FC ; G 3463 +U 8957 ; WX 896 ; N uni22FD ; G 3464 +U 8958 ; WX 750 ; N uni22FE ; G 3465 +U 8959 ; WX 896 ; N uni22FF ; G 3466 +U 8960 ; WX 602 ; N uni2300 ; G 3467 +U 8961 ; WX 602 ; N uni2301 ; G 3468 +U 8962 ; WX 716 ; N house ; G 3469 +U 8963 ; WX 838 ; N uni2303 ; G 3470 +U 8964 ; WX 838 ; N uni2304 ; G 3471 +U 8965 ; WX 838 ; N uni2305 ; G 3472 +U 8966 ; WX 838 ; N uni2306 ; G 3473 +U 8967 ; WX 488 ; N uni2307 ; G 3474 +U 8968 ; WX 457 ; N uni2308 ; G 3475 +U 8969 ; WX 457 ; N uni2309 ; G 3476 +U 8970 ; WX 457 ; N uni230A ; G 3477 +U 8971 ; WX 457 ; N uni230B ; G 3478 +U 8972 ; WX 809 ; N uni230C ; G 3479 +U 8973 ; WX 809 ; N uni230D ; G 3480 +U 8974 ; WX 809 ; N uni230E ; G 3481 +U 8975 ; WX 809 ; N uni230F ; G 3482 +U 8976 ; WX 838 ; N revlogicalnot ; G 3483 +U 8977 ; WX 539 ; N uni2311 ; G 3484 +U 8984 ; WX 928 ; N uni2318 ; G 3485 +U 8985 ; WX 838 ; N uni2319 ; G 3486 +U 8988 ; WX 469 ; N uni231C ; G 3487 +U 8989 ; WX 469 ; N uni231D ; G 3488 +U 8990 ; WX 469 ; N uni231E ; G 3489 +U 8991 ; WX 469 ; N uni231F ; G 3490 +U 8992 ; WX 610 ; N integraltp ; G 3491 +U 8993 ; WX 610 ; N integralbt ; G 3492 +U 8996 ; WX 1152 ; N uni2324 ; G 3493 +U 8997 ; WX 1152 ; N uni2325 ; G 3494 +U 8998 ; WX 1414 ; N uni2326 ; G 3495 +U 8999 ; WX 1152 ; N uni2327 ; G 3496 +U 9000 ; WX 1443 ; N uni2328 ; G 3497 +U 9003 ; WX 1414 ; N uni232B ; G 3498 +U 9004 ; WX 873 ; N uni232C ; G 3499 +U 9075 ; WX 390 ; N uni2373 ; G 3500 +U 9076 ; WX 716 ; N uni2374 ; G 3501 +U 9077 ; WX 869 ; N uni2375 ; G 3502 +U 9082 ; WX 687 ; N uni237A ; G 3503 +U 9085 ; WX 863 ; N uni237D ; G 3504 +U 9095 ; WX 1152 ; N uni2387 ; G 3505 +U 9108 ; WX 873 ; N uni2394 ; G 3506 +U 9115 ; WX 500 ; N uni239B ; G 3507 +U 9116 ; WX 500 ; N uni239C ; G 3508 +U 9117 ; WX 500 ; N uni239D ; G 3509 +U 9118 ; WX 500 ; N uni239E ; G 3510 +U 9119 ; WX 500 ; N uni239F ; G 3511 +U 9120 ; WX 500 ; N uni23A0 ; G 3512 +U 9121 ; WX 500 ; N uni23A1 ; G 3513 +U 9122 ; WX 500 ; N uni23A2 ; G 3514 +U 9123 ; WX 500 ; N uni23A3 ; G 3515 +U 9124 ; WX 500 ; N uni23A4 ; G 3516 +U 9125 ; WX 500 ; N uni23A5 ; G 3517 +U 9126 ; WX 500 ; N uni23A6 ; G 3518 +U 9127 ; WX 750 ; N uni23A7 ; G 3519 +U 9128 ; WX 750 ; N uni23A8 ; G 3520 +U 9129 ; WX 750 ; N uni23A9 ; G 3521 +U 9130 ; WX 750 ; N uni23AA ; G 3522 +U 9131 ; WX 750 ; N uni23AB ; G 3523 +U 9132 ; WX 750 ; N uni23AC ; G 3524 +U 9133 ; WX 750 ; N uni23AD ; G 3525 +U 9134 ; WX 610 ; N uni23AE ; G 3526 +U 9166 ; WX 838 ; N uni23CE ; G 3527 +U 9167 ; WX 945 ; N uni23CF ; G 3528 +U 9187 ; WX 873 ; N uni23E3 ; G 3529 +U 9189 ; WX 769 ; N uni23E5 ; G 3530 +U 9192 ; WX 696 ; N uni23E8 ; G 3531 +U 9250 ; WX 716 ; N uni2422 ; G 3532 +U 9251 ; WX 716 ; N uni2423 ; G 3533 +U 9312 ; WX 847 ; N uni2460 ; G 3534 +U 9313 ; WX 847 ; N uni2461 ; G 3535 +U 9314 ; WX 847 ; N uni2462 ; G 3536 +U 9315 ; WX 847 ; N uni2463 ; G 3537 +U 9316 ; WX 847 ; N uni2464 ; G 3538 +U 9317 ; WX 847 ; N uni2465 ; G 3539 +U 9318 ; WX 847 ; N uni2466 ; G 3540 +U 9319 ; WX 847 ; N uni2467 ; G 3541 +U 9320 ; WX 847 ; N uni2468 ; G 3542 +U 9321 ; WX 847 ; N uni2469 ; G 3543 +U 9472 ; WX 602 ; N SF100000 ; G 3544 +U 9473 ; WX 602 ; N uni2501 ; G 3545 +U 9474 ; WX 602 ; N SF110000 ; G 3546 +U 9475 ; WX 602 ; N uni2503 ; G 3547 +U 9476 ; WX 602 ; N uni2504 ; G 3548 +U 9477 ; WX 602 ; N uni2505 ; G 3549 +U 9478 ; WX 602 ; N uni2506 ; G 3550 +U 9479 ; WX 602 ; N uni2507 ; G 3551 +U 9480 ; WX 602 ; N uni2508 ; G 3552 +U 9481 ; WX 602 ; N uni2509 ; G 3553 +U 9482 ; WX 602 ; N uni250A ; G 3554 +U 9483 ; WX 602 ; N uni250B ; G 3555 +U 9484 ; WX 602 ; N SF010000 ; G 3556 +U 9485 ; WX 602 ; N uni250D ; G 3557 +U 9486 ; WX 602 ; N uni250E ; G 3558 +U 9487 ; WX 602 ; N uni250F ; G 3559 +U 9488 ; WX 602 ; N SF030000 ; G 3560 +U 9489 ; WX 602 ; N uni2511 ; G 3561 +U 9490 ; WX 602 ; N uni2512 ; G 3562 +U 9491 ; WX 602 ; N uni2513 ; G 3563 +U 9492 ; WX 602 ; N SF020000 ; G 3564 +U 9493 ; WX 602 ; N uni2515 ; G 3565 +U 9494 ; WX 602 ; N uni2516 ; G 3566 +U 9495 ; WX 602 ; N uni2517 ; G 3567 +U 9496 ; WX 602 ; N SF040000 ; G 3568 +U 9497 ; WX 602 ; N uni2519 ; G 3569 +U 9498 ; WX 602 ; N uni251A ; G 3570 +U 9499 ; WX 602 ; N uni251B ; G 3571 +U 9500 ; WX 602 ; N SF080000 ; G 3572 +U 9501 ; WX 602 ; N uni251D ; G 3573 +U 9502 ; WX 602 ; N uni251E ; G 3574 +U 9503 ; WX 602 ; N uni251F ; G 3575 +U 9504 ; WX 602 ; N uni2520 ; G 3576 +U 9505 ; WX 602 ; N uni2521 ; G 3577 +U 9506 ; WX 602 ; N uni2522 ; G 3578 +U 9507 ; WX 602 ; N uni2523 ; G 3579 +U 9508 ; WX 602 ; N SF090000 ; G 3580 +U 9509 ; WX 602 ; N uni2525 ; G 3581 +U 9510 ; WX 602 ; N uni2526 ; G 3582 +U 9511 ; WX 602 ; N uni2527 ; G 3583 +U 9512 ; WX 602 ; N uni2528 ; G 3584 +U 9513 ; WX 602 ; N uni2529 ; G 3585 +U 9514 ; WX 602 ; N uni252A ; G 3586 +U 9515 ; WX 602 ; N uni252B ; G 3587 +U 9516 ; WX 602 ; N SF060000 ; G 3588 +U 9517 ; WX 602 ; N uni252D ; G 3589 +U 9518 ; WX 602 ; N uni252E ; G 3590 +U 9519 ; WX 602 ; N uni252F ; G 3591 +U 9520 ; WX 602 ; N uni2530 ; G 3592 +U 9521 ; WX 602 ; N uni2531 ; G 3593 +U 9522 ; WX 602 ; N uni2532 ; G 3594 +U 9523 ; WX 602 ; N uni2533 ; G 3595 +U 9524 ; WX 602 ; N SF070000 ; G 3596 +U 9525 ; WX 602 ; N uni2535 ; G 3597 +U 9526 ; WX 602 ; N uni2536 ; G 3598 +U 9527 ; WX 602 ; N uni2537 ; G 3599 +U 9528 ; WX 602 ; N uni2538 ; G 3600 +U 9529 ; WX 602 ; N uni2539 ; G 3601 +U 9530 ; WX 602 ; N uni253A ; G 3602 +U 9531 ; WX 602 ; N uni253B ; G 3603 +U 9532 ; WX 602 ; N SF050000 ; G 3604 +U 9533 ; WX 602 ; N uni253D ; G 3605 +U 9534 ; WX 602 ; N uni253E ; G 3606 +U 9535 ; WX 602 ; N uni253F ; G 3607 +U 9536 ; WX 602 ; N uni2540 ; G 3608 +U 9537 ; WX 602 ; N uni2541 ; G 3609 +U 9538 ; WX 602 ; N uni2542 ; G 3610 +U 9539 ; WX 602 ; N uni2543 ; G 3611 +U 9540 ; WX 602 ; N uni2544 ; G 3612 +U 9541 ; WX 602 ; N uni2545 ; G 3613 +U 9542 ; WX 602 ; N uni2546 ; G 3614 +U 9543 ; WX 602 ; N uni2547 ; G 3615 +U 9544 ; WX 602 ; N uni2548 ; G 3616 +U 9545 ; WX 602 ; N uni2549 ; G 3617 +U 9546 ; WX 602 ; N uni254A ; G 3618 +U 9547 ; WX 602 ; N uni254B ; G 3619 +U 9548 ; WX 602 ; N uni254C ; G 3620 +U 9549 ; WX 602 ; N uni254D ; G 3621 +U 9550 ; WX 602 ; N uni254E ; G 3622 +U 9551 ; WX 602 ; N uni254F ; G 3623 +U 9552 ; WX 602 ; N SF430000 ; G 3624 +U 9553 ; WX 602 ; N SF240000 ; G 3625 +U 9554 ; WX 602 ; N SF510000 ; G 3626 +U 9555 ; WX 602 ; N SF520000 ; G 3627 +U 9556 ; WX 602 ; N SF390000 ; G 3628 +U 9557 ; WX 602 ; N SF220000 ; G 3629 +U 9558 ; WX 602 ; N SF210000 ; G 3630 +U 9559 ; WX 602 ; N SF250000 ; G 3631 +U 9560 ; WX 602 ; N SF500000 ; G 3632 +U 9561 ; WX 602 ; N SF490000 ; G 3633 +U 9562 ; WX 602 ; N SF380000 ; G 3634 +U 9563 ; WX 602 ; N SF280000 ; G 3635 +U 9564 ; WX 602 ; N SF270000 ; G 3636 +U 9565 ; WX 602 ; N SF260000 ; G 3637 +U 9566 ; WX 602 ; N SF360000 ; G 3638 +U 9567 ; WX 602 ; N SF370000 ; G 3639 +U 9568 ; WX 602 ; N SF420000 ; G 3640 +U 9569 ; WX 602 ; N SF190000 ; G 3641 +U 9570 ; WX 602 ; N SF200000 ; G 3642 +U 9571 ; WX 602 ; N SF230000 ; G 3643 +U 9572 ; WX 602 ; N SF470000 ; G 3644 +U 9573 ; WX 602 ; N SF480000 ; G 3645 +U 9574 ; WX 602 ; N SF410000 ; G 3646 +U 9575 ; WX 602 ; N SF450000 ; G 3647 +U 9576 ; WX 602 ; N SF460000 ; G 3648 +U 9577 ; WX 602 ; N SF400000 ; G 3649 +U 9578 ; WX 602 ; N SF540000 ; G 3650 +U 9579 ; WX 602 ; N SF530000 ; G 3651 +U 9580 ; WX 602 ; N SF440000 ; G 3652 +U 9581 ; WX 602 ; N uni256D ; G 3653 +U 9582 ; WX 602 ; N uni256E ; G 3654 +U 9583 ; WX 602 ; N uni256F ; G 3655 +U 9584 ; WX 602 ; N uni2570 ; G 3656 +U 9585 ; WX 602 ; N uni2571 ; G 3657 +U 9586 ; WX 602 ; N uni2572 ; G 3658 +U 9587 ; WX 602 ; N uni2573 ; G 3659 +U 9588 ; WX 602 ; N uni2574 ; G 3660 +U 9589 ; WX 602 ; N uni2575 ; G 3661 +U 9590 ; WX 602 ; N uni2576 ; G 3662 +U 9591 ; WX 602 ; N uni2577 ; G 3663 +U 9592 ; WX 602 ; N uni2578 ; G 3664 +U 9593 ; WX 602 ; N uni2579 ; G 3665 +U 9594 ; WX 602 ; N uni257A ; G 3666 +U 9595 ; WX 602 ; N uni257B ; G 3667 +U 9596 ; WX 602 ; N uni257C ; G 3668 +U 9597 ; WX 602 ; N uni257D ; G 3669 +U 9598 ; WX 602 ; N uni257E ; G 3670 +U 9599 ; WX 602 ; N uni257F ; G 3671 +U 9600 ; WX 769 ; N upblock ; G 3672 +U 9601 ; WX 769 ; N uni2581 ; G 3673 +U 9602 ; WX 769 ; N uni2582 ; G 3674 +U 9603 ; WX 769 ; N uni2583 ; G 3675 +U 9604 ; WX 769 ; N dnblock ; G 3676 +U 9605 ; WX 769 ; N uni2585 ; G 3677 +U 9606 ; WX 769 ; N uni2586 ; G 3678 +U 9607 ; WX 769 ; N uni2587 ; G 3679 +U 9608 ; WX 769 ; N block ; G 3680 +U 9609 ; WX 769 ; N uni2589 ; G 3681 +U 9610 ; WX 769 ; N uni258A ; G 3682 +U 9611 ; WX 769 ; N uni258B ; G 3683 +U 9612 ; WX 769 ; N lfblock ; G 3684 +U 9613 ; WX 769 ; N uni258D ; G 3685 +U 9614 ; WX 769 ; N uni258E ; G 3686 +U 9615 ; WX 769 ; N uni258F ; G 3687 +U 9616 ; WX 769 ; N rtblock ; G 3688 +U 9617 ; WX 769 ; N ltshade ; G 3689 +U 9618 ; WX 769 ; N shade ; G 3690 +U 9619 ; WX 769 ; N dkshade ; G 3691 +U 9620 ; WX 769 ; N uni2594 ; G 3692 +U 9621 ; WX 769 ; N uni2595 ; G 3693 +U 9622 ; WX 769 ; N uni2596 ; G 3694 +U 9623 ; WX 769 ; N uni2597 ; G 3695 +U 9624 ; WX 769 ; N uni2598 ; G 3696 +U 9625 ; WX 769 ; N uni2599 ; G 3697 +U 9626 ; WX 769 ; N uni259A ; G 3698 +U 9627 ; WX 769 ; N uni259B ; G 3699 +U 9628 ; WX 769 ; N uni259C ; G 3700 +U 9629 ; WX 769 ; N uni259D ; G 3701 +U 9630 ; WX 769 ; N uni259E ; G 3702 +U 9631 ; WX 769 ; N uni259F ; G 3703 +U 9632 ; WX 945 ; N filledbox ; G 3704 +U 9633 ; WX 945 ; N H22073 ; G 3705 +U 9634 ; WX 945 ; N uni25A2 ; G 3706 +U 9635 ; WX 945 ; N uni25A3 ; G 3707 +U 9636 ; WX 945 ; N uni25A4 ; G 3708 +U 9637 ; WX 945 ; N uni25A5 ; G 3709 +U 9638 ; WX 945 ; N uni25A6 ; G 3710 +U 9639 ; WX 945 ; N uni25A7 ; G 3711 +U 9640 ; WX 945 ; N uni25A8 ; G 3712 +U 9641 ; WX 945 ; N uni25A9 ; G 3713 +U 9642 ; WX 678 ; N H18543 ; G 3714 +U 9643 ; WX 678 ; N H18551 ; G 3715 +U 9644 ; WX 945 ; N filledrect ; G 3716 +U 9645 ; WX 945 ; N uni25AD ; G 3717 +U 9646 ; WX 550 ; N uni25AE ; G 3718 +U 9647 ; WX 550 ; N uni25AF ; G 3719 +U 9648 ; WX 769 ; N uni25B0 ; G 3720 +U 9649 ; WX 769 ; N uni25B1 ; G 3721 +U 9650 ; WX 769 ; N triagup ; G 3722 +U 9651 ; WX 769 ; N uni25B3 ; G 3723 +U 9652 ; WX 502 ; N uni25B4 ; G 3724 +U 9653 ; WX 502 ; N uni25B5 ; G 3725 +U 9654 ; WX 769 ; N uni25B6 ; G 3726 +U 9655 ; WX 769 ; N uni25B7 ; G 3727 +U 9656 ; WX 502 ; N uni25B8 ; G 3728 +U 9657 ; WX 502 ; N uni25B9 ; G 3729 +U 9658 ; WX 769 ; N triagrt ; G 3730 +U 9659 ; WX 769 ; N uni25BB ; G 3731 +U 9660 ; WX 769 ; N triagdn ; G 3732 +U 9661 ; WX 769 ; N uni25BD ; G 3733 +U 9662 ; WX 502 ; N uni25BE ; G 3734 +U 9663 ; WX 502 ; N uni25BF ; G 3735 +U 9664 ; WX 769 ; N uni25C0 ; G 3736 +U 9665 ; WX 769 ; N uni25C1 ; G 3737 +U 9666 ; WX 502 ; N uni25C2 ; G 3738 +U 9667 ; WX 502 ; N uni25C3 ; G 3739 +U 9668 ; WX 769 ; N triaglf ; G 3740 +U 9669 ; WX 769 ; N uni25C5 ; G 3741 +U 9670 ; WX 769 ; N uni25C6 ; G 3742 +U 9671 ; WX 769 ; N uni25C7 ; G 3743 +U 9672 ; WX 769 ; N uni25C8 ; G 3744 +U 9673 ; WX 873 ; N uni25C9 ; G 3745 +U 9674 ; WX 494 ; N lozenge ; G 3746 +U 9675 ; WX 873 ; N circle ; G 3747 +U 9676 ; WX 873 ; N uni25CC ; G 3748 +U 9677 ; WX 873 ; N uni25CD ; G 3749 +U 9678 ; WX 873 ; N uni25CE ; G 3750 +U 9679 ; WX 873 ; N H18533 ; G 3751 +U 9680 ; WX 873 ; N uni25D0 ; G 3752 +U 9681 ; WX 873 ; N uni25D1 ; G 3753 +U 9682 ; WX 873 ; N uni25D2 ; G 3754 +U 9683 ; WX 873 ; N uni25D3 ; G 3755 +U 9684 ; WX 873 ; N uni25D4 ; G 3756 +U 9685 ; WX 873 ; N uni25D5 ; G 3757 +U 9686 ; WX 527 ; N uni25D6 ; G 3758 +U 9687 ; WX 527 ; N uni25D7 ; G 3759 +U 9688 ; WX 840 ; N invbullet ; G 3760 +U 9689 ; WX 970 ; N invcircle ; G 3761 +U 9690 ; WX 970 ; N uni25DA ; G 3762 +U 9691 ; WX 970 ; N uni25DB ; G 3763 +U 9692 ; WX 387 ; N uni25DC ; G 3764 +U 9693 ; WX 387 ; N uni25DD ; G 3765 +U 9694 ; WX 387 ; N uni25DE ; G 3766 +U 9695 ; WX 387 ; N uni25DF ; G 3767 +U 9696 ; WX 769 ; N uni25E0 ; G 3768 +U 9697 ; WX 769 ; N uni25E1 ; G 3769 +U 9698 ; WX 769 ; N uni25E2 ; G 3770 +U 9699 ; WX 769 ; N uni25E3 ; G 3771 +U 9700 ; WX 769 ; N uni25E4 ; G 3772 +U 9701 ; WX 769 ; N uni25E5 ; G 3773 +U 9702 ; WX 639 ; N openbullet ; G 3774 +U 9703 ; WX 945 ; N uni25E7 ; G 3775 +U 9704 ; WX 945 ; N uni25E8 ; G 3776 +U 9705 ; WX 945 ; N uni25E9 ; G 3777 +U 9706 ; WX 945 ; N uni25EA ; G 3778 +U 9707 ; WX 945 ; N uni25EB ; G 3779 +U 9708 ; WX 769 ; N uni25EC ; G 3780 +U 9709 ; WX 769 ; N uni25ED ; G 3781 +U 9710 ; WX 769 ; N uni25EE ; G 3782 +U 9711 ; WX 1119 ; N uni25EF ; G 3783 +U 9712 ; WX 945 ; N uni25F0 ; G 3784 +U 9713 ; WX 945 ; N uni25F1 ; G 3785 +U 9714 ; WX 945 ; N uni25F2 ; G 3786 +U 9715 ; WX 945 ; N uni25F3 ; G 3787 +U 9716 ; WX 873 ; N uni25F4 ; G 3788 +U 9717 ; WX 873 ; N uni25F5 ; G 3789 +U 9718 ; WX 873 ; N uni25F6 ; G 3790 +U 9719 ; WX 873 ; N uni25F7 ; G 3791 +U 9720 ; WX 769 ; N uni25F8 ; G 3792 +U 9721 ; WX 769 ; N uni25F9 ; G 3793 +U 9722 ; WX 769 ; N uni25FA ; G 3794 +U 9723 ; WX 830 ; N uni25FB ; G 3795 +U 9724 ; WX 830 ; N uni25FC ; G 3796 +U 9725 ; WX 732 ; N uni25FD ; G 3797 +U 9726 ; WX 732 ; N uni25FE ; G 3798 +U 9727 ; WX 769 ; N uni25FF ; G 3799 +U 9728 ; WX 896 ; N uni2600 ; G 3800 +U 9729 ; WX 1000 ; N uni2601 ; G 3801 +U 9730 ; WX 896 ; N uni2602 ; G 3802 +U 9731 ; WX 896 ; N uni2603 ; G 3803 +U 9732 ; WX 896 ; N uni2604 ; G 3804 +U 9733 ; WX 896 ; N uni2605 ; G 3805 +U 9734 ; WX 896 ; N uni2606 ; G 3806 +U 9735 ; WX 573 ; N uni2607 ; G 3807 +U 9736 ; WX 896 ; N uni2608 ; G 3808 +U 9737 ; WX 896 ; N uni2609 ; G 3809 +U 9738 ; WX 888 ; N uni260A ; G 3810 +U 9739 ; WX 888 ; N uni260B ; G 3811 +U 9740 ; WX 671 ; N uni260C ; G 3812 +U 9741 ; WX 1013 ; N uni260D ; G 3813 +U 9742 ; WX 1246 ; N uni260E ; G 3814 +U 9743 ; WX 1250 ; N uni260F ; G 3815 +U 9744 ; WX 896 ; N uni2610 ; G 3816 +U 9745 ; WX 896 ; N uni2611 ; G 3817 +U 9746 ; WX 896 ; N uni2612 ; G 3818 +U 9747 ; WX 532 ; N uni2613 ; G 3819 +U 9748 ; WX 896 ; N uni2614 ; G 3820 +U 9749 ; WX 896 ; N uni2615 ; G 3821 +U 9750 ; WX 896 ; N uni2616 ; G 3822 +U 9751 ; WX 896 ; N uni2617 ; G 3823 +U 9752 ; WX 896 ; N uni2618 ; G 3824 +U 9753 ; WX 896 ; N uni2619 ; G 3825 +U 9754 ; WX 896 ; N uni261A ; G 3826 +U 9755 ; WX 896 ; N uni261B ; G 3827 +U 9756 ; WX 896 ; N uni261C ; G 3828 +U 9757 ; WX 609 ; N uni261D ; G 3829 +U 9758 ; WX 896 ; N uni261E ; G 3830 +U 9759 ; WX 609 ; N uni261F ; G 3831 +U 9760 ; WX 896 ; N uni2620 ; G 3832 +U 9761 ; WX 896 ; N uni2621 ; G 3833 +U 9762 ; WX 896 ; N uni2622 ; G 3834 +U 9763 ; WX 896 ; N uni2623 ; G 3835 +U 9764 ; WX 669 ; N uni2624 ; G 3836 +U 9765 ; WX 746 ; N uni2625 ; G 3837 +U 9766 ; WX 649 ; N uni2626 ; G 3838 +U 9767 ; WX 784 ; N uni2627 ; G 3839 +U 9768 ; WX 545 ; N uni2628 ; G 3840 +U 9769 ; WX 896 ; N uni2629 ; G 3841 +U 9770 ; WX 896 ; N uni262A ; G 3842 +U 9771 ; WX 896 ; N uni262B ; G 3843 +U 9772 ; WX 710 ; N uni262C ; G 3844 +U 9773 ; WX 896 ; N uni262D ; G 3845 +U 9774 ; WX 896 ; N uni262E ; G 3846 +U 9775 ; WX 896 ; N uni262F ; G 3847 +U 9776 ; WX 896 ; N uni2630 ; G 3848 +U 9777 ; WX 896 ; N uni2631 ; G 3849 +U 9778 ; WX 896 ; N uni2632 ; G 3850 +U 9779 ; WX 896 ; N uni2633 ; G 3851 +U 9780 ; WX 896 ; N uni2634 ; G 3852 +U 9781 ; WX 896 ; N uni2635 ; G 3853 +U 9782 ; WX 896 ; N uni2636 ; G 3854 +U 9783 ; WX 896 ; N uni2637 ; G 3855 +U 9784 ; WX 896 ; N uni2638 ; G 3856 +U 9785 ; WX 1042 ; N uni2639 ; G 3857 +U 9786 ; WX 1042 ; N smileface ; G 3858 +U 9787 ; WX 1042 ; N invsmileface ; G 3859 +U 9788 ; WX 896 ; N sun ; G 3860 +U 9789 ; WX 896 ; N uni263D ; G 3861 +U 9790 ; WX 896 ; N uni263E ; G 3862 +U 9791 ; WX 614 ; N uni263F ; G 3863 +U 9792 ; WX 732 ; N female ; G 3864 +U 9793 ; WX 732 ; N uni2641 ; G 3865 +U 9794 ; WX 896 ; N male ; G 3866 +U 9795 ; WX 896 ; N uni2643 ; G 3867 +U 9796 ; WX 896 ; N uni2644 ; G 3868 +U 9797 ; WX 896 ; N uni2645 ; G 3869 +U 9798 ; WX 896 ; N uni2646 ; G 3870 +U 9799 ; WX 896 ; N uni2647 ; G 3871 +U 9800 ; WX 896 ; N uni2648 ; G 3872 +U 9801 ; WX 896 ; N uni2649 ; G 3873 +U 9802 ; WX 896 ; N uni264A ; G 3874 +U 9803 ; WX 896 ; N uni264B ; G 3875 +U 9804 ; WX 896 ; N uni264C ; G 3876 +U 9805 ; WX 896 ; N uni264D ; G 3877 +U 9806 ; WX 896 ; N uni264E ; G 3878 +U 9807 ; WX 896 ; N uni264F ; G 3879 +U 9808 ; WX 896 ; N uni2650 ; G 3880 +U 9809 ; WX 896 ; N uni2651 ; G 3881 +U 9810 ; WX 896 ; N uni2652 ; G 3882 +U 9811 ; WX 896 ; N uni2653 ; G 3883 +U 9812 ; WX 896 ; N uni2654 ; G 3884 +U 9813 ; WX 896 ; N uni2655 ; G 3885 +U 9814 ; WX 896 ; N uni2656 ; G 3886 +U 9815 ; WX 896 ; N uni2657 ; G 3887 +U 9816 ; WX 896 ; N uni2658 ; G 3888 +U 9817 ; WX 896 ; N uni2659 ; G 3889 +U 9818 ; WX 896 ; N uni265A ; G 3890 +U 9819 ; WX 896 ; N uni265B ; G 3891 +U 9820 ; WX 896 ; N uni265C ; G 3892 +U 9821 ; WX 896 ; N uni265D ; G 3893 +U 9822 ; WX 896 ; N uni265E ; G 3894 +U 9823 ; WX 896 ; N uni265F ; G 3895 +U 9824 ; WX 896 ; N spade ; G 3896 +U 9825 ; WX 896 ; N uni2661 ; G 3897 +U 9826 ; WX 896 ; N uni2662 ; G 3898 +U 9827 ; WX 896 ; N club ; G 3899 +U 9828 ; WX 896 ; N uni2664 ; G 3900 +U 9829 ; WX 896 ; N heart ; G 3901 +U 9830 ; WX 896 ; N diamond ; G 3902 +U 9831 ; WX 896 ; N uni2667 ; G 3903 +U 9832 ; WX 896 ; N uni2668 ; G 3904 +U 9833 ; WX 472 ; N uni2669 ; G 3905 +U 9834 ; WX 638 ; N musicalnote ; G 3906 +U 9835 ; WX 896 ; N musicalnotedbl ; G 3907 +U 9836 ; WX 896 ; N uni266C ; G 3908 +U 9837 ; WX 472 ; N uni266D ; G 3909 +U 9838 ; WX 357 ; N uni266E ; G 3910 +U 9839 ; WX 484 ; N uni266F ; G 3911 +U 9840 ; WX 748 ; N uni2670 ; G 3912 +U 9841 ; WX 766 ; N uni2671 ; G 3913 +U 9842 ; WX 896 ; N uni2672 ; G 3914 +U 9843 ; WX 896 ; N uni2673 ; G 3915 +U 9844 ; WX 896 ; N uni2674 ; G 3916 +U 9845 ; WX 896 ; N uni2675 ; G 3917 +U 9846 ; WX 896 ; N uni2676 ; G 3918 +U 9847 ; WX 896 ; N uni2677 ; G 3919 +U 9848 ; WX 896 ; N uni2678 ; G 3920 +U 9849 ; WX 896 ; N uni2679 ; G 3921 +U 9850 ; WX 896 ; N uni267A ; G 3922 +U 9851 ; WX 896 ; N uni267B ; G 3923 +U 9852 ; WX 896 ; N uni267C ; G 3924 +U 9853 ; WX 896 ; N uni267D ; G 3925 +U 9854 ; WX 896 ; N uni267E ; G 3926 +U 9855 ; WX 896 ; N uni267F ; G 3927 +U 9856 ; WX 869 ; N uni2680 ; G 3928 +U 9857 ; WX 869 ; N uni2681 ; G 3929 +U 9858 ; WX 869 ; N uni2682 ; G 3930 +U 9859 ; WX 869 ; N uni2683 ; G 3931 +U 9860 ; WX 869 ; N uni2684 ; G 3932 +U 9861 ; WX 869 ; N uni2685 ; G 3933 +U 9862 ; WX 896 ; N uni2686 ; G 3934 +U 9863 ; WX 896 ; N uni2687 ; G 3935 +U 9864 ; WX 896 ; N uni2688 ; G 3936 +U 9865 ; WX 896 ; N uni2689 ; G 3937 +U 9866 ; WX 896 ; N uni268A ; G 3938 +U 9867 ; WX 896 ; N uni268B ; G 3939 +U 9868 ; WX 896 ; N uni268C ; G 3940 +U 9869 ; WX 896 ; N uni268D ; G 3941 +U 9870 ; WX 896 ; N uni268E ; G 3942 +U 9871 ; WX 896 ; N uni268F ; G 3943 +U 9872 ; WX 896 ; N uni2690 ; G 3944 +U 9873 ; WX 896 ; N uni2691 ; G 3945 +U 9874 ; WX 896 ; N uni2692 ; G 3946 +U 9875 ; WX 896 ; N uni2693 ; G 3947 +U 9876 ; WX 896 ; N uni2694 ; G 3948 +U 9877 ; WX 541 ; N uni2695 ; G 3949 +U 9878 ; WX 896 ; N uni2696 ; G 3950 +U 9879 ; WX 896 ; N uni2697 ; G 3951 +U 9880 ; WX 896 ; N uni2698 ; G 3952 +U 9881 ; WX 896 ; N uni2699 ; G 3953 +U 9882 ; WX 896 ; N uni269A ; G 3954 +U 9883 ; WX 896 ; N uni269B ; G 3955 +U 9884 ; WX 896 ; N uni269C ; G 3956 +U 9886 ; WX 896 ; N uni269E ; G 3957 +U 9887 ; WX 896 ; N uni269F ; G 3958 +U 9888 ; WX 896 ; N uni26A0 ; G 3959 +U 9889 ; WX 702 ; N uni26A1 ; G 3960 +U 9890 ; WX 1004 ; N uni26A2 ; G 3961 +U 9891 ; WX 1089 ; N uni26A3 ; G 3962 +U 9892 ; WX 1175 ; N uni26A4 ; G 3963 +U 9893 ; WX 903 ; N uni26A5 ; G 3964 +U 9894 ; WX 838 ; N uni26A6 ; G 3965 +U 9895 ; WX 838 ; N uni26A7 ; G 3966 +U 9896 ; WX 838 ; N uni26A8 ; G 3967 +U 9897 ; WX 838 ; N uni26A9 ; G 3968 +U 9898 ; WX 838 ; N uni26AA ; G 3969 +U 9899 ; WX 838 ; N uni26AB ; G 3970 +U 9900 ; WX 838 ; N uni26AC ; G 3971 +U 9901 ; WX 838 ; N uni26AD ; G 3972 +U 9902 ; WX 838 ; N uni26AE ; G 3973 +U 9903 ; WX 838 ; N uni26AF ; G 3974 +U 9904 ; WX 844 ; N uni26B0 ; G 3975 +U 9905 ; WX 838 ; N uni26B1 ; G 3976 +U 9906 ; WX 732 ; N uni26B2 ; G 3977 +U 9907 ; WX 732 ; N uni26B3 ; G 3978 +U 9908 ; WX 732 ; N uni26B4 ; G 3979 +U 9909 ; WX 732 ; N uni26B5 ; G 3980 +U 9910 ; WX 850 ; N uni26B6 ; G 3981 +U 9911 ; WX 732 ; N uni26B7 ; G 3982 +U 9912 ; WX 732 ; N uni26B8 ; G 3983 +U 9920 ; WX 838 ; N uni26C0 ; G 3984 +U 9921 ; WX 838 ; N uni26C1 ; G 3985 +U 9922 ; WX 838 ; N uni26C2 ; G 3986 +U 9923 ; WX 838 ; N uni26C3 ; G 3987 +U 9954 ; WX 732 ; N uni26E2 ; G 3988 +U 9985 ; WX 838 ; N uni2701 ; G 3989 +U 9986 ; WX 838 ; N uni2702 ; G 3990 +U 9987 ; WX 838 ; N uni2703 ; G 3991 +U 9988 ; WX 838 ; N uni2704 ; G 3992 +U 9990 ; WX 838 ; N uni2706 ; G 3993 +U 9991 ; WX 838 ; N uni2707 ; G 3994 +U 9992 ; WX 838 ; N uni2708 ; G 3995 +U 9993 ; WX 838 ; N uni2709 ; G 3996 +U 9996 ; WX 838 ; N uni270C ; G 3997 +U 9997 ; WX 838 ; N uni270D ; G 3998 +U 9998 ; WX 838 ; N uni270E ; G 3999 +U 9999 ; WX 838 ; N uni270F ; G 4000 +U 10000 ; WX 838 ; N uni2710 ; G 4001 +U 10001 ; WX 838 ; N uni2711 ; G 4002 +U 10002 ; WX 838 ; N uni2712 ; G 4003 +U 10003 ; WX 838 ; N uni2713 ; G 4004 +U 10004 ; WX 838 ; N uni2714 ; G 4005 +U 10005 ; WX 838 ; N uni2715 ; G 4006 +U 10006 ; WX 838 ; N uni2716 ; G 4007 +U 10007 ; WX 838 ; N uni2717 ; G 4008 +U 10008 ; WX 838 ; N uni2718 ; G 4009 +U 10009 ; WX 838 ; N uni2719 ; G 4010 +U 10010 ; WX 838 ; N uni271A ; G 4011 +U 10011 ; WX 838 ; N uni271B ; G 4012 +U 10012 ; WX 838 ; N uni271C ; G 4013 +U 10013 ; WX 838 ; N uni271D ; G 4014 +U 10014 ; WX 838 ; N uni271E ; G 4015 +U 10015 ; WX 838 ; N uni271F ; G 4016 +U 10016 ; WX 838 ; N uni2720 ; G 4017 +U 10017 ; WX 838 ; N uni2721 ; G 4018 +U 10018 ; WX 838 ; N uni2722 ; G 4019 +U 10019 ; WX 838 ; N uni2723 ; G 4020 +U 10020 ; WX 838 ; N uni2724 ; G 4021 +U 10021 ; WX 838 ; N uni2725 ; G 4022 +U 10022 ; WX 838 ; N uni2726 ; G 4023 +U 10023 ; WX 838 ; N uni2727 ; G 4024 +U 10025 ; WX 838 ; N uni2729 ; G 4025 +U 10026 ; WX 838 ; N uni272A ; G 4026 +U 10027 ; WX 838 ; N uni272B ; G 4027 +U 10028 ; WX 838 ; N uni272C ; G 4028 +U 10029 ; WX 838 ; N uni272D ; G 4029 +U 10030 ; WX 838 ; N uni272E ; G 4030 +U 10031 ; WX 838 ; N uni272F ; G 4031 +U 10032 ; WX 838 ; N uni2730 ; G 4032 +U 10033 ; WX 838 ; N uni2731 ; G 4033 +U 10034 ; WX 838 ; N uni2732 ; G 4034 +U 10035 ; WX 838 ; N uni2733 ; G 4035 +U 10036 ; WX 838 ; N uni2734 ; G 4036 +U 10037 ; WX 838 ; N uni2735 ; G 4037 +U 10038 ; WX 838 ; N uni2736 ; G 4038 +U 10039 ; WX 838 ; N uni2737 ; G 4039 +U 10040 ; WX 838 ; N uni2738 ; G 4040 +U 10041 ; WX 838 ; N uni2739 ; G 4041 +U 10042 ; WX 838 ; N uni273A ; G 4042 +U 10043 ; WX 838 ; N uni273B ; G 4043 +U 10044 ; WX 838 ; N uni273C ; G 4044 +U 10045 ; WX 838 ; N uni273D ; G 4045 +U 10046 ; WX 838 ; N uni273E ; G 4046 +U 10047 ; WX 838 ; N uni273F ; G 4047 +U 10048 ; WX 838 ; N uni2740 ; G 4048 +U 10049 ; WX 838 ; N uni2741 ; G 4049 +U 10050 ; WX 838 ; N uni2742 ; G 4050 +U 10051 ; WX 838 ; N uni2743 ; G 4051 +U 10052 ; WX 838 ; N uni2744 ; G 4052 +U 10053 ; WX 838 ; N uni2745 ; G 4053 +U 10054 ; WX 838 ; N uni2746 ; G 4054 +U 10055 ; WX 838 ; N uni2747 ; G 4055 +U 10056 ; WX 838 ; N uni2748 ; G 4056 +U 10057 ; WX 838 ; N uni2749 ; G 4057 +U 10058 ; WX 838 ; N uni274A ; G 4058 +U 10059 ; WX 838 ; N uni274B ; G 4059 +U 10061 ; WX 896 ; N uni274D ; G 4060 +U 10063 ; WX 896 ; N uni274F ; G 4061 +U 10064 ; WX 896 ; N uni2750 ; G 4062 +U 10065 ; WX 896 ; N uni2751 ; G 4063 +U 10066 ; WX 896 ; N uni2752 ; G 4064 +U 10070 ; WX 896 ; N uni2756 ; G 4065 +U 10072 ; WX 838 ; N uni2758 ; G 4066 +U 10073 ; WX 838 ; N uni2759 ; G 4067 +U 10074 ; WX 838 ; N uni275A ; G 4068 +U 10075 ; WX 347 ; N uni275B ; G 4069 +U 10076 ; WX 347 ; N uni275C ; G 4070 +U 10077 ; WX 587 ; N uni275D ; G 4071 +U 10078 ; WX 587 ; N uni275E ; G 4072 +U 10081 ; WX 838 ; N uni2761 ; G 4073 +U 10082 ; WX 838 ; N uni2762 ; G 4074 +U 10083 ; WX 838 ; N uni2763 ; G 4075 +U 10084 ; WX 838 ; N uni2764 ; G 4076 +U 10085 ; WX 838 ; N uni2765 ; G 4077 +U 10086 ; WX 838 ; N uni2766 ; G 4078 +U 10087 ; WX 838 ; N uni2767 ; G 4079 +U 10088 ; WX 838 ; N uni2768 ; G 4080 +U 10089 ; WX 838 ; N uni2769 ; G 4081 +U 10090 ; WX 838 ; N uni276A ; G 4082 +U 10091 ; WX 838 ; N uni276B ; G 4083 +U 10092 ; WX 838 ; N uni276C ; G 4084 +U 10093 ; WX 838 ; N uni276D ; G 4085 +U 10094 ; WX 838 ; N uni276E ; G 4086 +U 10095 ; WX 838 ; N uni276F ; G 4087 +U 10096 ; WX 838 ; N uni2770 ; G 4088 +U 10097 ; WX 838 ; N uni2771 ; G 4089 +U 10098 ; WX 838 ; N uni2772 ; G 4090 +U 10099 ; WX 838 ; N uni2773 ; G 4091 +U 10100 ; WX 838 ; N uni2774 ; G 4092 +U 10101 ; WX 838 ; N uni2775 ; G 4093 +U 10102 ; WX 847 ; N uni2776 ; G 4094 +U 10103 ; WX 847 ; N uni2777 ; G 4095 +U 10104 ; WX 847 ; N uni2778 ; G 4096 +U 10105 ; WX 847 ; N uni2779 ; G 4097 +U 10106 ; WX 847 ; N uni277A ; G 4098 +U 10107 ; WX 847 ; N uni277B ; G 4099 +U 10108 ; WX 847 ; N uni277C ; G 4100 +U 10109 ; WX 847 ; N uni277D ; G 4101 +U 10110 ; WX 847 ; N uni277E ; G 4102 +U 10111 ; WX 847 ; N uni277F ; G 4103 +U 10112 ; WX 838 ; N uni2780 ; G 4104 +U 10113 ; WX 838 ; N uni2781 ; G 4105 +U 10114 ; WX 838 ; N uni2782 ; G 4106 +U 10115 ; WX 838 ; N uni2783 ; G 4107 +U 10116 ; WX 838 ; N uni2784 ; G 4108 +U 10117 ; WX 838 ; N uni2785 ; G 4109 +U 10118 ; WX 838 ; N uni2786 ; G 4110 +U 10119 ; WX 838 ; N uni2787 ; G 4111 +U 10120 ; WX 838 ; N uni2788 ; G 4112 +U 10121 ; WX 838 ; N uni2789 ; G 4113 +U 10122 ; WX 838 ; N uni278A ; G 4114 +U 10123 ; WX 838 ; N uni278B ; G 4115 +U 10124 ; WX 838 ; N uni278C ; G 4116 +U 10125 ; WX 838 ; N uni278D ; G 4117 +U 10126 ; WX 838 ; N uni278E ; G 4118 +U 10127 ; WX 838 ; N uni278F ; G 4119 +U 10128 ; WX 838 ; N uni2790 ; G 4120 +U 10129 ; WX 838 ; N uni2791 ; G 4121 +U 10130 ; WX 838 ; N uni2792 ; G 4122 +U 10131 ; WX 838 ; N uni2793 ; G 4123 +U 10132 ; WX 838 ; N uni2794 ; G 4124 +U 10136 ; WX 838 ; N uni2798 ; G 4125 +U 10137 ; WX 838 ; N uni2799 ; G 4126 +U 10138 ; WX 838 ; N uni279A ; G 4127 +U 10139 ; WX 838 ; N uni279B ; G 4128 +U 10140 ; WX 838 ; N uni279C ; G 4129 +U 10141 ; WX 838 ; N uni279D ; G 4130 +U 10142 ; WX 838 ; N uni279E ; G 4131 +U 10143 ; WX 838 ; N uni279F ; G 4132 +U 10144 ; WX 838 ; N uni27A0 ; G 4133 +U 10145 ; WX 838 ; N uni27A1 ; G 4134 +U 10146 ; WX 838 ; N uni27A2 ; G 4135 +U 10147 ; WX 838 ; N uni27A3 ; G 4136 +U 10148 ; WX 838 ; N uni27A4 ; G 4137 +U 10149 ; WX 838 ; N uni27A5 ; G 4138 +U 10150 ; WX 838 ; N uni27A6 ; G 4139 +U 10151 ; WX 838 ; N uni27A7 ; G 4140 +U 10152 ; WX 838 ; N uni27A8 ; G 4141 +U 10153 ; WX 838 ; N uni27A9 ; G 4142 +U 10154 ; WX 838 ; N uni27AA ; G 4143 +U 10155 ; WX 838 ; N uni27AB ; G 4144 +U 10156 ; WX 838 ; N uni27AC ; G 4145 +U 10157 ; WX 838 ; N uni27AD ; G 4146 +U 10158 ; WX 838 ; N uni27AE ; G 4147 +U 10159 ; WX 838 ; N uni27AF ; G 4148 +U 10161 ; WX 838 ; N uni27B1 ; G 4149 +U 10162 ; WX 838 ; N uni27B2 ; G 4150 +U 10163 ; WX 838 ; N uni27B3 ; G 4151 +U 10164 ; WX 838 ; N uni27B4 ; G 4152 +U 10165 ; WX 838 ; N uni27B5 ; G 4153 +U 10166 ; WX 838 ; N uni27B6 ; G 4154 +U 10167 ; WX 838 ; N uni27B7 ; G 4155 +U 10168 ; WX 838 ; N uni27B8 ; G 4156 +U 10169 ; WX 838 ; N uni27B9 ; G 4157 +U 10170 ; WX 838 ; N uni27BA ; G 4158 +U 10171 ; WX 838 ; N uni27BB ; G 4159 +U 10172 ; WX 838 ; N uni27BC ; G 4160 +U 10173 ; WX 838 ; N uni27BD ; G 4161 +U 10174 ; WX 838 ; N uni27BE ; G 4162 +U 10181 ; WX 457 ; N uni27C5 ; G 4163 +U 10182 ; WX 457 ; N uni27C6 ; G 4164 +U 10208 ; WX 494 ; N uni27E0 ; G 4165 +U 10214 ; WX 487 ; N uni27E6 ; G 4166 +U 10215 ; WX 487 ; N uni27E7 ; G 4167 +U 10216 ; WX 457 ; N uni27E8 ; G 4168 +U 10217 ; WX 457 ; N uni27E9 ; G 4169 +U 10218 ; WX 721 ; N uni27EA ; G 4170 +U 10219 ; WX 721 ; N uni27EB ; G 4171 +U 10224 ; WX 838 ; N uni27F0 ; G 4172 +U 10225 ; WX 838 ; N uni27F1 ; G 4173 +U 10226 ; WX 838 ; N uni27F2 ; G 4174 +U 10227 ; WX 838 ; N uni27F3 ; G 4175 +U 10228 ; WX 1157 ; N uni27F4 ; G 4176 +U 10229 ; WX 1434 ; N uni27F5 ; G 4177 +U 10230 ; WX 1434 ; N uni27F6 ; G 4178 +U 10231 ; WX 1434 ; N uni27F7 ; G 4179 +U 10232 ; WX 1434 ; N uni27F8 ; G 4180 +U 10233 ; WX 1434 ; N uni27F9 ; G 4181 +U 10234 ; WX 1434 ; N uni27FA ; G 4182 +U 10235 ; WX 1434 ; N uni27FB ; G 4183 +U 10236 ; WX 1434 ; N uni27FC ; G 4184 +U 10237 ; WX 1434 ; N uni27FD ; G 4185 +U 10238 ; WX 1434 ; N uni27FE ; G 4186 +U 10239 ; WX 1434 ; N uni27FF ; G 4187 +U 10240 ; WX 781 ; N uni2800 ; G 4188 +U 10241 ; WX 781 ; N uni2801 ; G 4189 +U 10242 ; WX 781 ; N uni2802 ; G 4190 +U 10243 ; WX 781 ; N uni2803 ; G 4191 +U 10244 ; WX 781 ; N uni2804 ; G 4192 +U 10245 ; WX 781 ; N uni2805 ; G 4193 +U 10246 ; WX 781 ; N uni2806 ; G 4194 +U 10247 ; WX 781 ; N uni2807 ; G 4195 +U 10248 ; WX 781 ; N uni2808 ; G 4196 +U 10249 ; WX 781 ; N uni2809 ; G 4197 +U 10250 ; WX 781 ; N uni280A ; G 4198 +U 10251 ; WX 781 ; N uni280B ; G 4199 +U 10252 ; WX 781 ; N uni280C ; G 4200 +U 10253 ; WX 781 ; N uni280D ; G 4201 +U 10254 ; WX 781 ; N uni280E ; G 4202 +U 10255 ; WX 781 ; N uni280F ; G 4203 +U 10256 ; WX 781 ; N uni2810 ; G 4204 +U 10257 ; WX 781 ; N uni2811 ; G 4205 +U 10258 ; WX 781 ; N uni2812 ; G 4206 +U 10259 ; WX 781 ; N uni2813 ; G 4207 +U 10260 ; WX 781 ; N uni2814 ; G 4208 +U 10261 ; WX 781 ; N uni2815 ; G 4209 +U 10262 ; WX 781 ; N uni2816 ; G 4210 +U 10263 ; WX 781 ; N uni2817 ; G 4211 +U 10264 ; WX 781 ; N uni2818 ; G 4212 +U 10265 ; WX 781 ; N uni2819 ; G 4213 +U 10266 ; WX 781 ; N uni281A ; G 4214 +U 10267 ; WX 781 ; N uni281B ; G 4215 +U 10268 ; WX 781 ; N uni281C ; G 4216 +U 10269 ; WX 781 ; N uni281D ; G 4217 +U 10270 ; WX 781 ; N uni281E ; G 4218 +U 10271 ; WX 781 ; N uni281F ; G 4219 +U 10272 ; WX 781 ; N uni2820 ; G 4220 +U 10273 ; WX 781 ; N uni2821 ; G 4221 +U 10274 ; WX 781 ; N uni2822 ; G 4222 +U 10275 ; WX 781 ; N uni2823 ; G 4223 +U 10276 ; WX 781 ; N uni2824 ; G 4224 +U 10277 ; WX 781 ; N uni2825 ; G 4225 +U 10278 ; WX 781 ; N uni2826 ; G 4226 +U 10279 ; WX 781 ; N uni2827 ; G 4227 +U 10280 ; WX 781 ; N uni2828 ; G 4228 +U 10281 ; WX 781 ; N uni2829 ; G 4229 +U 10282 ; WX 781 ; N uni282A ; G 4230 +U 10283 ; WX 781 ; N uni282B ; G 4231 +U 10284 ; WX 781 ; N uni282C ; G 4232 +U 10285 ; WX 781 ; N uni282D ; G 4233 +U 10286 ; WX 781 ; N uni282E ; G 4234 +U 10287 ; WX 781 ; N uni282F ; G 4235 +U 10288 ; WX 781 ; N uni2830 ; G 4236 +U 10289 ; WX 781 ; N uni2831 ; G 4237 +U 10290 ; WX 781 ; N uni2832 ; G 4238 +U 10291 ; WX 781 ; N uni2833 ; G 4239 +U 10292 ; WX 781 ; N uni2834 ; G 4240 +U 10293 ; WX 781 ; N uni2835 ; G 4241 +U 10294 ; WX 781 ; N uni2836 ; G 4242 +U 10295 ; WX 781 ; N uni2837 ; G 4243 +U 10296 ; WX 781 ; N uni2838 ; G 4244 +U 10297 ; WX 781 ; N uni2839 ; G 4245 +U 10298 ; WX 781 ; N uni283A ; G 4246 +U 10299 ; WX 781 ; N uni283B ; G 4247 +U 10300 ; WX 781 ; N uni283C ; G 4248 +U 10301 ; WX 781 ; N uni283D ; G 4249 +U 10302 ; WX 781 ; N uni283E ; G 4250 +U 10303 ; WX 781 ; N uni283F ; G 4251 +U 10304 ; WX 781 ; N uni2840 ; G 4252 +U 10305 ; WX 781 ; N uni2841 ; G 4253 +U 10306 ; WX 781 ; N uni2842 ; G 4254 +U 10307 ; WX 781 ; N uni2843 ; G 4255 +U 10308 ; WX 781 ; N uni2844 ; G 4256 +U 10309 ; WX 781 ; N uni2845 ; G 4257 +U 10310 ; WX 781 ; N uni2846 ; G 4258 +U 10311 ; WX 781 ; N uni2847 ; G 4259 +U 10312 ; WX 781 ; N uni2848 ; G 4260 +U 10313 ; WX 781 ; N uni2849 ; G 4261 +U 10314 ; WX 781 ; N uni284A ; G 4262 +U 10315 ; WX 781 ; N uni284B ; G 4263 +U 10316 ; WX 781 ; N uni284C ; G 4264 +U 10317 ; WX 781 ; N uni284D ; G 4265 +U 10318 ; WX 781 ; N uni284E ; G 4266 +U 10319 ; WX 781 ; N uni284F ; G 4267 +U 10320 ; WX 781 ; N uni2850 ; G 4268 +U 10321 ; WX 781 ; N uni2851 ; G 4269 +U 10322 ; WX 781 ; N uni2852 ; G 4270 +U 10323 ; WX 781 ; N uni2853 ; G 4271 +U 10324 ; WX 781 ; N uni2854 ; G 4272 +U 10325 ; WX 781 ; N uni2855 ; G 4273 +U 10326 ; WX 781 ; N uni2856 ; G 4274 +U 10327 ; WX 781 ; N uni2857 ; G 4275 +U 10328 ; WX 781 ; N uni2858 ; G 4276 +U 10329 ; WX 781 ; N uni2859 ; G 4277 +U 10330 ; WX 781 ; N uni285A ; G 4278 +U 10331 ; WX 781 ; N uni285B ; G 4279 +U 10332 ; WX 781 ; N uni285C ; G 4280 +U 10333 ; WX 781 ; N uni285D ; G 4281 +U 10334 ; WX 781 ; N uni285E ; G 4282 +U 10335 ; WX 781 ; N uni285F ; G 4283 +U 10336 ; WX 781 ; N uni2860 ; G 4284 +U 10337 ; WX 781 ; N uni2861 ; G 4285 +U 10338 ; WX 781 ; N uni2862 ; G 4286 +U 10339 ; WX 781 ; N uni2863 ; G 4287 +U 10340 ; WX 781 ; N uni2864 ; G 4288 +U 10341 ; WX 781 ; N uni2865 ; G 4289 +U 10342 ; WX 781 ; N uni2866 ; G 4290 +U 10343 ; WX 781 ; N uni2867 ; G 4291 +U 10344 ; WX 781 ; N uni2868 ; G 4292 +U 10345 ; WX 781 ; N uni2869 ; G 4293 +U 10346 ; WX 781 ; N uni286A ; G 4294 +U 10347 ; WX 781 ; N uni286B ; G 4295 +U 10348 ; WX 781 ; N uni286C ; G 4296 +U 10349 ; WX 781 ; N uni286D ; G 4297 +U 10350 ; WX 781 ; N uni286E ; G 4298 +U 10351 ; WX 781 ; N uni286F ; G 4299 +U 10352 ; WX 781 ; N uni2870 ; G 4300 +U 10353 ; WX 781 ; N uni2871 ; G 4301 +U 10354 ; WX 781 ; N uni2872 ; G 4302 +U 10355 ; WX 781 ; N uni2873 ; G 4303 +U 10356 ; WX 781 ; N uni2874 ; G 4304 +U 10357 ; WX 781 ; N uni2875 ; G 4305 +U 10358 ; WX 781 ; N uni2876 ; G 4306 +U 10359 ; WX 781 ; N uni2877 ; G 4307 +U 10360 ; WX 781 ; N uni2878 ; G 4308 +U 10361 ; WX 781 ; N uni2879 ; G 4309 +U 10362 ; WX 781 ; N uni287A ; G 4310 +U 10363 ; WX 781 ; N uni287B ; G 4311 +U 10364 ; WX 781 ; N uni287C ; G 4312 +U 10365 ; WX 781 ; N uni287D ; G 4313 +U 10366 ; WX 781 ; N uni287E ; G 4314 +U 10367 ; WX 781 ; N uni287F ; G 4315 +U 10368 ; WX 781 ; N uni2880 ; G 4316 +U 10369 ; WX 781 ; N uni2881 ; G 4317 +U 10370 ; WX 781 ; N uni2882 ; G 4318 +U 10371 ; WX 781 ; N uni2883 ; G 4319 +U 10372 ; WX 781 ; N uni2884 ; G 4320 +U 10373 ; WX 781 ; N uni2885 ; G 4321 +U 10374 ; WX 781 ; N uni2886 ; G 4322 +U 10375 ; WX 781 ; N uni2887 ; G 4323 +U 10376 ; WX 781 ; N uni2888 ; G 4324 +U 10377 ; WX 781 ; N uni2889 ; G 4325 +U 10378 ; WX 781 ; N uni288A ; G 4326 +U 10379 ; WX 781 ; N uni288B ; G 4327 +U 10380 ; WX 781 ; N uni288C ; G 4328 +U 10381 ; WX 781 ; N uni288D ; G 4329 +U 10382 ; WX 781 ; N uni288E ; G 4330 +U 10383 ; WX 781 ; N uni288F ; G 4331 +U 10384 ; WX 781 ; N uni2890 ; G 4332 +U 10385 ; WX 781 ; N uni2891 ; G 4333 +U 10386 ; WX 781 ; N uni2892 ; G 4334 +U 10387 ; WX 781 ; N uni2893 ; G 4335 +U 10388 ; WX 781 ; N uni2894 ; G 4336 +U 10389 ; WX 781 ; N uni2895 ; G 4337 +U 10390 ; WX 781 ; N uni2896 ; G 4338 +U 10391 ; WX 781 ; N uni2897 ; G 4339 +U 10392 ; WX 781 ; N uni2898 ; G 4340 +U 10393 ; WX 781 ; N uni2899 ; G 4341 +U 10394 ; WX 781 ; N uni289A ; G 4342 +U 10395 ; WX 781 ; N uni289B ; G 4343 +U 10396 ; WX 781 ; N uni289C ; G 4344 +U 10397 ; WX 781 ; N uni289D ; G 4345 +U 10398 ; WX 781 ; N uni289E ; G 4346 +U 10399 ; WX 781 ; N uni289F ; G 4347 +U 10400 ; WX 781 ; N uni28A0 ; G 4348 +U 10401 ; WX 781 ; N uni28A1 ; G 4349 +U 10402 ; WX 781 ; N uni28A2 ; G 4350 +U 10403 ; WX 781 ; N uni28A3 ; G 4351 +U 10404 ; WX 781 ; N uni28A4 ; G 4352 +U 10405 ; WX 781 ; N uni28A5 ; G 4353 +U 10406 ; WX 781 ; N uni28A6 ; G 4354 +U 10407 ; WX 781 ; N uni28A7 ; G 4355 +U 10408 ; WX 781 ; N uni28A8 ; G 4356 +U 10409 ; WX 781 ; N uni28A9 ; G 4357 +U 10410 ; WX 781 ; N uni28AA ; G 4358 +U 10411 ; WX 781 ; N uni28AB ; G 4359 +U 10412 ; WX 781 ; N uni28AC ; G 4360 +U 10413 ; WX 781 ; N uni28AD ; G 4361 +U 10414 ; WX 781 ; N uni28AE ; G 4362 +U 10415 ; WX 781 ; N uni28AF ; G 4363 +U 10416 ; WX 781 ; N uni28B0 ; G 4364 +U 10417 ; WX 781 ; N uni28B1 ; G 4365 +U 10418 ; WX 781 ; N uni28B2 ; G 4366 +U 10419 ; WX 781 ; N uni28B3 ; G 4367 +U 10420 ; WX 781 ; N uni28B4 ; G 4368 +U 10421 ; WX 781 ; N uni28B5 ; G 4369 +U 10422 ; WX 781 ; N uni28B6 ; G 4370 +U 10423 ; WX 781 ; N uni28B7 ; G 4371 +U 10424 ; WX 781 ; N uni28B8 ; G 4372 +U 10425 ; WX 781 ; N uni28B9 ; G 4373 +U 10426 ; WX 781 ; N uni28BA ; G 4374 +U 10427 ; WX 781 ; N uni28BB ; G 4375 +U 10428 ; WX 781 ; N uni28BC ; G 4376 +U 10429 ; WX 781 ; N uni28BD ; G 4377 +U 10430 ; WX 781 ; N uni28BE ; G 4378 +U 10431 ; WX 781 ; N uni28BF ; G 4379 +U 10432 ; WX 781 ; N uni28C0 ; G 4380 +U 10433 ; WX 781 ; N uni28C1 ; G 4381 +U 10434 ; WX 781 ; N uni28C2 ; G 4382 +U 10435 ; WX 781 ; N uni28C3 ; G 4383 +U 10436 ; WX 781 ; N uni28C4 ; G 4384 +U 10437 ; WX 781 ; N uni28C5 ; G 4385 +U 10438 ; WX 781 ; N uni28C6 ; G 4386 +U 10439 ; WX 781 ; N uni28C7 ; G 4387 +U 10440 ; WX 781 ; N uni28C8 ; G 4388 +U 10441 ; WX 781 ; N uni28C9 ; G 4389 +U 10442 ; WX 781 ; N uni28CA ; G 4390 +U 10443 ; WX 781 ; N uni28CB ; G 4391 +U 10444 ; WX 781 ; N uni28CC ; G 4392 +U 10445 ; WX 781 ; N uni28CD ; G 4393 +U 10446 ; WX 781 ; N uni28CE ; G 4394 +U 10447 ; WX 781 ; N uni28CF ; G 4395 +U 10448 ; WX 781 ; N uni28D0 ; G 4396 +U 10449 ; WX 781 ; N uni28D1 ; G 4397 +U 10450 ; WX 781 ; N uni28D2 ; G 4398 +U 10451 ; WX 781 ; N uni28D3 ; G 4399 +U 10452 ; WX 781 ; N uni28D4 ; G 4400 +U 10453 ; WX 781 ; N uni28D5 ; G 4401 +U 10454 ; WX 781 ; N uni28D6 ; G 4402 +U 10455 ; WX 781 ; N uni28D7 ; G 4403 +U 10456 ; WX 781 ; N uni28D8 ; G 4404 +U 10457 ; WX 781 ; N uni28D9 ; G 4405 +U 10458 ; WX 781 ; N uni28DA ; G 4406 +U 10459 ; WX 781 ; N uni28DB ; G 4407 +U 10460 ; WX 781 ; N uni28DC ; G 4408 +U 10461 ; WX 781 ; N uni28DD ; G 4409 +U 10462 ; WX 781 ; N uni28DE ; G 4410 +U 10463 ; WX 781 ; N uni28DF ; G 4411 +U 10464 ; WX 781 ; N uni28E0 ; G 4412 +U 10465 ; WX 781 ; N uni28E1 ; G 4413 +U 10466 ; WX 781 ; N uni28E2 ; G 4414 +U 10467 ; WX 781 ; N uni28E3 ; G 4415 +U 10468 ; WX 781 ; N uni28E4 ; G 4416 +U 10469 ; WX 781 ; N uni28E5 ; G 4417 +U 10470 ; WX 781 ; N uni28E6 ; G 4418 +U 10471 ; WX 781 ; N uni28E7 ; G 4419 +U 10472 ; WX 781 ; N uni28E8 ; G 4420 +U 10473 ; WX 781 ; N uni28E9 ; G 4421 +U 10474 ; WX 781 ; N uni28EA ; G 4422 +U 10475 ; WX 781 ; N uni28EB ; G 4423 +U 10476 ; WX 781 ; N uni28EC ; G 4424 +U 10477 ; WX 781 ; N uni28ED ; G 4425 +U 10478 ; WX 781 ; N uni28EE ; G 4426 +U 10479 ; WX 781 ; N uni28EF ; G 4427 +U 10480 ; WX 781 ; N uni28F0 ; G 4428 +U 10481 ; WX 781 ; N uni28F1 ; G 4429 +U 10482 ; WX 781 ; N uni28F2 ; G 4430 +U 10483 ; WX 781 ; N uni28F3 ; G 4431 +U 10484 ; WX 781 ; N uni28F4 ; G 4432 +U 10485 ; WX 781 ; N uni28F5 ; G 4433 +U 10486 ; WX 781 ; N uni28F6 ; G 4434 +U 10487 ; WX 781 ; N uni28F7 ; G 4435 +U 10488 ; WX 781 ; N uni28F8 ; G 4436 +U 10489 ; WX 781 ; N uni28F9 ; G 4437 +U 10490 ; WX 781 ; N uni28FA ; G 4438 +U 10491 ; WX 781 ; N uni28FB ; G 4439 +U 10492 ; WX 781 ; N uni28FC ; G 4440 +U 10493 ; WX 781 ; N uni28FD ; G 4441 +U 10494 ; WX 781 ; N uni28FE ; G 4442 +U 10495 ; WX 781 ; N uni28FF ; G 4443 +U 10502 ; WX 838 ; N uni2906 ; G 4444 +U 10503 ; WX 838 ; N uni2907 ; G 4445 +U 10506 ; WX 838 ; N uni290A ; G 4446 +U 10507 ; WX 838 ; N uni290B ; G 4447 +U 10560 ; WX 838 ; N uni2940 ; G 4448 +U 10561 ; WX 838 ; N uni2941 ; G 4449 +U 10627 ; WX 753 ; N uni2983 ; G 4450 +U 10628 ; WX 753 ; N uni2984 ; G 4451 +U 10702 ; WX 838 ; N uni29CE ; G 4452 +U 10703 ; WX 1046 ; N uni29CF ; G 4453 +U 10704 ; WX 1046 ; N uni29D0 ; G 4454 +U 10705 ; WX 1000 ; N uni29D1 ; G 4455 +U 10706 ; WX 1000 ; N uni29D2 ; G 4456 +U 10707 ; WX 1000 ; N uni29D3 ; G 4457 +U 10708 ; WX 1000 ; N uni29D4 ; G 4458 +U 10709 ; WX 1000 ; N uni29D5 ; G 4459 +U 10731 ; WX 494 ; N uni29EB ; G 4460 +U 10746 ; WX 838 ; N uni29FA ; G 4461 +U 10747 ; WX 838 ; N uni29FB ; G 4462 +U 10752 ; WX 1000 ; N uni2A00 ; G 4463 +U 10753 ; WX 1000 ; N uni2A01 ; G 4464 +U 10754 ; WX 1000 ; N uni2A02 ; G 4465 +U 10764 ; WX 1661 ; N uni2A0C ; G 4466 +U 10765 ; WX 563 ; N uni2A0D ; G 4467 +U 10766 ; WX 563 ; N uni2A0E ; G 4468 +U 10767 ; WX 563 ; N uni2A0F ; G 4469 +U 10768 ; WX 563 ; N uni2A10 ; G 4470 +U 10769 ; WX 563 ; N uni2A11 ; G 4471 +U 10770 ; WX 563 ; N uni2A12 ; G 4472 +U 10771 ; WX 563 ; N uni2A13 ; G 4473 +U 10772 ; WX 563 ; N uni2A14 ; G 4474 +U 10773 ; WX 563 ; N uni2A15 ; G 4475 +U 10774 ; WX 563 ; N uni2A16 ; G 4476 +U 10775 ; WX 563 ; N uni2A17 ; G 4477 +U 10776 ; WX 563 ; N uni2A18 ; G 4478 +U 10777 ; WX 563 ; N uni2A19 ; G 4479 +U 10778 ; WX 563 ; N uni2A1A ; G 4480 +U 10779 ; WX 563 ; N uni2A1B ; G 4481 +U 10780 ; WX 563 ; N uni2A1C ; G 4482 +U 10799 ; WX 838 ; N uni2A2F ; G 4483 +U 10858 ; WX 838 ; N uni2A6A ; G 4484 +U 10859 ; WX 838 ; N uni2A6B ; G 4485 +U 10877 ; WX 838 ; N uni2A7D ; G 4486 +U 10878 ; WX 838 ; N uni2A7E ; G 4487 +U 10879 ; WX 838 ; N uni2A7F ; G 4488 +U 10880 ; WX 838 ; N uni2A80 ; G 4489 +U 10881 ; WX 838 ; N uni2A81 ; G 4490 +U 10882 ; WX 838 ; N uni2A82 ; G 4491 +U 10883 ; WX 838 ; N uni2A83 ; G 4492 +U 10884 ; WX 838 ; N uni2A84 ; G 4493 +U 10885 ; WX 838 ; N uni2A85 ; G 4494 +U 10886 ; WX 838 ; N uni2A86 ; G 4495 +U 10887 ; WX 838 ; N uni2A87 ; G 4496 +U 10888 ; WX 838 ; N uni2A88 ; G 4497 +U 10889 ; WX 838 ; N uni2A89 ; G 4498 +U 10890 ; WX 838 ; N uni2A8A ; G 4499 +U 10891 ; WX 838 ; N uni2A8B ; G 4500 +U 10892 ; WX 838 ; N uni2A8C ; G 4501 +U 10893 ; WX 838 ; N uni2A8D ; G 4502 +U 10894 ; WX 838 ; N uni2A8E ; G 4503 +U 10895 ; WX 838 ; N uni2A8F ; G 4504 +U 10896 ; WX 838 ; N uni2A90 ; G 4505 +U 10897 ; WX 838 ; N uni2A91 ; G 4506 +U 10898 ; WX 838 ; N uni2A92 ; G 4507 +U 10899 ; WX 838 ; N uni2A93 ; G 4508 +U 10900 ; WX 838 ; N uni2A94 ; G 4509 +U 10901 ; WX 838 ; N uni2A95 ; G 4510 +U 10902 ; WX 838 ; N uni2A96 ; G 4511 +U 10903 ; WX 838 ; N uni2A97 ; G 4512 +U 10904 ; WX 838 ; N uni2A98 ; G 4513 +U 10905 ; WX 838 ; N uni2A99 ; G 4514 +U 10906 ; WX 838 ; N uni2A9A ; G 4515 +U 10907 ; WX 838 ; N uni2A9B ; G 4516 +U 10908 ; WX 838 ; N uni2A9C ; G 4517 +U 10909 ; WX 838 ; N uni2A9D ; G 4518 +U 10910 ; WX 838 ; N uni2A9E ; G 4519 +U 10911 ; WX 838 ; N uni2A9F ; G 4520 +U 10912 ; WX 838 ; N uni2AA0 ; G 4521 +U 10926 ; WX 838 ; N uni2AAE ; G 4522 +U 10927 ; WX 838 ; N uni2AAF ; G 4523 +U 10928 ; WX 838 ; N uni2AB0 ; G 4524 +U 10929 ; WX 838 ; N uni2AB1 ; G 4525 +U 10930 ; WX 838 ; N uni2AB2 ; G 4526 +U 10931 ; WX 838 ; N uni2AB3 ; G 4527 +U 10932 ; WX 838 ; N uni2AB4 ; G 4528 +U 10933 ; WX 838 ; N uni2AB5 ; G 4529 +U 10934 ; WX 838 ; N uni2AB6 ; G 4530 +U 10935 ; WX 838 ; N uni2AB7 ; G 4531 +U 10936 ; WX 838 ; N uni2AB8 ; G 4532 +U 10937 ; WX 838 ; N uni2AB9 ; G 4533 +U 10938 ; WX 838 ; N uni2ABA ; G 4534 +U 11001 ; WX 838 ; N uni2AF9 ; G 4535 +U 11002 ; WX 838 ; N uni2AFA ; G 4536 +U 11008 ; WX 838 ; N uni2B00 ; G 4537 +U 11009 ; WX 838 ; N uni2B01 ; G 4538 +U 11010 ; WX 838 ; N uni2B02 ; G 4539 +U 11011 ; WX 838 ; N uni2B03 ; G 4540 +U 11012 ; WX 838 ; N uni2B04 ; G 4541 +U 11013 ; WX 838 ; N uni2B05 ; G 4542 +U 11014 ; WX 838 ; N uni2B06 ; G 4543 +U 11015 ; WX 838 ; N uni2B07 ; G 4544 +U 11016 ; WX 838 ; N uni2B08 ; G 4545 +U 11017 ; WX 838 ; N uni2B09 ; G 4546 +U 11018 ; WX 838 ; N uni2B0A ; G 4547 +U 11019 ; WX 838 ; N uni2B0B ; G 4548 +U 11020 ; WX 838 ; N uni2B0C ; G 4549 +U 11021 ; WX 838 ; N uni2B0D ; G 4550 +U 11022 ; WX 838 ; N uni2B0E ; G 4551 +U 11023 ; WX 838 ; N uni2B0F ; G 4552 +U 11024 ; WX 838 ; N uni2B10 ; G 4553 +U 11025 ; WX 838 ; N uni2B11 ; G 4554 +U 11026 ; WX 945 ; N uni2B12 ; G 4555 +U 11027 ; WX 945 ; N uni2B13 ; G 4556 +U 11028 ; WX 945 ; N uni2B14 ; G 4557 +U 11029 ; WX 945 ; N uni2B15 ; G 4558 +U 11030 ; WX 769 ; N uni2B16 ; G 4559 +U 11031 ; WX 769 ; N uni2B17 ; G 4560 +U 11032 ; WX 769 ; N uni2B18 ; G 4561 +U 11033 ; WX 769 ; N uni2B19 ; G 4562 +U 11034 ; WX 945 ; N uni2B1A ; G 4563 +U 11039 ; WX 869 ; N uni2B1F ; G 4564 +U 11040 ; WX 869 ; N uni2B20 ; G 4565 +U 11041 ; WX 873 ; N uni2B21 ; G 4566 +U 11042 ; WX 873 ; N uni2B22 ; G 4567 +U 11043 ; WX 873 ; N uni2B23 ; G 4568 +U 11044 ; WX 1119 ; N uni2B24 ; G 4569 +U 11091 ; WX 869 ; N uni2B53 ; G 4570 +U 11092 ; WX 869 ; N uni2B54 ; G 4571 +U 11360 ; WX 637 ; N uni2C60 ; G 4572 +U 11361 ; WX 360 ; N uni2C61 ; G 4573 +U 11362 ; WX 637 ; N uni2C62 ; G 4574 +U 11363 ; WX 733 ; N uni2C63 ; G 4575 +U 11364 ; WX 770 ; N uni2C64 ; G 4576 +U 11365 ; WX 675 ; N uni2C65 ; G 4577 +U 11366 ; WX 478 ; N uni2C66 ; G 4578 +U 11367 ; WX 956 ; N uni2C67 ; G 4579 +U 11368 ; WX 712 ; N uni2C68 ; G 4580 +U 11369 ; WX 775 ; N uni2C69 ; G 4581 +U 11370 ; WX 665 ; N uni2C6A ; G 4582 +U 11371 ; WX 725 ; N uni2C6B ; G 4583 +U 11372 ; WX 582 ; N uni2C6C ; G 4584 +U 11373 ; WX 860 ; N uni2C6D ; G 4585 +U 11374 ; WX 995 ; N uni2C6E ; G 4586 +U 11375 ; WX 774 ; N uni2C6F ; G 4587 +U 11376 ; WX 860 ; N uni2C70 ; G 4588 +U 11377 ; WX 778 ; N uni2C71 ; G 4589 +U 11378 ; WX 1221 ; N uni2C72 ; G 4590 +U 11379 ; WX 1056 ; N uni2C73 ; G 4591 +U 11380 ; WX 652 ; N uni2C74 ; G 4592 +U 11381 ; WX 698 ; N uni2C75 ; G 4593 +U 11382 ; WX 565 ; N uni2C76 ; G 4594 +U 11383 ; WX 782 ; N uni2C77 ; G 4595 +U 11385 ; WX 538 ; N uni2C79 ; G 4596 +U 11386 ; WX 687 ; N uni2C7A ; G 4597 +U 11387 ; WX 559 ; N uni2C7B ; G 4598 +U 11388 ; WX 219 ; N uni2C7C ; G 4599 +U 11389 ; WX 487 ; N uni2C7D ; G 4600 +U 11390 ; WX 720 ; N uni2C7E ; G 4601 +U 11391 ; WX 725 ; N uni2C7F ; G 4602 +U 11520 ; WX 663 ; N uni2D00 ; G 4603 +U 11521 ; WX 676 ; N uni2D01 ; G 4604 +U 11522 ; WX 661 ; N uni2D02 ; G 4605 +U 11523 ; WX 629 ; N uni2D03 ; G 4606 +U 11524 ; WX 661 ; N uni2D04 ; G 4607 +U 11525 ; WX 1032 ; N uni2D05 ; G 4608 +U 11526 ; WX 718 ; N uni2D06 ; G 4609 +U 11527 ; WX 1032 ; N uni2D07 ; G 4610 +U 11528 ; WX 648 ; N uni2D08 ; G 4611 +U 11529 ; WX 667 ; N uni2D09 ; G 4612 +U 11530 ; WX 1032 ; N uni2D0A ; G 4613 +U 11531 ; WX 673 ; N uni2D0B ; G 4614 +U 11532 ; WX 677 ; N uni2D0C ; G 4615 +U 11533 ; WX 1036 ; N uni2D0D ; G 4616 +U 11534 ; WX 680 ; N uni2D0E ; G 4617 +U 11535 ; WX 886 ; N uni2D0F ; G 4618 +U 11536 ; WX 1032 ; N uni2D10 ; G 4619 +U 11537 ; WX 683 ; N uni2D11 ; G 4620 +U 11538 ; WX 674 ; N uni2D12 ; G 4621 +U 11539 ; WX 1035 ; N uni2D13 ; G 4622 +U 11540 ; WX 1033 ; N uni2D14 ; G 4623 +U 11541 ; WX 1027 ; N uni2D15 ; G 4624 +U 11542 ; WX 676 ; N uni2D16 ; G 4625 +U 11543 ; WX 673 ; N uni2D17 ; G 4626 +U 11544 ; WX 667 ; N uni2D18 ; G 4627 +U 11545 ; WX 667 ; N uni2D19 ; G 4628 +U 11546 ; WX 660 ; N uni2D1A ; G 4629 +U 11547 ; WX 671 ; N uni2D1B ; G 4630 +U 11548 ; WX 1039 ; N uni2D1C ; G 4631 +U 11549 ; WX 673 ; N uni2D1D ; G 4632 +U 11550 ; WX 692 ; N uni2D1E ; G 4633 +U 11551 ; WX 659 ; N uni2D1F ; G 4634 +U 11552 ; WX 1048 ; N uni2D20 ; G 4635 +U 11553 ; WX 660 ; N uni2D21 ; G 4636 +U 11554 ; WX 654 ; N uni2D22 ; G 4637 +U 11555 ; WX 670 ; N uni2D23 ; G 4638 +U 11556 ; WX 733 ; N uni2D24 ; G 4639 +U 11557 ; WX 1017 ; N uni2D25 ; G 4640 +U 11568 ; WX 691 ; N uni2D30 ; G 4641 +U 11569 ; WX 941 ; N uni2D31 ; G 4642 +U 11570 ; WX 941 ; N uni2D32 ; G 4643 +U 11571 ; WX 725 ; N uni2D33 ; G 4644 +U 11572 ; WX 725 ; N uni2D34 ; G 4645 +U 11573 ; WX 725 ; N uni2D35 ; G 4646 +U 11574 ; WX 676 ; N uni2D36 ; G 4647 +U 11575 ; WX 774 ; N uni2D37 ; G 4648 +U 11576 ; WX 774 ; N uni2D38 ; G 4649 +U 11577 ; WX 683 ; N uni2D39 ; G 4650 +U 11578 ; WX 683 ; N uni2D3A ; G 4651 +U 11579 ; WX 802 ; N uni2D3B ; G 4652 +U 11580 ; WX 989 ; N uni2D3C ; G 4653 +U 11581 ; WX 761 ; N uni2D3D ; G 4654 +U 11582 ; WX 623 ; N uni2D3E ; G 4655 +U 11583 ; WX 761 ; N uni2D3F ; G 4656 +U 11584 ; WX 941 ; N uni2D40 ; G 4657 +U 11585 ; WX 941 ; N uni2D41 ; G 4658 +U 11586 ; WX 373 ; N uni2D42 ; G 4659 +U 11587 ; WX 740 ; N uni2D43 ; G 4660 +U 11588 ; WX 837 ; N uni2D44 ; G 4661 +U 11589 ; WX 914 ; N uni2D45 ; G 4662 +U 11590 ; WX 672 ; N uni2D46 ; G 4663 +U 11591 ; WX 737 ; N uni2D47 ; G 4664 +U 11592 ; WX 680 ; N uni2D48 ; G 4665 +U 11593 ; WX 683 ; N uni2D49 ; G 4666 +U 11594 ; WX 602 ; N uni2D4A ; G 4667 +U 11595 ; WX 1039 ; N uni2D4B ; G 4668 +U 11596 ; WX 778 ; N uni2D4C ; G 4669 +U 11597 ; WX 837 ; N uni2D4D ; G 4670 +U 11598 ; WX 683 ; N uni2D4E ; G 4671 +U 11599 ; WX 372 ; N uni2D4F ; G 4672 +U 11600 ; WX 778 ; N uni2D50 ; G 4673 +U 11601 ; WX 373 ; N uni2D51 ; G 4674 +U 11602 ; WX 725 ; N uni2D52 ; G 4675 +U 11603 ; WX 691 ; N uni2D53 ; G 4676 +U 11604 ; WX 941 ; N uni2D54 ; G 4677 +U 11605 ; WX 941 ; N uni2D55 ; G 4678 +U 11606 ; WX 837 ; N uni2D56 ; G 4679 +U 11607 ; WX 373 ; N uni2D57 ; G 4680 +U 11608 ; WX 836 ; N uni2D58 ; G 4681 +U 11609 ; WX 941 ; N uni2D59 ; G 4682 +U 11610 ; WX 941 ; N uni2D5A ; G 4683 +U 11611 ; WX 734 ; N uni2D5B ; G 4684 +U 11612 ; WX 876 ; N uni2D5C ; G 4685 +U 11613 ; WX 771 ; N uni2D5D ; G 4686 +U 11614 ; WX 734 ; N uni2D5E ; G 4687 +U 11615 ; WX 683 ; N uni2D5F ; G 4688 +U 11616 ; WX 774 ; N uni2D60 ; G 4689 +U 11617 ; WX 837 ; N uni2D61 ; G 4690 +U 11618 ; WX 683 ; N uni2D62 ; G 4691 +U 11619 ; WX 850 ; N uni2D63 ; G 4692 +U 11620 ; WX 697 ; N uni2D64 ; G 4693 +U 11621 ; WX 850 ; N uni2D65 ; G 4694 +U 11631 ; WX 716 ; N uni2D6F ; G 4695 +U 11800 ; WX 580 ; N uni2E18 ; G 4696 +U 11807 ; WX 838 ; N uni2E1F ; G 4697 +U 11810 ; WX 457 ; N uni2E22 ; G 4698 +U 11811 ; WX 457 ; N uni2E23 ; G 4699 +U 11812 ; WX 457 ; N uni2E24 ; G 4700 +U 11813 ; WX 457 ; N uni2E25 ; G 4701 +U 11822 ; WX 580 ; N uni2E2E ; G 4702 +U 19904 ; WX 896 ; N uni4DC0 ; G 4703 +U 19905 ; WX 896 ; N uni4DC1 ; G 4704 +U 19906 ; WX 896 ; N uni4DC2 ; G 4705 +U 19907 ; WX 896 ; N uni4DC3 ; G 4706 +U 19908 ; WX 896 ; N uni4DC4 ; G 4707 +U 19909 ; WX 896 ; N uni4DC5 ; G 4708 +U 19910 ; WX 896 ; N uni4DC6 ; G 4709 +U 19911 ; WX 896 ; N uni4DC7 ; G 4710 +U 19912 ; WX 896 ; N uni4DC8 ; G 4711 +U 19913 ; WX 896 ; N uni4DC9 ; G 4712 +U 19914 ; WX 896 ; N uni4DCA ; G 4713 +U 19915 ; WX 896 ; N uni4DCB ; G 4714 +U 19916 ; WX 896 ; N uni4DCC ; G 4715 +U 19917 ; WX 896 ; N uni4DCD ; G 4716 +U 19918 ; WX 896 ; N uni4DCE ; G 4717 +U 19919 ; WX 896 ; N uni4DCF ; G 4718 +U 19920 ; WX 896 ; N uni4DD0 ; G 4719 +U 19921 ; WX 896 ; N uni4DD1 ; G 4720 +U 19922 ; WX 896 ; N uni4DD2 ; G 4721 +U 19923 ; WX 896 ; N uni4DD3 ; G 4722 +U 19924 ; WX 896 ; N uni4DD4 ; G 4723 +U 19925 ; WX 896 ; N uni4DD5 ; G 4724 +U 19926 ; WX 896 ; N uni4DD6 ; G 4725 +U 19927 ; WX 896 ; N uni4DD7 ; G 4726 +U 19928 ; WX 896 ; N uni4DD8 ; G 4727 +U 19929 ; WX 896 ; N uni4DD9 ; G 4728 +U 19930 ; WX 896 ; N uni4DDA ; G 4729 +U 19931 ; WX 896 ; N uni4DDB ; G 4730 +U 19932 ; WX 896 ; N uni4DDC ; G 4731 +U 19933 ; WX 896 ; N uni4DDD ; G 4732 +U 19934 ; WX 896 ; N uni4DDE ; G 4733 +U 19935 ; WX 896 ; N uni4DDF ; G 4734 +U 19936 ; WX 896 ; N uni4DE0 ; G 4735 +U 19937 ; WX 896 ; N uni4DE1 ; G 4736 +U 19938 ; WX 896 ; N uni4DE2 ; G 4737 +U 19939 ; WX 896 ; N uni4DE3 ; G 4738 +U 19940 ; WX 896 ; N uni4DE4 ; G 4739 +U 19941 ; WX 896 ; N uni4DE5 ; G 4740 +U 19942 ; WX 896 ; N uni4DE6 ; G 4741 +U 19943 ; WX 896 ; N uni4DE7 ; G 4742 +U 19944 ; WX 896 ; N uni4DE8 ; G 4743 +U 19945 ; WX 896 ; N uni4DE9 ; G 4744 +U 19946 ; WX 896 ; N uni4DEA ; G 4745 +U 19947 ; WX 896 ; N uni4DEB ; G 4746 +U 19948 ; WX 896 ; N uni4DEC ; G 4747 +U 19949 ; WX 896 ; N uni4DED ; G 4748 +U 19950 ; WX 896 ; N uni4DEE ; G 4749 +U 19951 ; WX 896 ; N uni4DEF ; G 4750 +U 19952 ; WX 896 ; N uni4DF0 ; G 4751 +U 19953 ; WX 896 ; N uni4DF1 ; G 4752 +U 19954 ; WX 896 ; N uni4DF2 ; G 4753 +U 19955 ; WX 896 ; N uni4DF3 ; G 4754 +U 19956 ; WX 896 ; N uni4DF4 ; G 4755 +U 19957 ; WX 896 ; N uni4DF5 ; G 4756 +U 19958 ; WX 896 ; N uni4DF6 ; G 4757 +U 19959 ; WX 896 ; N uni4DF7 ; G 4758 +U 19960 ; WX 896 ; N uni4DF8 ; G 4759 +U 19961 ; WX 896 ; N uni4DF9 ; G 4760 +U 19962 ; WX 896 ; N uni4DFA ; G 4761 +U 19963 ; WX 896 ; N uni4DFB ; G 4762 +U 19964 ; WX 896 ; N uni4DFC ; G 4763 +U 19965 ; WX 896 ; N uni4DFD ; G 4764 +U 19966 ; WX 896 ; N uni4DFE ; G 4765 +U 19967 ; WX 896 ; N uni4DFF ; G 4766 +U 42192 ; WX 762 ; N uniA4D0 ; G 4767 +U 42193 ; WX 733 ; N uniA4D1 ; G 4768 +U 42194 ; WX 733 ; N uniA4D2 ; G 4769 +U 42195 ; WX 830 ; N uniA4D3 ; G 4770 +U 42196 ; WX 682 ; N uniA4D4 ; G 4771 +U 42197 ; WX 682 ; N uniA4D5 ; G 4772 +U 42198 ; WX 821 ; N uniA4D6 ; G 4773 +U 42199 ; WX 775 ; N uniA4D7 ; G 4774 +U 42200 ; WX 775 ; N uniA4D8 ; G 4775 +U 42201 ; WX 530 ; N uniA4D9 ; G 4776 +U 42202 ; WX 734 ; N uniA4DA ; G 4777 +U 42203 ; WX 734 ; N uniA4DB ; G 4778 +U 42204 ; WX 725 ; N uniA4DC ; G 4779 +U 42205 ; WX 683 ; N uniA4DD ; G 4780 +U 42206 ; WX 683 ; N uniA4DE ; G 4781 +U 42207 ; WX 995 ; N uniA4DF ; G 4782 +U 42208 ; WX 837 ; N uniA4E0 ; G 4783 +U 42209 ; WX 637 ; N uniA4E1 ; G 4784 +U 42210 ; WX 720 ; N uniA4E2 ; G 4785 +U 42211 ; WX 770 ; N uniA4E3 ; G 4786 +U 42212 ; WX 770 ; N uniA4E4 ; G 4787 +U 42213 ; WX 774 ; N uniA4E5 ; G 4788 +U 42214 ; WX 774 ; N uniA4E6 ; G 4789 +U 42215 ; WX 837 ; N uniA4E7 ; G 4790 +U 42216 ; WX 775 ; N uniA4E8 ; G 4791 +U 42217 ; WX 530 ; N uniA4E9 ; G 4792 +U 42218 ; WX 1103 ; N uniA4EA ; G 4793 +U 42219 ; WX 771 ; N uniA4EB ; G 4794 +U 42220 ; WX 724 ; N uniA4EC ; G 4795 +U 42221 ; WX 762 ; N uniA4ED ; G 4796 +U 42222 ; WX 774 ; N uniA4EE ; G 4797 +U 42223 ; WX 774 ; N uniA4EF ; G 4798 +U 42224 ; WX 683 ; N uniA4F0 ; G 4799 +U 42225 ; WX 683 ; N uniA4F1 ; G 4800 +U 42226 ; WX 372 ; N uniA4F2 ; G 4801 +U 42227 ; WX 850 ; N uniA4F3 ; G 4802 +U 42228 ; WX 812 ; N uniA4F4 ; G 4803 +U 42229 ; WX 812 ; N uniA4F5 ; G 4804 +U 42230 ; WX 557 ; N uniA4F6 ; G 4805 +U 42231 ; WX 830 ; N uniA4F7 ; G 4806 +U 42232 ; WX 322 ; N uniA4F8 ; G 4807 +U 42233 ; WX 322 ; N uniA4F9 ; G 4808 +U 42234 ; WX 674 ; N uniA4FA ; G 4809 +U 42235 ; WX 674 ; N uniA4FB ; G 4810 +U 42236 ; WX 322 ; N uniA4FC ; G 4811 +U 42237 ; WX 322 ; N uniA4FD ; G 4812 +U 42238 ; WX 588 ; N uniA4FE ; G 4813 +U 42239 ; WX 588 ; N uniA4FF ; G 4814 +U 42564 ; WX 720 ; N uniA644 ; G 4815 +U 42565 ; WX 595 ; N uniA645 ; G 4816 +U 42566 ; WX 436 ; N uniA646 ; G 4817 +U 42567 ; WX 440 ; N uniA647 ; G 4818 +U 42572 ; WX 1405 ; N uniA64C ; G 4819 +U 42573 ; WX 1173 ; N uniA64D ; G 4820 +U 42576 ; WX 1234 ; N uniA650 ; G 4821 +U 42577 ; WX 1027 ; N uniA651 ; G 4822 +U 42580 ; WX 1174 ; N uniA654 ; G 4823 +U 42581 ; WX 972 ; N uniA655 ; G 4824 +U 42582 ; WX 1093 ; N uniA656 ; G 4825 +U 42583 ; WX 958 ; N uniA657 ; G 4826 +U 42594 ; WX 1085 ; N uniA662 ; G 4827 +U 42595 ; WX 924 ; N uniA663 ; G 4828 +U 42596 ; WX 1096 ; N uniA664 ; G 4829 +U 42597 ; WX 912 ; N uniA665 ; G 4830 +U 42598 ; WX 1260 ; N uniA666 ; G 4831 +U 42599 ; WX 997 ; N uniA667 ; G 4832 +U 42600 ; WX 850 ; N uniA668 ; G 4833 +U 42601 ; WX 687 ; N uniA669 ; G 4834 +U 42602 ; WX 1037 ; N uniA66A ; G 4835 +U 42603 ; WX 868 ; N uniA66B ; G 4836 +U 42604 ; WX 1406 ; N uniA66C ; G 4837 +U 42605 ; WX 1106 ; N uniA66D ; G 4838 +U 42606 ; WX 961 ; N uniA66E ; G 4839 +U 42634 ; WX 963 ; N uniA68A ; G 4840 +U 42635 ; WX 787 ; N uniA68B ; G 4841 +U 42636 ; WX 682 ; N uniA68C ; G 4842 +U 42637 ; WX 580 ; N uniA68D ; G 4843 +U 42644 ; WX 808 ; N uniA694 ; G 4844 +U 42645 ; WX 712 ; N uniA695 ; G 4845 +U 42648 ; WX 1406 ; N uniA698 ; G 4846 +U 42649 ; WX 1106 ; N uniA699 ; G 4847 +U 42760 ; WX 500 ; N uniA708 ; G 4848 +U 42761 ; WX 500 ; N uniA709 ; G 4849 +U 42762 ; WX 500 ; N uniA70A ; G 4850 +U 42763 ; WX 500 ; N uniA70B ; G 4851 +U 42764 ; WX 500 ; N uniA70C ; G 4852 +U 42765 ; WX 500 ; N uniA70D ; G 4853 +U 42766 ; WX 500 ; N uniA70E ; G 4854 +U 42767 ; WX 500 ; N uniA70F ; G 4855 +U 42768 ; WX 500 ; N uniA710 ; G 4856 +U 42769 ; WX 500 ; N uniA711 ; G 4857 +U 42770 ; WX 500 ; N uniA712 ; G 4858 +U 42771 ; WX 500 ; N uniA713 ; G 4859 +U 42772 ; WX 500 ; N uniA714 ; G 4860 +U 42773 ; WX 500 ; N uniA715 ; G 4861 +U 42774 ; WX 500 ; N uniA716 ; G 4862 +U 42779 ; WX 400 ; N uniA71B ; G 4863 +U 42780 ; WX 400 ; N uniA71C ; G 4864 +U 42781 ; WX 287 ; N uniA71D ; G 4865 +U 42782 ; WX 287 ; N uniA71E ; G 4866 +U 42783 ; WX 287 ; N uniA71F ; G 4867 +U 42786 ; WX 444 ; N uniA722 ; G 4868 +U 42787 ; WX 390 ; N uniA723 ; G 4869 +U 42788 ; WX 540 ; N uniA724 ; G 4870 +U 42789 ; WX 540 ; N uniA725 ; G 4871 +U 42790 ; WX 837 ; N uniA726 ; G 4872 +U 42791 ; WX 712 ; N uniA727 ; G 4873 +U 42792 ; WX 1031 ; N uniA728 ; G 4874 +U 42793 ; WX 857 ; N uniA729 ; G 4875 +U 42794 ; WX 696 ; N uniA72A ; G 4876 +U 42795 ; WX 557 ; N uniA72B ; G 4877 +U 42800 ; WX 559 ; N uniA730 ; G 4878 +U 42801 ; WX 595 ; N uniA731 ; G 4879 +U 42802 ; WX 1349 ; N uniA732 ; G 4880 +U 42803 ; WX 1052 ; N uniA733 ; G 4881 +U 42804 ; WX 1284 ; N uniA734 ; G 4882 +U 42805 ; WX 1064 ; N uniA735 ; G 4883 +U 42806 ; WX 1216 ; N uniA736 ; G 4884 +U 42807 ; WX 1054 ; N uniA737 ; G 4885 +U 42808 ; WX 1079 ; N uniA738 ; G 4886 +U 42809 ; WX 922 ; N uniA739 ; G 4887 +U 42810 ; WX 1079 ; N uniA73A ; G 4888 +U 42811 ; WX 922 ; N uniA73B ; G 4889 +U 42812 ; WX 1035 ; N uniA73C ; G 4890 +U 42813 ; WX 922 ; N uniA73D ; G 4891 +U 42814 ; WX 698 ; N uniA73E ; G 4892 +U 42815 ; WX 549 ; N uniA73F ; G 4893 +U 42816 ; WX 656 ; N uniA740 ; G 4894 +U 42817 ; WX 688 ; N uniA741 ; G 4895 +U 42822 ; WX 850 ; N uniA746 ; G 4896 +U 42823 ; WX 542 ; N uniA747 ; G 4897 +U 42824 ; WX 683 ; N uniA748 ; G 4898 +U 42825 ; WX 531 ; N uniA749 ; G 4899 +U 42826 ; WX 918 ; N uniA74A ; G 4900 +U 42827 ; WX 814 ; N uniA74B ; G 4901 +U 42830 ; WX 1406 ; N uniA74E ; G 4902 +U 42831 ; WX 1106 ; N uniA74F ; G 4903 +U 42832 ; WX 733 ; N uniA750 ; G 4904 +U 42833 ; WX 716 ; N uniA751 ; G 4905 +U 42834 ; WX 948 ; N uniA752 ; G 4906 +U 42835 ; WX 937 ; N uniA753 ; G 4907 +U 42838 ; WX 850 ; N uniA756 ; G 4908 +U 42839 ; WX 716 ; N uniA757 ; G 4909 +U 42852 ; WX 738 ; N uniA764 ; G 4910 +U 42853 ; WX 716 ; N uniA765 ; G 4911 +U 42854 ; WX 738 ; N uniA766 ; G 4912 +U 42855 ; WX 716 ; N uniA767 ; G 4913 +U 42880 ; WX 637 ; N uniA780 ; G 4914 +U 42881 ; WX 343 ; N uniA781 ; G 4915 +U 42882 ; WX 837 ; N uniA782 ; G 4916 +U 42883 ; WX 712 ; N uniA783 ; G 4917 +U 42889 ; WX 400 ; N uniA789 ; G 4918 +U 42890 ; WX 386 ; N uniA78A ; G 4919 +U 42891 ; WX 456 ; N uniA78B ; G 4920 +U 42892 ; WX 306 ; N uniA78C ; G 4921 +U 42893 ; WX 808 ; N uniA78D ; G 4922 +U 42894 ; WX 693 ; N uniA78E ; G 4923 +U 42896 ; WX 928 ; N uniA790 ; G 4924 +U 42897 ; WX 768 ; N uniA791 ; G 4925 +U 42912 ; WX 821 ; N uniA7A0 ; G 4926 +U 42913 ; WX 716 ; N uniA7A1 ; G 4927 +U 42914 ; WX 775 ; N uniA7A2 ; G 4928 +U 42915 ; WX 665 ; N uniA7A3 ; G 4929 +U 42916 ; WX 837 ; N uniA7A4 ; G 4930 +U 42917 ; WX 712 ; N uniA7A5 ; G 4931 +U 42918 ; WX 770 ; N uniA7A6 ; G 4932 +U 42919 ; WX 493 ; N uniA7A7 ; G 4933 +U 42920 ; WX 720 ; N uniA7A8 ; G 4934 +U 42921 ; WX 595 ; N uniA7A9 ; G 4935 +U 42922 ; WX 886 ; N uniA7AA ; G 4936 +U 43000 ; WX 613 ; N uniA7F8 ; G 4937 +U 43001 ; WX 689 ; N uniA7F9 ; G 4938 +U 43002 ; WX 1062 ; N uniA7FA ; G 4939 +U 43003 ; WX 683 ; N uniA7FB ; G 4940 +U 43004 ; WX 733 ; N uniA7FC ; G 4941 +U 43005 ; WX 995 ; N uniA7FD ; G 4942 +U 43006 ; WX 372 ; N uniA7FE ; G 4943 +U 43007 ; WX 1325 ; N uniA7FF ; G 4944 +U 61184 ; WX 216 ; N uni02E5.5 ; G 4945 +U 61185 ; WX 242 ; N uni02E6.5 ; G 4946 +U 61186 ; WX 267 ; N uni02E7.5 ; G 4947 +U 61187 ; WX 277 ; N uni02E8.5 ; G 4948 +U 61188 ; WX 282 ; N uni02E9.5 ; G 4949 +U 61189 ; WX 242 ; N uni02E5.4 ; G 4950 +U 61190 ; WX 216 ; N uni02E6.4 ; G 4951 +U 61191 ; WX 242 ; N uni02E7.4 ; G 4952 +U 61192 ; WX 267 ; N uni02E8.4 ; G 4953 +U 61193 ; WX 277 ; N uni02E9.4 ; G 4954 +U 61194 ; WX 267 ; N uni02E5.3 ; G 4955 +U 61195 ; WX 242 ; N uni02E6.3 ; G 4956 +U 61196 ; WX 216 ; N uni02E7.3 ; G 4957 +U 61197 ; WX 242 ; N uni02E8.3 ; G 4958 +U 61198 ; WX 267 ; N uni02E9.3 ; G 4959 +U 61199 ; WX 277 ; N uni02E5.2 ; G 4960 +U 61200 ; WX 267 ; N uni02E6.2 ; G 4961 +U 61201 ; WX 242 ; N uni02E7.2 ; G 4962 +U 61202 ; WX 216 ; N uni02E8.2 ; G 4963 +U 61203 ; WX 242 ; N uni02E9.2 ; G 4964 +U 61204 ; WX 282 ; N uni02E5.1 ; G 4965 +U 61205 ; WX 277 ; N uni02E6.1 ; G 4966 +U 61206 ; WX 267 ; N uni02E7.1 ; G 4967 +U 61207 ; WX 242 ; N uni02E8.1 ; G 4968 +U 61208 ; WX 216 ; N uni02E9.1 ; G 4969 +U 61209 ; WX 282 ; N stem ; G 4970 +U 62464 ; WX 612 ; N uniF400 ; G 4971 +U 62465 ; WX 612 ; N uniF401 ; G 4972 +U 62466 ; WX 653 ; N uniF402 ; G 4973 +U 62467 ; WX 902 ; N uniF403 ; G 4974 +U 62468 ; WX 622 ; N uniF404 ; G 4975 +U 62469 ; WX 622 ; N uniF405 ; G 4976 +U 62470 ; WX 661 ; N uniF406 ; G 4977 +U 62471 ; WX 895 ; N uniF407 ; G 4978 +U 62472 ; WX 589 ; N uniF408 ; G 4979 +U 62473 ; WX 622 ; N uniF409 ; G 4980 +U 62474 ; WX 1163 ; N uniF40A ; G 4981 +U 62475 ; WX 626 ; N uniF40B ; G 4982 +U 62476 ; WX 627 ; N uniF40C ; G 4983 +U 62477 ; WX 893 ; N uniF40D ; G 4984 +U 62478 ; WX 612 ; N uniF40E ; G 4985 +U 62479 ; WX 626 ; N uniF40F ; G 4986 +U 62480 ; WX 924 ; N uniF410 ; G 4987 +U 62481 ; WX 627 ; N uniF411 ; G 4988 +U 62482 ; WX 744 ; N uniF412 ; G 4989 +U 62483 ; WX 634 ; N uniF413 ; G 4990 +U 62484 ; WX 886 ; N uniF414 ; G 4991 +U 62485 ; WX 626 ; N uniF415 ; G 4992 +U 62486 ; WX 907 ; N uniF416 ; G 4993 +U 62487 ; WX 626 ; N uniF417 ; G 4994 +U 62488 ; WX 621 ; N uniF418 ; G 4995 +U 62489 ; WX 628 ; N uniF419 ; G 4996 +U 62490 ; WX 677 ; N uniF41A ; G 4997 +U 62491 ; WX 626 ; N uniF41B ; G 4998 +U 62492 ; WX 621 ; N uniF41C ; G 4999 +U 62493 ; WX 630 ; N uniF41D ; G 5000 +U 62494 ; WX 627 ; N uniF41E ; G 5001 +U 62495 ; WX 571 ; N uniF41F ; G 5002 +U 62496 ; WX 622 ; N uniF420 ; G 5003 +U 62497 ; WX 631 ; N uniF421 ; G 5004 +U 62498 ; WX 612 ; N uniF422 ; G 5005 +U 62499 ; WX 611 ; N uniF423 ; G 5006 +U 62500 ; WX 618 ; N uniF424 ; G 5007 +U 62501 ; WX 671 ; N uniF425 ; G 5008 +U 62502 ; WX 963 ; N uniF426 ; G 5009 +U 62504 ; WX 1023 ; N uniF428 ; G 5010 +U 62505 ; WX 844 ; N uniF429 ; G 5011 +U 62506 ; WX 563 ; N uniF42A ; G 5012 +U 62507 ; WX 563 ; N uniF42B ; G 5013 +U 62508 ; WX 563 ; N uniF42C ; G 5014 +U 62509 ; WX 563 ; N uniF42D ; G 5015 +U 62510 ; WX 563 ; N uniF42E ; G 5016 +U 62511 ; WX 563 ; N uniF42F ; G 5017 +U 62512 ; WX 555 ; N uniF430 ; G 5018 +U 62513 ; WX 555 ; N uniF431 ; G 5019 +U 62514 ; WX 555 ; N uniF432 ; G 5020 +U 62515 ; WX 555 ; N uniF433 ; G 5021 +U 62516 ; WX 573 ; N uniF434 ; G 5022 +U 62517 ; WX 573 ; N uniF435 ; G 5023 +U 62518 ; WX 573 ; N uniF436 ; G 5024 +U 62519 ; WX 824 ; N uniF437 ; G 5025 +U 62520 ; WX 824 ; N uniF438 ; G 5026 +U 62521 ; WX 824 ; N uniF439 ; G 5027 +U 62522 ; WX 824 ; N uniF43A ; G 5028 +U 62523 ; WX 824 ; N uniF43B ; G 5029 +U 62524 ; WX 611 ; N uniF43C ; G 5030 +U 62525 ; WX 611 ; N uniF43D ; G 5031 +U 62526 ; WX 611 ; N uniF43E ; G 5032 +U 62527 ; WX 611 ; N uniF43F ; G 5033 +U 62528 ; WX 611 ; N uniF440 ; G 5034 +U 62529 ; WX 611 ; N uniF441 ; G 5035 +U 63173 ; WX 687 ; N uniF6C5 ; G 5036 +U 64256 ; WX 810 ; N uniFB00 ; G 5037 +U 64257 ; WX 741 ; N fi ; G 5038 +U 64258 ; WX 741 ; N fl ; G 5039 +U 64259 ; WX 1115 ; N uniFB03 ; G 5040 +U 64260 ; WX 1116 ; N uniFB04 ; G 5041 +U 64261 ; WX 808 ; N uniFB05 ; G 5042 +U 64262 ; WX 1020 ; N uniFB06 ; G 5043 +U 64275 ; WX 1388 ; N uniFB13 ; G 5044 +U 64276 ; WX 1384 ; N uniFB14 ; G 5045 +U 64277 ; WX 1378 ; N uniFB15 ; G 5046 +U 64278 ; WX 1384 ; N uniFB16 ; G 5047 +U 64279 ; WX 1713 ; N uniFB17 ; G 5048 +U 64285 ; WX 294 ; N uniFB1D ; G 5049 +U 64286 ; WX 0 ; N uniFB1E ; G 5050 +U 64287 ; WX 519 ; N uniFB1F ; G 5051 +U 64288 ; WX 665 ; N uniFB20 ; G 5052 +U 64289 ; WX 939 ; N uniFB21 ; G 5053 +U 64290 ; WX 788 ; N uniFB22 ; G 5054 +U 64291 ; WX 920 ; N uniFB23 ; G 5055 +U 64292 ; WX 786 ; N uniFB24 ; G 5056 +U 64293 ; WX 857 ; N uniFB25 ; G 5057 +U 64294 ; WX 869 ; N uniFB26 ; G 5058 +U 64295 ; WX 821 ; N uniFB27 ; G 5059 +U 64296 ; WX 890 ; N uniFB28 ; G 5060 +U 64297 ; WX 838 ; N uniFB29 ; G 5061 +U 64298 ; WX 758 ; N uniFB2A ; G 5062 +U 64299 ; WX 758 ; N uniFB2B ; G 5063 +U 64300 ; WX 758 ; N uniFB2C ; G 5064 +U 64301 ; WX 758 ; N uniFB2D ; G 5065 +U 64302 ; WX 728 ; N uniFB2E ; G 5066 +U 64303 ; WX 728 ; N uniFB2F ; G 5067 +U 64304 ; WX 728 ; N uniFB30 ; G 5068 +U 64305 ; WX 610 ; N uniFB31 ; G 5069 +U 64306 ; WX 447 ; N uniFB32 ; G 5070 +U 64307 ; WX 588 ; N uniFB33 ; G 5071 +U 64308 ; WX 687 ; N uniFB34 ; G 5072 +U 64309 ; WX 437 ; N uniFB35 ; G 5073 +U 64310 ; WX 485 ; N uniFB36 ; G 5074 +U 64312 ; WX 679 ; N uniFB38 ; G 5075 +U 64313 ; WX 435 ; N uniFB39 ; G 5076 +U 64314 ; WX 578 ; N uniFB3A ; G 5077 +U 64315 ; WX 566 ; N uniFB3B ; G 5078 +U 64316 ; WX 605 ; N uniFB3C ; G 5079 +U 64318 ; WX 724 ; N uniFB3E ; G 5080 +U 64320 ; WX 453 ; N uniFB40 ; G 5081 +U 64321 ; WX 680 ; N uniFB41 ; G 5082 +U 64323 ; WX 675 ; N uniFB43 ; G 5083 +U 64324 ; WX 658 ; N uniFB44 ; G 5084 +U 64326 ; WX 653 ; N uniFB46 ; G 5085 +U 64327 ; WX 736 ; N uniFB47 ; G 5086 +U 64328 ; WX 602 ; N uniFB48 ; G 5087 +U 64329 ; WX 758 ; N uniFB49 ; G 5088 +U 64330 ; WX 683 ; N uniFB4A ; G 5089 +U 64331 ; WX 343 ; N uniFB4B ; G 5090 +U 64332 ; WX 610 ; N uniFB4C ; G 5091 +U 64333 ; WX 566 ; N uniFB4D ; G 5092 +U 64334 ; WX 658 ; N uniFB4E ; G 5093 +U 64335 ; WX 710 ; N uniFB4F ; G 5094 +U 64338 ; WX 1005 ; N uniFB52 ; G 5095 +U 64339 ; WX 1059 ; N uniFB53 ; G 5096 +U 64340 ; WX 375 ; N uniFB54 ; G 5097 +U 64341 ; WX 408 ; N uniFB55 ; G 5098 +U 64342 ; WX 1005 ; N uniFB56 ; G 5099 +U 64343 ; WX 1059 ; N uniFB57 ; G 5100 +U 64344 ; WX 375 ; N uniFB58 ; G 5101 +U 64345 ; WX 408 ; N uniFB59 ; G 5102 +U 64346 ; WX 1005 ; N uniFB5A ; G 5103 +U 64347 ; WX 1059 ; N uniFB5B ; G 5104 +U 64348 ; WX 375 ; N uniFB5C ; G 5105 +U 64349 ; WX 408 ; N uniFB5D ; G 5106 +U 64350 ; WX 1005 ; N uniFB5E ; G 5107 +U 64351 ; WX 1059 ; N uniFB5F ; G 5108 +U 64352 ; WX 375 ; N uniFB60 ; G 5109 +U 64353 ; WX 408 ; N uniFB61 ; G 5110 +U 64354 ; WX 1005 ; N uniFB62 ; G 5111 +U 64355 ; WX 1059 ; N uniFB63 ; G 5112 +U 64356 ; WX 375 ; N uniFB64 ; G 5113 +U 64357 ; WX 408 ; N uniFB65 ; G 5114 +U 64358 ; WX 1005 ; N uniFB66 ; G 5115 +U 64359 ; WX 1059 ; N uniFB67 ; G 5116 +U 64360 ; WX 375 ; N uniFB68 ; G 5117 +U 64361 ; WX 408 ; N uniFB69 ; G 5118 +U 64362 ; WX 1162 ; N uniFB6A ; G 5119 +U 64363 ; WX 1191 ; N uniFB6B ; G 5120 +U 64364 ; WX 655 ; N uniFB6C ; G 5121 +U 64365 ; WX 720 ; N uniFB6D ; G 5122 +U 64366 ; WX 1162 ; N uniFB6E ; G 5123 +U 64367 ; WX 1191 ; N uniFB6F ; G 5124 +U 64368 ; WX 655 ; N uniFB70 ; G 5125 +U 64369 ; WX 720 ; N uniFB71 ; G 5126 +U 64370 ; WX 721 ; N uniFB72 ; G 5127 +U 64371 ; WX 721 ; N uniFB73 ; G 5128 +U 64372 ; WX 721 ; N uniFB74 ; G 5129 +U 64373 ; WX 721 ; N uniFB75 ; G 5130 +U 64374 ; WX 721 ; N uniFB76 ; G 5131 +U 64375 ; WX 721 ; N uniFB77 ; G 5132 +U 64376 ; WX 721 ; N uniFB78 ; G 5133 +U 64377 ; WX 721 ; N uniFB79 ; G 5134 +U 64378 ; WX 721 ; N uniFB7A ; G 5135 +U 64379 ; WX 721 ; N uniFB7B ; G 5136 +U 64380 ; WX 721 ; N uniFB7C ; G 5137 +U 64381 ; WX 721 ; N uniFB7D ; G 5138 +U 64382 ; WX 721 ; N uniFB7E ; G 5139 +U 64383 ; WX 721 ; N uniFB7F ; G 5140 +U 64384 ; WX 721 ; N uniFB80 ; G 5141 +U 64385 ; WX 721 ; N uniFB81 ; G 5142 +U 64386 ; WX 513 ; N uniFB82 ; G 5143 +U 64387 ; WX 578 ; N uniFB83 ; G 5144 +U 64388 ; WX 513 ; N uniFB84 ; G 5145 +U 64389 ; WX 578 ; N uniFB85 ; G 5146 +U 64390 ; WX 513 ; N uniFB86 ; G 5147 +U 64391 ; WX 578 ; N uniFB87 ; G 5148 +U 64392 ; WX 513 ; N uniFB88 ; G 5149 +U 64393 ; WX 578 ; N uniFB89 ; G 5150 +U 64394 ; WX 576 ; N uniFB8A ; G 5151 +U 64395 ; WX 622 ; N uniFB8B ; G 5152 +U 64396 ; WX 576 ; N uniFB8C ; G 5153 +U 64397 ; WX 622 ; N uniFB8D ; G 5154 +U 64398 ; WX 1024 ; N uniFB8E ; G 5155 +U 64399 ; WX 1024 ; N uniFB8F ; G 5156 +U 64400 ; WX 582 ; N uniFB90 ; G 5157 +U 64401 ; WX 582 ; N uniFB91 ; G 5158 +U 64402 ; WX 1024 ; N uniFB92 ; G 5159 +U 64403 ; WX 1024 ; N uniFB93 ; G 5160 +U 64404 ; WX 582 ; N uniFB94 ; G 5161 +U 64405 ; WX 582 ; N uniFB95 ; G 5162 +U 64406 ; WX 1024 ; N uniFB96 ; G 5163 +U 64407 ; WX 1024 ; N uniFB97 ; G 5164 +U 64408 ; WX 582 ; N uniFB98 ; G 5165 +U 64409 ; WX 582 ; N uniFB99 ; G 5166 +U 64410 ; WX 1024 ; N uniFB9A ; G 5167 +U 64411 ; WX 1024 ; N uniFB9B ; G 5168 +U 64412 ; WX 582 ; N uniFB9C ; G 5169 +U 64413 ; WX 582 ; N uniFB9D ; G 5170 +U 64414 ; WX 854 ; N uniFB9E ; G 5171 +U 64415 ; WX 900 ; N uniFB9F ; G 5172 +U 64416 ; WX 854 ; N uniFBA0 ; G 5173 +U 64417 ; WX 900 ; N uniFBA1 ; G 5174 +U 64418 ; WX 375 ; N uniFBA2 ; G 5175 +U 64419 ; WX 408 ; N uniFBA3 ; G 5176 +U 64426 ; WX 938 ; N uniFBAA ; G 5177 +U 64427 ; WX 880 ; N uniFBAB ; G 5178 +U 64428 ; WX 693 ; N uniFBAC ; G 5179 +U 64429 ; WX 660 ; N uniFBAD ; G 5180 +U 64467 ; WX 824 ; N uniFBD3 ; G 5181 +U 64468 ; WX 843 ; N uniFBD4 ; G 5182 +U 64469 ; WX 476 ; N uniFBD5 ; G 5183 +U 64470 ; WX 552 ; N uniFBD6 ; G 5184 +U 64471 ; WX 622 ; N uniFBD7 ; G 5185 +U 64472 ; WX 627 ; N uniFBD8 ; G 5186 +U 64473 ; WX 622 ; N uniFBD9 ; G 5187 +U 64474 ; WX 627 ; N uniFBDA ; G 5188 +U 64475 ; WX 622 ; N uniFBDB ; G 5189 +U 64476 ; WX 627 ; N uniFBDC ; G 5190 +U 64478 ; WX 622 ; N uniFBDE ; G 5191 +U 64479 ; WX 627 ; N uniFBDF ; G 5192 +U 64484 ; WX 917 ; N uniFBE4 ; G 5193 +U 64485 ; WX 1012 ; N uniFBE5 ; G 5194 +U 64486 ; WX 375 ; N uniFBE6 ; G 5195 +U 64487 ; WX 408 ; N uniFBE7 ; G 5196 +U 64488 ; WX 375 ; N uniFBE8 ; G 5197 +U 64489 ; WX 408 ; N uniFBE9 ; G 5198 +U 64508 ; WX 917 ; N uniFBFC ; G 5199 +U 64509 ; WX 1012 ; N uniFBFD ; G 5200 +U 64510 ; WX 375 ; N uniFBFE ; G 5201 +U 64511 ; WX 408 ; N uniFBFF ; G 5202 +U 65024 ; WX 0 ; N uniFE00 ; G 5203 +U 65025 ; WX 0 ; N uniFE01 ; G 5204 +U 65026 ; WX 0 ; N uniFE02 ; G 5205 +U 65027 ; WX 0 ; N uniFE03 ; G 5206 +U 65028 ; WX 0 ; N uniFE04 ; G 5207 +U 65029 ; WX 0 ; N uniFE05 ; G 5208 +U 65030 ; WX 0 ; N uniFE06 ; G 5209 +U 65031 ; WX 0 ; N uniFE07 ; G 5210 +U 65032 ; WX 0 ; N uniFE08 ; G 5211 +U 65033 ; WX 0 ; N uniFE09 ; G 5212 +U 65034 ; WX 0 ; N uniFE0A ; G 5213 +U 65035 ; WX 0 ; N uniFE0B ; G 5214 +U 65036 ; WX 0 ; N uniFE0C ; G 5215 +U 65037 ; WX 0 ; N uniFE0D ; G 5216 +U 65038 ; WX 0 ; N uniFE0E ; G 5217 +U 65039 ; WX 0 ; N uniFE0F ; G 5218 +U 65056 ; WX 0 ; N uniFE20 ; G 5219 +U 65057 ; WX 0 ; N uniFE21 ; G 5220 +U 65058 ; WX 0 ; N uniFE22 ; G 5221 +U 65059 ; WX 0 ; N uniFE23 ; G 5222 +U 65136 ; WX 342 ; N uniFE70 ; G 5223 +U 65137 ; WX 342 ; N uniFE71 ; G 5224 +U 65138 ; WX 342 ; N uniFE72 ; G 5225 +U 65139 ; WX 346 ; N uniFE73 ; G 5226 +U 65140 ; WX 342 ; N uniFE74 ; G 5227 +U 65142 ; WX 342 ; N uniFE76 ; G 5228 +U 65143 ; WX 342 ; N uniFE77 ; G 5229 +U 65144 ; WX 342 ; N uniFE78 ; G 5230 +U 65145 ; WX 342 ; N uniFE79 ; G 5231 +U 65146 ; WX 342 ; N uniFE7A ; G 5232 +U 65147 ; WX 342 ; N uniFE7B ; G 5233 +U 65148 ; WX 342 ; N uniFE7C ; G 5234 +U 65149 ; WX 342 ; N uniFE7D ; G 5235 +U 65150 ; WX 342 ; N uniFE7E ; G 5236 +U 65151 ; WX 342 ; N uniFE7F ; G 5237 +U 65152 ; WX 511 ; N uniFE80 ; G 5238 +U 65153 ; WX 343 ; N uniFE81 ; G 5239 +U 65154 ; WX 375 ; N uniFE82 ; G 5240 +U 65155 ; WX 343 ; N uniFE83 ; G 5241 +U 65156 ; WX 375 ; N uniFE84 ; G 5242 +U 65157 ; WX 622 ; N uniFE85 ; G 5243 +U 65158 ; WX 627 ; N uniFE86 ; G 5244 +U 65159 ; WX 343 ; N uniFE87 ; G 5245 +U 65160 ; WX 375 ; N uniFE88 ; G 5246 +U 65161 ; WX 917 ; N uniFE89 ; G 5247 +U 65162 ; WX 917 ; N uniFE8A ; G 5248 +U 65163 ; WX 375 ; N uniFE8B ; G 5249 +U 65164 ; WX 408 ; N uniFE8C ; G 5250 +U 65165 ; WX 343 ; N uniFE8D ; G 5251 +U 65166 ; WX 375 ; N uniFE8E ; G 5252 +U 65167 ; WX 1005 ; N uniFE8F ; G 5253 +U 65168 ; WX 1059 ; N uniFE90 ; G 5254 +U 65169 ; WX 375 ; N uniFE91 ; G 5255 +U 65170 ; WX 408 ; N uniFE92 ; G 5256 +U 65171 ; WX 590 ; N uniFE93 ; G 5257 +U 65172 ; WX 606 ; N uniFE94 ; G 5258 +U 65173 ; WX 1005 ; N uniFE95 ; G 5259 +U 65174 ; WX 1059 ; N uniFE96 ; G 5260 +U 65175 ; WX 375 ; N uniFE97 ; G 5261 +U 65176 ; WX 408 ; N uniFE98 ; G 5262 +U 65177 ; WX 1005 ; N uniFE99 ; G 5263 +U 65178 ; WX 1059 ; N uniFE9A ; G 5264 +U 65179 ; WX 375 ; N uniFE9B ; G 5265 +U 65180 ; WX 408 ; N uniFE9C ; G 5266 +U 65181 ; WX 721 ; N uniFE9D ; G 5267 +U 65182 ; WX 721 ; N uniFE9E ; G 5268 +U 65183 ; WX 721 ; N uniFE9F ; G 5269 +U 65184 ; WX 721 ; N uniFEA0 ; G 5270 +U 65185 ; WX 721 ; N uniFEA1 ; G 5271 +U 65186 ; WX 721 ; N uniFEA2 ; G 5272 +U 65187 ; WX 721 ; N uniFEA3 ; G 5273 +U 65188 ; WX 721 ; N uniFEA4 ; G 5274 +U 65189 ; WX 721 ; N uniFEA5 ; G 5275 +U 65190 ; WX 721 ; N uniFEA6 ; G 5276 +U 65191 ; WX 721 ; N uniFEA7 ; G 5277 +U 65192 ; WX 721 ; N uniFEA8 ; G 5278 +U 65193 ; WX 513 ; N uniFEA9 ; G 5279 +U 65194 ; WX 578 ; N uniFEAA ; G 5280 +U 65195 ; WX 513 ; N uniFEAB ; G 5281 +U 65196 ; WX 578 ; N uniFEAC ; G 5282 +U 65197 ; WX 576 ; N uniFEAD ; G 5283 +U 65198 ; WX 622 ; N uniFEAE ; G 5284 +U 65199 ; WX 576 ; N uniFEAF ; G 5285 +U 65200 ; WX 622 ; N uniFEB0 ; G 5286 +U 65201 ; WX 1380 ; N uniFEB1 ; G 5287 +U 65202 ; WX 1414 ; N uniFEB2 ; G 5288 +U 65203 ; WX 983 ; N uniFEB3 ; G 5289 +U 65204 ; WX 1018 ; N uniFEB4 ; G 5290 +U 65205 ; WX 1380 ; N uniFEB5 ; G 5291 +U 65206 ; WX 1414 ; N uniFEB6 ; G 5292 +U 65207 ; WX 983 ; N uniFEB7 ; G 5293 +U 65208 ; WX 1018 ; N uniFEB8 ; G 5294 +U 65209 ; WX 1345 ; N uniFEB9 ; G 5295 +U 65210 ; WX 1364 ; N uniFEBA ; G 5296 +U 65211 ; WX 966 ; N uniFEBB ; G 5297 +U 65212 ; WX 985 ; N uniFEBC ; G 5298 +U 65213 ; WX 1345 ; N uniFEBD ; G 5299 +U 65214 ; WX 1364 ; N uniFEBE ; G 5300 +U 65215 ; WX 966 ; N uniFEBF ; G 5301 +U 65216 ; WX 985 ; N uniFEC0 ; G 5302 +U 65217 ; WX 1039 ; N uniFEC1 ; G 5303 +U 65218 ; WX 1071 ; N uniFEC2 ; G 5304 +U 65219 ; WX 942 ; N uniFEC3 ; G 5305 +U 65220 ; WX 974 ; N uniFEC4 ; G 5306 +U 65221 ; WX 1039 ; N uniFEC5 ; G 5307 +U 65222 ; WX 1071 ; N uniFEC6 ; G 5308 +U 65223 ; WX 942 ; N uniFEC7 ; G 5309 +U 65224 ; WX 974 ; N uniFEC8 ; G 5310 +U 65225 ; WX 683 ; N uniFEC9 ; G 5311 +U 65226 ; WX 683 ; N uniFECA ; G 5312 +U 65227 ; WX 683 ; N uniFECB ; G 5313 +U 65228 ; WX 564 ; N uniFECC ; G 5314 +U 65229 ; WX 683 ; N uniFECD ; G 5315 +U 65230 ; WX 683 ; N uniFECE ; G 5316 +U 65231 ; WX 683 ; N uniFECF ; G 5317 +U 65232 ; WX 564 ; N uniFED0 ; G 5318 +U 65233 ; WX 1162 ; N uniFED1 ; G 5319 +U 65234 ; WX 1191 ; N uniFED2 ; G 5320 +U 65235 ; WX 655 ; N uniFED3 ; G 5321 +U 65236 ; WX 720 ; N uniFED4 ; G 5322 +U 65237 ; WX 894 ; N uniFED5 ; G 5323 +U 65238 ; WX 901 ; N uniFED6 ; G 5324 +U 65239 ; WX 655 ; N uniFED7 ; G 5325 +U 65240 ; WX 720 ; N uniFED8 ; G 5326 +U 65241 ; WX 917 ; N uniFED9 ; G 5327 +U 65242 ; WX 931 ; N uniFEDA ; G 5328 +U 65243 ; WX 582 ; N uniFEDB ; G 5329 +U 65244 ; WX 582 ; N uniFEDC ; G 5330 +U 65245 ; WX 868 ; N uniFEDD ; G 5331 +U 65246 ; WX 893 ; N uniFEDE ; G 5332 +U 65247 ; WX 375 ; N uniFEDF ; G 5333 +U 65248 ; WX 408 ; N uniFEE0 ; G 5334 +U 65249 ; WX 733 ; N uniFEE1 ; G 5335 +U 65250 ; WX 784 ; N uniFEE2 ; G 5336 +U 65251 ; WX 619 ; N uniFEE3 ; G 5337 +U 65252 ; WX 670 ; N uniFEE4 ; G 5338 +U 65253 ; WX 854 ; N uniFEE5 ; G 5339 +U 65254 ; WX 900 ; N uniFEE6 ; G 5340 +U 65255 ; WX 375 ; N uniFEE7 ; G 5341 +U 65256 ; WX 408 ; N uniFEE8 ; G 5342 +U 65257 ; WX 590 ; N uniFEE9 ; G 5343 +U 65258 ; WX 606 ; N uniFEEA ; G 5344 +U 65259 ; WX 693 ; N uniFEEB ; G 5345 +U 65260 ; WX 660 ; N uniFEEC ; G 5346 +U 65261 ; WX 622 ; N uniFEED ; G 5347 +U 65262 ; WX 627 ; N uniFEEE ; G 5348 +U 65263 ; WX 917 ; N uniFEEF ; G 5349 +U 65264 ; WX 1012 ; N uniFEF0 ; G 5350 +U 65265 ; WX 917 ; N uniFEF1 ; G 5351 +U 65266 ; WX 1012 ; N uniFEF2 ; G 5352 +U 65267 ; WX 375 ; N uniFEF3 ; G 5353 +U 65268 ; WX 408 ; N uniFEF4 ; G 5354 +U 65269 ; WX 745 ; N uniFEF5 ; G 5355 +U 65270 ; WX 759 ; N uniFEF6 ; G 5356 +U 65271 ; WX 745 ; N uniFEF7 ; G 5357 +U 65272 ; WX 759 ; N uniFEF8 ; G 5358 +U 65273 ; WX 745 ; N uniFEF9 ; G 5359 +U 65274 ; WX 759 ; N uniFEFA ; G 5360 +U 65275 ; WX 745 ; N uniFEFB ; G 5361 +U 65276 ; WX 759 ; N uniFEFC ; G 5362 +U 65279 ; WX 0 ; N uniFEFF ; G 5363 +U 65529 ; WX 0 ; N uniFFF9 ; G 5364 +U 65530 ; WX 0 ; N uniFFFA ; G 5365 +U 65531 ; WX 0 ; N uniFFFB ; G 5366 +U 65532 ; WX 0 ; N uniFFFC ; G 5367 +U 65533 ; WX 1113 ; N uniFFFD ; G 5368 +EndCharMetrics +StartKernData +StartKernPairs 1538 + +KPX dollar seven -159 +KPX dollar eight -63 +KPX dollar nine -139 +KPX dollar colon -92 +KPX dollar less -196 +KPX dollar Y -73 +KPX dollar backslash -73 +KPX dollar questiondown -73 +KPX dollar Aacute -73 +KPX dollar Hcircumflex -159 +KPX dollar Hbar -159 +KPX dollar Imacron -63 +KPX dollar Ibreve -63 +KPX dollar Iogonek -63 +KPX dollar Idot -63 +KPX dollar IJ -63 +KPX dollar Kcommaaccent -92 +KPX dollar kgreenlandic -196 +KPX dollar Lacute -73 +KPX dollar lacute -196 +KPX dollar uni01DC -159 +KPX dollar uni01F4 -196 +KPX dollar uni01F5 -73 + +KPX percent nine -83 +KPX percent colon -112 +KPX percent less -112 +KPX percent Kcommaaccent -112 +KPX percent kgreenlandic -112 +KPX percent lacute -112 +KPX percent uni01F4 -112 + +KPX ampersand six 38 +KPX ampersand Gcircumflex 38 +KPX ampersand Gbreve 38 +KPX ampersand Gdotaccent 38 +KPX ampersand Gcommaaccent 38 +KPX ampersand uni01DA 38 + +KPX quotesingle less -149 +KPX quotesingle kgreenlandic -149 +KPX quotesingle lacute -149 +KPX quotesingle uni01F4 -149 + +KPX parenright dollar -235 +KPX parenright D -120 +KPX parenright H -83 +KPX parenright R -83 +KPX parenright U -131 +KPX parenright X -102 +KPX parenright backslash -112 +KPX parenright cent -120 +KPX parenright sterling -120 +KPX parenright currency -120 +KPX parenright yen -120 +KPX parenright brokenbar -120 +KPX parenright section -120 +KPX parenright dieresis -120 +KPX parenright ordfeminine -83 +KPX parenright guillemotleft -83 +KPX parenright logicalnot -83 +KPX parenright sfthyphen -83 +KPX parenright acute -83 +KPX parenright mu -83 +KPX parenright paragraph -83 +KPX parenright periodcentered -83 +KPX parenright cedilla -83 +KPX parenright ordmasculine -83 +KPX parenright guillemotright -102 +KPX parenright onequarter -102 +KPX parenright onehalf -102 +KPX parenright threequarters -102 +KPX parenright questiondown -112 +KPX parenright Aacute -112 +KPX parenright Acircumflex -235 +KPX parenright Atilde -120 +KPX parenright Adieresis -235 +KPX parenright Aring -120 +KPX parenright AE -235 +KPX parenright Ccedilla -120 +KPX parenright Otilde -83 +KPX parenright multiply -83 +KPX parenright Ugrave -83 +KPX parenright Ucircumflex -83 +KPX parenright Yacute -83 +KPX parenright dcaron -83 +KPX parenright dmacron -83 +KPX parenright emacron -83 +KPX parenright ebreve -83 +KPX parenright edotaccent -131 +KPX parenright eogonek -131 +KPX parenright ecaron -131 +KPX parenright imacron -102 +KPX parenright ibreve -102 +KPX parenright iogonek -102 +KPX parenright dotlessi -102 +KPX parenright ij -102 +KPX parenright jcircumflex -102 +KPX parenright Lacute -112 +KPX parenright uni01A5 -120 +KPX parenright uni01AD -83 +KPX parenright Uhorn -83 +KPX parenright uni01F1 -83 +KPX parenright uni01F5 -112 + +KPX asterisk seven -36 +KPX asterisk less -45 +KPX asterisk Hbar -36 +KPX asterisk lacute -45 + +KPX period ampersand -92 +KPX period two -92 +KPX period eight -36 +KPX period H -36 +KPX period R -36 +KPX period X -36 +KPX period backslash -131 +KPX period ordfeminine -36 +KPX period guillemotleft -36 +KPX period logicalnot -36 +KPX period sfthyphen -36 +KPX period acute -36 +KPX period mu -36 +KPX period paragraph -36 +KPX period periodcentered -36 +KPX period cedilla -36 +KPX period ordmasculine -36 +KPX period guillemotright -36 +KPX period onequarter -36 +KPX period onehalf -36 +KPX period threequarters -36 +KPX period questiondown -131 +KPX period Aacute -131 +KPX period Egrave -92 +KPX period Icircumflex -92 +KPX period Yacute -36 +KPX period Ebreve -102 +KPX period ebreve -36 +KPX period Idot -36 +KPX period dotlessi -36 + +KPX slash two -73 +KPX slash seven -339 +KPX slash eight -73 +KPX slash nine -282 +KPX slash colon -159 +KPX slash less -319 +KPX slash backslash -139 +KPX slash questiondown -139 +KPX slash Aacute -139 +KPX slash Ebreve -73 +KPX slash Hbar -339 +KPX slash Idot -73 +KPX slash lacute -319 + +KPX two dollar -55 +KPX two nine -55 +KPX two semicolon -73 +KPX two less -73 +KPX two lacute -73 + +KPX three dollar -188 +KPX three D -55 +KPX three V -36 +KPX three backslash 38 +KPX three cent -55 +KPX three sterling -55 +KPX three currency -55 +KPX three yen -55 +KPX three brokenbar -55 +KPX three section -55 +KPX three dieresis -55 +KPX three questiondown 38 +KPX three Aacute 38 +KPX three gdotaccent -36 +KPX three gcommaaccent -36 + + +KPX five seven -92 +KPX five less -112 +KPX five backslash -92 +KPX five questiondown -92 +KPX five Aacute -92 +KPX five Hbar -92 +KPX five lacute -112 + +KPX six six -92 +KPX six Gdotaccent -92 +KPX six Gcommaaccent -92 + +KPX seven dollar -159 +KPX seven seven 47 +KPX seven D -264 +KPX seven F -272 +KPX seven H -272 +KPX seven R -272 +KPX seven U -225 +KPX seven V -272 +KPX seven X -225 +KPX seven Z -225 +KPX seven backslash -243 +KPX seven cent -164 +KPX seven sterling -264 +KPX seven currency -164 +KPX seven yen -164 +KPX seven brokenbar -164 +KPX seven section -164 +KPX seven dieresis -196 +KPX seven copyright -272 +KPX seven ordfeminine -212 +KPX seven guillemotleft -272 +KPX seven logicalnot -212 +KPX seven sfthyphen -212 +KPX seven acute -192 +KPX seven mu -272 +KPX seven paragraph -192 +KPX seven periodcentered -192 +KPX seven cedilla -192 +KPX seven ordmasculine -159 +KPX seven guillemotright -195 +KPX seven onequarter -225 +KPX seven onehalf -195 +KPX seven threequarters -195 +KPX seven questiondown -243 +KPX seven Aacute -243 +KPX seven Eacute -272 +KPX seven Idieresis -272 +KPX seven Yacute -272 +KPX seven ebreve -159 +KPX seven edotaccent -225 +KPX seven ecaron -225 +KPX seven gdotaccent -272 +KPX seven gcommaaccent -272 +KPX seven dotlessi -225 + +KPX eight dollar -63 + +KPX nine dollar -139 +KPX nine two -36 +KPX nine D -112 +KPX nine H -112 +KPX nine L -36 +KPX nine R -112 +KPX nine X -73 +KPX nine cent -112 +KPX nine sterling -112 +KPX nine currency -112 +KPX nine yen -112 +KPX nine brokenbar -112 +KPX nine section -112 +KPX nine dieresis -112 +KPX nine ordfeminine -112 +KPX nine guillemotleft -112 +KPX nine logicalnot -112 +KPX nine sfthyphen -112 +KPX nine acute -112 +KPX nine mu -112 +KPX nine paragraph -112 +KPX nine periodcentered -112 +KPX nine cedilla -112 +KPX nine ordmasculine -112 +KPX nine guillemotright -73 +KPX nine onequarter -73 +KPX nine onehalf -73 +KPX nine threequarters -73 +KPX nine Yacute -112 +KPX nine Ebreve -36 +KPX nine ebreve -112 +KPX nine dotlessi -73 + +KPX colon dollar -92 +KPX colon D -73 +KPX colon H -73 +KPX colon R -73 +KPX colon U -36 +KPX colon cent -73 +KPX colon sterling -73 +KPX colon currency -73 +KPX colon yen -73 +KPX colon brokenbar -73 +KPX colon section -73 +KPX colon dieresis -73 +KPX colon ordfeminine -73 +KPX colon guillemotleft -73 +KPX colon logicalnot -73 +KPX colon sfthyphen -73 +KPX colon acute -73 +KPX colon mu -73 +KPX colon paragraph -73 +KPX colon periodcentered -73 +KPX colon cedilla -73 +KPX colon ordmasculine -73 +KPX colon Yacute -73 +KPX colon ebreve -73 +KPX colon edotaccent -36 +KPX colon ecaron -36 + +KPX semicolon ampersand -73 +KPX semicolon two -73 +KPX semicolon H -55 +KPX semicolon ordfeminine -55 +KPX semicolon guillemotleft -55 +KPX semicolon logicalnot -55 +KPX semicolon sfthyphen -55 +KPX semicolon Egrave -73 +KPX semicolon Icircumflex -73 +KPX semicolon Yacute -55 +KPX semicolon Ebreve -73 + +KPX less dollar -196 +KPX less ampersand -73 +KPX less two -73 +KPX less D -188 +KPX less H -188 +KPX less R -188 +KPX less X -149 +KPX less cent -188 +KPX less sterling -188 +KPX less currency -188 +KPX less yen -188 +KPX less brokenbar -188 +KPX less section -188 +KPX less dieresis -188 +KPX less ordfeminine -188 +KPX less guillemotleft -188 +KPX less logicalnot -188 +KPX less sfthyphen -188 +KPX less acute -188 +KPX less mu -188 +KPX less paragraph -188 +KPX less periodcentered -188 +KPX less cedilla -188 +KPX less ordmasculine -188 +KPX less guillemotright -149 +KPX less onequarter -149 +KPX less onehalf -149 +KPX less threequarters -149 +KPX less Egrave -73 +KPX less Icircumflex -73 +KPX less Yacute -188 +KPX less Ebreve -92 +KPX less ebreve -188 +KPX less dotlessi -149 + + +KPX D backslash -63 +KPX D questiondown -63 +KPX D Aacute -63 + + +KPX N H -55 +KPX N R -55 +KPX N ordfeminine -55 +KPX N guillemotleft -55 +KPX N logicalnot -55 +KPX N sfthyphen -55 +KPX N acute -55 +KPX N mu -55 +KPX N paragraph -55 +KPX N periodcentered -55 +KPX N cedilla -55 +KPX N ordmasculine -45 +KPX N Yacute -55 +KPX N ebreve -55 + + + + + +KPX cent backslash -63 +KPX cent questiondown -63 +KPX cent Aacute -63 + +KPX sterling backslash -63 +KPX sterling questiondown -63 +KPX sterling Aacute -63 + +KPX currency backslash -63 +KPX currency questiondown -63 +KPX currency Aacute -63 + +KPX yen backslash -63 +KPX yen questiondown -63 +KPX yen Aacute -63 + +KPX brokenbar backslash -63 +KPX brokenbar questiondown -63 +KPX brokenbar Aacute -63 + +KPX section backslash -63 +KPX section questiondown -63 +KPX section Aacute -63 + + + +KPX Acircumflex seven -159 +KPX Acircumflex eight -63 +KPX Acircumflex nine -139 +KPX Acircumflex colon -92 +KPX Acircumflex less -196 +KPX Acircumflex Y -73 +KPX Acircumflex backslash -73 +KPX Acircumflex questiondown -73 +KPX Acircumflex Aacute -73 +KPX Acircumflex Hcircumflex -159 +KPX Acircumflex Hbar -159 +KPX Acircumflex Imacron -63 +KPX Acircumflex Ibreve -63 +KPX Acircumflex Iogonek -63 +KPX Acircumflex Idot -63 +KPX Acircumflex IJ -63 +KPX Acircumflex Kcommaaccent -92 +KPX Acircumflex kgreenlandic -196 +KPX Acircumflex Lacute -73 +KPX Acircumflex lacute -196 +KPX Acircumflex uni01DC -159 +KPX Acircumflex uni01F4 -196 +KPX Acircumflex uni01F5 -73 + +KPX Adieresis seven -159 +KPX Adieresis eight -63 +KPX Adieresis nine -139 +KPX Adieresis colon -92 +KPX Adieresis less -196 +KPX Adieresis Y -73 +KPX Adieresis backslash -73 +KPX Adieresis questiondown -73 +KPX Adieresis Aacute -73 +KPX Adieresis Hcircumflex -159 +KPX Adieresis Hbar -159 +KPX Adieresis Imacron -63 +KPX Adieresis Ibreve -63 +KPX Adieresis Iogonek -63 +KPX Adieresis Idot -63 +KPX Adieresis IJ -63 +KPX Adieresis Kcommaaccent -92 +KPX Adieresis kgreenlandic -196 +KPX Adieresis Lacute -73 +KPX Adieresis lacute -196 +KPX Adieresis uni01DC -159 +KPX Adieresis uni01F4 -196 +KPX Adieresis uni01F5 -73 + +KPX AE seven -159 +KPX AE eight -63 +KPX AE nine -139 +KPX AE colon -92 +KPX AE less -196 +KPX AE Y -73 +KPX AE backslash -73 +KPX AE questiondown -73 +KPX AE Aacute -73 +KPX AE Hcircumflex -159 +KPX AE Hbar -159 +KPX AE Imacron -63 +KPX AE Ibreve -63 +KPX AE Iogonek -63 +KPX AE Idot -63 +KPX AE IJ -63 +KPX AE Kcommaaccent -92 +KPX AE kgreenlandic -196 +KPX AE Lacute -73 +KPX AE lacute -196 +KPX AE uni01DC -159 +KPX AE uni01F4 -196 +KPX AE uni01F5 -73 + +KPX Egrave six 38 +KPX Egrave Gcircumflex 38 +KPX Egrave Gbreve 38 +KPX Egrave Gdotaccent 38 +KPX Egrave Gcommaaccent 38 +KPX Egrave uni01DA 38 + +KPX Ecircumflex six 38 +KPX Ecircumflex Gcircumflex 38 +KPX Ecircumflex Gbreve 38 +KPX Ecircumflex Gdotaccent 38 +KPX Ecircumflex Gcommaaccent 38 +KPX Ecircumflex uni01DA 38 + +KPX Igrave six 38 +KPX Igrave Gcircumflex 38 +KPX Igrave Gbreve 38 +KPX Igrave Gdotaccent 38 +KPX Igrave Gcommaaccent 38 +KPX Igrave uni01DA 38 + +KPX Icircumflex six 38 +KPX Icircumflex Gcircumflex 38 +KPX Icircumflex Gbreve 38 +KPX Icircumflex Gdotaccent 38 +KPX Icircumflex Gcommaaccent 38 +KPX Icircumflex uni01DA 38 + +KPX Eth less -149 +KPX Eth kgreenlandic -149 +KPX Eth lacute -149 +KPX Eth uni01F4 -149 + +KPX Ograve less -149 +KPX Ograve kgreenlandic -149 +KPX Ograve lacute -149 +KPX Ograve uni01F4 -149 + +KPX agrave seven -36 +KPX agrave less -45 +KPX agrave Hbar -36 +KPX agrave lacute -45 + +KPX ucircumflex two -73 +KPX ucircumflex seven -339 +KPX ucircumflex eight -73 +KPX ucircumflex nine -282 +KPX ucircumflex colon -159 +KPX ucircumflex less -319 +KPX ucircumflex backslash -139 +KPX ucircumflex questiondown -139 +KPX ucircumflex Aacute -139 +KPX ucircumflex Ebreve -73 +KPX ucircumflex Hbar -339 +KPX ucircumflex Idot -73 +KPX ucircumflex lacute -319 + +KPX ydieresis two -73 +KPX ydieresis seven -339 +KPX ydieresis eight -73 +KPX ydieresis nine -282 +KPX ydieresis colon -159 +KPX ydieresis less -319 +KPX ydieresis backslash -139 +KPX ydieresis questiondown -139 +KPX ydieresis Aacute -139 +KPX ydieresis Ebreve -73 +KPX ydieresis Hbar -339 +KPX ydieresis Idot -73 +KPX ydieresis lacute -319 + +KPX Abreve O -246 + +KPX abreve two -73 +KPX abreve seven -339 +KPX abreve eight -73 +KPX abreve nine -282 +KPX abreve colon -159 +KPX abreve less -319 +KPX abreve backslash -139 +KPX abreve questiondown -139 +KPX abreve Aacute -139 +KPX abreve Ebreve -73 +KPX abreve Hbar -339 +KPX abreve Idot -73 +KPX abreve lacute -319 + +KPX Edotaccent seven -92 +KPX Edotaccent less -112 +KPX Edotaccent backslash -92 +KPX Edotaccent questiondown -92 +KPX Edotaccent Aacute -92 +KPX Edotaccent Hbar -92 +KPX Edotaccent lacute -112 + + +KPX Ecaron seven -92 +KPX Ecaron less -112 +KPX Ecaron backslash -92 +KPX Ecaron questiondown -92 +KPX Ecaron Aacute -92 +KPX Ecaron Hbar -92 +KPX Ecaron lacute -112 + + +KPX Gdotaccent six -92 +KPX Gdotaccent Gdotaccent -92 +KPX Gdotaccent Gcommaaccent -92 + +KPX Gcommaaccent six -92 +KPX Gcommaaccent Gdotaccent -92 +KPX Gcommaaccent Gcommaaccent -92 + +KPX Hbar dollar -159 +KPX Hbar seven 47 +KPX Hbar D -264 +KPX Hbar F -272 +KPX Hbar H -272 +KPX Hbar R -272 +KPX Hbar U -225 +KPX Hbar V -272 +KPX Hbar X -225 +KPX Hbar Z -225 +KPX Hbar backslash -243 +KPX Hbar cent -264 +KPX Hbar sterling -264 +KPX Hbar currency -264 +KPX Hbar yen -264 +KPX Hbar brokenbar -264 +KPX Hbar section -264 +KPX Hbar dieresis -196 +KPX Hbar copyright -272 +KPX Hbar ordfeminine -272 +KPX Hbar guillemotleft -272 +KPX Hbar logicalnot -272 +KPX Hbar sfthyphen -272 +KPX Hbar acute -272 +KPX Hbar mu -272 +KPX Hbar paragraph -272 +KPX Hbar periodcentered -272 +KPX Hbar cedilla -272 +KPX Hbar ordmasculine -159 +KPX Hbar guillemotright -225 +KPX Hbar onequarter -225 +KPX Hbar onehalf -225 +KPX Hbar threequarters -225 +KPX Hbar questiondown -243 +KPX Hbar Aacute -243 +KPX Hbar Eacute -272 +KPX Hbar Idieresis -272 +KPX Hbar Yacute -272 +KPX Hbar ebreve -159 +KPX Hbar edotaccent -225 +KPX Hbar ecaron -225 +KPX Hbar gdotaccent -272 +KPX Hbar gcommaaccent -272 +KPX Hbar Hbar 47 +KPX Hbar dotlessi -225 + +KPX Idot dollar -63 + +KPX lacute dollar -196 +KPX lacute ampersand -73 +KPX lacute two -73 +KPX lacute D -188 +KPX lacute H -188 +KPX lacute R -188 +KPX lacute X -149 +KPX lacute cent -188 +KPX lacute sterling -188 +KPX lacute currency -188 +KPX lacute yen -188 +KPX lacute brokenbar -188 +KPX lacute section -188 +KPX lacute dieresis -188 +KPX lacute ordfeminine -188 +KPX lacute guillemotleft -188 +KPX lacute logicalnot -188 +KPX lacute sfthyphen -188 +KPX lacute acute -188 +KPX lacute mu -188 +KPX lacute paragraph -188 +KPX lacute periodcentered -188 +KPX lacute cedilla -188 +KPX lacute ordmasculine -188 +KPX lacute guillemotright -149 +KPX lacute onequarter -149 +KPX lacute onehalf -149 +KPX lacute threequarters -149 +KPX lacute Egrave -73 +KPX lacute Icircumflex -73 +KPX lacute Yacute -188 +KPX lacute Ebreve -92 +KPX lacute ebreve -188 +KPX lacute dotlessi -149 + + +KPX uni027D dollar -235 +KPX uni027D hyphen -92 +KPX uni027D nine 38 +KPX uni027D less 75 +KPX uni027D lacute 75 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-BoldOblique.ttf b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-BoldOblique.ttf new file mode 100644 index 0000000..753f2d8 Binary files /dev/null and b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-BoldOblique.ttf differ diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-BoldOblique.ufm b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-BoldOblique.ufm new file mode 100644 index 0000000..5f4dd7c --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-BoldOblique.ufm @@ -0,0 +1,5712 @@ +StartFontMetrics 4.1 +Notice Converted by PHP-font-lib +Comment https://github.com/PhenX/php-font-lib +EncodingScheme FontSpecific +FontName DejaVu Sans +FontSubfamily Bold Oblique +UniqueID DejaVu Sans Bold Oblique +FullName DejaVu Sans Bold Oblique +Version Version 2.37 +PostScriptName DejaVuSans-BoldOblique +Manufacturer DejaVu fonts team +FontVendorURL http://dejavu.sourceforge.net +LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License +PreferredFamily DejaVu Sans +PreferredSubfamily Bold Oblique +Weight Bold +ItalicAngle -11 +IsFixedPitch false +UnderlineThickness 44 +UnderlinePosition -63 +FontHeightOffset 0 +Ascender 928 +Descender -236 +FontBBox -1067 -385 1999 1121 +StartCharMetrics 5413 +U 32 ; WX 348 ; N space ; G 3 +U 33 ; WX 456 ; N exclam ; G 4 +U 34 ; WX 521 ; N quotedbl ; G 5 +U 35 ; WX 696 ; N numbersign ; G 6 +U 36 ; WX 696 ; N dollar ; G 7 +U 37 ; WX 1002 ; N percent ; G 8 +U 38 ; WX 872 ; N ampersand ; G 9 +U 39 ; WX 306 ; N quotesingle ; G 10 +U 40 ; WX 457 ; N parenleft ; G 11 +U 41 ; WX 457 ; N parenright ; G 12 +U 42 ; WX 523 ; N asterisk ; G 13 +U 43 ; WX 838 ; N plus ; G 14 +U 44 ; WX 380 ; N comma ; G 15 +U 45 ; WX 415 ; N hyphen ; G 16 +U 46 ; WX 380 ; N period ; G 17 +U 47 ; WX 365 ; N slash ; G 18 +U 48 ; WX 696 ; N zero ; G 19 +U 49 ; WX 696 ; N one ; G 20 +U 50 ; WX 696 ; N two ; G 21 +U 51 ; WX 696 ; N three ; G 22 +U 52 ; WX 696 ; N four ; G 23 +U 53 ; WX 696 ; N five ; G 24 +U 54 ; WX 696 ; N six ; G 25 +U 55 ; WX 696 ; N seven ; G 26 +U 56 ; WX 696 ; N eight ; G 27 +U 57 ; WX 696 ; N nine ; G 28 +U 58 ; WX 400 ; N colon ; G 29 +U 59 ; WX 400 ; N semicolon ; G 30 +U 60 ; WX 838 ; N less ; G 31 +U 61 ; WX 838 ; N equal ; G 32 +U 62 ; WX 838 ; N greater ; G 33 +U 63 ; WX 580 ; N question ; G 34 +U 64 ; WX 1000 ; N at ; G 35 +U 65 ; WX 774 ; N A ; G 36 +U 66 ; WX 762 ; N B ; G 37 +U 67 ; WX 734 ; N C ; G 38 +U 68 ; WX 830 ; N D ; G 39 +U 69 ; WX 683 ; N E ; G 40 +U 70 ; WX 683 ; N F ; G 41 +U 71 ; WX 821 ; N G ; G 42 +U 72 ; WX 837 ; N H ; G 43 +U 73 ; WX 372 ; N I ; G 44 +U 74 ; WX 372 ; N J ; G 45 +U 75 ; WX 775 ; N K ; G 46 +U 76 ; WX 637 ; N L ; G 47 +U 77 ; WX 995 ; N M ; G 48 +U 78 ; WX 837 ; N N ; G 49 +U 79 ; WX 850 ; N O ; G 50 +U 80 ; WX 733 ; N P ; G 51 +U 81 ; WX 850 ; N Q ; G 52 +U 82 ; WX 770 ; N R ; G 53 +U 83 ; WX 720 ; N S ; G 54 +U 84 ; WX 682 ; N T ; G 55 +U 85 ; WX 812 ; N U ; G 56 +U 86 ; WX 774 ; N V ; G 57 +U 87 ; WX 1103 ; N W ; G 58 +U 88 ; WX 771 ; N X ; G 59 +U 89 ; WX 724 ; N Y ; G 60 +U 90 ; WX 725 ; N Z ; G 61 +U 91 ; WX 457 ; N bracketleft ; G 62 +U 92 ; WX 365 ; N backslash ; G 63 +U 93 ; WX 457 ; N bracketright ; G 64 +U 94 ; WX 838 ; N asciicircum ; G 65 +U 95 ; WX 500 ; N underscore ; G 66 +U 96 ; WX 500 ; N grave ; G 67 +U 97 ; WX 675 ; N a ; G 68 +U 98 ; WX 716 ; N b ; G 69 +U 99 ; WX 593 ; N c ; G 70 +U 100 ; WX 716 ; N d ; G 71 +U 101 ; WX 678 ; N e ; G 72 +U 102 ; WX 435 ; N f ; G 73 +U 103 ; WX 716 ; N g ; G 74 +U 104 ; WX 712 ; N h ; G 75 +U 105 ; WX 343 ; N i ; G 76 +U 106 ; WX 343 ; N j ; G 77 +U 107 ; WX 665 ; N k ; G 78 +U 108 ; WX 343 ; N l ; G 79 +U 109 ; WX 1042 ; N m ; G 80 +U 110 ; WX 712 ; N n ; G 81 +U 111 ; WX 687 ; N o ; G 82 +U 112 ; WX 716 ; N p ; G 83 +U 113 ; WX 716 ; N q ; G 84 +U 114 ; WX 493 ; N r ; G 85 +U 115 ; WX 595 ; N s ; G 86 +U 116 ; WX 478 ; N t ; G 87 +U 117 ; WX 712 ; N u ; G 88 +U 118 ; WX 652 ; N v ; G 89 +U 119 ; WX 924 ; N w ; G 90 +U 120 ; WX 645 ; N x ; G 91 +U 121 ; WX 652 ; N y ; G 92 +U 122 ; WX 582 ; N z ; G 93 +U 123 ; WX 712 ; N braceleft ; G 94 +U 124 ; WX 365 ; N bar ; G 95 +U 125 ; WX 712 ; N braceright ; G 96 +U 126 ; WX 838 ; N asciitilde ; G 97 +U 160 ; WX 348 ; N nbspace ; G 98 +U 161 ; WX 456 ; N exclamdown ; G 99 +U 162 ; WX 696 ; N cent ; G 100 +U 163 ; WX 696 ; N sterling ; G 101 +U 164 ; WX 636 ; N currency ; G 102 +U 165 ; WX 696 ; N yen ; G 103 +U 166 ; WX 365 ; N brokenbar ; G 104 +U 167 ; WX 500 ; N section ; G 105 +U 168 ; WX 500 ; N dieresis ; G 106 +U 169 ; WX 1000 ; N copyright ; G 107 +U 170 ; WX 564 ; N ordfeminine ; G 108 +U 171 ; WX 650 ; N guillemotleft ; G 109 +U 172 ; WX 838 ; N logicalnot ; G 110 +U 173 ; WX 415 ; N sfthyphen ; G 111 +U 174 ; WX 1000 ; N registered ; G 112 +U 175 ; WX 500 ; N macron ; G 113 +U 176 ; WX 500 ; N degree ; G 114 +U 177 ; WX 838 ; N plusminus ; G 115 +U 178 ; WX 438 ; N twosuperior ; G 116 +U 179 ; WX 438 ; N threesuperior ; G 117 +U 180 ; WX 500 ; N acute ; G 118 +U 181 ; WX 736 ; N mu ; G 119 +U 182 ; WX 636 ; N paragraph ; G 120 +U 183 ; WX 380 ; N periodcentered ; G 121 +U 184 ; WX 500 ; N cedilla ; G 122 +U 185 ; WX 438 ; N onesuperior ; G 123 +U 186 ; WX 564 ; N ordmasculine ; G 124 +U 187 ; WX 650 ; N guillemotright ; G 125 +U 188 ; WX 1035 ; N onequarter ; G 126 +U 189 ; WX 1035 ; N onehalf ; G 127 +U 190 ; WX 1035 ; N threequarters ; G 128 +U 191 ; WX 580 ; N questiondown ; G 129 +U 192 ; WX 774 ; N Agrave ; G 130 +U 193 ; WX 774 ; N Aacute ; G 131 +U 194 ; WX 774 ; N Acircumflex ; G 132 +U 195 ; WX 774 ; N Atilde ; G 133 +U 196 ; WX 774 ; N Adieresis ; G 134 +U 197 ; WX 774 ; N Aring ; G 135 +U 198 ; WX 1085 ; N AE ; G 136 +U 199 ; WX 734 ; N Ccedilla ; G 137 +U 200 ; WX 683 ; N Egrave ; G 138 +U 201 ; WX 683 ; N Eacute ; G 139 +U 202 ; WX 683 ; N Ecircumflex ; G 140 +U 203 ; WX 683 ; N Edieresis ; G 141 +U 204 ; WX 372 ; N Igrave ; G 142 +U 205 ; WX 372 ; N Iacute ; G 143 +U 206 ; WX 372 ; N Icircumflex ; G 144 +U 207 ; WX 372 ; N Idieresis ; G 145 +U 208 ; WX 845 ; N Eth ; G 146 +U 209 ; WX 837 ; N Ntilde ; G 147 +U 210 ; WX 850 ; N Ograve ; G 148 +U 211 ; WX 850 ; N Oacute ; G 149 +U 212 ; WX 850 ; N Ocircumflex ; G 150 +U 213 ; WX 850 ; N Otilde ; G 151 +U 214 ; WX 850 ; N Odieresis ; G 152 +U 215 ; WX 838 ; N multiply ; G 153 +U 216 ; WX 850 ; N Oslash ; G 154 +U 217 ; WX 812 ; N Ugrave ; G 155 +U 218 ; WX 812 ; N Uacute ; G 156 +U 219 ; WX 812 ; N Ucircumflex ; G 157 +U 220 ; WX 812 ; N Udieresis ; G 158 +U 221 ; WX 724 ; N Yacute ; G 159 +U 222 ; WX 742 ; N Thorn ; G 160 +U 223 ; WX 719 ; N germandbls ; G 161 +U 224 ; WX 675 ; N agrave ; G 162 +U 225 ; WX 675 ; N aacute ; G 163 +U 226 ; WX 675 ; N acircumflex ; G 164 +U 227 ; WX 675 ; N atilde ; G 165 +U 228 ; WX 675 ; N adieresis ; G 166 +U 229 ; WX 675 ; N aring ; G 167 +U 230 ; WX 1048 ; N ae ; G 168 +U 231 ; WX 593 ; N ccedilla ; G 169 +U 232 ; WX 678 ; N egrave ; G 170 +U 233 ; WX 678 ; N eacute ; G 171 +U 234 ; WX 678 ; N ecircumflex ; G 172 +U 235 ; WX 678 ; N edieresis ; G 173 +U 236 ; WX 343 ; N igrave ; G 174 +U 237 ; WX 343 ; N iacute ; G 175 +U 238 ; WX 343 ; N icircumflex ; G 176 +U 239 ; WX 343 ; N idieresis ; G 177 +U 240 ; WX 687 ; N eth ; G 178 +U 241 ; WX 712 ; N ntilde ; G 179 +U 242 ; WX 687 ; N ograve ; G 180 +U 243 ; WX 687 ; N oacute ; G 181 +U 244 ; WX 687 ; N ocircumflex ; G 182 +U 245 ; WX 687 ; N otilde ; G 183 +U 246 ; WX 687 ; N odieresis ; G 184 +U 247 ; WX 838 ; N divide ; G 185 +U 248 ; WX 687 ; N oslash ; G 186 +U 249 ; WX 712 ; N ugrave ; G 187 +U 250 ; WX 712 ; N uacute ; G 188 +U 251 ; WX 712 ; N ucircumflex ; G 189 +U 252 ; WX 712 ; N udieresis ; G 190 +U 253 ; WX 652 ; N yacute ; G 191 +U 254 ; WX 716 ; N thorn ; G 192 +U 255 ; WX 652 ; N ydieresis ; G 193 +U 256 ; WX 774 ; N Amacron ; G 194 +U 257 ; WX 675 ; N amacron ; G 195 +U 258 ; WX 774 ; N Abreve ; G 196 +U 259 ; WX 675 ; N abreve ; G 197 +U 260 ; WX 774 ; N Aogonek ; G 198 +U 261 ; WX 675 ; N aogonek ; G 199 +U 262 ; WX 734 ; N Cacute ; G 200 +U 263 ; WX 593 ; N cacute ; G 201 +U 264 ; WX 734 ; N Ccircumflex ; G 202 +U 265 ; WX 593 ; N ccircumflex ; G 203 +U 266 ; WX 734 ; N Cdotaccent ; G 204 +U 267 ; WX 593 ; N cdotaccent ; G 205 +U 268 ; WX 734 ; N Ccaron ; G 206 +U 269 ; WX 593 ; N ccaron ; G 207 +U 270 ; WX 830 ; N Dcaron ; G 208 +U 271 ; WX 716 ; N dcaron ; G 209 +U 272 ; WX 845 ; N Dcroat ; G 210 +U 273 ; WX 716 ; N dmacron ; G 211 +U 274 ; WX 683 ; N Emacron ; G 212 +U 275 ; WX 678 ; N emacron ; G 213 +U 276 ; WX 683 ; N Ebreve ; G 214 +U 277 ; WX 678 ; N ebreve ; G 215 +U 278 ; WX 683 ; N Edotaccent ; G 216 +U 279 ; WX 678 ; N edotaccent ; G 217 +U 280 ; WX 683 ; N Eogonek ; G 218 +U 281 ; WX 678 ; N eogonek ; G 219 +U 282 ; WX 683 ; N Ecaron ; G 220 +U 283 ; WX 678 ; N ecaron ; G 221 +U 284 ; WX 821 ; N Gcircumflex ; G 222 +U 285 ; WX 716 ; N gcircumflex ; G 223 +U 286 ; WX 821 ; N Gbreve ; G 224 +U 287 ; WX 716 ; N gbreve ; G 225 +U 288 ; WX 821 ; N Gdotaccent ; G 226 +U 289 ; WX 716 ; N gdotaccent ; G 227 +U 290 ; WX 821 ; N Gcommaaccent ; G 228 +U 291 ; WX 716 ; N gcommaaccent ; G 229 +U 292 ; WX 837 ; N Hcircumflex ; G 230 +U 293 ; WX 712 ; N hcircumflex ; G 231 +U 294 ; WX 974 ; N Hbar ; G 232 +U 295 ; WX 790 ; N hbar ; G 233 +U 296 ; WX 372 ; N Itilde ; G 234 +U 297 ; WX 343 ; N itilde ; G 235 +U 298 ; WX 372 ; N Imacron ; G 236 +U 299 ; WX 343 ; N imacron ; G 237 +U 300 ; WX 372 ; N Ibreve ; G 238 +U 301 ; WX 343 ; N ibreve ; G 239 +U 302 ; WX 372 ; N Iogonek ; G 240 +U 303 ; WX 343 ; N iogonek ; G 241 +U 304 ; WX 372 ; N Idot ; G 242 +U 305 ; WX 343 ; N dotlessi ; G 243 +U 306 ; WX 744 ; N IJ ; G 244 +U 307 ; WX 686 ; N ij ; G 245 +U 308 ; WX 372 ; N Jcircumflex ; G 246 +U 309 ; WX 343 ; N jcircumflex ; G 247 +U 310 ; WX 775 ; N Kcommaaccent ; G 248 +U 311 ; WX 665 ; N kcommaaccent ; G 249 +U 312 ; WX 665 ; N kgreenlandic ; G 250 +U 313 ; WX 637 ; N Lacute ; G 251 +U 314 ; WX 343 ; N lacute ; G 252 +U 315 ; WX 637 ; N Lcommaaccent ; G 253 +U 316 ; WX 343 ; N lcommaaccent ; G 254 +U 317 ; WX 637 ; N Lcaron ; G 255 +U 318 ; WX 343 ; N lcaron ; G 256 +U 319 ; WX 637 ; N Ldot ; G 257 +U 320 ; WX 343 ; N ldot ; G 258 +U 321 ; WX 660 ; N Lslash ; G 259 +U 322 ; WX 375 ; N lslash ; G 260 +U 323 ; WX 837 ; N Nacute ; G 261 +U 324 ; WX 712 ; N nacute ; G 262 +U 325 ; WX 837 ; N Ncommaaccent ; G 263 +U 326 ; WX 712 ; N ncommaaccent ; G 264 +U 327 ; WX 837 ; N Ncaron ; G 265 +U 328 ; WX 712 ; N ncaron ; G 266 +U 329 ; WX 983 ; N napostrophe ; G 267 +U 330 ; WX 837 ; N Eng ; G 268 +U 331 ; WX 712 ; N eng ; G 269 +U 332 ; WX 850 ; N Omacron ; G 270 +U 333 ; WX 687 ; N omacron ; G 271 +U 334 ; WX 850 ; N Obreve ; G 272 +U 335 ; WX 687 ; N obreve ; G 273 +U 336 ; WX 850 ; N Ohungarumlaut ; G 274 +U 337 ; WX 687 ; N ohungarumlaut ; G 275 +U 338 ; WX 1167 ; N OE ; G 276 +U 339 ; WX 1094 ; N oe ; G 277 +U 340 ; WX 770 ; N Racute ; G 278 +U 341 ; WX 493 ; N racute ; G 279 +U 342 ; WX 770 ; N Rcommaaccent ; G 280 +U 343 ; WX 493 ; N rcommaaccent ; G 281 +U 344 ; WX 770 ; N Rcaron ; G 282 +U 345 ; WX 493 ; N rcaron ; G 283 +U 346 ; WX 720 ; N Sacute ; G 284 +U 347 ; WX 595 ; N sacute ; G 285 +U 348 ; WX 720 ; N Scircumflex ; G 286 +U 349 ; WX 595 ; N scircumflex ; G 287 +U 350 ; WX 720 ; N Scedilla ; G 288 +U 351 ; WX 595 ; N scedilla ; G 289 +U 352 ; WX 720 ; N Scaron ; G 290 +U 353 ; WX 595 ; N scaron ; G 291 +U 354 ; WX 682 ; N Tcommaaccent ; G 292 +U 355 ; WX 478 ; N tcommaaccent ; G 293 +U 356 ; WX 682 ; N Tcaron ; G 294 +U 357 ; WX 478 ; N tcaron ; G 295 +U 358 ; WX 682 ; N Tbar ; G 296 +U 359 ; WX 478 ; N tbar ; G 297 +U 360 ; WX 812 ; N Utilde ; G 298 +U 361 ; WX 712 ; N utilde ; G 299 +U 362 ; WX 812 ; N Umacron ; G 300 +U 363 ; WX 712 ; N umacron ; G 301 +U 364 ; WX 812 ; N Ubreve ; G 302 +U 365 ; WX 712 ; N ubreve ; G 303 +U 366 ; WX 812 ; N Uring ; G 304 +U 367 ; WX 712 ; N uring ; G 305 +U 368 ; WX 812 ; N Uhungarumlaut ; G 306 +U 369 ; WX 712 ; N uhungarumlaut ; G 307 +U 370 ; WX 812 ; N Uogonek ; G 308 +U 371 ; WX 712 ; N uogonek ; G 309 +U 372 ; WX 1103 ; N Wcircumflex ; G 310 +U 373 ; WX 924 ; N wcircumflex ; G 311 +U 374 ; WX 724 ; N Ycircumflex ; G 312 +U 375 ; WX 652 ; N ycircumflex ; G 313 +U 376 ; WX 724 ; N Ydieresis ; G 314 +U 377 ; WX 725 ; N Zacute ; G 315 +U 378 ; WX 582 ; N zacute ; G 316 +U 379 ; WX 725 ; N Zdotaccent ; G 317 +U 380 ; WX 582 ; N zdotaccent ; G 318 +U 381 ; WX 725 ; N Zcaron ; G 319 +U 382 ; WX 582 ; N zcaron ; G 320 +U 383 ; WX 435 ; N longs ; G 321 +U 384 ; WX 716 ; N uni0180 ; G 322 +U 385 ; WX 811 ; N uni0181 ; G 323 +U 386 ; WX 762 ; N uni0182 ; G 324 +U 387 ; WX 716 ; N uni0183 ; G 325 +U 388 ; WX 762 ; N uni0184 ; G 326 +U 389 ; WX 716 ; N uni0185 ; G 327 +U 390 ; WX 734 ; N uni0186 ; G 328 +U 391 ; WX 734 ; N uni0187 ; G 329 +U 392 ; WX 593 ; N uni0188 ; G 330 +U 393 ; WX 845 ; N uni0189 ; G 331 +U 394 ; WX 879 ; N uni018A ; G 332 +U 395 ; WX 762 ; N uni018B ; G 333 +U 396 ; WX 716 ; N uni018C ; G 334 +U 397 ; WX 687 ; N uni018D ; G 335 +U 398 ; WX 683 ; N uni018E ; G 336 +U 399 ; WX 850 ; N uni018F ; G 337 +U 400 ; WX 696 ; N uni0190 ; G 338 +U 401 ; WX 683 ; N uni0191 ; G 339 +U 402 ; WX 435 ; N florin ; G 340 +U 403 ; WX 821 ; N uni0193 ; G 341 +U 404 ; WX 793 ; N uni0194 ; G 342 +U 405 ; WX 1045 ; N uni0195 ; G 343 +U 406 ; WX 436 ; N uni0196 ; G 344 +U 407 ; WX 389 ; N uni0197 ; G 345 +U 408 ; WX 775 ; N uni0198 ; G 346 +U 409 ; WX 665 ; N uni0199 ; G 347 +U 410 ; WX 360 ; N uni019A ; G 348 +U 411 ; WX 592 ; N uni019B ; G 349 +U 412 ; WX 1042 ; N uni019C ; G 350 +U 413 ; WX 837 ; N uni019D ; G 351 +U 414 ; WX 712 ; N uni019E ; G 352 +U 415 ; WX 850 ; N uni019F ; G 353 +U 416 ; WX 850 ; N Ohorn ; G 354 +U 417 ; WX 687 ; N ohorn ; G 355 +U 418 ; WX 1114 ; N uni01A2 ; G 356 +U 419 ; WX 962 ; N uni01A3 ; G 357 +U 420 ; WX 782 ; N uni01A4 ; G 358 +U 421 ; WX 716 ; N uni01A5 ; G 359 +U 422 ; WX 770 ; N uni01A6 ; G 360 +U 423 ; WX 720 ; N uni01A7 ; G 361 +U 424 ; WX 595 ; N uni01A8 ; G 362 +U 425 ; WX 683 ; N uni01A9 ; G 363 +U 426 ; WX 552 ; N uni01AA ; G 364 +U 427 ; WX 478 ; N uni01AB ; G 365 +U 428 ; WX 707 ; N uni01AC ; G 366 +U 429 ; WX 478 ; N uni01AD ; G 367 +U 430 ; WX 682 ; N uni01AE ; G 368 +U 431 ; WX 812 ; N Uhorn ; G 369 +U 432 ; WX 712 ; N uhorn ; G 370 +U 433 ; WX 769 ; N uni01B1 ; G 371 +U 434 ; WX 813 ; N uni01B2 ; G 372 +U 435 ; WX 797 ; N uni01B3 ; G 373 +U 436 ; WX 778 ; N uni01B4 ; G 374 +U 437 ; WX 725 ; N uni01B5 ; G 375 +U 438 ; WX 582 ; N uni01B6 ; G 376 +U 439 ; WX 772 ; N uni01B7 ; G 377 +U 440 ; WX 772 ; N uni01B8 ; G 378 +U 441 ; WX 641 ; N uni01B9 ; G 379 +U 442 ; WX 582 ; N uni01BA ; G 380 +U 443 ; WX 696 ; N uni01BB ; G 381 +U 444 ; WX 772 ; N uni01BC ; G 382 +U 445 ; WX 641 ; N uni01BD ; G 383 +U 446 ; WX 573 ; N uni01BE ; G 384 +U 447 ; WX 716 ; N uni01BF ; G 385 +U 448 ; WX 372 ; N uni01C0 ; G 386 +U 449 ; WX 659 ; N uni01C1 ; G 387 +U 450 ; WX 544 ; N uni01C2 ; G 388 +U 451 ; WX 372 ; N uni01C3 ; G 389 +U 452 ; WX 1548 ; N uni01C4 ; G 390 +U 453 ; WX 1450 ; N uni01C5 ; G 391 +U 454 ; WX 1307 ; N uni01C6 ; G 392 +U 455 ; WX 977 ; N uni01C7 ; G 393 +U 456 ; WX 979 ; N uni01C8 ; G 394 +U 457 ; WX 670 ; N uni01C9 ; G 395 +U 458 ; WX 1193 ; N uni01CA ; G 396 +U 459 ; WX 1213 ; N uni01CB ; G 397 +U 460 ; WX 1063 ; N uni01CC ; G 398 +U 461 ; WX 774 ; N uni01CD ; G 399 +U 462 ; WX 675 ; N uni01CE ; G 400 +U 463 ; WX 372 ; N uni01CF ; G 401 +U 464 ; WX 343 ; N uni01D0 ; G 402 +U 465 ; WX 850 ; N uni01D1 ; G 403 +U 466 ; WX 687 ; N uni01D2 ; G 404 +U 467 ; WX 812 ; N uni01D3 ; G 405 +U 468 ; WX 712 ; N uni01D4 ; G 406 +U 469 ; WX 812 ; N uni01D5 ; G 407 +U 470 ; WX 712 ; N uni01D6 ; G 408 +U 471 ; WX 812 ; N uni01D7 ; G 409 +U 472 ; WX 712 ; N uni01D8 ; G 410 +U 473 ; WX 812 ; N uni01D9 ; G 411 +U 474 ; WX 712 ; N uni01DA ; G 412 +U 475 ; WX 812 ; N uni01DB ; G 413 +U 476 ; WX 712 ; N uni01DC ; G 414 +U 477 ; WX 678 ; N uni01DD ; G 415 +U 478 ; WX 774 ; N uni01DE ; G 416 +U 479 ; WX 675 ; N uni01DF ; G 417 +U 480 ; WX 774 ; N uni01E0 ; G 418 +U 481 ; WX 675 ; N uni01E1 ; G 419 +U 482 ; WX 1085 ; N uni01E2 ; G 420 +U 483 ; WX 1048 ; N uni01E3 ; G 421 +U 484 ; WX 821 ; N uni01E4 ; G 422 +U 485 ; WX 716 ; N uni01E5 ; G 423 +U 486 ; WX 821 ; N Gcaron ; G 424 +U 487 ; WX 716 ; N gcaron ; G 425 +U 488 ; WX 775 ; N uni01E8 ; G 426 +U 489 ; WX 665 ; N uni01E9 ; G 427 +U 490 ; WX 850 ; N uni01EA ; G 428 +U 491 ; WX 687 ; N uni01EB ; G 429 +U 492 ; WX 850 ; N uni01EC ; G 430 +U 493 ; WX 687 ; N uni01ED ; G 431 +U 494 ; WX 772 ; N uni01EE ; G 432 +U 495 ; WX 582 ; N uni01EF ; G 433 +U 496 ; WX 343 ; N uni01F0 ; G 434 +U 497 ; WX 1548 ; N uni01F1 ; G 435 +U 498 ; WX 1450 ; N uni01F2 ; G 436 +U 499 ; WX 1307 ; N uni01F3 ; G 437 +U 500 ; WX 821 ; N uni01F4 ; G 438 +U 501 ; WX 716 ; N uni01F5 ; G 439 +U 502 ; WX 1289 ; N uni01F6 ; G 440 +U 503 ; WX 787 ; N uni01F7 ; G 441 +U 504 ; WX 837 ; N uni01F8 ; G 442 +U 505 ; WX 712 ; N uni01F9 ; G 443 +U 506 ; WX 774 ; N Aringacute ; G 444 +U 507 ; WX 675 ; N aringacute ; G 445 +U 508 ; WX 1085 ; N AEacute ; G 446 +U 509 ; WX 1048 ; N aeacute ; G 447 +U 510 ; WX 850 ; N Oslashacute ; G 448 +U 511 ; WX 687 ; N oslashacute ; G 449 +U 512 ; WX 774 ; N uni0200 ; G 450 +U 513 ; WX 675 ; N uni0201 ; G 451 +U 514 ; WX 774 ; N uni0202 ; G 452 +U 515 ; WX 675 ; N uni0203 ; G 453 +U 516 ; WX 683 ; N uni0204 ; G 454 +U 517 ; WX 678 ; N uni0205 ; G 455 +U 518 ; WX 683 ; N uni0206 ; G 456 +U 519 ; WX 678 ; N uni0207 ; G 457 +U 520 ; WX 372 ; N uni0208 ; G 458 +U 521 ; WX 343 ; N uni0209 ; G 459 +U 522 ; WX 372 ; N uni020A ; G 460 +U 523 ; WX 343 ; N uni020B ; G 461 +U 524 ; WX 850 ; N uni020C ; G 462 +U 525 ; WX 687 ; N uni020D ; G 463 +U 526 ; WX 850 ; N uni020E ; G 464 +U 527 ; WX 687 ; N uni020F ; G 465 +U 528 ; WX 770 ; N uni0210 ; G 466 +U 529 ; WX 493 ; N uni0211 ; G 467 +U 530 ; WX 770 ; N uni0212 ; G 468 +U 531 ; WX 493 ; N uni0213 ; G 469 +U 532 ; WX 812 ; N uni0214 ; G 470 +U 533 ; WX 712 ; N uni0215 ; G 471 +U 534 ; WX 812 ; N uni0216 ; G 472 +U 535 ; WX 712 ; N uni0217 ; G 473 +U 536 ; WX 720 ; N Scommaaccent ; G 474 +U 537 ; WX 595 ; N scommaaccent ; G 475 +U 538 ; WX 682 ; N uni021A ; G 476 +U 539 ; WX 478 ; N uni021B ; G 477 +U 540 ; WX 690 ; N uni021C ; G 478 +U 541 ; WX 607 ; N uni021D ; G 479 +U 542 ; WX 837 ; N uni021E ; G 480 +U 543 ; WX 712 ; N uni021F ; G 481 +U 544 ; WX 837 ; N uni0220 ; G 482 +U 545 ; WX 865 ; N uni0221 ; G 483 +U 546 ; WX 809 ; N uni0222 ; G 484 +U 547 ; WX 659 ; N uni0223 ; G 485 +U 548 ; WX 725 ; N uni0224 ; G 486 +U 549 ; WX 582 ; N uni0225 ; G 487 +U 550 ; WX 774 ; N uni0226 ; G 488 +U 551 ; WX 675 ; N uni0227 ; G 489 +U 552 ; WX 683 ; N uni0228 ; G 490 +U 553 ; WX 678 ; N uni0229 ; G 491 +U 554 ; WX 850 ; N uni022A ; G 492 +U 555 ; WX 687 ; N uni022B ; G 493 +U 556 ; WX 850 ; N uni022C ; G 494 +U 557 ; WX 687 ; N uni022D ; G 495 +U 558 ; WX 850 ; N uni022E ; G 496 +U 559 ; WX 687 ; N uni022F ; G 497 +U 560 ; WX 850 ; N uni0230 ; G 498 +U 561 ; WX 687 ; N uni0231 ; G 499 +U 562 ; WX 724 ; N uni0232 ; G 500 +U 563 ; WX 652 ; N uni0233 ; G 501 +U 564 ; WX 492 ; N uni0234 ; G 502 +U 565 ; WX 867 ; N uni0235 ; G 503 +U 566 ; WX 512 ; N uni0236 ; G 504 +U 567 ; WX 343 ; N dotlessj ; G 505 +U 568 ; WX 1088 ; N uni0238 ; G 506 +U 569 ; WX 1088 ; N uni0239 ; G 507 +U 570 ; WX 774 ; N uni023A ; G 508 +U 571 ; WX 734 ; N uni023B ; G 509 +U 572 ; WX 593 ; N uni023C ; G 510 +U 573 ; WX 637 ; N uni023D ; G 511 +U 574 ; WX 682 ; N uni023E ; G 512 +U 575 ; WX 595 ; N uni023F ; G 513 +U 576 ; WX 582 ; N uni0240 ; G 514 +U 577 ; WX 782 ; N uni0241 ; G 515 +U 578 ; WX 614 ; N uni0242 ; G 516 +U 579 ; WX 762 ; N uni0243 ; G 517 +U 580 ; WX 812 ; N uni0244 ; G 518 +U 581 ; WX 774 ; N uni0245 ; G 519 +U 582 ; WX 683 ; N uni0246 ; G 520 +U 583 ; WX 678 ; N uni0247 ; G 521 +U 584 ; WX 372 ; N uni0248 ; G 522 +U 585 ; WX 343 ; N uni0249 ; G 523 +U 586 ; WX 860 ; N uni024A ; G 524 +U 587 ; WX 791 ; N uni024B ; G 525 +U 588 ; WX 770 ; N uni024C ; G 526 +U 589 ; WX 493 ; N uni024D ; G 527 +U 590 ; WX 724 ; N uni024E ; G 528 +U 591 ; WX 652 ; N uni024F ; G 529 +U 592 ; WX 675 ; N uni0250 ; G 530 +U 593 ; WX 716 ; N uni0251 ; G 531 +U 594 ; WX 716 ; N uni0252 ; G 532 +U 595 ; WX 716 ; N uni0253 ; G 533 +U 596 ; WX 593 ; N uni0254 ; G 534 +U 597 ; WX 593 ; N uni0255 ; G 535 +U 598 ; WX 791 ; N uni0256 ; G 536 +U 599 ; WX 792 ; N uni0257 ; G 537 +U 600 ; WX 678 ; N uni0258 ; G 538 +U 601 ; WX 678 ; N uni0259 ; G 539 +U 602 ; WX 876 ; N uni025A ; G 540 +U 603 ; WX 557 ; N uni025B ; G 541 +U 604 ; WX 545 ; N uni025C ; G 542 +U 605 ; WX 774 ; N uni025D ; G 543 +U 606 ; WX 731 ; N uni025E ; G 544 +U 607 ; WX 343 ; N uni025F ; G 545 +U 608 ; WX 792 ; N uni0260 ; G 546 +U 609 ; WX 716 ; N uni0261 ; G 547 +U 610 ; WX 627 ; N uni0262 ; G 548 +U 611 ; WX 735 ; N uni0263 ; G 549 +U 612 ; WX 635 ; N uni0264 ; G 550 +U 613 ; WX 712 ; N uni0265 ; G 551 +U 614 ; WX 712 ; N uni0266 ; G 552 +U 615 ; WX 712 ; N uni0267 ; G 553 +U 616 ; WX 545 ; N uni0268 ; G 554 +U 617 ; WX 440 ; N uni0269 ; G 555 +U 618 ; WX 545 ; N uni026A ; G 556 +U 619 ; WX 559 ; N uni026B ; G 557 +U 620 ; WX 693 ; N uni026C ; G 558 +U 621 ; WX 343 ; N uni026D ; G 559 +U 622 ; WX 841 ; N uni026E ; G 560 +U 623 ; WX 1042 ; N uni026F ; G 561 +U 624 ; WX 1042 ; N uni0270 ; G 562 +U 625 ; WX 1042 ; N uni0271 ; G 563 +U 626 ; WX 712 ; N uni0272 ; G 564 +U 627 ; WX 793 ; N uni0273 ; G 565 +U 628 ; WX 642 ; N uni0274 ; G 566 +U 629 ; WX 687 ; N uni0275 ; G 567 +U 630 ; WX 909 ; N uni0276 ; G 568 +U 631 ; WX 682 ; N uni0277 ; G 569 +U 632 ; WX 796 ; N uni0278 ; G 570 +U 633 ; WX 538 ; N uni0279 ; G 571 +U 634 ; WX 538 ; N uni027A ; G 572 +U 635 ; WX 650 ; N uni027B ; G 573 +U 636 ; WX 493 ; N uni027C ; G 574 +U 637 ; WX 493 ; N uni027D ; G 575 +U 638 ; WX 596 ; N uni027E ; G 576 +U 639 ; WX 596 ; N uni027F ; G 577 +U 640 ; WX 642 ; N uni0280 ; G 578 +U 641 ; WX 642 ; N uni0281 ; G 579 +U 642 ; WX 595 ; N uni0282 ; G 580 +U 643 ; WX 415 ; N uni0283 ; G 581 +U 644 ; WX 435 ; N uni0284 ; G 582 +U 645 ; WX 605 ; N uni0285 ; G 583 +U 646 ; WX 552 ; N uni0286 ; G 584 +U 647 ; WX 478 ; N uni0287 ; G 585 +U 648 ; WX 478 ; N uni0288 ; G 586 +U 649 ; WX 920 ; N uni0289 ; G 587 +U 650 ; WX 769 ; N uni028A ; G 588 +U 651 ; WX 670 ; N uni028B ; G 589 +U 652 ; WX 652 ; N uni028C ; G 590 +U 653 ; WX 924 ; N uni028D ; G 591 +U 654 ; WX 652 ; N uni028E ; G 592 +U 655 ; WX 724 ; N uni028F ; G 593 +U 656 ; WX 694 ; N uni0290 ; G 594 +U 657 ; WX 684 ; N uni0291 ; G 595 +U 658 ; WX 641 ; N uni0292 ; G 596 +U 659 ; WX 641 ; N uni0293 ; G 597 +U 660 ; WX 573 ; N uni0294 ; G 598 +U 661 ; WX 573 ; N uni0295 ; G 599 +U 662 ; WX 573 ; N uni0296 ; G 600 +U 663 ; WX 573 ; N uni0297 ; G 601 +U 664 ; WX 850 ; N uni0298 ; G 602 +U 665 ; WX 633 ; N uni0299 ; G 603 +U 666 ; WX 731 ; N uni029A ; G 604 +U 667 ; WX 685 ; N uni029B ; G 605 +U 668 ; WX 691 ; N uni029C ; G 606 +U 669 ; WX 343 ; N uni029D ; G 607 +U 670 ; WX 732 ; N uni029E ; G 608 +U 671 ; WX 539 ; N uni029F ; G 609 +U 672 ; WX 792 ; N uni02A0 ; G 610 +U 673 ; WX 573 ; N uni02A1 ; G 611 +U 674 ; WX 573 ; N uni02A2 ; G 612 +U 675 ; WX 1156 ; N uni02A3 ; G 613 +U 676 ; WX 1214 ; N uni02A4 ; G 614 +U 677 ; WX 1155 ; N uni02A5 ; G 615 +U 678 ; WX 975 ; N uni02A6 ; G 616 +U 679 ; WX 769 ; N uni02A7 ; G 617 +U 680 ; WX 929 ; N uni02A8 ; G 618 +U 681 ; WX 1026 ; N uni02A9 ; G 619 +U 682 ; WX 862 ; N uni02AA ; G 620 +U 683 ; WX 780 ; N uni02AB ; G 621 +U 684 ; WX 591 ; N uni02AC ; G 622 +U 685 ; WX 415 ; N uni02AD ; G 623 +U 686 ; WX 677 ; N uni02AE ; G 624 +U 687 ; WX 789 ; N uni02AF ; G 625 +U 688 ; WX 456 ; N uni02B0 ; G 626 +U 689 ; WX 456 ; N uni02B1 ; G 627 +U 690 ; WX 219 ; N uni02B2 ; G 628 +U 691 ; WX 315 ; N uni02B3 ; G 629 +U 692 ; WX 315 ; N uni02B4 ; G 630 +U 693 ; WX 315 ; N uni02B5 ; G 631 +U 694 ; WX 411 ; N uni02B6 ; G 632 +U 695 ; WX 591 ; N uni02B7 ; G 633 +U 696 ; WX 417 ; N uni02B8 ; G 634 +U 697 ; WX 302 ; N uni02B9 ; G 635 +U 698 ; WX 521 ; N uni02BA ; G 636 +U 699 ; WX 380 ; N uni02BB ; G 637 +U 700 ; WX 380 ; N uni02BC ; G 638 +U 701 ; WX 380 ; N uni02BD ; G 639 +U 702 ; WX 366 ; N uni02BE ; G 640 +U 703 ; WX 366 ; N uni02BF ; G 641 +U 704 ; WX 326 ; N uni02C0 ; G 642 +U 705 ; WX 326 ; N uni02C1 ; G 643 +U 706 ; WX 500 ; N uni02C2 ; G 644 +U 707 ; WX 500 ; N uni02C3 ; G 645 +U 708 ; WX 500 ; N uni02C4 ; G 646 +U 709 ; WX 500 ; N uni02C5 ; G 647 +U 710 ; WX 500 ; N circumflex ; G 648 +U 711 ; WX 500 ; N caron ; G 649 +U 712 ; WX 306 ; N uni02C8 ; G 650 +U 713 ; WX 500 ; N uni02C9 ; G 651 +U 714 ; WX 500 ; N uni02CA ; G 652 +U 715 ; WX 500 ; N uni02CB ; G 653 +U 716 ; WX 306 ; N uni02CC ; G 654 +U 717 ; WX 500 ; N uni02CD ; G 655 +U 718 ; WX 500 ; N uni02CE ; G 656 +U 719 ; WX 500 ; N uni02CF ; G 657 +U 720 ; WX 337 ; N uni02D0 ; G 658 +U 721 ; WX 337 ; N uni02D1 ; G 659 +U 722 ; WX 366 ; N uni02D2 ; G 660 +U 723 ; WX 366 ; N uni02D3 ; G 661 +U 724 ; WX 500 ; N uni02D4 ; G 662 +U 725 ; WX 500 ; N uni02D5 ; G 663 +U 726 ; WX 416 ; N uni02D6 ; G 664 +U 727 ; WX 328 ; N uni02D7 ; G 665 +U 728 ; WX 500 ; N breve ; G 666 +U 729 ; WX 500 ; N dotaccent ; G 667 +U 730 ; WX 500 ; N ring ; G 668 +U 731 ; WX 500 ; N ogonek ; G 669 +U 732 ; WX 500 ; N tilde ; G 670 +U 733 ; WX 500 ; N hungarumlaut ; G 671 +U 734 ; WX 351 ; N uni02DE ; G 672 +U 735 ; WX 500 ; N uni02DF ; G 673 +U 736 ; WX 412 ; N uni02E0 ; G 674 +U 737 ; WX 219 ; N uni02E1 ; G 675 +U 738 ; WX 381 ; N uni02E2 ; G 676 +U 739 ; WX 413 ; N uni02E3 ; G 677 +U 740 ; WX 326 ; N uni02E4 ; G 678 +U 741 ; WX 500 ; N uni02E5 ; G 679 +U 742 ; WX 500 ; N uni02E6 ; G 680 +U 743 ; WX 500 ; N uni02E7 ; G 681 +U 744 ; WX 500 ; N uni02E8 ; G 682 +U 745 ; WX 500 ; N uni02E9 ; G 683 +U 748 ; WX 500 ; N uni02EC ; G 684 +U 749 ; WX 500 ; N uni02ED ; G 685 +U 750 ; WX 644 ; N uni02EE ; G 686 +U 755 ; WX 500 ; N uni02F3 ; G 687 +U 759 ; WX 500 ; N uni02F7 ; G 688 +U 768 ; WX 0 ; N gravecomb ; G 689 +U 769 ; WX 0 ; N acutecomb ; G 690 +U 770 ; WX 0 ; N uni0302 ; G 691 +U 771 ; WX 0 ; N tildecomb ; G 692 +U 772 ; WX 0 ; N uni0304 ; G 693 +U 773 ; WX 0 ; N uni0305 ; G 694 +U 774 ; WX 0 ; N uni0306 ; G 695 +U 775 ; WX 0 ; N uni0307 ; G 696 +U 776 ; WX 0 ; N uni0308 ; G 697 +U 777 ; WX 0 ; N hookabovecomb ; G 698 +U 778 ; WX 0 ; N uni030A ; G 699 +U 779 ; WX 0 ; N uni030B ; G 700 +U 780 ; WX 0 ; N uni030C ; G 701 +U 781 ; WX 0 ; N uni030D ; G 702 +U 782 ; WX 0 ; N uni030E ; G 703 +U 783 ; WX 0 ; N uni030F ; G 704 +U 784 ; WX 0 ; N uni0310 ; G 705 +U 785 ; WX 0 ; N uni0311 ; G 706 +U 786 ; WX 0 ; N uni0312 ; G 707 +U 787 ; WX 0 ; N uni0313 ; G 708 +U 788 ; WX 0 ; N uni0314 ; G 709 +U 789 ; WX 0 ; N uni0315 ; G 710 +U 790 ; WX 0 ; N uni0316 ; G 711 +U 791 ; WX 0 ; N uni0317 ; G 712 +U 792 ; WX 0 ; N uni0318 ; G 713 +U 793 ; WX 0 ; N uni0319 ; G 714 +U 794 ; WX 0 ; N uni031A ; G 715 +U 795 ; WX 0 ; N uni031B ; G 716 +U 796 ; WX 0 ; N uni031C ; G 717 +U 797 ; WX 0 ; N uni031D ; G 718 +U 798 ; WX 0 ; N uni031E ; G 719 +U 799 ; WX 0 ; N uni031F ; G 720 +U 800 ; WX 0 ; N uni0320 ; G 721 +U 801 ; WX 0 ; N uni0321 ; G 722 +U 802 ; WX 0 ; N uni0322 ; G 723 +U 803 ; WX 0 ; N dotbelowcomb ; G 724 +U 804 ; WX 0 ; N uni0324 ; G 725 +U 805 ; WX 0 ; N uni0325 ; G 726 +U 806 ; WX 0 ; N uni0326 ; G 727 +U 807 ; WX 0 ; N uni0327 ; G 728 +U 808 ; WX 0 ; N uni0328 ; G 729 +U 809 ; WX 0 ; N uni0329 ; G 730 +U 810 ; WX 0 ; N uni032A ; G 731 +U 811 ; WX 0 ; N uni032B ; G 732 +U 812 ; WX 0 ; N uni032C ; G 733 +U 813 ; WX 0 ; N uni032D ; G 734 +U 814 ; WX 0 ; N uni032E ; G 735 +U 815 ; WX 0 ; N uni032F ; G 736 +U 816 ; WX 0 ; N uni0330 ; G 737 +U 817 ; WX 0 ; N uni0331 ; G 738 +U 818 ; WX 0 ; N uni0332 ; G 739 +U 819 ; WX 0 ; N uni0333 ; G 740 +U 820 ; WX 0 ; N uni0334 ; G 741 +U 821 ; WX 0 ; N uni0335 ; G 742 +U 822 ; WX 0 ; N uni0336 ; G 743 +U 823 ; WX 0 ; N uni0337 ; G 744 +U 824 ; WX 0 ; N uni0338 ; G 745 +U 825 ; WX 0 ; N uni0339 ; G 746 +U 826 ; WX 0 ; N uni033A ; G 747 +U 827 ; WX 0 ; N uni033B ; G 748 +U 828 ; WX 0 ; N uni033C ; G 749 +U 829 ; WX 0 ; N uni033D ; G 750 +U 830 ; WX 0 ; N uni033E ; G 751 +U 831 ; WX 0 ; N uni033F ; G 752 +U 832 ; WX 0 ; N uni0340 ; G 753 +U 833 ; WX 0 ; N uni0341 ; G 754 +U 834 ; WX 0 ; N uni0342 ; G 755 +U 835 ; WX 0 ; N uni0343 ; G 756 +U 836 ; WX 0 ; N uni0344 ; G 757 +U 837 ; WX 0 ; N uni0345 ; G 758 +U 838 ; WX 0 ; N uni0346 ; G 759 +U 839 ; WX 0 ; N uni0347 ; G 760 +U 840 ; WX 0 ; N uni0348 ; G 761 +U 841 ; WX 0 ; N uni0349 ; G 762 +U 842 ; WX 0 ; N uni034A ; G 763 +U 843 ; WX 0 ; N uni034B ; G 764 +U 844 ; WX 0 ; N uni034C ; G 765 +U 845 ; WX 0 ; N uni034D ; G 766 +U 846 ; WX 0 ; N uni034E ; G 767 +U 847 ; WX 0 ; N uni034F ; G 768 +U 849 ; WX 0 ; N uni0351 ; G 769 +U 850 ; WX 0 ; N uni0352 ; G 770 +U 851 ; WX 0 ; N uni0353 ; G 771 +U 855 ; WX 0 ; N uni0357 ; G 772 +U 856 ; WX 0 ; N uni0358 ; G 773 +U 858 ; WX 0 ; N uni035A ; G 774 +U 860 ; WX 0 ; N uni035C ; G 775 +U 861 ; WX 0 ; N uni035D ; G 776 +U 862 ; WX 0 ; N uni035E ; G 777 +U 863 ; WX 0 ; N uni035F ; G 778 +U 864 ; WX 0 ; N uni0360 ; G 779 +U 865 ; WX 0 ; N uni0361 ; G 780 +U 866 ; WX 0 ; N uni0362 ; G 781 +U 880 ; WX 698 ; N uni0370 ; G 782 +U 881 ; WX 565 ; N uni0371 ; G 783 +U 882 ; WX 1022 ; N uni0372 ; G 784 +U 883 ; WX 836 ; N uni0373 ; G 785 +U 884 ; WX 302 ; N uni0374 ; G 786 +U 885 ; WX 302 ; N uni0375 ; G 787 +U 886 ; WX 837 ; N uni0376 ; G 788 +U 887 ; WX 701 ; N uni0377 ; G 789 +U 890 ; WX 500 ; N uni037A ; G 790 +U 891 ; WX 593 ; N uni037B ; G 791 +U 892 ; WX 550 ; N uni037C ; G 792 +U 893 ; WX 549 ; N uni037D ; G 793 +U 894 ; WX 400 ; N uni037E ; G 794 +U 895 ; WX 372 ; N uni037F ; G 795 +U 900 ; WX 441 ; N tonos ; G 796 +U 901 ; WX 500 ; N dieresistonos ; G 797 +U 902 ; WX 797 ; N Alphatonos ; G 798 +U 903 ; WX 380 ; N anoteleia ; G 799 +U 904 ; WX 846 ; N Epsilontonos ; G 800 +U 905 ; WX 1009 ; N Etatonos ; G 801 +U 906 ; WX 563 ; N Iotatonos ; G 802 +U 908 ; WX 891 ; N Omicrontonos ; G 803 +U 910 ; WX 980 ; N Upsilontonos ; G 804 +U 911 ; WX 894 ; N Omegatonos ; G 805 +U 912 ; WX 390 ; N iotadieresistonos ; G 806 +U 913 ; WX 774 ; N Alpha ; G 807 +U 914 ; WX 762 ; N Beta ; G 808 +U 915 ; WX 637 ; N Gamma ; G 809 +U 916 ; WX 774 ; N uni0394 ; G 810 +U 917 ; WX 683 ; N Epsilon ; G 811 +U 918 ; WX 725 ; N Zeta ; G 812 +U 919 ; WX 837 ; N Eta ; G 813 +U 920 ; WX 850 ; N Theta ; G 814 +U 921 ; WX 372 ; N Iota ; G 815 +U 922 ; WX 775 ; N Kappa ; G 816 +U 923 ; WX 774 ; N Lambda ; G 817 +U 924 ; WX 995 ; N Mu ; G 818 +U 925 ; WX 837 ; N Nu ; G 819 +U 926 ; WX 632 ; N Xi ; G 820 +U 927 ; WX 850 ; N Omicron ; G 821 +U 928 ; WX 837 ; N Pi ; G 822 +U 929 ; WX 733 ; N Rho ; G 823 +U 931 ; WX 683 ; N Sigma ; G 824 +U 932 ; WX 682 ; N Tau ; G 825 +U 933 ; WX 724 ; N Upsilon ; G 826 +U 934 ; WX 850 ; N Phi ; G 827 +U 935 ; WX 771 ; N Chi ; G 828 +U 936 ; WX 850 ; N Psi ; G 829 +U 937 ; WX 850 ; N Omega ; G 830 +U 938 ; WX 372 ; N Iotadieresis ; G 831 +U 939 ; WX 724 ; N Upsilondieresis ; G 832 +U 940 ; WX 687 ; N alphatonos ; G 833 +U 941 ; WX 557 ; N epsilontonos ; G 834 +U 942 ; WX 712 ; N etatonos ; G 835 +U 943 ; WX 390 ; N iotatonos ; G 836 +U 944 ; WX 675 ; N upsilondieresistonos ; G 837 +U 945 ; WX 687 ; N alpha ; G 838 +U 946 ; WX 716 ; N beta ; G 839 +U 947 ; WX 681 ; N gamma ; G 840 +U 948 ; WX 687 ; N delta ; G 841 +U 949 ; WX 557 ; N epsilon ; G 842 +U 950 ; WX 591 ; N zeta ; G 843 +U 951 ; WX 712 ; N eta ; G 844 +U 952 ; WX 687 ; N theta ; G 845 +U 953 ; WX 390 ; N iota ; G 846 +U 954 ; WX 710 ; N kappa ; G 847 +U 955 ; WX 633 ; N lambda ; G 848 +U 956 ; WX 736 ; N uni03BC ; G 849 +U 957 ; WX 681 ; N nu ; G 850 +U 958 ; WX 591 ; N xi ; G 851 +U 959 ; WX 687 ; N omicron ; G 852 +U 960 ; WX 791 ; N pi ; G 853 +U 961 ; WX 716 ; N rho ; G 854 +U 962 ; WX 593 ; N sigma1 ; G 855 +U 963 ; WX 779 ; N sigma ; G 856 +U 964 ; WX 638 ; N tau ; G 857 +U 965 ; WX 675 ; N upsilon ; G 858 +U 966 ; WX 782 ; N phi ; G 859 +U 967 ; WX 645 ; N chi ; G 860 +U 968 ; WX 794 ; N psi ; G 861 +U 969 ; WX 869 ; N omega ; G 862 +U 970 ; WX 390 ; N iotadieresis ; G 863 +U 971 ; WX 675 ; N upsilondieresis ; G 864 +U 972 ; WX 687 ; N omicrontonos ; G 865 +U 973 ; WX 675 ; N upsilontonos ; G 866 +U 974 ; WX 869 ; N omegatonos ; G 867 +U 975 ; WX 775 ; N uni03CF ; G 868 +U 976 ; WX 651 ; N uni03D0 ; G 869 +U 977 ; WX 661 ; N theta1 ; G 870 +U 978 ; WX 746 ; N Upsilon1 ; G 871 +U 979 ; WX 981 ; N uni03D3 ; G 872 +U 980 ; WX 746 ; N uni03D4 ; G 873 +U 981 ; WX 796 ; N phi1 ; G 874 +U 982 ; WX 869 ; N omega1 ; G 875 +U 983 ; WX 744 ; N uni03D7 ; G 876 +U 984 ; WX 850 ; N uni03D8 ; G 877 +U 985 ; WX 687 ; N uni03D9 ; G 878 +U 986 ; WX 734 ; N uni03DA ; G 879 +U 987 ; WX 593 ; N uni03DB ; G 880 +U 988 ; WX 683 ; N uni03DC ; G 881 +U 989 ; WX 494 ; N uni03DD ; G 882 +U 990 ; WX 702 ; N uni03DE ; G 883 +U 991 ; WX 660 ; N uni03DF ; G 884 +U 992 ; WX 919 ; N uni03E0 ; G 885 +U 993 ; WX 627 ; N uni03E1 ; G 886 +U 994 ; WX 1093 ; N uni03E2 ; G 887 +U 995 ; WX 837 ; N uni03E3 ; G 888 +U 996 ; WX 832 ; N uni03E4 ; G 889 +U 997 ; WX 716 ; N uni03E5 ; G 890 +U 998 ; WX 928 ; N uni03E6 ; G 891 +U 999 ; WX 744 ; N uni03E7 ; G 892 +U 1000 ; WX 733 ; N uni03E8 ; G 893 +U 1001 ; WX 650 ; N uni03E9 ; G 894 +U 1002 ; WX 789 ; N uni03EA ; G 895 +U 1003 ; WX 671 ; N uni03EB ; G 896 +U 1004 ; WX 752 ; N uni03EC ; G 897 +U 1005 ; WX 716 ; N uni03ED ; G 898 +U 1006 ; WX 682 ; N uni03EE ; G 899 +U 1007 ; WX 590 ; N uni03EF ; G 900 +U 1008 ; WX 744 ; N uni03F0 ; G 901 +U 1009 ; WX 716 ; N uni03F1 ; G 902 +U 1010 ; WX 593 ; N uni03F2 ; G 903 +U 1011 ; WX 343 ; N uni03F3 ; G 904 +U 1012 ; WX 850 ; N uni03F4 ; G 905 +U 1013 ; WX 645 ; N uni03F5 ; G 906 +U 1014 ; WX 645 ; N uni03F6 ; G 907 +U 1015 ; WX 742 ; N uni03F7 ; G 908 +U 1016 ; WX 716 ; N uni03F8 ; G 909 +U 1017 ; WX 734 ; N uni03F9 ; G 910 +U 1018 ; WX 995 ; N uni03FA ; G 911 +U 1019 ; WX 732 ; N uni03FB ; G 912 +U 1020 ; WX 716 ; N uni03FC ; G 913 +U 1021 ; WX 734 ; N uni03FD ; G 914 +U 1022 ; WX 734 ; N uni03FE ; G 915 +U 1023 ; WX 698 ; N uni03FF ; G 916 +U 1024 ; WX 683 ; N uni0400 ; G 917 +U 1025 ; WX 683 ; N uni0401 ; G 918 +U 1026 ; WX 878 ; N uni0402 ; G 919 +U 1027 ; WX 637 ; N uni0403 ; G 920 +U 1028 ; WX 734 ; N uni0404 ; G 921 +U 1029 ; WX 720 ; N uni0405 ; G 922 +U 1030 ; WX 372 ; N uni0406 ; G 923 +U 1031 ; WX 372 ; N uni0407 ; G 924 +U 1032 ; WX 372 ; N uni0408 ; G 925 +U 1033 ; WX 1154 ; N uni0409 ; G 926 +U 1034 ; WX 1130 ; N uni040A ; G 927 +U 1035 ; WX 878 ; N uni040B ; G 928 +U 1036 ; WX 817 ; N uni040C ; G 929 +U 1037 ; WX 837 ; N uni040D ; G 930 +U 1038 ; WX 771 ; N uni040E ; G 931 +U 1039 ; WX 837 ; N uni040F ; G 932 +U 1040 ; WX 774 ; N uni0410 ; G 933 +U 1041 ; WX 762 ; N uni0411 ; G 934 +U 1042 ; WX 762 ; N uni0412 ; G 935 +U 1043 ; WX 637 ; N uni0413 ; G 936 +U 1044 ; WX 891 ; N uni0414 ; G 937 +U 1045 ; WX 683 ; N uni0415 ; G 938 +U 1046 ; WX 1224 ; N uni0416 ; G 939 +U 1047 ; WX 710 ; N uni0417 ; G 940 +U 1048 ; WX 837 ; N uni0418 ; G 941 +U 1049 ; WX 837 ; N uni0419 ; G 942 +U 1050 ; WX 817 ; N uni041A ; G 943 +U 1051 ; WX 831 ; N uni041B ; G 944 +U 1052 ; WX 995 ; N uni041C ; G 945 +U 1053 ; WX 837 ; N uni041D ; G 946 +U 1054 ; WX 850 ; N uni041E ; G 947 +U 1055 ; WX 837 ; N uni041F ; G 948 +U 1056 ; WX 733 ; N uni0420 ; G 949 +U 1057 ; WX 734 ; N uni0421 ; G 950 +U 1058 ; WX 682 ; N uni0422 ; G 951 +U 1059 ; WX 771 ; N uni0423 ; G 952 +U 1060 ; WX 992 ; N uni0424 ; G 953 +U 1061 ; WX 771 ; N uni0425 ; G 954 +U 1062 ; WX 928 ; N uni0426 ; G 955 +U 1063 ; WX 808 ; N uni0427 ; G 956 +U 1064 ; WX 1235 ; N uni0428 ; G 957 +U 1065 ; WX 1326 ; N uni0429 ; G 958 +U 1066 ; WX 939 ; N uni042A ; G 959 +U 1067 ; WX 1036 ; N uni042B ; G 960 +U 1068 ; WX 762 ; N uni042C ; G 961 +U 1069 ; WX 734 ; N uni042D ; G 962 +U 1070 ; WX 1174 ; N uni042E ; G 963 +U 1071 ; WX 770 ; N uni042F ; G 964 +U 1072 ; WX 675 ; N uni0430 ; G 965 +U 1073 ; WX 698 ; N uni0431 ; G 966 +U 1074 ; WX 633 ; N uni0432 ; G 967 +U 1075 ; WX 522 ; N uni0433 ; G 968 +U 1076 ; WX 808 ; N uni0434 ; G 969 +U 1077 ; WX 678 ; N uni0435 ; G 970 +U 1078 ; WX 995 ; N uni0436 ; G 971 +U 1079 ; WX 581 ; N uni0437 ; G 972 +U 1080 ; WX 701 ; N uni0438 ; G 973 +U 1081 ; WX 701 ; N uni0439 ; G 974 +U 1082 ; WX 679 ; N uni043A ; G 975 +U 1083 ; WX 732 ; N uni043B ; G 976 +U 1084 ; WX 817 ; N uni043C ; G 977 +U 1085 ; WX 691 ; N uni043D ; G 978 +U 1086 ; WX 687 ; N uni043E ; G 979 +U 1087 ; WX 691 ; N uni043F ; G 980 +U 1088 ; WX 716 ; N uni0440 ; G 981 +U 1089 ; WX 593 ; N uni0441 ; G 982 +U 1090 ; WX 580 ; N uni0442 ; G 983 +U 1091 ; WX 652 ; N uni0443 ; G 984 +U 1092 ; WX 992 ; N uni0444 ; G 985 +U 1093 ; WX 645 ; N uni0445 ; G 986 +U 1094 ; WX 741 ; N uni0446 ; G 987 +U 1095 ; WX 687 ; N uni0447 ; G 988 +U 1096 ; WX 1062 ; N uni0448 ; G 989 +U 1097 ; WX 1105 ; N uni0449 ; G 990 +U 1098 ; WX 751 ; N uni044A ; G 991 +U 1099 ; WX 904 ; N uni044B ; G 992 +U 1100 ; WX 632 ; N uni044C ; G 993 +U 1101 ; WX 593 ; N uni044D ; G 994 +U 1102 ; WX 972 ; N uni044E ; G 995 +U 1103 ; WX 642 ; N uni044F ; G 996 +U 1104 ; WX 678 ; N uni0450 ; G 997 +U 1105 ; WX 678 ; N uni0451 ; G 998 +U 1106 ; WX 714 ; N uni0452 ; G 999 +U 1107 ; WX 522 ; N uni0453 ; G 1000 +U 1108 ; WX 593 ; N uni0454 ; G 1001 +U 1109 ; WX 595 ; N uni0455 ; G 1002 +U 1110 ; WX 343 ; N uni0456 ; G 1003 +U 1111 ; WX 343 ; N uni0457 ; G 1004 +U 1112 ; WX 343 ; N uni0458 ; G 1005 +U 1113 ; WX 991 ; N uni0459 ; G 1006 +U 1114 ; WX 956 ; N uni045A ; G 1007 +U 1115 ; WX 734 ; N uni045B ; G 1008 +U 1116 ; WX 679 ; N uni045C ; G 1009 +U 1117 ; WX 701 ; N uni045D ; G 1010 +U 1118 ; WX 652 ; N uni045E ; G 1011 +U 1119 ; WX 691 ; N uni045F ; G 1012 +U 1120 ; WX 1093 ; N uni0460 ; G 1013 +U 1121 ; WX 869 ; N uni0461 ; G 1014 +U 1122 ; WX 840 ; N uni0462 ; G 1015 +U 1123 ; WX 736 ; N uni0463 ; G 1016 +U 1124 ; WX 1012 ; N uni0464 ; G 1017 +U 1125 ; WX 839 ; N uni0465 ; G 1018 +U 1126 ; WX 992 ; N uni0466 ; G 1019 +U 1127 ; WX 832 ; N uni0467 ; G 1020 +U 1128 ; WX 1358 ; N uni0468 ; G 1021 +U 1129 ; WX 1121 ; N uni0469 ; G 1022 +U 1130 ; WX 850 ; N uni046A ; G 1023 +U 1131 ; WX 687 ; N uni046B ; G 1024 +U 1132 ; WX 1236 ; N uni046C ; G 1025 +U 1133 ; WX 1007 ; N uni046D ; G 1026 +U 1134 ; WX 696 ; N uni046E ; G 1027 +U 1135 ; WX 557 ; N uni046F ; G 1028 +U 1136 ; WX 1075 ; N uni0470 ; G 1029 +U 1137 ; WX 1061 ; N uni0471 ; G 1030 +U 1138 ; WX 850 ; N uni0472 ; G 1031 +U 1139 ; WX 687 ; N uni0473 ; G 1032 +U 1140 ; WX 850 ; N uni0474 ; G 1033 +U 1141 ; WX 695 ; N uni0475 ; G 1034 +U 1142 ; WX 850 ; N uni0476 ; G 1035 +U 1143 ; WX 695 ; N uni0477 ; G 1036 +U 1144 ; WX 1148 ; N uni0478 ; G 1037 +U 1145 ; WX 1043 ; N uni0479 ; G 1038 +U 1146 ; WX 1074 ; N uni047A ; G 1039 +U 1147 ; WX 863 ; N uni047B ; G 1040 +U 1148 ; WX 1405 ; N uni047C ; G 1041 +U 1149 ; WX 1173 ; N uni047D ; G 1042 +U 1150 ; WX 1093 ; N uni047E ; G 1043 +U 1151 ; WX 869 ; N uni047F ; G 1044 +U 1152 ; WX 734 ; N uni0480 ; G 1045 +U 1153 ; WX 593 ; N uni0481 ; G 1046 +U 1154 ; WX 652 ; N uni0482 ; G 1047 +U 1155 ; WX 0 ; N uni0483 ; G 1048 +U 1156 ; WX 0 ; N uni0484 ; G 1049 +U 1157 ; WX 0 ; N uni0485 ; G 1050 +U 1158 ; WX 0 ; N uni0486 ; G 1051 +U 1159 ; WX 0 ; N uni0487 ; G 1052 +U 1160 ; WX 418 ; N uni0488 ; G 1053 +U 1161 ; WX 418 ; N uni0489 ; G 1054 +U 1162 ; WX 938 ; N uni048A ; G 1055 +U 1163 ; WX 806 ; N uni048B ; G 1056 +U 1164 ; WX 762 ; N uni048C ; G 1057 +U 1165 ; WX 611 ; N uni048D ; G 1058 +U 1166 ; WX 736 ; N uni048E ; G 1059 +U 1167 ; WX 718 ; N uni048F ; G 1060 +U 1168 ; WX 637 ; N uni0490 ; G 1061 +U 1169 ; WX 522 ; N uni0491 ; G 1062 +U 1170 ; WX 666 ; N uni0492 ; G 1063 +U 1171 ; WX 543 ; N uni0493 ; G 1064 +U 1172 ; WX 789 ; N uni0494 ; G 1065 +U 1173 ; WX 522 ; N uni0495 ; G 1066 +U 1174 ; WX 1224 ; N uni0496 ; G 1067 +U 1175 ; WX 995 ; N uni0497 ; G 1068 +U 1176 ; WX 710 ; N uni0498 ; G 1069 +U 1177 ; WX 581 ; N uni0499 ; G 1070 +U 1178 ; WX 775 ; N uni049A ; G 1071 +U 1179 ; WX 679 ; N uni049B ; G 1072 +U 1180 ; WX 817 ; N uni049C ; G 1073 +U 1181 ; WX 679 ; N uni049D ; G 1074 +U 1182 ; WX 817 ; N uni049E ; G 1075 +U 1183 ; WX 679 ; N uni049F ; G 1076 +U 1184 ; WX 1015 ; N uni04A0 ; G 1077 +U 1185 ; WX 826 ; N uni04A1 ; G 1078 +U 1186 ; WX 837 ; N uni04A2 ; G 1079 +U 1187 ; WX 691 ; N uni04A3 ; G 1080 +U 1188 ; WX 1103 ; N uni04A4 ; G 1081 +U 1189 ; WX 871 ; N uni04A5 ; G 1082 +U 1190 ; WX 1254 ; N uni04A6 ; G 1083 +U 1191 ; WX 979 ; N uni04A7 ; G 1084 +U 1192 ; WX 946 ; N uni04A8 ; G 1085 +U 1193 ; WX 859 ; N uni04A9 ; G 1086 +U 1194 ; WX 734 ; N uni04AA ; G 1087 +U 1195 ; WX 593 ; N uni04AB ; G 1088 +U 1196 ; WX 682 ; N uni04AC ; G 1089 +U 1197 ; WX 580 ; N uni04AD ; G 1090 +U 1198 ; WX 724 ; N uni04AE ; G 1091 +U 1199 ; WX 652 ; N uni04AF ; G 1092 +U 1200 ; WX 724 ; N uni04B0 ; G 1093 +U 1201 ; WX 652 ; N uni04B1 ; G 1094 +U 1202 ; WX 771 ; N uni04B2 ; G 1095 +U 1203 ; WX 645 ; N uni04B3 ; G 1096 +U 1204 ; WX 1104 ; N uni04B4 ; G 1097 +U 1205 ; WX 1001 ; N uni04B5 ; G 1098 +U 1206 ; WX 808 ; N uni04B6 ; G 1099 +U 1207 ; WX 687 ; N uni04B7 ; G 1100 +U 1208 ; WX 808 ; N uni04B8 ; G 1101 +U 1209 ; WX 687 ; N uni04B9 ; G 1102 +U 1210 ; WX 808 ; N uni04BA ; G 1103 +U 1211 ; WX 712 ; N uni04BB ; G 1104 +U 1212 ; WX 1026 ; N uni04BC ; G 1105 +U 1213 ; WX 810 ; N uni04BD ; G 1106 +U 1214 ; WX 1026 ; N uni04BE ; G 1107 +U 1215 ; WX 810 ; N uni04BF ; G 1108 +U 1216 ; WX 372 ; N uni04C0 ; G 1109 +U 1217 ; WX 1224 ; N uni04C1 ; G 1110 +U 1218 ; WX 995 ; N uni04C2 ; G 1111 +U 1219 ; WX 778 ; N uni04C3 ; G 1112 +U 1220 ; WX 629 ; N uni04C4 ; G 1113 +U 1221 ; WX 933 ; N uni04C5 ; G 1114 +U 1222 ; WX 804 ; N uni04C6 ; G 1115 +U 1223 ; WX 837 ; N uni04C7 ; G 1116 +U 1224 ; WX 691 ; N uni04C8 ; G 1117 +U 1225 ; WX 938 ; N uni04C9 ; G 1118 +U 1226 ; WX 806 ; N uni04CA ; G 1119 +U 1227 ; WX 808 ; N uni04CB ; G 1120 +U 1228 ; WX 687 ; N uni04CC ; G 1121 +U 1229 ; WX 1096 ; N uni04CD ; G 1122 +U 1230 ; WX 932 ; N uni04CE ; G 1123 +U 1231 ; WX 343 ; N uni04CF ; G 1124 +U 1232 ; WX 774 ; N uni04D0 ; G 1125 +U 1233 ; WX 675 ; N uni04D1 ; G 1126 +U 1234 ; WX 774 ; N uni04D2 ; G 1127 +U 1235 ; WX 675 ; N uni04D3 ; G 1128 +U 1236 ; WX 1085 ; N uni04D4 ; G 1129 +U 1237 ; WX 1048 ; N uni04D5 ; G 1130 +U 1238 ; WX 683 ; N uni04D6 ; G 1131 +U 1239 ; WX 678 ; N uni04D7 ; G 1132 +U 1240 ; WX 850 ; N uni04D8 ; G 1133 +U 1241 ; WX 678 ; N uni04D9 ; G 1134 +U 1242 ; WX 850 ; N uni04DA ; G 1135 +U 1243 ; WX 678 ; N uni04DB ; G 1136 +U 1244 ; WX 1224 ; N uni04DC ; G 1137 +U 1245 ; WX 995 ; N uni04DD ; G 1138 +U 1246 ; WX 710 ; N uni04DE ; G 1139 +U 1247 ; WX 581 ; N uni04DF ; G 1140 +U 1248 ; WX 772 ; N uni04E0 ; G 1141 +U 1249 ; WX 641 ; N uni04E1 ; G 1142 +U 1250 ; WX 837 ; N uni04E2 ; G 1143 +U 1251 ; WX 701 ; N uni04E3 ; G 1144 +U 1252 ; WX 837 ; N uni04E4 ; G 1145 +U 1253 ; WX 701 ; N uni04E5 ; G 1146 +U 1254 ; WX 850 ; N uni04E6 ; G 1147 +U 1255 ; WX 687 ; N uni04E7 ; G 1148 +U 1256 ; WX 850 ; N uni04E8 ; G 1149 +U 1257 ; WX 687 ; N uni04E9 ; G 1150 +U 1258 ; WX 850 ; N uni04EA ; G 1151 +U 1259 ; WX 687 ; N uni04EB ; G 1152 +U 1260 ; WX 734 ; N uni04EC ; G 1153 +U 1261 ; WX 593 ; N uni04ED ; G 1154 +U 1262 ; WX 771 ; N uni04EE ; G 1155 +U 1263 ; WX 652 ; N uni04EF ; G 1156 +U 1264 ; WX 771 ; N uni04F0 ; G 1157 +U 1265 ; WX 652 ; N uni04F1 ; G 1158 +U 1266 ; WX 771 ; N uni04F2 ; G 1159 +U 1267 ; WX 652 ; N uni04F3 ; G 1160 +U 1268 ; WX 808 ; N uni04F4 ; G 1161 +U 1269 ; WX 687 ; N uni04F5 ; G 1162 +U 1270 ; WX 637 ; N uni04F6 ; G 1163 +U 1271 ; WX 522 ; N uni04F7 ; G 1164 +U 1272 ; WX 1036 ; N uni04F8 ; G 1165 +U 1273 ; WX 904 ; N uni04F9 ; G 1166 +U 1274 ; WX 666 ; N uni04FA ; G 1167 +U 1275 ; WX 543 ; N uni04FB ; G 1168 +U 1276 ; WX 771 ; N uni04FC ; G 1169 +U 1277 ; WX 645 ; N uni04FD ; G 1170 +U 1278 ; WX 771 ; N uni04FE ; G 1171 +U 1279 ; WX 645 ; N uni04FF ; G 1172 +U 1280 ; WX 762 ; N uni0500 ; G 1173 +U 1281 ; WX 608 ; N uni0501 ; G 1174 +U 1282 ; WX 1159 ; N uni0502 ; G 1175 +U 1283 ; WX 893 ; N uni0503 ; G 1176 +U 1284 ; WX 1119 ; N uni0504 ; G 1177 +U 1285 ; WX 920 ; N uni0505 ; G 1178 +U 1286 ; WX 828 ; N uni0506 ; G 1179 +U 1287 ; WX 693 ; N uni0507 ; G 1180 +U 1288 ; WX 1242 ; N uni0508 ; G 1181 +U 1289 ; WX 1017 ; N uni0509 ; G 1182 +U 1290 ; WX 1289 ; N uni050A ; G 1183 +U 1291 ; WX 1013 ; N uni050B ; G 1184 +U 1292 ; WX 839 ; N uni050C ; G 1185 +U 1293 ; WX 638 ; N uni050D ; G 1186 +U 1294 ; WX 938 ; N uni050E ; G 1187 +U 1295 ; WX 803 ; N uni050F ; G 1188 +U 1296 ; WX 696 ; N uni0510 ; G 1189 +U 1297 ; WX 557 ; N uni0511 ; G 1190 +U 1298 ; WX 831 ; N uni0512 ; G 1191 +U 1299 ; WX 732 ; N uni0513 ; G 1192 +U 1300 ; WX 1286 ; N uni0514 ; G 1193 +U 1301 ; WX 1070 ; N uni0515 ; G 1194 +U 1302 ; WX 1065 ; N uni0516 ; G 1195 +U 1303 ; WX 982 ; N uni0517 ; G 1196 +U 1304 ; WX 1082 ; N uni0518 ; G 1197 +U 1305 ; WX 960 ; N uni0519 ; G 1198 +U 1306 ; WX 850 ; N uni051A ; G 1199 +U 1307 ; WX 716 ; N uni051B ; G 1200 +U 1308 ; WX 1103 ; N uni051C ; G 1201 +U 1309 ; WX 924 ; N uni051D ; G 1202 +U 1310 ; WX 817 ; N uni051E ; G 1203 +U 1311 ; WX 679 ; N uni051F ; G 1204 +U 1312 ; WX 1248 ; N uni0520 ; G 1205 +U 1313 ; WX 1022 ; N uni0521 ; G 1206 +U 1314 ; WX 1254 ; N uni0522 ; G 1207 +U 1315 ; WX 979 ; N uni0523 ; G 1208 +U 1316 ; WX 957 ; N uni0524 ; G 1209 +U 1317 ; WX 807 ; N uni0525 ; G 1210 +U 1329 ; WX 904 ; N uni0531 ; G 1211 +U 1330 ; WX 810 ; N uni0532 ; G 1212 +U 1331 ; WX 809 ; N uni0533 ; G 1213 +U 1332 ; WX 813 ; N uni0534 ; G 1214 +U 1333 ; WX 810 ; N uni0535 ; G 1215 +U 1334 ; WX 815 ; N uni0536 ; G 1216 +U 1335 ; WX 724 ; N uni0537 ; G 1217 +U 1336 ; WX 800 ; N uni0538 ; G 1218 +U 1337 ; WX 1004 ; N uni0539 ; G 1219 +U 1338 ; WX 809 ; N uni053A ; G 1220 +U 1339 ; WX 740 ; N uni053B ; G 1221 +U 1340 ; WX 620 ; N uni053C ; G 1222 +U 1341 ; WX 1068 ; N uni053D ; G 1223 +U 1342 ; WX 875 ; N uni053E ; G 1224 +U 1343 ; WX 792 ; N uni053F ; G 1225 +U 1344 ; WX 723 ; N uni0540 ; G 1226 +U 1345 ; WX 811 ; N uni0541 ; G 1227 +U 1346 ; WX 794 ; N uni0542 ; G 1228 +U 1347 ; WX 782 ; N uni0543 ; G 1229 +U 1348 ; WX 867 ; N uni0544 ; G 1230 +U 1349 ; WX 766 ; N uni0545 ; G 1231 +U 1350 ; WX 794 ; N uni0546 ; G 1232 +U 1351 ; WX 787 ; N uni0547 ; G 1233 +U 1352 ; WX 812 ; N uni0548 ; G 1234 +U 1353 ; WX 752 ; N uni0549 ; G 1235 +U 1354 ; WX 963 ; N uni054A ; G 1236 +U 1355 ; WX 790 ; N uni054B ; G 1237 +U 1356 ; WX 867 ; N uni054C ; G 1238 +U 1357 ; WX 812 ; N uni054D ; G 1239 +U 1358 ; WX 794 ; N uni054E ; G 1240 +U 1359 ; WX 771 ; N uni054F ; G 1241 +U 1360 ; WX 740 ; N uni0550 ; G 1242 +U 1361 ; WX 775 ; N uni0551 ; G 1243 +U 1362 ; WX 640 ; N uni0552 ; G 1244 +U 1363 ; WX 926 ; N uni0553 ; G 1245 +U 1364 ; WX 775 ; N uni0554 ; G 1246 +U 1365 ; WX 848 ; N uni0555 ; G 1247 +U 1366 ; WX 951 ; N uni0556 ; G 1248 +U 1369 ; WX 366 ; N uni0559 ; G 1249 +U 1370 ; WX 380 ; N uni055A ; G 1250 +U 1371 ; WX 342 ; N uni055B ; G 1251 +U 1372 ; WX 415 ; N uni055C ; G 1252 +U 1373 ; WX 348 ; N uni055D ; G 1253 +U 1374 ; WX 513 ; N uni055E ; G 1254 +U 1375 ; WX 521 ; N uni055F ; G 1255 +U 1377 ; WX 1043 ; N uni0561 ; G 1256 +U 1378 ; WX 713 ; N uni0562 ; G 1257 +U 1379 ; WX 782 ; N uni0563 ; G 1258 +U 1380 ; WX 786 ; N uni0564 ; G 1259 +U 1381 ; WX 713 ; N uni0565 ; G 1260 +U 1382 ; WX 715 ; N uni0566 ; G 1261 +U 1383 ; WX 628 ; N uni0567 ; G 1262 +U 1384 ; WX 713 ; N uni0568 ; G 1263 +U 1385 ; WX 840 ; N uni0569 ; G 1264 +U 1386 ; WX 782 ; N uni056A ; G 1265 +U 1387 ; WX 714 ; N uni056B ; G 1266 +U 1388 ; WX 344 ; N uni056C ; G 1267 +U 1389 ; WX 1094 ; N uni056D ; G 1268 +U 1390 ; WX 708 ; N uni056E ; G 1269 +U 1391 ; WX 714 ; N uni056F ; G 1270 +U 1392 ; WX 714 ; N uni0570 ; G 1271 +U 1393 ; WX 670 ; N uni0571 ; G 1272 +U 1394 ; WX 714 ; N uni0572 ; G 1273 +U 1395 ; WX 713 ; N uni0573 ; G 1274 +U 1396 ; WX 714 ; N uni0574 ; G 1275 +U 1397 ; WX 343 ; N uni0575 ; G 1276 +U 1398 ; WX 714 ; N uni0576 ; G 1277 +U 1399 ; WX 541 ; N uni0577 ; G 1278 +U 1400 ; WX 714 ; N uni0578 ; G 1279 +U 1401 ; WX 407 ; N uni0579 ; G 1280 +U 1402 ; WX 1043 ; N uni057A ; G 1281 +U 1403 ; WX 636 ; N uni057B ; G 1282 +U 1404 ; WX 740 ; N uni057C ; G 1283 +U 1405 ; WX 714 ; N uni057D ; G 1284 +U 1406 ; WX 714 ; N uni057E ; G 1285 +U 1407 ; WX 1038 ; N uni057F ; G 1286 +U 1408 ; WX 714 ; N uni0580 ; G 1287 +U 1409 ; WX 714 ; N uni0581 ; G 1288 +U 1410 ; WX 532 ; N uni0582 ; G 1289 +U 1411 ; WX 1038 ; N uni0583 ; G 1290 +U 1412 ; WX 720 ; N uni0584 ; G 1291 +U 1413 ; WX 689 ; N uni0585 ; G 1292 +U 1414 ; WX 904 ; N uni0586 ; G 1293 +U 1415 ; WX 902 ; N uni0587 ; G 1294 +U 1417 ; WX 400 ; N uni0589 ; G 1295 +U 1418 ; WX 415 ; N uni058A ; G 1296 +U 1456 ; WX 0 ; N uni05B0 ; G 1297 +U 1457 ; WX 0 ; N uni05B1 ; G 1298 +U 1458 ; WX 0 ; N uni05B2 ; G 1299 +U 1459 ; WX 0 ; N uni05B3 ; G 1300 +U 1460 ; WX 0 ; N uni05B4 ; G 1301 +U 1461 ; WX 0 ; N uni05B5 ; G 1302 +U 1462 ; WX 0 ; N uni05B6 ; G 1303 +U 1463 ; WX 0 ; N uni05B7 ; G 1304 +U 1464 ; WX 0 ; N uni05B8 ; G 1305 +U 1465 ; WX 0 ; N uni05B9 ; G 1306 +U 1466 ; WX 0 ; N uni05BA ; G 1307 +U 1467 ; WX 0 ; N uni05BB ; G 1308 +U 1468 ; WX 0 ; N uni05BC ; G 1309 +U 1469 ; WX 0 ; N uni05BD ; G 1310 +U 1470 ; WX 415 ; N uni05BE ; G 1311 +U 1471 ; WX 0 ; N uni05BF ; G 1312 +U 1472 ; WX 372 ; N uni05C0 ; G 1313 +U 1473 ; WX 0 ; N uni05C1 ; G 1314 +U 1474 ; WX 0 ; N uni05C2 ; G 1315 +U 1475 ; WX 372 ; N uni05C3 ; G 1316 +U 1478 ; WX 497 ; N uni05C6 ; G 1317 +U 1479 ; WX 0 ; N uni05C7 ; G 1318 +U 1488 ; WX 728 ; N uni05D0 ; G 1319 +U 1489 ; WX 610 ; N uni05D1 ; G 1320 +U 1490 ; WX 447 ; N uni05D2 ; G 1321 +U 1491 ; WX 588 ; N uni05D3 ; G 1322 +U 1492 ; WX 687 ; N uni05D4 ; G 1323 +U 1493 ; WX 343 ; N uni05D5 ; G 1324 +U 1494 ; WX 400 ; N uni05D6 ; G 1325 +U 1495 ; WX 687 ; N uni05D7 ; G 1326 +U 1496 ; WX 679 ; N uni05D8 ; G 1327 +U 1497 ; WX 294 ; N uni05D9 ; G 1328 +U 1498 ; WX 578 ; N uni05DA ; G 1329 +U 1499 ; WX 566 ; N uni05DB ; G 1330 +U 1500 ; WX 605 ; N uni05DC ; G 1331 +U 1501 ; WX 696 ; N uni05DD ; G 1332 +U 1502 ; WX 724 ; N uni05DE ; G 1333 +U 1503 ; WX 343 ; N uni05DF ; G 1334 +U 1504 ; WX 453 ; N uni05E0 ; G 1335 +U 1505 ; WX 680 ; N uni05E1 ; G 1336 +U 1506 ; WX 666 ; N uni05E2 ; G 1337 +U 1507 ; WX 675 ; N uni05E3 ; G 1338 +U 1508 ; WX 658 ; N uni05E4 ; G 1339 +U 1509 ; WX 661 ; N uni05E5 ; G 1340 +U 1510 ; WX 653 ; N uni05E6 ; G 1341 +U 1511 ; WX 736 ; N uni05E7 ; G 1342 +U 1512 ; WX 602 ; N uni05E8 ; G 1343 +U 1513 ; WX 749 ; N uni05E9 ; G 1344 +U 1514 ; WX 683 ; N uni05EA ; G 1345 +U 1520 ; WX 664 ; N uni05F0 ; G 1346 +U 1521 ; WX 664 ; N uni05F1 ; G 1347 +U 1522 ; WX 663 ; N uni05F2 ; G 1348 +U 1523 ; WX 444 ; N uni05F3 ; G 1349 +U 1524 ; WX 710 ; N uni05F4 ; G 1350 +U 3647 ; WX 696 ; N uni0E3F ; G 1351 +U 3713 ; WX 815 ; N uni0E81 ; G 1352 +U 3714 ; WX 748 ; N uni0E82 ; G 1353 +U 3716 ; WX 749 ; N uni0E84 ; G 1354 +U 3719 ; WX 569 ; N uni0E87 ; G 1355 +U 3720 ; WX 742 ; N uni0E88 ; G 1356 +U 3722 ; WX 744 ; N uni0E8A ; G 1357 +U 3725 ; WX 761 ; N uni0E8D ; G 1358 +U 3732 ; WX 706 ; N uni0E94 ; G 1359 +U 3733 ; WX 704 ; N uni0E95 ; G 1360 +U 3734 ; WX 747 ; N uni0E96 ; G 1361 +U 3735 ; WX 819 ; N uni0E97 ; G 1362 +U 3737 ; WX 730 ; N uni0E99 ; G 1363 +U 3738 ; WX 727 ; N uni0E9A ; G 1364 +U 3739 ; WX 727 ; N uni0E9B ; G 1365 +U 3740 ; WX 922 ; N uni0E9C ; G 1366 +U 3741 ; WX 827 ; N uni0E9D ; G 1367 +U 3742 ; WX 866 ; N uni0E9E ; G 1368 +U 3743 ; WX 866 ; N uni0E9F ; G 1369 +U 3745 ; WX 836 ; N uni0EA1 ; G 1370 +U 3746 ; WX 761 ; N uni0EA2 ; G 1371 +U 3747 ; WX 770 ; N uni0EA3 ; G 1372 +U 3749 ; WX 769 ; N uni0EA5 ; G 1373 +U 3751 ; WX 713 ; N uni0EA7 ; G 1374 +U 3754 ; WX 827 ; N uni0EAA ; G 1375 +U 3755 ; WX 1031 ; N uni0EAB ; G 1376 +U 3757 ; WX 724 ; N uni0EAD ; G 1377 +U 3758 ; WX 784 ; N uni0EAE ; G 1378 +U 3759 ; WX 934 ; N uni0EAF ; G 1379 +U 3760 ; WX 688 ; N uni0EB0 ; G 1380 +U 3761 ; WX 0 ; N uni0EB1 ; G 1381 +U 3762 ; WX 610 ; N uni0EB2 ; G 1382 +U 3763 ; WX 610 ; N uni0EB3 ; G 1383 +U 3764 ; WX 0 ; N uni0EB4 ; G 1384 +U 3765 ; WX 0 ; N uni0EB5 ; G 1385 +U 3766 ; WX 0 ; N uni0EB6 ; G 1386 +U 3767 ; WX 0 ; N uni0EB7 ; G 1387 +U 3768 ; WX 0 ; N uni0EB8 ; G 1388 +U 3769 ; WX 0 ; N uni0EB9 ; G 1389 +U 3771 ; WX 0 ; N uni0EBB ; G 1390 +U 3772 ; WX 0 ; N uni0EBC ; G 1391 +U 3773 ; WX 670 ; N uni0EBD ; G 1392 +U 3776 ; WX 516 ; N uni0EC0 ; G 1393 +U 3777 ; WX 860 ; N uni0EC1 ; G 1394 +U 3778 ; WX 516 ; N uni0EC2 ; G 1395 +U 3779 ; WX 650 ; N uni0EC3 ; G 1396 +U 3780 ; WX 632 ; N uni0EC4 ; G 1397 +U 3782 ; WX 759 ; N uni0EC6 ; G 1398 +U 3784 ; WX 0 ; N uni0EC8 ; G 1399 +U 3785 ; WX 0 ; N uni0EC9 ; G 1400 +U 3786 ; WX 0 ; N uni0ECA ; G 1401 +U 3787 ; WX 0 ; N uni0ECB ; G 1402 +U 3788 ; WX 0 ; N uni0ECC ; G 1403 +U 3789 ; WX 0 ; N uni0ECD ; G 1404 +U 3792 ; WX 771 ; N uni0ED0 ; G 1405 +U 3793 ; WX 771 ; N uni0ED1 ; G 1406 +U 3794 ; WX 693 ; N uni0ED2 ; G 1407 +U 3795 ; WX 836 ; N uni0ED3 ; G 1408 +U 3796 ; WX 729 ; N uni0ED4 ; G 1409 +U 3797 ; WX 729 ; N uni0ED5 ; G 1410 +U 3798 ; WX 849 ; N uni0ED6 ; G 1411 +U 3799 ; WX 790 ; N uni0ED7 ; G 1412 +U 3800 ; WX 759 ; N uni0ED8 ; G 1413 +U 3801 ; WX 910 ; N uni0ED9 ; G 1414 +U 3804 ; WX 1363 ; N uni0EDC ; G 1415 +U 3805 ; WX 1363 ; N uni0EDD ; G 1416 +U 4256 ; WX 874 ; N uni10A0 ; G 1417 +U 4257 ; WX 733 ; N uni10A1 ; G 1418 +U 4258 ; WX 679 ; N uni10A2 ; G 1419 +U 4259 ; WX 834 ; N uni10A3 ; G 1420 +U 4260 ; WX 615 ; N uni10A4 ; G 1421 +U 4261 ; WX 768 ; N uni10A5 ; G 1422 +U 4262 ; WX 753 ; N uni10A6 ; G 1423 +U 4263 ; WX 914 ; N uni10A7 ; G 1424 +U 4264 ; WX 453 ; N uni10A8 ; G 1425 +U 4265 ; WX 620 ; N uni10A9 ; G 1426 +U 4266 ; WX 843 ; N uni10AA ; G 1427 +U 4267 ; WX 882 ; N uni10AB ; G 1428 +U 4268 ; WX 625 ; N uni10AC ; G 1429 +U 4269 ; WX 854 ; N uni10AD ; G 1430 +U 4270 ; WX 781 ; N uni10AE ; G 1431 +U 4271 ; WX 629 ; N uni10AF ; G 1432 +U 4272 ; WX 912 ; N uni10B0 ; G 1433 +U 4273 ; WX 621 ; N uni10B1 ; G 1434 +U 4274 ; WX 620 ; N uni10B2 ; G 1435 +U 4275 ; WX 854 ; N uni10B3 ; G 1436 +U 4276 ; WX 866 ; N uni10B4 ; G 1437 +U 4277 ; WX 724 ; N uni10B5 ; G 1438 +U 4278 ; WX 630 ; N uni10B6 ; G 1439 +U 4279 ; WX 621 ; N uni10B7 ; G 1440 +U 4280 ; WX 625 ; N uni10B8 ; G 1441 +U 4281 ; WX 620 ; N uni10B9 ; G 1442 +U 4282 ; WX 818 ; N uni10BA ; G 1443 +U 4283 ; WX 874 ; N uni10BB ; G 1444 +U 4284 ; WX 615 ; N uni10BC ; G 1445 +U 4285 ; WX 623 ; N uni10BD ; G 1446 +U 4286 ; WX 625 ; N uni10BE ; G 1447 +U 4287 ; WX 725 ; N uni10BF ; G 1448 +U 4288 ; WX 844 ; N uni10C0 ; G 1449 +U 4289 ; WX 596 ; N uni10C1 ; G 1450 +U 4290 ; WX 688 ; N uni10C2 ; G 1451 +U 4291 ; WX 596 ; N uni10C3 ; G 1452 +U 4292 ; WX 594 ; N uni10C4 ; G 1453 +U 4293 ; WX 738 ; N uni10C5 ; G 1454 +U 4304 ; WX 554 ; N uni10D0 ; G 1455 +U 4305 ; WX 563 ; N uni10D1 ; G 1456 +U 4306 ; WX 622 ; N uni10D2 ; G 1457 +U 4307 ; WX 834 ; N uni10D3 ; G 1458 +U 4308 ; WX 550 ; N uni10D4 ; G 1459 +U 4309 ; WX 559 ; N uni10D5 ; G 1460 +U 4310 ; WX 546 ; N uni10D6 ; G 1461 +U 4311 ; WX 828 ; N uni10D7 ; G 1462 +U 4312 ; WX 563 ; N uni10D8 ; G 1463 +U 4313 ; WX 556 ; N uni10D9 ; G 1464 +U 4314 ; WX 1074 ; N uni10DA ; G 1465 +U 4315 ; WX 563 ; N uni10DB ; G 1466 +U 4316 ; WX 563 ; N uni10DC ; G 1467 +U 4317 ; WX 814 ; N uni10DD ; G 1468 +U 4318 ; WX 554 ; N uni10DE ; G 1469 +U 4319 ; WX 559 ; N uni10DF ; G 1470 +U 4320 ; WX 823 ; N uni10E0 ; G 1471 +U 4321 ; WX 563 ; N uni10E1 ; G 1472 +U 4322 ; WX 700 ; N uni10E2 ; G 1473 +U 4323 ; WX 582 ; N uni10E3 ; G 1474 +U 4324 ; WX 847 ; N uni10E4 ; G 1475 +U 4325 ; WX 555 ; N uni10E5 ; G 1476 +U 4326 ; WX 814 ; N uni10E6 ; G 1477 +U 4327 ; WX 559 ; N uni10E7 ; G 1478 +U 4328 ; WX 543 ; N uni10E8 ; G 1479 +U 4329 ; WX 563 ; N uni10E9 ; G 1480 +U 4330 ; WX 622 ; N uni10EA ; G 1481 +U 4331 ; WX 563 ; N uni10EB ; G 1482 +U 4332 ; WX 543 ; N uni10EC ; G 1483 +U 4333 ; WX 566 ; N uni10ED ; G 1484 +U 4334 ; WX 563 ; N uni10EE ; G 1485 +U 4335 ; WX 530 ; N uni10EF ; G 1486 +U 4336 ; WX 554 ; N uni10F0 ; G 1487 +U 4337 ; WX 554 ; N uni10F1 ; G 1488 +U 4338 ; WX 553 ; N uni10F2 ; G 1489 +U 4339 ; WX 554 ; N uni10F3 ; G 1490 +U 4340 ; WX 553 ; N uni10F4 ; G 1491 +U 4341 ; WX 583 ; N uni10F5 ; G 1492 +U 4342 ; WX 853 ; N uni10F6 ; G 1493 +U 4343 ; WX 604 ; N uni10F7 ; G 1494 +U 4344 ; WX 559 ; N uni10F8 ; G 1495 +U 4345 ; WX 632 ; N uni10F9 ; G 1496 +U 4346 ; WX 554 ; N uni10FA ; G 1497 +U 4347 ; WX 448 ; N uni10FB ; G 1498 +U 4348 ; WX 324 ; N uni10FC ; G 1499 +U 5121 ; WX 774 ; N uni1401 ; G 1500 +U 5122 ; WX 774 ; N uni1402 ; G 1501 +U 5123 ; WX 774 ; N uni1403 ; G 1502 +U 5124 ; WX 774 ; N uni1404 ; G 1503 +U 5125 ; WX 905 ; N uni1405 ; G 1504 +U 5126 ; WX 905 ; N uni1406 ; G 1505 +U 5127 ; WX 905 ; N uni1407 ; G 1506 +U 5129 ; WX 905 ; N uni1409 ; G 1507 +U 5130 ; WX 905 ; N uni140A ; G 1508 +U 5131 ; WX 905 ; N uni140B ; G 1509 +U 5132 ; WX 1018 ; N uni140C ; G 1510 +U 5133 ; WX 1009 ; N uni140D ; G 1511 +U 5134 ; WX 1018 ; N uni140E ; G 1512 +U 5135 ; WX 1009 ; N uni140F ; G 1513 +U 5136 ; WX 1018 ; N uni1410 ; G 1514 +U 5137 ; WX 1009 ; N uni1411 ; G 1515 +U 5138 ; WX 1149 ; N uni1412 ; G 1516 +U 5139 ; WX 1140 ; N uni1413 ; G 1517 +U 5140 ; WX 1149 ; N uni1414 ; G 1518 +U 5141 ; WX 1140 ; N uni1415 ; G 1519 +U 5142 ; WX 905 ; N uni1416 ; G 1520 +U 5143 ; WX 1149 ; N uni1417 ; G 1521 +U 5144 ; WX 1142 ; N uni1418 ; G 1522 +U 5145 ; WX 1149 ; N uni1419 ; G 1523 +U 5146 ; WX 1142 ; N uni141A ; G 1524 +U 5147 ; WX 905 ; N uni141B ; G 1525 +U 5149 ; WX 310 ; N uni141D ; G 1526 +U 5150 ; WX 529 ; N uni141E ; G 1527 +U 5151 ; WX 425 ; N uni141F ; G 1528 +U 5152 ; WX 425 ; N uni1420 ; G 1529 +U 5153 ; WX 395 ; N uni1421 ; G 1530 +U 5154 ; WX 395 ; N uni1422 ; G 1531 +U 5155 ; WX 395 ; N uni1423 ; G 1532 +U 5156 ; WX 395 ; N uni1424 ; G 1533 +U 5157 ; WX 564 ; N uni1425 ; G 1534 +U 5158 ; WX 470 ; N uni1426 ; G 1535 +U 5159 ; WX 310 ; N uni1427 ; G 1536 +U 5160 ; WX 395 ; N uni1428 ; G 1537 +U 5161 ; WX 395 ; N uni1429 ; G 1538 +U 5162 ; WX 395 ; N uni142A ; G 1539 +U 5163 ; WX 1213 ; N uni142B ; G 1540 +U 5164 ; WX 986 ; N uni142C ; G 1541 +U 5165 ; WX 1216 ; N uni142D ; G 1542 +U 5166 ; WX 1297 ; N uni142E ; G 1543 +U 5167 ; WX 774 ; N uni142F ; G 1544 +U 5168 ; WX 774 ; N uni1430 ; G 1545 +U 5169 ; WX 774 ; N uni1431 ; G 1546 +U 5170 ; WX 774 ; N uni1432 ; G 1547 +U 5171 ; WX 886 ; N uni1433 ; G 1548 +U 5172 ; WX 886 ; N uni1434 ; G 1549 +U 5173 ; WX 886 ; N uni1435 ; G 1550 +U 5175 ; WX 886 ; N uni1437 ; G 1551 +U 5176 ; WX 886 ; N uni1438 ; G 1552 +U 5177 ; WX 886 ; N uni1439 ; G 1553 +U 5178 ; WX 1018 ; N uni143A ; G 1554 +U 5179 ; WX 1009 ; N uni143B ; G 1555 +U 5180 ; WX 1018 ; N uni143C ; G 1556 +U 5181 ; WX 1009 ; N uni143D ; G 1557 +U 5182 ; WX 1018 ; N uni143E ; G 1558 +U 5183 ; WX 1009 ; N uni143F ; G 1559 +U 5184 ; WX 1149 ; N uni1440 ; G 1560 +U 5185 ; WX 1140 ; N uni1441 ; G 1561 +U 5186 ; WX 1149 ; N uni1442 ; G 1562 +U 5187 ; WX 1140 ; N uni1443 ; G 1563 +U 5188 ; WX 1149 ; N uni1444 ; G 1564 +U 5189 ; WX 1142 ; N uni1445 ; G 1565 +U 5190 ; WX 1149 ; N uni1446 ; G 1566 +U 5191 ; WX 1142 ; N uni1447 ; G 1567 +U 5192 ; WX 886 ; N uni1448 ; G 1568 +U 5193 ; WX 576 ; N uni1449 ; G 1569 +U 5194 ; WX 229 ; N uni144A ; G 1570 +U 5196 ; WX 812 ; N uni144C ; G 1571 +U 5197 ; WX 812 ; N uni144D ; G 1572 +U 5198 ; WX 812 ; N uni144E ; G 1573 +U 5199 ; WX 812 ; N uni144F ; G 1574 +U 5200 ; WX 815 ; N uni1450 ; G 1575 +U 5201 ; WX 815 ; N uni1451 ; G 1576 +U 5202 ; WX 815 ; N uni1452 ; G 1577 +U 5204 ; WX 815 ; N uni1454 ; G 1578 +U 5205 ; WX 815 ; N uni1455 ; G 1579 +U 5206 ; WX 815 ; N uni1456 ; G 1580 +U 5207 ; WX 1056 ; N uni1457 ; G 1581 +U 5208 ; WX 1048 ; N uni1458 ; G 1582 +U 5209 ; WX 1056 ; N uni1459 ; G 1583 +U 5210 ; WX 1048 ; N uni145A ; G 1584 +U 5211 ; WX 1056 ; N uni145B ; G 1585 +U 5212 ; WX 1048 ; N uni145C ; G 1586 +U 5213 ; WX 1060 ; N uni145D ; G 1587 +U 5214 ; WX 1054 ; N uni145E ; G 1588 +U 5215 ; WX 1060 ; N uni145F ; G 1589 +U 5216 ; WX 1054 ; N uni1460 ; G 1590 +U 5217 ; WX 1060 ; N uni1461 ; G 1591 +U 5218 ; WX 1052 ; N uni1462 ; G 1592 +U 5219 ; WX 1060 ; N uni1463 ; G 1593 +U 5220 ; WX 1052 ; N uni1464 ; G 1594 +U 5221 ; WX 1060 ; N uni1465 ; G 1595 +U 5222 ; WX 483 ; N uni1466 ; G 1596 +U 5223 ; WX 1005 ; N uni1467 ; G 1597 +U 5224 ; WX 1005 ; N uni1468 ; G 1598 +U 5225 ; WX 1023 ; N uni1469 ; G 1599 +U 5226 ; WX 1017 ; N uni146A ; G 1600 +U 5227 ; WX 743 ; N uni146B ; G 1601 +U 5228 ; WX 743 ; N uni146C ; G 1602 +U 5229 ; WX 743 ; N uni146D ; G 1603 +U 5230 ; WX 743 ; N uni146E ; G 1604 +U 5231 ; WX 743 ; N uni146F ; G 1605 +U 5232 ; WX 743 ; N uni1470 ; G 1606 +U 5233 ; WX 743 ; N uni1471 ; G 1607 +U 5234 ; WX 743 ; N uni1472 ; G 1608 +U 5235 ; WX 743 ; N uni1473 ; G 1609 +U 5236 ; WX 1029 ; N uni1474 ; G 1610 +U 5237 ; WX 975 ; N uni1475 ; G 1611 +U 5238 ; WX 980 ; N uni1476 ; G 1612 +U 5239 ; WX 975 ; N uni1477 ; G 1613 +U 5240 ; WX 980 ; N uni1478 ; G 1614 +U 5241 ; WX 975 ; N uni1479 ; G 1615 +U 5242 ; WX 1029 ; N uni147A ; G 1616 +U 5243 ; WX 975 ; N uni147B ; G 1617 +U 5244 ; WX 1029 ; N uni147C ; G 1618 +U 5245 ; WX 975 ; N uni147D ; G 1619 +U 5246 ; WX 980 ; N uni147E ; G 1620 +U 5247 ; WX 975 ; N uni147F ; G 1621 +U 5248 ; WX 980 ; N uni1480 ; G 1622 +U 5249 ; WX 975 ; N uni1481 ; G 1623 +U 5250 ; WX 980 ; N uni1482 ; G 1624 +U 5251 ; WX 501 ; N uni1483 ; G 1625 +U 5252 ; WX 501 ; N uni1484 ; G 1626 +U 5253 ; WX 938 ; N uni1485 ; G 1627 +U 5254 ; WX 938 ; N uni1486 ; G 1628 +U 5255 ; WX 938 ; N uni1487 ; G 1629 +U 5256 ; WX 938 ; N uni1488 ; G 1630 +U 5257 ; WX 743 ; N uni1489 ; G 1631 +U 5258 ; WX 743 ; N uni148A ; G 1632 +U 5259 ; WX 743 ; N uni148B ; G 1633 +U 5260 ; WX 743 ; N uni148C ; G 1634 +U 5261 ; WX 743 ; N uni148D ; G 1635 +U 5262 ; WX 743 ; N uni148E ; G 1636 +U 5263 ; WX 743 ; N uni148F ; G 1637 +U 5264 ; WX 743 ; N uni1490 ; G 1638 +U 5265 ; WX 743 ; N uni1491 ; G 1639 +U 5266 ; WX 1029 ; N uni1492 ; G 1640 +U 5267 ; WX 975 ; N uni1493 ; G 1641 +U 5268 ; WX 1029 ; N uni1494 ; G 1642 +U 5269 ; WX 975 ; N uni1495 ; G 1643 +U 5270 ; WX 1029 ; N uni1496 ; G 1644 +U 5271 ; WX 975 ; N uni1497 ; G 1645 +U 5272 ; WX 1029 ; N uni1498 ; G 1646 +U 5273 ; WX 975 ; N uni1499 ; G 1647 +U 5274 ; WX 1029 ; N uni149A ; G 1648 +U 5275 ; WX 975 ; N uni149B ; G 1649 +U 5276 ; WX 1029 ; N uni149C ; G 1650 +U 5277 ; WX 975 ; N uni149D ; G 1651 +U 5278 ; WX 1029 ; N uni149E ; G 1652 +U 5279 ; WX 975 ; N uni149F ; G 1653 +U 5280 ; WX 1029 ; N uni14A0 ; G 1654 +U 5281 ; WX 501 ; N uni14A1 ; G 1655 +U 5282 ; WX 501 ; N uni14A2 ; G 1656 +U 5283 ; WX 626 ; N uni14A3 ; G 1657 +U 5284 ; WX 626 ; N uni14A4 ; G 1658 +U 5285 ; WX 626 ; N uni14A5 ; G 1659 +U 5286 ; WX 626 ; N uni14A6 ; G 1660 +U 5287 ; WX 626 ; N uni14A7 ; G 1661 +U 5288 ; WX 626 ; N uni14A8 ; G 1662 +U 5289 ; WX 626 ; N uni14A9 ; G 1663 +U 5290 ; WX 626 ; N uni14AA ; G 1664 +U 5291 ; WX 626 ; N uni14AB ; G 1665 +U 5292 ; WX 881 ; N uni14AC ; G 1666 +U 5293 ; WX 854 ; N uni14AD ; G 1667 +U 5294 ; WX 863 ; N uni14AE ; G 1668 +U 5295 ; WX 874 ; N uni14AF ; G 1669 +U 5296 ; WX 863 ; N uni14B0 ; G 1670 +U 5297 ; WX 874 ; N uni14B1 ; G 1671 +U 5298 ; WX 881 ; N uni14B2 ; G 1672 +U 5299 ; WX 874 ; N uni14B3 ; G 1673 +U 5300 ; WX 881 ; N uni14B4 ; G 1674 +U 5301 ; WX 874 ; N uni14B5 ; G 1675 +U 5302 ; WX 863 ; N uni14B6 ; G 1676 +U 5303 ; WX 874 ; N uni14B7 ; G 1677 +U 5304 ; WX 863 ; N uni14B8 ; G 1678 +U 5305 ; WX 874 ; N uni14B9 ; G 1679 +U 5306 ; WX 863 ; N uni14BA ; G 1680 +U 5307 ; WX 436 ; N uni14BB ; G 1681 +U 5308 ; WX 548 ; N uni14BC ; G 1682 +U 5309 ; WX 436 ; N uni14BD ; G 1683 +U 5312 ; WX 988 ; N uni14C0 ; G 1684 +U 5313 ; WX 988 ; N uni14C1 ; G 1685 +U 5314 ; WX 988 ; N uni14C2 ; G 1686 +U 5315 ; WX 988 ; N uni14C3 ; G 1687 +U 5316 ; WX 931 ; N uni14C4 ; G 1688 +U 5317 ; WX 931 ; N uni14C5 ; G 1689 +U 5318 ; WX 931 ; N uni14C6 ; G 1690 +U 5319 ; WX 931 ; N uni14C7 ; G 1691 +U 5320 ; WX 931 ; N uni14C8 ; G 1692 +U 5321 ; WX 1238 ; N uni14C9 ; G 1693 +U 5322 ; WX 1247 ; N uni14CA ; G 1694 +U 5323 ; WX 1200 ; N uni14CB ; G 1695 +U 5324 ; WX 1228 ; N uni14CC ; G 1696 +U 5325 ; WX 1200 ; N uni14CD ; G 1697 +U 5326 ; WX 1228 ; N uni14CE ; G 1698 +U 5327 ; WX 931 ; N uni14CF ; G 1699 +U 5328 ; WX 660 ; N uni14D0 ; G 1700 +U 5329 ; WX 497 ; N uni14D1 ; G 1701 +U 5330 ; WX 660 ; N uni14D2 ; G 1702 +U 5331 ; WX 988 ; N uni14D3 ; G 1703 +U 5332 ; WX 988 ; N uni14D4 ; G 1704 +U 5333 ; WX 988 ; N uni14D5 ; G 1705 +U 5334 ; WX 988 ; N uni14D6 ; G 1706 +U 5335 ; WX 931 ; N uni14D7 ; G 1707 +U 5336 ; WX 931 ; N uni14D8 ; G 1708 +U 5337 ; WX 931 ; N uni14D9 ; G 1709 +U 5338 ; WX 931 ; N uni14DA ; G 1710 +U 5339 ; WX 931 ; N uni14DB ; G 1711 +U 5340 ; WX 1231 ; N uni14DC ; G 1712 +U 5341 ; WX 1247 ; N uni14DD ; G 1713 +U 5342 ; WX 1283 ; N uni14DE ; G 1714 +U 5343 ; WX 1228 ; N uni14DF ; G 1715 +U 5344 ; WX 1283 ; N uni14E0 ; G 1716 +U 5345 ; WX 1228 ; N uni14E1 ; G 1717 +U 5346 ; WX 1228 ; N uni14E2 ; G 1718 +U 5347 ; WX 1214 ; N uni14E3 ; G 1719 +U 5348 ; WX 1228 ; N uni14E4 ; G 1720 +U 5349 ; WX 1214 ; N uni14E5 ; G 1721 +U 5350 ; WX 1283 ; N uni14E6 ; G 1722 +U 5351 ; WX 1228 ; N uni14E7 ; G 1723 +U 5352 ; WX 1283 ; N uni14E8 ; G 1724 +U 5353 ; WX 1228 ; N uni14E9 ; G 1725 +U 5354 ; WX 660 ; N uni14EA ; G 1726 +U 5356 ; WX 886 ; N uni14EC ; G 1727 +U 5357 ; WX 730 ; N uni14ED ; G 1728 +U 5358 ; WX 730 ; N uni14EE ; G 1729 +U 5359 ; WX 730 ; N uni14EF ; G 1730 +U 5360 ; WX 730 ; N uni14F0 ; G 1731 +U 5361 ; WX 730 ; N uni14F1 ; G 1732 +U 5362 ; WX 730 ; N uni14F2 ; G 1733 +U 5363 ; WX 730 ; N uni14F3 ; G 1734 +U 5364 ; WX 730 ; N uni14F4 ; G 1735 +U 5365 ; WX 730 ; N uni14F5 ; G 1736 +U 5366 ; WX 998 ; N uni14F6 ; G 1737 +U 5367 ; WX 958 ; N uni14F7 ; G 1738 +U 5368 ; WX 967 ; N uni14F8 ; G 1739 +U 5369 ; WX 989 ; N uni14F9 ; G 1740 +U 5370 ; WX 967 ; N uni14FA ; G 1741 +U 5371 ; WX 989 ; N uni14FB ; G 1742 +U 5372 ; WX 998 ; N uni14FC ; G 1743 +U 5373 ; WX 958 ; N uni14FD ; G 1744 +U 5374 ; WX 998 ; N uni14FE ; G 1745 +U 5375 ; WX 958 ; N uni14FF ; G 1746 +U 5376 ; WX 967 ; N uni1500 ; G 1747 +U 5377 ; WX 989 ; N uni1501 ; G 1748 +U 5378 ; WX 967 ; N uni1502 ; G 1749 +U 5379 ; WX 989 ; N uni1503 ; G 1750 +U 5380 ; WX 967 ; N uni1504 ; G 1751 +U 5381 ; WX 493 ; N uni1505 ; G 1752 +U 5382 ; WX 460 ; N uni1506 ; G 1753 +U 5383 ; WX 493 ; N uni1507 ; G 1754 +U 5392 ; WX 923 ; N uni1510 ; G 1755 +U 5393 ; WX 923 ; N uni1511 ; G 1756 +U 5394 ; WX 923 ; N uni1512 ; G 1757 +U 5395 ; WX 1136 ; N uni1513 ; G 1758 +U 5396 ; WX 1136 ; N uni1514 ; G 1759 +U 5397 ; WX 1136 ; N uni1515 ; G 1760 +U 5398 ; WX 1136 ; N uni1516 ; G 1761 +U 5399 ; WX 1209 ; N uni1517 ; G 1762 +U 5400 ; WX 1202 ; N uni1518 ; G 1763 +U 5401 ; WX 1209 ; N uni1519 ; G 1764 +U 5402 ; WX 1202 ; N uni151A ; G 1765 +U 5403 ; WX 1209 ; N uni151B ; G 1766 +U 5404 ; WX 1202 ; N uni151C ; G 1767 +U 5405 ; WX 1431 ; N uni151D ; G 1768 +U 5406 ; WX 1420 ; N uni151E ; G 1769 +U 5407 ; WX 1431 ; N uni151F ; G 1770 +U 5408 ; WX 1420 ; N uni1520 ; G 1771 +U 5409 ; WX 1431 ; N uni1521 ; G 1772 +U 5410 ; WX 1420 ; N uni1522 ; G 1773 +U 5411 ; WX 1431 ; N uni1523 ; G 1774 +U 5412 ; WX 1420 ; N uni1524 ; G 1775 +U 5413 ; WX 746 ; N uni1525 ; G 1776 +U 5414 ; WX 776 ; N uni1526 ; G 1777 +U 5415 ; WX 776 ; N uni1527 ; G 1778 +U 5416 ; WX 776 ; N uni1528 ; G 1779 +U 5417 ; WX 776 ; N uni1529 ; G 1780 +U 5418 ; WX 776 ; N uni152A ; G 1781 +U 5419 ; WX 776 ; N uni152B ; G 1782 +U 5420 ; WX 776 ; N uni152C ; G 1783 +U 5421 ; WX 776 ; N uni152D ; G 1784 +U 5422 ; WX 776 ; N uni152E ; G 1785 +U 5423 ; WX 1003 ; N uni152F ; G 1786 +U 5424 ; WX 1003 ; N uni1530 ; G 1787 +U 5425 ; WX 1013 ; N uni1531 ; G 1788 +U 5426 ; WX 996 ; N uni1532 ; G 1789 +U 5427 ; WX 1013 ; N uni1533 ; G 1790 +U 5428 ; WX 996 ; N uni1534 ; G 1791 +U 5429 ; WX 1003 ; N uni1535 ; G 1792 +U 5430 ; WX 1003 ; N uni1536 ; G 1793 +U 5431 ; WX 1003 ; N uni1537 ; G 1794 +U 5432 ; WX 1003 ; N uni1538 ; G 1795 +U 5433 ; WX 1013 ; N uni1539 ; G 1796 +U 5434 ; WX 996 ; N uni153A ; G 1797 +U 5435 ; WX 1013 ; N uni153B ; G 1798 +U 5436 ; WX 996 ; N uni153C ; G 1799 +U 5437 ; WX 1013 ; N uni153D ; G 1800 +U 5438 ; WX 495 ; N uni153E ; G 1801 +U 5440 ; WX 395 ; N uni1540 ; G 1802 +U 5441 ; WX 510 ; N uni1541 ; G 1803 +U 5442 ; WX 1033 ; N uni1542 ; G 1804 +U 5443 ; WX 1033 ; N uni1543 ; G 1805 +U 5444 ; WX 976 ; N uni1544 ; G 1806 +U 5445 ; WX 976 ; N uni1545 ; G 1807 +U 5446 ; WX 976 ; N uni1546 ; G 1808 +U 5447 ; WX 976 ; N uni1547 ; G 1809 +U 5448 ; WX 733 ; N uni1548 ; G 1810 +U 5449 ; WX 733 ; N uni1549 ; G 1811 +U 5450 ; WX 733 ; N uni154A ; G 1812 +U 5451 ; WX 733 ; N uni154B ; G 1813 +U 5452 ; WX 733 ; N uni154C ; G 1814 +U 5453 ; WX 733 ; N uni154D ; G 1815 +U 5454 ; WX 1003 ; N uni154E ; G 1816 +U 5455 ; WX 959 ; N uni154F ; G 1817 +U 5456 ; WX 495 ; N uni1550 ; G 1818 +U 5458 ; WX 886 ; N uni1552 ; G 1819 +U 5459 ; WX 774 ; N uni1553 ; G 1820 +U 5460 ; WX 774 ; N uni1554 ; G 1821 +U 5461 ; WX 774 ; N uni1555 ; G 1822 +U 5462 ; WX 774 ; N uni1556 ; G 1823 +U 5463 ; WX 928 ; N uni1557 ; G 1824 +U 5464 ; WX 928 ; N uni1558 ; G 1825 +U 5465 ; WX 928 ; N uni1559 ; G 1826 +U 5466 ; WX 928 ; N uni155A ; G 1827 +U 5467 ; WX 1172 ; N uni155B ; G 1828 +U 5468 ; WX 1142 ; N uni155C ; G 1829 +U 5469 ; WX 602 ; N uni155D ; G 1830 +U 5470 ; WX 812 ; N uni155E ; G 1831 +U 5471 ; WX 812 ; N uni155F ; G 1832 +U 5472 ; WX 812 ; N uni1560 ; G 1833 +U 5473 ; WX 812 ; N uni1561 ; G 1834 +U 5474 ; WX 812 ; N uni1562 ; G 1835 +U 5475 ; WX 812 ; N uni1563 ; G 1836 +U 5476 ; WX 815 ; N uni1564 ; G 1837 +U 5477 ; WX 815 ; N uni1565 ; G 1838 +U 5478 ; WX 815 ; N uni1566 ; G 1839 +U 5479 ; WX 815 ; N uni1567 ; G 1840 +U 5480 ; WX 1060 ; N uni1568 ; G 1841 +U 5481 ; WX 1052 ; N uni1569 ; G 1842 +U 5482 ; WX 548 ; N uni156A ; G 1843 +U 5492 ; WX 977 ; N uni1574 ; G 1844 +U 5493 ; WX 977 ; N uni1575 ; G 1845 +U 5494 ; WX 977 ; N uni1576 ; G 1846 +U 5495 ; WX 977 ; N uni1577 ; G 1847 +U 5496 ; WX 977 ; N uni1578 ; G 1848 +U 5497 ; WX 977 ; N uni1579 ; G 1849 +U 5498 ; WX 977 ; N uni157A ; G 1850 +U 5499 ; WX 618 ; N uni157B ; G 1851 +U 5500 ; WX 837 ; N uni157C ; G 1852 +U 5501 ; WX 510 ; N uni157D ; G 1853 +U 5502 ; WX 1238 ; N uni157E ; G 1854 +U 5503 ; WX 1238 ; N uni157F ; G 1855 +U 5504 ; WX 1238 ; N uni1580 ; G 1856 +U 5505 ; WX 1238 ; N uni1581 ; G 1857 +U 5506 ; WX 1238 ; N uni1582 ; G 1858 +U 5507 ; WX 1238 ; N uni1583 ; G 1859 +U 5508 ; WX 1238 ; N uni1584 ; G 1860 +U 5509 ; WX 989 ; N uni1585 ; G 1861 +U 5514 ; WX 977 ; N uni158A ; G 1862 +U 5515 ; WX 977 ; N uni158B ; G 1863 +U 5516 ; WX 977 ; N uni158C ; G 1864 +U 5517 ; WX 977 ; N uni158D ; G 1865 +U 5518 ; WX 1591 ; N uni158E ; G 1866 +U 5519 ; WX 1591 ; N uni158F ; G 1867 +U 5520 ; WX 1591 ; N uni1590 ; G 1868 +U 5521 ; WX 1295 ; N uni1591 ; G 1869 +U 5522 ; WX 1295 ; N uni1592 ; G 1870 +U 5523 ; WX 1591 ; N uni1593 ; G 1871 +U 5524 ; WX 1591 ; N uni1594 ; G 1872 +U 5525 ; WX 848 ; N uni1595 ; G 1873 +U 5526 ; WX 1273 ; N uni1596 ; G 1874 +U 5536 ; WX 988 ; N uni15A0 ; G 1875 +U 5537 ; WX 988 ; N uni15A1 ; G 1876 +U 5538 ; WX 931 ; N uni15A2 ; G 1877 +U 5539 ; WX 931 ; N uni15A3 ; G 1878 +U 5540 ; WX 931 ; N uni15A4 ; G 1879 +U 5541 ; WX 931 ; N uni15A5 ; G 1880 +U 5542 ; WX 660 ; N uni15A6 ; G 1881 +U 5543 ; WX 776 ; N uni15A7 ; G 1882 +U 5544 ; WX 776 ; N uni15A8 ; G 1883 +U 5545 ; WX 776 ; N uni15A9 ; G 1884 +U 5546 ; WX 776 ; N uni15AA ; G 1885 +U 5547 ; WX 776 ; N uni15AB ; G 1886 +U 5548 ; WX 776 ; N uni15AC ; G 1887 +U 5549 ; WX 776 ; N uni15AD ; G 1888 +U 5550 ; WX 495 ; N uni15AE ; G 1889 +U 5551 ; WX 743 ; N uni15AF ; G 1890 +U 5598 ; WX 830 ; N uni15DE ; G 1891 +U 5601 ; WX 830 ; N uni15E1 ; G 1892 +U 5702 ; WX 496 ; N uni1646 ; G 1893 +U 5703 ; WX 496 ; N uni1647 ; G 1894 +U 5742 ; WX 413 ; N uni166E ; G 1895 +U 5743 ; WX 1238 ; N uni166F ; G 1896 +U 5744 ; WX 1591 ; N uni1670 ; G 1897 +U 5745 ; WX 2016 ; N uni1671 ; G 1898 +U 5746 ; WX 2016 ; N uni1672 ; G 1899 +U 5747 ; WX 1720 ; N uni1673 ; G 1900 +U 5748 ; WX 1678 ; N uni1674 ; G 1901 +U 5749 ; WX 2016 ; N uni1675 ; G 1902 +U 5750 ; WX 2016 ; N uni1676 ; G 1903 +U 7424 ; WX 652 ; N uni1D00 ; G 1904 +U 7425 ; WX 833 ; N uni1D01 ; G 1905 +U 7426 ; WX 1048 ; N uni1D02 ; G 1906 +U 7427 ; WX 608 ; N uni1D03 ; G 1907 +U 7428 ; WX 593 ; N uni1D04 ; G 1908 +U 7429 ; WX 676 ; N uni1D05 ; G 1909 +U 7430 ; WX 676 ; N uni1D06 ; G 1910 +U 7431 ; WX 559 ; N uni1D07 ; G 1911 +U 7432 ; WX 557 ; N uni1D08 ; G 1912 +U 7433 ; WX 343 ; N uni1D09 ; G 1913 +U 7434 ; WX 494 ; N uni1D0A ; G 1914 +U 7435 ; WX 665 ; N uni1D0B ; G 1915 +U 7436 ; WX 539 ; N uni1D0C ; G 1916 +U 7437 ; WX 817 ; N uni1D0D ; G 1917 +U 7438 ; WX 701 ; N uni1D0E ; G 1918 +U 7439 ; WX 687 ; N uni1D0F ; G 1919 +U 7440 ; WX 593 ; N uni1D10 ; G 1920 +U 7441 ; WX 660 ; N uni1D11 ; G 1921 +U 7442 ; WX 660 ; N uni1D12 ; G 1922 +U 7443 ; WX 660 ; N uni1D13 ; G 1923 +U 7444 ; WX 1094 ; N uni1D14 ; G 1924 +U 7446 ; WX 687 ; N uni1D16 ; G 1925 +U 7447 ; WX 687 ; N uni1D17 ; G 1926 +U 7448 ; WX 556 ; N uni1D18 ; G 1927 +U 7449 ; WX 642 ; N uni1D19 ; G 1928 +U 7450 ; WX 642 ; N uni1D1A ; G 1929 +U 7451 ; WX 580 ; N uni1D1B ; G 1930 +U 7452 ; WX 634 ; N uni1D1C ; G 1931 +U 7453 ; WX 737 ; N uni1D1D ; G 1932 +U 7454 ; WX 948 ; N uni1D1E ; G 1933 +U 7455 ; WX 695 ; N uni1D1F ; G 1934 +U 7456 ; WX 652 ; N uni1D20 ; G 1935 +U 7457 ; WX 924 ; N uni1D21 ; G 1936 +U 7458 ; WX 582 ; N uni1D22 ; G 1937 +U 7459 ; WX 646 ; N uni1D23 ; G 1938 +U 7462 ; WX 539 ; N uni1D26 ; G 1939 +U 7463 ; WX 652 ; N uni1D27 ; G 1940 +U 7464 ; WX 691 ; N uni1D28 ; G 1941 +U 7465 ; WX 556 ; N uni1D29 ; G 1942 +U 7466 ; WX 781 ; N uni1D2A ; G 1943 +U 7467 ; WX 732 ; N uni1D2B ; G 1944 +U 7468 ; WX 487 ; N uni1D2C ; G 1945 +U 7469 ; WX 683 ; N uni1D2D ; G 1946 +U 7470 ; WX 480 ; N uni1D2E ; G 1947 +U 7472 ; WX 523 ; N uni1D30 ; G 1948 +U 7473 ; WX 430 ; N uni1D31 ; G 1949 +U 7474 ; WX 430 ; N uni1D32 ; G 1950 +U 7475 ; WX 517 ; N uni1D33 ; G 1951 +U 7476 ; WX 527 ; N uni1D34 ; G 1952 +U 7477 ; WX 234 ; N uni1D35 ; G 1953 +U 7478 ; WX 234 ; N uni1D36 ; G 1954 +U 7479 ; WX 488 ; N uni1D37 ; G 1955 +U 7480 ; WX 401 ; N uni1D38 ; G 1956 +U 7481 ; WX 626 ; N uni1D39 ; G 1957 +U 7482 ; WX 527 ; N uni1D3A ; G 1958 +U 7483 ; WX 527 ; N uni1D3B ; G 1959 +U 7484 ; WX 535 ; N uni1D3C ; G 1960 +U 7485 ; WX 509 ; N uni1D3D ; G 1961 +U 7486 ; WX 461 ; N uni1D3E ; G 1962 +U 7487 ; WX 485 ; N uni1D3F ; G 1963 +U 7488 ; WX 430 ; N uni1D40 ; G 1964 +U 7489 ; WX 511 ; N uni1D41 ; G 1965 +U 7490 ; WX 695 ; N uni1D42 ; G 1966 +U 7491 ; WX 458 ; N uni1D43 ; G 1967 +U 7492 ; WX 458 ; N uni1D44 ; G 1968 +U 7493 ; WX 479 ; N uni1D45 ; G 1969 +U 7494 ; WX 712 ; N uni1D46 ; G 1970 +U 7495 ; WX 479 ; N uni1D47 ; G 1971 +U 7496 ; WX 479 ; N uni1D48 ; G 1972 +U 7497 ; WX 479 ; N uni1D49 ; G 1973 +U 7498 ; WX 479 ; N uni1D4A ; G 1974 +U 7499 ; WX 386 ; N uni1D4B ; G 1975 +U 7500 ; WX 386 ; N uni1D4C ; G 1976 +U 7501 ; WX 479 ; N uni1D4D ; G 1977 +U 7502 ; WX 219 ; N uni1D4E ; G 1978 +U 7503 ; WX 487 ; N uni1D4F ; G 1979 +U 7504 ; WX 664 ; N uni1D50 ; G 1980 +U 7505 ; WX 456 ; N uni1D51 ; G 1981 +U 7506 ; WX 488 ; N uni1D52 ; G 1982 +U 7507 ; WX 414 ; N uni1D53 ; G 1983 +U 7508 ; WX 488 ; N uni1D54 ; G 1984 +U 7509 ; WX 488 ; N uni1D55 ; G 1985 +U 7510 ; WX 479 ; N uni1D56 ; G 1986 +U 7511 ; WX 388 ; N uni1D57 ; G 1987 +U 7512 ; WX 456 ; N uni1D58 ; G 1988 +U 7513 ; WX 462 ; N uni1D59 ; G 1989 +U 7514 ; WX 664 ; N uni1D5A ; G 1990 +U 7515 ; WX 501 ; N uni1D5B ; G 1991 +U 7517 ; WX 451 ; N uni1D5D ; G 1992 +U 7518 ; WX 429 ; N uni1D5E ; G 1993 +U 7519 ; WX 433 ; N uni1D5F ; G 1994 +U 7520 ; WX 493 ; N uni1D60 ; G 1995 +U 7521 ; WX 406 ; N uni1D61 ; G 1996 +U 7522 ; WX 219 ; N uni1D62 ; G 1997 +U 7523 ; WX 315 ; N uni1D63 ; G 1998 +U 7524 ; WX 456 ; N uni1D64 ; G 1999 +U 7525 ; WX 501 ; N uni1D65 ; G 2000 +U 7526 ; WX 451 ; N uni1D66 ; G 2001 +U 7527 ; WX 429 ; N uni1D67 ; G 2002 +U 7528 ; WX 451 ; N uni1D68 ; G 2003 +U 7529 ; WX 493 ; N uni1D69 ; G 2004 +U 7530 ; WX 406 ; N uni1D6A ; G 2005 +U 7543 ; WX 716 ; N uni1D77 ; G 2006 +U 7544 ; WX 527 ; N uni1D78 ; G 2007 +U 7547 ; WX 545 ; N uni1D7B ; G 2008 +U 7549 ; WX 747 ; N uni1D7D ; G 2009 +U 7557 ; WX 514 ; N uni1D85 ; G 2010 +U 7579 ; WX 479 ; N uni1D9B ; G 2011 +U 7580 ; WX 414 ; N uni1D9C ; G 2012 +U 7581 ; WX 414 ; N uni1D9D ; G 2013 +U 7582 ; WX 488 ; N uni1D9E ; G 2014 +U 7583 ; WX 386 ; N uni1D9F ; G 2015 +U 7584 ; WX 377 ; N uni1DA0 ; G 2016 +U 7585 ; WX 348 ; N uni1DA1 ; G 2017 +U 7586 ; WX 479 ; N uni1DA2 ; G 2018 +U 7587 ; WX 456 ; N uni1DA3 ; G 2019 +U 7588 ; WX 347 ; N uni1DA4 ; G 2020 +U 7589 ; WX 281 ; N uni1DA5 ; G 2021 +U 7590 ; WX 347 ; N uni1DA6 ; G 2022 +U 7591 ; WX 347 ; N uni1DA7 ; G 2023 +U 7592 ; WX 431 ; N uni1DA8 ; G 2024 +U 7593 ; WX 326 ; N uni1DA9 ; G 2025 +U 7594 ; WX 330 ; N uni1DAA ; G 2026 +U 7595 ; WX 370 ; N uni1DAB ; G 2027 +U 7596 ; WX 664 ; N uni1DAC ; G 2028 +U 7597 ; WX 664 ; N uni1DAD ; G 2029 +U 7598 ; WX 562 ; N uni1DAE ; G 2030 +U 7599 ; WX 562 ; N uni1DAF ; G 2031 +U 7600 ; WX 448 ; N uni1DB0 ; G 2032 +U 7601 ; WX 488 ; N uni1DB1 ; G 2033 +U 7602 ; WX 542 ; N uni1DB2 ; G 2034 +U 7603 ; WX 422 ; N uni1DB3 ; G 2035 +U 7604 ; WX 396 ; N uni1DB4 ; G 2036 +U 7605 ; WX 388 ; N uni1DB5 ; G 2037 +U 7606 ; WX 583 ; N uni1DB6 ; G 2038 +U 7607 ; WX 494 ; N uni1DB7 ; G 2039 +U 7608 ; WX 399 ; N uni1DB8 ; G 2040 +U 7609 ; WX 451 ; N uni1DB9 ; G 2041 +U 7610 ; WX 501 ; N uni1DBA ; G 2042 +U 7611 ; WX 417 ; N uni1DBB ; G 2043 +U 7612 ; WX 523 ; N uni1DBC ; G 2044 +U 7613 ; WX 470 ; N uni1DBD ; G 2045 +U 7614 ; WX 455 ; N uni1DBE ; G 2046 +U 7615 ; WX 425 ; N uni1DBF ; G 2047 +U 7620 ; WX 0 ; N uni1DC4 ; G 2048 +U 7621 ; WX 0 ; N uni1DC5 ; G 2049 +U 7622 ; WX 0 ; N uni1DC6 ; G 2050 +U 7623 ; WX 0 ; N uni1DC7 ; G 2051 +U 7624 ; WX 0 ; N uni1DC8 ; G 2052 +U 7625 ; WX 0 ; N uni1DC9 ; G 2053 +U 7680 ; WX 774 ; N uni1E00 ; G 2054 +U 7681 ; WX 675 ; N uni1E01 ; G 2055 +U 7682 ; WX 762 ; N uni1E02 ; G 2056 +U 7683 ; WX 716 ; N uni1E03 ; G 2057 +U 7684 ; WX 762 ; N uni1E04 ; G 2058 +U 7685 ; WX 716 ; N uni1E05 ; G 2059 +U 7686 ; WX 762 ; N uni1E06 ; G 2060 +U 7687 ; WX 716 ; N uni1E07 ; G 2061 +U 7688 ; WX 734 ; N uni1E08 ; G 2062 +U 7689 ; WX 593 ; N uni1E09 ; G 2063 +U 7690 ; WX 830 ; N uni1E0A ; G 2064 +U 7691 ; WX 716 ; N uni1E0B ; G 2065 +U 7692 ; WX 830 ; N uni1E0C ; G 2066 +U 7693 ; WX 716 ; N uni1E0D ; G 2067 +U 7694 ; WX 830 ; N uni1E0E ; G 2068 +U 7695 ; WX 716 ; N uni1E0F ; G 2069 +U 7696 ; WX 830 ; N uni1E10 ; G 2070 +U 7697 ; WX 716 ; N uni1E11 ; G 2071 +U 7698 ; WX 830 ; N uni1E12 ; G 2072 +U 7699 ; WX 716 ; N uni1E13 ; G 2073 +U 7700 ; WX 683 ; N uni1E14 ; G 2074 +U 7701 ; WX 678 ; N uni1E15 ; G 2075 +U 7702 ; WX 683 ; N uni1E16 ; G 2076 +U 7703 ; WX 678 ; N uni1E17 ; G 2077 +U 7704 ; WX 683 ; N uni1E18 ; G 2078 +U 7705 ; WX 678 ; N uni1E19 ; G 2079 +U 7706 ; WX 683 ; N uni1E1A ; G 2080 +U 7707 ; WX 678 ; N uni1E1B ; G 2081 +U 7708 ; WX 683 ; N uni1E1C ; G 2082 +U 7709 ; WX 678 ; N uni1E1D ; G 2083 +U 7710 ; WX 683 ; N uni1E1E ; G 2084 +U 7711 ; WX 435 ; N uni1E1F ; G 2085 +U 7712 ; WX 821 ; N uni1E20 ; G 2086 +U 7713 ; WX 716 ; N uni1E21 ; G 2087 +U 7714 ; WX 837 ; N uni1E22 ; G 2088 +U 7715 ; WX 712 ; N uni1E23 ; G 2089 +U 7716 ; WX 837 ; N uni1E24 ; G 2090 +U 7717 ; WX 712 ; N uni1E25 ; G 2091 +U 7718 ; WX 837 ; N uni1E26 ; G 2092 +U 7719 ; WX 712 ; N uni1E27 ; G 2093 +U 7720 ; WX 837 ; N uni1E28 ; G 2094 +U 7721 ; WX 712 ; N uni1E29 ; G 2095 +U 7722 ; WX 837 ; N uni1E2A ; G 2096 +U 7723 ; WX 712 ; N uni1E2B ; G 2097 +U 7724 ; WX 372 ; N uni1E2C ; G 2098 +U 7725 ; WX 343 ; N uni1E2D ; G 2099 +U 7726 ; WX 372 ; N uni1E2E ; G 2100 +U 7727 ; WX 343 ; N uni1E2F ; G 2101 +U 7728 ; WX 775 ; N uni1E30 ; G 2102 +U 7729 ; WX 665 ; N uni1E31 ; G 2103 +U 7730 ; WX 775 ; N uni1E32 ; G 2104 +U 7731 ; WX 665 ; N uni1E33 ; G 2105 +U 7732 ; WX 775 ; N uni1E34 ; G 2106 +U 7733 ; WX 665 ; N uni1E35 ; G 2107 +U 7734 ; WX 637 ; N uni1E36 ; G 2108 +U 7735 ; WX 343 ; N uni1E37 ; G 2109 +U 7736 ; WX 637 ; N uni1E38 ; G 2110 +U 7737 ; WX 343 ; N uni1E39 ; G 2111 +U 7738 ; WX 637 ; N uni1E3A ; G 2112 +U 7739 ; WX 343 ; N uni1E3B ; G 2113 +U 7740 ; WX 637 ; N uni1E3C ; G 2114 +U 7741 ; WX 343 ; N uni1E3D ; G 2115 +U 7742 ; WX 995 ; N uni1E3E ; G 2116 +U 7743 ; WX 1042 ; N uni1E3F ; G 2117 +U 7744 ; WX 995 ; N uni1E40 ; G 2118 +U 7745 ; WX 1042 ; N uni1E41 ; G 2119 +U 7746 ; WX 995 ; N uni1E42 ; G 2120 +U 7747 ; WX 1042 ; N uni1E43 ; G 2121 +U 7748 ; WX 837 ; N uni1E44 ; G 2122 +U 7749 ; WX 712 ; N uni1E45 ; G 2123 +U 7750 ; WX 837 ; N uni1E46 ; G 2124 +U 7751 ; WX 712 ; N uni1E47 ; G 2125 +U 7752 ; WX 837 ; N uni1E48 ; G 2126 +U 7753 ; WX 712 ; N uni1E49 ; G 2127 +U 7754 ; WX 837 ; N uni1E4A ; G 2128 +U 7755 ; WX 712 ; N uni1E4B ; G 2129 +U 7756 ; WX 850 ; N uni1E4C ; G 2130 +U 7757 ; WX 687 ; N uni1E4D ; G 2131 +U 7758 ; WX 850 ; N uni1E4E ; G 2132 +U 7759 ; WX 687 ; N uni1E4F ; G 2133 +U 7760 ; WX 850 ; N uni1E50 ; G 2134 +U 7761 ; WX 687 ; N uni1E51 ; G 2135 +U 7762 ; WX 850 ; N uni1E52 ; G 2136 +U 7763 ; WX 687 ; N uni1E53 ; G 2137 +U 7764 ; WX 733 ; N uni1E54 ; G 2138 +U 7765 ; WX 716 ; N uni1E55 ; G 2139 +U 7766 ; WX 733 ; N uni1E56 ; G 2140 +U 7767 ; WX 716 ; N uni1E57 ; G 2141 +U 7768 ; WX 770 ; N uni1E58 ; G 2142 +U 7769 ; WX 493 ; N uni1E59 ; G 2143 +U 7770 ; WX 770 ; N uni1E5A ; G 2144 +U 7771 ; WX 493 ; N uni1E5B ; G 2145 +U 7772 ; WX 770 ; N uni1E5C ; G 2146 +U 7773 ; WX 493 ; N uni1E5D ; G 2147 +U 7774 ; WX 770 ; N uni1E5E ; G 2148 +U 7775 ; WX 493 ; N uni1E5F ; G 2149 +U 7776 ; WX 720 ; N uni1E60 ; G 2150 +U 7777 ; WX 595 ; N uni1E61 ; G 2151 +U 7778 ; WX 720 ; N uni1E62 ; G 2152 +U 7779 ; WX 595 ; N uni1E63 ; G 2153 +U 7780 ; WX 720 ; N uni1E64 ; G 2154 +U 7781 ; WX 595 ; N uni1E65 ; G 2155 +U 7782 ; WX 720 ; N uni1E66 ; G 2156 +U 7783 ; WX 595 ; N uni1E67 ; G 2157 +U 7784 ; WX 720 ; N uni1E68 ; G 2158 +U 7785 ; WX 595 ; N uni1E69 ; G 2159 +U 7786 ; WX 682 ; N uni1E6A ; G 2160 +U 7787 ; WX 478 ; N uni1E6B ; G 2161 +U 7788 ; WX 682 ; N uni1E6C ; G 2162 +U 7789 ; WX 478 ; N uni1E6D ; G 2163 +U 7790 ; WX 682 ; N uni1E6E ; G 2164 +U 7791 ; WX 478 ; N uni1E6F ; G 2165 +U 7792 ; WX 682 ; N uni1E70 ; G 2166 +U 7793 ; WX 478 ; N uni1E71 ; G 2167 +U 7794 ; WX 812 ; N uni1E72 ; G 2168 +U 7795 ; WX 712 ; N uni1E73 ; G 2169 +U 7796 ; WX 812 ; N uni1E74 ; G 2170 +U 7797 ; WX 712 ; N uni1E75 ; G 2171 +U 7798 ; WX 812 ; N uni1E76 ; G 2172 +U 7799 ; WX 712 ; N uni1E77 ; G 2173 +U 7800 ; WX 812 ; N uni1E78 ; G 2174 +U 7801 ; WX 712 ; N uni1E79 ; G 2175 +U 7802 ; WX 812 ; N uni1E7A ; G 2176 +U 7803 ; WX 712 ; N uni1E7B ; G 2177 +U 7804 ; WX 774 ; N uni1E7C ; G 2178 +U 7805 ; WX 652 ; N uni1E7D ; G 2179 +U 7806 ; WX 774 ; N uni1E7E ; G 2180 +U 7807 ; WX 652 ; N uni1E7F ; G 2181 +U 7808 ; WX 1103 ; N Wgrave ; G 2182 +U 7809 ; WX 924 ; N wgrave ; G 2183 +U 7810 ; WX 1103 ; N Wacute ; G 2184 +U 7811 ; WX 924 ; N wacute ; G 2185 +U 7812 ; WX 1103 ; N Wdieresis ; G 2186 +U 7813 ; WX 924 ; N wdieresis ; G 2187 +U 7814 ; WX 1103 ; N uni1E86 ; G 2188 +U 7815 ; WX 924 ; N uni1E87 ; G 2189 +U 7816 ; WX 1103 ; N uni1E88 ; G 2190 +U 7817 ; WX 924 ; N uni1E89 ; G 2191 +U 7818 ; WX 771 ; N uni1E8A ; G 2192 +U 7819 ; WX 645 ; N uni1E8B ; G 2193 +U 7820 ; WX 771 ; N uni1E8C ; G 2194 +U 7821 ; WX 645 ; N uni1E8D ; G 2195 +U 7822 ; WX 724 ; N uni1E8E ; G 2196 +U 7823 ; WX 652 ; N uni1E8F ; G 2197 +U 7824 ; WX 725 ; N uni1E90 ; G 2198 +U 7825 ; WX 582 ; N uni1E91 ; G 2199 +U 7826 ; WX 725 ; N uni1E92 ; G 2200 +U 7827 ; WX 582 ; N uni1E93 ; G 2201 +U 7828 ; WX 725 ; N uni1E94 ; G 2202 +U 7829 ; WX 582 ; N uni1E95 ; G 2203 +U 7830 ; WX 712 ; N uni1E96 ; G 2204 +U 7831 ; WX 478 ; N uni1E97 ; G 2205 +U 7832 ; WX 924 ; N uni1E98 ; G 2206 +U 7833 ; WX 652 ; N uni1E99 ; G 2207 +U 7834 ; WX 675 ; N uni1E9A ; G 2208 +U 7835 ; WX 435 ; N uni1E9B ; G 2209 +U 7836 ; WX 435 ; N uni1E9C ; G 2210 +U 7837 ; WX 435 ; N uni1E9D ; G 2211 +U 7838 ; WX 896 ; N uni1E9E ; G 2212 +U 7839 ; WX 687 ; N uni1E9F ; G 2213 +U 7840 ; WX 774 ; N uni1EA0 ; G 2214 +U 7841 ; WX 675 ; N uni1EA1 ; G 2215 +U 7842 ; WX 774 ; N uni1EA2 ; G 2216 +U 7843 ; WX 675 ; N uni1EA3 ; G 2217 +U 7844 ; WX 774 ; N uni1EA4 ; G 2218 +U 7845 ; WX 675 ; N uni1EA5 ; G 2219 +U 7846 ; WX 774 ; N uni1EA6 ; G 2220 +U 7847 ; WX 675 ; N uni1EA7 ; G 2221 +U 7848 ; WX 774 ; N uni1EA8 ; G 2222 +U 7849 ; WX 675 ; N uni1EA9 ; G 2223 +U 7850 ; WX 774 ; N uni1EAA ; G 2224 +U 7851 ; WX 675 ; N uni1EAB ; G 2225 +U 7852 ; WX 774 ; N uni1EAC ; G 2226 +U 7853 ; WX 675 ; N uni1EAD ; G 2227 +U 7854 ; WX 774 ; N uni1EAE ; G 2228 +U 7855 ; WX 675 ; N uni1EAF ; G 2229 +U 7856 ; WX 774 ; N uni1EB0 ; G 2230 +U 7857 ; WX 675 ; N uni1EB1 ; G 2231 +U 7858 ; WX 774 ; N uni1EB2 ; G 2232 +U 7859 ; WX 675 ; N uni1EB3 ; G 2233 +U 7860 ; WX 774 ; N uni1EB4 ; G 2234 +U 7861 ; WX 675 ; N uni1EB5 ; G 2235 +U 7862 ; WX 774 ; N uni1EB6 ; G 2236 +U 7863 ; WX 675 ; N uni1EB7 ; G 2237 +U 7864 ; WX 683 ; N uni1EB8 ; G 2238 +U 7865 ; WX 678 ; N uni1EB9 ; G 2239 +U 7866 ; WX 683 ; N uni1EBA ; G 2240 +U 7867 ; WX 678 ; N uni1EBB ; G 2241 +U 7868 ; WX 683 ; N uni1EBC ; G 2242 +U 7869 ; WX 678 ; N uni1EBD ; G 2243 +U 7870 ; WX 683 ; N uni1EBE ; G 2244 +U 7871 ; WX 678 ; N uni1EBF ; G 2245 +U 7872 ; WX 683 ; N uni1EC0 ; G 2246 +U 7873 ; WX 678 ; N uni1EC1 ; G 2247 +U 7874 ; WX 683 ; N uni1EC2 ; G 2248 +U 7875 ; WX 678 ; N uni1EC3 ; G 2249 +U 7876 ; WX 683 ; N uni1EC4 ; G 2250 +U 7877 ; WX 678 ; N uni1EC5 ; G 2251 +U 7878 ; WX 683 ; N uni1EC6 ; G 2252 +U 7879 ; WX 678 ; N uni1EC7 ; G 2253 +U 7880 ; WX 372 ; N uni1EC8 ; G 2254 +U 7881 ; WX 343 ; N uni1EC9 ; G 2255 +U 7882 ; WX 372 ; N uni1ECA ; G 2256 +U 7883 ; WX 343 ; N uni1ECB ; G 2257 +U 7884 ; WX 850 ; N uni1ECC ; G 2258 +U 7885 ; WX 687 ; N uni1ECD ; G 2259 +U 7886 ; WX 850 ; N uni1ECE ; G 2260 +U 7887 ; WX 687 ; N uni1ECF ; G 2261 +U 7888 ; WX 850 ; N uni1ED0 ; G 2262 +U 7889 ; WX 687 ; N uni1ED1 ; G 2263 +U 7890 ; WX 850 ; N uni1ED2 ; G 2264 +U 7891 ; WX 687 ; N uni1ED3 ; G 2265 +U 7892 ; WX 850 ; N uni1ED4 ; G 2266 +U 7893 ; WX 687 ; N uni1ED5 ; G 2267 +U 7894 ; WX 850 ; N uni1ED6 ; G 2268 +U 7895 ; WX 687 ; N uni1ED7 ; G 2269 +U 7896 ; WX 850 ; N uni1ED8 ; G 2270 +U 7897 ; WX 687 ; N uni1ED9 ; G 2271 +U 7898 ; WX 850 ; N uni1EDA ; G 2272 +U 7899 ; WX 687 ; N uni1EDB ; G 2273 +U 7900 ; WX 850 ; N uni1EDC ; G 2274 +U 7901 ; WX 687 ; N uni1EDD ; G 2275 +U 7902 ; WX 850 ; N uni1EDE ; G 2276 +U 7903 ; WX 687 ; N uni1EDF ; G 2277 +U 7904 ; WX 850 ; N uni1EE0 ; G 2278 +U 7905 ; WX 687 ; N uni1EE1 ; G 2279 +U 7906 ; WX 850 ; N uni1EE2 ; G 2280 +U 7907 ; WX 687 ; N uni1EE3 ; G 2281 +U 7908 ; WX 812 ; N uni1EE4 ; G 2282 +U 7909 ; WX 712 ; N uni1EE5 ; G 2283 +U 7910 ; WX 812 ; N uni1EE6 ; G 2284 +U 7911 ; WX 712 ; N uni1EE7 ; G 2285 +U 7912 ; WX 812 ; N uni1EE8 ; G 2286 +U 7913 ; WX 712 ; N uni1EE9 ; G 2287 +U 7914 ; WX 812 ; N uni1EEA ; G 2288 +U 7915 ; WX 712 ; N uni1EEB ; G 2289 +U 7916 ; WX 812 ; N uni1EEC ; G 2290 +U 7917 ; WX 712 ; N uni1EED ; G 2291 +U 7918 ; WX 812 ; N uni1EEE ; G 2292 +U 7919 ; WX 712 ; N uni1EEF ; G 2293 +U 7920 ; WX 812 ; N uni1EF0 ; G 2294 +U 7921 ; WX 712 ; N uni1EF1 ; G 2295 +U 7922 ; WX 724 ; N Ygrave ; G 2296 +U 7923 ; WX 652 ; N ygrave ; G 2297 +U 7924 ; WX 724 ; N uni1EF4 ; G 2298 +U 7925 ; WX 652 ; N uni1EF5 ; G 2299 +U 7926 ; WX 724 ; N uni1EF6 ; G 2300 +U 7927 ; WX 652 ; N uni1EF7 ; G 2301 +U 7928 ; WX 724 ; N uni1EF8 ; G 2302 +U 7929 ; WX 652 ; N uni1EF9 ; G 2303 +U 7930 ; WX 953 ; N uni1EFA ; G 2304 +U 7931 ; WX 644 ; N uni1EFB ; G 2305 +U 7936 ; WX 687 ; N uni1F00 ; G 2306 +U 7937 ; WX 687 ; N uni1F01 ; G 2307 +U 7938 ; WX 687 ; N uni1F02 ; G 2308 +U 7939 ; WX 687 ; N uni1F03 ; G 2309 +U 7940 ; WX 687 ; N uni1F04 ; G 2310 +U 7941 ; WX 687 ; N uni1F05 ; G 2311 +U 7942 ; WX 687 ; N uni1F06 ; G 2312 +U 7943 ; WX 687 ; N uni1F07 ; G 2313 +U 7944 ; WX 774 ; N uni1F08 ; G 2314 +U 7945 ; WX 774 ; N uni1F09 ; G 2315 +U 7946 ; WX 1041 ; N uni1F0A ; G 2316 +U 7947 ; WX 1043 ; N uni1F0B ; G 2317 +U 7948 ; WX 935 ; N uni1F0C ; G 2318 +U 7949 ; WX 963 ; N uni1F0D ; G 2319 +U 7950 ; WX 835 ; N uni1F0E ; G 2320 +U 7951 ; WX 859 ; N uni1F0F ; G 2321 +U 7952 ; WX 557 ; N uni1F10 ; G 2322 +U 7953 ; WX 557 ; N uni1F11 ; G 2323 +U 7954 ; WX 557 ; N uni1F12 ; G 2324 +U 7955 ; WX 557 ; N uni1F13 ; G 2325 +U 7956 ; WX 557 ; N uni1F14 ; G 2326 +U 7957 ; WX 557 ; N uni1F15 ; G 2327 +U 7960 ; WX 792 ; N uni1F18 ; G 2328 +U 7961 ; WX 794 ; N uni1F19 ; G 2329 +U 7962 ; WX 1100 ; N uni1F1A ; G 2330 +U 7963 ; WX 1096 ; N uni1F1B ; G 2331 +U 7964 ; WX 1023 ; N uni1F1C ; G 2332 +U 7965 ; WX 1052 ; N uni1F1D ; G 2333 +U 7968 ; WX 712 ; N uni1F20 ; G 2334 +U 7969 ; WX 712 ; N uni1F21 ; G 2335 +U 7970 ; WX 712 ; N uni1F22 ; G 2336 +U 7971 ; WX 712 ; N uni1F23 ; G 2337 +U 7972 ; WX 712 ; N uni1F24 ; G 2338 +U 7973 ; WX 712 ; N uni1F25 ; G 2339 +U 7974 ; WX 712 ; N uni1F26 ; G 2340 +U 7975 ; WX 712 ; N uni1F27 ; G 2341 +U 7976 ; WX 945 ; N uni1F28 ; G 2342 +U 7977 ; WX 951 ; N uni1F29 ; G 2343 +U 7978 ; WX 1250 ; N uni1F2A ; G 2344 +U 7979 ; WX 1250 ; N uni1F2B ; G 2345 +U 7980 ; WX 1180 ; N uni1F2C ; G 2346 +U 7981 ; WX 1206 ; N uni1F2D ; G 2347 +U 7982 ; WX 1054 ; N uni1F2E ; G 2348 +U 7983 ; WX 1063 ; N uni1F2F ; G 2349 +U 7984 ; WX 390 ; N uni1F30 ; G 2350 +U 7985 ; WX 390 ; N uni1F31 ; G 2351 +U 7986 ; WX 390 ; N uni1F32 ; G 2352 +U 7987 ; WX 390 ; N uni1F33 ; G 2353 +U 7988 ; WX 390 ; N uni1F34 ; G 2354 +U 7989 ; WX 390 ; N uni1F35 ; G 2355 +U 7990 ; WX 390 ; N uni1F36 ; G 2356 +U 7991 ; WX 390 ; N uni1F37 ; G 2357 +U 7992 ; WX 483 ; N uni1F38 ; G 2358 +U 7993 ; WX 489 ; N uni1F39 ; G 2359 +U 7994 ; WX 777 ; N uni1F3A ; G 2360 +U 7995 ; WX 785 ; N uni1F3B ; G 2361 +U 7996 ; WX 712 ; N uni1F3C ; G 2362 +U 7997 ; WX 738 ; N uni1F3D ; G 2363 +U 7998 ; WX 604 ; N uni1F3E ; G 2364 +U 7999 ; WX 604 ; N uni1F3F ; G 2365 +U 8000 ; WX 687 ; N uni1F40 ; G 2366 +U 8001 ; WX 687 ; N uni1F41 ; G 2367 +U 8002 ; WX 687 ; N uni1F42 ; G 2368 +U 8003 ; WX 687 ; N uni1F43 ; G 2369 +U 8004 ; WX 687 ; N uni1F44 ; G 2370 +U 8005 ; WX 687 ; N uni1F45 ; G 2371 +U 8008 ; WX 892 ; N uni1F48 ; G 2372 +U 8009 ; WX 933 ; N uni1F49 ; G 2373 +U 8010 ; WX 1221 ; N uni1F4A ; G 2374 +U 8011 ; WX 1224 ; N uni1F4B ; G 2375 +U 8012 ; WX 1053 ; N uni1F4C ; G 2376 +U 8013 ; WX 1082 ; N uni1F4D ; G 2377 +U 8016 ; WX 675 ; N uni1F50 ; G 2378 +U 8017 ; WX 675 ; N uni1F51 ; G 2379 +U 8018 ; WX 675 ; N uni1F52 ; G 2380 +U 8019 ; WX 675 ; N uni1F53 ; G 2381 +U 8020 ; WX 675 ; N uni1F54 ; G 2382 +U 8021 ; WX 675 ; N uni1F55 ; G 2383 +U 8022 ; WX 675 ; N uni1F56 ; G 2384 +U 8023 ; WX 675 ; N uni1F57 ; G 2385 +U 8025 ; WX 930 ; N uni1F59 ; G 2386 +U 8027 ; WX 1184 ; N uni1F5B ; G 2387 +U 8029 ; WX 1199 ; N uni1F5D ; G 2388 +U 8031 ; WX 1049 ; N uni1F5F ; G 2389 +U 8032 ; WX 869 ; N uni1F60 ; G 2390 +U 8033 ; WX 869 ; N uni1F61 ; G 2391 +U 8034 ; WX 869 ; N uni1F62 ; G 2392 +U 8035 ; WX 869 ; N uni1F63 ; G 2393 +U 8036 ; WX 869 ; N uni1F64 ; G 2394 +U 8037 ; WX 869 ; N uni1F65 ; G 2395 +U 8038 ; WX 869 ; N uni1F66 ; G 2396 +U 8039 ; WX 869 ; N uni1F67 ; G 2397 +U 8040 ; WX 909 ; N uni1F68 ; G 2398 +U 8041 ; WX 958 ; N uni1F69 ; G 2399 +U 8042 ; WX 1246 ; N uni1F6A ; G 2400 +U 8043 ; WX 1251 ; N uni1F6B ; G 2401 +U 8044 ; WX 1076 ; N uni1F6C ; G 2402 +U 8045 ; WX 1105 ; N uni1F6D ; G 2403 +U 8046 ; WX 1028 ; N uni1F6E ; G 2404 +U 8047 ; WX 1076 ; N uni1F6F ; G 2405 +U 8048 ; WX 687 ; N uni1F70 ; G 2406 +U 8049 ; WX 687 ; N uni1F71 ; G 2407 +U 8050 ; WX 557 ; N uni1F72 ; G 2408 +U 8051 ; WX 557 ; N uni1F73 ; G 2409 +U 8052 ; WX 712 ; N uni1F74 ; G 2410 +U 8053 ; WX 712 ; N uni1F75 ; G 2411 +U 8054 ; WX 390 ; N uni1F76 ; G 2412 +U 8055 ; WX 390 ; N uni1F77 ; G 2413 +U 8056 ; WX 687 ; N uni1F78 ; G 2414 +U 8057 ; WX 687 ; N uni1F79 ; G 2415 +U 8058 ; WX 675 ; N uni1F7A ; G 2416 +U 8059 ; WX 675 ; N uni1F7B ; G 2417 +U 8060 ; WX 869 ; N uni1F7C ; G 2418 +U 8061 ; WX 869 ; N uni1F7D ; G 2419 +U 8064 ; WX 687 ; N uni1F80 ; G 2420 +U 8065 ; WX 687 ; N uni1F81 ; G 2421 +U 8066 ; WX 687 ; N uni1F82 ; G 2422 +U 8067 ; WX 687 ; N uni1F83 ; G 2423 +U 8068 ; WX 687 ; N uni1F84 ; G 2424 +U 8069 ; WX 687 ; N uni1F85 ; G 2425 +U 8070 ; WX 687 ; N uni1F86 ; G 2426 +U 8071 ; WX 687 ; N uni1F87 ; G 2427 +U 8072 ; WX 774 ; N uni1F88 ; G 2428 +U 8073 ; WX 774 ; N uni1F89 ; G 2429 +U 8074 ; WX 1041 ; N uni1F8A ; G 2430 +U 8075 ; WX 1043 ; N uni1F8B ; G 2431 +U 8076 ; WX 935 ; N uni1F8C ; G 2432 +U 8077 ; WX 963 ; N uni1F8D ; G 2433 +U 8078 ; WX 835 ; N uni1F8E ; G 2434 +U 8079 ; WX 859 ; N uni1F8F ; G 2435 +U 8080 ; WX 712 ; N uni1F90 ; G 2436 +U 8081 ; WX 712 ; N uni1F91 ; G 2437 +U 8082 ; WX 712 ; N uni1F92 ; G 2438 +U 8083 ; WX 712 ; N uni1F93 ; G 2439 +U 8084 ; WX 712 ; N uni1F94 ; G 2440 +U 8085 ; WX 712 ; N uni1F95 ; G 2441 +U 8086 ; WX 712 ; N uni1F96 ; G 2442 +U 8087 ; WX 712 ; N uni1F97 ; G 2443 +U 8088 ; WX 945 ; N uni1F98 ; G 2444 +U 8089 ; WX 951 ; N uni1F99 ; G 2445 +U 8090 ; WX 1250 ; N uni1F9A ; G 2446 +U 8091 ; WX 1250 ; N uni1F9B ; G 2447 +U 8092 ; WX 1180 ; N uni1F9C ; G 2448 +U 8093 ; WX 1206 ; N uni1F9D ; G 2449 +U 8094 ; WX 1054 ; N uni1F9E ; G 2450 +U 8095 ; WX 1063 ; N uni1F9F ; G 2451 +U 8096 ; WX 869 ; N uni1FA0 ; G 2452 +U 8097 ; WX 869 ; N uni1FA1 ; G 2453 +U 8098 ; WX 869 ; N uni1FA2 ; G 2454 +U 8099 ; WX 869 ; N uni1FA3 ; G 2455 +U 8100 ; WX 869 ; N uni1FA4 ; G 2456 +U 8101 ; WX 869 ; N uni1FA5 ; G 2457 +U 8102 ; WX 869 ; N uni1FA6 ; G 2458 +U 8103 ; WX 869 ; N uni1FA7 ; G 2459 +U 8104 ; WX 909 ; N uni1FA8 ; G 2460 +U 8105 ; WX 958 ; N uni1FA9 ; G 2461 +U 8106 ; WX 1246 ; N uni1FAA ; G 2462 +U 8107 ; WX 1251 ; N uni1FAB ; G 2463 +U 8108 ; WX 1076 ; N uni1FAC ; G 2464 +U 8109 ; WX 1105 ; N uni1FAD ; G 2465 +U 8110 ; WX 1028 ; N uni1FAE ; G 2466 +U 8111 ; WX 1076 ; N uni1FAF ; G 2467 +U 8112 ; WX 687 ; N uni1FB0 ; G 2468 +U 8113 ; WX 687 ; N uni1FB1 ; G 2469 +U 8114 ; WX 687 ; N uni1FB2 ; G 2470 +U 8115 ; WX 687 ; N uni1FB3 ; G 2471 +U 8116 ; WX 687 ; N uni1FB4 ; G 2472 +U 8118 ; WX 687 ; N uni1FB6 ; G 2473 +U 8119 ; WX 687 ; N uni1FB7 ; G 2474 +U 8120 ; WX 774 ; N uni1FB8 ; G 2475 +U 8121 ; WX 774 ; N uni1FB9 ; G 2476 +U 8122 ; WX 876 ; N uni1FBA ; G 2477 +U 8123 ; WX 797 ; N uni1FBB ; G 2478 +U 8124 ; WX 774 ; N uni1FBC ; G 2479 +U 8125 ; WX 500 ; N uni1FBD ; G 2480 +U 8126 ; WX 500 ; N uni1FBE ; G 2481 +U 8127 ; WX 500 ; N uni1FBF ; G 2482 +U 8128 ; WX 500 ; N uni1FC0 ; G 2483 +U 8129 ; WX 500 ; N uni1FC1 ; G 2484 +U 8130 ; WX 712 ; N uni1FC2 ; G 2485 +U 8131 ; WX 712 ; N uni1FC3 ; G 2486 +U 8132 ; WX 712 ; N uni1FC4 ; G 2487 +U 8134 ; WX 712 ; N uni1FC6 ; G 2488 +U 8135 ; WX 712 ; N uni1FC7 ; G 2489 +U 8136 ; WX 929 ; N uni1FC8 ; G 2490 +U 8137 ; WX 846 ; N uni1FC9 ; G 2491 +U 8138 ; WX 1080 ; N uni1FCA ; G 2492 +U 8139 ; WX 1009 ; N uni1FCB ; G 2493 +U 8140 ; WX 837 ; N uni1FCC ; G 2494 +U 8141 ; WX 500 ; N uni1FCD ; G 2495 +U 8142 ; WX 500 ; N uni1FCE ; G 2496 +U 8143 ; WX 500 ; N uni1FCF ; G 2497 +U 8144 ; WX 390 ; N uni1FD0 ; G 2498 +U 8145 ; WX 390 ; N uni1FD1 ; G 2499 +U 8146 ; WX 390 ; N uni1FD2 ; G 2500 +U 8147 ; WX 390 ; N uni1FD3 ; G 2501 +U 8150 ; WX 390 ; N uni1FD6 ; G 2502 +U 8151 ; WX 390 ; N uni1FD7 ; G 2503 +U 8152 ; WX 372 ; N uni1FD8 ; G 2504 +U 8153 ; WX 372 ; N uni1FD9 ; G 2505 +U 8154 ; WX 621 ; N uni1FDA ; G 2506 +U 8155 ; WX 563 ; N uni1FDB ; G 2507 +U 8157 ; WX 500 ; N uni1FDD ; G 2508 +U 8158 ; WX 500 ; N uni1FDE ; G 2509 +U 8159 ; WX 500 ; N uni1FDF ; G 2510 +U 8160 ; WX 675 ; N uni1FE0 ; G 2511 +U 8161 ; WX 675 ; N uni1FE1 ; G 2512 +U 8162 ; WX 675 ; N uni1FE2 ; G 2513 +U 8163 ; WX 675 ; N uni1FE3 ; G 2514 +U 8164 ; WX 716 ; N uni1FE4 ; G 2515 +U 8165 ; WX 716 ; N uni1FE5 ; G 2516 +U 8166 ; WX 675 ; N uni1FE6 ; G 2517 +U 8167 ; WX 675 ; N uni1FE7 ; G 2518 +U 8168 ; WX 724 ; N uni1FE8 ; G 2519 +U 8169 ; WX 724 ; N uni1FE9 ; G 2520 +U 8170 ; WX 1020 ; N uni1FEA ; G 2521 +U 8171 ; WX 980 ; N uni1FEB ; G 2522 +U 8172 ; WX 838 ; N uni1FEC ; G 2523 +U 8173 ; WX 500 ; N uni1FED ; G 2524 +U 8174 ; WX 500 ; N uni1FEE ; G 2525 +U 8175 ; WX 500 ; N uni1FEF ; G 2526 +U 8178 ; WX 869 ; N uni1FF2 ; G 2527 +U 8179 ; WX 869 ; N uni1FF3 ; G 2528 +U 8180 ; WX 869 ; N uni1FF4 ; G 2529 +U 8182 ; WX 869 ; N uni1FF6 ; G 2530 +U 8183 ; WX 869 ; N uni1FF7 ; G 2531 +U 8184 ; WX 1065 ; N uni1FF8 ; G 2532 +U 8185 ; WX 891 ; N uni1FF9 ; G 2533 +U 8186 ; WX 1084 ; N uni1FFA ; G 2534 +U 8187 ; WX 894 ; N uni1FFB ; G 2535 +U 8188 ; WX 850 ; N uni1FFC ; G 2536 +U 8189 ; WX 500 ; N uni1FFD ; G 2537 +U 8190 ; WX 500 ; N uni1FFE ; G 2538 +U 8192 ; WX 500 ; N uni2000 ; G 2539 +U 8193 ; WX 1000 ; N uni2001 ; G 2540 +U 8194 ; WX 500 ; N uni2002 ; G 2541 +U 8195 ; WX 1000 ; N uni2003 ; G 2542 +U 8196 ; WX 330 ; N uni2004 ; G 2543 +U 8197 ; WX 250 ; N uni2005 ; G 2544 +U 8198 ; WX 167 ; N uni2006 ; G 2545 +U 8199 ; WX 696 ; N uni2007 ; G 2546 +U 8200 ; WX 380 ; N uni2008 ; G 2547 +U 8201 ; WX 200 ; N uni2009 ; G 2548 +U 8202 ; WX 100 ; N uni200A ; G 2549 +U 8203 ; WX 0 ; N uni200B ; G 2550 +U 8204 ; WX 0 ; N uni200C ; G 2551 +U 8205 ; WX 0 ; N uni200D ; G 2552 +U 8206 ; WX 0 ; N uni200E ; G 2553 +U 8207 ; WX 0 ; N uni200F ; G 2554 +U 8208 ; WX 415 ; N uni2010 ; G 2555 +U 8209 ; WX 415 ; N uni2011 ; G 2556 +U 8210 ; WX 696 ; N figuredash ; G 2557 +U 8211 ; WX 500 ; N endash ; G 2558 +U 8212 ; WX 1000 ; N emdash ; G 2559 +U 8213 ; WX 1000 ; N uni2015 ; G 2560 +U 8214 ; WX 500 ; N uni2016 ; G 2561 +U 8215 ; WX 500 ; N underscoredbl ; G 2562 +U 8216 ; WX 380 ; N quoteleft ; G 2563 +U 8217 ; WX 380 ; N quoteright ; G 2564 +U 8218 ; WX 380 ; N quotesinglbase ; G 2565 +U 8219 ; WX 380 ; N quotereversed ; G 2566 +U 8220 ; WX 644 ; N quotedblleft ; G 2567 +U 8221 ; WX 644 ; N quotedblright ; G 2568 +U 8222 ; WX 644 ; N quotedblbase ; G 2569 +U 8223 ; WX 657 ; N uni201F ; G 2570 +U 8224 ; WX 500 ; N dagger ; G 2571 +U 8225 ; WX 500 ; N daggerdbl ; G 2572 +U 8226 ; WX 639 ; N bullet ; G 2573 +U 8227 ; WX 639 ; N uni2023 ; G 2574 +U 8228 ; WX 380 ; N onedotenleader ; G 2575 +U 8229 ; WX 685 ; N twodotenleader ; G 2576 +U 8230 ; WX 1000 ; N ellipsis ; G 2577 +U 8231 ; WX 348 ; N uni2027 ; G 2578 +U 8232 ; WX 0 ; N uni2028 ; G 2579 +U 8233 ; WX 0 ; N uni2029 ; G 2580 +U 8234 ; WX 0 ; N uni202A ; G 2581 +U 8235 ; WX 0 ; N uni202B ; G 2582 +U 8236 ; WX 0 ; N uni202C ; G 2583 +U 8237 ; WX 0 ; N uni202D ; G 2584 +U 8238 ; WX 0 ; N uni202E ; G 2585 +U 8239 ; WX 200 ; N uni202F ; G 2586 +U 8240 ; WX 1454 ; N perthousand ; G 2587 +U 8241 ; WX 1908 ; N uni2031 ; G 2588 +U 8242 ; WX 264 ; N minute ; G 2589 +U 8243 ; WX 447 ; N second ; G 2590 +U 8244 ; WX 630 ; N uni2034 ; G 2591 +U 8245 ; WX 264 ; N uni2035 ; G 2592 +U 8246 ; WX 447 ; N uni2036 ; G 2593 +U 8247 ; WX 630 ; N uni2037 ; G 2594 +U 8248 ; WX 733 ; N uni2038 ; G 2595 +U 8249 ; WX 412 ; N guilsinglleft ; G 2596 +U 8250 ; WX 412 ; N guilsinglright ; G 2597 +U 8251 ; WX 972 ; N uni203B ; G 2598 +U 8252 ; WX 627 ; N exclamdbl ; G 2599 +U 8253 ; WX 580 ; N uni203D ; G 2600 +U 8254 ; WX 500 ; N uni203E ; G 2601 +U 8255 ; WX 828 ; N uni203F ; G 2602 +U 8256 ; WX 828 ; N uni2040 ; G 2603 +U 8257 ; WX 329 ; N uni2041 ; G 2604 +U 8258 ; WX 1023 ; N uni2042 ; G 2605 +U 8259 ; WX 500 ; N uni2043 ; G 2606 +U 8260 ; WX 167 ; N fraction ; G 2607 +U 8261 ; WX 457 ; N uni2045 ; G 2608 +U 8262 ; WX 457 ; N uni2046 ; G 2609 +U 8263 ; WX 1030 ; N uni2047 ; G 2610 +U 8264 ; WX 829 ; N uni2048 ; G 2611 +U 8265 ; WX 829 ; N uni2049 ; G 2612 +U 8266 ; WX 513 ; N uni204A ; G 2613 +U 8267 ; WX 687 ; N uni204B ; G 2614 +U 8268 ; WX 500 ; N uni204C ; G 2615 +U 8269 ; WX 500 ; N uni204D ; G 2616 +U 8270 ; WX 523 ; N uni204E ; G 2617 +U 8271 ; WX 400 ; N uni204F ; G 2618 +U 8272 ; WX 828 ; N uni2050 ; G 2619 +U 8273 ; WX 523 ; N uni2051 ; G 2620 +U 8274 ; WX 556 ; N uni2052 ; G 2621 +U 8275 ; WX 838 ; N uni2053 ; G 2622 +U 8276 ; WX 828 ; N uni2054 ; G 2623 +U 8277 ; WX 838 ; N uni2055 ; G 2624 +U 8278 ; WX 684 ; N uni2056 ; G 2625 +U 8279 ; WX 813 ; N uni2057 ; G 2626 +U 8280 ; WX 838 ; N uni2058 ; G 2627 +U 8281 ; WX 838 ; N uni2059 ; G 2628 +U 8282 ; WX 380 ; N uni205A ; G 2629 +U 8283 ; WX 872 ; N uni205B ; G 2630 +U 8284 ; WX 838 ; N uni205C ; G 2631 +U 8285 ; WX 380 ; N uni205D ; G 2632 +U 8286 ; WX 380 ; N uni205E ; G 2633 +U 8287 ; WX 222 ; N uni205F ; G 2634 +U 8288 ; WX 0 ; N uni2060 ; G 2635 +U 8289 ; WX 0 ; N uni2061 ; G 2636 +U 8290 ; WX 0 ; N uni2062 ; G 2637 +U 8291 ; WX 0 ; N uni2063 ; G 2638 +U 8292 ; WX 0 ; N uni2064 ; G 2639 +U 8298 ; WX 0 ; N uni206A ; G 2640 +U 8299 ; WX 0 ; N uni206B ; G 2641 +U 8300 ; WX 0 ; N uni206C ; G 2642 +U 8301 ; WX 0 ; N uni206D ; G 2643 +U 8302 ; WX 0 ; N uni206E ; G 2644 +U 8303 ; WX 0 ; N uni206F ; G 2645 +U 8304 ; WX 438 ; N uni2070 ; G 2646 +U 8305 ; WX 219 ; N uni2071 ; G 2647 +U 8308 ; WX 438 ; N uni2074 ; G 2648 +U 8309 ; WX 438 ; N uni2075 ; G 2649 +U 8310 ; WX 438 ; N uni2076 ; G 2650 +U 8311 ; WX 438 ; N uni2077 ; G 2651 +U 8312 ; WX 438 ; N uni2078 ; G 2652 +U 8313 ; WX 438 ; N uni2079 ; G 2653 +U 8314 ; WX 528 ; N uni207A ; G 2654 +U 8315 ; WX 528 ; N uni207B ; G 2655 +U 8316 ; WX 528 ; N uni207C ; G 2656 +U 8317 ; WX 288 ; N uni207D ; G 2657 +U 8318 ; WX 288 ; N uni207E ; G 2658 +U 8319 ; WX 456 ; N uni207F ; G 2659 +U 8320 ; WX 438 ; N uni2080 ; G 2660 +U 8321 ; WX 438 ; N uni2081 ; G 2661 +U 8322 ; WX 438 ; N uni2082 ; G 2662 +U 8323 ; WX 438 ; N uni2083 ; G 2663 +U 8324 ; WX 438 ; N uni2084 ; G 2664 +U 8325 ; WX 438 ; N uni2085 ; G 2665 +U 8326 ; WX 438 ; N uni2086 ; G 2666 +U 8327 ; WX 438 ; N uni2087 ; G 2667 +U 8328 ; WX 438 ; N uni2088 ; G 2668 +U 8329 ; WX 438 ; N uni2089 ; G 2669 +U 8330 ; WX 528 ; N uni208A ; G 2670 +U 8331 ; WX 528 ; N uni208B ; G 2671 +U 8332 ; WX 528 ; N uni208C ; G 2672 +U 8333 ; WX 288 ; N uni208D ; G 2673 +U 8334 ; WX 288 ; N uni208E ; G 2674 +U 8336 ; WX 458 ; N uni2090 ; G 2675 +U 8337 ; WX 479 ; N uni2091 ; G 2676 +U 8338 ; WX 488 ; N uni2092 ; G 2677 +U 8339 ; WX 413 ; N uni2093 ; G 2678 +U 8340 ; WX 479 ; N uni2094 ; G 2679 +U 8341 ; WX 456 ; N uni2095 ; G 2680 +U 8342 ; WX 487 ; N uni2096 ; G 2681 +U 8343 ; WX 219 ; N uni2097 ; G 2682 +U 8344 ; WX 664 ; N uni2098 ; G 2683 +U 8345 ; WX 456 ; N uni2099 ; G 2684 +U 8346 ; WX 479 ; N uni209A ; G 2685 +U 8347 ; WX 381 ; N uni209B ; G 2686 +U 8348 ; WX 388 ; N uni209C ; G 2687 +U 8352 ; WX 929 ; N uni20A0 ; G 2688 +U 8353 ; WX 696 ; N colonmonetary ; G 2689 +U 8354 ; WX 696 ; N uni20A2 ; G 2690 +U 8355 ; WX 696 ; N franc ; G 2691 +U 8356 ; WX 696 ; N lira ; G 2692 +U 8357 ; WX 1042 ; N uni20A5 ; G 2693 +U 8358 ; WX 696 ; N uni20A6 ; G 2694 +U 8359 ; WX 1488 ; N peseta ; G 2695 +U 8360 ; WX 1205 ; N uni20A8 ; G 2696 +U 8361 ; WX 1103 ; N uni20A9 ; G 2697 +U 8362 ; WX 854 ; N uni20AA ; G 2698 +U 8363 ; WX 696 ; N dong ; G 2699 +U 8364 ; WX 696 ; N Euro ; G 2700 +U 8365 ; WX 696 ; N uni20AD ; G 2701 +U 8366 ; WX 696 ; N uni20AE ; G 2702 +U 8367 ; WX 1392 ; N uni20AF ; G 2703 +U 8368 ; WX 696 ; N uni20B0 ; G 2704 +U 8369 ; WX 696 ; N uni20B1 ; G 2705 +U 8370 ; WX 696 ; N uni20B2 ; G 2706 +U 8371 ; WX 696 ; N uni20B3 ; G 2707 +U 8372 ; WX 859 ; N uni20B4 ; G 2708 +U 8373 ; WX 696 ; N uni20B5 ; G 2709 +U 8376 ; WX 696 ; N uni20B8 ; G 2710 +U 8377 ; WX 696 ; N uni20B9 ; G 2711 +U 8378 ; WX 696 ; N uni20BA ; G 2712 +U 8381 ; WX 696 ; N uni20BD ; G 2713 +U 8400 ; WX 0 ; N uni20D0 ; G 2714 +U 8401 ; WX 0 ; N uni20D1 ; G 2715 +U 8406 ; WX 0 ; N uni20D6 ; G 2716 +U 8407 ; WX 0 ; N uni20D7 ; G 2717 +U 8411 ; WX 0 ; N uni20DB ; G 2718 +U 8412 ; WX 0 ; N uni20DC ; G 2719 +U 8417 ; WX 0 ; N uni20E1 ; G 2720 +U 8448 ; WX 1106 ; N uni2100 ; G 2721 +U 8449 ; WX 1106 ; N uni2101 ; G 2722 +U 8450 ; WX 734 ; N uni2102 ; G 2723 +U 8451 ; WX 1211 ; N uni2103 ; G 2724 +U 8452 ; WX 896 ; N uni2104 ; G 2725 +U 8453 ; WX 1114 ; N uni2105 ; G 2726 +U 8454 ; WX 1148 ; N uni2106 ; G 2727 +U 8455 ; WX 696 ; N uni2107 ; G 2728 +U 8456 ; WX 698 ; N uni2108 ; G 2729 +U 8457 ; WX 952 ; N uni2109 ; G 2730 +U 8459 ; WX 1073 ; N uni210B ; G 2731 +U 8460 ; WX 913 ; N uni210C ; G 2732 +U 8461 ; WX 888 ; N uni210D ; G 2733 +U 8462 ; WX 712 ; N uni210E ; G 2734 +U 8463 ; WX 712 ; N uni210F ; G 2735 +U 8464 ; WX 597 ; N uni2110 ; G 2736 +U 8465 ; WX 697 ; N Ifraktur ; G 2737 +U 8466 ; WX 856 ; N uni2112 ; G 2738 +U 8467 ; WX 472 ; N uni2113 ; G 2739 +U 8468 ; WX 974 ; N uni2114 ; G 2740 +U 8469 ; WX 837 ; N uni2115 ; G 2741 +U 8470 ; WX 1203 ; N uni2116 ; G 2742 +U 8471 ; WX 1000 ; N uni2117 ; G 2743 +U 8472 ; WX 697 ; N weierstrass ; G 2744 +U 8473 ; WX 750 ; N uni2119 ; G 2745 +U 8474 ; WX 850 ; N uni211A ; G 2746 +U 8475 ; WX 938 ; N uni211B ; G 2747 +U 8476 ; WX 814 ; N Rfraktur ; G 2748 +U 8477 ; WX 801 ; N uni211D ; G 2749 +U 8478 ; WX 896 ; N prescription ; G 2750 +U 8479 ; WX 710 ; N uni211F ; G 2751 +U 8480 ; WX 1020 ; N uni2120 ; G 2752 +U 8481 ; WX 1239 ; N uni2121 ; G 2753 +U 8482 ; WX 1000 ; N trademark ; G 2754 +U 8483 ; WX 834 ; N uni2123 ; G 2755 +U 8484 ; WX 754 ; N uni2124 ; G 2756 +U 8485 ; WX 622 ; N uni2125 ; G 2757 +U 8486 ; WX 850 ; N uni2126 ; G 2758 +U 8487 ; WX 769 ; N uni2127 ; G 2759 +U 8488 ; WX 763 ; N uni2128 ; G 2760 +U 8489 ; WX 303 ; N uni2129 ; G 2761 +U 8490 ; WX 775 ; N uni212A ; G 2762 +U 8491 ; WX 774 ; N uni212B ; G 2763 +U 8492 ; WX 928 ; N uni212C ; G 2764 +U 8493 ; WX 818 ; N uni212D ; G 2765 +U 8494 ; WX 854 ; N estimated ; G 2766 +U 8495 ; WX 636 ; N uni212F ; G 2767 +U 8496 ; WX 729 ; N uni2130 ; G 2768 +U 8497 ; WX 808 ; N uni2131 ; G 2769 +U 8498 ; WX 683 ; N uni2132 ; G 2770 +U 8499 ; WX 1184 ; N uni2133 ; G 2771 +U 8500 ; WX 465 ; N uni2134 ; G 2772 +U 8501 ; WX 794 ; N aleph ; G 2773 +U 8502 ; WX 731 ; N uni2136 ; G 2774 +U 8503 ; WX 494 ; N uni2137 ; G 2775 +U 8504 ; WX 684 ; N uni2138 ; G 2776 +U 8505 ; WX 380 ; N uni2139 ; G 2777 +U 8506 ; WX 945 ; N uni213A ; G 2778 +U 8507 ; WX 1370 ; N uni213B ; G 2779 +U 8508 ; WX 790 ; N uni213C ; G 2780 +U 8509 ; WX 737 ; N uni213D ; G 2781 +U 8510 ; WX 654 ; N uni213E ; G 2782 +U 8511 ; WX 863 ; N uni213F ; G 2783 +U 8512 ; WX 840 ; N uni2140 ; G 2784 +U 8513 ; WX 786 ; N uni2141 ; G 2785 +U 8514 ; WX 576 ; N uni2142 ; G 2786 +U 8515 ; WX 637 ; N uni2143 ; G 2787 +U 8516 ; WX 760 ; N uni2144 ; G 2788 +U 8517 ; WX 830 ; N uni2145 ; G 2789 +U 8518 ; WX 716 ; N uni2146 ; G 2790 +U 8519 ; WX 678 ; N uni2147 ; G 2791 +U 8520 ; WX 343 ; N uni2148 ; G 2792 +U 8521 ; WX 343 ; N uni2149 ; G 2793 +U 8523 ; WX 872 ; N uni214B ; G 2794 +U 8526 ; WX 547 ; N uni214E ; G 2795 +U 8528 ; WX 1035 ; N uni2150 ; G 2796 +U 8529 ; WX 1035 ; N uni2151 ; G 2797 +U 8530 ; WX 1483 ; N uni2152 ; G 2798 +U 8531 ; WX 1035 ; N onethird ; G 2799 +U 8532 ; WX 1035 ; N twothirds ; G 2800 +U 8533 ; WX 1035 ; N uni2155 ; G 2801 +U 8534 ; WX 1035 ; N uni2156 ; G 2802 +U 8535 ; WX 1035 ; N uni2157 ; G 2803 +U 8536 ; WX 1035 ; N uni2158 ; G 2804 +U 8537 ; WX 1035 ; N uni2159 ; G 2805 +U 8538 ; WX 1035 ; N uni215A ; G 2806 +U 8539 ; WX 1035 ; N oneeighth ; G 2807 +U 8540 ; WX 1035 ; N threeeighths ; G 2808 +U 8541 ; WX 1035 ; N fiveeighths ; G 2809 +U 8542 ; WX 1035 ; N seveneighths ; G 2810 +U 8543 ; WX 615 ; N uni215F ; G 2811 +U 8544 ; WX 372 ; N uni2160 ; G 2812 +U 8545 ; WX 659 ; N uni2161 ; G 2813 +U 8546 ; WX 945 ; N uni2162 ; G 2814 +U 8547 ; WX 1099 ; N uni2163 ; G 2815 +U 8548 ; WX 774 ; N uni2164 ; G 2816 +U 8549 ; WX 1099 ; N uni2165 ; G 2817 +U 8550 ; WX 1386 ; N uni2166 ; G 2818 +U 8551 ; WX 1672 ; N uni2167 ; G 2819 +U 8552 ; WX 1121 ; N uni2168 ; G 2820 +U 8553 ; WX 771 ; N uni2169 ; G 2821 +U 8554 ; WX 1120 ; N uni216A ; G 2822 +U 8555 ; WX 1407 ; N uni216B ; G 2823 +U 8556 ; WX 637 ; N uni216C ; G 2824 +U 8557 ; WX 734 ; N uni216D ; G 2825 +U 8558 ; WX 830 ; N uni216E ; G 2826 +U 8559 ; WX 995 ; N uni216F ; G 2827 +U 8560 ; WX 343 ; N uni2170 ; G 2828 +U 8561 ; WX 607 ; N uni2171 ; G 2829 +U 8562 ; WX 872 ; N uni2172 ; G 2830 +U 8563 ; WX 984 ; N uni2173 ; G 2831 +U 8564 ; WX 652 ; N uni2174 ; G 2832 +U 8565 ; WX 962 ; N uni2175 ; G 2833 +U 8566 ; WX 1227 ; N uni2176 ; G 2834 +U 8567 ; WX 1491 ; N uni2177 ; G 2835 +U 8568 ; WX 969 ; N uni2178 ; G 2836 +U 8569 ; WX 645 ; N uni2179 ; G 2837 +U 8570 ; WX 969 ; N uni217A ; G 2838 +U 8571 ; WX 1233 ; N uni217B ; G 2839 +U 8572 ; WX 343 ; N uni217C ; G 2840 +U 8573 ; WX 593 ; N uni217D ; G 2841 +U 8574 ; WX 716 ; N uni217E ; G 2842 +U 8575 ; WX 1042 ; N uni217F ; G 2843 +U 8576 ; WX 1289 ; N uni2180 ; G 2844 +U 8577 ; WX 830 ; N uni2181 ; G 2845 +U 8578 ; WX 1289 ; N uni2182 ; G 2846 +U 8579 ; WX 734 ; N uni2183 ; G 2847 +U 8580 ; WX 593 ; N uni2184 ; G 2848 +U 8581 ; WX 734 ; N uni2185 ; G 2849 +U 8585 ; WX 1035 ; N uni2189 ; G 2850 +U 8592 ; WX 838 ; N arrowleft ; G 2851 +U 8593 ; WX 838 ; N arrowup ; G 2852 +U 8594 ; WX 838 ; N arrowright ; G 2853 +U 8595 ; WX 838 ; N arrowdown ; G 2854 +U 8596 ; WX 838 ; N arrowboth ; G 2855 +U 8597 ; WX 838 ; N arrowupdn ; G 2856 +U 8598 ; WX 838 ; N uni2196 ; G 2857 +U 8599 ; WX 838 ; N uni2197 ; G 2858 +U 8600 ; WX 838 ; N uni2198 ; G 2859 +U 8601 ; WX 838 ; N uni2199 ; G 2860 +U 8602 ; WX 838 ; N uni219A ; G 2861 +U 8603 ; WX 838 ; N uni219B ; G 2862 +U 8604 ; WX 838 ; N uni219C ; G 2863 +U 8605 ; WX 838 ; N uni219D ; G 2864 +U 8606 ; WX 838 ; N uni219E ; G 2865 +U 8607 ; WX 838 ; N uni219F ; G 2866 +U 8608 ; WX 838 ; N uni21A0 ; G 2867 +U 8609 ; WX 838 ; N uni21A1 ; G 2868 +U 8610 ; WX 838 ; N uni21A2 ; G 2869 +U 8611 ; WX 838 ; N uni21A3 ; G 2870 +U 8612 ; WX 838 ; N uni21A4 ; G 2871 +U 8613 ; WX 838 ; N uni21A5 ; G 2872 +U 8614 ; WX 838 ; N uni21A6 ; G 2873 +U 8615 ; WX 838 ; N uni21A7 ; G 2874 +U 8616 ; WX 838 ; N arrowupdnbse ; G 2875 +U 8617 ; WX 838 ; N uni21A9 ; G 2876 +U 8618 ; WX 838 ; N uni21AA ; G 2877 +U 8619 ; WX 838 ; N uni21AB ; G 2878 +U 8620 ; WX 838 ; N uni21AC ; G 2879 +U 8621 ; WX 838 ; N uni21AD ; G 2880 +U 8622 ; WX 838 ; N uni21AE ; G 2881 +U 8623 ; WX 838 ; N uni21AF ; G 2882 +U 8624 ; WX 838 ; N uni21B0 ; G 2883 +U 8625 ; WX 838 ; N uni21B1 ; G 2884 +U 8626 ; WX 838 ; N uni21B2 ; G 2885 +U 8627 ; WX 838 ; N uni21B3 ; G 2886 +U 8628 ; WX 838 ; N uni21B4 ; G 2887 +U 8629 ; WX 838 ; N carriagereturn ; G 2888 +U 8630 ; WX 838 ; N uni21B6 ; G 2889 +U 8631 ; WX 838 ; N uni21B7 ; G 2890 +U 8632 ; WX 838 ; N uni21B8 ; G 2891 +U 8633 ; WX 838 ; N uni21B9 ; G 2892 +U 8634 ; WX 838 ; N uni21BA ; G 2893 +U 8635 ; WX 838 ; N uni21BB ; G 2894 +U 8636 ; WX 838 ; N uni21BC ; G 2895 +U 8637 ; WX 838 ; N uni21BD ; G 2896 +U 8638 ; WX 838 ; N uni21BE ; G 2897 +U 8639 ; WX 838 ; N uni21BF ; G 2898 +U 8640 ; WX 838 ; N uni21C0 ; G 2899 +U 8641 ; WX 838 ; N uni21C1 ; G 2900 +U 8642 ; WX 838 ; N uni21C2 ; G 2901 +U 8643 ; WX 838 ; N uni21C3 ; G 2902 +U 8644 ; WX 838 ; N uni21C4 ; G 2903 +U 8645 ; WX 838 ; N uni21C5 ; G 2904 +U 8646 ; WX 838 ; N uni21C6 ; G 2905 +U 8647 ; WX 838 ; N uni21C7 ; G 2906 +U 8648 ; WX 838 ; N uni21C8 ; G 2907 +U 8649 ; WX 838 ; N uni21C9 ; G 2908 +U 8650 ; WX 838 ; N uni21CA ; G 2909 +U 8651 ; WX 838 ; N uni21CB ; G 2910 +U 8652 ; WX 838 ; N uni21CC ; G 2911 +U 8653 ; WX 838 ; N uni21CD ; G 2912 +U 8654 ; WX 838 ; N uni21CE ; G 2913 +U 8655 ; WX 838 ; N uni21CF ; G 2914 +U 8656 ; WX 838 ; N arrowdblleft ; G 2915 +U 8657 ; WX 838 ; N arrowdblup ; G 2916 +U 8658 ; WX 838 ; N arrowdblright ; G 2917 +U 8659 ; WX 838 ; N arrowdbldown ; G 2918 +U 8660 ; WX 838 ; N arrowdblboth ; G 2919 +U 8661 ; WX 838 ; N uni21D5 ; G 2920 +U 8662 ; WX 838 ; N uni21D6 ; G 2921 +U 8663 ; WX 838 ; N uni21D7 ; G 2922 +U 8664 ; WX 838 ; N uni21D8 ; G 2923 +U 8665 ; WX 838 ; N uni21D9 ; G 2924 +U 8666 ; WX 838 ; N uni21DA ; G 2925 +U 8667 ; WX 838 ; N uni21DB ; G 2926 +U 8668 ; WX 838 ; N uni21DC ; G 2927 +U 8669 ; WX 838 ; N uni21DD ; G 2928 +U 8670 ; WX 838 ; N uni21DE ; G 2929 +U 8671 ; WX 838 ; N uni21DF ; G 2930 +U 8672 ; WX 838 ; N uni21E0 ; G 2931 +U 8673 ; WX 838 ; N uni21E1 ; G 2932 +U 8674 ; WX 838 ; N uni21E2 ; G 2933 +U 8675 ; WX 838 ; N uni21E3 ; G 2934 +U 8676 ; WX 838 ; N uni21E4 ; G 2935 +U 8677 ; WX 838 ; N uni21E5 ; G 2936 +U 8678 ; WX 838 ; N uni21E6 ; G 2937 +U 8679 ; WX 838 ; N uni21E7 ; G 2938 +U 8680 ; WX 838 ; N uni21E8 ; G 2939 +U 8681 ; WX 838 ; N uni21E9 ; G 2940 +U 8682 ; WX 838 ; N uni21EA ; G 2941 +U 8683 ; WX 838 ; N uni21EB ; G 2942 +U 8684 ; WX 838 ; N uni21EC ; G 2943 +U 8685 ; WX 838 ; N uni21ED ; G 2944 +U 8686 ; WX 838 ; N uni21EE ; G 2945 +U 8687 ; WX 838 ; N uni21EF ; G 2946 +U 8688 ; WX 838 ; N uni21F0 ; G 2947 +U 8689 ; WX 838 ; N uni21F1 ; G 2948 +U 8690 ; WX 838 ; N uni21F2 ; G 2949 +U 8691 ; WX 838 ; N uni21F3 ; G 2950 +U 8692 ; WX 838 ; N uni21F4 ; G 2951 +U 8693 ; WX 838 ; N uni21F5 ; G 2952 +U 8694 ; WX 838 ; N uni21F6 ; G 2953 +U 8695 ; WX 838 ; N uni21F7 ; G 2954 +U 8696 ; WX 838 ; N uni21F8 ; G 2955 +U 8697 ; WX 838 ; N uni21F9 ; G 2956 +U 8698 ; WX 838 ; N uni21FA ; G 2957 +U 8699 ; WX 838 ; N uni21FB ; G 2958 +U 8700 ; WX 838 ; N uni21FC ; G 2959 +U 8701 ; WX 838 ; N uni21FD ; G 2960 +U 8702 ; WX 838 ; N uni21FE ; G 2961 +U 8703 ; WX 838 ; N uni21FF ; G 2962 +U 8704 ; WX 774 ; N universal ; G 2963 +U 8705 ; WX 696 ; N uni2201 ; G 2964 +U 8706 ; WX 544 ; N partialdiff ; G 2965 +U 8707 ; WX 683 ; N existential ; G 2966 +U 8708 ; WX 683 ; N uni2204 ; G 2967 +U 8709 ; WX 856 ; N emptyset ; G 2968 +U 8710 ; WX 697 ; N increment ; G 2969 +U 8711 ; WX 697 ; N gradient ; G 2970 +U 8712 ; WX 896 ; N element ; G 2971 +U 8713 ; WX 896 ; N notelement ; G 2972 +U 8714 ; WX 750 ; N uni220A ; G 2973 +U 8715 ; WX 896 ; N suchthat ; G 2974 +U 8716 ; WX 896 ; N uni220C ; G 2975 +U 8717 ; WX 750 ; N uni220D ; G 2976 +U 8718 ; WX 636 ; N uni220E ; G 2977 +U 8719 ; WX 787 ; N product ; G 2978 +U 8720 ; WX 787 ; N uni2210 ; G 2979 +U 8721 ; WX 718 ; N summation ; G 2980 +U 8722 ; WX 838 ; N minus ; G 2981 +U 8723 ; WX 838 ; N uni2213 ; G 2982 +U 8724 ; WX 696 ; N uni2214 ; G 2983 +U 8725 ; WX 365 ; N uni2215 ; G 2984 +U 8726 ; WX 696 ; N uni2216 ; G 2985 +U 8727 ; WX 838 ; N asteriskmath ; G 2986 +U 8728 ; WX 626 ; N uni2218 ; G 2987 +U 8729 ; WX 380 ; N uni2219 ; G 2988 +U 8730 ; WX 667 ; N radical ; G 2989 +U 8731 ; WX 667 ; N uni221B ; G 2990 +U 8732 ; WX 667 ; N uni221C ; G 2991 +U 8733 ; WX 712 ; N proportional ; G 2992 +U 8734 ; WX 833 ; N infinity ; G 2993 +U 8735 ; WX 838 ; N orthogonal ; G 2994 +U 8736 ; WX 896 ; N angle ; G 2995 +U 8737 ; WX 896 ; N uni2221 ; G 2996 +U 8738 ; WX 838 ; N uni2222 ; G 2997 +U 8739 ; WX 500 ; N uni2223 ; G 2998 +U 8740 ; WX 500 ; N uni2224 ; G 2999 +U 8741 ; WX 500 ; N uni2225 ; G 3000 +U 8742 ; WX 500 ; N uni2226 ; G 3001 +U 8743 ; WX 812 ; N logicaland ; G 3002 +U 8744 ; WX 812 ; N logicalor ; G 3003 +U 8745 ; WX 812 ; N intersection ; G 3004 +U 8746 ; WX 812 ; N union ; G 3005 +U 8747 ; WX 610 ; N integral ; G 3006 +U 8748 ; WX 929 ; N uni222C ; G 3007 +U 8749 ; WX 1295 ; N uni222D ; G 3008 +U 8750 ; WX 563 ; N uni222E ; G 3009 +U 8751 ; WX 977 ; N uni222F ; G 3010 +U 8752 ; WX 1313 ; N uni2230 ; G 3011 +U 8753 ; WX 563 ; N uni2231 ; G 3012 +U 8754 ; WX 563 ; N uni2232 ; G 3013 +U 8755 ; WX 563 ; N uni2233 ; G 3014 +U 8756 ; WX 696 ; N therefore ; G 3015 +U 8757 ; WX 696 ; N uni2235 ; G 3016 +U 8758 ; WX 294 ; N uni2236 ; G 3017 +U 8759 ; WX 696 ; N uni2237 ; G 3018 +U 8760 ; WX 838 ; N uni2238 ; G 3019 +U 8761 ; WX 838 ; N uni2239 ; G 3020 +U 8762 ; WX 838 ; N uni223A ; G 3021 +U 8763 ; WX 838 ; N uni223B ; G 3022 +U 8764 ; WX 838 ; N similar ; G 3023 +U 8765 ; WX 838 ; N uni223D ; G 3024 +U 8766 ; WX 838 ; N uni223E ; G 3025 +U 8767 ; WX 838 ; N uni223F ; G 3026 +U 8768 ; WX 375 ; N uni2240 ; G 3027 +U 8769 ; WX 838 ; N uni2241 ; G 3028 +U 8770 ; WX 838 ; N uni2242 ; G 3029 +U 8771 ; WX 838 ; N uni2243 ; G 3030 +U 8772 ; WX 838 ; N uni2244 ; G 3031 +U 8773 ; WX 838 ; N congruent ; G 3032 +U 8774 ; WX 838 ; N uni2246 ; G 3033 +U 8775 ; WX 838 ; N uni2247 ; G 3034 +U 8776 ; WX 838 ; N approxequal ; G 3035 +U 8777 ; WX 838 ; N uni2249 ; G 3036 +U 8778 ; WX 838 ; N uni224A ; G 3037 +U 8779 ; WX 838 ; N uni224B ; G 3038 +U 8780 ; WX 838 ; N uni224C ; G 3039 +U 8781 ; WX 838 ; N uni224D ; G 3040 +U 8782 ; WX 838 ; N uni224E ; G 3041 +U 8783 ; WX 838 ; N uni224F ; G 3042 +U 8784 ; WX 838 ; N uni2250 ; G 3043 +U 8785 ; WX 838 ; N uni2251 ; G 3044 +U 8786 ; WX 838 ; N uni2252 ; G 3045 +U 8787 ; WX 838 ; N uni2253 ; G 3046 +U 8788 ; WX 1063 ; N uni2254 ; G 3047 +U 8789 ; WX 1063 ; N uni2255 ; G 3048 +U 8790 ; WX 838 ; N uni2256 ; G 3049 +U 8791 ; WX 838 ; N uni2257 ; G 3050 +U 8792 ; WX 838 ; N uni2258 ; G 3051 +U 8793 ; WX 838 ; N uni2259 ; G 3052 +U 8794 ; WX 838 ; N uni225A ; G 3053 +U 8795 ; WX 838 ; N uni225B ; G 3054 +U 8796 ; WX 838 ; N uni225C ; G 3055 +U 8797 ; WX 838 ; N uni225D ; G 3056 +U 8798 ; WX 838 ; N uni225E ; G 3057 +U 8799 ; WX 838 ; N uni225F ; G 3058 +U 8800 ; WX 838 ; N notequal ; G 3059 +U 8801 ; WX 838 ; N equivalence ; G 3060 +U 8802 ; WX 838 ; N uni2262 ; G 3061 +U 8803 ; WX 838 ; N uni2263 ; G 3062 +U 8804 ; WX 838 ; N lessequal ; G 3063 +U 8805 ; WX 838 ; N greaterequal ; G 3064 +U 8806 ; WX 838 ; N uni2266 ; G 3065 +U 8807 ; WX 838 ; N uni2267 ; G 3066 +U 8808 ; WX 841 ; N uni2268 ; G 3067 +U 8809 ; WX 841 ; N uni2269 ; G 3068 +U 8810 ; WX 1047 ; N uni226A ; G 3069 +U 8811 ; WX 1047 ; N uni226B ; G 3070 +U 8812 ; WX 500 ; N uni226C ; G 3071 +U 8813 ; WX 838 ; N uni226D ; G 3072 +U 8814 ; WX 838 ; N uni226E ; G 3073 +U 8815 ; WX 838 ; N uni226F ; G 3074 +U 8816 ; WX 838 ; N uni2270 ; G 3075 +U 8817 ; WX 838 ; N uni2271 ; G 3076 +U 8818 ; WX 838 ; N uni2272 ; G 3077 +U 8819 ; WX 838 ; N uni2273 ; G 3078 +U 8820 ; WX 838 ; N uni2274 ; G 3079 +U 8821 ; WX 838 ; N uni2275 ; G 3080 +U 8822 ; WX 838 ; N uni2276 ; G 3081 +U 8823 ; WX 838 ; N uni2277 ; G 3082 +U 8824 ; WX 838 ; N uni2278 ; G 3083 +U 8825 ; WX 838 ; N uni2279 ; G 3084 +U 8826 ; WX 838 ; N uni227A ; G 3085 +U 8827 ; WX 838 ; N uni227B ; G 3086 +U 8828 ; WX 838 ; N uni227C ; G 3087 +U 8829 ; WX 838 ; N uni227D ; G 3088 +U 8830 ; WX 838 ; N uni227E ; G 3089 +U 8831 ; WX 838 ; N uni227F ; G 3090 +U 8832 ; WX 838 ; N uni2280 ; G 3091 +U 8833 ; WX 838 ; N uni2281 ; G 3092 +U 8834 ; WX 838 ; N propersubset ; G 3093 +U 8835 ; WX 838 ; N propersuperset ; G 3094 +U 8836 ; WX 838 ; N notsubset ; G 3095 +U 8837 ; WX 838 ; N uni2285 ; G 3096 +U 8838 ; WX 838 ; N reflexsubset ; G 3097 +U 8839 ; WX 838 ; N reflexsuperset ; G 3098 +U 8840 ; WX 838 ; N uni2288 ; G 3099 +U 8841 ; WX 838 ; N uni2289 ; G 3100 +U 8842 ; WX 838 ; N uni228A ; G 3101 +U 8843 ; WX 838 ; N uni228B ; G 3102 +U 8844 ; WX 812 ; N uni228C ; G 3103 +U 8845 ; WX 812 ; N uni228D ; G 3104 +U 8846 ; WX 812 ; N uni228E ; G 3105 +U 8847 ; WX 838 ; N uni228F ; G 3106 +U 8848 ; WX 838 ; N uni2290 ; G 3107 +U 8849 ; WX 838 ; N uni2291 ; G 3108 +U 8850 ; WX 838 ; N uni2292 ; G 3109 +U 8851 ; WX 796 ; N uni2293 ; G 3110 +U 8852 ; WX 796 ; N uni2294 ; G 3111 +U 8853 ; WX 838 ; N circleplus ; G 3112 +U 8854 ; WX 838 ; N uni2296 ; G 3113 +U 8855 ; WX 838 ; N circlemultiply ; G 3114 +U 8856 ; WX 838 ; N uni2298 ; G 3115 +U 8857 ; WX 838 ; N uni2299 ; G 3116 +U 8858 ; WX 838 ; N uni229A ; G 3117 +U 8859 ; WX 838 ; N uni229B ; G 3118 +U 8860 ; WX 838 ; N uni229C ; G 3119 +U 8861 ; WX 838 ; N uni229D ; G 3120 +U 8862 ; WX 838 ; N uni229E ; G 3121 +U 8863 ; WX 838 ; N uni229F ; G 3122 +U 8864 ; WX 838 ; N uni22A0 ; G 3123 +U 8865 ; WX 838 ; N uni22A1 ; G 3124 +U 8866 ; WX 914 ; N uni22A2 ; G 3125 +U 8867 ; WX 914 ; N uni22A3 ; G 3126 +U 8868 ; WX 914 ; N uni22A4 ; G 3127 +U 8869 ; WX 914 ; N perpendicular ; G 3128 +U 8870 ; WX 542 ; N uni22A6 ; G 3129 +U 8871 ; WX 542 ; N uni22A7 ; G 3130 +U 8872 ; WX 914 ; N uni22A8 ; G 3131 +U 8873 ; WX 914 ; N uni22A9 ; G 3132 +U 8874 ; WX 914 ; N uni22AA ; G 3133 +U 8875 ; WX 914 ; N uni22AB ; G 3134 +U 8876 ; WX 914 ; N uni22AC ; G 3135 +U 8877 ; WX 914 ; N uni22AD ; G 3136 +U 8878 ; WX 914 ; N uni22AE ; G 3137 +U 8879 ; WX 914 ; N uni22AF ; G 3138 +U 8880 ; WX 838 ; N uni22B0 ; G 3139 +U 8881 ; WX 838 ; N uni22B1 ; G 3140 +U 8882 ; WX 838 ; N uni22B2 ; G 3141 +U 8883 ; WX 838 ; N uni22B3 ; G 3142 +U 8884 ; WX 838 ; N uni22B4 ; G 3143 +U 8885 ; WX 838 ; N uni22B5 ; G 3144 +U 8886 ; WX 1000 ; N uni22B6 ; G 3145 +U 8887 ; WX 1000 ; N uni22B7 ; G 3146 +U 8888 ; WX 838 ; N uni22B8 ; G 3147 +U 8889 ; WX 838 ; N uni22B9 ; G 3148 +U 8890 ; WX 542 ; N uni22BA ; G 3149 +U 8891 ; WX 812 ; N uni22BB ; G 3150 +U 8892 ; WX 812 ; N uni22BC ; G 3151 +U 8893 ; WX 812 ; N uni22BD ; G 3152 +U 8894 ; WX 838 ; N uni22BE ; G 3153 +U 8895 ; WX 838 ; N uni22BF ; G 3154 +U 8896 ; WX 843 ; N uni22C0 ; G 3155 +U 8897 ; WX 843 ; N uni22C1 ; G 3156 +U 8898 ; WX 843 ; N uni22C2 ; G 3157 +U 8899 ; WX 843 ; N uni22C3 ; G 3158 +U 8900 ; WX 626 ; N uni22C4 ; G 3159 +U 8901 ; WX 380 ; N dotmath ; G 3160 +U 8902 ; WX 626 ; N uni22C6 ; G 3161 +U 8903 ; WX 838 ; N uni22C7 ; G 3162 +U 8904 ; WX 1000 ; N uni22C8 ; G 3163 +U 8905 ; WX 1000 ; N uni22C9 ; G 3164 +U 8906 ; WX 1000 ; N uni22CA ; G 3165 +U 8907 ; WX 1000 ; N uni22CB ; G 3166 +U 8908 ; WX 1000 ; N uni22CC ; G 3167 +U 8909 ; WX 838 ; N uni22CD ; G 3168 +U 8910 ; WX 812 ; N uni22CE ; G 3169 +U 8911 ; WX 812 ; N uni22CF ; G 3170 +U 8912 ; WX 838 ; N uni22D0 ; G 3171 +U 8913 ; WX 838 ; N uni22D1 ; G 3172 +U 8914 ; WX 838 ; N uni22D2 ; G 3173 +U 8915 ; WX 838 ; N uni22D3 ; G 3174 +U 8916 ; WX 838 ; N uni22D4 ; G 3175 +U 8917 ; WX 838 ; N uni22D5 ; G 3176 +U 8918 ; WX 838 ; N uni22D6 ; G 3177 +U 8919 ; WX 838 ; N uni22D7 ; G 3178 +U 8920 ; WX 1422 ; N uni22D8 ; G 3179 +U 8921 ; WX 1422 ; N uni22D9 ; G 3180 +U 8922 ; WX 838 ; N uni22DA ; G 3181 +U 8923 ; WX 838 ; N uni22DB ; G 3182 +U 8924 ; WX 838 ; N uni22DC ; G 3183 +U 8925 ; WX 838 ; N uni22DD ; G 3184 +U 8926 ; WX 838 ; N uni22DE ; G 3185 +U 8927 ; WX 838 ; N uni22DF ; G 3186 +U 8928 ; WX 838 ; N uni22E0 ; G 3187 +U 8929 ; WX 838 ; N uni22E1 ; G 3188 +U 8930 ; WX 838 ; N uni22E2 ; G 3189 +U 8931 ; WX 838 ; N uni22E3 ; G 3190 +U 8932 ; WX 838 ; N uni22E4 ; G 3191 +U 8933 ; WX 838 ; N uni22E5 ; G 3192 +U 8934 ; WX 838 ; N uni22E6 ; G 3193 +U 8935 ; WX 838 ; N uni22E7 ; G 3194 +U 8936 ; WX 838 ; N uni22E8 ; G 3195 +U 8937 ; WX 838 ; N uni22E9 ; G 3196 +U 8938 ; WX 838 ; N uni22EA ; G 3197 +U 8939 ; WX 838 ; N uni22EB ; G 3198 +U 8940 ; WX 838 ; N uni22EC ; G 3199 +U 8941 ; WX 838 ; N uni22ED ; G 3200 +U 8942 ; WX 1000 ; N uni22EE ; G 3201 +U 8943 ; WX 1000 ; N uni22EF ; G 3202 +U 8944 ; WX 1000 ; N uni22F0 ; G 3203 +U 8945 ; WX 1000 ; N uni22F1 ; G 3204 +U 8946 ; WX 1158 ; N uni22F2 ; G 3205 +U 8947 ; WX 896 ; N uni22F3 ; G 3206 +U 8948 ; WX 750 ; N uni22F4 ; G 3207 +U 8949 ; WX 896 ; N uni22F5 ; G 3208 +U 8950 ; WX 896 ; N uni22F6 ; G 3209 +U 8951 ; WX 750 ; N uni22F7 ; G 3210 +U 8952 ; WX 896 ; N uni22F8 ; G 3211 +U 8953 ; WX 896 ; N uni22F9 ; G 3212 +U 8954 ; WX 1158 ; N uni22FA ; G 3213 +U 8955 ; WX 896 ; N uni22FB ; G 3214 +U 8956 ; WX 750 ; N uni22FC ; G 3215 +U 8957 ; WX 896 ; N uni22FD ; G 3216 +U 8958 ; WX 750 ; N uni22FE ; G 3217 +U 8959 ; WX 896 ; N uni22FF ; G 3218 +U 8960 ; WX 602 ; N uni2300 ; G 3219 +U 8961 ; WX 602 ; N uni2301 ; G 3220 +U 8962 ; WX 716 ; N house ; G 3221 +U 8963 ; WX 838 ; N uni2303 ; G 3222 +U 8964 ; WX 838 ; N uni2304 ; G 3223 +U 8965 ; WX 838 ; N uni2305 ; G 3224 +U 8966 ; WX 838 ; N uni2306 ; G 3225 +U 8967 ; WX 488 ; N uni2307 ; G 3226 +U 8968 ; WX 457 ; N uni2308 ; G 3227 +U 8969 ; WX 457 ; N uni2309 ; G 3228 +U 8970 ; WX 457 ; N uni230A ; G 3229 +U 8971 ; WX 457 ; N uni230B ; G 3230 +U 8972 ; WX 809 ; N uni230C ; G 3231 +U 8973 ; WX 809 ; N uni230D ; G 3232 +U 8974 ; WX 809 ; N uni230E ; G 3233 +U 8975 ; WX 809 ; N uni230F ; G 3234 +U 8976 ; WX 838 ; N revlogicalnot ; G 3235 +U 8977 ; WX 539 ; N uni2311 ; G 3236 +U 8984 ; WX 928 ; N uni2318 ; G 3237 +U 8985 ; WX 838 ; N uni2319 ; G 3238 +U 8988 ; WX 469 ; N uni231C ; G 3239 +U 8989 ; WX 469 ; N uni231D ; G 3240 +U 8990 ; WX 469 ; N uni231E ; G 3241 +U 8991 ; WX 469 ; N uni231F ; G 3242 +U 8992 ; WX 610 ; N integraltp ; G 3243 +U 8993 ; WX 610 ; N integralbt ; G 3244 +U 8996 ; WX 1152 ; N uni2324 ; G 3245 +U 8997 ; WX 1152 ; N uni2325 ; G 3246 +U 8998 ; WX 1414 ; N uni2326 ; G 3247 +U 8999 ; WX 1152 ; N uni2327 ; G 3248 +U 9000 ; WX 1443 ; N uni2328 ; G 3249 +U 9003 ; WX 1414 ; N uni232B ; G 3250 +U 9004 ; WX 873 ; N uni232C ; G 3251 +U 9075 ; WX 390 ; N uni2373 ; G 3252 +U 9076 ; WX 716 ; N uni2374 ; G 3253 +U 9077 ; WX 869 ; N uni2375 ; G 3254 +U 9082 ; WX 687 ; N uni237A ; G 3255 +U 9085 ; WX 863 ; N uni237D ; G 3256 +U 9095 ; WX 1152 ; N uni2387 ; G 3257 +U 9108 ; WX 873 ; N uni2394 ; G 3258 +U 9115 ; WX 500 ; N uni239B ; G 3259 +U 9116 ; WX 500 ; N uni239C ; G 3260 +U 9117 ; WX 500 ; N uni239D ; G 3261 +U 9118 ; WX 500 ; N uni239E ; G 3262 +U 9119 ; WX 500 ; N uni239F ; G 3263 +U 9120 ; WX 500 ; N uni23A0 ; G 3264 +U 9121 ; WX 500 ; N uni23A1 ; G 3265 +U 9122 ; WX 500 ; N uni23A2 ; G 3266 +U 9123 ; WX 500 ; N uni23A3 ; G 3267 +U 9124 ; WX 500 ; N uni23A4 ; G 3268 +U 9125 ; WX 500 ; N uni23A5 ; G 3269 +U 9126 ; WX 500 ; N uni23A6 ; G 3270 +U 9127 ; WX 750 ; N uni23A7 ; G 3271 +U 9128 ; WX 750 ; N uni23A8 ; G 3272 +U 9129 ; WX 750 ; N uni23A9 ; G 3273 +U 9130 ; WX 750 ; N uni23AA ; G 3274 +U 9131 ; WX 750 ; N uni23AB ; G 3275 +U 9132 ; WX 750 ; N uni23AC ; G 3276 +U 9133 ; WX 750 ; N uni23AD ; G 3277 +U 9134 ; WX 610 ; N uni23AE ; G 3278 +U 9166 ; WX 838 ; N uni23CE ; G 3279 +U 9167 ; WX 945 ; N uni23CF ; G 3280 +U 9187 ; WX 873 ; N uni23E3 ; G 3281 +U 9189 ; WX 769 ; N uni23E5 ; G 3282 +U 9192 ; WX 696 ; N uni23E8 ; G 3283 +U 9250 ; WX 716 ; N uni2422 ; G 3284 +U 9251 ; WX 716 ; N uni2423 ; G 3285 +U 9312 ; WX 847 ; N uni2460 ; G 3286 +U 9313 ; WX 847 ; N uni2461 ; G 3287 +U 9314 ; WX 847 ; N uni2462 ; G 3288 +U 9315 ; WX 847 ; N uni2463 ; G 3289 +U 9316 ; WX 847 ; N uni2464 ; G 3290 +U 9317 ; WX 847 ; N uni2465 ; G 3291 +U 9318 ; WX 847 ; N uni2466 ; G 3292 +U 9319 ; WX 847 ; N uni2467 ; G 3293 +U 9320 ; WX 847 ; N uni2468 ; G 3294 +U 9321 ; WX 847 ; N uni2469 ; G 3295 +U 9472 ; WX 602 ; N SF100000 ; G 3296 +U 9473 ; WX 602 ; N uni2501 ; G 3297 +U 9474 ; WX 602 ; N SF110000 ; G 3298 +U 9475 ; WX 602 ; N uni2503 ; G 3299 +U 9476 ; WX 602 ; N uni2504 ; G 3300 +U 9477 ; WX 602 ; N uni2505 ; G 3301 +U 9478 ; WX 602 ; N uni2506 ; G 3302 +U 9479 ; WX 602 ; N uni2507 ; G 3303 +U 9480 ; WX 602 ; N uni2508 ; G 3304 +U 9481 ; WX 602 ; N uni2509 ; G 3305 +U 9482 ; WX 602 ; N uni250A ; G 3306 +U 9483 ; WX 602 ; N uni250B ; G 3307 +U 9484 ; WX 602 ; N SF010000 ; G 3308 +U 9485 ; WX 602 ; N uni250D ; G 3309 +U 9486 ; WX 602 ; N uni250E ; G 3310 +U 9487 ; WX 602 ; N uni250F ; G 3311 +U 9488 ; WX 602 ; N SF030000 ; G 3312 +U 9489 ; WX 602 ; N uni2511 ; G 3313 +U 9490 ; WX 602 ; N uni2512 ; G 3314 +U 9491 ; WX 602 ; N uni2513 ; G 3315 +U 9492 ; WX 602 ; N SF020000 ; G 3316 +U 9493 ; WX 602 ; N uni2515 ; G 3317 +U 9494 ; WX 602 ; N uni2516 ; G 3318 +U 9495 ; WX 602 ; N uni2517 ; G 3319 +U 9496 ; WX 602 ; N SF040000 ; G 3320 +U 9497 ; WX 602 ; N uni2519 ; G 3321 +U 9498 ; WX 602 ; N uni251A ; G 3322 +U 9499 ; WX 602 ; N uni251B ; G 3323 +U 9500 ; WX 602 ; N SF080000 ; G 3324 +U 9501 ; WX 602 ; N uni251D ; G 3325 +U 9502 ; WX 602 ; N uni251E ; G 3326 +U 9503 ; WX 602 ; N uni251F ; G 3327 +U 9504 ; WX 602 ; N uni2520 ; G 3328 +U 9505 ; WX 602 ; N uni2521 ; G 3329 +U 9506 ; WX 602 ; N uni2522 ; G 3330 +U 9507 ; WX 602 ; N uni2523 ; G 3331 +U 9508 ; WX 602 ; N SF090000 ; G 3332 +U 9509 ; WX 602 ; N uni2525 ; G 3333 +U 9510 ; WX 602 ; N uni2526 ; G 3334 +U 9511 ; WX 602 ; N uni2527 ; G 3335 +U 9512 ; WX 602 ; N uni2528 ; G 3336 +U 9513 ; WX 602 ; N uni2529 ; G 3337 +U 9514 ; WX 602 ; N uni252A ; G 3338 +U 9515 ; WX 602 ; N uni252B ; G 3339 +U 9516 ; WX 602 ; N SF060000 ; G 3340 +U 9517 ; WX 602 ; N uni252D ; G 3341 +U 9518 ; WX 602 ; N uni252E ; G 3342 +U 9519 ; WX 602 ; N uni252F ; G 3343 +U 9520 ; WX 602 ; N uni2530 ; G 3344 +U 9521 ; WX 602 ; N uni2531 ; G 3345 +U 9522 ; WX 602 ; N uni2532 ; G 3346 +U 9523 ; WX 602 ; N uni2533 ; G 3347 +U 9524 ; WX 602 ; N SF070000 ; G 3348 +U 9525 ; WX 602 ; N uni2535 ; G 3349 +U 9526 ; WX 602 ; N uni2536 ; G 3350 +U 9527 ; WX 602 ; N uni2537 ; G 3351 +U 9528 ; WX 602 ; N uni2538 ; G 3352 +U 9529 ; WX 602 ; N uni2539 ; G 3353 +U 9530 ; WX 602 ; N uni253A ; G 3354 +U 9531 ; WX 602 ; N uni253B ; G 3355 +U 9532 ; WX 602 ; N SF050000 ; G 3356 +U 9533 ; WX 602 ; N uni253D ; G 3357 +U 9534 ; WX 602 ; N uni253E ; G 3358 +U 9535 ; WX 602 ; N uni253F ; G 3359 +U 9536 ; WX 602 ; N uni2540 ; G 3360 +U 9537 ; WX 602 ; N uni2541 ; G 3361 +U 9538 ; WX 602 ; N uni2542 ; G 3362 +U 9539 ; WX 602 ; N uni2543 ; G 3363 +U 9540 ; WX 602 ; N uni2544 ; G 3364 +U 9541 ; WX 602 ; N uni2545 ; G 3365 +U 9542 ; WX 602 ; N uni2546 ; G 3366 +U 9543 ; WX 602 ; N uni2547 ; G 3367 +U 9544 ; WX 602 ; N uni2548 ; G 3368 +U 9545 ; WX 602 ; N uni2549 ; G 3369 +U 9546 ; WX 602 ; N uni254A ; G 3370 +U 9547 ; WX 602 ; N uni254B ; G 3371 +U 9548 ; WX 602 ; N uni254C ; G 3372 +U 9549 ; WX 602 ; N uni254D ; G 3373 +U 9550 ; WX 602 ; N uni254E ; G 3374 +U 9551 ; WX 602 ; N uni254F ; G 3375 +U 9552 ; WX 602 ; N SF430000 ; G 3376 +U 9553 ; WX 602 ; N SF240000 ; G 3377 +U 9554 ; WX 602 ; N SF510000 ; G 3378 +U 9555 ; WX 602 ; N SF520000 ; G 3379 +U 9556 ; WX 602 ; N SF390000 ; G 3380 +U 9557 ; WX 602 ; N SF220000 ; G 3381 +U 9558 ; WX 602 ; N SF210000 ; G 3382 +U 9559 ; WX 602 ; N SF250000 ; G 3383 +U 9560 ; WX 602 ; N SF500000 ; G 3384 +U 9561 ; WX 602 ; N SF490000 ; G 3385 +U 9562 ; WX 602 ; N SF380000 ; G 3386 +U 9563 ; WX 602 ; N SF280000 ; G 3387 +U 9564 ; WX 602 ; N SF270000 ; G 3388 +U 9565 ; WX 602 ; N SF260000 ; G 3389 +U 9566 ; WX 602 ; N SF360000 ; G 3390 +U 9567 ; WX 602 ; N SF370000 ; G 3391 +U 9568 ; WX 602 ; N SF420000 ; G 3392 +U 9569 ; WX 602 ; N SF190000 ; G 3393 +U 9570 ; WX 602 ; N SF200000 ; G 3394 +U 9571 ; WX 602 ; N SF230000 ; G 3395 +U 9572 ; WX 602 ; N SF470000 ; G 3396 +U 9573 ; WX 602 ; N SF480000 ; G 3397 +U 9574 ; WX 602 ; N SF410000 ; G 3398 +U 9575 ; WX 602 ; N SF450000 ; G 3399 +U 9576 ; WX 602 ; N SF460000 ; G 3400 +U 9577 ; WX 602 ; N SF400000 ; G 3401 +U 9578 ; WX 602 ; N SF540000 ; G 3402 +U 9579 ; WX 602 ; N SF530000 ; G 3403 +U 9580 ; WX 602 ; N SF440000 ; G 3404 +U 9581 ; WX 602 ; N uni256D ; G 3405 +U 9582 ; WX 602 ; N uni256E ; G 3406 +U 9583 ; WX 602 ; N uni256F ; G 3407 +U 9584 ; WX 602 ; N uni2570 ; G 3408 +U 9585 ; WX 602 ; N uni2571 ; G 3409 +U 9586 ; WX 602 ; N uni2572 ; G 3410 +U 9587 ; WX 602 ; N uni2573 ; G 3411 +U 9588 ; WX 602 ; N uni2574 ; G 3412 +U 9589 ; WX 602 ; N uni2575 ; G 3413 +U 9590 ; WX 602 ; N uni2576 ; G 3414 +U 9591 ; WX 602 ; N uni2577 ; G 3415 +U 9592 ; WX 602 ; N uni2578 ; G 3416 +U 9593 ; WX 602 ; N uni2579 ; G 3417 +U 9594 ; WX 602 ; N uni257A ; G 3418 +U 9595 ; WX 602 ; N uni257B ; G 3419 +U 9596 ; WX 602 ; N uni257C ; G 3420 +U 9597 ; WX 602 ; N uni257D ; G 3421 +U 9598 ; WX 602 ; N uni257E ; G 3422 +U 9599 ; WX 602 ; N uni257F ; G 3423 +U 9600 ; WX 769 ; N upblock ; G 3424 +U 9601 ; WX 769 ; N uni2581 ; G 3425 +U 9602 ; WX 769 ; N uni2582 ; G 3426 +U 9603 ; WX 769 ; N uni2583 ; G 3427 +U 9604 ; WX 769 ; N dnblock ; G 3428 +U 9605 ; WX 769 ; N uni2585 ; G 3429 +U 9606 ; WX 769 ; N uni2586 ; G 3430 +U 9607 ; WX 769 ; N uni2587 ; G 3431 +U 9608 ; WX 769 ; N block ; G 3432 +U 9609 ; WX 769 ; N uni2589 ; G 3433 +U 9610 ; WX 769 ; N uni258A ; G 3434 +U 9611 ; WX 769 ; N uni258B ; G 3435 +U 9612 ; WX 769 ; N lfblock ; G 3436 +U 9613 ; WX 769 ; N uni258D ; G 3437 +U 9614 ; WX 769 ; N uni258E ; G 3438 +U 9615 ; WX 769 ; N uni258F ; G 3439 +U 9616 ; WX 769 ; N rtblock ; G 3440 +U 9617 ; WX 769 ; N ltshade ; G 3441 +U 9618 ; WX 769 ; N shade ; G 3442 +U 9619 ; WX 769 ; N dkshade ; G 3443 +U 9620 ; WX 769 ; N uni2594 ; G 3444 +U 9621 ; WX 769 ; N uni2595 ; G 3445 +U 9622 ; WX 769 ; N uni2596 ; G 3446 +U 9623 ; WX 769 ; N uni2597 ; G 3447 +U 9624 ; WX 769 ; N uni2598 ; G 3448 +U 9625 ; WX 769 ; N uni2599 ; G 3449 +U 9626 ; WX 769 ; N uni259A ; G 3450 +U 9627 ; WX 769 ; N uni259B ; G 3451 +U 9628 ; WX 769 ; N uni259C ; G 3452 +U 9629 ; WX 769 ; N uni259D ; G 3453 +U 9630 ; WX 769 ; N uni259E ; G 3454 +U 9631 ; WX 769 ; N uni259F ; G 3455 +U 9632 ; WX 945 ; N filledbox ; G 3456 +U 9633 ; WX 945 ; N H22073 ; G 3457 +U 9634 ; WX 945 ; N uni25A2 ; G 3458 +U 9635 ; WX 945 ; N uni25A3 ; G 3459 +U 9636 ; WX 945 ; N uni25A4 ; G 3460 +U 9637 ; WX 945 ; N uni25A5 ; G 3461 +U 9638 ; WX 945 ; N uni25A6 ; G 3462 +U 9639 ; WX 945 ; N uni25A7 ; G 3463 +U 9640 ; WX 945 ; N uni25A8 ; G 3464 +U 9641 ; WX 945 ; N uni25A9 ; G 3465 +U 9642 ; WX 678 ; N H18543 ; G 3466 +U 9643 ; WX 678 ; N H18551 ; G 3467 +U 9644 ; WX 945 ; N filledrect ; G 3468 +U 9645 ; WX 945 ; N uni25AD ; G 3469 +U 9646 ; WX 550 ; N uni25AE ; G 3470 +U 9647 ; WX 550 ; N uni25AF ; G 3471 +U 9648 ; WX 769 ; N uni25B0 ; G 3472 +U 9649 ; WX 769 ; N uni25B1 ; G 3473 +U 9650 ; WX 769 ; N triagup ; G 3474 +U 9651 ; WX 769 ; N uni25B3 ; G 3475 +U 9652 ; WX 502 ; N uni25B4 ; G 3476 +U 9653 ; WX 502 ; N uni25B5 ; G 3477 +U 9654 ; WX 769 ; N uni25B6 ; G 3478 +U 9655 ; WX 769 ; N uni25B7 ; G 3479 +U 9656 ; WX 502 ; N uni25B8 ; G 3480 +U 9657 ; WX 502 ; N uni25B9 ; G 3481 +U 9658 ; WX 769 ; N triagrt ; G 3482 +U 9659 ; WX 769 ; N uni25BB ; G 3483 +U 9660 ; WX 769 ; N triagdn ; G 3484 +U 9661 ; WX 769 ; N uni25BD ; G 3485 +U 9662 ; WX 502 ; N uni25BE ; G 3486 +U 9663 ; WX 502 ; N uni25BF ; G 3487 +U 9664 ; WX 769 ; N uni25C0 ; G 3488 +U 9665 ; WX 769 ; N uni25C1 ; G 3489 +U 9666 ; WX 502 ; N uni25C2 ; G 3490 +U 9667 ; WX 502 ; N uni25C3 ; G 3491 +U 9668 ; WX 769 ; N triaglf ; G 3492 +U 9669 ; WX 769 ; N uni25C5 ; G 3493 +U 9670 ; WX 769 ; N uni25C6 ; G 3494 +U 9671 ; WX 769 ; N uni25C7 ; G 3495 +U 9672 ; WX 769 ; N uni25C8 ; G 3496 +U 9673 ; WX 873 ; N uni25C9 ; G 3497 +U 9674 ; WX 494 ; N lozenge ; G 3498 +U 9675 ; WX 873 ; N circle ; G 3499 +U 9676 ; WX 873 ; N uni25CC ; G 3500 +U 9677 ; WX 873 ; N uni25CD ; G 3501 +U 9678 ; WX 873 ; N uni25CE ; G 3502 +U 9679 ; WX 873 ; N H18533 ; G 3503 +U 9680 ; WX 873 ; N uni25D0 ; G 3504 +U 9681 ; WX 873 ; N uni25D1 ; G 3505 +U 9682 ; WX 873 ; N uni25D2 ; G 3506 +U 9683 ; WX 873 ; N uni25D3 ; G 3507 +U 9684 ; WX 873 ; N uni25D4 ; G 3508 +U 9685 ; WX 873 ; N uni25D5 ; G 3509 +U 9686 ; WX 527 ; N uni25D6 ; G 3510 +U 9687 ; WX 527 ; N uni25D7 ; G 3511 +U 9688 ; WX 840 ; N invbullet ; G 3512 +U 9689 ; WX 970 ; N invcircle ; G 3513 +U 9690 ; WX 970 ; N uni25DA ; G 3514 +U 9691 ; WX 970 ; N uni25DB ; G 3515 +U 9692 ; WX 387 ; N uni25DC ; G 3516 +U 9693 ; WX 387 ; N uni25DD ; G 3517 +U 9694 ; WX 387 ; N uni25DE ; G 3518 +U 9695 ; WX 387 ; N uni25DF ; G 3519 +U 9696 ; WX 769 ; N uni25E0 ; G 3520 +U 9697 ; WX 769 ; N uni25E1 ; G 3521 +U 9698 ; WX 769 ; N uni25E2 ; G 3522 +U 9699 ; WX 769 ; N uni25E3 ; G 3523 +U 9700 ; WX 769 ; N uni25E4 ; G 3524 +U 9701 ; WX 769 ; N uni25E5 ; G 3525 +U 9702 ; WX 639 ; N openbullet ; G 3526 +U 9703 ; WX 945 ; N uni25E7 ; G 3527 +U 9704 ; WX 945 ; N uni25E8 ; G 3528 +U 9705 ; WX 945 ; N uni25E9 ; G 3529 +U 9706 ; WX 945 ; N uni25EA ; G 3530 +U 9707 ; WX 945 ; N uni25EB ; G 3531 +U 9708 ; WX 769 ; N uni25EC ; G 3532 +U 9709 ; WX 769 ; N uni25ED ; G 3533 +U 9710 ; WX 769 ; N uni25EE ; G 3534 +U 9711 ; WX 1119 ; N uni25EF ; G 3535 +U 9712 ; WX 945 ; N uni25F0 ; G 3536 +U 9713 ; WX 945 ; N uni25F1 ; G 3537 +U 9714 ; WX 945 ; N uni25F2 ; G 3538 +U 9715 ; WX 945 ; N uni25F3 ; G 3539 +U 9716 ; WX 873 ; N uni25F4 ; G 3540 +U 9717 ; WX 873 ; N uni25F5 ; G 3541 +U 9718 ; WX 873 ; N uni25F6 ; G 3542 +U 9719 ; WX 873 ; N uni25F7 ; G 3543 +U 9720 ; WX 769 ; N uni25F8 ; G 3544 +U 9721 ; WX 769 ; N uni25F9 ; G 3545 +U 9722 ; WX 769 ; N uni25FA ; G 3546 +U 9723 ; WX 830 ; N uni25FB ; G 3547 +U 9724 ; WX 830 ; N uni25FC ; G 3548 +U 9725 ; WX 732 ; N uni25FD ; G 3549 +U 9726 ; WX 732 ; N uni25FE ; G 3550 +U 9727 ; WX 769 ; N uni25FF ; G 3551 +U 9728 ; WX 896 ; N uni2600 ; G 3552 +U 9729 ; WX 1000 ; N uni2601 ; G 3553 +U 9730 ; WX 896 ; N uni2602 ; G 3554 +U 9731 ; WX 896 ; N uni2603 ; G 3555 +U 9732 ; WX 896 ; N uni2604 ; G 3556 +U 9733 ; WX 896 ; N uni2605 ; G 3557 +U 9734 ; WX 896 ; N uni2606 ; G 3558 +U 9735 ; WX 573 ; N uni2607 ; G 3559 +U 9736 ; WX 896 ; N uni2608 ; G 3560 +U 9737 ; WX 896 ; N uni2609 ; G 3561 +U 9738 ; WX 888 ; N uni260A ; G 3562 +U 9739 ; WX 888 ; N uni260B ; G 3563 +U 9740 ; WX 671 ; N uni260C ; G 3564 +U 9741 ; WX 1013 ; N uni260D ; G 3565 +U 9742 ; WX 1246 ; N uni260E ; G 3566 +U 9743 ; WX 1250 ; N uni260F ; G 3567 +U 9744 ; WX 896 ; N uni2610 ; G 3568 +U 9745 ; WX 896 ; N uni2611 ; G 3569 +U 9746 ; WX 896 ; N uni2612 ; G 3570 +U 9747 ; WX 532 ; N uni2613 ; G 3571 +U 9748 ; WX 896 ; N uni2614 ; G 3572 +U 9749 ; WX 896 ; N uni2615 ; G 3573 +U 9750 ; WX 896 ; N uni2616 ; G 3574 +U 9751 ; WX 896 ; N uni2617 ; G 3575 +U 9752 ; WX 896 ; N uni2618 ; G 3576 +U 9753 ; WX 896 ; N uni2619 ; G 3577 +U 9754 ; WX 896 ; N uni261A ; G 3578 +U 9755 ; WX 896 ; N uni261B ; G 3579 +U 9756 ; WX 896 ; N uni261C ; G 3580 +U 9757 ; WX 609 ; N uni261D ; G 3581 +U 9758 ; WX 896 ; N uni261E ; G 3582 +U 9759 ; WX 609 ; N uni261F ; G 3583 +U 9760 ; WX 896 ; N uni2620 ; G 3584 +U 9761 ; WX 896 ; N uni2621 ; G 3585 +U 9762 ; WX 896 ; N uni2622 ; G 3586 +U 9763 ; WX 896 ; N uni2623 ; G 3587 +U 9764 ; WX 669 ; N uni2624 ; G 3588 +U 9765 ; WX 746 ; N uni2625 ; G 3589 +U 9766 ; WX 649 ; N uni2626 ; G 3590 +U 9767 ; WX 784 ; N uni2627 ; G 3591 +U 9768 ; WX 545 ; N uni2628 ; G 3592 +U 9769 ; WX 896 ; N uni2629 ; G 3593 +U 9770 ; WX 896 ; N uni262A ; G 3594 +U 9771 ; WX 896 ; N uni262B ; G 3595 +U 9772 ; WX 710 ; N uni262C ; G 3596 +U 9773 ; WX 896 ; N uni262D ; G 3597 +U 9774 ; WX 896 ; N uni262E ; G 3598 +U 9775 ; WX 896 ; N uni262F ; G 3599 +U 9776 ; WX 896 ; N uni2630 ; G 3600 +U 9777 ; WX 896 ; N uni2631 ; G 3601 +U 9778 ; WX 896 ; N uni2632 ; G 3602 +U 9779 ; WX 896 ; N uni2633 ; G 3603 +U 9780 ; WX 896 ; N uni2634 ; G 3604 +U 9781 ; WX 896 ; N uni2635 ; G 3605 +U 9782 ; WX 896 ; N uni2636 ; G 3606 +U 9783 ; WX 896 ; N uni2637 ; G 3607 +U 9784 ; WX 896 ; N uni2638 ; G 3608 +U 9785 ; WX 1042 ; N uni2639 ; G 3609 +U 9786 ; WX 1042 ; N smileface ; G 3610 +U 9787 ; WX 1042 ; N invsmileface ; G 3611 +U 9788 ; WX 896 ; N sun ; G 3612 +U 9789 ; WX 896 ; N uni263D ; G 3613 +U 9790 ; WX 896 ; N uni263E ; G 3614 +U 9791 ; WX 614 ; N uni263F ; G 3615 +U 9792 ; WX 732 ; N female ; G 3616 +U 9793 ; WX 732 ; N uni2641 ; G 3617 +U 9794 ; WX 896 ; N male ; G 3618 +U 9795 ; WX 896 ; N uni2643 ; G 3619 +U 9796 ; WX 896 ; N uni2644 ; G 3620 +U 9797 ; WX 896 ; N uni2645 ; G 3621 +U 9798 ; WX 896 ; N uni2646 ; G 3622 +U 9799 ; WX 896 ; N uni2647 ; G 3623 +U 9800 ; WX 896 ; N uni2648 ; G 3624 +U 9801 ; WX 896 ; N uni2649 ; G 3625 +U 9802 ; WX 896 ; N uni264A ; G 3626 +U 9803 ; WX 896 ; N uni264B ; G 3627 +U 9804 ; WX 896 ; N uni264C ; G 3628 +U 9805 ; WX 896 ; N uni264D ; G 3629 +U 9806 ; WX 896 ; N uni264E ; G 3630 +U 9807 ; WX 896 ; N uni264F ; G 3631 +U 9808 ; WX 896 ; N uni2650 ; G 3632 +U 9809 ; WX 896 ; N uni2651 ; G 3633 +U 9810 ; WX 896 ; N uni2652 ; G 3634 +U 9811 ; WX 896 ; N uni2653 ; G 3635 +U 9812 ; WX 896 ; N uni2654 ; G 3636 +U 9813 ; WX 896 ; N uni2655 ; G 3637 +U 9814 ; WX 896 ; N uni2656 ; G 3638 +U 9815 ; WX 896 ; N uni2657 ; G 3639 +U 9816 ; WX 896 ; N uni2658 ; G 3640 +U 9817 ; WX 896 ; N uni2659 ; G 3641 +U 9818 ; WX 896 ; N uni265A ; G 3642 +U 9819 ; WX 896 ; N uni265B ; G 3643 +U 9820 ; WX 896 ; N uni265C ; G 3644 +U 9821 ; WX 896 ; N uni265D ; G 3645 +U 9822 ; WX 896 ; N uni265E ; G 3646 +U 9823 ; WX 896 ; N uni265F ; G 3647 +U 9824 ; WX 896 ; N spade ; G 3648 +U 9825 ; WX 896 ; N uni2661 ; G 3649 +U 9826 ; WX 896 ; N uni2662 ; G 3650 +U 9827 ; WX 896 ; N club ; G 3651 +U 9828 ; WX 896 ; N uni2664 ; G 3652 +U 9829 ; WX 896 ; N heart ; G 3653 +U 9830 ; WX 896 ; N diamond ; G 3654 +U 9831 ; WX 896 ; N uni2667 ; G 3655 +U 9832 ; WX 896 ; N uni2668 ; G 3656 +U 9833 ; WX 472 ; N uni2669 ; G 3657 +U 9834 ; WX 638 ; N musicalnote ; G 3658 +U 9835 ; WX 896 ; N musicalnotedbl ; G 3659 +U 9836 ; WX 896 ; N uni266C ; G 3660 +U 9837 ; WX 472 ; N uni266D ; G 3661 +U 9838 ; WX 357 ; N uni266E ; G 3662 +U 9839 ; WX 484 ; N uni266F ; G 3663 +U 9840 ; WX 748 ; N uni2670 ; G 3664 +U 9841 ; WX 766 ; N uni2671 ; G 3665 +U 9842 ; WX 896 ; N uni2672 ; G 3666 +U 9843 ; WX 896 ; N uni2673 ; G 3667 +U 9844 ; WX 896 ; N uni2674 ; G 3668 +U 9845 ; WX 896 ; N uni2675 ; G 3669 +U 9846 ; WX 896 ; N uni2676 ; G 3670 +U 9847 ; WX 896 ; N uni2677 ; G 3671 +U 9848 ; WX 896 ; N uni2678 ; G 3672 +U 9849 ; WX 896 ; N uni2679 ; G 3673 +U 9850 ; WX 896 ; N uni267A ; G 3674 +U 9851 ; WX 896 ; N uni267B ; G 3675 +U 9852 ; WX 896 ; N uni267C ; G 3676 +U 9853 ; WX 896 ; N uni267D ; G 3677 +U 9854 ; WX 896 ; N uni267E ; G 3678 +U 9855 ; WX 896 ; N uni267F ; G 3679 +U 9856 ; WX 869 ; N uni2680 ; G 3680 +U 9857 ; WX 869 ; N uni2681 ; G 3681 +U 9858 ; WX 869 ; N uni2682 ; G 3682 +U 9859 ; WX 869 ; N uni2683 ; G 3683 +U 9860 ; WX 869 ; N uni2684 ; G 3684 +U 9861 ; WX 869 ; N uni2685 ; G 3685 +U 9862 ; WX 896 ; N uni2686 ; G 3686 +U 9863 ; WX 896 ; N uni2687 ; G 3687 +U 9864 ; WX 896 ; N uni2688 ; G 3688 +U 9865 ; WX 896 ; N uni2689 ; G 3689 +U 9866 ; WX 896 ; N uni268A ; G 3690 +U 9867 ; WX 896 ; N uni268B ; G 3691 +U 9868 ; WX 896 ; N uni268C ; G 3692 +U 9869 ; WX 896 ; N uni268D ; G 3693 +U 9870 ; WX 896 ; N uni268E ; G 3694 +U 9871 ; WX 896 ; N uni268F ; G 3695 +U 9872 ; WX 896 ; N uni2690 ; G 3696 +U 9873 ; WX 896 ; N uni2691 ; G 3697 +U 9874 ; WX 896 ; N uni2692 ; G 3698 +U 9875 ; WX 896 ; N uni2693 ; G 3699 +U 9876 ; WX 896 ; N uni2694 ; G 3700 +U 9877 ; WX 541 ; N uni2695 ; G 3701 +U 9878 ; WX 896 ; N uni2696 ; G 3702 +U 9879 ; WX 896 ; N uni2697 ; G 3703 +U 9880 ; WX 896 ; N uni2698 ; G 3704 +U 9881 ; WX 896 ; N uni2699 ; G 3705 +U 9882 ; WX 896 ; N uni269A ; G 3706 +U 9883 ; WX 896 ; N uni269B ; G 3707 +U 9884 ; WX 896 ; N uni269C ; G 3708 +U 9886 ; WX 896 ; N uni269E ; G 3709 +U 9887 ; WX 896 ; N uni269F ; G 3710 +U 9888 ; WX 896 ; N uni26A0 ; G 3711 +U 9889 ; WX 702 ; N uni26A1 ; G 3712 +U 9890 ; WX 1004 ; N uni26A2 ; G 3713 +U 9891 ; WX 1089 ; N uni26A3 ; G 3714 +U 9892 ; WX 1175 ; N uni26A4 ; G 3715 +U 9893 ; WX 903 ; N uni26A5 ; G 3716 +U 9894 ; WX 838 ; N uni26A6 ; G 3717 +U 9895 ; WX 838 ; N uni26A7 ; G 3718 +U 9896 ; WX 838 ; N uni26A8 ; G 3719 +U 9897 ; WX 838 ; N uni26A9 ; G 3720 +U 9898 ; WX 838 ; N uni26AA ; G 3721 +U 9899 ; WX 838 ; N uni26AB ; G 3722 +U 9900 ; WX 838 ; N uni26AC ; G 3723 +U 9901 ; WX 838 ; N uni26AD ; G 3724 +U 9902 ; WX 838 ; N uni26AE ; G 3725 +U 9903 ; WX 838 ; N uni26AF ; G 3726 +U 9904 ; WX 844 ; N uni26B0 ; G 3727 +U 9905 ; WX 838 ; N uni26B1 ; G 3728 +U 9906 ; WX 732 ; N uni26B2 ; G 3729 +U 9907 ; WX 732 ; N uni26B3 ; G 3730 +U 9908 ; WX 732 ; N uni26B4 ; G 3731 +U 9909 ; WX 732 ; N uni26B5 ; G 3732 +U 9910 ; WX 850 ; N uni26B6 ; G 3733 +U 9911 ; WX 732 ; N uni26B7 ; G 3734 +U 9912 ; WX 732 ; N uni26B8 ; G 3735 +U 9920 ; WX 838 ; N uni26C0 ; G 3736 +U 9921 ; WX 838 ; N uni26C1 ; G 3737 +U 9922 ; WX 838 ; N uni26C2 ; G 3738 +U 9923 ; WX 838 ; N uni26C3 ; G 3739 +U 9954 ; WX 732 ; N uni26E2 ; G 3740 +U 9985 ; WX 838 ; N uni2701 ; G 3741 +U 9986 ; WX 838 ; N uni2702 ; G 3742 +U 9987 ; WX 838 ; N uni2703 ; G 3743 +U 9988 ; WX 838 ; N uni2704 ; G 3744 +U 9990 ; WX 838 ; N uni2706 ; G 3745 +U 9991 ; WX 838 ; N uni2707 ; G 3746 +U 9992 ; WX 838 ; N uni2708 ; G 3747 +U 9993 ; WX 838 ; N uni2709 ; G 3748 +U 9996 ; WX 838 ; N uni270C ; G 3749 +U 9997 ; WX 838 ; N uni270D ; G 3750 +U 9998 ; WX 838 ; N uni270E ; G 3751 +U 9999 ; WX 838 ; N uni270F ; G 3752 +U 10000 ; WX 838 ; N uni2710 ; G 3753 +U 10001 ; WX 838 ; N uni2711 ; G 3754 +U 10002 ; WX 838 ; N uni2712 ; G 3755 +U 10003 ; WX 838 ; N uni2713 ; G 3756 +U 10004 ; WX 838 ; N uni2714 ; G 3757 +U 10005 ; WX 838 ; N uni2715 ; G 3758 +U 10006 ; WX 838 ; N uni2716 ; G 3759 +U 10007 ; WX 838 ; N uni2717 ; G 3760 +U 10008 ; WX 838 ; N uni2718 ; G 3761 +U 10009 ; WX 838 ; N uni2719 ; G 3762 +U 10010 ; WX 838 ; N uni271A ; G 3763 +U 10011 ; WX 838 ; N uni271B ; G 3764 +U 10012 ; WX 838 ; N uni271C ; G 3765 +U 10013 ; WX 838 ; N uni271D ; G 3766 +U 10014 ; WX 838 ; N uni271E ; G 3767 +U 10015 ; WX 838 ; N uni271F ; G 3768 +U 10016 ; WX 838 ; N uni2720 ; G 3769 +U 10017 ; WX 838 ; N uni2721 ; G 3770 +U 10018 ; WX 838 ; N uni2722 ; G 3771 +U 10019 ; WX 838 ; N uni2723 ; G 3772 +U 10020 ; WX 838 ; N uni2724 ; G 3773 +U 10021 ; WX 838 ; N uni2725 ; G 3774 +U 10022 ; WX 838 ; N uni2726 ; G 3775 +U 10023 ; WX 838 ; N uni2727 ; G 3776 +U 10025 ; WX 838 ; N uni2729 ; G 3777 +U 10026 ; WX 838 ; N uni272A ; G 3778 +U 10027 ; WX 838 ; N uni272B ; G 3779 +U 10028 ; WX 838 ; N uni272C ; G 3780 +U 10029 ; WX 838 ; N uni272D ; G 3781 +U 10030 ; WX 838 ; N uni272E ; G 3782 +U 10031 ; WX 838 ; N uni272F ; G 3783 +U 10032 ; WX 838 ; N uni2730 ; G 3784 +U 10033 ; WX 838 ; N uni2731 ; G 3785 +U 10034 ; WX 838 ; N uni2732 ; G 3786 +U 10035 ; WX 838 ; N uni2733 ; G 3787 +U 10036 ; WX 838 ; N uni2734 ; G 3788 +U 10037 ; WX 838 ; N uni2735 ; G 3789 +U 10038 ; WX 838 ; N uni2736 ; G 3790 +U 10039 ; WX 838 ; N uni2737 ; G 3791 +U 10040 ; WX 838 ; N uni2738 ; G 3792 +U 10041 ; WX 838 ; N uni2739 ; G 3793 +U 10042 ; WX 838 ; N uni273A ; G 3794 +U 10043 ; WX 838 ; N uni273B ; G 3795 +U 10044 ; WX 838 ; N uni273C ; G 3796 +U 10045 ; WX 838 ; N uni273D ; G 3797 +U 10046 ; WX 838 ; N uni273E ; G 3798 +U 10047 ; WX 838 ; N uni273F ; G 3799 +U 10048 ; WX 838 ; N uni2740 ; G 3800 +U 10049 ; WX 838 ; N uni2741 ; G 3801 +U 10050 ; WX 838 ; N uni2742 ; G 3802 +U 10051 ; WX 838 ; N uni2743 ; G 3803 +U 10052 ; WX 838 ; N uni2744 ; G 3804 +U 10053 ; WX 838 ; N uni2745 ; G 3805 +U 10054 ; WX 838 ; N uni2746 ; G 3806 +U 10055 ; WX 838 ; N uni2747 ; G 3807 +U 10056 ; WX 838 ; N uni2748 ; G 3808 +U 10057 ; WX 838 ; N uni2749 ; G 3809 +U 10058 ; WX 838 ; N uni274A ; G 3810 +U 10059 ; WX 838 ; N uni274B ; G 3811 +U 10061 ; WX 896 ; N uni274D ; G 3812 +U 10063 ; WX 896 ; N uni274F ; G 3813 +U 10064 ; WX 896 ; N uni2750 ; G 3814 +U 10065 ; WX 896 ; N uni2751 ; G 3815 +U 10066 ; WX 896 ; N uni2752 ; G 3816 +U 10070 ; WX 896 ; N uni2756 ; G 3817 +U 10072 ; WX 838 ; N uni2758 ; G 3818 +U 10073 ; WX 838 ; N uni2759 ; G 3819 +U 10074 ; WX 838 ; N uni275A ; G 3820 +U 10075 ; WX 322 ; N uni275B ; G 3821 +U 10076 ; WX 322 ; N uni275C ; G 3822 +U 10077 ; WX 538 ; N uni275D ; G 3823 +U 10078 ; WX 538 ; N uni275E ; G 3824 +U 10081 ; WX 838 ; N uni2761 ; G 3825 +U 10082 ; WX 838 ; N uni2762 ; G 3826 +U 10083 ; WX 838 ; N uni2763 ; G 3827 +U 10084 ; WX 838 ; N uni2764 ; G 3828 +U 10085 ; WX 838 ; N uni2765 ; G 3829 +U 10086 ; WX 838 ; N uni2766 ; G 3830 +U 10087 ; WX 838 ; N uni2767 ; G 3831 +U 10088 ; WX 838 ; N uni2768 ; G 3832 +U 10089 ; WX 838 ; N uni2769 ; G 3833 +U 10090 ; WX 838 ; N uni276A ; G 3834 +U 10091 ; WX 838 ; N uni276B ; G 3835 +U 10092 ; WX 838 ; N uni276C ; G 3836 +U 10093 ; WX 838 ; N uni276D ; G 3837 +U 10094 ; WX 838 ; N uni276E ; G 3838 +U 10095 ; WX 838 ; N uni276F ; G 3839 +U 10096 ; WX 838 ; N uni2770 ; G 3840 +U 10097 ; WX 838 ; N uni2771 ; G 3841 +U 10098 ; WX 838 ; N uni2772 ; G 3842 +U 10099 ; WX 838 ; N uni2773 ; G 3843 +U 10100 ; WX 838 ; N uni2774 ; G 3844 +U 10101 ; WX 838 ; N uni2775 ; G 3845 +U 10102 ; WX 847 ; N uni2776 ; G 3846 +U 10103 ; WX 847 ; N uni2777 ; G 3847 +U 10104 ; WX 847 ; N uni2778 ; G 3848 +U 10105 ; WX 847 ; N uni2779 ; G 3849 +U 10106 ; WX 847 ; N uni277A ; G 3850 +U 10107 ; WX 847 ; N uni277B ; G 3851 +U 10108 ; WX 847 ; N uni277C ; G 3852 +U 10109 ; WX 847 ; N uni277D ; G 3853 +U 10110 ; WX 847 ; N uni277E ; G 3854 +U 10111 ; WX 847 ; N uni277F ; G 3855 +U 10112 ; WX 838 ; N uni2780 ; G 3856 +U 10113 ; WX 838 ; N uni2781 ; G 3857 +U 10114 ; WX 838 ; N uni2782 ; G 3858 +U 10115 ; WX 838 ; N uni2783 ; G 3859 +U 10116 ; WX 838 ; N uni2784 ; G 3860 +U 10117 ; WX 838 ; N uni2785 ; G 3861 +U 10118 ; WX 838 ; N uni2786 ; G 3862 +U 10119 ; WX 838 ; N uni2787 ; G 3863 +U 10120 ; WX 838 ; N uni2788 ; G 3864 +U 10121 ; WX 838 ; N uni2789 ; G 3865 +U 10122 ; WX 838 ; N uni278A ; G 3866 +U 10123 ; WX 838 ; N uni278B ; G 3867 +U 10124 ; WX 838 ; N uni278C ; G 3868 +U 10125 ; WX 838 ; N uni278D ; G 3869 +U 10126 ; WX 838 ; N uni278E ; G 3870 +U 10127 ; WX 838 ; N uni278F ; G 3871 +U 10128 ; WX 838 ; N uni2790 ; G 3872 +U 10129 ; WX 838 ; N uni2791 ; G 3873 +U 10130 ; WX 838 ; N uni2792 ; G 3874 +U 10131 ; WX 838 ; N uni2793 ; G 3875 +U 10132 ; WX 838 ; N uni2794 ; G 3876 +U 10136 ; WX 838 ; N uni2798 ; G 3877 +U 10137 ; WX 838 ; N uni2799 ; G 3878 +U 10138 ; WX 838 ; N uni279A ; G 3879 +U 10139 ; WX 838 ; N uni279B ; G 3880 +U 10140 ; WX 838 ; N uni279C ; G 3881 +U 10141 ; WX 838 ; N uni279D ; G 3882 +U 10142 ; WX 838 ; N uni279E ; G 3883 +U 10143 ; WX 838 ; N uni279F ; G 3884 +U 10144 ; WX 838 ; N uni27A0 ; G 3885 +U 10145 ; WX 838 ; N uni27A1 ; G 3886 +U 10146 ; WX 838 ; N uni27A2 ; G 3887 +U 10147 ; WX 838 ; N uni27A3 ; G 3888 +U 10148 ; WX 838 ; N uni27A4 ; G 3889 +U 10149 ; WX 838 ; N uni27A5 ; G 3890 +U 10150 ; WX 838 ; N uni27A6 ; G 3891 +U 10151 ; WX 838 ; N uni27A7 ; G 3892 +U 10152 ; WX 838 ; N uni27A8 ; G 3893 +U 10153 ; WX 838 ; N uni27A9 ; G 3894 +U 10154 ; WX 838 ; N uni27AA ; G 3895 +U 10155 ; WX 838 ; N uni27AB ; G 3896 +U 10156 ; WX 838 ; N uni27AC ; G 3897 +U 10157 ; WX 838 ; N uni27AD ; G 3898 +U 10158 ; WX 838 ; N uni27AE ; G 3899 +U 10159 ; WX 838 ; N uni27AF ; G 3900 +U 10161 ; WX 838 ; N uni27B1 ; G 3901 +U 10162 ; WX 838 ; N uni27B2 ; G 3902 +U 10163 ; WX 838 ; N uni27B3 ; G 3903 +U 10164 ; WX 838 ; N uni27B4 ; G 3904 +U 10165 ; WX 838 ; N uni27B5 ; G 3905 +U 10166 ; WX 838 ; N uni27B6 ; G 3906 +U 10167 ; WX 838 ; N uni27B7 ; G 3907 +U 10168 ; WX 838 ; N uni27B8 ; G 3908 +U 10169 ; WX 838 ; N uni27B9 ; G 3909 +U 10170 ; WX 838 ; N uni27BA ; G 3910 +U 10171 ; WX 838 ; N uni27BB ; G 3911 +U 10172 ; WX 838 ; N uni27BC ; G 3912 +U 10173 ; WX 838 ; N uni27BD ; G 3913 +U 10174 ; WX 838 ; N uni27BE ; G 3914 +U 10181 ; WX 457 ; N uni27C5 ; G 3915 +U 10182 ; WX 457 ; N uni27C6 ; G 3916 +U 10208 ; WX 494 ; N uni27E0 ; G 3917 +U 10214 ; WX 487 ; N uni27E6 ; G 3918 +U 10215 ; WX 487 ; N uni27E7 ; G 3919 +U 10216 ; WX 457 ; N uni27E8 ; G 3920 +U 10217 ; WX 457 ; N uni27E9 ; G 3921 +U 10218 ; WX 721 ; N uni27EA ; G 3922 +U 10219 ; WX 721 ; N uni27EB ; G 3923 +U 10224 ; WX 838 ; N uni27F0 ; G 3924 +U 10225 ; WX 838 ; N uni27F1 ; G 3925 +U 10226 ; WX 838 ; N uni27F2 ; G 3926 +U 10227 ; WX 838 ; N uni27F3 ; G 3927 +U 10228 ; WX 1157 ; N uni27F4 ; G 3928 +U 10229 ; WX 1434 ; N uni27F5 ; G 3929 +U 10230 ; WX 1434 ; N uni27F6 ; G 3930 +U 10231 ; WX 1434 ; N uni27F7 ; G 3931 +U 10232 ; WX 1434 ; N uni27F8 ; G 3932 +U 10233 ; WX 1434 ; N uni27F9 ; G 3933 +U 10234 ; WX 1434 ; N uni27FA ; G 3934 +U 10235 ; WX 1434 ; N uni27FB ; G 3935 +U 10236 ; WX 1434 ; N uni27FC ; G 3936 +U 10237 ; WX 1434 ; N uni27FD ; G 3937 +U 10238 ; WX 1434 ; N uni27FE ; G 3938 +U 10239 ; WX 1434 ; N uni27FF ; G 3939 +U 10240 ; WX 781 ; N uni2800 ; G 3940 +U 10241 ; WX 781 ; N uni2801 ; G 3941 +U 10242 ; WX 781 ; N uni2802 ; G 3942 +U 10243 ; WX 781 ; N uni2803 ; G 3943 +U 10244 ; WX 781 ; N uni2804 ; G 3944 +U 10245 ; WX 781 ; N uni2805 ; G 3945 +U 10246 ; WX 781 ; N uni2806 ; G 3946 +U 10247 ; WX 781 ; N uni2807 ; G 3947 +U 10248 ; WX 781 ; N uni2808 ; G 3948 +U 10249 ; WX 781 ; N uni2809 ; G 3949 +U 10250 ; WX 781 ; N uni280A ; G 3950 +U 10251 ; WX 781 ; N uni280B ; G 3951 +U 10252 ; WX 781 ; N uni280C ; G 3952 +U 10253 ; WX 781 ; N uni280D ; G 3953 +U 10254 ; WX 781 ; N uni280E ; G 3954 +U 10255 ; WX 781 ; N uni280F ; G 3955 +U 10256 ; WX 781 ; N uni2810 ; G 3956 +U 10257 ; WX 781 ; N uni2811 ; G 3957 +U 10258 ; WX 781 ; N uni2812 ; G 3958 +U 10259 ; WX 781 ; N uni2813 ; G 3959 +U 10260 ; WX 781 ; N uni2814 ; G 3960 +U 10261 ; WX 781 ; N uni2815 ; G 3961 +U 10262 ; WX 781 ; N uni2816 ; G 3962 +U 10263 ; WX 781 ; N uni2817 ; G 3963 +U 10264 ; WX 781 ; N uni2818 ; G 3964 +U 10265 ; WX 781 ; N uni2819 ; G 3965 +U 10266 ; WX 781 ; N uni281A ; G 3966 +U 10267 ; WX 781 ; N uni281B ; G 3967 +U 10268 ; WX 781 ; N uni281C ; G 3968 +U 10269 ; WX 781 ; N uni281D ; G 3969 +U 10270 ; WX 781 ; N uni281E ; G 3970 +U 10271 ; WX 781 ; N uni281F ; G 3971 +U 10272 ; WX 781 ; N uni2820 ; G 3972 +U 10273 ; WX 781 ; N uni2821 ; G 3973 +U 10274 ; WX 781 ; N uni2822 ; G 3974 +U 10275 ; WX 781 ; N uni2823 ; G 3975 +U 10276 ; WX 781 ; N uni2824 ; G 3976 +U 10277 ; WX 781 ; N uni2825 ; G 3977 +U 10278 ; WX 781 ; N uni2826 ; G 3978 +U 10279 ; WX 781 ; N uni2827 ; G 3979 +U 10280 ; WX 781 ; N uni2828 ; G 3980 +U 10281 ; WX 781 ; N uni2829 ; G 3981 +U 10282 ; WX 781 ; N uni282A ; G 3982 +U 10283 ; WX 781 ; N uni282B ; G 3983 +U 10284 ; WX 781 ; N uni282C ; G 3984 +U 10285 ; WX 781 ; N uni282D ; G 3985 +U 10286 ; WX 781 ; N uni282E ; G 3986 +U 10287 ; WX 781 ; N uni282F ; G 3987 +U 10288 ; WX 781 ; N uni2830 ; G 3988 +U 10289 ; WX 781 ; N uni2831 ; G 3989 +U 10290 ; WX 781 ; N uni2832 ; G 3990 +U 10291 ; WX 781 ; N uni2833 ; G 3991 +U 10292 ; WX 781 ; N uni2834 ; G 3992 +U 10293 ; WX 781 ; N uni2835 ; G 3993 +U 10294 ; WX 781 ; N uni2836 ; G 3994 +U 10295 ; WX 781 ; N uni2837 ; G 3995 +U 10296 ; WX 781 ; N uni2838 ; G 3996 +U 10297 ; WX 781 ; N uni2839 ; G 3997 +U 10298 ; WX 781 ; N uni283A ; G 3998 +U 10299 ; WX 781 ; N uni283B ; G 3999 +U 10300 ; WX 781 ; N uni283C ; G 4000 +U 10301 ; WX 781 ; N uni283D ; G 4001 +U 10302 ; WX 781 ; N uni283E ; G 4002 +U 10303 ; WX 781 ; N uni283F ; G 4003 +U 10304 ; WX 781 ; N uni2840 ; G 4004 +U 10305 ; WX 781 ; N uni2841 ; G 4005 +U 10306 ; WX 781 ; N uni2842 ; G 4006 +U 10307 ; WX 781 ; N uni2843 ; G 4007 +U 10308 ; WX 781 ; N uni2844 ; G 4008 +U 10309 ; WX 781 ; N uni2845 ; G 4009 +U 10310 ; WX 781 ; N uni2846 ; G 4010 +U 10311 ; WX 781 ; N uni2847 ; G 4011 +U 10312 ; WX 781 ; N uni2848 ; G 4012 +U 10313 ; WX 781 ; N uni2849 ; G 4013 +U 10314 ; WX 781 ; N uni284A ; G 4014 +U 10315 ; WX 781 ; N uni284B ; G 4015 +U 10316 ; WX 781 ; N uni284C ; G 4016 +U 10317 ; WX 781 ; N uni284D ; G 4017 +U 10318 ; WX 781 ; N uni284E ; G 4018 +U 10319 ; WX 781 ; N uni284F ; G 4019 +U 10320 ; WX 781 ; N uni2850 ; G 4020 +U 10321 ; WX 781 ; N uni2851 ; G 4021 +U 10322 ; WX 781 ; N uni2852 ; G 4022 +U 10323 ; WX 781 ; N uni2853 ; G 4023 +U 10324 ; WX 781 ; N uni2854 ; G 4024 +U 10325 ; WX 781 ; N uni2855 ; G 4025 +U 10326 ; WX 781 ; N uni2856 ; G 4026 +U 10327 ; WX 781 ; N uni2857 ; G 4027 +U 10328 ; WX 781 ; N uni2858 ; G 4028 +U 10329 ; WX 781 ; N uni2859 ; G 4029 +U 10330 ; WX 781 ; N uni285A ; G 4030 +U 10331 ; WX 781 ; N uni285B ; G 4031 +U 10332 ; WX 781 ; N uni285C ; G 4032 +U 10333 ; WX 781 ; N uni285D ; G 4033 +U 10334 ; WX 781 ; N uni285E ; G 4034 +U 10335 ; WX 781 ; N uni285F ; G 4035 +U 10336 ; WX 781 ; N uni2860 ; G 4036 +U 10337 ; WX 781 ; N uni2861 ; G 4037 +U 10338 ; WX 781 ; N uni2862 ; G 4038 +U 10339 ; WX 781 ; N uni2863 ; G 4039 +U 10340 ; WX 781 ; N uni2864 ; G 4040 +U 10341 ; WX 781 ; N uni2865 ; G 4041 +U 10342 ; WX 781 ; N uni2866 ; G 4042 +U 10343 ; WX 781 ; N uni2867 ; G 4043 +U 10344 ; WX 781 ; N uni2868 ; G 4044 +U 10345 ; WX 781 ; N uni2869 ; G 4045 +U 10346 ; WX 781 ; N uni286A ; G 4046 +U 10347 ; WX 781 ; N uni286B ; G 4047 +U 10348 ; WX 781 ; N uni286C ; G 4048 +U 10349 ; WX 781 ; N uni286D ; G 4049 +U 10350 ; WX 781 ; N uni286E ; G 4050 +U 10351 ; WX 781 ; N uni286F ; G 4051 +U 10352 ; WX 781 ; N uni2870 ; G 4052 +U 10353 ; WX 781 ; N uni2871 ; G 4053 +U 10354 ; WX 781 ; N uni2872 ; G 4054 +U 10355 ; WX 781 ; N uni2873 ; G 4055 +U 10356 ; WX 781 ; N uni2874 ; G 4056 +U 10357 ; WX 781 ; N uni2875 ; G 4057 +U 10358 ; WX 781 ; N uni2876 ; G 4058 +U 10359 ; WX 781 ; N uni2877 ; G 4059 +U 10360 ; WX 781 ; N uni2878 ; G 4060 +U 10361 ; WX 781 ; N uni2879 ; G 4061 +U 10362 ; WX 781 ; N uni287A ; G 4062 +U 10363 ; WX 781 ; N uni287B ; G 4063 +U 10364 ; WX 781 ; N uni287C ; G 4064 +U 10365 ; WX 781 ; N uni287D ; G 4065 +U 10366 ; WX 781 ; N uni287E ; G 4066 +U 10367 ; WX 781 ; N uni287F ; G 4067 +U 10368 ; WX 781 ; N uni2880 ; G 4068 +U 10369 ; WX 781 ; N uni2881 ; G 4069 +U 10370 ; WX 781 ; N uni2882 ; G 4070 +U 10371 ; WX 781 ; N uni2883 ; G 4071 +U 10372 ; WX 781 ; N uni2884 ; G 4072 +U 10373 ; WX 781 ; N uni2885 ; G 4073 +U 10374 ; WX 781 ; N uni2886 ; G 4074 +U 10375 ; WX 781 ; N uni2887 ; G 4075 +U 10376 ; WX 781 ; N uni2888 ; G 4076 +U 10377 ; WX 781 ; N uni2889 ; G 4077 +U 10378 ; WX 781 ; N uni288A ; G 4078 +U 10379 ; WX 781 ; N uni288B ; G 4079 +U 10380 ; WX 781 ; N uni288C ; G 4080 +U 10381 ; WX 781 ; N uni288D ; G 4081 +U 10382 ; WX 781 ; N uni288E ; G 4082 +U 10383 ; WX 781 ; N uni288F ; G 4083 +U 10384 ; WX 781 ; N uni2890 ; G 4084 +U 10385 ; WX 781 ; N uni2891 ; G 4085 +U 10386 ; WX 781 ; N uni2892 ; G 4086 +U 10387 ; WX 781 ; N uni2893 ; G 4087 +U 10388 ; WX 781 ; N uni2894 ; G 4088 +U 10389 ; WX 781 ; N uni2895 ; G 4089 +U 10390 ; WX 781 ; N uni2896 ; G 4090 +U 10391 ; WX 781 ; N uni2897 ; G 4091 +U 10392 ; WX 781 ; N uni2898 ; G 4092 +U 10393 ; WX 781 ; N uni2899 ; G 4093 +U 10394 ; WX 781 ; N uni289A ; G 4094 +U 10395 ; WX 781 ; N uni289B ; G 4095 +U 10396 ; WX 781 ; N uni289C ; G 4096 +U 10397 ; WX 781 ; N uni289D ; G 4097 +U 10398 ; WX 781 ; N uni289E ; G 4098 +U 10399 ; WX 781 ; N uni289F ; G 4099 +U 10400 ; WX 781 ; N uni28A0 ; G 4100 +U 10401 ; WX 781 ; N uni28A1 ; G 4101 +U 10402 ; WX 781 ; N uni28A2 ; G 4102 +U 10403 ; WX 781 ; N uni28A3 ; G 4103 +U 10404 ; WX 781 ; N uni28A4 ; G 4104 +U 10405 ; WX 781 ; N uni28A5 ; G 4105 +U 10406 ; WX 781 ; N uni28A6 ; G 4106 +U 10407 ; WX 781 ; N uni28A7 ; G 4107 +U 10408 ; WX 781 ; N uni28A8 ; G 4108 +U 10409 ; WX 781 ; N uni28A9 ; G 4109 +U 10410 ; WX 781 ; N uni28AA ; G 4110 +U 10411 ; WX 781 ; N uni28AB ; G 4111 +U 10412 ; WX 781 ; N uni28AC ; G 4112 +U 10413 ; WX 781 ; N uni28AD ; G 4113 +U 10414 ; WX 781 ; N uni28AE ; G 4114 +U 10415 ; WX 781 ; N uni28AF ; G 4115 +U 10416 ; WX 781 ; N uni28B0 ; G 4116 +U 10417 ; WX 781 ; N uni28B1 ; G 4117 +U 10418 ; WX 781 ; N uni28B2 ; G 4118 +U 10419 ; WX 781 ; N uni28B3 ; G 4119 +U 10420 ; WX 781 ; N uni28B4 ; G 4120 +U 10421 ; WX 781 ; N uni28B5 ; G 4121 +U 10422 ; WX 781 ; N uni28B6 ; G 4122 +U 10423 ; WX 781 ; N uni28B7 ; G 4123 +U 10424 ; WX 781 ; N uni28B8 ; G 4124 +U 10425 ; WX 781 ; N uni28B9 ; G 4125 +U 10426 ; WX 781 ; N uni28BA ; G 4126 +U 10427 ; WX 781 ; N uni28BB ; G 4127 +U 10428 ; WX 781 ; N uni28BC ; G 4128 +U 10429 ; WX 781 ; N uni28BD ; G 4129 +U 10430 ; WX 781 ; N uni28BE ; G 4130 +U 10431 ; WX 781 ; N uni28BF ; G 4131 +U 10432 ; WX 781 ; N uni28C0 ; G 4132 +U 10433 ; WX 781 ; N uni28C1 ; G 4133 +U 10434 ; WX 781 ; N uni28C2 ; G 4134 +U 10435 ; WX 781 ; N uni28C3 ; G 4135 +U 10436 ; WX 781 ; N uni28C4 ; G 4136 +U 10437 ; WX 781 ; N uni28C5 ; G 4137 +U 10438 ; WX 781 ; N uni28C6 ; G 4138 +U 10439 ; WX 781 ; N uni28C7 ; G 4139 +U 10440 ; WX 781 ; N uni28C8 ; G 4140 +U 10441 ; WX 781 ; N uni28C9 ; G 4141 +U 10442 ; WX 781 ; N uni28CA ; G 4142 +U 10443 ; WX 781 ; N uni28CB ; G 4143 +U 10444 ; WX 781 ; N uni28CC ; G 4144 +U 10445 ; WX 781 ; N uni28CD ; G 4145 +U 10446 ; WX 781 ; N uni28CE ; G 4146 +U 10447 ; WX 781 ; N uni28CF ; G 4147 +U 10448 ; WX 781 ; N uni28D0 ; G 4148 +U 10449 ; WX 781 ; N uni28D1 ; G 4149 +U 10450 ; WX 781 ; N uni28D2 ; G 4150 +U 10451 ; WX 781 ; N uni28D3 ; G 4151 +U 10452 ; WX 781 ; N uni28D4 ; G 4152 +U 10453 ; WX 781 ; N uni28D5 ; G 4153 +U 10454 ; WX 781 ; N uni28D6 ; G 4154 +U 10455 ; WX 781 ; N uni28D7 ; G 4155 +U 10456 ; WX 781 ; N uni28D8 ; G 4156 +U 10457 ; WX 781 ; N uni28D9 ; G 4157 +U 10458 ; WX 781 ; N uni28DA ; G 4158 +U 10459 ; WX 781 ; N uni28DB ; G 4159 +U 10460 ; WX 781 ; N uni28DC ; G 4160 +U 10461 ; WX 781 ; N uni28DD ; G 4161 +U 10462 ; WX 781 ; N uni28DE ; G 4162 +U 10463 ; WX 781 ; N uni28DF ; G 4163 +U 10464 ; WX 781 ; N uni28E0 ; G 4164 +U 10465 ; WX 781 ; N uni28E1 ; G 4165 +U 10466 ; WX 781 ; N uni28E2 ; G 4166 +U 10467 ; WX 781 ; N uni28E3 ; G 4167 +U 10468 ; WX 781 ; N uni28E4 ; G 4168 +U 10469 ; WX 781 ; N uni28E5 ; G 4169 +U 10470 ; WX 781 ; N uni28E6 ; G 4170 +U 10471 ; WX 781 ; N uni28E7 ; G 4171 +U 10472 ; WX 781 ; N uni28E8 ; G 4172 +U 10473 ; WX 781 ; N uni28E9 ; G 4173 +U 10474 ; WX 781 ; N uni28EA ; G 4174 +U 10475 ; WX 781 ; N uni28EB ; G 4175 +U 10476 ; WX 781 ; N uni28EC ; G 4176 +U 10477 ; WX 781 ; N uni28ED ; G 4177 +U 10478 ; WX 781 ; N uni28EE ; G 4178 +U 10479 ; WX 781 ; N uni28EF ; G 4179 +U 10480 ; WX 781 ; N uni28F0 ; G 4180 +U 10481 ; WX 781 ; N uni28F1 ; G 4181 +U 10482 ; WX 781 ; N uni28F2 ; G 4182 +U 10483 ; WX 781 ; N uni28F3 ; G 4183 +U 10484 ; WX 781 ; N uni28F4 ; G 4184 +U 10485 ; WX 781 ; N uni28F5 ; G 4185 +U 10486 ; WX 781 ; N uni28F6 ; G 4186 +U 10487 ; WX 781 ; N uni28F7 ; G 4187 +U 10488 ; WX 781 ; N uni28F8 ; G 4188 +U 10489 ; WX 781 ; N uni28F9 ; G 4189 +U 10490 ; WX 781 ; N uni28FA ; G 4190 +U 10491 ; WX 781 ; N uni28FB ; G 4191 +U 10492 ; WX 781 ; N uni28FC ; G 4192 +U 10493 ; WX 781 ; N uni28FD ; G 4193 +U 10494 ; WX 781 ; N uni28FE ; G 4194 +U 10495 ; WX 781 ; N uni28FF ; G 4195 +U 10502 ; WX 838 ; N uni2906 ; G 4196 +U 10503 ; WX 838 ; N uni2907 ; G 4197 +U 10506 ; WX 838 ; N uni290A ; G 4198 +U 10507 ; WX 838 ; N uni290B ; G 4199 +U 10560 ; WX 838 ; N uni2940 ; G 4200 +U 10561 ; WX 838 ; N uni2941 ; G 4201 +U 10627 ; WX 753 ; N uni2983 ; G 4202 +U 10628 ; WX 753 ; N uni2984 ; G 4203 +U 10702 ; WX 838 ; N uni29CE ; G 4204 +U 10703 ; WX 1046 ; N uni29CF ; G 4205 +U 10704 ; WX 1046 ; N uni29D0 ; G 4206 +U 10705 ; WX 1000 ; N uni29D1 ; G 4207 +U 10706 ; WX 1000 ; N uni29D2 ; G 4208 +U 10707 ; WX 1000 ; N uni29D3 ; G 4209 +U 10708 ; WX 1000 ; N uni29D4 ; G 4210 +U 10709 ; WX 1000 ; N uni29D5 ; G 4211 +U 10731 ; WX 494 ; N uni29EB ; G 4212 +U 10746 ; WX 838 ; N uni29FA ; G 4213 +U 10747 ; WX 838 ; N uni29FB ; G 4214 +U 10752 ; WX 1000 ; N uni2A00 ; G 4215 +U 10753 ; WX 1000 ; N uni2A01 ; G 4216 +U 10754 ; WX 1000 ; N uni2A02 ; G 4217 +U 10764 ; WX 1661 ; N uni2A0C ; G 4218 +U 10765 ; WX 563 ; N uni2A0D ; G 4219 +U 10766 ; WX 563 ; N uni2A0E ; G 4220 +U 10767 ; WX 563 ; N uni2A0F ; G 4221 +U 10768 ; WX 563 ; N uni2A10 ; G 4222 +U 10769 ; WX 563 ; N uni2A11 ; G 4223 +U 10770 ; WX 563 ; N uni2A12 ; G 4224 +U 10771 ; WX 563 ; N uni2A13 ; G 4225 +U 10772 ; WX 563 ; N uni2A14 ; G 4226 +U 10773 ; WX 563 ; N uni2A15 ; G 4227 +U 10774 ; WX 563 ; N uni2A16 ; G 4228 +U 10775 ; WX 563 ; N uni2A17 ; G 4229 +U 10776 ; WX 563 ; N uni2A18 ; G 4230 +U 10777 ; WX 563 ; N uni2A19 ; G 4231 +U 10778 ; WX 563 ; N uni2A1A ; G 4232 +U 10779 ; WX 563 ; N uni2A1B ; G 4233 +U 10780 ; WX 563 ; N uni2A1C ; G 4234 +U 10799 ; WX 838 ; N uni2A2F ; G 4235 +U 10858 ; WX 838 ; N uni2A6A ; G 4236 +U 10859 ; WX 838 ; N uni2A6B ; G 4237 +U 10877 ; WX 838 ; N uni2A7D ; G 4238 +U 10878 ; WX 838 ; N uni2A7E ; G 4239 +U 10879 ; WX 838 ; N uni2A7F ; G 4240 +U 10880 ; WX 838 ; N uni2A80 ; G 4241 +U 10881 ; WX 838 ; N uni2A81 ; G 4242 +U 10882 ; WX 838 ; N uni2A82 ; G 4243 +U 10883 ; WX 838 ; N uni2A83 ; G 4244 +U 10884 ; WX 838 ; N uni2A84 ; G 4245 +U 10885 ; WX 838 ; N uni2A85 ; G 4246 +U 10886 ; WX 838 ; N uni2A86 ; G 4247 +U 10887 ; WX 838 ; N uni2A87 ; G 4248 +U 10888 ; WX 838 ; N uni2A88 ; G 4249 +U 10889 ; WX 838 ; N uni2A89 ; G 4250 +U 10890 ; WX 838 ; N uni2A8A ; G 4251 +U 10891 ; WX 838 ; N uni2A8B ; G 4252 +U 10892 ; WX 838 ; N uni2A8C ; G 4253 +U 10893 ; WX 838 ; N uni2A8D ; G 4254 +U 10894 ; WX 838 ; N uni2A8E ; G 4255 +U 10895 ; WX 838 ; N uni2A8F ; G 4256 +U 10896 ; WX 838 ; N uni2A90 ; G 4257 +U 10897 ; WX 838 ; N uni2A91 ; G 4258 +U 10898 ; WX 838 ; N uni2A92 ; G 4259 +U 10899 ; WX 838 ; N uni2A93 ; G 4260 +U 10900 ; WX 838 ; N uni2A94 ; G 4261 +U 10901 ; WX 838 ; N uni2A95 ; G 4262 +U 10902 ; WX 838 ; N uni2A96 ; G 4263 +U 10903 ; WX 838 ; N uni2A97 ; G 4264 +U 10904 ; WX 838 ; N uni2A98 ; G 4265 +U 10905 ; WX 838 ; N uni2A99 ; G 4266 +U 10906 ; WX 838 ; N uni2A9A ; G 4267 +U 10907 ; WX 838 ; N uni2A9B ; G 4268 +U 10908 ; WX 838 ; N uni2A9C ; G 4269 +U 10909 ; WX 838 ; N uni2A9D ; G 4270 +U 10910 ; WX 838 ; N uni2A9E ; G 4271 +U 10911 ; WX 838 ; N uni2A9F ; G 4272 +U 10912 ; WX 838 ; N uni2AA0 ; G 4273 +U 10926 ; WX 838 ; N uni2AAE ; G 4274 +U 10927 ; WX 838 ; N uni2AAF ; G 4275 +U 10928 ; WX 838 ; N uni2AB0 ; G 4276 +U 10929 ; WX 838 ; N uni2AB1 ; G 4277 +U 10930 ; WX 838 ; N uni2AB2 ; G 4278 +U 10931 ; WX 838 ; N uni2AB3 ; G 4279 +U 10932 ; WX 838 ; N uni2AB4 ; G 4280 +U 10933 ; WX 838 ; N uni2AB5 ; G 4281 +U 10934 ; WX 838 ; N uni2AB6 ; G 4282 +U 10935 ; WX 838 ; N uni2AB7 ; G 4283 +U 10936 ; WX 838 ; N uni2AB8 ; G 4284 +U 10937 ; WX 838 ; N uni2AB9 ; G 4285 +U 10938 ; WX 838 ; N uni2ABA ; G 4286 +U 11001 ; WX 838 ; N uni2AF9 ; G 4287 +U 11002 ; WX 838 ; N uni2AFA ; G 4288 +U 11008 ; WX 838 ; N uni2B00 ; G 4289 +U 11009 ; WX 838 ; N uni2B01 ; G 4290 +U 11010 ; WX 838 ; N uni2B02 ; G 4291 +U 11011 ; WX 838 ; N uni2B03 ; G 4292 +U 11012 ; WX 838 ; N uni2B04 ; G 4293 +U 11013 ; WX 838 ; N uni2B05 ; G 4294 +U 11014 ; WX 838 ; N uni2B06 ; G 4295 +U 11015 ; WX 838 ; N uni2B07 ; G 4296 +U 11016 ; WX 838 ; N uni2B08 ; G 4297 +U 11017 ; WX 838 ; N uni2B09 ; G 4298 +U 11018 ; WX 838 ; N uni2B0A ; G 4299 +U 11019 ; WX 838 ; N uni2B0B ; G 4300 +U 11020 ; WX 838 ; N uni2B0C ; G 4301 +U 11021 ; WX 838 ; N uni2B0D ; G 4302 +U 11022 ; WX 838 ; N uni2B0E ; G 4303 +U 11023 ; WX 838 ; N uni2B0F ; G 4304 +U 11024 ; WX 838 ; N uni2B10 ; G 4305 +U 11025 ; WX 838 ; N uni2B11 ; G 4306 +U 11026 ; WX 945 ; N uni2B12 ; G 4307 +U 11027 ; WX 945 ; N uni2B13 ; G 4308 +U 11028 ; WX 945 ; N uni2B14 ; G 4309 +U 11029 ; WX 945 ; N uni2B15 ; G 4310 +U 11030 ; WX 769 ; N uni2B16 ; G 4311 +U 11031 ; WX 769 ; N uni2B17 ; G 4312 +U 11032 ; WX 769 ; N uni2B18 ; G 4313 +U 11033 ; WX 769 ; N uni2B19 ; G 4314 +U 11034 ; WX 945 ; N uni2B1A ; G 4315 +U 11039 ; WX 869 ; N uni2B1F ; G 4316 +U 11040 ; WX 869 ; N uni2B20 ; G 4317 +U 11041 ; WX 873 ; N uni2B21 ; G 4318 +U 11042 ; WX 873 ; N uni2B22 ; G 4319 +U 11043 ; WX 873 ; N uni2B23 ; G 4320 +U 11044 ; WX 1119 ; N uni2B24 ; G 4321 +U 11091 ; WX 869 ; N uni2B53 ; G 4322 +U 11092 ; WX 869 ; N uni2B54 ; G 4323 +U 11360 ; WX 637 ; N uni2C60 ; G 4324 +U 11361 ; WX 360 ; N uni2C61 ; G 4325 +U 11362 ; WX 637 ; N uni2C62 ; G 4326 +U 11363 ; WX 733 ; N uni2C63 ; G 4327 +U 11364 ; WX 770 ; N uni2C64 ; G 4328 +U 11365 ; WX 675 ; N uni2C65 ; G 4329 +U 11366 ; WX 478 ; N uni2C66 ; G 4330 +U 11367 ; WX 956 ; N uni2C67 ; G 4331 +U 11368 ; WX 712 ; N uni2C68 ; G 4332 +U 11369 ; WX 775 ; N uni2C69 ; G 4333 +U 11370 ; WX 665 ; N uni2C6A ; G 4334 +U 11371 ; WX 725 ; N uni2C6B ; G 4335 +U 11372 ; WX 582 ; N uni2C6C ; G 4336 +U 11373 ; WX 860 ; N uni2C6D ; G 4337 +U 11374 ; WX 995 ; N uni2C6E ; G 4338 +U 11375 ; WX 774 ; N uni2C6F ; G 4339 +U 11376 ; WX 860 ; N uni2C70 ; G 4340 +U 11377 ; WX 778 ; N uni2C71 ; G 4341 +U 11378 ; WX 1221 ; N uni2C72 ; G 4342 +U 11379 ; WX 1056 ; N uni2C73 ; G 4343 +U 11380 ; WX 652 ; N uni2C74 ; G 4344 +U 11381 ; WX 698 ; N uni2C75 ; G 4345 +U 11382 ; WX 565 ; N uni2C76 ; G 4346 +U 11383 ; WX 782 ; N uni2C77 ; G 4347 +U 11385 ; WX 538 ; N uni2C79 ; G 4348 +U 11386 ; WX 687 ; N uni2C7A ; G 4349 +U 11387 ; WX 559 ; N uni2C7B ; G 4350 +U 11388 ; WX 219 ; N uni2C7C ; G 4351 +U 11389 ; WX 487 ; N uni2C7D ; G 4352 +U 11390 ; WX 720 ; N uni2C7E ; G 4353 +U 11391 ; WX 725 ; N uni2C7F ; G 4354 +U 11520 ; WX 663 ; N uni2D00 ; G 4355 +U 11521 ; WX 676 ; N uni2D01 ; G 4356 +U 11522 ; WX 661 ; N uni2D02 ; G 4357 +U 11523 ; WX 629 ; N uni2D03 ; G 4358 +U 11524 ; WX 661 ; N uni2D04 ; G 4359 +U 11525 ; WX 1032 ; N uni2D05 ; G 4360 +U 11526 ; WX 718 ; N uni2D06 ; G 4361 +U 11527 ; WX 1032 ; N uni2D07 ; G 4362 +U 11528 ; WX 648 ; N uni2D08 ; G 4363 +U 11529 ; WX 667 ; N uni2D09 ; G 4364 +U 11530 ; WX 1032 ; N uni2D0A ; G 4365 +U 11531 ; WX 673 ; N uni2D0B ; G 4366 +U 11532 ; WX 677 ; N uni2D0C ; G 4367 +U 11533 ; WX 1036 ; N uni2D0D ; G 4368 +U 11534 ; WX 680 ; N uni2D0E ; G 4369 +U 11535 ; WX 886 ; N uni2D0F ; G 4370 +U 11536 ; WX 1032 ; N uni2D10 ; G 4371 +U 11537 ; WX 683 ; N uni2D11 ; G 4372 +U 11538 ; WX 674 ; N uni2D12 ; G 4373 +U 11539 ; WX 1035 ; N uni2D13 ; G 4374 +U 11540 ; WX 1033 ; N uni2D14 ; G 4375 +U 11541 ; WX 1027 ; N uni2D15 ; G 4376 +U 11542 ; WX 676 ; N uni2D16 ; G 4377 +U 11543 ; WX 673 ; N uni2D17 ; G 4378 +U 11544 ; WX 667 ; N uni2D18 ; G 4379 +U 11545 ; WX 667 ; N uni2D19 ; G 4380 +U 11546 ; WX 660 ; N uni2D1A ; G 4381 +U 11547 ; WX 671 ; N uni2D1B ; G 4382 +U 11548 ; WX 1039 ; N uni2D1C ; G 4383 +U 11549 ; WX 673 ; N uni2D1D ; G 4384 +U 11550 ; WX 692 ; N uni2D1E ; G 4385 +U 11551 ; WX 659 ; N uni2D1F ; G 4386 +U 11552 ; WX 1048 ; N uni2D20 ; G 4387 +U 11553 ; WX 660 ; N uni2D21 ; G 4388 +U 11554 ; WX 654 ; N uni2D22 ; G 4389 +U 11555 ; WX 670 ; N uni2D23 ; G 4390 +U 11556 ; WX 733 ; N uni2D24 ; G 4391 +U 11557 ; WX 1017 ; N uni2D25 ; G 4392 +U 11800 ; WX 580 ; N uni2E18 ; G 4393 +U 11807 ; WX 838 ; N uni2E1F ; G 4394 +U 11810 ; WX 457 ; N uni2E22 ; G 4395 +U 11811 ; WX 457 ; N uni2E23 ; G 4396 +U 11812 ; WX 457 ; N uni2E24 ; G 4397 +U 11813 ; WX 457 ; N uni2E25 ; G 4398 +U 11822 ; WX 580 ; N uni2E2E ; G 4399 +U 19904 ; WX 896 ; N uni4DC0 ; G 4400 +U 19905 ; WX 896 ; N uni4DC1 ; G 4401 +U 19906 ; WX 896 ; N uni4DC2 ; G 4402 +U 19907 ; WX 896 ; N uni4DC3 ; G 4403 +U 19908 ; WX 896 ; N uni4DC4 ; G 4404 +U 19909 ; WX 896 ; N uni4DC5 ; G 4405 +U 19910 ; WX 896 ; N uni4DC6 ; G 4406 +U 19911 ; WX 896 ; N uni4DC7 ; G 4407 +U 19912 ; WX 896 ; N uni4DC8 ; G 4408 +U 19913 ; WX 896 ; N uni4DC9 ; G 4409 +U 19914 ; WX 896 ; N uni4DCA ; G 4410 +U 19915 ; WX 896 ; N uni4DCB ; G 4411 +U 19916 ; WX 896 ; N uni4DCC ; G 4412 +U 19917 ; WX 896 ; N uni4DCD ; G 4413 +U 19918 ; WX 896 ; N uni4DCE ; G 4414 +U 19919 ; WX 896 ; N uni4DCF ; G 4415 +U 19920 ; WX 896 ; N uni4DD0 ; G 4416 +U 19921 ; WX 896 ; N uni4DD1 ; G 4417 +U 19922 ; WX 896 ; N uni4DD2 ; G 4418 +U 19923 ; WX 896 ; N uni4DD3 ; G 4419 +U 19924 ; WX 896 ; N uni4DD4 ; G 4420 +U 19925 ; WX 896 ; N uni4DD5 ; G 4421 +U 19926 ; WX 896 ; N uni4DD6 ; G 4422 +U 19927 ; WX 896 ; N uni4DD7 ; G 4423 +U 19928 ; WX 896 ; N uni4DD8 ; G 4424 +U 19929 ; WX 896 ; N uni4DD9 ; G 4425 +U 19930 ; WX 896 ; N uni4DDA ; G 4426 +U 19931 ; WX 896 ; N uni4DDB ; G 4427 +U 19932 ; WX 896 ; N uni4DDC ; G 4428 +U 19933 ; WX 896 ; N uni4DDD ; G 4429 +U 19934 ; WX 896 ; N uni4DDE ; G 4430 +U 19935 ; WX 896 ; N uni4DDF ; G 4431 +U 19936 ; WX 896 ; N uni4DE0 ; G 4432 +U 19937 ; WX 896 ; N uni4DE1 ; G 4433 +U 19938 ; WX 896 ; N uni4DE2 ; G 4434 +U 19939 ; WX 896 ; N uni4DE3 ; G 4435 +U 19940 ; WX 896 ; N uni4DE4 ; G 4436 +U 19941 ; WX 896 ; N uni4DE5 ; G 4437 +U 19942 ; WX 896 ; N uni4DE6 ; G 4438 +U 19943 ; WX 896 ; N uni4DE7 ; G 4439 +U 19944 ; WX 896 ; N uni4DE8 ; G 4440 +U 19945 ; WX 896 ; N uni4DE9 ; G 4441 +U 19946 ; WX 896 ; N uni4DEA ; G 4442 +U 19947 ; WX 896 ; N uni4DEB ; G 4443 +U 19948 ; WX 896 ; N uni4DEC ; G 4444 +U 19949 ; WX 896 ; N uni4DED ; G 4445 +U 19950 ; WX 896 ; N uni4DEE ; G 4446 +U 19951 ; WX 896 ; N uni4DEF ; G 4447 +U 19952 ; WX 896 ; N uni4DF0 ; G 4448 +U 19953 ; WX 896 ; N uni4DF1 ; G 4449 +U 19954 ; WX 896 ; N uni4DF2 ; G 4450 +U 19955 ; WX 896 ; N uni4DF3 ; G 4451 +U 19956 ; WX 896 ; N uni4DF4 ; G 4452 +U 19957 ; WX 896 ; N uni4DF5 ; G 4453 +U 19958 ; WX 896 ; N uni4DF6 ; G 4454 +U 19959 ; WX 896 ; N uni4DF7 ; G 4455 +U 19960 ; WX 896 ; N uni4DF8 ; G 4456 +U 19961 ; WX 896 ; N uni4DF9 ; G 4457 +U 19962 ; WX 896 ; N uni4DFA ; G 4458 +U 19963 ; WX 896 ; N uni4DFB ; G 4459 +U 19964 ; WX 896 ; N uni4DFC ; G 4460 +U 19965 ; WX 896 ; N uni4DFD ; G 4461 +U 19966 ; WX 896 ; N uni4DFE ; G 4462 +U 19967 ; WX 896 ; N uni4DFF ; G 4463 +U 42192 ; WX 762 ; N uniA4D0 ; G 4464 +U 42193 ; WX 733 ; N uniA4D1 ; G 4465 +U 42194 ; WX 733 ; N uniA4D2 ; G 4466 +U 42195 ; WX 830 ; N uniA4D3 ; G 4467 +U 42196 ; WX 682 ; N uniA4D4 ; G 4468 +U 42197 ; WX 682 ; N uniA4D5 ; G 4469 +U 42198 ; WX 821 ; N uniA4D6 ; G 4470 +U 42199 ; WX 775 ; N uniA4D7 ; G 4471 +U 42200 ; WX 775 ; N uniA4D8 ; G 4472 +U 42201 ; WX 530 ; N uniA4D9 ; G 4473 +U 42202 ; WX 734 ; N uniA4DA ; G 4474 +U 42203 ; WX 734 ; N uniA4DB ; G 4475 +U 42204 ; WX 725 ; N uniA4DC ; G 4476 +U 42205 ; WX 683 ; N uniA4DD ; G 4477 +U 42206 ; WX 683 ; N uniA4DE ; G 4478 +U 42207 ; WX 995 ; N uniA4DF ; G 4479 +U 42208 ; WX 837 ; N uniA4E0 ; G 4480 +U 42209 ; WX 637 ; N uniA4E1 ; G 4481 +U 42210 ; WX 720 ; N uniA4E2 ; G 4482 +U 42211 ; WX 770 ; N uniA4E3 ; G 4483 +U 42212 ; WX 770 ; N uniA4E4 ; G 4484 +U 42213 ; WX 774 ; N uniA4E5 ; G 4485 +U 42214 ; WX 774 ; N uniA4E6 ; G 4486 +U 42215 ; WX 837 ; N uniA4E7 ; G 4487 +U 42216 ; WX 786 ; N uniA4E8 ; G 4488 +U 42217 ; WX 530 ; N uniA4E9 ; G 4489 +U 42218 ; WX 1103 ; N uniA4EA ; G 4490 +U 42219 ; WX 771 ; N uniA4EB ; G 4491 +U 42220 ; WX 724 ; N uniA4EC ; G 4492 +U 42221 ; WX 762 ; N uniA4ED ; G 4493 +U 42222 ; WX 774 ; N uniA4EE ; G 4494 +U 42223 ; WX 774 ; N uniA4EF ; G 4495 +U 42224 ; WX 683 ; N uniA4F0 ; G 4496 +U 42225 ; WX 683 ; N uniA4F1 ; G 4497 +U 42226 ; WX 372 ; N uniA4F2 ; G 4498 +U 42227 ; WX 850 ; N uniA4F3 ; G 4499 +U 42228 ; WX 812 ; N uniA4F4 ; G 4500 +U 42229 ; WX 812 ; N uniA4F5 ; G 4501 +U 42230 ; WX 576 ; N uniA4F6 ; G 4502 +U 42231 ; WX 830 ; N uniA4F7 ; G 4503 +U 42232 ; WX 322 ; N uniA4F8 ; G 4504 +U 42233 ; WX 322 ; N uniA4F9 ; G 4505 +U 42234 ; WX 674 ; N uniA4FA ; G 4506 +U 42235 ; WX 674 ; N uniA4FB ; G 4507 +U 42236 ; WX 322 ; N uniA4FC ; G 4508 +U 42237 ; WX 322 ; N uniA4FD ; G 4509 +U 42238 ; WX 588 ; N uniA4FE ; G 4510 +U 42239 ; WX 588 ; N uniA4FF ; G 4511 +U 42564 ; WX 720 ; N uniA644 ; G 4512 +U 42565 ; WX 595 ; N uniA645 ; G 4513 +U 42566 ; WX 436 ; N uniA646 ; G 4514 +U 42567 ; WX 440 ; N uniA647 ; G 4515 +U 42572 ; WX 1405 ; N uniA64C ; G 4516 +U 42573 ; WX 1173 ; N uniA64D ; G 4517 +U 42576 ; WX 1234 ; N uniA650 ; G 4518 +U 42577 ; WX 1027 ; N uniA651 ; G 4519 +U 42580 ; WX 1174 ; N uniA654 ; G 4520 +U 42581 ; WX 972 ; N uniA655 ; G 4521 +U 42582 ; WX 1100 ; N uniA656 ; G 4522 +U 42583 ; WX 969 ; N uniA657 ; G 4523 +U 42594 ; WX 1100 ; N uniA662 ; G 4524 +U 42595 ; WX 940 ; N uniA663 ; G 4525 +U 42596 ; WX 1096 ; N uniA664 ; G 4526 +U 42597 ; WX 915 ; N uniA665 ; G 4527 +U 42598 ; WX 1260 ; N uniA666 ; G 4528 +U 42599 ; WX 997 ; N uniA667 ; G 4529 +U 42600 ; WX 850 ; N uniA668 ; G 4530 +U 42601 ; WX 687 ; N uniA669 ; G 4531 +U 42602 ; WX 1037 ; N uniA66A ; G 4532 +U 42603 ; WX 868 ; N uniA66B ; G 4533 +U 42604 ; WX 1406 ; N uniA66C ; G 4534 +U 42605 ; WX 1106 ; N uniA66D ; G 4535 +U 42606 ; WX 961 ; N uniA66E ; G 4536 +U 42634 ; WX 944 ; N uniA68A ; G 4537 +U 42635 ; WX 749 ; N uniA68B ; G 4538 +U 42636 ; WX 682 ; N uniA68C ; G 4539 +U 42637 ; WX 580 ; N uniA68D ; G 4540 +U 42644 ; WX 808 ; N uniA694 ; G 4541 +U 42645 ; WX 712 ; N uniA695 ; G 4542 +U 42648 ; WX 1406 ; N uniA698 ; G 4543 +U 42649 ; WX 1106 ; N uniA699 ; G 4544 +U 42760 ; WX 500 ; N uniA708 ; G 4545 +U 42761 ; WX 500 ; N uniA709 ; G 4546 +U 42762 ; WX 500 ; N uniA70A ; G 4547 +U 42763 ; WX 500 ; N uniA70B ; G 4548 +U 42764 ; WX 500 ; N uniA70C ; G 4549 +U 42765 ; WX 500 ; N uniA70D ; G 4550 +U 42766 ; WX 500 ; N uniA70E ; G 4551 +U 42767 ; WX 500 ; N uniA70F ; G 4552 +U 42768 ; WX 500 ; N uniA710 ; G 4553 +U 42769 ; WX 500 ; N uniA711 ; G 4554 +U 42770 ; WX 500 ; N uniA712 ; G 4555 +U 42771 ; WX 500 ; N uniA713 ; G 4556 +U 42772 ; WX 500 ; N uniA714 ; G 4557 +U 42773 ; WX 500 ; N uniA715 ; G 4558 +U 42774 ; WX 500 ; N uniA716 ; G 4559 +U 42779 ; WX 400 ; N uniA71B ; G 4560 +U 42780 ; WX 400 ; N uniA71C ; G 4561 +U 42781 ; WX 287 ; N uniA71D ; G 4562 +U 42782 ; WX 287 ; N uniA71E ; G 4563 +U 42783 ; WX 287 ; N uniA71F ; G 4564 +U 42786 ; WX 444 ; N uniA722 ; G 4565 +U 42787 ; WX 390 ; N uniA723 ; G 4566 +U 42788 ; WX 540 ; N uniA724 ; G 4567 +U 42789 ; WX 540 ; N uniA725 ; G 4568 +U 42790 ; WX 837 ; N uniA726 ; G 4569 +U 42791 ; WX 712 ; N uniA727 ; G 4570 +U 42792 ; WX 1031 ; N uniA728 ; G 4571 +U 42793 ; WX 857 ; N uniA729 ; G 4572 +U 42794 ; WX 696 ; N uniA72A ; G 4573 +U 42795 ; WX 557 ; N uniA72B ; G 4574 +U 42800 ; WX 559 ; N uniA730 ; G 4575 +U 42801 ; WX 595 ; N uniA731 ; G 4576 +U 42802 ; WX 1349 ; N uniA732 ; G 4577 +U 42803 ; WX 1052 ; N uniA733 ; G 4578 +U 42804 ; WX 1285 ; N uniA734 ; G 4579 +U 42805 ; WX 1065 ; N uniA735 ; G 4580 +U 42806 ; WX 1245 ; N uniA736 ; G 4581 +U 42807 ; WX 1052 ; N uniA737 ; G 4582 +U 42808 ; WX 1079 ; N uniA738 ; G 4583 +U 42809 ; WX 922 ; N uniA739 ; G 4584 +U 42810 ; WX 1079 ; N uniA73A ; G 4585 +U 42811 ; WX 922 ; N uniA73B ; G 4586 +U 42812 ; WX 1035 ; N uniA73C ; G 4587 +U 42813 ; WX 922 ; N uniA73D ; G 4588 +U 42814 ; WX 698 ; N uniA73E ; G 4589 +U 42815 ; WX 549 ; N uniA73F ; G 4590 +U 42816 ; WX 656 ; N uniA740 ; G 4591 +U 42817 ; WX 579 ; N uniA741 ; G 4592 +U 42822 ; WX 850 ; N uniA746 ; G 4593 +U 42823 ; WX 542 ; N uniA747 ; G 4594 +U 42824 ; WX 683 ; N uniA748 ; G 4595 +U 42825 ; WX 531 ; N uniA749 ; G 4596 +U 42826 ; WX 918 ; N uniA74A ; G 4597 +U 42827 ; WX 814 ; N uniA74B ; G 4598 +U 42830 ; WX 1406 ; N uniA74E ; G 4599 +U 42831 ; WX 1106 ; N uniA74F ; G 4600 +U 42832 ; WX 733 ; N uniA750 ; G 4601 +U 42833 ; WX 716 ; N uniA751 ; G 4602 +U 42834 ; WX 948 ; N uniA752 ; G 4603 +U 42835 ; WX 937 ; N uniA753 ; G 4604 +U 42838 ; WX 850 ; N uniA756 ; G 4605 +U 42839 ; WX 716 ; N uniA757 ; G 4606 +U 42852 ; WX 738 ; N uniA764 ; G 4607 +U 42853 ; WX 716 ; N uniA765 ; G 4608 +U 42854 ; WX 738 ; N uniA766 ; G 4609 +U 42855 ; WX 716 ; N uniA767 ; G 4610 +U 42880 ; WX 637 ; N uniA780 ; G 4611 +U 42881 ; WX 343 ; N uniA781 ; G 4612 +U 42882 ; WX 837 ; N uniA782 ; G 4613 +U 42883 ; WX 712 ; N uniA783 ; G 4614 +U 42889 ; WX 400 ; N uniA789 ; G 4615 +U 42890 ; WX 396 ; N uniA78A ; G 4616 +U 42891 ; WX 456 ; N uniA78B ; G 4617 +U 42892 ; WX 306 ; N uniA78C ; G 4618 +U 42893 ; WX 808 ; N uniA78D ; G 4619 +U 42894 ; WX 693 ; N uniA78E ; G 4620 +U 42896 ; WX 928 ; N uniA790 ; G 4621 +U 42897 ; WX 768 ; N uniA791 ; G 4622 +U 42912 ; WX 821 ; N uniA7A0 ; G 4623 +U 42913 ; WX 716 ; N uniA7A1 ; G 4624 +U 42914 ; WX 775 ; N uniA7A2 ; G 4625 +U 42915 ; WX 665 ; N uniA7A3 ; G 4626 +U 42916 ; WX 837 ; N uniA7A4 ; G 4627 +U 42917 ; WX 712 ; N uniA7A5 ; G 4628 +U 42918 ; WX 770 ; N uniA7A6 ; G 4629 +U 42919 ; WX 493 ; N uniA7A7 ; G 4630 +U 42920 ; WX 720 ; N uniA7A8 ; G 4631 +U 42921 ; WX 595 ; N uniA7A9 ; G 4632 +U 42922 ; WX 886 ; N uniA7AA ; G 4633 +U 43000 ; WX 613 ; N uniA7F8 ; G 4634 +U 43001 ; WX 689 ; N uniA7F9 ; G 4635 +U 43002 ; WX 1062 ; N uniA7FA ; G 4636 +U 43003 ; WX 683 ; N uniA7FB ; G 4637 +U 43004 ; WX 733 ; N uniA7FC ; G 4638 +U 43005 ; WX 995 ; N uniA7FD ; G 4639 +U 43006 ; WX 372 ; N uniA7FE ; G 4640 +U 43007 ; WX 1325 ; N uniA7FF ; G 4641 +U 61184 ; WX 216 ; N uni02E5.5 ; G 4642 +U 61185 ; WX 242 ; N uni02E6.5 ; G 4643 +U 61186 ; WX 267 ; N uni02E7.5 ; G 4644 +U 61187 ; WX 277 ; N uni02E8.5 ; G 4645 +U 61188 ; WX 282 ; N uni02E9.5 ; G 4646 +U 61189 ; WX 242 ; N uni02E5.4 ; G 4647 +U 61190 ; WX 216 ; N uni02E6.4 ; G 4648 +U 61191 ; WX 242 ; N uni02E7.4 ; G 4649 +U 61192 ; WX 267 ; N uni02E8.4 ; G 4650 +U 61193 ; WX 277 ; N uni02E9.4 ; G 4651 +U 61194 ; WX 267 ; N uni02E5.3 ; G 4652 +U 61195 ; WX 242 ; N uni02E6.3 ; G 4653 +U 61196 ; WX 216 ; N uni02E7.3 ; G 4654 +U 61197 ; WX 242 ; N uni02E8.3 ; G 4655 +U 61198 ; WX 267 ; N uni02E9.3 ; G 4656 +U 61199 ; WX 277 ; N uni02E5.2 ; G 4657 +U 61200 ; WX 267 ; N uni02E6.2 ; G 4658 +U 61201 ; WX 242 ; N uni02E7.2 ; G 4659 +U 61202 ; WX 216 ; N uni02E8.2 ; G 4660 +U 61203 ; WX 242 ; N uni02E9.2 ; G 4661 +U 61204 ; WX 282 ; N uni02E5.1 ; G 4662 +U 61205 ; WX 277 ; N uni02E6.1 ; G 4663 +U 61206 ; WX 267 ; N uni02E7.1 ; G 4664 +U 61207 ; WX 242 ; N uni02E8.1 ; G 4665 +U 61208 ; WX 216 ; N uni02E9.1 ; G 4666 +U 61209 ; WX 282 ; N stem ; G 4667 +U 62464 ; WX 612 ; N uniF400 ; G 4668 +U 62465 ; WX 612 ; N uniF401 ; G 4669 +U 62466 ; WX 653 ; N uniF402 ; G 4670 +U 62467 ; WX 902 ; N uniF403 ; G 4671 +U 62468 ; WX 617 ; N uniF404 ; G 4672 +U 62469 ; WX 617 ; N uniF405 ; G 4673 +U 62470 ; WX 680 ; N uniF406 ; G 4674 +U 62471 ; WX 904 ; N uniF407 ; G 4675 +U 62472 ; WX 599 ; N uniF408 ; G 4676 +U 62473 ; WX 617 ; N uniF409 ; G 4677 +U 62474 ; WX 1163 ; N uniF40A ; G 4678 +U 62475 ; WX 621 ; N uniF40B ; G 4679 +U 62476 ; WX 622 ; N uniF40C ; G 4680 +U 62477 ; WX 893 ; N uniF40D ; G 4681 +U 62478 ; WX 612 ; N uniF40E ; G 4682 +U 62479 ; WX 622 ; N uniF40F ; G 4683 +U 62480 ; WX 924 ; N uniF410 ; G 4684 +U 62481 ; WX 622 ; N uniF411 ; G 4685 +U 62482 ; WX 754 ; N uniF412 ; G 4686 +U 62483 ; WX 624 ; N uniF413 ; G 4687 +U 62484 ; WX 886 ; N uniF414 ; G 4688 +U 62485 ; WX 622 ; N uniF415 ; G 4689 +U 62486 ; WX 907 ; N uniF416 ; G 4690 +U 62487 ; WX 621 ; N uniF417 ; G 4691 +U 62488 ; WX 611 ; N uniF418 ; G 4692 +U 62489 ; WX 624 ; N uniF419 ; G 4693 +U 62490 ; WX 677 ; N uniF41A ; G 4694 +U 62491 ; WX 621 ; N uniF41B ; G 4695 +U 62492 ; WX 611 ; N uniF41C ; G 4696 +U 62493 ; WX 630 ; N uniF41D ; G 4697 +U 62494 ; WX 622 ; N uniF41E ; G 4698 +U 62495 ; WX 561 ; N uniF41F ; G 4699 +U 62496 ; WX 612 ; N uniF420 ; G 4700 +U 62497 ; WX 626 ; N uniF421 ; G 4701 +U 62498 ; WX 612 ; N uniF422 ; G 4702 +U 62499 ; WX 611 ; N uniF423 ; G 4703 +U 62500 ; WX 618 ; N uniF424 ; G 4704 +U 62501 ; WX 667 ; N uniF425 ; G 4705 +U 62502 ; WX 963 ; N uniF426 ; G 4706 +U 62504 ; WX 1023 ; N uniF428 ; G 4707 +U 62505 ; WX 844 ; N uniF429 ; G 4708 +U 62506 ; WX 563 ; N uniF42A ; G 4709 +U 62507 ; WX 563 ; N uniF42B ; G 4710 +U 62508 ; WX 563 ; N uniF42C ; G 4711 +U 62509 ; WX 563 ; N uniF42D ; G 4712 +U 62510 ; WX 563 ; N uniF42E ; G 4713 +U 62511 ; WX 563 ; N uniF42F ; G 4714 +U 62512 ; WX 555 ; N uniF430 ; G 4715 +U 62513 ; WX 555 ; N uniF431 ; G 4716 +U 62514 ; WX 555 ; N uniF432 ; G 4717 +U 62515 ; WX 555 ; N uniF433 ; G 4718 +U 62516 ; WX 573 ; N uniF434 ; G 4719 +U 62517 ; WX 573 ; N uniF435 ; G 4720 +U 62518 ; WX 573 ; N uniF436 ; G 4721 +U 62519 ; WX 824 ; N uniF437 ; G 4722 +U 62520 ; WX 824 ; N uniF438 ; G 4723 +U 62521 ; WX 824 ; N uniF439 ; G 4724 +U 62522 ; WX 824 ; N uniF43A ; G 4725 +U 62523 ; WX 824 ; N uniF43B ; G 4726 +U 62524 ; WX 611 ; N uniF43C ; G 4727 +U 62525 ; WX 611 ; N uniF43D ; G 4728 +U 62526 ; WX 611 ; N uniF43E ; G 4729 +U 62527 ; WX 611 ; N uniF43F ; G 4730 +U 62528 ; WX 611 ; N uniF440 ; G 4731 +U 62529 ; WX 611 ; N uniF441 ; G 4732 +U 62917 ; WX 687 ; N uniF5C5 ; G 4733 +U 64256 ; WX 833 ; N uniFB00 ; G 4734 +U 64257 ; WX 787 ; N fi ; G 4735 +U 64258 ; WX 787 ; N fl ; G 4736 +U 64259 ; WX 1138 ; N uniFB03 ; G 4737 +U 64260 ; WX 1139 ; N uniFB04 ; G 4738 +U 64261 ; WX 808 ; N uniFB05 ; G 4739 +U 64262 ; WX 1020 ; N uniFB06 ; G 4740 +U 64275 ; WX 1388 ; N uniFB13 ; G 4741 +U 64276 ; WX 1384 ; N uniFB14 ; G 4742 +U 64277 ; WX 1378 ; N uniFB15 ; G 4743 +U 64278 ; WX 1384 ; N uniFB16 ; G 4744 +U 64279 ; WX 1713 ; N uniFB17 ; G 4745 +U 64285 ; WX 294 ; N uniFB1D ; G 4746 +U 64286 ; WX 0 ; N uniFB1E ; G 4747 +U 64287 ; WX 663 ; N uniFB1F ; G 4748 +U 64288 ; WX 665 ; N uniFB20 ; G 4749 +U 64289 ; WX 939 ; N uniFB21 ; G 4750 +U 64290 ; WX 788 ; N uniFB22 ; G 4751 +U 64291 ; WX 920 ; N uniFB23 ; G 4752 +U 64292 ; WX 786 ; N uniFB24 ; G 4753 +U 64293 ; WX 857 ; N uniFB25 ; G 4754 +U 64294 ; WX 869 ; N uniFB26 ; G 4755 +U 64295 ; WX 821 ; N uniFB27 ; G 4756 +U 64296 ; WX 890 ; N uniFB28 ; G 4757 +U 64297 ; WX 838 ; N uniFB29 ; G 4758 +U 64298 ; WX 749 ; N uniFB2A ; G 4759 +U 64299 ; WX 749 ; N uniFB2B ; G 4760 +U 64300 ; WX 749 ; N uniFB2C ; G 4761 +U 64301 ; WX 749 ; N uniFB2D ; G 4762 +U 64302 ; WX 728 ; N uniFB2E ; G 4763 +U 64303 ; WX 728 ; N uniFB2F ; G 4764 +U 64304 ; WX 728 ; N uniFB30 ; G 4765 +U 64305 ; WX 610 ; N uniFB31 ; G 4766 +U 64306 ; WX 447 ; N uniFB32 ; G 4767 +U 64307 ; WX 588 ; N uniFB33 ; G 4768 +U 64308 ; WX 687 ; N uniFB34 ; G 4769 +U 64309 ; WX 343 ; N uniFB35 ; G 4770 +U 64310 ; WX 400 ; N uniFB36 ; G 4771 +U 64311 ; WX 1000 ; N uniFB37 ; G 4772 +U 64312 ; WX 679 ; N uniFB38 ; G 4773 +U 64313 ; WX 436 ; N uniFB39 ; G 4774 +U 64314 ; WX 578 ; N uniFB3A ; G 4775 +U 64315 ; WX 566 ; N uniFB3B ; G 4776 +U 64316 ; WX 605 ; N uniFB3C ; G 4777 +U 64317 ; WX 1000 ; N uniFB3D ; G 4778 +U 64318 ; WX 724 ; N uniFB3E ; G 4779 +U 64319 ; WX 1000 ; N uniFB3F ; G 4780 +U 64320 ; WX 453 ; N uniFB40 ; G 4781 +U 64321 ; WX 680 ; N uniFB41 ; G 4782 +U 64322 ; WX 1000 ; N uniFB42 ; G 4783 +U 64323 ; WX 675 ; N uniFB43 ; G 4784 +U 64324 ; WX 658 ; N uniFB44 ; G 4785 +U 64325 ; WX 1000 ; N uniFB45 ; G 4786 +U 64326 ; WX 653 ; N uniFB46 ; G 4787 +U 64327 ; WX 736 ; N uniFB47 ; G 4788 +U 64328 ; WX 602 ; N uniFB48 ; G 4789 +U 64329 ; WX 749 ; N uniFB49 ; G 4790 +U 64330 ; WX 683 ; N uniFB4A ; G 4791 +U 64331 ; WX 343 ; N uniFB4B ; G 4792 +U 64332 ; WX 610 ; N uniFB4C ; G 4793 +U 64333 ; WX 566 ; N uniFB4D ; G 4794 +U 64334 ; WX 658 ; N uniFB4E ; G 4795 +U 64335 ; WX 710 ; N uniFB4F ; G 4796 +U 65024 ; WX 0 ; N uniFE00 ; G 4797 +U 65025 ; WX 0 ; N uniFE01 ; G 4798 +U 65026 ; WX 0 ; N uniFE02 ; G 4799 +U 65027 ; WX 0 ; N uniFE03 ; G 4800 +U 65028 ; WX 0 ; N uniFE04 ; G 4801 +U 65029 ; WX 0 ; N uniFE05 ; G 4802 +U 65030 ; WX 0 ; N uniFE06 ; G 4803 +U 65031 ; WX 0 ; N uniFE07 ; G 4804 +U 65032 ; WX 0 ; N uniFE08 ; G 4805 +U 65033 ; WX 0 ; N uniFE09 ; G 4806 +U 65034 ; WX 0 ; N uniFE0A ; G 4807 +U 65035 ; WX 0 ; N uniFE0B ; G 4808 +U 65036 ; WX 0 ; N uniFE0C ; G 4809 +U 65037 ; WX 0 ; N uniFE0D ; G 4810 +U 65038 ; WX 0 ; N uniFE0E ; G 4811 +U 65039 ; WX 0 ; N uniFE0F ; G 4812 +U 65056 ; WX 0 ; N uniFE20 ; G 4813 +U 65057 ; WX 0 ; N uniFE21 ; G 4814 +U 65058 ; WX 0 ; N uniFE22 ; G 4815 +U 65059 ; WX 0 ; N uniFE23 ; G 4816 +U 65529 ; WX 0 ; N uniFFF9 ; G 4817 +U 65530 ; WX 0 ; N uniFFFA ; G 4818 +U 65531 ; WX 0 ; N uniFFFB ; G 4819 +U 65532 ; WX 0 ; N uniFFFC ; G 4820 +U 65533 ; WX 1113 ; N uniFFFD ; G 4821 +EndCharMetrics +StartKernData +StartKernPairs 1921 + +KPX dollar ampersand -63 +KPX dollar two -63 +KPX dollar seven -196 +KPX dollar eight -92 +KPX dollar nine -139 +KPX dollar colon -112 +KPX dollar less -235 +KPX dollar F -63 +KPX dollar G -63 +KPX dollar W -112 +KPX dollar Y -112 +KPX dollar Z -92 +KPX dollar backslash -149 +KPX dollar copyright -63 +KPX dollar questiondown -149 +KPX dollar Aacute -149 +KPX dollar Egrave -63 +KPX dollar Eacute -63 +KPX dollar Ecircumflex -63 +KPX dollar Edieresis -63 +KPX dollar Igrave -63 +KPX dollar Iacute -63 +KPX dollar Icircumflex -63 +KPX dollar Idieresis -63 +KPX dollar Ntilde -63 +KPX dollar Oacute -63 +KPX dollar Dcaron -63 +KPX dollar Dcroat -63 +KPX dollar Emacron -63 +KPX dollar Ebreve -63 +KPX dollar Hcircumflex -196 +KPX dollar hcircumflex -112 +KPX dollar Hbar -196 +KPX dollar hbar -112 +KPX dollar Imacron -92 +KPX dollar Ibreve -92 +KPX dollar Iogonek -92 +KPX dollar Idot -92 +KPX dollar IJ -92 +KPX dollar Jcircumflex -92 +KPX dollar Kcommaaccent -112 +KPX dollar kcommaaccent -92 +KPX dollar kgreenlandic -235 +KPX dollar Lacute -149 +KPX dollar lacute -235 +KPX dollar uni01AC -63 +KPX dollar uni01AE -63 +KPX dollar uni01DC -196 +KPX dollar uni01DD -112 +KPX dollar uni01F0 -63 +KPX dollar uni01F4 -235 +KPX dollar uni01F5 -149 + +KPX percent nine -83 +KPX percent colon -112 +KPX percent less -112 +KPX percent Kcommaaccent -112 +KPX percent kgreenlandic -112 +KPX percent lacute -112 +KPX percent uni01F4 -112 + +KPX ampersand six -73 +KPX ampersand Gcircumflex -73 +KPX ampersand Gbreve -73 +KPX ampersand Gdotaccent -73 +KPX ampersand Gcommaaccent -73 +KPX ampersand uni01DA -73 + +KPX quotesingle less -159 +KPX quotesingle kgreenlandic -159 +KPX quotesingle lacute -159 +KPX quotesingle uni01F4 -159 + +KPX parenright dollar -264 +KPX parenright D -235 +KPX parenright H -159 +KPX parenright R -159 +KPX parenright U -225 +KPX parenright X -196 +KPX parenright backslash -188 +KPX parenright cent -235 +KPX parenright sterling -235 +KPX parenright currency -235 +KPX parenright yen -235 +KPX parenright brokenbar -235 +KPX parenright section -235 +KPX parenright dieresis -235 +KPX parenright ordfeminine -159 +KPX parenright guillemotleft -159 +KPX parenright logicalnot -159 +KPX parenright sfthyphen -159 +KPX parenright acute -159 +KPX parenright mu -159 +KPX parenright paragraph -159 +KPX parenright periodcentered -159 +KPX parenright cedilla -159 +KPX parenright ordmasculine -159 +KPX parenright guillemotright -196 +KPX parenright onequarter -196 +KPX parenright onehalf -196 +KPX parenright threequarters -196 +KPX parenright questiondown -188 +KPX parenright Aacute -188 +KPX parenright Acircumflex -264 +KPX parenright Atilde -235 +KPX parenright Adieresis -264 +KPX parenright Aring -235 +KPX parenright AE -264 +KPX parenright Ccedilla -235 +KPX parenright Otilde -159 +KPX parenright multiply -159 +KPX parenright Ugrave -159 +KPX parenright Ucircumflex -159 +KPX parenright Yacute -159 +KPX parenright dcaron -159 +KPX parenright dmacron -159 +KPX parenright emacron -159 +KPX parenright ebreve -159 +KPX parenright edotaccent -225 +KPX parenright eogonek -225 +KPX parenright ecaron -225 +KPX parenright imacron -196 +KPX parenright ibreve -196 +KPX parenright iogonek -196 +KPX parenright dotlessi -196 +KPX parenright ij -196 +KPX parenright jcircumflex -196 +KPX parenright Lacute -188 +KPX parenright uni01A5 -235 +KPX parenright uni01AD -159 +KPX parenright Uhorn -159 +KPX parenright uni01F1 -159 +KPX parenright uni01F5 -188 + +KPX asterisk seven -36 +KPX asterisk less -83 +KPX asterisk Hbar -36 +KPX asterisk lacute -83 + +KPX period ampersand -131 +KPX period two -131 +KPX period eight -73 +KPX period colon -55 +KPX period H -112 +KPX period R -112 +KPX period X -112 +KPX period backslash -206 +KPX period ordfeminine -112 +KPX period guillemotleft -112 +KPX period logicalnot -112 +KPX period sfthyphen -112 +KPX period acute -112 +KPX period mu -112 +KPX period paragraph -112 +KPX period periodcentered -112 +KPX period cedilla -112 +KPX period ordmasculine -112 +KPX period guillemotright -112 +KPX period onequarter -112 +KPX period onehalf -112 +KPX period threequarters -112 +KPX period questiondown -206 +KPX period Aacute -206 +KPX period Egrave -131 +KPX period Icircumflex -131 +KPX period Yacute -112 +KPX period Ebreve -178 +KPX period ebreve -112 +KPX period Idot -73 +KPX period dotlessi -112 + +KPX slash two -73 +KPX slash seven -339 +KPX slash eight -112 +KPX slash nine -282 +KPX slash colon -178 +KPX slash less -319 +KPX slash backslash -253 +KPX slash questiondown -253 +KPX slash Aacute -253 +KPX slash Ebreve -73 +KPX slash Hbar -339 +KPX slash Idot -112 +KPX slash lacute -319 + +KPX two nine -73 +KPX two semicolon -73 +KPX two less -149 +KPX two lacute -149 + +KPX three dollar -188 +KPX three D -131 +KPX three H -55 +KPX three U -63 +KPX three V -73 +KPX three X -73 +KPX three cent -131 +KPX three sterling -131 +KPX three currency -131 +KPX three yen -131 +KPX three brokenbar -131 +KPX three section -131 +KPX three dieresis -131 +KPX three ordfeminine -55 +KPX three guillemotleft -55 +KPX three logicalnot -55 +KPX three sfthyphen -55 +KPX three guillemotright -73 +KPX three onequarter -73 +KPX three onehalf -73 +KPX three threequarters -73 +KPX three Yacute -55 +KPX three edotaccent -63 +KPX three ecaron -63 +KPX three gdotaccent -73 +KPX three gcommaaccent -73 +KPX three dotlessi -73 + + +KPX five seven -92 +KPX five less -188 +KPX five H -102 +KPX five R -102 +KPX five X -112 +KPX five backslash -131 +KPX five ordfeminine -102 +KPX five guillemotleft -102 +KPX five logicalnot -102 +KPX five sfthyphen -102 +KPX five acute -102 +KPX five mu -102 +KPX five paragraph -102 +KPX five periodcentered -102 +KPX five cedilla -102 +KPX five ordmasculine -102 +KPX five guillemotright -112 +KPX five onequarter -112 +KPX five onehalf -112 +KPX five threequarters -112 +KPX five questiondown -131 +KPX five Aacute -131 +KPX five Yacute -102 +KPX five ebreve -102 +KPX five Hbar -92 +KPX five dotlessi -112 +KPX five lacute -188 + +KPX six six -73 +KPX six Gdotaccent -73 +KPX six Gcommaaccent -73 + +KPX seven dollar -159 +KPX seven seven 47 +KPX seven D -243 +KPX seven F -264 +KPX seven H -264 +KPX seven R -264 +KPX seven U -225 +KPX seven V -243 +KPX seven X -264 +KPX seven Z -282 +KPX seven backslash -339 +KPX seven cent -243 +KPX seven sterling -243 +KPX seven currency -243 +KPX seven yen -243 +KPX seven brokenbar -243 +KPX seven section -243 +KPX seven dieresis -243 +KPX seven copyright -264 +KPX seven ordfeminine -264 +KPX seven guillemotleft -264 +KPX seven logicalnot -264 +KPX seven sfthyphen -264 +KPX seven acute -264 +KPX seven mu -264 +KPX seven paragraph -264 +KPX seven periodcentered -264 +KPX seven cedilla -264 +KPX seven ordmasculine -264 +KPX seven guillemotright -264 +KPX seven onequarter -264 +KPX seven onehalf -264 +KPX seven threequarters -264 +KPX seven questiondown -339 +KPX seven Aacute -339 +KPX seven Eacute -264 +KPX seven Idieresis -264 +KPX seven Yacute -264 +KPX seven ebreve -264 +KPX seven edotaccent -225 +KPX seven ecaron -225 +KPX seven gdotaccent -243 +KPX seven gcommaaccent -243 +KPX seven Hbar 47 +KPX seven dotlessi -264 + +KPX eight dollar -92 + +KPX nine dollar -139 +KPX nine two -36 +KPX nine D -159 +KPX nine H -149 +KPX nine L -36 +KPX nine R -149 +KPX nine X -149 +KPX nine cent -159 +KPX nine sterling -159 +KPX nine currency -159 +KPX nine yen -159 +KPX nine brokenbar -159 +KPX nine section -159 +KPX nine dieresis -159 +KPX nine ordfeminine -149 +KPX nine guillemotleft -149 +KPX nine logicalnot -149 +KPX nine sfthyphen -149 +KPX nine acute -149 +KPX nine mu -149 +KPX nine paragraph -149 +KPX nine periodcentered -149 +KPX nine cedilla -149 +KPX nine ordmasculine -149 +KPX nine guillemotright -149 +KPX nine onequarter -149 +KPX nine onehalf -149 +KPX nine threequarters -149 +KPX nine Yacute -149 +KPX nine Ebreve -45 +KPX nine ebreve -149 +KPX nine dotlessi -149 + +KPX colon dollar -73 +KPX colon D -139 +KPX colon H -131 +KPX colon R -112 +KPX colon U -120 +KPX colon cent -139 +KPX colon sterling -139 +KPX colon currency -139 +KPX colon yen -139 +KPX colon brokenbar -139 +KPX colon section -139 +KPX colon dieresis -139 +KPX colon ordfeminine -131 +KPX colon guillemotleft -131 +KPX colon logicalnot -131 +KPX colon sfthyphen -131 +KPX colon acute -112 +KPX colon mu -112 +KPX colon paragraph -112 +KPX colon periodcentered -112 +KPX colon cedilla -112 +KPX colon ordmasculine -112 +KPX colon Yacute -131 +KPX colon ebreve -112 +KPX colon edotaccent -120 +KPX colon ecaron -120 + +KPX semicolon ampersand -73 +KPX semicolon two -73 +KPX semicolon H -131 +KPX semicolon ordfeminine -131 +KPX semicolon guillemotleft -131 +KPX semicolon logicalnot -131 +KPX semicolon sfthyphen -131 +KPX semicolon Egrave -73 +KPX semicolon Icircumflex -73 +KPX semicolon Yacute -131 +KPX semicolon Ebreve -112 + +KPX less dollar -196 +KPX less ampersand -73 +KPX less two -73 +KPX less D -243 +KPX less H -264 +KPX less R -264 +KPX less X -225 +KPX less cent -243 +KPX less sterling -243 +KPX less currency -243 +KPX less yen -243 +KPX less brokenbar -243 +KPX less section -243 +KPX less dieresis -243 +KPX less ordfeminine -264 +KPX less guillemotleft -264 +KPX less logicalnot -264 +KPX less sfthyphen -264 +KPX less acute -264 +KPX less mu -264 +KPX less paragraph -264 +KPX less periodcentered -264 +KPX less cedilla -264 +KPX less ordmasculine -264 +KPX less guillemotright -225 +KPX less onequarter -225 +KPX less onehalf -225 +KPX less threequarters -225 +KPX less Egrave -73 +KPX less Icircumflex -73 +KPX less Yacute -264 +KPX less Ebreve -120 +KPX less ebreve -264 +KPX less dotlessi -225 + + +KPX D backslash -63 +KPX D questiondown -63 +KPX D Aacute -63 + + +KPX N H -73 +KPX N R -73 +KPX N ordfeminine -73 +KPX N guillemotleft -73 +KPX N logicalnot -73 +KPX N sfthyphen -73 +KPX N acute -73 +KPX N mu -73 +KPX N paragraph -73 +KPX N periodcentered -73 +KPX N cedilla -73 +KPX N ordmasculine -45 +KPX N Yacute -73 +KPX N ebreve -73 + + + + + +KPX cent backslash -63 +KPX cent questiondown -63 +KPX cent Aacute -63 + +KPX sterling backslash -63 +KPX sterling questiondown -63 +KPX sterling Aacute -63 + +KPX currency backslash -63 +KPX currency questiondown -63 +KPX currency Aacute -63 + +KPX yen backslash -63 +KPX yen questiondown -63 +KPX yen Aacute -63 + +KPX brokenbar backslash -63 +KPX brokenbar questiondown -63 +KPX brokenbar Aacute -63 + +KPX section backslash -63 +KPX section questiondown -63 +KPX section Aacute -63 + + + +KPX Acircumflex ampersand -63 +KPX Acircumflex two -63 +KPX Acircumflex seven -196 +KPX Acircumflex eight -92 +KPX Acircumflex nine -139 +KPX Acircumflex colon -112 +KPX Acircumflex less -235 +KPX Acircumflex F -63 +KPX Acircumflex G -63 +KPX Acircumflex W -112 +KPX Acircumflex Y -112 +KPX Acircumflex Z -92 +KPX Acircumflex backslash -149 +KPX Acircumflex copyright -63 +KPX Acircumflex questiondown -149 +KPX Acircumflex Aacute -149 +KPX Acircumflex Egrave -63 +KPX Acircumflex Eacute -63 +KPX Acircumflex Ecircumflex -63 +KPX Acircumflex Edieresis -63 +KPX Acircumflex Igrave -63 +KPX Acircumflex Iacute -63 +KPX Acircumflex Icircumflex -63 +KPX Acircumflex Idieresis -63 +KPX Acircumflex Ntilde -63 +KPX Acircumflex Oacute -63 +KPX Acircumflex Dcaron -63 +KPX Acircumflex Dcroat -63 +KPX Acircumflex Emacron -63 +KPX Acircumflex Ebreve -63 +KPX Acircumflex Hcircumflex -196 +KPX Acircumflex hcircumflex -112 +KPX Acircumflex Hbar -196 +KPX Acircumflex hbar -112 +KPX Acircumflex Imacron -92 +KPX Acircumflex Ibreve -92 +KPX Acircumflex Iogonek -92 +KPX Acircumflex Idot -92 +KPX Acircumflex IJ -92 +KPX Acircumflex Jcircumflex -92 +KPX Acircumflex Kcommaaccent -112 +KPX Acircumflex kcommaaccent -92 +KPX Acircumflex kgreenlandic -235 +KPX Acircumflex Lacute -149 +KPX Acircumflex lacute -235 +KPX Acircumflex uni01AC -63 +KPX Acircumflex uni01AE -63 +KPX Acircumflex uni01DC -196 +KPX Acircumflex uni01DD -112 +KPX Acircumflex uni01F0 -63 +KPX Acircumflex uni01F4 -235 +KPX Acircumflex uni01F5 -149 + +KPX Adieresis ampersand -63 +KPX Adieresis two -63 +KPX Adieresis seven -196 +KPX Adieresis eight -92 +KPX Adieresis nine -139 +KPX Adieresis colon -112 +KPX Adieresis less -235 +KPX Adieresis F -63 +KPX Adieresis G -63 +KPX Adieresis W -112 +KPX Adieresis Y -112 +KPX Adieresis Z -92 +KPX Adieresis backslash -149 +KPX Adieresis copyright -63 +KPX Adieresis questiondown -149 +KPX Adieresis Aacute -149 +KPX Adieresis Egrave -63 +KPX Adieresis Eacute -63 +KPX Adieresis Ecircumflex -63 +KPX Adieresis Edieresis -63 +KPX Adieresis Igrave -63 +KPX Adieresis Iacute -63 +KPX Adieresis Icircumflex -63 +KPX Adieresis Idieresis -63 +KPX Adieresis Ntilde -63 +KPX Adieresis Oacute -63 +KPX Adieresis Dcaron -63 +KPX Adieresis Dcroat -63 +KPX Adieresis Emacron -63 +KPX Adieresis Ebreve -63 +KPX Adieresis Hcircumflex -196 +KPX Adieresis hcircumflex -112 +KPX Adieresis Hbar -196 +KPX Adieresis hbar -112 +KPX Adieresis Imacron -92 +KPX Adieresis Ibreve -92 +KPX Adieresis Iogonek -92 +KPX Adieresis Idot -92 +KPX Adieresis IJ -92 +KPX Adieresis Jcircumflex -92 +KPX Adieresis Kcommaaccent -112 +KPX Adieresis kcommaaccent -92 +KPX Adieresis kgreenlandic -235 +KPX Adieresis Lacute -149 +KPX Adieresis lacute -235 +KPX Adieresis uni01AC -63 +KPX Adieresis uni01AE -63 +KPX Adieresis uni01DC -196 +KPX Adieresis uni01DD -112 +KPX Adieresis uni01F0 -63 +KPX Adieresis uni01F4 -235 +KPX Adieresis uni01F5 -149 + +KPX AE ampersand -63 +KPX AE two -63 +KPX AE seven -196 +KPX AE eight -92 +KPX AE nine -139 +KPX AE colon -112 +KPX AE less -235 +KPX AE F -63 +KPX AE G -63 +KPX AE W -112 +KPX AE Y -112 +KPX AE Z -92 +KPX AE backslash -149 +KPX AE copyright -63 +KPX AE questiondown -149 +KPX AE Aacute -149 +KPX AE Egrave -63 +KPX AE Eacute -63 +KPX AE Ecircumflex -63 +KPX AE Edieresis -63 +KPX AE Igrave -63 +KPX AE Iacute -63 +KPX AE Icircumflex -63 +KPX AE Idieresis -63 +KPX AE Ntilde -63 +KPX AE Oacute -63 +KPX AE Dcaron -63 +KPX AE Dcroat -63 +KPX AE Emacron -63 +KPX AE Ebreve -63 +KPX AE Hcircumflex -196 +KPX AE hcircumflex -112 +KPX AE Hbar -196 +KPX AE hbar -112 +KPX AE Imacron -92 +KPX AE Ibreve -92 +KPX AE Iogonek -92 +KPX AE Idot -92 +KPX AE IJ -92 +KPX AE Jcircumflex -92 +KPX AE Kcommaaccent -112 +KPX AE kcommaaccent -92 +KPX AE kgreenlandic -235 +KPX AE Lacute -149 +KPX AE lacute -235 +KPX AE uni01AC -63 +KPX AE uni01AE -63 +KPX AE uni01DC -196 +KPX AE uni01DD -112 +KPX AE uni01F0 -63 +KPX AE uni01F4 -235 +KPX AE uni01F5 -149 + +KPX Egrave six -73 +KPX Egrave Gcircumflex -73 +KPX Egrave Gbreve -73 +KPX Egrave Gdotaccent -73 +KPX Egrave Gcommaaccent -73 +KPX Egrave uni01DA -73 + +KPX Ecircumflex six -73 +KPX Ecircumflex Gcircumflex -73 +KPX Ecircumflex Gbreve -73 +KPX Ecircumflex Gdotaccent -73 +KPX Ecircumflex Gcommaaccent -73 +KPX Ecircumflex uni01DA -73 + +KPX Igrave six -73 +KPX Igrave Gcircumflex -73 +KPX Igrave Gbreve -73 +KPX Igrave Gdotaccent -73 +KPX Igrave Gcommaaccent -73 +KPX Igrave uni01DA -73 + +KPX Icircumflex six -73 +KPX Icircumflex Gcircumflex -73 +KPX Icircumflex Gbreve -73 +KPX Icircumflex Gdotaccent -73 +KPX Icircumflex Gcommaaccent -73 +KPX Icircumflex uni01DA -73 + +KPX Eth less -159 +KPX Eth kgreenlandic -159 +KPX Eth lacute -159 +KPX Eth uni01F4 -159 + +KPX Ograve less -159 +KPX Ograve kgreenlandic -159 +KPX Ograve lacute -159 +KPX Ograve uni01F4 -159 + +KPX agrave seven -36 +KPX agrave less -83 +KPX agrave Hbar -36 +KPX agrave lacute -83 + +KPX ucircumflex two -73 +KPX ucircumflex seven -339 +KPX ucircumflex eight -112 +KPX ucircumflex nine -282 +KPX ucircumflex colon -178 +KPX ucircumflex less -319 +KPX ucircumflex backslash -253 +KPX ucircumflex questiondown -253 +KPX ucircumflex Aacute -253 +KPX ucircumflex Ebreve -73 +KPX ucircumflex Hbar -339 +KPX ucircumflex Idot -112 +KPX ucircumflex lacute -319 + +KPX ydieresis two -73 +KPX ydieresis seven -339 +KPX ydieresis eight -112 +KPX ydieresis nine -282 +KPX ydieresis colon -178 +KPX ydieresis less -319 +KPX ydieresis backslash -253 +KPX ydieresis questiondown -253 +KPX ydieresis Aacute -253 +KPX ydieresis Ebreve -73 +KPX ydieresis Hbar -339 +KPX ydieresis Idot -112 +KPX ydieresis lacute -319 + +KPX Abreve O -8 + +KPX abreve two -73 +KPX abreve seven -339 +KPX abreve eight -73 +KPX abreve nine -282 +KPX abreve colon -159 +KPX abreve less -319 +KPX abreve backslash -253 +KPX abreve questiondown -253 +KPX abreve Aacute -253 +KPX abreve Ebreve -73 +KPX abreve Hbar -339 +KPX abreve Idot -73 +KPX abreve lacute -319 + +KPX Edotaccent seven -92 +KPX Edotaccent less -188 +KPX Edotaccent H -102 +KPX Edotaccent R -102 +KPX Edotaccent X -112 +KPX Edotaccent backslash -131 +KPX Edotaccent ordfeminine -102 +KPX Edotaccent guillemotleft -102 +KPX Edotaccent logicalnot -102 +KPX Edotaccent sfthyphen -102 +KPX Edotaccent acute -102 +KPX Edotaccent mu -102 +KPX Edotaccent paragraph -102 +KPX Edotaccent periodcentered -102 +KPX Edotaccent cedilla -102 +KPX Edotaccent ordmasculine -102 +KPX Edotaccent guillemotright -112 +KPX Edotaccent onequarter -112 +KPX Edotaccent onehalf -112 +KPX Edotaccent threequarters -112 +KPX Edotaccent questiondown -131 +KPX Edotaccent Aacute -131 +KPX Edotaccent Yacute -102 +KPX Edotaccent ebreve -102 +KPX Edotaccent Hbar -92 +KPX Edotaccent dotlessi -112 +KPX Edotaccent lacute -188 + + +KPX Ecaron seven -92 +KPX Ecaron less -188 +KPX Ecaron H -102 +KPX Ecaron R -102 +KPX Ecaron X -112 +KPX Ecaron backslash -131 +KPX Ecaron ordfeminine -102 +KPX Ecaron guillemotleft -102 +KPX Ecaron logicalnot -102 +KPX Ecaron sfthyphen -102 +KPX Ecaron acute -102 +KPX Ecaron mu -102 +KPX Ecaron paragraph -102 +KPX Ecaron periodcentered -102 +KPX Ecaron cedilla -102 +KPX Ecaron ordmasculine -102 +KPX Ecaron guillemotright -112 +KPX Ecaron onequarter -112 +KPX Ecaron onehalf -112 +KPX Ecaron threequarters -112 +KPX Ecaron questiondown -131 +KPX Ecaron Aacute -131 +KPX Ecaron Yacute -102 +KPX Ecaron ebreve -102 +KPX Ecaron Hbar -92 +KPX Ecaron dotlessi -112 +KPX Ecaron lacute -188 + + +KPX Gdotaccent six -73 +KPX Gdotaccent Gdotaccent -73 +KPX Gdotaccent Gcommaaccent -73 + +KPX Gcommaaccent six -73 +KPX Gcommaaccent Gdotaccent -73 +KPX Gcommaaccent Gcommaaccent -73 + +KPX Hbar dollar -159 +KPX Hbar seven 47 +KPX Hbar D -243 +KPX Hbar F -264 +KPX Hbar H -264 +KPX Hbar R -264 +KPX Hbar U -225 +KPX Hbar V -243 +KPX Hbar X -264 +KPX Hbar Z -282 +KPX Hbar backslash -339 +KPX Hbar cent -243 +KPX Hbar sterling -243 +KPX Hbar currency -243 +KPX Hbar yen -243 +KPX Hbar brokenbar -243 +KPX Hbar section -243 +KPX Hbar dieresis -243 +KPX Hbar copyright -264 +KPX Hbar ordfeminine -264 +KPX Hbar guillemotleft -264 +KPX Hbar logicalnot -264 +KPX Hbar sfthyphen -264 +KPX Hbar acute -264 +KPX Hbar mu -264 +KPX Hbar paragraph -264 +KPX Hbar periodcentered -264 +KPX Hbar cedilla -264 +KPX Hbar ordmasculine -264 +KPX Hbar guillemotright -264 +KPX Hbar onequarter -264 +KPX Hbar onehalf -264 +KPX Hbar threequarters -264 +KPX Hbar questiondown -339 +KPX Hbar Aacute -339 +KPX Hbar Eacute -264 +KPX Hbar Idieresis -264 +KPX Hbar Yacute -264 +KPX Hbar ebreve -264 +KPX Hbar edotaccent -225 +KPX Hbar ecaron -225 +KPX Hbar gdotaccent -243 +KPX Hbar gcommaaccent -243 +KPX Hbar Hbar 47 +KPX Hbar dotlessi -264 + +KPX hbar Hbar -112 + +KPX Idot dollar -92 +KPX Idot Idot -92 + +KPX lacute dollar -196 +KPX lacute ampersand -73 +KPX lacute two -73 +KPX lacute D -243 +KPX lacute H -264 +KPX lacute R -264 +KPX lacute X -225 +KPX lacute cent -243 +KPX lacute sterling -243 +KPX lacute currency -243 +KPX lacute yen -243 +KPX lacute brokenbar -243 +KPX lacute section -243 +KPX lacute dieresis -243 +KPX lacute ordfeminine -264 +KPX lacute guillemotleft -264 +KPX lacute logicalnot -264 +KPX lacute sfthyphen -264 +KPX lacute acute -264 +KPX lacute mu -264 +KPX lacute paragraph -264 +KPX lacute periodcentered -264 +KPX lacute cedilla -264 +KPX lacute ordmasculine -264 +KPX lacute guillemotright -225 +KPX lacute onequarter -225 +KPX lacute onehalf -225 +KPX lacute threequarters -225 +KPX lacute Egrave -73 +KPX lacute Icircumflex -73 +KPX lacute Yacute -264 +KPX lacute Ebreve -120 +KPX lacute ebreve -264 +KPX lacute dotlessi -225 + + +KPX uni027D dollar -272 +KPX uni027D hyphen -92 +KPX uni027D nine 38 +KPX uni027D less 75 +KPX uni027D lacute 75 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Oblique.ttf b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Oblique.ttf new file mode 100644 index 0000000..999bac7 Binary files /dev/null and b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Oblique.ttf differ diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Oblique.ufm b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Oblique.ufm new file mode 100644 index 0000000..0b8d60e --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans-Oblique.ufm @@ -0,0 +1,5268 @@ +StartFontMetrics 4.1 +Notice Converted by PHP-font-lib +Comment https://github.com/PhenX/php-font-lib +EncodingScheme FontSpecific +FontName DejaVu Sans +FontSubfamily Oblique +UniqueID DejaVu Sans Oblique +FullName DejaVu Sans Oblique +Version Version 2.37 +PostScriptName DejaVuSans-Oblique +Manufacturer DejaVu fonts team +FontVendorURL http://dejavu.sourceforge.net +LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License +PreferredFamily DejaVu Sans +PreferredSubfamily Oblique +Weight Medium +ItalicAngle -11 +IsFixedPitch false +UnderlineThickness 44 +UnderlinePosition -63 +FontHeightOffset 0 +Ascender 928 +Descender -236 +FontBBox -1016 -350 1659 1068 +StartCharMetrics 5355 +U 32 ; WX 318 ; N space ; G 3 +U 33 ; WX 401 ; N exclam ; G 4 +U 34 ; WX 460 ; N quotedbl ; G 5 +U 35 ; WX 838 ; N numbersign ; G 6 +U 36 ; WX 636 ; N dollar ; G 7 +U 37 ; WX 950 ; N percent ; G 8 +U 38 ; WX 780 ; N ampersand ; G 9 +U 39 ; WX 275 ; N quotesingle ; G 10 +U 40 ; WX 390 ; N parenleft ; G 11 +U 41 ; WX 390 ; N parenright ; G 12 +U 42 ; WX 500 ; N asterisk ; G 13 +U 43 ; WX 838 ; N plus ; G 14 +U 44 ; WX 318 ; N comma ; G 15 +U 45 ; WX 361 ; N hyphen ; G 16 +U 46 ; WX 318 ; N period ; G 17 +U 47 ; WX 337 ; N slash ; G 18 +U 48 ; WX 636 ; N zero ; G 19 +U 49 ; WX 636 ; N one ; G 20 +U 50 ; WX 636 ; N two ; G 21 +U 51 ; WX 636 ; N three ; G 22 +U 52 ; WX 636 ; N four ; G 23 +U 53 ; WX 636 ; N five ; G 24 +U 54 ; WX 636 ; N six ; G 25 +U 55 ; WX 636 ; N seven ; G 26 +U 56 ; WX 636 ; N eight ; G 27 +U 57 ; WX 636 ; N nine ; G 28 +U 58 ; WX 337 ; N colon ; G 29 +U 59 ; WX 337 ; N semicolon ; G 30 +U 60 ; WX 838 ; N less ; G 31 +U 61 ; WX 838 ; N equal ; G 32 +U 62 ; WX 838 ; N greater ; G 33 +U 63 ; WX 531 ; N question ; G 34 +U 64 ; WX 1000 ; N at ; G 35 +U 65 ; WX 684 ; N A ; G 36 +U 66 ; WX 686 ; N B ; G 37 +U 67 ; WX 698 ; N C ; G 38 +U 68 ; WX 770 ; N D ; G 39 +U 69 ; WX 632 ; N E ; G 40 +U 70 ; WX 575 ; N F ; G 41 +U 71 ; WX 775 ; N G ; G 42 +U 72 ; WX 752 ; N H ; G 43 +U 73 ; WX 295 ; N I ; G 44 +U 74 ; WX 295 ; N J ; G 45 +U 75 ; WX 656 ; N K ; G 46 +U 76 ; WX 557 ; N L ; G 47 +U 77 ; WX 863 ; N M ; G 48 +U 78 ; WX 748 ; N N ; G 49 +U 79 ; WX 787 ; N O ; G 50 +U 80 ; WX 603 ; N P ; G 51 +U 81 ; WX 787 ; N Q ; G 52 +U 82 ; WX 695 ; N R ; G 53 +U 83 ; WX 635 ; N S ; G 54 +U 84 ; WX 611 ; N T ; G 55 +U 85 ; WX 732 ; N U ; G 56 +U 86 ; WX 684 ; N V ; G 57 +U 87 ; WX 989 ; N W ; G 58 +U 88 ; WX 685 ; N X ; G 59 +U 89 ; WX 611 ; N Y ; G 60 +U 90 ; WX 685 ; N Z ; G 61 +U 91 ; WX 390 ; N bracketleft ; G 62 +U 92 ; WX 337 ; N backslash ; G 63 +U 93 ; WX 390 ; N bracketright ; G 64 +U 94 ; WX 838 ; N asciicircum ; G 65 +U 95 ; WX 500 ; N underscore ; G 66 +U 96 ; WX 500 ; N grave ; G 67 +U 97 ; WX 613 ; N a ; G 68 +U 98 ; WX 635 ; N b ; G 69 +U 99 ; WX 550 ; N c ; G 70 +U 100 ; WX 635 ; N d ; G 71 +U 101 ; WX 615 ; N e ; G 72 +U 102 ; WX 352 ; N f ; G 73 +U 103 ; WX 635 ; N g ; G 74 +U 104 ; WX 634 ; N h ; G 75 +U 105 ; WX 278 ; N i ; G 76 +U 106 ; WX 278 ; N j ; G 77 +U 107 ; WX 579 ; N k ; G 78 +U 108 ; WX 278 ; N l ; G 79 +U 109 ; WX 974 ; N m ; G 80 +U 110 ; WX 634 ; N n ; G 81 +U 111 ; WX 612 ; N o ; G 82 +U 112 ; WX 635 ; N p ; G 83 +U 113 ; WX 635 ; N q ; G 84 +U 114 ; WX 411 ; N r ; G 85 +U 115 ; WX 521 ; N s ; G 86 +U 116 ; WX 392 ; N t ; G 87 +U 117 ; WX 634 ; N u ; G 88 +U 118 ; WX 592 ; N v ; G 89 +U 119 ; WX 818 ; N w ; G 90 +U 120 ; WX 592 ; N x ; G 91 +U 121 ; WX 592 ; N y ; G 92 +U 122 ; WX 525 ; N z ; G 93 +U 123 ; WX 636 ; N braceleft ; G 94 +U 124 ; WX 337 ; N bar ; G 95 +U 125 ; WX 636 ; N braceright ; G 96 +U 126 ; WX 838 ; N asciitilde ; G 97 +U 160 ; WX 318 ; N nbspace ; G 98 +U 161 ; WX 401 ; N exclamdown ; G 99 +U 162 ; WX 636 ; N cent ; G 100 +U 163 ; WX 636 ; N sterling ; G 101 +U 164 ; WX 636 ; N currency ; G 102 +U 165 ; WX 636 ; N yen ; G 103 +U 166 ; WX 337 ; N brokenbar ; G 104 +U 167 ; WX 500 ; N section ; G 105 +U 168 ; WX 500 ; N dieresis ; G 106 +U 169 ; WX 1000 ; N copyright ; G 107 +U 170 ; WX 471 ; N ordfeminine ; G 108 +U 171 ; WX 617 ; N guillemotleft ; G 109 +U 172 ; WX 838 ; N logicalnot ; G 110 +U 173 ; WX 361 ; N sfthyphen ; G 111 +U 174 ; WX 1000 ; N registered ; G 112 +U 175 ; WX 500 ; N macron ; G 113 +U 176 ; WX 500 ; N degree ; G 114 +U 177 ; WX 838 ; N plusminus ; G 115 +U 178 ; WX 401 ; N twosuperior ; G 116 +U 179 ; WX 401 ; N threesuperior ; G 117 +U 180 ; WX 500 ; N acute ; G 118 +U 181 ; WX 636 ; N mu ; G 119 +U 182 ; WX 636 ; N paragraph ; G 120 +U 183 ; WX 318 ; N periodcentered ; G 121 +U 184 ; WX 500 ; N cedilla ; G 122 +U 185 ; WX 401 ; N onesuperior ; G 123 +U 186 ; WX 471 ; N ordmasculine ; G 124 +U 187 ; WX 617 ; N guillemotright ; G 125 +U 188 ; WX 969 ; N onequarter ; G 126 +U 189 ; WX 969 ; N onehalf ; G 127 +U 190 ; WX 969 ; N threequarters ; G 128 +U 191 ; WX 531 ; N questiondown ; G 129 +U 192 ; WX 684 ; N Agrave ; G 130 +U 193 ; WX 684 ; N Aacute ; G 131 +U 194 ; WX 684 ; N Acircumflex ; G 132 +U 195 ; WX 684 ; N Atilde ; G 133 +U 196 ; WX 684 ; N Adieresis ; G 134 +U 197 ; WX 684 ; N Aring ; G 135 +U 198 ; WX 974 ; N AE ; G 136 +U 199 ; WX 698 ; N Ccedilla ; G 137 +U 200 ; WX 632 ; N Egrave ; G 138 +U 201 ; WX 632 ; N Eacute ; G 139 +U 202 ; WX 632 ; N Ecircumflex ; G 140 +U 203 ; WX 632 ; N Edieresis ; G 141 +U 204 ; WX 295 ; N Igrave ; G 142 +U 205 ; WX 295 ; N Iacute ; G 143 +U 206 ; WX 295 ; N Icircumflex ; G 144 +U 207 ; WX 295 ; N Idieresis ; G 145 +U 208 ; WX 775 ; N Eth ; G 146 +U 209 ; WX 748 ; N Ntilde ; G 147 +U 210 ; WX 787 ; N Ograve ; G 148 +U 211 ; WX 787 ; N Oacute ; G 149 +U 212 ; WX 787 ; N Ocircumflex ; G 150 +U 213 ; WX 787 ; N Otilde ; G 151 +U 214 ; WX 787 ; N Odieresis ; G 152 +U 215 ; WX 838 ; N multiply ; G 153 +U 216 ; WX 787 ; N Oslash ; G 154 +U 217 ; WX 732 ; N Ugrave ; G 155 +U 218 ; WX 732 ; N Uacute ; G 156 +U 219 ; WX 732 ; N Ucircumflex ; G 157 +U 220 ; WX 732 ; N Udieresis ; G 158 +U 221 ; WX 611 ; N Yacute ; G 159 +U 222 ; WX 608 ; N Thorn ; G 160 +U 223 ; WX 630 ; N germandbls ; G 161 +U 224 ; WX 613 ; N agrave ; G 162 +U 225 ; WX 613 ; N aacute ; G 163 +U 226 ; WX 613 ; N acircumflex ; G 164 +U 227 ; WX 613 ; N atilde ; G 165 +U 228 ; WX 613 ; N adieresis ; G 166 +U 229 ; WX 613 ; N aring ; G 167 +U 230 ; WX 995 ; N ae ; G 168 +U 231 ; WX 550 ; N ccedilla ; G 169 +U 232 ; WX 615 ; N egrave ; G 170 +U 233 ; WX 615 ; N eacute ; G 171 +U 234 ; WX 615 ; N ecircumflex ; G 172 +U 235 ; WX 615 ; N edieresis ; G 173 +U 236 ; WX 278 ; N igrave ; G 174 +U 237 ; WX 278 ; N iacute ; G 175 +U 238 ; WX 278 ; N icircumflex ; G 176 +U 239 ; WX 278 ; N idieresis ; G 177 +U 240 ; WX 612 ; N eth ; G 178 +U 241 ; WX 634 ; N ntilde ; G 179 +U 242 ; WX 612 ; N ograve ; G 180 +U 243 ; WX 612 ; N oacute ; G 181 +U 244 ; WX 612 ; N ocircumflex ; G 182 +U 245 ; WX 612 ; N otilde ; G 183 +U 246 ; WX 612 ; N odieresis ; G 184 +U 247 ; WX 838 ; N divide ; G 185 +U 248 ; WX 612 ; N oslash ; G 186 +U 249 ; WX 634 ; N ugrave ; G 187 +U 250 ; WX 634 ; N uacute ; G 188 +U 251 ; WX 634 ; N ucircumflex ; G 189 +U 252 ; WX 634 ; N udieresis ; G 190 +U 253 ; WX 592 ; N yacute ; G 191 +U 254 ; WX 635 ; N thorn ; G 192 +U 255 ; WX 592 ; N ydieresis ; G 193 +U 256 ; WX 684 ; N Amacron ; G 194 +U 257 ; WX 613 ; N amacron ; G 195 +U 258 ; WX 684 ; N Abreve ; G 196 +U 259 ; WX 613 ; N abreve ; G 197 +U 260 ; WX 684 ; N Aogonek ; G 198 +U 261 ; WX 613 ; N aogonek ; G 199 +U 262 ; WX 698 ; N Cacute ; G 200 +U 263 ; WX 550 ; N cacute ; G 201 +U 264 ; WX 698 ; N Ccircumflex ; G 202 +U 265 ; WX 550 ; N ccircumflex ; G 203 +U 266 ; WX 698 ; N Cdotaccent ; G 204 +U 267 ; WX 550 ; N cdotaccent ; G 205 +U 268 ; WX 698 ; N Ccaron ; G 206 +U 269 ; WX 550 ; N ccaron ; G 207 +U 270 ; WX 770 ; N Dcaron ; G 208 +U 271 ; WX 635 ; N dcaron ; G 209 +U 272 ; WX 775 ; N Dcroat ; G 210 +U 273 ; WX 635 ; N dmacron ; G 211 +U 274 ; WX 632 ; N Emacron ; G 212 +U 275 ; WX 615 ; N emacron ; G 213 +U 276 ; WX 632 ; N Ebreve ; G 214 +U 277 ; WX 615 ; N ebreve ; G 215 +U 278 ; WX 632 ; N Edotaccent ; G 216 +U 279 ; WX 615 ; N edotaccent ; G 217 +U 280 ; WX 632 ; N Eogonek ; G 218 +U 281 ; WX 615 ; N eogonek ; G 219 +U 282 ; WX 632 ; N Ecaron ; G 220 +U 283 ; WX 615 ; N ecaron ; G 221 +U 284 ; WX 775 ; N Gcircumflex ; G 222 +U 285 ; WX 635 ; N gcircumflex ; G 223 +U 286 ; WX 775 ; N Gbreve ; G 224 +U 287 ; WX 635 ; N gbreve ; G 225 +U 288 ; WX 775 ; N Gdotaccent ; G 226 +U 289 ; WX 635 ; N gdotaccent ; G 227 +U 290 ; WX 775 ; N Gcommaaccent ; G 228 +U 291 ; WX 635 ; N gcommaaccent ; G 229 +U 292 ; WX 752 ; N Hcircumflex ; G 230 +U 293 ; WX 634 ; N hcircumflex ; G 231 +U 294 ; WX 916 ; N Hbar ; G 232 +U 295 ; WX 695 ; N hbar ; G 233 +U 296 ; WX 295 ; N Itilde ; G 234 +U 297 ; WX 278 ; N itilde ; G 235 +U 298 ; WX 295 ; N Imacron ; G 236 +U 299 ; WX 278 ; N imacron ; G 237 +U 300 ; WX 295 ; N Ibreve ; G 238 +U 301 ; WX 278 ; N ibreve ; G 239 +U 302 ; WX 295 ; N Iogonek ; G 240 +U 303 ; WX 278 ; N iogonek ; G 241 +U 304 ; WX 295 ; N Idot ; G 242 +U 305 ; WX 278 ; N dotlessi ; G 243 +U 306 ; WX 590 ; N IJ ; G 244 +U 307 ; WX 556 ; N ij ; G 245 +U 308 ; WX 295 ; N Jcircumflex ; G 246 +U 309 ; WX 278 ; N jcircumflex ; G 247 +U 310 ; WX 656 ; N Kcommaaccent ; G 248 +U 311 ; WX 579 ; N kcommaaccent ; G 249 +U 312 ; WX 579 ; N kgreenlandic ; G 250 +U 313 ; WX 557 ; N Lacute ; G 251 +U 314 ; WX 278 ; N lacute ; G 252 +U 315 ; WX 557 ; N Lcommaaccent ; G 253 +U 316 ; WX 278 ; N lcommaaccent ; G 254 +U 317 ; WX 557 ; N Lcaron ; G 255 +U 318 ; WX 278 ; N lcaron ; G 256 +U 319 ; WX 557 ; N Ldot ; G 257 +U 320 ; WX 278 ; N ldot ; G 258 +U 321 ; WX 562 ; N Lslash ; G 259 +U 322 ; WX 287 ; N lslash ; G 260 +U 323 ; WX 748 ; N Nacute ; G 261 +U 324 ; WX 634 ; N nacute ; G 262 +U 325 ; WX 748 ; N Ncommaaccent ; G 263 +U 326 ; WX 634 ; N ncommaaccent ; G 264 +U 327 ; WX 748 ; N Ncaron ; G 265 +U 328 ; WX 634 ; N ncaron ; G 266 +U 329 ; WX 813 ; N napostrophe ; G 267 +U 330 ; WX 748 ; N Eng ; G 268 +U 331 ; WX 634 ; N eng ; G 269 +U 332 ; WX 787 ; N Omacron ; G 270 +U 333 ; WX 612 ; N omacron ; G 271 +U 334 ; WX 787 ; N Obreve ; G 272 +U 335 ; WX 612 ; N obreve ; G 273 +U 336 ; WX 787 ; N Ohungarumlaut ; G 274 +U 337 ; WX 612 ; N ohungarumlaut ; G 275 +U 338 ; WX 1070 ; N OE ; G 276 +U 339 ; WX 1028 ; N oe ; G 277 +U 340 ; WX 695 ; N Racute ; G 278 +U 341 ; WX 411 ; N racute ; G 279 +U 342 ; WX 695 ; N Rcommaaccent ; G 280 +U 343 ; WX 411 ; N rcommaaccent ; G 281 +U 344 ; WX 695 ; N Rcaron ; G 282 +U 345 ; WX 411 ; N rcaron ; G 283 +U 346 ; WX 635 ; N Sacute ; G 284 +U 347 ; WX 521 ; N sacute ; G 285 +U 348 ; WX 635 ; N Scircumflex ; G 286 +U 349 ; WX 521 ; N scircumflex ; G 287 +U 350 ; WX 635 ; N Scedilla ; G 288 +U 351 ; WX 521 ; N scedilla ; G 289 +U 352 ; WX 635 ; N Scaron ; G 290 +U 353 ; WX 521 ; N scaron ; G 291 +U 354 ; WX 611 ; N Tcommaaccent ; G 292 +U 355 ; WX 392 ; N tcommaaccent ; G 293 +U 356 ; WX 611 ; N Tcaron ; G 294 +U 357 ; WX 392 ; N tcaron ; G 295 +U 358 ; WX 611 ; N Tbar ; G 296 +U 359 ; WX 392 ; N tbar ; G 297 +U 360 ; WX 732 ; N Utilde ; G 298 +U 361 ; WX 634 ; N utilde ; G 299 +U 362 ; WX 732 ; N Umacron ; G 300 +U 363 ; WX 634 ; N umacron ; G 301 +U 364 ; WX 732 ; N Ubreve ; G 302 +U 365 ; WX 634 ; N ubreve ; G 303 +U 366 ; WX 732 ; N Uring ; G 304 +U 367 ; WX 634 ; N uring ; G 305 +U 368 ; WX 732 ; N Uhungarumlaut ; G 306 +U 369 ; WX 634 ; N uhungarumlaut ; G 307 +U 370 ; WX 732 ; N Uogonek ; G 308 +U 371 ; WX 634 ; N uogonek ; G 309 +U 372 ; WX 989 ; N Wcircumflex ; G 310 +U 373 ; WX 818 ; N wcircumflex ; G 311 +U 374 ; WX 611 ; N Ycircumflex ; G 312 +U 375 ; WX 592 ; N ycircumflex ; G 313 +U 376 ; WX 611 ; N Ydieresis ; G 314 +U 377 ; WX 685 ; N Zacute ; G 315 +U 378 ; WX 525 ; N zacute ; G 316 +U 379 ; WX 685 ; N Zdotaccent ; G 317 +U 380 ; WX 525 ; N zdotaccent ; G 318 +U 381 ; WX 685 ; N Zcaron ; G 319 +U 382 ; WX 525 ; N zcaron ; G 320 +U 383 ; WX 352 ; N longs ; G 321 +U 384 ; WX 635 ; N uni0180 ; G 322 +U 385 ; WX 735 ; N uni0181 ; G 323 +U 386 ; WX 686 ; N uni0182 ; G 324 +U 387 ; WX 635 ; N uni0183 ; G 325 +U 388 ; WX 686 ; N uni0184 ; G 326 +U 389 ; WX 635 ; N uni0185 ; G 327 +U 390 ; WX 703 ; N uni0186 ; G 328 +U 391 ; WX 698 ; N uni0187 ; G 329 +U 392 ; WX 550 ; N uni0188 ; G 330 +U 393 ; WX 775 ; N uni0189 ; G 331 +U 394 ; WX 819 ; N uni018A ; G 332 +U 395 ; WX 686 ; N uni018B ; G 333 +U 396 ; WX 635 ; N uni018C ; G 334 +U 397 ; WX 612 ; N uni018D ; G 335 +U 398 ; WX 632 ; N uni018E ; G 336 +U 399 ; WX 787 ; N uni018F ; G 337 +U 400 ; WX 614 ; N uni0190 ; G 338 +U 401 ; WX 575 ; N uni0191 ; G 339 +U 402 ; WX 352 ; N florin ; G 340 +U 403 ; WX 775 ; N uni0193 ; G 341 +U 404 ; WX 687 ; N uni0194 ; G 342 +U 405 ; WX 984 ; N uni0195 ; G 343 +U 406 ; WX 354 ; N uni0196 ; G 344 +U 407 ; WX 295 ; N uni0197 ; G 345 +U 408 ; WX 746 ; N uni0198 ; G 346 +U 409 ; WX 579 ; N uni0199 ; G 347 +U 410 ; WX 278 ; N uni019A ; G 348 +U 411 ; WX 592 ; N uni019B ; G 349 +U 412 ; WX 974 ; N uni019C ; G 350 +U 413 ; WX 748 ; N uni019D ; G 351 +U 414 ; WX 634 ; N uni019E ; G 352 +U 415 ; WX 787 ; N uni019F ; G 353 +U 416 ; WX 913 ; N Ohorn ; G 354 +U 417 ; WX 612 ; N ohorn ; G 355 +U 418 ; WX 938 ; N uni01A2 ; G 356 +U 419 ; WX 737 ; N uni01A3 ; G 357 +U 420 ; WX 652 ; N uni01A4 ; G 358 +U 421 ; WX 635 ; N uni01A5 ; G 359 +U 422 ; WX 695 ; N uni01A6 ; G 360 +U 423 ; WX 635 ; N uni01A7 ; G 361 +U 424 ; WX 521 ; N uni01A8 ; G 362 +U 425 ; WX 632 ; N uni01A9 ; G 363 +U 426 ; WX 336 ; N uni01AA ; G 364 +U 427 ; WX 392 ; N uni01AB ; G 365 +U 428 ; WX 611 ; N uni01AC ; G 366 +U 429 ; WX 392 ; N uni01AD ; G 367 +U 430 ; WX 611 ; N uni01AE ; G 368 +U 431 ; WX 838 ; N Uhorn ; G 369 +U 432 ; WX 634 ; N uhorn ; G 370 +U 433 ; WX 764 ; N uni01B1 ; G 371 +U 434 ; WX 721 ; N uni01B2 ; G 372 +U 435 ; WX 744 ; N uni01B3 ; G 373 +U 436 ; WX 730 ; N uni01B4 ; G 374 +U 437 ; WX 685 ; N uni01B5 ; G 375 +U 438 ; WX 525 ; N uni01B6 ; G 376 +U 439 ; WX 666 ; N uni01B7 ; G 377 +U 440 ; WX 666 ; N uni01B8 ; G 378 +U 441 ; WX 578 ; N uni01B9 ; G 379 +U 442 ; WX 525 ; N uni01BA ; G 380 +U 443 ; WX 636 ; N uni01BB ; G 381 +U 444 ; WX 666 ; N uni01BC ; G 382 +U 445 ; WX 578 ; N uni01BD ; G 383 +U 446 ; WX 510 ; N uni01BE ; G 384 +U 447 ; WX 635 ; N uni01BF ; G 385 +U 448 ; WX 295 ; N uni01C0 ; G 386 +U 449 ; WX 492 ; N uni01C1 ; G 387 +U 450 ; WX 459 ; N uni01C2 ; G 388 +U 451 ; WX 295 ; N uni01C3 ; G 389 +U 452 ; WX 1455 ; N uni01C4 ; G 390 +U 453 ; WX 1295 ; N uni01C5 ; G 391 +U 454 ; WX 1160 ; N uni01C6 ; G 392 +U 455 ; WX 852 ; N uni01C7 ; G 393 +U 456 ; WX 835 ; N uni01C8 ; G 394 +U 457 ; WX 556 ; N uni01C9 ; G 395 +U 458 ; WX 1043 ; N uni01CA ; G 396 +U 459 ; WX 1026 ; N uni01CB ; G 397 +U 460 ; WX 912 ; N uni01CC ; G 398 +U 461 ; WX 684 ; N uni01CD ; G 399 +U 462 ; WX 613 ; N uni01CE ; G 400 +U 463 ; WX 295 ; N uni01CF ; G 401 +U 464 ; WX 278 ; N uni01D0 ; G 402 +U 465 ; WX 787 ; N uni01D1 ; G 403 +U 466 ; WX 612 ; N uni01D2 ; G 404 +U 467 ; WX 732 ; N uni01D3 ; G 405 +U 468 ; WX 634 ; N uni01D4 ; G 406 +U 469 ; WX 732 ; N uni01D5 ; G 407 +U 470 ; WX 634 ; N uni01D6 ; G 408 +U 471 ; WX 732 ; N uni01D7 ; G 409 +U 472 ; WX 634 ; N uni01D8 ; G 410 +U 473 ; WX 732 ; N uni01D9 ; G 411 +U 474 ; WX 634 ; N uni01DA ; G 412 +U 475 ; WX 732 ; N uni01DB ; G 413 +U 476 ; WX 634 ; N uni01DC ; G 414 +U 477 ; WX 615 ; N uni01DD ; G 415 +U 478 ; WX 684 ; N uni01DE ; G 416 +U 479 ; WX 613 ; N uni01DF ; G 417 +U 480 ; WX 684 ; N uni01E0 ; G 418 +U 481 ; WX 613 ; N uni01E1 ; G 419 +U 482 ; WX 974 ; N uni01E2 ; G 420 +U 483 ; WX 995 ; N uni01E3 ; G 421 +U 484 ; WX 775 ; N uni01E4 ; G 422 +U 485 ; WX 635 ; N uni01E5 ; G 423 +U 486 ; WX 775 ; N Gcaron ; G 424 +U 487 ; WX 635 ; N gcaron ; G 425 +U 488 ; WX 656 ; N uni01E8 ; G 426 +U 489 ; WX 579 ; N uni01E9 ; G 427 +U 490 ; WX 787 ; N uni01EA ; G 428 +U 491 ; WX 612 ; N uni01EB ; G 429 +U 492 ; WX 787 ; N uni01EC ; G 430 +U 493 ; WX 612 ; N uni01ED ; G 431 +U 494 ; WX 666 ; N uni01EE ; G 432 +U 495 ; WX 525 ; N uni01EF ; G 433 +U 496 ; WX 278 ; N uni01F0 ; G 434 +U 497 ; WX 1455 ; N uni01F1 ; G 435 +U 498 ; WX 1295 ; N uni01F2 ; G 436 +U 499 ; WX 1160 ; N uni01F3 ; G 437 +U 500 ; WX 775 ; N uni01F4 ; G 438 +U 501 ; WX 635 ; N uni01F5 ; G 439 +U 502 ; WX 1113 ; N uni01F6 ; G 440 +U 503 ; WX 682 ; N uni01F7 ; G 441 +U 504 ; WX 748 ; N uni01F8 ; G 442 +U 505 ; WX 634 ; N uni01F9 ; G 443 +U 506 ; WX 684 ; N Aringacute ; G 444 +U 507 ; WX 613 ; N aringacute ; G 445 +U 508 ; WX 974 ; N AEacute ; G 446 +U 509 ; WX 995 ; N aeacute ; G 447 +U 510 ; WX 787 ; N Oslashacute ; G 448 +U 511 ; WX 612 ; N oslashacute ; G 449 +U 512 ; WX 684 ; N uni0200 ; G 450 +U 513 ; WX 613 ; N uni0201 ; G 451 +U 514 ; WX 684 ; N uni0202 ; G 452 +U 515 ; WX 613 ; N uni0203 ; G 453 +U 516 ; WX 632 ; N uni0204 ; G 454 +U 517 ; WX 615 ; N uni0205 ; G 455 +U 518 ; WX 632 ; N uni0206 ; G 456 +U 519 ; WX 615 ; N uni0207 ; G 457 +U 520 ; WX 295 ; N uni0208 ; G 458 +U 521 ; WX 278 ; N uni0209 ; G 459 +U 522 ; WX 295 ; N uni020A ; G 460 +U 523 ; WX 278 ; N uni020B ; G 461 +U 524 ; WX 787 ; N uni020C ; G 462 +U 525 ; WX 612 ; N uni020D ; G 463 +U 526 ; WX 787 ; N uni020E ; G 464 +U 527 ; WX 612 ; N uni020F ; G 465 +U 528 ; WX 695 ; N uni0210 ; G 466 +U 529 ; WX 411 ; N uni0211 ; G 467 +U 530 ; WX 695 ; N uni0212 ; G 468 +U 531 ; WX 411 ; N uni0213 ; G 469 +U 532 ; WX 732 ; N uni0214 ; G 470 +U 533 ; WX 634 ; N uni0215 ; G 471 +U 534 ; WX 732 ; N uni0216 ; G 472 +U 535 ; WX 634 ; N uni0217 ; G 473 +U 536 ; WX 635 ; N Scommaaccent ; G 474 +U 537 ; WX 521 ; N scommaaccent ; G 475 +U 538 ; WX 611 ; N uni021A ; G 476 +U 539 ; WX 392 ; N uni021B ; G 477 +U 540 ; WX 627 ; N uni021C ; G 478 +U 541 ; WX 521 ; N uni021D ; G 479 +U 542 ; WX 752 ; N uni021E ; G 480 +U 543 ; WX 634 ; N uni021F ; G 481 +U 544 ; WX 735 ; N uni0220 ; G 482 +U 545 ; WX 838 ; N uni0221 ; G 483 +U 546 ; WX 698 ; N uni0222 ; G 484 +U 547 ; WX 610 ; N uni0223 ; G 485 +U 548 ; WX 685 ; N uni0224 ; G 486 +U 549 ; WX 525 ; N uni0225 ; G 487 +U 550 ; WX 684 ; N uni0226 ; G 488 +U 551 ; WX 613 ; N uni0227 ; G 489 +U 552 ; WX 632 ; N uni0228 ; G 490 +U 553 ; WX 615 ; N uni0229 ; G 491 +U 554 ; WX 787 ; N uni022A ; G 492 +U 555 ; WX 612 ; N uni022B ; G 493 +U 556 ; WX 787 ; N uni022C ; G 494 +U 557 ; WX 612 ; N uni022D ; G 495 +U 558 ; WX 787 ; N uni022E ; G 496 +U 559 ; WX 612 ; N uni022F ; G 497 +U 560 ; WX 787 ; N uni0230 ; G 498 +U 561 ; WX 612 ; N uni0231 ; G 499 +U 562 ; WX 611 ; N uni0232 ; G 500 +U 563 ; WX 592 ; N uni0233 ; G 501 +U 564 ; WX 475 ; N uni0234 ; G 502 +U 565 ; WX 843 ; N uni0235 ; G 503 +U 566 ; WX 477 ; N uni0236 ; G 504 +U 567 ; WX 278 ; N dotlessj ; G 505 +U 568 ; WX 998 ; N uni0238 ; G 506 +U 569 ; WX 998 ; N uni0239 ; G 507 +U 570 ; WX 684 ; N uni023A ; G 508 +U 571 ; WX 698 ; N uni023B ; G 509 +U 572 ; WX 550 ; N uni023C ; G 510 +U 573 ; WX 557 ; N uni023D ; G 511 +U 574 ; WX 611 ; N uni023E ; G 512 +U 575 ; WX 521 ; N uni023F ; G 513 +U 576 ; WX 525 ; N uni0240 ; G 514 +U 577 ; WX 603 ; N uni0241 ; G 515 +U 578 ; WX 479 ; N uni0242 ; G 516 +U 579 ; WX 686 ; N uni0243 ; G 517 +U 580 ; WX 732 ; N uni0244 ; G 518 +U 581 ; WX 684 ; N uni0245 ; G 519 +U 582 ; WX 632 ; N uni0246 ; G 520 +U 583 ; WX 615 ; N uni0247 ; G 521 +U 584 ; WX 295 ; N uni0248 ; G 522 +U 585 ; WX 278 ; N uni0249 ; G 523 +U 586 ; WX 781 ; N uni024A ; G 524 +U 587 ; WX 635 ; N uni024B ; G 525 +U 588 ; WX 695 ; N uni024C ; G 526 +U 589 ; WX 411 ; N uni024D ; G 527 +U 590 ; WX 611 ; N uni024E ; G 528 +U 591 ; WX 592 ; N uni024F ; G 529 +U 592 ; WX 613 ; N uni0250 ; G 530 +U 593 ; WX 635 ; N uni0251 ; G 531 +U 594 ; WX 635 ; N uni0252 ; G 532 +U 595 ; WX 635 ; N uni0253 ; G 533 +U 596 ; WX 550 ; N uni0254 ; G 534 +U 597 ; WX 550 ; N uni0255 ; G 535 +U 598 ; WX 635 ; N uni0256 ; G 536 +U 599 ; WX 727 ; N uni0257 ; G 537 +U 600 ; WX 615 ; N uni0258 ; G 538 +U 601 ; WX 615 ; N uni0259 ; G 539 +U 602 ; WX 844 ; N uni025A ; G 540 +U 603 ; WX 545 ; N uni025B ; G 541 +U 604 ; WX 545 ; N uni025C ; G 542 +U 605 ; WX 775 ; N uni025D ; G 543 +U 606 ; WX 664 ; N uni025E ; G 544 +U 607 ; WX 326 ; N uni025F ; G 545 +U 608 ; WX 696 ; N uni0260 ; G 546 +U 609 ; WX 635 ; N uni0261 ; G 547 +U 610 ; WX 629 ; N uni0262 ; G 548 +U 611 ; WX 596 ; N uni0263 ; G 549 +U 612 ; WX 596 ; N uni0264 ; G 550 +U 613 ; WX 634 ; N uni0265 ; G 551 +U 614 ; WX 634 ; N uni0266 ; G 552 +U 615 ; WX 634 ; N uni0267 ; G 553 +U 616 ; WX 372 ; N uni0268 ; G 554 +U 617 ; WX 387 ; N uni0269 ; G 555 +U 618 ; WX 372 ; N uni026A ; G 556 +U 619 ; WX 396 ; N uni026B ; G 557 +U 620 ; WX 487 ; N uni026C ; G 558 +U 621 ; WX 278 ; N uni026D ; G 559 +U 622 ; WX 706 ; N uni026E ; G 560 +U 623 ; WX 974 ; N uni026F ; G 561 +U 624 ; WX 974 ; N uni0270 ; G 562 +U 625 ; WX 974 ; N uni0271 ; G 563 +U 626 ; WX 646 ; N uni0272 ; G 564 +U 627 ; WX 642 ; N uni0273 ; G 565 +U 628 ; WX 634 ; N uni0274 ; G 566 +U 629 ; WX 612 ; N uni0275 ; G 567 +U 630 ; WX 858 ; N uni0276 ; G 568 +U 631 ; WX 728 ; N uni0277 ; G 569 +U 632 ; WX 660 ; N uni0278 ; G 570 +U 633 ; WX 469 ; N uni0279 ; G 571 +U 634 ; WX 469 ; N uni027A ; G 572 +U 635 ; WX 469 ; N uni027B ; G 573 +U 636 ; WX 469 ; N uni027C ; G 574 +U 637 ; WX 469 ; N uni027D ; G 575 +U 638 ; WX 530 ; N uni027E ; G 576 +U 639 ; WX 530 ; N uni027F ; G 577 +U 640 ; WX 602 ; N uni0280 ; G 578 +U 641 ; WX 602 ; N uni0281 ; G 579 +U 642 ; WX 521 ; N uni0282 ; G 580 +U 643 ; WX 336 ; N uni0283 ; G 581 +U 644 ; WX 336 ; N uni0284 ; G 582 +U 645 ; WX 461 ; N uni0285 ; G 583 +U 646 ; WX 336 ; N uni0286 ; G 584 +U 647 ; WX 392 ; N uni0287 ; G 585 +U 648 ; WX 392 ; N uni0288 ; G 586 +U 649 ; WX 634 ; N uni0289 ; G 587 +U 650 ; WX 618 ; N uni028A ; G 588 +U 651 ; WX 598 ; N uni028B ; G 589 +U 652 ; WX 592 ; N uni028C ; G 590 +U 653 ; WX 818 ; N uni028D ; G 591 +U 654 ; WX 592 ; N uni028E ; G 592 +U 655 ; WX 611 ; N uni028F ; G 593 +U 656 ; WX 525 ; N uni0290 ; G 594 +U 657 ; WX 525 ; N uni0291 ; G 595 +U 658 ; WX 578 ; N uni0292 ; G 596 +U 659 ; WX 578 ; N uni0293 ; G 597 +U 660 ; WX 510 ; N uni0294 ; G 598 +U 661 ; WX 510 ; N uni0295 ; G 599 +U 662 ; WX 510 ; N uni0296 ; G 600 +U 663 ; WX 510 ; N uni0297 ; G 601 +U 664 ; WX 787 ; N uni0298 ; G 602 +U 665 ; WX 580 ; N uni0299 ; G 603 +U 666 ; WX 664 ; N uni029A ; G 604 +U 667 ; WX 708 ; N uni029B ; G 605 +U 668 ; WX 654 ; N uni029C ; G 606 +U 669 ; WX 292 ; N uni029D ; G 607 +U 670 ; WX 667 ; N uni029E ; G 608 +U 671 ; WX 507 ; N uni029F ; G 609 +U 672 ; WX 727 ; N uni02A0 ; G 610 +U 673 ; WX 510 ; N uni02A1 ; G 611 +U 674 ; WX 510 ; N uni02A2 ; G 612 +U 675 ; WX 1014 ; N uni02A3 ; G 613 +U 676 ; WX 1058 ; N uni02A4 ; G 614 +U 677 ; WX 1013 ; N uni02A5 ; G 615 +U 678 ; WX 830 ; N uni02A6 ; G 616 +U 679 ; WX 610 ; N uni02A7 ; G 617 +U 680 ; WX 778 ; N uni02A8 ; G 618 +U 681 ; WX 848 ; N uni02A9 ; G 619 +U 682 ; WX 706 ; N uni02AA ; G 620 +U 683 ; WX 654 ; N uni02AB ; G 621 +U 684 ; WX 515 ; N uni02AC ; G 622 +U 685 ; WX 515 ; N uni02AD ; G 623 +U 686 ; WX 570 ; N uni02AE ; G 624 +U 687 ; WX 664 ; N uni02AF ; G 625 +U 688 ; WX 399 ; N uni02B0 ; G 626 +U 689 ; WX 399 ; N uni02B1 ; G 627 +U 690 ; WX 175 ; N uni02B2 ; G 628 +U 691 ; WX 259 ; N uni02B3 ; G 629 +U 692 ; WX 295 ; N uni02B4 ; G 630 +U 693 ; WX 296 ; N uni02B5 ; G 631 +U 694 ; WX 379 ; N uni02B6 ; G 632 +U 695 ; WX 515 ; N uni02B7 ; G 633 +U 696 ; WX 373 ; N uni02B8 ; G 634 +U 697 ; WX 278 ; N uni02B9 ; G 635 +U 698 ; WX 460 ; N uni02BA ; G 636 +U 699 ; WX 318 ; N uni02BB ; G 637 +U 700 ; WX 318 ; N uni02BC ; G 638 +U 701 ; WX 318 ; N uni02BD ; G 639 +U 702 ; WX 307 ; N uni02BE ; G 640 +U 703 ; WX 307 ; N uni02BF ; G 641 +U 704 ; WX 370 ; N uni02C0 ; G 642 +U 705 ; WX 370 ; N uni02C1 ; G 643 +U 706 ; WX 500 ; N uni02C2 ; G 644 +U 707 ; WX 500 ; N uni02C3 ; G 645 +U 708 ; WX 500 ; N uni02C4 ; G 646 +U 709 ; WX 500 ; N uni02C5 ; G 647 +U 710 ; WX 500 ; N circumflex ; G 648 +U 711 ; WX 500 ; N caron ; G 649 +U 712 ; WX 275 ; N uni02C8 ; G 650 +U 713 ; WX 500 ; N uni02C9 ; G 651 +U 714 ; WX 500 ; N uni02CA ; G 652 +U 715 ; WX 500 ; N uni02CB ; G 653 +U 716 ; WX 275 ; N uni02CC ; G 654 +U 717 ; WX 500 ; N uni02CD ; G 655 +U 718 ; WX 500 ; N uni02CE ; G 656 +U 719 ; WX 500 ; N uni02CF ; G 657 +U 720 ; WX 337 ; N uni02D0 ; G 658 +U 721 ; WX 337 ; N uni02D1 ; G 659 +U 722 ; WX 307 ; N uni02D2 ; G 660 +U 723 ; WX 307 ; N uni02D3 ; G 661 +U 724 ; WX 500 ; N uni02D4 ; G 662 +U 725 ; WX 500 ; N uni02D5 ; G 663 +U 726 ; WX 390 ; N uni02D6 ; G 664 +U 727 ; WX 317 ; N uni02D7 ; G 665 +U 728 ; WX 500 ; N breve ; G 666 +U 729 ; WX 500 ; N dotaccent ; G 667 +U 730 ; WX 500 ; N ring ; G 668 +U 731 ; WX 500 ; N ogonek ; G 669 +U 732 ; WX 500 ; N tilde ; G 670 +U 733 ; WX 500 ; N hungarumlaut ; G 671 +U 734 ; WX 315 ; N uni02DE ; G 672 +U 735 ; WX 500 ; N uni02DF ; G 673 +U 736 ; WX 426 ; N uni02E0 ; G 674 +U 737 ; WX 166 ; N uni02E1 ; G 675 +U 738 ; WX 373 ; N uni02E2 ; G 676 +U 739 ; WX 444 ; N uni02E3 ; G 677 +U 740 ; WX 370 ; N uni02E4 ; G 678 +U 741 ; WX 493 ; N uni02E5 ; G 679 +U 742 ; WX 493 ; N uni02E6 ; G 680 +U 743 ; WX 493 ; N uni02E7 ; G 681 +U 744 ; WX 493 ; N uni02E8 ; G 682 +U 745 ; WX 493 ; N uni02E9 ; G 683 +U 748 ; WX 500 ; N uni02EC ; G 684 +U 749 ; WX 500 ; N uni02ED ; G 685 +U 750 ; WX 518 ; N uni02EE ; G 686 +U 755 ; WX 500 ; N uni02F3 ; G 687 +U 759 ; WX 500 ; N uni02F7 ; G 688 +U 768 ; WX 0 ; N gravecomb ; G 689 +U 769 ; WX 0 ; N acutecomb ; G 690 +U 770 ; WX 0 ; N uni0302 ; G 691 +U 771 ; WX 0 ; N tildecomb ; G 692 +U 772 ; WX 0 ; N uni0304 ; G 693 +U 773 ; WX 0 ; N uni0305 ; G 694 +U 774 ; WX 0 ; N uni0306 ; G 695 +U 775 ; WX 0 ; N uni0307 ; G 696 +U 776 ; WX 0 ; N uni0308 ; G 697 +U 777 ; WX 0 ; N hookabovecomb ; G 698 +U 778 ; WX 0 ; N uni030A ; G 699 +U 779 ; WX 0 ; N uni030B ; G 700 +U 780 ; WX 0 ; N uni030C ; G 701 +U 781 ; WX 0 ; N uni030D ; G 702 +U 782 ; WX 0 ; N uni030E ; G 703 +U 783 ; WX 0 ; N uni030F ; G 704 +U 784 ; WX 0 ; N uni0310 ; G 705 +U 785 ; WX 0 ; N uni0311 ; G 706 +U 786 ; WX 0 ; N uni0312 ; G 707 +U 787 ; WX 0 ; N uni0313 ; G 708 +U 788 ; WX 0 ; N uni0314 ; G 709 +U 789 ; WX 0 ; N uni0315 ; G 710 +U 790 ; WX 0 ; N uni0316 ; G 711 +U 791 ; WX 0 ; N uni0317 ; G 712 +U 792 ; WX 0 ; N uni0318 ; G 713 +U 793 ; WX 0 ; N uni0319 ; G 714 +U 794 ; WX 0 ; N uni031A ; G 715 +U 795 ; WX 0 ; N uni031B ; G 716 +U 796 ; WX 0 ; N uni031C ; G 717 +U 797 ; WX 0 ; N uni031D ; G 718 +U 798 ; WX 0 ; N uni031E ; G 719 +U 799 ; WX 0 ; N uni031F ; G 720 +U 800 ; WX 0 ; N uni0320 ; G 721 +U 801 ; WX 0 ; N uni0321 ; G 722 +U 802 ; WX 0 ; N uni0322 ; G 723 +U 803 ; WX 0 ; N dotbelowcomb ; G 724 +U 804 ; WX 0 ; N uni0324 ; G 725 +U 805 ; WX 0 ; N uni0325 ; G 726 +U 806 ; WX 0 ; N uni0326 ; G 727 +U 807 ; WX 0 ; N uni0327 ; G 728 +U 808 ; WX 0 ; N uni0328 ; G 729 +U 809 ; WX 0 ; N uni0329 ; G 730 +U 810 ; WX 0 ; N uni032A ; G 731 +U 811 ; WX 0 ; N uni032B ; G 732 +U 812 ; WX 0 ; N uni032C ; G 733 +U 813 ; WX 0 ; N uni032D ; G 734 +U 814 ; WX 0 ; N uni032E ; G 735 +U 815 ; WX 0 ; N uni032F ; G 736 +U 816 ; WX 0 ; N uni0330 ; G 737 +U 817 ; WX 0 ; N uni0331 ; G 738 +U 818 ; WX 0 ; N uni0332 ; G 739 +U 819 ; WX 0 ; N uni0333 ; G 740 +U 820 ; WX 0 ; N uni0334 ; G 741 +U 821 ; WX 0 ; N uni0335 ; G 742 +U 822 ; WX 0 ; N uni0336 ; G 743 +U 823 ; WX 0 ; N uni0337 ; G 744 +U 824 ; WX 0 ; N uni0338 ; G 745 +U 825 ; WX 0 ; N uni0339 ; G 746 +U 826 ; WX 0 ; N uni033A ; G 747 +U 827 ; WX 0 ; N uni033B ; G 748 +U 828 ; WX 0 ; N uni033C ; G 749 +U 829 ; WX 0 ; N uni033D ; G 750 +U 830 ; WX 0 ; N uni033E ; G 751 +U 831 ; WX 0 ; N uni033F ; G 752 +U 832 ; WX 0 ; N uni0340 ; G 753 +U 833 ; WX 0 ; N uni0341 ; G 754 +U 834 ; WX 0 ; N uni0342 ; G 755 +U 835 ; WX 0 ; N uni0343 ; G 756 +U 836 ; WX 0 ; N uni0344 ; G 757 +U 837 ; WX 0 ; N uni0345 ; G 758 +U 838 ; WX 0 ; N uni0346 ; G 759 +U 839 ; WX 0 ; N uni0347 ; G 760 +U 840 ; WX 0 ; N uni0348 ; G 761 +U 841 ; WX 0 ; N uni0349 ; G 762 +U 842 ; WX 0 ; N uni034A ; G 763 +U 843 ; WX 0 ; N uni034B ; G 764 +U 844 ; WX 0 ; N uni034C ; G 765 +U 845 ; WX 0 ; N uni034D ; G 766 +U 846 ; WX 0 ; N uni034E ; G 767 +U 847 ; WX 0 ; N uni034F ; G 768 +U 849 ; WX 0 ; N uni0351 ; G 769 +U 850 ; WX 0 ; N uni0352 ; G 770 +U 851 ; WX 0 ; N uni0353 ; G 771 +U 855 ; WX 0 ; N uni0357 ; G 772 +U 856 ; WX 0 ; N uni0358 ; G 773 +U 858 ; WX 0 ; N uni035A ; G 774 +U 860 ; WX 0 ; N uni035C ; G 775 +U 861 ; WX 0 ; N uni035D ; G 776 +U 862 ; WX 0 ; N uni035E ; G 777 +U 863 ; WX 0 ; N uni035F ; G 778 +U 864 ; WX 0 ; N uni0360 ; G 779 +U 865 ; WX 0 ; N uni0361 ; G 780 +U 866 ; WX 0 ; N uni0362 ; G 781 +U 880 ; WX 654 ; N uni0370 ; G 782 +U 881 ; WX 568 ; N uni0371 ; G 783 +U 882 ; WX 862 ; N uni0372 ; G 784 +U 883 ; WX 647 ; N uni0373 ; G 785 +U 884 ; WX 278 ; N uni0374 ; G 786 +U 885 ; WX 278 ; N uni0375 ; G 787 +U 886 ; WX 748 ; N uni0376 ; G 788 +U 887 ; WX 650 ; N uni0377 ; G 789 +U 890 ; WX 500 ; N uni037A ; G 790 +U 891 ; WX 549 ; N uni037B ; G 791 +U 892 ; WX 550 ; N uni037C ; G 792 +U 893 ; WX 549 ; N uni037D ; G 793 +U 894 ; WX 337 ; N uni037E ; G 794 +U 895 ; WX 295 ; N uni037F ; G 795 +U 900 ; WX 500 ; N tonos ; G 796 +U 901 ; WX 500 ; N dieresistonos ; G 797 +U 902 ; WX 684 ; N Alphatonos ; G 798 +U 903 ; WX 318 ; N anoteleia ; G 799 +U 904 ; WX 767 ; N Epsilontonos ; G 800 +U 905 ; WX 903 ; N Etatonos ; G 801 +U 906 ; WX 435 ; N Iotatonos ; G 802 +U 908 ; WX 839 ; N Omicrontonos ; G 803 +U 910 ; WX 860 ; N Upsilontonos ; G 804 +U 911 ; WX 905 ; N Omegatonos ; G 805 +U 912 ; WX 338 ; N iotadieresistonos ; G 806 +U 913 ; WX 684 ; N Alpha ; G 807 +U 914 ; WX 686 ; N Beta ; G 808 +U 915 ; WX 557 ; N Gamma ; G 809 +U 916 ; WX 684 ; N uni0394 ; G 810 +U 917 ; WX 632 ; N Epsilon ; G 811 +U 918 ; WX 685 ; N Zeta ; G 812 +U 919 ; WX 752 ; N Eta ; G 813 +U 920 ; WX 787 ; N Theta ; G 814 +U 921 ; WX 295 ; N Iota ; G 815 +U 922 ; WX 656 ; N Kappa ; G 816 +U 923 ; WX 684 ; N Lambda ; G 817 +U 924 ; WX 863 ; N Mu ; G 818 +U 925 ; WX 748 ; N Nu ; G 819 +U 926 ; WX 632 ; N Xi ; G 820 +U 927 ; WX 787 ; N Omicron ; G 821 +U 928 ; WX 752 ; N Pi ; G 822 +U 929 ; WX 603 ; N Rho ; G 823 +U 931 ; WX 632 ; N Sigma ; G 824 +U 932 ; WX 611 ; N Tau ; G 825 +U 933 ; WX 611 ; N Upsilon ; G 826 +U 934 ; WX 787 ; N Phi ; G 827 +U 935 ; WX 685 ; N Chi ; G 828 +U 936 ; WX 787 ; N Psi ; G 829 +U 937 ; WX 764 ; N Omega ; G 830 +U 938 ; WX 295 ; N Iotadieresis ; G 831 +U 939 ; WX 611 ; N Upsilondieresis ; G 832 +U 940 ; WX 659 ; N alphatonos ; G 833 +U 941 ; WX 541 ; N epsilontonos ; G 834 +U 942 ; WX 634 ; N etatonos ; G 835 +U 943 ; WX 338 ; N iotatonos ; G 836 +U 944 ; WX 579 ; N upsilondieresistonos ; G 837 +U 945 ; WX 659 ; N alpha ; G 838 +U 946 ; WX 638 ; N beta ; G 839 +U 947 ; WX 592 ; N gamma ; G 840 +U 948 ; WX 612 ; N delta ; G 841 +U 949 ; WX 541 ; N epsilon ; G 842 +U 950 ; WX 544 ; N zeta ; G 843 +U 951 ; WX 634 ; N eta ; G 844 +U 952 ; WX 612 ; N theta ; G 845 +U 953 ; WX 338 ; N iota ; G 846 +U 954 ; WX 589 ; N kappa ; G 847 +U 955 ; WX 592 ; N lambda ; G 848 +U 956 ; WX 636 ; N uni03BC ; G 849 +U 957 ; WX 559 ; N nu ; G 850 +U 958 ; WX 558 ; N xi ; G 851 +U 959 ; WX 612 ; N omicron ; G 852 +U 960 ; WX 602 ; N pi ; G 853 +U 961 ; WX 635 ; N rho ; G 854 +U 962 ; WX 587 ; N sigma1 ; G 855 +U 963 ; WX 634 ; N sigma ; G 856 +U 964 ; WX 602 ; N tau ; G 857 +U 965 ; WX 579 ; N upsilon ; G 858 +U 966 ; WX 660 ; N phi ; G 859 +U 967 ; WX 592 ; N chi ; G 860 +U 968 ; WX 660 ; N psi ; G 861 +U 969 ; WX 837 ; N omega ; G 862 +U 970 ; WX 338 ; N iotadieresis ; G 863 +U 971 ; WX 579 ; N upsilondieresis ; G 864 +U 972 ; WX 612 ; N omicrontonos ; G 865 +U 973 ; WX 579 ; N upsilontonos ; G 866 +U 974 ; WX 837 ; N omegatonos ; G 867 +U 975 ; WX 656 ; N uni03CF ; G 868 +U 976 ; WX 614 ; N uni03D0 ; G 869 +U 977 ; WX 619 ; N theta1 ; G 870 +U 978 ; WX 699 ; N Upsilon1 ; G 871 +U 979 ; WX 842 ; N uni03D3 ; G 872 +U 980 ; WX 699 ; N uni03D4 ; G 873 +U 981 ; WX 660 ; N phi1 ; G 874 +U 982 ; WX 837 ; N omega1 ; G 875 +U 983 ; WX 664 ; N uni03D7 ; G 876 +U 984 ; WX 787 ; N uni03D8 ; G 877 +U 985 ; WX 612 ; N uni03D9 ; G 878 +U 986 ; WX 648 ; N uni03DA ; G 879 +U 987 ; WX 587 ; N uni03DB ; G 880 +U 988 ; WX 575 ; N uni03DC ; G 881 +U 989 ; WX 458 ; N uni03DD ; G 882 +U 990 ; WX 660 ; N uni03DE ; G 883 +U 991 ; WX 660 ; N uni03DF ; G 884 +U 992 ; WX 865 ; N uni03E0 ; G 885 +U 993 ; WX 627 ; N uni03E1 ; G 886 +U 994 ; WX 934 ; N uni03E2 ; G 887 +U 995 ; WX 837 ; N uni03E3 ; G 888 +U 996 ; WX 758 ; N uni03E4 ; G 889 +U 997 ; WX 659 ; N uni03E5 ; G 890 +U 998 ; WX 792 ; N uni03E6 ; G 891 +U 999 ; WX 615 ; N uni03E7 ; G 892 +U 1000 ; WX 687 ; N uni03E8 ; G 893 +U 1001 ; WX 607 ; N uni03E9 ; G 894 +U 1002 ; WX 768 ; N uni03EA ; G 895 +U 1003 ; WX 625 ; N uni03EB ; G 896 +U 1004 ; WX 699 ; N uni03EC ; G 897 +U 1005 ; WX 612 ; N uni03ED ; G 898 +U 1006 ; WX 611 ; N uni03EE ; G 899 +U 1007 ; WX 536 ; N uni03EF ; G 900 +U 1008 ; WX 664 ; N uni03F0 ; G 901 +U 1009 ; WX 635 ; N uni03F1 ; G 902 +U 1010 ; WX 550 ; N uni03F2 ; G 903 +U 1011 ; WX 278 ; N uni03F3 ; G 904 +U 1012 ; WX 787 ; N uni03F4 ; G 905 +U 1013 ; WX 615 ; N uni03F5 ; G 906 +U 1014 ; WX 615 ; N uni03F6 ; G 907 +U 1015 ; WX 608 ; N uni03F7 ; G 908 +U 1016 ; WX 635 ; N uni03F8 ; G 909 +U 1017 ; WX 698 ; N uni03F9 ; G 910 +U 1018 ; WX 863 ; N uni03FA ; G 911 +U 1019 ; WX 651 ; N uni03FB ; G 912 +U 1020 ; WX 635 ; N uni03FC ; G 913 +U 1021 ; WX 703 ; N uni03FD ; G 914 +U 1022 ; WX 698 ; N uni03FE ; G 915 +U 1023 ; WX 703 ; N uni03FF ; G 916 +U 1024 ; WX 632 ; N uni0400 ; G 917 +U 1025 ; WX 632 ; N uni0401 ; G 918 +U 1026 ; WX 786 ; N uni0402 ; G 919 +U 1027 ; WX 557 ; N uni0403 ; G 920 +U 1028 ; WX 698 ; N uni0404 ; G 921 +U 1029 ; WX 635 ; N uni0405 ; G 922 +U 1030 ; WX 295 ; N uni0406 ; G 923 +U 1031 ; WX 295 ; N uni0407 ; G 924 +U 1032 ; WX 295 ; N uni0408 ; G 925 +U 1033 ; WX 1094 ; N uni0409 ; G 926 +U 1034 ; WX 1045 ; N uni040A ; G 927 +U 1035 ; WX 786 ; N uni040B ; G 928 +U 1036 ; WX 710 ; N uni040C ; G 929 +U 1037 ; WX 748 ; N uni040D ; G 930 +U 1038 ; WX 609 ; N uni040E ; G 931 +U 1039 ; WX 752 ; N uni040F ; G 932 +U 1040 ; WX 684 ; N uni0410 ; G 933 +U 1041 ; WX 686 ; N uni0411 ; G 934 +U 1042 ; WX 686 ; N uni0412 ; G 935 +U 1043 ; WX 557 ; N uni0413 ; G 936 +U 1044 ; WX 781 ; N uni0414 ; G 937 +U 1045 ; WX 632 ; N uni0415 ; G 938 +U 1046 ; WX 1077 ; N uni0416 ; G 939 +U 1047 ; WX 641 ; N uni0417 ; G 940 +U 1048 ; WX 748 ; N uni0418 ; G 941 +U 1049 ; WX 748 ; N uni0419 ; G 942 +U 1050 ; WX 710 ; N uni041A ; G 943 +U 1051 ; WX 752 ; N uni041B ; G 944 +U 1052 ; WX 863 ; N uni041C ; G 945 +U 1053 ; WX 752 ; N uni041D ; G 946 +U 1054 ; WX 787 ; N uni041E ; G 947 +U 1055 ; WX 752 ; N uni041F ; G 948 +U 1056 ; WX 603 ; N uni0420 ; G 949 +U 1057 ; WX 698 ; N uni0421 ; G 950 +U 1058 ; WX 611 ; N uni0422 ; G 951 +U 1059 ; WX 609 ; N uni0423 ; G 952 +U 1060 ; WX 861 ; N uni0424 ; G 953 +U 1061 ; WX 685 ; N uni0425 ; G 954 +U 1062 ; WX 776 ; N uni0426 ; G 955 +U 1063 ; WX 686 ; N uni0427 ; G 956 +U 1064 ; WX 1069 ; N uni0428 ; G 957 +U 1065 ; WX 1094 ; N uni0429 ; G 958 +U 1066 ; WX 833 ; N uni042A ; G 959 +U 1067 ; WX 818 ; N uni042B ; G 960 +U 1068 ; WX 686 ; N uni042C ; G 961 +U 1069 ; WX 698 ; N uni042D ; G 962 +U 1070 ; WX 1080 ; N uni042E ; G 963 +U 1071 ; WX 695 ; N uni042F ; G 964 +U 1072 ; WX 613 ; N uni0430 ; G 965 +U 1073 ; WX 617 ; N uni0431 ; G 966 +U 1074 ; WX 589 ; N uni0432 ; G 967 +U 1075 ; WX 525 ; N uni0433 ; G 968 +U 1076 ; WX 691 ; N uni0434 ; G 969 +U 1077 ; WX 615 ; N uni0435 ; G 970 +U 1078 ; WX 901 ; N uni0436 ; G 971 +U 1079 ; WX 532 ; N uni0437 ; G 972 +U 1080 ; WX 650 ; N uni0438 ; G 973 +U 1081 ; WX 650 ; N uni0439 ; G 974 +U 1082 ; WX 604 ; N uni043A ; G 975 +U 1083 ; WX 639 ; N uni043B ; G 976 +U 1084 ; WX 754 ; N uni043C ; G 977 +U 1085 ; WX 654 ; N uni043D ; G 978 +U 1086 ; WX 612 ; N uni043E ; G 979 +U 1087 ; WX 654 ; N uni043F ; G 980 +U 1088 ; WX 635 ; N uni0440 ; G 981 +U 1089 ; WX 550 ; N uni0441 ; G 982 +U 1090 ; WX 583 ; N uni0442 ; G 983 +U 1091 ; WX 592 ; N uni0443 ; G 984 +U 1092 ; WX 855 ; N uni0444 ; G 985 +U 1093 ; WX 592 ; N uni0445 ; G 986 +U 1094 ; WX 681 ; N uni0446 ; G 987 +U 1095 ; WX 591 ; N uni0447 ; G 988 +U 1096 ; WX 915 ; N uni0448 ; G 989 +U 1097 ; WX 942 ; N uni0449 ; G 990 +U 1098 ; WX 707 ; N uni044A ; G 991 +U 1099 ; WX 790 ; N uni044B ; G 992 +U 1100 ; WX 589 ; N uni044C ; G 993 +U 1101 ; WX 549 ; N uni044D ; G 994 +U 1102 ; WX 842 ; N uni044E ; G 995 +U 1103 ; WX 602 ; N uni044F ; G 996 +U 1104 ; WX 615 ; N uni0450 ; G 997 +U 1105 ; WX 615 ; N uni0451 ; G 998 +U 1106 ; WX 625 ; N uni0452 ; G 999 +U 1107 ; WX 525 ; N uni0453 ; G 1000 +U 1108 ; WX 549 ; N uni0454 ; G 1001 +U 1109 ; WX 521 ; N uni0455 ; G 1002 +U 1110 ; WX 278 ; N uni0456 ; G 1003 +U 1111 ; WX 278 ; N uni0457 ; G 1004 +U 1112 ; WX 278 ; N uni0458 ; G 1005 +U 1113 ; WX 902 ; N uni0459 ; G 1006 +U 1114 ; WX 898 ; N uni045A ; G 1007 +U 1115 ; WX 652 ; N uni045B ; G 1008 +U 1116 ; WX 604 ; N uni045C ; G 1009 +U 1117 ; WX 650 ; N uni045D ; G 1010 +U 1118 ; WX 592 ; N uni045E ; G 1011 +U 1119 ; WX 654 ; N uni045F ; G 1012 +U 1120 ; WX 934 ; N uni0460 ; G 1013 +U 1121 ; WX 837 ; N uni0461 ; G 1014 +U 1122 ; WX 771 ; N uni0462 ; G 1015 +U 1123 ; WX 672 ; N uni0463 ; G 1016 +U 1124 ; WX 942 ; N uni0464 ; G 1017 +U 1125 ; WX 749 ; N uni0465 ; G 1018 +U 1126 ; WX 879 ; N uni0466 ; G 1019 +U 1127 ; WX 783 ; N uni0467 ; G 1020 +U 1128 ; WX 1160 ; N uni0468 ; G 1021 +U 1129 ; WX 1001 ; N uni0469 ; G 1022 +U 1130 ; WX 787 ; N uni046A ; G 1023 +U 1131 ; WX 612 ; N uni046B ; G 1024 +U 1132 ; WX 1027 ; N uni046C ; G 1025 +U 1133 ; WX 824 ; N uni046D ; G 1026 +U 1134 ; WX 636 ; N uni046E ; G 1027 +U 1135 ; WX 541 ; N uni046F ; G 1028 +U 1136 ; WX 856 ; N uni0470 ; G 1029 +U 1137 ; WX 876 ; N uni0471 ; G 1030 +U 1138 ; WX 787 ; N uni0472 ; G 1031 +U 1139 ; WX 612 ; N uni0473 ; G 1032 +U 1140 ; WX 781 ; N uni0474 ; G 1033 +U 1141 ; WX 665 ; N uni0475 ; G 1034 +U 1142 ; WX 781 ; N uni0476 ; G 1035 +U 1143 ; WX 665 ; N uni0477 ; G 1036 +U 1144 ; WX 992 ; N uni0478 ; G 1037 +U 1145 ; WX 904 ; N uni0479 ; G 1038 +U 1146 ; WX 953 ; N uni047A ; G 1039 +U 1147 ; WX 758 ; N uni047B ; G 1040 +U 1148 ; WX 1180 ; N uni047C ; G 1041 +U 1149 ; WX 1028 ; N uni047D ; G 1042 +U 1150 ; WX 934 ; N uni047E ; G 1043 +U 1151 ; WX 837 ; N uni047F ; G 1044 +U 1152 ; WX 698 ; N uni0480 ; G 1045 +U 1153 ; WX 550 ; N uni0481 ; G 1046 +U 1154 ; WX 502 ; N uni0482 ; G 1047 +U 1155 ; WX 0 ; N uni0483 ; G 1048 +U 1156 ; WX 0 ; N uni0484 ; G 1049 +U 1157 ; WX 0 ; N uni0485 ; G 1050 +U 1158 ; WX 0 ; N uni0486 ; G 1051 +U 1159 ; WX 0 ; N uni0487 ; G 1052 +U 1160 ; WX 418 ; N uni0488 ; G 1053 +U 1161 ; WX 418 ; N uni0489 ; G 1054 +U 1162 ; WX 748 ; N uni048A ; G 1055 +U 1163 ; WX 657 ; N uni048B ; G 1056 +U 1164 ; WX 686 ; N uni048C ; G 1057 +U 1165 ; WX 589 ; N uni048D ; G 1058 +U 1166 ; WX 603 ; N uni048E ; G 1059 +U 1167 ; WX 635 ; N uni048F ; G 1060 +U 1168 ; WX 610 ; N uni0490 ; G 1061 +U 1169 ; WX 525 ; N uni0491 ; G 1062 +U 1170 ; WX 675 ; N uni0492 ; G 1063 +U 1171 ; WX 556 ; N uni0493 ; G 1064 +U 1172 ; WX 557 ; N uni0494 ; G 1065 +U 1173 ; WX 491 ; N uni0495 ; G 1066 +U 1174 ; WX 1077 ; N uni0496 ; G 1067 +U 1175 ; WX 901 ; N uni0497 ; G 1068 +U 1176 ; WX 641 ; N uni0498 ; G 1069 +U 1177 ; WX 532 ; N uni0499 ; G 1070 +U 1178 ; WX 710 ; N uni049A ; G 1071 +U 1179 ; WX 604 ; N uni049B ; G 1072 +U 1180 ; WX 710 ; N uni049C ; G 1073 +U 1181 ; WX 604 ; N uni049D ; G 1074 +U 1182 ; WX 710 ; N uni049E ; G 1075 +U 1183 ; WX 604 ; N uni049F ; G 1076 +U 1184 ; WX 856 ; N uni04A0 ; G 1077 +U 1185 ; WX 832 ; N uni04A1 ; G 1078 +U 1186 ; WX 752 ; N uni04A2 ; G 1079 +U 1187 ; WX 661 ; N uni04A3 ; G 1080 +U 1188 ; WX 1014 ; N uni04A4 ; G 1081 +U 1189 ; WX 877 ; N uni04A5 ; G 1082 +U 1190 ; WX 1113 ; N uni04A6 ; G 1083 +U 1191 ; WX 950 ; N uni04A7 ; G 1084 +U 1192 ; WX 890 ; N uni04A8 ; G 1085 +U 1193 ; WX 707 ; N uni04A9 ; G 1086 +U 1194 ; WX 698 ; N uni04AA ; G 1087 +U 1195 ; WX 550 ; N uni04AB ; G 1088 +U 1196 ; WX 611 ; N uni04AC ; G 1089 +U 1197 ; WX 529 ; N uni04AD ; G 1090 +U 1198 ; WX 611 ; N uni04AE ; G 1091 +U 1199 ; WX 592 ; N uni04AF ; G 1092 +U 1200 ; WX 611 ; N uni04B0 ; G 1093 +U 1201 ; WX 592 ; N uni04B1 ; G 1094 +U 1202 ; WX 685 ; N uni04B2 ; G 1095 +U 1203 ; WX 592 ; N uni04B3 ; G 1096 +U 1204 ; WX 934 ; N uni04B4 ; G 1097 +U 1205 ; WX 807 ; N uni04B5 ; G 1098 +U 1206 ; WX 686 ; N uni04B6 ; G 1099 +U 1207 ; WX 591 ; N uni04B7 ; G 1100 +U 1208 ; WX 686 ; N uni04B8 ; G 1101 +U 1209 ; WX 591 ; N uni04B9 ; G 1102 +U 1210 ; WX 686 ; N uni04BA ; G 1103 +U 1211 ; WX 634 ; N uni04BB ; G 1104 +U 1212 ; WX 929 ; N uni04BC ; G 1105 +U 1213 ; WX 731 ; N uni04BD ; G 1106 +U 1214 ; WX 929 ; N uni04BE ; G 1107 +U 1215 ; WX 731 ; N uni04BF ; G 1108 +U 1216 ; WX 295 ; N uni04C0 ; G 1109 +U 1217 ; WX 1077 ; N uni04C1 ; G 1110 +U 1218 ; WX 901 ; N uni04C2 ; G 1111 +U 1219 ; WX 655 ; N uni04C3 ; G 1112 +U 1220 ; WX 604 ; N uni04C4 ; G 1113 +U 1221 ; WX 752 ; N uni04C5 ; G 1114 +U 1222 ; WX 639 ; N uni04C6 ; G 1115 +U 1223 ; WX 752 ; N uni04C7 ; G 1116 +U 1224 ; WX 661 ; N uni04C8 ; G 1117 +U 1225 ; WX 752 ; N uni04C9 ; G 1118 +U 1226 ; WX 661 ; N uni04CA ; G 1119 +U 1227 ; WX 686 ; N uni04CB ; G 1120 +U 1228 ; WX 591 ; N uni04CC ; G 1121 +U 1229 ; WX 863 ; N uni04CD ; G 1122 +U 1230 ; WX 754 ; N uni04CE ; G 1123 +U 1231 ; WX 278 ; N uni04CF ; G 1124 +U 1232 ; WX 684 ; N uni04D0 ; G 1125 +U 1233 ; WX 613 ; N uni04D1 ; G 1126 +U 1234 ; WX 684 ; N uni04D2 ; G 1127 +U 1235 ; WX 613 ; N uni04D3 ; G 1128 +U 1236 ; WX 974 ; N uni04D4 ; G 1129 +U 1237 ; WX 995 ; N uni04D5 ; G 1130 +U 1238 ; WX 632 ; N uni04D6 ; G 1131 +U 1239 ; WX 615 ; N uni04D7 ; G 1132 +U 1240 ; WX 787 ; N uni04D8 ; G 1133 +U 1241 ; WX 615 ; N uni04D9 ; G 1134 +U 1242 ; WX 787 ; N uni04DA ; G 1135 +U 1243 ; WX 615 ; N uni04DB ; G 1136 +U 1244 ; WX 1077 ; N uni04DC ; G 1137 +U 1245 ; WX 901 ; N uni04DD ; G 1138 +U 1246 ; WX 641 ; N uni04DE ; G 1139 +U 1247 ; WX 532 ; N uni04DF ; G 1140 +U 1248 ; WX 666 ; N uni04E0 ; G 1141 +U 1249 ; WX 578 ; N uni04E1 ; G 1142 +U 1250 ; WX 748 ; N uni04E2 ; G 1143 +U 1251 ; WX 650 ; N uni04E3 ; G 1144 +U 1252 ; WX 748 ; N uni04E4 ; G 1145 +U 1253 ; WX 650 ; N uni04E5 ; G 1146 +U 1254 ; WX 787 ; N uni04E6 ; G 1147 +U 1255 ; WX 612 ; N uni04E7 ; G 1148 +U 1256 ; WX 787 ; N uni04E8 ; G 1149 +U 1257 ; WX 612 ; N uni04E9 ; G 1150 +U 1258 ; WX 787 ; N uni04EA ; G 1151 +U 1259 ; WX 612 ; N uni04EB ; G 1152 +U 1260 ; WX 698 ; N uni04EC ; G 1153 +U 1261 ; WX 549 ; N uni04ED ; G 1154 +U 1262 ; WX 609 ; N uni04EE ; G 1155 +U 1263 ; WX 592 ; N uni04EF ; G 1156 +U 1264 ; WX 609 ; N uni04F0 ; G 1157 +U 1265 ; WX 592 ; N uni04F1 ; G 1158 +U 1266 ; WX 609 ; N uni04F2 ; G 1159 +U 1267 ; WX 592 ; N uni04F3 ; G 1160 +U 1268 ; WX 686 ; N uni04F4 ; G 1161 +U 1269 ; WX 591 ; N uni04F5 ; G 1162 +U 1270 ; WX 557 ; N uni04F6 ; G 1163 +U 1271 ; WX 491 ; N uni04F7 ; G 1164 +U 1272 ; WX 818 ; N uni04F8 ; G 1165 +U 1273 ; WX 790 ; N uni04F9 ; G 1166 +U 1274 ; WX 675 ; N uni04FA ; G 1167 +U 1275 ; WX 556 ; N uni04FB ; G 1168 +U 1276 ; WX 685 ; N uni04FC ; G 1169 +U 1277 ; WX 592 ; N uni04FD ; G 1170 +U 1278 ; WX 685 ; N uni04FE ; G 1171 +U 1279 ; WX 592 ; N uni04FF ; G 1172 +U 1280 ; WX 686 ; N uni0500 ; G 1173 +U 1281 ; WX 589 ; N uni0501 ; G 1174 +U 1282 ; WX 1006 ; N uni0502 ; G 1175 +U 1283 ; WX 897 ; N uni0503 ; G 1176 +U 1284 ; WX 975 ; N uni0504 ; G 1177 +U 1285 ; WX 869 ; N uni0505 ; G 1178 +U 1286 ; WX 679 ; N uni0506 ; G 1179 +U 1287 ; WX 588 ; N uni0507 ; G 1180 +U 1288 ; WX 1072 ; N uni0508 ; G 1181 +U 1289 ; WX 957 ; N uni0509 ; G 1182 +U 1290 ; WX 1113 ; N uni050A ; G 1183 +U 1291 ; WX 967 ; N uni050B ; G 1184 +U 1292 ; WX 775 ; N uni050C ; G 1185 +U 1293 ; WX 660 ; N uni050D ; G 1186 +U 1294 ; WX 773 ; N uni050E ; G 1187 +U 1295 ; WX 711 ; N uni050F ; G 1188 +U 1296 ; WX 614 ; N uni0510 ; G 1189 +U 1297 ; WX 541 ; N uni0511 ; G 1190 +U 1298 ; WX 752 ; N uni0512 ; G 1191 +U 1299 ; WX 639 ; N uni0513 ; G 1192 +U 1300 ; WX 1195 ; N uni0514 ; G 1193 +U 1301 ; WX 997 ; N uni0515 ; G 1194 +U 1302 ; WX 900 ; N uni0516 ; G 1195 +U 1303 ; WX 867 ; N uni0517 ; G 1196 +U 1304 ; WX 1031 ; N uni0518 ; G 1197 +U 1305 ; WX 989 ; N uni0519 ; G 1198 +U 1306 ; WX 787 ; N uni051A ; G 1199 +U 1307 ; WX 635 ; N uni051B ; G 1200 +U 1308 ; WX 989 ; N uni051C ; G 1201 +U 1309 ; WX 818 ; N uni051D ; G 1202 +U 1310 ; WX 710 ; N uni051E ; G 1203 +U 1311 ; WX 604 ; N uni051F ; G 1204 +U 1312 ; WX 1113 ; N uni0520 ; G 1205 +U 1313 ; WX 942 ; N uni0521 ; G 1206 +U 1314 ; WX 1113 ; N uni0522 ; G 1207 +U 1315 ; WX 949 ; N uni0523 ; G 1208 +U 1316 ; WX 793 ; N uni0524 ; G 1209 +U 1317 ; WX 683 ; N uni0525 ; G 1210 +U 1329 ; WX 766 ; N uni0531 ; G 1211 +U 1330 ; WX 732 ; N uni0532 ; G 1212 +U 1331 ; WX 753 ; N uni0533 ; G 1213 +U 1332 ; WX 753 ; N uni0534 ; G 1214 +U 1333 ; WX 732 ; N uni0535 ; G 1215 +U 1334 ; WX 772 ; N uni0536 ; G 1216 +U 1335 ; WX 640 ; N uni0537 ; G 1217 +U 1336 ; WX 732 ; N uni0538 ; G 1218 +U 1337 ; WX 859 ; N uni0539 ; G 1219 +U 1338 ; WX 753 ; N uni053A ; G 1220 +U 1339 ; WX 691 ; N uni053B ; G 1221 +U 1340 ; WX 533 ; N uni053C ; G 1222 +U 1341 ; WX 922 ; N uni053D ; G 1223 +U 1342 ; WX 863 ; N uni053E ; G 1224 +U 1343 ; WX 732 ; N uni053F ; G 1225 +U 1344 ; WX 716 ; N uni0540 ; G 1226 +U 1345 ; WX 766 ; N uni0541 ; G 1227 +U 1346 ; WX 753 ; N uni0542 ; G 1228 +U 1347 ; WX 767 ; N uni0543 ; G 1229 +U 1348 ; WX 792 ; N uni0544 ; G 1230 +U 1349 ; WX 728 ; N uni0545 ; G 1231 +U 1350 ; WX 729 ; N uni0546 ; G 1232 +U 1351 ; WX 757 ; N uni0547 ; G 1233 +U 1352 ; WX 732 ; N uni0548 ; G 1234 +U 1353 ; WX 713 ; N uni0549 ; G 1235 +U 1354 ; WX 800 ; N uni054A ; G 1236 +U 1355 ; WX 768 ; N uni054B ; G 1237 +U 1356 ; WX 792 ; N uni054C ; G 1238 +U 1357 ; WX 732 ; N uni054D ; G 1239 +U 1358 ; WX 753 ; N uni054E ; G 1240 +U 1359 ; WX 705 ; N uni054F ; G 1241 +U 1360 ; WX 694 ; N uni0550 ; G 1242 +U 1361 ; WX 744 ; N uni0551 ; G 1243 +U 1362 ; WX 538 ; N uni0552 ; G 1244 +U 1363 ; WX 811 ; N uni0553 ; G 1245 +U 1364 ; WX 757 ; N uni0554 ; G 1246 +U 1365 ; WX 787 ; N uni0555 ; G 1247 +U 1366 ; WX 790 ; N uni0556 ; G 1248 +U 1369 ; WX 307 ; N uni0559 ; G 1249 +U 1370 ; WX 318 ; N uni055A ; G 1250 +U 1371 ; WX 234 ; N uni055B ; G 1251 +U 1372 ; WX 361 ; N uni055C ; G 1252 +U 1373 ; WX 238 ; N uni055D ; G 1253 +U 1374 ; WX 405 ; N uni055E ; G 1254 +U 1375 ; WX 500 ; N uni055F ; G 1255 +U 1377 ; WX 974 ; N uni0561 ; G 1256 +U 1378 ; WX 634 ; N uni0562 ; G 1257 +U 1379 ; WX 658 ; N uni0563 ; G 1258 +U 1380 ; WX 663 ; N uni0564 ; G 1259 +U 1381 ; WX 634 ; N uni0565 ; G 1260 +U 1382 ; WX 635 ; N uni0566 ; G 1261 +U 1383 ; WX 515 ; N uni0567 ; G 1262 +U 1384 ; WX 634 ; N uni0568 ; G 1263 +U 1385 ; WX 738 ; N uni0569 ; G 1264 +U 1386 ; WX 658 ; N uni056A ; G 1265 +U 1387 ; WX 634 ; N uni056B ; G 1266 +U 1388 ; WX 271 ; N uni056C ; G 1267 +U 1389 ; WX 980 ; N uni056D ; G 1268 +U 1390 ; WX 623 ; N uni056E ; G 1269 +U 1391 ; WX 634 ; N uni056F ; G 1270 +U 1392 ; WX 634 ; N uni0570 ; G 1271 +U 1393 ; WX 608 ; N uni0571 ; G 1272 +U 1394 ; WX 634 ; N uni0572 ; G 1273 +U 1395 ; WX 629 ; N uni0573 ; G 1274 +U 1396 ; WX 634 ; N uni0574 ; G 1275 +U 1397 ; WX 278 ; N uni0575 ; G 1276 +U 1398 ; WX 634 ; N uni0576 ; G 1277 +U 1399 ; WX 499 ; N uni0577 ; G 1278 +U 1400 ; WX 634 ; N uni0578 ; G 1279 +U 1401 ; WX 404 ; N uni0579 ; G 1280 +U 1402 ; WX 974 ; N uni057A ; G 1281 +U 1403 ; WX 560 ; N uni057B ; G 1282 +U 1404 ; WX 648 ; N uni057C ; G 1283 +U 1405 ; WX 634 ; N uni057D ; G 1284 +U 1406 ; WX 634 ; N uni057E ; G 1285 +U 1407 ; WX 974 ; N uni057F ; G 1286 +U 1408 ; WX 634 ; N uni0580 ; G 1287 +U 1409 ; WX 635 ; N uni0581 ; G 1288 +U 1410 ; WX 435 ; N uni0582 ; G 1289 +U 1411 ; WX 974 ; N uni0583 ; G 1290 +U 1412 ; WX 636 ; N uni0584 ; G 1291 +U 1413 ; WX 612 ; N uni0585 ; G 1292 +U 1414 ; WX 805 ; N uni0586 ; G 1293 +U 1415 ; WX 812 ; N uni0587 ; G 1294 +U 1417 ; WX 337 ; N uni0589 ; G 1295 +U 1418 ; WX 361 ; N uni058A ; G 1296 +U 1456 ; WX 0 ; N uni05B0 ; G 1297 +U 1457 ; WX 0 ; N uni05B1 ; G 1298 +U 1458 ; WX 0 ; N uni05B2 ; G 1299 +U 1459 ; WX 0 ; N uni05B3 ; G 1300 +U 1460 ; WX 0 ; N uni05B4 ; G 1301 +U 1461 ; WX 0 ; N uni05B5 ; G 1302 +U 1462 ; WX 0 ; N uni05B6 ; G 1303 +U 1463 ; WX 0 ; N uni05B7 ; G 1304 +U 1464 ; WX 0 ; N uni05B8 ; G 1305 +U 1465 ; WX 0 ; N uni05B9 ; G 1306 +U 1466 ; WX 0 ; N uni05BA ; G 1307 +U 1467 ; WX 0 ; N uni05BB ; G 1308 +U 1468 ; WX 0 ; N uni05BC ; G 1309 +U 1469 ; WX 0 ; N uni05BD ; G 1310 +U 1470 ; WX 361 ; N uni05BE ; G 1311 +U 1471 ; WX 0 ; N uni05BF ; G 1312 +U 1472 ; WX 295 ; N uni05C0 ; G 1313 +U 1473 ; WX 0 ; N uni05C1 ; G 1314 +U 1474 ; WX 0 ; N uni05C2 ; G 1315 +U 1475 ; WX 295 ; N uni05C3 ; G 1316 +U 1478 ; WX 456 ; N uni05C6 ; G 1317 +U 1479 ; WX 0 ; N uni05C7 ; G 1318 +U 1488 ; WX 668 ; N uni05D0 ; G 1319 +U 1489 ; WX 578 ; N uni05D1 ; G 1320 +U 1490 ; WX 412 ; N uni05D2 ; G 1321 +U 1491 ; WX 546 ; N uni05D3 ; G 1322 +U 1492 ; WX 653 ; N uni05D4 ; G 1323 +U 1493 ; WX 272 ; N uni05D5 ; G 1324 +U 1494 ; WX 346 ; N uni05D6 ; G 1325 +U 1495 ; WX 653 ; N uni05D7 ; G 1326 +U 1496 ; WX 648 ; N uni05D8 ; G 1327 +U 1497 ; WX 224 ; N uni05D9 ; G 1328 +U 1498 ; WX 537 ; N uni05DA ; G 1329 +U 1499 ; WX 529 ; N uni05DB ; G 1330 +U 1500 ; WX 568 ; N uni05DC ; G 1331 +U 1501 ; WX 664 ; N uni05DD ; G 1332 +U 1502 ; WX 679 ; N uni05DE ; G 1333 +U 1503 ; WX 272 ; N uni05DF ; G 1334 +U 1504 ; WX 400 ; N uni05E0 ; G 1335 +U 1505 ; WX 649 ; N uni05E1 ; G 1336 +U 1506 ; WX 626 ; N uni05E2 ; G 1337 +U 1507 ; WX 640 ; N uni05E3 ; G 1338 +U 1508 ; WX 625 ; N uni05E4 ; G 1339 +U 1509 ; WX 540 ; N uni05E5 ; G 1340 +U 1510 ; WX 593 ; N uni05E6 ; G 1341 +U 1511 ; WX 709 ; N uni05E7 ; G 1342 +U 1512 ; WX 564 ; N uni05E8 ; G 1343 +U 1513 ; WX 708 ; N uni05E9 ; G 1344 +U 1514 ; WX 657 ; N uni05EA ; G 1345 +U 1520 ; WX 471 ; N uni05F0 ; G 1346 +U 1521 ; WX 454 ; N uni05F1 ; G 1347 +U 1522 ; WX 471 ; N uni05F2 ; G 1348 +U 1523 ; WX 416 ; N uni05F3 ; G 1349 +U 1524 ; WX 645 ; N uni05F4 ; G 1350 +U 3647 ; WX 636 ; N uni0E3F ; G 1351 +U 3713 ; WX 670 ; N uni0E81 ; G 1352 +U 3714 ; WX 684 ; N uni0E82 ; G 1353 +U 3716 ; WX 688 ; N uni0E84 ; G 1354 +U 3719 ; WX 482 ; N uni0E87 ; G 1355 +U 3720 ; WX 628 ; N uni0E88 ; G 1356 +U 3722 ; WX 684 ; N uni0E8A ; G 1357 +U 3725 ; WX 688 ; N uni0E8D ; G 1358 +U 3732 ; WX 642 ; N uni0E94 ; G 1359 +U 3733 ; WX 642 ; N uni0E95 ; G 1360 +U 3734 ; WX 672 ; N uni0E96 ; G 1361 +U 3735 ; WX 655 ; N uni0E97 ; G 1362 +U 3737 ; WX 641 ; N uni0E99 ; G 1363 +U 3738 ; WX 592 ; N uni0E9A ; G 1364 +U 3739 ; WX 592 ; N uni0E9B ; G 1365 +U 3740 ; WX 745 ; N uni0E9C ; G 1366 +U 3741 ; WX 767 ; N uni0E9D ; G 1367 +U 3742 ; WX 687 ; N uni0E9E ; G 1368 +U 3743 ; WX 687 ; N uni0E9F ; G 1369 +U 3745 ; WX 702 ; N uni0EA1 ; G 1370 +U 3746 ; WX 688 ; N uni0EA2 ; G 1371 +U 3747 ; WX 684 ; N uni0EA3 ; G 1372 +U 3749 ; WX 649 ; N uni0EA5 ; G 1373 +U 3751 ; WX 632 ; N uni0EA7 ; G 1374 +U 3754 ; WX 703 ; N uni0EAA ; G 1375 +U 3755 ; WX 819 ; N uni0EAB ; G 1376 +U 3757 ; WX 633 ; N uni0EAD ; G 1377 +U 3758 ; WX 684 ; N uni0EAE ; G 1378 +U 3759 ; WX 788 ; N uni0EAF ; G 1379 +U 3760 ; WX 632 ; N uni0EB0 ; G 1380 +U 3761 ; WX 0 ; N uni0EB1 ; G 1381 +U 3762 ; WX 539 ; N uni0EB2 ; G 1382 +U 3763 ; WX 539 ; N uni0EB3 ; G 1383 +U 3764 ; WX 0 ; N uni0EB4 ; G 1384 +U 3765 ; WX 0 ; N uni0EB5 ; G 1385 +U 3766 ; WX 0 ; N uni0EB6 ; G 1386 +U 3767 ; WX 0 ; N uni0EB7 ; G 1387 +U 3768 ; WX 0 ; N uni0EB8 ; G 1388 +U 3769 ; WX 0 ; N uni0EB9 ; G 1389 +U 3771 ; WX 0 ; N uni0EBB ; G 1390 +U 3772 ; WX 0 ; N uni0EBC ; G 1391 +U 3773 ; WX 663 ; N uni0EBD ; G 1392 +U 3776 ; WX 360 ; N uni0EC0 ; G 1393 +U 3777 ; WX 679 ; N uni0EC1 ; G 1394 +U 3778 ; WX 460 ; N uni0EC2 ; G 1395 +U 3779 ; WX 547 ; N uni0EC3 ; G 1396 +U 3780 ; WX 491 ; N uni0EC4 ; G 1397 +U 3782 ; WX 674 ; N uni0EC6 ; G 1398 +U 3784 ; WX 0 ; N uni0EC8 ; G 1399 +U 3785 ; WX 0 ; N uni0EC9 ; G 1400 +U 3786 ; WX 0 ; N uni0ECA ; G 1401 +U 3787 ; WX 0 ; N uni0ECB ; G 1402 +U 3788 ; WX 0 ; N uni0ECC ; G 1403 +U 3789 ; WX 0 ; N uni0ECD ; G 1404 +U 3792 ; WX 636 ; N uni0ED0 ; G 1405 +U 3793 ; WX 641 ; N uni0ED1 ; G 1406 +U 3794 ; WX 641 ; N uni0ED2 ; G 1407 +U 3795 ; WX 670 ; N uni0ED3 ; G 1408 +U 3796 ; WX 625 ; N uni0ED4 ; G 1409 +U 3797 ; WX 625 ; N uni0ED5 ; G 1410 +U 3798 ; WX 703 ; N uni0ED6 ; G 1411 +U 3799 ; WX 670 ; N uni0ED7 ; G 1412 +U 3800 ; WX 674 ; N uni0ED8 ; G 1413 +U 3801 ; WX 677 ; N uni0ED9 ; G 1414 +U 3804 ; WX 1028 ; N uni0EDC ; G 1415 +U 3805 ; WX 1028 ; N uni0EDD ; G 1416 +U 4256 ; WX 874 ; N uni10A0 ; G 1417 +U 4257 ; WX 733 ; N uni10A1 ; G 1418 +U 4258 ; WX 679 ; N uni10A2 ; G 1419 +U 4259 ; WX 834 ; N uni10A3 ; G 1420 +U 4260 ; WX 615 ; N uni10A4 ; G 1421 +U 4261 ; WX 768 ; N uni10A5 ; G 1422 +U 4262 ; WX 753 ; N uni10A6 ; G 1423 +U 4263 ; WX 914 ; N uni10A7 ; G 1424 +U 4264 ; WX 453 ; N uni10A8 ; G 1425 +U 4265 ; WX 620 ; N uni10A9 ; G 1426 +U 4266 ; WX 843 ; N uni10AA ; G 1427 +U 4267 ; WX 882 ; N uni10AB ; G 1428 +U 4268 ; WX 625 ; N uni10AC ; G 1429 +U 4269 ; WX 854 ; N uni10AD ; G 1430 +U 4270 ; WX 781 ; N uni10AE ; G 1431 +U 4271 ; WX 629 ; N uni10AF ; G 1432 +U 4272 ; WX 912 ; N uni10B0 ; G 1433 +U 4273 ; WX 621 ; N uni10B1 ; G 1434 +U 4274 ; WX 620 ; N uni10B2 ; G 1435 +U 4275 ; WX 854 ; N uni10B3 ; G 1436 +U 4276 ; WX 866 ; N uni10B4 ; G 1437 +U 4277 ; WX 724 ; N uni10B5 ; G 1438 +U 4278 ; WX 630 ; N uni10B6 ; G 1439 +U 4279 ; WX 621 ; N uni10B7 ; G 1440 +U 4280 ; WX 625 ; N uni10B8 ; G 1441 +U 4281 ; WX 620 ; N uni10B9 ; G 1442 +U 4282 ; WX 818 ; N uni10BA ; G 1443 +U 4283 ; WX 874 ; N uni10BB ; G 1444 +U 4284 ; WX 615 ; N uni10BC ; G 1445 +U 4285 ; WX 623 ; N uni10BD ; G 1446 +U 4286 ; WX 625 ; N uni10BE ; G 1447 +U 4287 ; WX 725 ; N uni10BF ; G 1448 +U 4288 ; WX 844 ; N uni10C0 ; G 1449 +U 4289 ; WX 596 ; N uni10C1 ; G 1450 +U 4290 ; WX 688 ; N uni10C2 ; G 1451 +U 4291 ; WX 596 ; N uni10C3 ; G 1452 +U 4292 ; WX 594 ; N uni10C4 ; G 1453 +U 4293 ; WX 738 ; N uni10C5 ; G 1454 +U 4304 ; WX 508 ; N uni10D0 ; G 1455 +U 4305 ; WX 518 ; N uni10D1 ; G 1456 +U 4306 ; WX 581 ; N uni10D2 ; G 1457 +U 4307 ; WX 818 ; N uni10D3 ; G 1458 +U 4308 ; WX 508 ; N uni10D4 ; G 1459 +U 4309 ; WX 513 ; N uni10D5 ; G 1460 +U 4310 ; WX 500 ; N uni10D6 ; G 1461 +U 4311 ; WX 801 ; N uni10D7 ; G 1462 +U 4312 ; WX 518 ; N uni10D8 ; G 1463 +U 4313 ; WX 510 ; N uni10D9 ; G 1464 +U 4314 ; WX 1064 ; N uni10DA ; G 1465 +U 4315 ; WX 522 ; N uni10DB ; G 1466 +U 4316 ; WX 522 ; N uni10DC ; G 1467 +U 4317 ; WX 786 ; N uni10DD ; G 1468 +U 4318 ; WX 508 ; N uni10DE ; G 1469 +U 4319 ; WX 518 ; N uni10DF ; G 1470 +U 4320 ; WX 796 ; N uni10E0 ; G 1471 +U 4321 ; WX 522 ; N uni10E1 ; G 1472 +U 4322 ; WX 654 ; N uni10E2 ; G 1473 +U 4323 ; WX 522 ; N uni10E3 ; G 1474 +U 4324 ; WX 825 ; N uni10E4 ; G 1475 +U 4325 ; WX 513 ; N uni10E5 ; G 1476 +U 4326 ; WX 786 ; N uni10E6 ; G 1477 +U 4327 ; WX 518 ; N uni10E7 ; G 1478 +U 4328 ; WX 518 ; N uni10E8 ; G 1479 +U 4329 ; WX 522 ; N uni10E9 ; G 1480 +U 4330 ; WX 571 ; N uni10EA ; G 1481 +U 4331 ; WX 522 ; N uni10EB ; G 1482 +U 4332 ; WX 518 ; N uni10EC ; G 1483 +U 4333 ; WX 520 ; N uni10ED ; G 1484 +U 4334 ; WX 522 ; N uni10EE ; G 1485 +U 4335 ; WX 454 ; N uni10EF ; G 1486 +U 4336 ; WX 508 ; N uni10F0 ; G 1487 +U 4337 ; WX 518 ; N uni10F1 ; G 1488 +U 4338 ; WX 508 ; N uni10F2 ; G 1489 +U 4339 ; WX 508 ; N uni10F3 ; G 1490 +U 4340 ; WX 518 ; N uni10F4 ; G 1491 +U 4341 ; WX 554 ; N uni10F5 ; G 1492 +U 4342 ; WX 828 ; N uni10F6 ; G 1493 +U 4343 ; WX 552 ; N uni10F7 ; G 1494 +U 4344 ; WX 508 ; N uni10F8 ; G 1495 +U 4345 ; WX 571 ; N uni10F9 ; G 1496 +U 4346 ; WX 508 ; N uni10FA ; G 1497 +U 4347 ; WX 448 ; N uni10FB ; G 1498 +U 4348 ; WX 324 ; N uni10FC ; G 1499 +U 5121 ; WX 684 ; N uni1401 ; G 1500 +U 5122 ; WX 684 ; N uni1402 ; G 1501 +U 5123 ; WX 684 ; N uni1403 ; G 1502 +U 5124 ; WX 684 ; N uni1404 ; G 1503 +U 5125 ; WX 769 ; N uni1405 ; G 1504 +U 5126 ; WX 769 ; N uni1406 ; G 1505 +U 5127 ; WX 769 ; N uni1407 ; G 1506 +U 5129 ; WX 769 ; N uni1409 ; G 1507 +U 5130 ; WX 769 ; N uni140A ; G 1508 +U 5131 ; WX 769 ; N uni140B ; G 1509 +U 5132 ; WX 835 ; N uni140C ; G 1510 +U 5133 ; WX 834 ; N uni140D ; G 1511 +U 5134 ; WX 835 ; N uni140E ; G 1512 +U 5135 ; WX 834 ; N uni140F ; G 1513 +U 5136 ; WX 835 ; N uni1410 ; G 1514 +U 5137 ; WX 834 ; N uni1411 ; G 1515 +U 5138 ; WX 967 ; N uni1412 ; G 1516 +U 5139 ; WX 1007 ; N uni1413 ; G 1517 +U 5140 ; WX 967 ; N uni1414 ; G 1518 +U 5141 ; WX 1007 ; N uni1415 ; G 1519 +U 5142 ; WX 769 ; N uni1416 ; G 1520 +U 5143 ; WX 967 ; N uni1417 ; G 1521 +U 5144 ; WX 1007 ; N uni1418 ; G 1522 +U 5145 ; WX 967 ; N uni1419 ; G 1523 +U 5146 ; WX 1007 ; N uni141A ; G 1524 +U 5147 ; WX 769 ; N uni141B ; G 1525 +U 5149 ; WX 256 ; N uni141D ; G 1526 +U 5150 ; WX 543 ; N uni141E ; G 1527 +U 5151 ; WX 423 ; N uni141F ; G 1528 +U 5152 ; WX 423 ; N uni1420 ; G 1529 +U 5153 ; WX 389 ; N uni1421 ; G 1530 +U 5154 ; WX 389 ; N uni1422 ; G 1531 +U 5155 ; WX 393 ; N uni1423 ; G 1532 +U 5156 ; WX 389 ; N uni1424 ; G 1533 +U 5157 ; WX 466 ; N uni1425 ; G 1534 +U 5158 ; WX 385 ; N uni1426 ; G 1535 +U 5159 ; WX 256 ; N uni1427 ; G 1536 +U 5160 ; WX 389 ; N uni1428 ; G 1537 +U 5161 ; WX 389 ; N uni1429 ; G 1538 +U 5162 ; WX 389 ; N uni142A ; G 1539 +U 5163 ; WX 1090 ; N uni142B ; G 1540 +U 5164 ; WX 909 ; N uni142C ; G 1541 +U 5165 ; WX 953 ; N uni142D ; G 1542 +U 5166 ; WX 1117 ; N uni142E ; G 1543 +U 5167 ; WX 684 ; N uni142F ; G 1544 +U 5168 ; WX 684 ; N uni1430 ; G 1545 +U 5169 ; WX 684 ; N uni1431 ; G 1546 +U 5170 ; WX 684 ; N uni1432 ; G 1547 +U 5171 ; WX 729 ; N uni1433 ; G 1548 +U 5172 ; WX 729 ; N uni1434 ; G 1549 +U 5173 ; WX 729 ; N uni1435 ; G 1550 +U 5175 ; WX 729 ; N uni1437 ; G 1551 +U 5176 ; WX 729 ; N uni1438 ; G 1552 +U 5177 ; WX 729 ; N uni1439 ; G 1553 +U 5178 ; WX 835 ; N uni143A ; G 1554 +U 5179 ; WX 684 ; N uni143B ; G 1555 +U 5180 ; WX 835 ; N uni143C ; G 1556 +U 5181 ; WX 834 ; N uni143D ; G 1557 +U 5182 ; WX 835 ; N uni143E ; G 1558 +U 5183 ; WX 834 ; N uni143F ; G 1559 +U 5184 ; WX 967 ; N uni1440 ; G 1560 +U 5185 ; WX 1007 ; N uni1441 ; G 1561 +U 5186 ; WX 967 ; N uni1442 ; G 1562 +U 5187 ; WX 1007 ; N uni1443 ; G 1563 +U 5188 ; WX 967 ; N uni1444 ; G 1564 +U 5189 ; WX 1007 ; N uni1445 ; G 1565 +U 5190 ; WX 967 ; N uni1446 ; G 1566 +U 5191 ; WX 1007 ; N uni1447 ; G 1567 +U 5192 ; WX 729 ; N uni1448 ; G 1568 +U 5193 ; WX 508 ; N uni1449 ; G 1569 +U 5194 ; WX 192 ; N uni144A ; G 1570 +U 5196 ; WX 732 ; N uni144C ; G 1571 +U 5197 ; WX 732 ; N uni144D ; G 1572 +U 5198 ; WX 732 ; N uni144E ; G 1573 +U 5199 ; WX 732 ; N uni144F ; G 1574 +U 5200 ; WX 730 ; N uni1450 ; G 1575 +U 5201 ; WX 730 ; N uni1451 ; G 1576 +U 5202 ; WX 730 ; N uni1452 ; G 1577 +U 5204 ; WX 730 ; N uni1454 ; G 1578 +U 5205 ; WX 730 ; N uni1455 ; G 1579 +U 5206 ; WX 730 ; N uni1456 ; G 1580 +U 5207 ; WX 921 ; N uni1457 ; G 1581 +U 5208 ; WX 889 ; N uni1458 ; G 1582 +U 5209 ; WX 921 ; N uni1459 ; G 1583 +U 5210 ; WX 889 ; N uni145A ; G 1584 +U 5211 ; WX 921 ; N uni145B ; G 1585 +U 5212 ; WX 889 ; N uni145C ; G 1586 +U 5213 ; WX 928 ; N uni145D ; G 1587 +U 5214 ; WX 900 ; N uni145E ; G 1588 +U 5215 ; WX 928 ; N uni145F ; G 1589 +U 5216 ; WX 900 ; N uni1460 ; G 1590 +U 5217 ; WX 947 ; N uni1461 ; G 1591 +U 5218 ; WX 900 ; N uni1462 ; G 1592 +U 5219 ; WX 947 ; N uni1463 ; G 1593 +U 5220 ; WX 900 ; N uni1464 ; G 1594 +U 5221 ; WX 947 ; N uni1465 ; G 1595 +U 5222 ; WX 434 ; N uni1466 ; G 1596 +U 5223 ; WX 877 ; N uni1467 ; G 1597 +U 5224 ; WX 877 ; N uni1468 ; G 1598 +U 5225 ; WX 866 ; N uni1469 ; G 1599 +U 5226 ; WX 890 ; N uni146A ; G 1600 +U 5227 ; WX 628 ; N uni146B ; G 1601 +U 5228 ; WX 628 ; N uni146C ; G 1602 +U 5229 ; WX 628 ; N uni146D ; G 1603 +U 5230 ; WX 628 ; N uni146E ; G 1604 +U 5231 ; WX 628 ; N uni146F ; G 1605 +U 5232 ; WX 628 ; N uni1470 ; G 1606 +U 5233 ; WX 628 ; N uni1471 ; G 1607 +U 5234 ; WX 628 ; N uni1472 ; G 1608 +U 5235 ; WX 628 ; N uni1473 ; G 1609 +U 5236 ; WX 860 ; N uni1474 ; G 1610 +U 5237 ; WX 771 ; N uni1475 ; G 1611 +U 5238 ; WX 815 ; N uni1476 ; G 1612 +U 5239 ; WX 816 ; N uni1477 ; G 1613 +U 5240 ; WX 815 ; N uni1478 ; G 1614 +U 5241 ; WX 816 ; N uni1479 ; G 1615 +U 5242 ; WX 860 ; N uni147A ; G 1616 +U 5243 ; WX 771 ; N uni147B ; G 1617 +U 5244 ; WX 860 ; N uni147C ; G 1618 +U 5245 ; WX 771 ; N uni147D ; G 1619 +U 5246 ; WX 815 ; N uni147E ; G 1620 +U 5247 ; WX 816 ; N uni147F ; G 1621 +U 5248 ; WX 815 ; N uni1480 ; G 1622 +U 5249 ; WX 816 ; N uni1481 ; G 1623 +U 5250 ; WX 815 ; N uni1482 ; G 1624 +U 5251 ; WX 407 ; N uni1483 ; G 1625 +U 5252 ; WX 407 ; N uni1484 ; G 1626 +U 5253 ; WX 750 ; N uni1485 ; G 1627 +U 5254 ; WX 775 ; N uni1486 ; G 1628 +U 5255 ; WX 750 ; N uni1487 ; G 1629 +U 5256 ; WX 775 ; N uni1488 ; G 1630 +U 5257 ; WX 628 ; N uni1489 ; G 1631 +U 5258 ; WX 628 ; N uni148A ; G 1632 +U 5259 ; WX 628 ; N uni148B ; G 1633 +U 5260 ; WX 628 ; N uni148C ; G 1634 +U 5261 ; WX 628 ; N uni148D ; G 1635 +U 5262 ; WX 628 ; N uni148E ; G 1636 +U 5263 ; WX 628 ; N uni148F ; G 1637 +U 5264 ; WX 628 ; N uni1490 ; G 1638 +U 5265 ; WX 628 ; N uni1491 ; G 1639 +U 5266 ; WX 860 ; N uni1492 ; G 1640 +U 5267 ; WX 771 ; N uni1493 ; G 1641 +U 5268 ; WX 815 ; N uni1494 ; G 1642 +U 5269 ; WX 816 ; N uni1495 ; G 1643 +U 5270 ; WX 815 ; N uni1496 ; G 1644 +U 5271 ; WX 816 ; N uni1497 ; G 1645 +U 5272 ; WX 860 ; N uni1498 ; G 1646 +U 5273 ; WX 771 ; N uni1499 ; G 1647 +U 5274 ; WX 860 ; N uni149A ; G 1648 +U 5275 ; WX 771 ; N uni149B ; G 1649 +U 5276 ; WX 815 ; N uni149C ; G 1650 +U 5277 ; WX 816 ; N uni149D ; G 1651 +U 5278 ; WX 815 ; N uni149E ; G 1652 +U 5279 ; WX 816 ; N uni149F ; G 1653 +U 5280 ; WX 815 ; N uni14A0 ; G 1654 +U 5281 ; WX 435 ; N uni14A1 ; G 1655 +U 5282 ; WX 435 ; N uni14A2 ; G 1656 +U 5283 ; WX 610 ; N uni14A3 ; G 1657 +U 5284 ; WX 557 ; N uni14A4 ; G 1658 +U 5285 ; WX 557 ; N uni14A5 ; G 1659 +U 5286 ; WX 557 ; N uni14A6 ; G 1660 +U 5287 ; WX 610 ; N uni14A7 ; G 1661 +U 5288 ; WX 610 ; N uni14A8 ; G 1662 +U 5289 ; WX 610 ; N uni14A9 ; G 1663 +U 5290 ; WX 557 ; N uni14AA ; G 1664 +U 5291 ; WX 557 ; N uni14AB ; G 1665 +U 5292 ; WX 749 ; N uni14AC ; G 1666 +U 5293 ; WX 769 ; N uni14AD ; G 1667 +U 5294 ; WX 746 ; N uni14AE ; G 1668 +U 5295 ; WX 764 ; N uni14AF ; G 1669 +U 5296 ; WX 746 ; N uni14B0 ; G 1670 +U 5297 ; WX 764 ; N uni14B1 ; G 1671 +U 5298 ; WX 749 ; N uni14B2 ; G 1672 +U 5299 ; WX 769 ; N uni14B3 ; G 1673 +U 5300 ; WX 749 ; N uni14B4 ; G 1674 +U 5301 ; WX 769 ; N uni14B5 ; G 1675 +U 5302 ; WX 746 ; N uni14B6 ; G 1676 +U 5303 ; WX 764 ; N uni14B7 ; G 1677 +U 5304 ; WX 746 ; N uni14B8 ; G 1678 +U 5305 ; WX 764 ; N uni14B9 ; G 1679 +U 5306 ; WX 746 ; N uni14BA ; G 1680 +U 5307 ; WX 386 ; N uni14BB ; G 1681 +U 5308 ; WX 508 ; N uni14BC ; G 1682 +U 5309 ; WX 386 ; N uni14BD ; G 1683 +U 5312 ; WX 852 ; N uni14C0 ; G 1684 +U 5313 ; WX 852 ; N uni14C1 ; G 1685 +U 5314 ; WX 852 ; N uni14C2 ; G 1686 +U 5315 ; WX 852 ; N uni14C3 ; G 1687 +U 5316 ; WX 852 ; N uni14C4 ; G 1688 +U 5317 ; WX 852 ; N uni14C5 ; G 1689 +U 5318 ; WX 852 ; N uni14C6 ; G 1690 +U 5319 ; WX 852 ; N uni14C7 ; G 1691 +U 5320 ; WX 852 ; N uni14C8 ; G 1692 +U 5321 ; WX 1069 ; N uni14C9 ; G 1693 +U 5322 ; WX 1035 ; N uni14CA ; G 1694 +U 5323 ; WX 1059 ; N uni14CB ; G 1695 +U 5324 ; WX 852 ; N uni14CC ; G 1696 +U 5325 ; WX 1059 ; N uni14CD ; G 1697 +U 5326 ; WX 852 ; N uni14CE ; G 1698 +U 5327 ; WX 852 ; N uni14CF ; G 1699 +U 5328 ; WX 600 ; N uni14D0 ; G 1700 +U 5329 ; WX 453 ; N uni14D1 ; G 1701 +U 5330 ; WX 600 ; N uni14D2 ; G 1702 +U 5331 ; WX 852 ; N uni14D3 ; G 1703 +U 5332 ; WX 852 ; N uni14D4 ; G 1704 +U 5333 ; WX 852 ; N uni14D5 ; G 1705 +U 5334 ; WX 852 ; N uni14D6 ; G 1706 +U 5335 ; WX 852 ; N uni14D7 ; G 1707 +U 5336 ; WX 852 ; N uni14D8 ; G 1708 +U 5337 ; WX 852 ; N uni14D9 ; G 1709 +U 5338 ; WX 852 ; N uni14DA ; G 1710 +U 5339 ; WX 852 ; N uni14DB ; G 1711 +U 5340 ; WX 1069 ; N uni14DC ; G 1712 +U 5341 ; WX 1035 ; N uni14DD ; G 1713 +U 5342 ; WX 1059 ; N uni14DE ; G 1714 +U 5343 ; WX 1030 ; N uni14DF ; G 1715 +U 5344 ; WX 1059 ; N uni14E0 ; G 1716 +U 5345 ; WX 1030 ; N uni14E1 ; G 1717 +U 5346 ; WX 1069 ; N uni14E2 ; G 1718 +U 5347 ; WX 1035 ; N uni14E3 ; G 1719 +U 5348 ; WX 1069 ; N uni14E4 ; G 1720 +U 5349 ; WX 1035 ; N uni14E5 ; G 1721 +U 5350 ; WX 1083 ; N uni14E6 ; G 1722 +U 5351 ; WX 1030 ; N uni14E7 ; G 1723 +U 5352 ; WX 1083 ; N uni14E8 ; G 1724 +U 5353 ; WX 1030 ; N uni14E9 ; G 1725 +U 5354 ; WX 600 ; N uni14EA ; G 1726 +U 5356 ; WX 729 ; N uni14EC ; G 1727 +U 5357 ; WX 603 ; N uni14ED ; G 1728 +U 5358 ; WX 603 ; N uni14EE ; G 1729 +U 5359 ; WX 603 ; N uni14EF ; G 1730 +U 5360 ; WX 603 ; N uni14F0 ; G 1731 +U 5361 ; WX 603 ; N uni14F1 ; G 1732 +U 5362 ; WX 603 ; N uni14F2 ; G 1733 +U 5363 ; WX 603 ; N uni14F3 ; G 1734 +U 5364 ; WX 603 ; N uni14F4 ; G 1735 +U 5365 ; WX 603 ; N uni14F5 ; G 1736 +U 5366 ; WX 834 ; N uni14F6 ; G 1737 +U 5367 ; WX 754 ; N uni14F7 ; G 1738 +U 5368 ; WX 792 ; N uni14F8 ; G 1739 +U 5369 ; WX 771 ; N uni14F9 ; G 1740 +U 5370 ; WX 792 ; N uni14FA ; G 1741 +U 5371 ; WX 771 ; N uni14FB ; G 1742 +U 5372 ; WX 834 ; N uni14FC ; G 1743 +U 5373 ; WX 754 ; N uni14FD ; G 1744 +U 5374 ; WX 834 ; N uni14FE ; G 1745 +U 5375 ; WX 754 ; N uni14FF ; G 1746 +U 5376 ; WX 792 ; N uni1500 ; G 1747 +U 5377 ; WX 771 ; N uni1501 ; G 1748 +U 5378 ; WX 792 ; N uni1502 ; G 1749 +U 5379 ; WX 771 ; N uni1503 ; G 1750 +U 5380 ; WX 792 ; N uni1504 ; G 1751 +U 5381 ; WX 418 ; N uni1505 ; G 1752 +U 5382 ; WX 420 ; N uni1506 ; G 1753 +U 5383 ; WX 418 ; N uni1507 ; G 1754 +U 5392 ; WX 712 ; N uni1510 ; G 1755 +U 5393 ; WX 712 ; N uni1511 ; G 1756 +U 5394 ; WX 712 ; N uni1512 ; G 1757 +U 5395 ; WX 892 ; N uni1513 ; G 1758 +U 5396 ; WX 892 ; N uni1514 ; G 1759 +U 5397 ; WX 892 ; N uni1515 ; G 1760 +U 5398 ; WX 892 ; N uni1516 ; G 1761 +U 5399 ; WX 910 ; N uni1517 ; G 1762 +U 5400 ; WX 872 ; N uni1518 ; G 1763 +U 5401 ; WX 910 ; N uni1519 ; G 1764 +U 5402 ; WX 872 ; N uni151A ; G 1765 +U 5403 ; WX 910 ; N uni151B ; G 1766 +U 5404 ; WX 872 ; N uni151C ; G 1767 +U 5405 ; WX 1140 ; N uni151D ; G 1768 +U 5406 ; WX 1100 ; N uni151E ; G 1769 +U 5407 ; WX 1140 ; N uni151F ; G 1770 +U 5408 ; WX 1100 ; N uni1520 ; G 1771 +U 5409 ; WX 1140 ; N uni1521 ; G 1772 +U 5410 ; WX 1100 ; N uni1522 ; G 1773 +U 5411 ; WX 1140 ; N uni1523 ; G 1774 +U 5412 ; WX 1100 ; N uni1524 ; G 1775 +U 5413 ; WX 641 ; N uni1525 ; G 1776 +U 5414 ; WX 627 ; N uni1526 ; G 1777 +U 5415 ; WX 627 ; N uni1527 ; G 1778 +U 5416 ; WX 627 ; N uni1528 ; G 1779 +U 5417 ; WX 627 ; N uni1529 ; G 1780 +U 5418 ; WX 627 ; N uni152A ; G 1781 +U 5419 ; WX 627 ; N uni152B ; G 1782 +U 5420 ; WX 627 ; N uni152C ; G 1783 +U 5421 ; WX 627 ; N uni152D ; G 1784 +U 5422 ; WX 627 ; N uni152E ; G 1785 +U 5423 ; WX 844 ; N uni152F ; G 1786 +U 5424 ; WX 781 ; N uni1530 ; G 1787 +U 5425 ; WX 816 ; N uni1531 ; G 1788 +U 5426 ; WX 818 ; N uni1532 ; G 1789 +U 5427 ; WX 816 ; N uni1533 ; G 1790 +U 5428 ; WX 818 ; N uni1534 ; G 1791 +U 5429 ; WX 844 ; N uni1535 ; G 1792 +U 5430 ; WX 781 ; N uni1536 ; G 1793 +U 5431 ; WX 844 ; N uni1537 ; G 1794 +U 5432 ; WX 781 ; N uni1538 ; G 1795 +U 5433 ; WX 816 ; N uni1539 ; G 1796 +U 5434 ; WX 818 ; N uni153A ; G 1797 +U 5435 ; WX 816 ; N uni153B ; G 1798 +U 5436 ; WX 818 ; N uni153C ; G 1799 +U 5437 ; WX 816 ; N uni153D ; G 1800 +U 5438 ; WX 418 ; N uni153E ; G 1801 +U 5440 ; WX 389 ; N uni1540 ; G 1802 +U 5441 ; WX 484 ; N uni1541 ; G 1803 +U 5442 ; WX 916 ; N uni1542 ; G 1804 +U 5443 ; WX 916 ; N uni1543 ; G 1805 +U 5444 ; WX 863 ; N uni1544 ; G 1806 +U 5445 ; WX 916 ; N uni1545 ; G 1807 +U 5446 ; WX 863 ; N uni1546 ; G 1808 +U 5447 ; WX 863 ; N uni1547 ; G 1809 +U 5448 ; WX 603 ; N uni1548 ; G 1810 +U 5449 ; WX 603 ; N uni1549 ; G 1811 +U 5450 ; WX 603 ; N uni154A ; G 1812 +U 5451 ; WX 603 ; N uni154B ; G 1813 +U 5452 ; WX 603 ; N uni154C ; G 1814 +U 5453 ; WX 603 ; N uni154D ; G 1815 +U 5454 ; WX 834 ; N uni154E ; G 1816 +U 5455 ; WX 754 ; N uni154F ; G 1817 +U 5456 ; WX 418 ; N uni1550 ; G 1818 +U 5458 ; WX 729 ; N uni1552 ; G 1819 +U 5459 ; WX 684 ; N uni1553 ; G 1820 +U 5460 ; WX 684 ; N uni1554 ; G 1821 +U 5461 ; WX 684 ; N uni1555 ; G 1822 +U 5462 ; WX 684 ; N uni1556 ; G 1823 +U 5463 ; WX 726 ; N uni1557 ; G 1824 +U 5464 ; WX 726 ; N uni1558 ; G 1825 +U 5465 ; WX 726 ; N uni1559 ; G 1826 +U 5466 ; WX 726 ; N uni155A ; G 1827 +U 5467 ; WX 924 ; N uni155B ; G 1828 +U 5468 ; WX 1007 ; N uni155C ; G 1829 +U 5469 ; WX 508 ; N uni155D ; G 1830 +U 5470 ; WX 732 ; N uni155E ; G 1831 +U 5471 ; WX 732 ; N uni155F ; G 1832 +U 5472 ; WX 732 ; N uni1560 ; G 1833 +U 5473 ; WX 732 ; N uni1561 ; G 1834 +U 5474 ; WX 732 ; N uni1562 ; G 1835 +U 5475 ; WX 732 ; N uni1563 ; G 1836 +U 5476 ; WX 730 ; N uni1564 ; G 1837 +U 5477 ; WX 730 ; N uni1565 ; G 1838 +U 5478 ; WX 730 ; N uni1566 ; G 1839 +U 5479 ; WX 730 ; N uni1567 ; G 1840 +U 5480 ; WX 947 ; N uni1568 ; G 1841 +U 5481 ; WX 900 ; N uni1569 ; G 1842 +U 5482 ; WX 508 ; N uni156A ; G 1843 +U 5492 ; WX 831 ; N uni1574 ; G 1844 +U 5493 ; WX 831 ; N uni1575 ; G 1845 +U 5494 ; WX 831 ; N uni1576 ; G 1846 +U 5495 ; WX 831 ; N uni1577 ; G 1847 +U 5496 ; WX 831 ; N uni1578 ; G 1848 +U 5497 ; WX 831 ; N uni1579 ; G 1849 +U 5498 ; WX 831 ; N uni157A ; G 1850 +U 5499 ; WX 563 ; N uni157B ; G 1851 +U 5500 ; WX 752 ; N uni157C ; G 1852 +U 5501 ; WX 484 ; N uni157D ; G 1853 +U 5502 ; WX 1047 ; N uni157E ; G 1854 +U 5503 ; WX 1047 ; N uni157F ; G 1855 +U 5504 ; WX 1047 ; N uni1580 ; G 1856 +U 5505 ; WX 1047 ; N uni1581 ; G 1857 +U 5506 ; WX 1047 ; N uni1582 ; G 1858 +U 5507 ; WX 1047 ; N uni1583 ; G 1859 +U 5508 ; WX 1047 ; N uni1584 ; G 1860 +U 5509 ; WX 825 ; N uni1585 ; G 1861 +U 5514 ; WX 831 ; N uni158A ; G 1862 +U 5515 ; WX 831 ; N uni158B ; G 1863 +U 5516 ; WX 831 ; N uni158C ; G 1864 +U 5517 ; WX 831 ; N uni158D ; G 1865 +U 5518 ; WX 1259 ; N uni158E ; G 1866 +U 5519 ; WX 1259 ; N uni158F ; G 1867 +U 5520 ; WX 1259 ; N uni1590 ; G 1868 +U 5521 ; WX 1002 ; N uni1591 ; G 1869 +U 5522 ; WX 1002 ; N uni1592 ; G 1870 +U 5523 ; WX 1259 ; N uni1593 ; G 1871 +U 5524 ; WX 1259 ; N uni1594 ; G 1872 +U 5525 ; WX 700 ; N uni1595 ; G 1873 +U 5526 ; WX 1073 ; N uni1596 ; G 1874 +U 5536 ; WX 852 ; N uni15A0 ; G 1875 +U 5537 ; WX 852 ; N uni15A1 ; G 1876 +U 5538 ; WX 799 ; N uni15A2 ; G 1877 +U 5539 ; WX 799 ; N uni15A3 ; G 1878 +U 5540 ; WX 799 ; N uni15A4 ; G 1879 +U 5541 ; WX 799 ; N uni15A5 ; G 1880 +U 5542 ; WX 600 ; N uni15A6 ; G 1881 +U 5543 ; WX 643 ; N uni15A7 ; G 1882 +U 5544 ; WX 643 ; N uni15A8 ; G 1883 +U 5545 ; WX 643 ; N uni15A9 ; G 1884 +U 5546 ; WX 643 ; N uni15AA ; G 1885 +U 5547 ; WX 643 ; N uni15AB ; G 1886 +U 5548 ; WX 643 ; N uni15AC ; G 1887 +U 5549 ; WX 643 ; N uni15AD ; G 1888 +U 5550 ; WX 418 ; N uni15AE ; G 1889 +U 5551 ; WX 628 ; N uni15AF ; G 1890 +U 5598 ; WX 770 ; N uni15DE ; G 1891 +U 5601 ; WX 770 ; N uni15E1 ; G 1892 +U 5702 ; WX 468 ; N uni1646 ; G 1893 +U 5703 ; WX 468 ; N uni1647 ; G 1894 +U 5742 ; WX 444 ; N uni166E ; G 1895 +U 5743 ; WX 1047 ; N uni166F ; G 1896 +U 5744 ; WX 1310 ; N uni1670 ; G 1897 +U 5745 ; WX 1632 ; N uni1671 ; G 1898 +U 5746 ; WX 1632 ; N uni1672 ; G 1899 +U 5747 ; WX 1375 ; N uni1673 ; G 1900 +U 5748 ; WX 1375 ; N uni1674 ; G 1901 +U 5749 ; WX 1632 ; N uni1675 ; G 1902 +U 5750 ; WX 1632 ; N uni1676 ; G 1903 +U 7424 ; WX 592 ; N uni1D00 ; G 1904 +U 7425 ; WX 717 ; N uni1D01 ; G 1905 +U 7426 ; WX 982 ; N uni1D02 ; G 1906 +U 7427 ; WX 586 ; N uni1D03 ; G 1907 +U 7428 ; WX 550 ; N uni1D04 ; G 1908 +U 7429 ; WX 605 ; N uni1D05 ; G 1909 +U 7430 ; WX 605 ; N uni1D06 ; G 1910 +U 7431 ; WX 491 ; N uni1D07 ; G 1911 +U 7432 ; WX 541 ; N uni1D08 ; G 1912 +U 7433 ; WX 278 ; N uni1D09 ; G 1913 +U 7434 ; WX 395 ; N uni1D0A ; G 1914 +U 7435 ; WX 579 ; N uni1D0B ; G 1915 +U 7436 ; WX 583 ; N uni1D0C ; G 1916 +U 7437 ; WX 754 ; N uni1D0D ; G 1917 +U 7438 ; WX 650 ; N uni1D0E ; G 1918 +U 7439 ; WX 612 ; N uni1D0F ; G 1919 +U 7440 ; WX 550 ; N uni1D10 ; G 1920 +U 7441 ; WX 684 ; N uni1D11 ; G 1921 +U 7442 ; WX 684 ; N uni1D12 ; G 1922 +U 7443 ; WX 684 ; N uni1D13 ; G 1923 +U 7444 ; WX 1023 ; N uni1D14 ; G 1924 +U 7446 ; WX 612 ; N uni1D16 ; G 1925 +U 7447 ; WX 612 ; N uni1D17 ; G 1926 +U 7448 ; WX 524 ; N uni1D18 ; G 1927 +U 7449 ; WX 602 ; N uni1D19 ; G 1928 +U 7450 ; WX 602 ; N uni1D1A ; G 1929 +U 7451 ; WX 583 ; N uni1D1B ; G 1930 +U 7452 ; WX 574 ; N uni1D1C ; G 1931 +U 7453 ; WX 737 ; N uni1D1D ; G 1932 +U 7454 ; WX 948 ; N uni1D1E ; G 1933 +U 7455 ; WX 638 ; N uni1D1F ; G 1934 +U 7456 ; WX 592 ; N uni1D20 ; G 1935 +U 7457 ; WX 818 ; N uni1D21 ; G 1936 +U 7458 ; WX 525 ; N uni1D22 ; G 1937 +U 7459 ; WX 526 ; N uni1D23 ; G 1938 +U 7462 ; WX 583 ; N uni1D26 ; G 1939 +U 7463 ; WX 592 ; N uni1D27 ; G 1940 +U 7464 ; WX 564 ; N uni1D28 ; G 1941 +U 7465 ; WX 524 ; N uni1D29 ; G 1942 +U 7466 ; WX 590 ; N uni1D2A ; G 1943 +U 7467 ; WX 639 ; N uni1D2B ; G 1944 +U 7468 ; WX 431 ; N uni1D2C ; G 1945 +U 7469 ; WX 613 ; N uni1D2D ; G 1946 +U 7470 ; WX 432 ; N uni1D2E ; G 1947 +U 7472 ; WX 485 ; N uni1D30 ; G 1948 +U 7473 ; WX 398 ; N uni1D31 ; G 1949 +U 7474 ; WX 398 ; N uni1D32 ; G 1950 +U 7475 ; WX 488 ; N uni1D33 ; G 1951 +U 7476 ; WX 474 ; N uni1D34 ; G 1952 +U 7477 ; WX 186 ; N uni1D35 ; G 1953 +U 7478 ; WX 186 ; N uni1D36 ; G 1954 +U 7479 ; WX 413 ; N uni1D37 ; G 1955 +U 7480 ; WX 351 ; N uni1D38 ; G 1956 +U 7481 ; WX 543 ; N uni1D39 ; G 1957 +U 7482 ; WX 471 ; N uni1D3A ; G 1958 +U 7483 ; WX 471 ; N uni1D3B ; G 1959 +U 7484 ; WX 496 ; N uni1D3C ; G 1960 +U 7485 ; WX 439 ; N uni1D3D ; G 1961 +U 7486 ; WX 380 ; N uni1D3E ; G 1962 +U 7487 ; WX 438 ; N uni1D3F ; G 1963 +U 7488 ; WX 385 ; N uni1D40 ; G 1964 +U 7489 ; WX 461 ; N uni1D41 ; G 1965 +U 7490 ; WX 623 ; N uni1D42 ; G 1966 +U 7491 ; WX 392 ; N uni1D43 ; G 1967 +U 7492 ; WX 392 ; N uni1D44 ; G 1968 +U 7493 ; WX 405 ; N uni1D45 ; G 1969 +U 7494 ; WX 648 ; N uni1D46 ; G 1970 +U 7495 ; WX 428 ; N uni1D47 ; G 1971 +U 7496 ; WX 405 ; N uni1D48 ; G 1972 +U 7497 ; WX 417 ; N uni1D49 ; G 1973 +U 7498 ; WX 417 ; N uni1D4A ; G 1974 +U 7499 ; WX 360 ; N uni1D4B ; G 1975 +U 7500 ; WX 359 ; N uni1D4C ; G 1976 +U 7501 ; WX 405 ; N uni1D4D ; G 1977 +U 7502 ; WX 179 ; N uni1D4E ; G 1978 +U 7503 ; WX 426 ; N uni1D4F ; G 1979 +U 7504 ; WX 623 ; N uni1D50 ; G 1980 +U 7505 ; WX 409 ; N uni1D51 ; G 1981 +U 7506 ; WX 414 ; N uni1D52 ; G 1982 +U 7507 ; WX 370 ; N uni1D53 ; G 1983 +U 7508 ; WX 414 ; N uni1D54 ; G 1984 +U 7509 ; WX 414 ; N uni1D55 ; G 1985 +U 7510 ; WX 428 ; N uni1D56 ; G 1986 +U 7511 ; WX 295 ; N uni1D57 ; G 1987 +U 7512 ; WX 405 ; N uni1D58 ; G 1988 +U 7513 ; WX 470 ; N uni1D59 ; G 1989 +U 7514 ; WX 623 ; N uni1D5A ; G 1990 +U 7515 ; WX 417 ; N uni1D5B ; G 1991 +U 7517 ; WX 402 ; N uni1D5D ; G 1992 +U 7518 ; WX 373 ; N uni1D5E ; G 1993 +U 7519 ; WX 385 ; N uni1D5F ; G 1994 +U 7520 ; WX 416 ; N uni1D60 ; G 1995 +U 7521 ; WX 364 ; N uni1D61 ; G 1996 +U 7522 ; WX 179 ; N uni1D62 ; G 1997 +U 7523 ; WX 259 ; N uni1D63 ; G 1998 +U 7524 ; WX 405 ; N uni1D64 ; G 1999 +U 7525 ; WX 417 ; N uni1D65 ; G 2000 +U 7526 ; WX 402 ; N uni1D66 ; G 2001 +U 7527 ; WX 373 ; N uni1D67 ; G 2002 +U 7528 ; WX 412 ; N uni1D68 ; G 2003 +U 7529 ; WX 416 ; N uni1D69 ; G 2004 +U 7530 ; WX 364 ; N uni1D6A ; G 2005 +U 7543 ; WX 635 ; N uni1D77 ; G 2006 +U 7544 ; WX 474 ; N uni1D78 ; G 2007 +U 7547 ; WX 372 ; N uni1D7B ; G 2008 +U 7549 ; WX 667 ; N uni1D7D ; G 2009 +U 7557 ; WX 278 ; N uni1D85 ; G 2010 +U 7579 ; WX 405 ; N uni1D9B ; G 2011 +U 7580 ; WX 370 ; N uni1D9C ; G 2012 +U 7581 ; WX 370 ; N uni1D9D ; G 2013 +U 7582 ; WX 414 ; N uni1D9E ; G 2014 +U 7583 ; WX 360 ; N uni1D9F ; G 2015 +U 7584 ; WX 296 ; N uni1DA0 ; G 2016 +U 7585 ; WX 233 ; N uni1DA1 ; G 2017 +U 7586 ; WX 405 ; N uni1DA2 ; G 2018 +U 7587 ; WX 405 ; N uni1DA3 ; G 2019 +U 7588 ; WX 261 ; N uni1DA4 ; G 2020 +U 7589 ; WX 250 ; N uni1DA5 ; G 2021 +U 7590 ; WX 261 ; N uni1DA6 ; G 2022 +U 7591 ; WX 261 ; N uni1DA7 ; G 2023 +U 7592 ; WX 234 ; N uni1DA8 ; G 2024 +U 7593 ; WX 250 ; N uni1DA9 ; G 2025 +U 7594 ; WX 235 ; N uni1DAA ; G 2026 +U 7595 ; WX 376 ; N uni1DAB ; G 2027 +U 7596 ; WX 623 ; N uni1DAC ; G 2028 +U 7597 ; WX 623 ; N uni1DAD ; G 2029 +U 7598 ; WX 411 ; N uni1DAE ; G 2030 +U 7599 ; WX 479 ; N uni1DAF ; G 2031 +U 7600 ; WX 409 ; N uni1DB0 ; G 2032 +U 7601 ; WX 414 ; N uni1DB1 ; G 2033 +U 7602 ; WX 414 ; N uni1DB2 ; G 2034 +U 7603 ; WX 360 ; N uni1DB3 ; G 2035 +U 7604 ; WX 287 ; N uni1DB4 ; G 2036 +U 7605 ; WX 295 ; N uni1DB5 ; G 2037 +U 7606 ; WX 508 ; N uni1DB6 ; G 2038 +U 7607 ; WX 418 ; N uni1DB7 ; G 2039 +U 7608 ; WX 361 ; N uni1DB8 ; G 2040 +U 7609 ; WX 406 ; N uni1DB9 ; G 2041 +U 7610 ; WX 417 ; N uni1DBA ; G 2042 +U 7611 ; WX 366 ; N uni1DBB ; G 2043 +U 7612 ; WX 437 ; N uni1DBC ; G 2044 +U 7613 ; WX 366 ; N uni1DBD ; G 2045 +U 7614 ; WX 392 ; N uni1DBE ; G 2046 +U 7615 ; WX 414 ; N uni1DBF ; G 2047 +U 7620 ; WX 0 ; N uni1DC4 ; G 2048 +U 7621 ; WX 0 ; N uni1DC5 ; G 2049 +U 7622 ; WX 0 ; N uni1DC6 ; G 2050 +U 7623 ; WX 0 ; N uni1DC7 ; G 2051 +U 7624 ; WX 0 ; N uni1DC8 ; G 2052 +U 7625 ; WX 0 ; N uni1DC9 ; G 2053 +U 7680 ; WX 684 ; N uni1E00 ; G 2054 +U 7681 ; WX 613 ; N uni1E01 ; G 2055 +U 7682 ; WX 686 ; N uni1E02 ; G 2056 +U 7683 ; WX 635 ; N uni1E03 ; G 2057 +U 7684 ; WX 686 ; N uni1E04 ; G 2058 +U 7685 ; WX 635 ; N uni1E05 ; G 2059 +U 7686 ; WX 686 ; N uni1E06 ; G 2060 +U 7687 ; WX 635 ; N uni1E07 ; G 2061 +U 7688 ; WX 698 ; N uni1E08 ; G 2062 +U 7689 ; WX 550 ; N uni1E09 ; G 2063 +U 7690 ; WX 770 ; N uni1E0A ; G 2064 +U 7691 ; WX 635 ; N uni1E0B ; G 2065 +U 7692 ; WX 770 ; N uni1E0C ; G 2066 +U 7693 ; WX 635 ; N uni1E0D ; G 2067 +U 7694 ; WX 770 ; N uni1E0E ; G 2068 +U 7695 ; WX 635 ; N uni1E0F ; G 2069 +U 7696 ; WX 770 ; N uni1E10 ; G 2070 +U 7697 ; WX 635 ; N uni1E11 ; G 2071 +U 7698 ; WX 770 ; N uni1E12 ; G 2072 +U 7699 ; WX 635 ; N uni1E13 ; G 2073 +U 7700 ; WX 632 ; N uni1E14 ; G 2074 +U 7701 ; WX 615 ; N uni1E15 ; G 2075 +U 7702 ; WX 632 ; N uni1E16 ; G 2076 +U 7703 ; WX 615 ; N uni1E17 ; G 2077 +U 7704 ; WX 632 ; N uni1E18 ; G 2078 +U 7705 ; WX 615 ; N uni1E19 ; G 2079 +U 7706 ; WX 632 ; N uni1E1A ; G 2080 +U 7707 ; WX 615 ; N uni1E1B ; G 2081 +U 7708 ; WX 632 ; N uni1E1C ; G 2082 +U 7709 ; WX 615 ; N uni1E1D ; G 2083 +U 7710 ; WX 575 ; N uni1E1E ; G 2084 +U 7711 ; WX 352 ; N uni1E1F ; G 2085 +U 7712 ; WX 775 ; N uni1E20 ; G 2086 +U 7713 ; WX 635 ; N uni1E21 ; G 2087 +U 7714 ; WX 752 ; N uni1E22 ; G 2088 +U 7715 ; WX 634 ; N uni1E23 ; G 2089 +U 7716 ; WX 752 ; N uni1E24 ; G 2090 +U 7717 ; WX 634 ; N uni1E25 ; G 2091 +U 7718 ; WX 752 ; N uni1E26 ; G 2092 +U 7719 ; WX 634 ; N uni1E27 ; G 2093 +U 7720 ; WX 752 ; N uni1E28 ; G 2094 +U 7721 ; WX 634 ; N uni1E29 ; G 2095 +U 7722 ; WX 752 ; N uni1E2A ; G 2096 +U 7723 ; WX 634 ; N uni1E2B ; G 2097 +U 7724 ; WX 295 ; N uni1E2C ; G 2098 +U 7725 ; WX 278 ; N uni1E2D ; G 2099 +U 7726 ; WX 295 ; N uni1E2E ; G 2100 +U 7727 ; WX 278 ; N uni1E2F ; G 2101 +U 7728 ; WX 656 ; N uni1E30 ; G 2102 +U 7729 ; WX 579 ; N uni1E31 ; G 2103 +U 7730 ; WX 656 ; N uni1E32 ; G 2104 +U 7731 ; WX 579 ; N uni1E33 ; G 2105 +U 7732 ; WX 656 ; N uni1E34 ; G 2106 +U 7733 ; WX 579 ; N uni1E35 ; G 2107 +U 7734 ; WX 557 ; N uni1E36 ; G 2108 +U 7735 ; WX 278 ; N uni1E37 ; G 2109 +U 7736 ; WX 557 ; N uni1E38 ; G 2110 +U 7737 ; WX 278 ; N uni1E39 ; G 2111 +U 7738 ; WX 557 ; N uni1E3A ; G 2112 +U 7739 ; WX 278 ; N uni1E3B ; G 2113 +U 7740 ; WX 557 ; N uni1E3C ; G 2114 +U 7741 ; WX 278 ; N uni1E3D ; G 2115 +U 7742 ; WX 863 ; N uni1E3E ; G 2116 +U 7743 ; WX 974 ; N uni1E3F ; G 2117 +U 7744 ; WX 863 ; N uni1E40 ; G 2118 +U 7745 ; WX 974 ; N uni1E41 ; G 2119 +U 7746 ; WX 863 ; N uni1E42 ; G 2120 +U 7747 ; WX 974 ; N uni1E43 ; G 2121 +U 7748 ; WX 748 ; N uni1E44 ; G 2122 +U 7749 ; WX 634 ; N uni1E45 ; G 2123 +U 7750 ; WX 748 ; N uni1E46 ; G 2124 +U 7751 ; WX 634 ; N uni1E47 ; G 2125 +U 7752 ; WX 748 ; N uni1E48 ; G 2126 +U 7753 ; WX 634 ; N uni1E49 ; G 2127 +U 7754 ; WX 748 ; N uni1E4A ; G 2128 +U 7755 ; WX 634 ; N uni1E4B ; G 2129 +U 7756 ; WX 787 ; N uni1E4C ; G 2130 +U 7757 ; WX 612 ; N uni1E4D ; G 2131 +U 7758 ; WX 787 ; N uni1E4E ; G 2132 +U 7759 ; WX 612 ; N uni1E4F ; G 2133 +U 7760 ; WX 787 ; N uni1E50 ; G 2134 +U 7761 ; WX 612 ; N uni1E51 ; G 2135 +U 7762 ; WX 787 ; N uni1E52 ; G 2136 +U 7763 ; WX 612 ; N uni1E53 ; G 2137 +U 7764 ; WX 603 ; N uni1E54 ; G 2138 +U 7765 ; WX 635 ; N uni1E55 ; G 2139 +U 7766 ; WX 603 ; N uni1E56 ; G 2140 +U 7767 ; WX 635 ; N uni1E57 ; G 2141 +U 7768 ; WX 695 ; N uni1E58 ; G 2142 +U 7769 ; WX 411 ; N uni1E59 ; G 2143 +U 7770 ; WX 695 ; N uni1E5A ; G 2144 +U 7771 ; WX 411 ; N uni1E5B ; G 2145 +U 7772 ; WX 695 ; N uni1E5C ; G 2146 +U 7773 ; WX 411 ; N uni1E5D ; G 2147 +U 7774 ; WX 695 ; N uni1E5E ; G 2148 +U 7775 ; WX 411 ; N uni1E5F ; G 2149 +U 7776 ; WX 635 ; N uni1E60 ; G 2150 +U 7777 ; WX 521 ; N uni1E61 ; G 2151 +U 7778 ; WX 635 ; N uni1E62 ; G 2152 +U 7779 ; WX 521 ; N uni1E63 ; G 2153 +U 7780 ; WX 635 ; N uni1E64 ; G 2154 +U 7781 ; WX 521 ; N uni1E65 ; G 2155 +U 7782 ; WX 635 ; N uni1E66 ; G 2156 +U 7783 ; WX 521 ; N uni1E67 ; G 2157 +U 7784 ; WX 635 ; N uni1E68 ; G 2158 +U 7785 ; WX 521 ; N uni1E69 ; G 2159 +U 7786 ; WX 611 ; N uni1E6A ; G 2160 +U 7787 ; WX 392 ; N uni1E6B ; G 2161 +U 7788 ; WX 611 ; N uni1E6C ; G 2162 +U 7789 ; WX 392 ; N uni1E6D ; G 2163 +U 7790 ; WX 611 ; N uni1E6E ; G 2164 +U 7791 ; WX 392 ; N uni1E6F ; G 2165 +U 7792 ; WX 611 ; N uni1E70 ; G 2166 +U 7793 ; WX 392 ; N uni1E71 ; G 2167 +U 7794 ; WX 732 ; N uni1E72 ; G 2168 +U 7795 ; WX 634 ; N uni1E73 ; G 2169 +U 7796 ; WX 732 ; N uni1E74 ; G 2170 +U 7797 ; WX 634 ; N uni1E75 ; G 2171 +U 7798 ; WX 732 ; N uni1E76 ; G 2172 +U 7799 ; WX 634 ; N uni1E77 ; G 2173 +U 7800 ; WX 732 ; N uni1E78 ; G 2174 +U 7801 ; WX 634 ; N uni1E79 ; G 2175 +U 7802 ; WX 732 ; N uni1E7A ; G 2176 +U 7803 ; WX 634 ; N uni1E7B ; G 2177 +U 7804 ; WX 684 ; N uni1E7C ; G 2178 +U 7805 ; WX 592 ; N uni1E7D ; G 2179 +U 7806 ; WX 684 ; N uni1E7E ; G 2180 +U 7807 ; WX 592 ; N uni1E7F ; G 2181 +U 7808 ; WX 989 ; N Wgrave ; G 2182 +U 7809 ; WX 818 ; N wgrave ; G 2183 +U 7810 ; WX 989 ; N Wacute ; G 2184 +U 7811 ; WX 818 ; N wacute ; G 2185 +U 7812 ; WX 989 ; N Wdieresis ; G 2186 +U 7813 ; WX 818 ; N wdieresis ; G 2187 +U 7814 ; WX 989 ; N uni1E86 ; G 2188 +U 7815 ; WX 818 ; N uni1E87 ; G 2189 +U 7816 ; WX 989 ; N uni1E88 ; G 2190 +U 7817 ; WX 818 ; N uni1E89 ; G 2191 +U 7818 ; WX 685 ; N uni1E8A ; G 2192 +U 7819 ; WX 592 ; N uni1E8B ; G 2193 +U 7820 ; WX 685 ; N uni1E8C ; G 2194 +U 7821 ; WX 592 ; N uni1E8D ; G 2195 +U 7822 ; WX 611 ; N uni1E8E ; G 2196 +U 7823 ; WX 592 ; N uni1E8F ; G 2197 +U 7824 ; WX 685 ; N uni1E90 ; G 2198 +U 7825 ; WX 525 ; N uni1E91 ; G 2199 +U 7826 ; WX 685 ; N uni1E92 ; G 2200 +U 7827 ; WX 525 ; N uni1E93 ; G 2201 +U 7828 ; WX 685 ; N uni1E94 ; G 2202 +U 7829 ; WX 525 ; N uni1E95 ; G 2203 +U 7830 ; WX 634 ; N uni1E96 ; G 2204 +U 7831 ; WX 392 ; N uni1E97 ; G 2205 +U 7832 ; WX 818 ; N uni1E98 ; G 2206 +U 7833 ; WX 592 ; N uni1E99 ; G 2207 +U 7834 ; WX 613 ; N uni1E9A ; G 2208 +U 7835 ; WX 352 ; N uni1E9B ; G 2209 +U 7836 ; WX 352 ; N uni1E9C ; G 2210 +U 7837 ; WX 352 ; N uni1E9D ; G 2211 +U 7838 ; WX 769 ; N uni1E9E ; G 2212 +U 7839 ; WX 612 ; N uni1E9F ; G 2213 +U 7840 ; WX 684 ; N uni1EA0 ; G 2214 +U 7841 ; WX 613 ; N uni1EA1 ; G 2215 +U 7842 ; WX 684 ; N uni1EA2 ; G 2216 +U 7843 ; WX 613 ; N uni1EA3 ; G 2217 +U 7844 ; WX 684 ; N uni1EA4 ; G 2218 +U 7845 ; WX 613 ; N uni1EA5 ; G 2219 +U 7846 ; WX 684 ; N uni1EA6 ; G 2220 +U 7847 ; WX 613 ; N uni1EA7 ; G 2221 +U 7848 ; WX 684 ; N uni1EA8 ; G 2222 +U 7849 ; WX 613 ; N uni1EA9 ; G 2223 +U 7850 ; WX 684 ; N uni1EAA ; G 2224 +U 7851 ; WX 613 ; N uni1EAB ; G 2225 +U 7852 ; WX 684 ; N uni1EAC ; G 2226 +U 7853 ; WX 613 ; N uni1EAD ; G 2227 +U 7854 ; WX 684 ; N uni1EAE ; G 2228 +U 7855 ; WX 613 ; N uni1EAF ; G 2229 +U 7856 ; WX 684 ; N uni1EB0 ; G 2230 +U 7857 ; WX 613 ; N uni1EB1 ; G 2231 +U 7858 ; WX 684 ; N uni1EB2 ; G 2232 +U 7859 ; WX 613 ; N uni1EB3 ; G 2233 +U 7860 ; WX 684 ; N uni1EB4 ; G 2234 +U 7861 ; WX 613 ; N uni1EB5 ; G 2235 +U 7862 ; WX 684 ; N uni1EB6 ; G 2236 +U 7863 ; WX 613 ; N uni1EB7 ; G 2237 +U 7864 ; WX 632 ; N uni1EB8 ; G 2238 +U 7865 ; WX 615 ; N uni1EB9 ; G 2239 +U 7866 ; WX 632 ; N uni1EBA ; G 2240 +U 7867 ; WX 615 ; N uni1EBB ; G 2241 +U 7868 ; WX 632 ; N uni1EBC ; G 2242 +U 7869 ; WX 615 ; N uni1EBD ; G 2243 +U 7870 ; WX 632 ; N uni1EBE ; G 2244 +U 7871 ; WX 615 ; N uni1EBF ; G 2245 +U 7872 ; WX 632 ; N uni1EC0 ; G 2246 +U 7873 ; WX 615 ; N uni1EC1 ; G 2247 +U 7874 ; WX 632 ; N uni1EC2 ; G 2248 +U 7875 ; WX 615 ; N uni1EC3 ; G 2249 +U 7876 ; WX 632 ; N uni1EC4 ; G 2250 +U 7877 ; WX 615 ; N uni1EC5 ; G 2251 +U 7878 ; WX 632 ; N uni1EC6 ; G 2252 +U 7879 ; WX 615 ; N uni1EC7 ; G 2253 +U 7880 ; WX 295 ; N uni1EC8 ; G 2254 +U 7881 ; WX 278 ; N uni1EC9 ; G 2255 +U 7882 ; WX 295 ; N uni1ECA ; G 2256 +U 7883 ; WX 278 ; N uni1ECB ; G 2257 +U 7884 ; WX 787 ; N uni1ECC ; G 2258 +U 7885 ; WX 612 ; N uni1ECD ; G 2259 +U 7886 ; WX 787 ; N uni1ECE ; G 2260 +U 7887 ; WX 612 ; N uni1ECF ; G 2261 +U 7888 ; WX 787 ; N uni1ED0 ; G 2262 +U 7889 ; WX 612 ; N uni1ED1 ; G 2263 +U 7890 ; WX 787 ; N uni1ED2 ; G 2264 +U 7891 ; WX 612 ; N uni1ED3 ; G 2265 +U 7892 ; WX 787 ; N uni1ED4 ; G 2266 +U 7893 ; WX 612 ; N uni1ED5 ; G 2267 +U 7894 ; WX 787 ; N uni1ED6 ; G 2268 +U 7895 ; WX 612 ; N uni1ED7 ; G 2269 +U 7896 ; WX 787 ; N uni1ED8 ; G 2270 +U 7897 ; WX 612 ; N uni1ED9 ; G 2271 +U 7898 ; WX 913 ; N uni1EDA ; G 2272 +U 7899 ; WX 612 ; N uni1EDB ; G 2273 +U 7900 ; WX 913 ; N uni1EDC ; G 2274 +U 7901 ; WX 612 ; N uni1EDD ; G 2275 +U 7902 ; WX 913 ; N uni1EDE ; G 2276 +U 7903 ; WX 612 ; N uni1EDF ; G 2277 +U 7904 ; WX 913 ; N uni1EE0 ; G 2278 +U 7905 ; WX 612 ; N uni1EE1 ; G 2279 +U 7906 ; WX 913 ; N uni1EE2 ; G 2280 +U 7907 ; WX 612 ; N uni1EE3 ; G 2281 +U 7908 ; WX 732 ; N uni1EE4 ; G 2282 +U 7909 ; WX 634 ; N uni1EE5 ; G 2283 +U 7910 ; WX 732 ; N uni1EE6 ; G 2284 +U 7911 ; WX 634 ; N uni1EE7 ; G 2285 +U 7912 ; WX 838 ; N uni1EE8 ; G 2286 +U 7913 ; WX 634 ; N uni1EE9 ; G 2287 +U 7914 ; WX 838 ; N uni1EEA ; G 2288 +U 7915 ; WX 634 ; N uni1EEB ; G 2289 +U 7916 ; WX 838 ; N uni1EEC ; G 2290 +U 7917 ; WX 634 ; N uni1EED ; G 2291 +U 7918 ; WX 838 ; N uni1EEE ; G 2292 +U 7919 ; WX 634 ; N uni1EEF ; G 2293 +U 7920 ; WX 838 ; N uni1EF0 ; G 2294 +U 7921 ; WX 634 ; N uni1EF1 ; G 2295 +U 7922 ; WX 611 ; N Ygrave ; G 2296 +U 7923 ; WX 592 ; N ygrave ; G 2297 +U 7924 ; WX 611 ; N uni1EF4 ; G 2298 +U 7925 ; WX 592 ; N uni1EF5 ; G 2299 +U 7926 ; WX 611 ; N uni1EF6 ; G 2300 +U 7927 ; WX 592 ; N uni1EF7 ; G 2301 +U 7928 ; WX 611 ; N uni1EF8 ; G 2302 +U 7929 ; WX 592 ; N uni1EF9 ; G 2303 +U 7930 ; WX 769 ; N uni1EFA ; G 2304 +U 7931 ; WX 477 ; N uni1EFB ; G 2305 +U 7936 ; WX 659 ; N uni1F00 ; G 2306 +U 7937 ; WX 659 ; N uni1F01 ; G 2307 +U 7938 ; WX 659 ; N uni1F02 ; G 2308 +U 7939 ; WX 659 ; N uni1F03 ; G 2309 +U 7940 ; WX 659 ; N uni1F04 ; G 2310 +U 7941 ; WX 659 ; N uni1F05 ; G 2311 +U 7942 ; WX 659 ; N uni1F06 ; G 2312 +U 7943 ; WX 659 ; N uni1F07 ; G 2313 +U 7944 ; WX 684 ; N uni1F08 ; G 2314 +U 7945 ; WX 684 ; N uni1F09 ; G 2315 +U 7946 ; WX 877 ; N uni1F0A ; G 2316 +U 7947 ; WX 877 ; N uni1F0B ; G 2317 +U 7948 ; WX 769 ; N uni1F0C ; G 2318 +U 7949 ; WX 801 ; N uni1F0D ; G 2319 +U 7950 ; WX 708 ; N uni1F0E ; G 2320 +U 7951 ; WX 743 ; N uni1F0F ; G 2321 +U 7952 ; WX 541 ; N uni1F10 ; G 2322 +U 7953 ; WX 541 ; N uni1F11 ; G 2323 +U 7954 ; WX 541 ; N uni1F12 ; G 2324 +U 7955 ; WX 541 ; N uni1F13 ; G 2325 +U 7956 ; WX 541 ; N uni1F14 ; G 2326 +U 7957 ; WX 541 ; N uni1F15 ; G 2327 +U 7960 ; WX 711 ; N uni1F18 ; G 2328 +U 7961 ; WX 711 ; N uni1F19 ; G 2329 +U 7962 ; WX 966 ; N uni1F1A ; G 2330 +U 7963 ; WX 975 ; N uni1F1B ; G 2331 +U 7964 ; WX 898 ; N uni1F1C ; G 2332 +U 7965 ; WX 928 ; N uni1F1D ; G 2333 +U 7968 ; WX 634 ; N uni1F20 ; G 2334 +U 7969 ; WX 634 ; N uni1F21 ; G 2335 +U 7970 ; WX 634 ; N uni1F22 ; G 2336 +U 7971 ; WX 634 ; N uni1F23 ; G 2337 +U 7972 ; WX 634 ; N uni1F24 ; G 2338 +U 7973 ; WX 634 ; N uni1F25 ; G 2339 +U 7974 ; WX 634 ; N uni1F26 ; G 2340 +U 7975 ; WX 634 ; N uni1F27 ; G 2341 +U 7976 ; WX 837 ; N uni1F28 ; G 2342 +U 7977 ; WX 835 ; N uni1F29 ; G 2343 +U 7978 ; WX 1086 ; N uni1F2A ; G 2344 +U 7979 ; WX 1089 ; N uni1F2B ; G 2345 +U 7980 ; WX 1027 ; N uni1F2C ; G 2346 +U 7981 ; WX 1051 ; N uni1F2D ; G 2347 +U 7982 ; WX 934 ; N uni1F2E ; G 2348 +U 7983 ; WX 947 ; N uni1F2F ; G 2349 +U 7984 ; WX 338 ; N uni1F30 ; G 2350 +U 7985 ; WX 338 ; N uni1F31 ; G 2351 +U 7986 ; WX 338 ; N uni1F32 ; G 2352 +U 7987 ; WX 338 ; N uni1F33 ; G 2353 +U 7988 ; WX 338 ; N uni1F34 ; G 2354 +U 7989 ; WX 338 ; N uni1F35 ; G 2355 +U 7990 ; WX 338 ; N uni1F36 ; G 2356 +U 7991 ; WX 338 ; N uni1F37 ; G 2357 +U 7992 ; WX 380 ; N uni1F38 ; G 2358 +U 7993 ; WX 374 ; N uni1F39 ; G 2359 +U 7994 ; WX 635 ; N uni1F3A ; G 2360 +U 7995 ; WX 635 ; N uni1F3B ; G 2361 +U 7996 ; WX 570 ; N uni1F3C ; G 2362 +U 7997 ; WX 600 ; N uni1F3D ; G 2363 +U 7998 ; WX 489 ; N uni1F3E ; G 2364 +U 7999 ; WX 493 ; N uni1F3F ; G 2365 +U 8000 ; WX 612 ; N uni1F40 ; G 2366 +U 8001 ; WX 612 ; N uni1F41 ; G 2367 +U 8002 ; WX 612 ; N uni1F42 ; G 2368 +U 8003 ; WX 612 ; N uni1F43 ; G 2369 +U 8004 ; WX 612 ; N uni1F44 ; G 2370 +U 8005 ; WX 612 ; N uni1F45 ; G 2371 +U 8008 ; WX 804 ; N uni1F48 ; G 2372 +U 8009 ; WX 848 ; N uni1F49 ; G 2373 +U 8010 ; WX 1095 ; N uni1F4A ; G 2374 +U 8011 ; WX 1100 ; N uni1F4B ; G 2375 +U 8012 ; WX 938 ; N uni1F4C ; G 2376 +U 8013 ; WX 970 ; N uni1F4D ; G 2377 +U 8016 ; WX 579 ; N uni1F50 ; G 2378 +U 8017 ; WX 579 ; N uni1F51 ; G 2379 +U 8018 ; WX 579 ; N uni1F52 ; G 2380 +U 8019 ; WX 579 ; N uni1F53 ; G 2381 +U 8020 ; WX 579 ; N uni1F54 ; G 2382 +U 8021 ; WX 579 ; N uni1F55 ; G 2383 +U 8022 ; WX 579 ; N uni1F56 ; G 2384 +U 8023 ; WX 579 ; N uni1F57 ; G 2385 +U 8025 ; WX 784 ; N uni1F59 ; G 2386 +U 8027 ; WX 998 ; N uni1F5B ; G 2387 +U 8029 ; WX 1012 ; N uni1F5D ; G 2388 +U 8031 ; WX 897 ; N uni1F5F ; G 2389 +U 8032 ; WX 837 ; N uni1F60 ; G 2390 +U 8033 ; WX 837 ; N uni1F61 ; G 2391 +U 8034 ; WX 837 ; N uni1F62 ; G 2392 +U 8035 ; WX 837 ; N uni1F63 ; G 2393 +U 8036 ; WX 837 ; N uni1F64 ; G 2394 +U 8037 ; WX 837 ; N uni1F65 ; G 2395 +U 8038 ; WX 837 ; N uni1F66 ; G 2396 +U 8039 ; WX 837 ; N uni1F67 ; G 2397 +U 8040 ; WX 802 ; N uni1F68 ; G 2398 +U 8041 ; WX 843 ; N uni1F69 ; G 2399 +U 8042 ; WX 1089 ; N uni1F6A ; G 2400 +U 8043 ; WX 1095 ; N uni1F6B ; G 2401 +U 8044 ; WX 946 ; N uni1F6C ; G 2402 +U 8045 ; WX 972 ; N uni1F6D ; G 2403 +U 8046 ; WX 921 ; N uni1F6E ; G 2404 +U 8047 ; WX 952 ; N uni1F6F ; G 2405 +U 8048 ; WX 659 ; N uni1F70 ; G 2406 +U 8049 ; WX 659 ; N uni1F71 ; G 2407 +U 8050 ; WX 541 ; N uni1F72 ; G 2408 +U 8051 ; WX 548 ; N uni1F73 ; G 2409 +U 8052 ; WX 634 ; N uni1F74 ; G 2410 +U 8053 ; WX 654 ; N uni1F75 ; G 2411 +U 8054 ; WX 338 ; N uni1F76 ; G 2412 +U 8055 ; WX 338 ; N uni1F77 ; G 2413 +U 8056 ; WX 612 ; N uni1F78 ; G 2414 +U 8057 ; WX 612 ; N uni1F79 ; G 2415 +U 8058 ; WX 579 ; N uni1F7A ; G 2416 +U 8059 ; WX 579 ; N uni1F7B ; G 2417 +U 8060 ; WX 837 ; N uni1F7C ; G 2418 +U 8061 ; WX 837 ; N uni1F7D ; G 2419 +U 8064 ; WX 659 ; N uni1F80 ; G 2420 +U 8065 ; WX 659 ; N uni1F81 ; G 2421 +U 8066 ; WX 659 ; N uni1F82 ; G 2422 +U 8067 ; WX 659 ; N uni1F83 ; G 2423 +U 8068 ; WX 659 ; N uni1F84 ; G 2424 +U 8069 ; WX 659 ; N uni1F85 ; G 2425 +U 8070 ; WX 659 ; N uni1F86 ; G 2426 +U 8071 ; WX 659 ; N uni1F87 ; G 2427 +U 8072 ; WX 684 ; N uni1F88 ; G 2428 +U 8073 ; WX 684 ; N uni1F89 ; G 2429 +U 8074 ; WX 877 ; N uni1F8A ; G 2430 +U 8075 ; WX 877 ; N uni1F8B ; G 2431 +U 8076 ; WX 769 ; N uni1F8C ; G 2432 +U 8077 ; WX 801 ; N uni1F8D ; G 2433 +U 8078 ; WX 708 ; N uni1F8E ; G 2434 +U 8079 ; WX 743 ; N uni1F8F ; G 2435 +U 8080 ; WX 634 ; N uni1F90 ; G 2436 +U 8081 ; WX 634 ; N uni1F91 ; G 2437 +U 8082 ; WX 634 ; N uni1F92 ; G 2438 +U 8083 ; WX 634 ; N uni1F93 ; G 2439 +U 8084 ; WX 634 ; N uni1F94 ; G 2440 +U 8085 ; WX 634 ; N uni1F95 ; G 2441 +U 8086 ; WX 634 ; N uni1F96 ; G 2442 +U 8087 ; WX 634 ; N uni1F97 ; G 2443 +U 8088 ; WX 837 ; N uni1F98 ; G 2444 +U 8089 ; WX 835 ; N uni1F99 ; G 2445 +U 8090 ; WX 1086 ; N uni1F9A ; G 2446 +U 8091 ; WX 1089 ; N uni1F9B ; G 2447 +U 8092 ; WX 1027 ; N uni1F9C ; G 2448 +U 8093 ; WX 1051 ; N uni1F9D ; G 2449 +U 8094 ; WX 934 ; N uni1F9E ; G 2450 +U 8095 ; WX 947 ; N uni1F9F ; G 2451 +U 8096 ; WX 837 ; N uni1FA0 ; G 2452 +U 8097 ; WX 837 ; N uni1FA1 ; G 2453 +U 8098 ; WX 837 ; N uni1FA2 ; G 2454 +U 8099 ; WX 837 ; N uni1FA3 ; G 2455 +U 8100 ; WX 837 ; N uni1FA4 ; G 2456 +U 8101 ; WX 837 ; N uni1FA5 ; G 2457 +U 8102 ; WX 837 ; N uni1FA6 ; G 2458 +U 8103 ; WX 837 ; N uni1FA7 ; G 2459 +U 8104 ; WX 802 ; N uni1FA8 ; G 2460 +U 8105 ; WX 843 ; N uni1FA9 ; G 2461 +U 8106 ; WX 1089 ; N uni1FAA ; G 2462 +U 8107 ; WX 1095 ; N uni1FAB ; G 2463 +U 8108 ; WX 946 ; N uni1FAC ; G 2464 +U 8109 ; WX 972 ; N uni1FAD ; G 2465 +U 8110 ; WX 921 ; N uni1FAE ; G 2466 +U 8111 ; WX 952 ; N uni1FAF ; G 2467 +U 8112 ; WX 659 ; N uni1FB0 ; G 2468 +U 8113 ; WX 659 ; N uni1FB1 ; G 2469 +U 8114 ; WX 659 ; N uni1FB2 ; G 2470 +U 8115 ; WX 659 ; N uni1FB3 ; G 2471 +U 8116 ; WX 659 ; N uni1FB4 ; G 2472 +U 8118 ; WX 659 ; N uni1FB6 ; G 2473 +U 8119 ; WX 659 ; N uni1FB7 ; G 2474 +U 8120 ; WX 684 ; N uni1FB8 ; G 2475 +U 8121 ; WX 684 ; N uni1FB9 ; G 2476 +U 8122 ; WX 716 ; N uni1FBA ; G 2477 +U 8123 ; WX 692 ; N uni1FBB ; G 2478 +U 8124 ; WX 684 ; N uni1FBC ; G 2479 +U 8125 ; WX 500 ; N uni1FBD ; G 2480 +U 8126 ; WX 500 ; N uni1FBE ; G 2481 +U 8127 ; WX 500 ; N uni1FBF ; G 2482 +U 8128 ; WX 500 ; N uni1FC0 ; G 2483 +U 8129 ; WX 500 ; N uni1FC1 ; G 2484 +U 8130 ; WX 634 ; N uni1FC2 ; G 2485 +U 8131 ; WX 634 ; N uni1FC3 ; G 2486 +U 8132 ; WX 654 ; N uni1FC4 ; G 2487 +U 8134 ; WX 634 ; N uni1FC6 ; G 2488 +U 8135 ; WX 634 ; N uni1FC7 ; G 2489 +U 8136 ; WX 805 ; N uni1FC8 ; G 2490 +U 8137 ; WX 746 ; N uni1FC9 ; G 2491 +U 8138 ; WX 931 ; N uni1FCA ; G 2492 +U 8139 ; WX 871 ; N uni1FCB ; G 2493 +U 8140 ; WX 752 ; N uni1FCC ; G 2494 +U 8141 ; WX 500 ; N uni1FCD ; G 2495 +U 8142 ; WX 500 ; N uni1FCE ; G 2496 +U 8143 ; WX 500 ; N uni1FCF ; G 2497 +U 8144 ; WX 338 ; N uni1FD0 ; G 2498 +U 8145 ; WX 338 ; N uni1FD1 ; G 2499 +U 8146 ; WX 338 ; N uni1FD2 ; G 2500 +U 8147 ; WX 338 ; N uni1FD3 ; G 2501 +U 8150 ; WX 338 ; N uni1FD6 ; G 2502 +U 8151 ; WX 338 ; N uni1FD7 ; G 2503 +U 8152 ; WX 295 ; N uni1FD8 ; G 2504 +U 8153 ; WX 295 ; N uni1FD9 ; G 2505 +U 8154 ; WX 475 ; N uni1FDA ; G 2506 +U 8155 ; WX 408 ; N uni1FDB ; G 2507 +U 8157 ; WX 500 ; N uni1FDD ; G 2508 +U 8158 ; WX 500 ; N uni1FDE ; G 2509 +U 8159 ; WX 500 ; N uni1FDF ; G 2510 +U 8160 ; WX 579 ; N uni1FE0 ; G 2511 +U 8161 ; WX 579 ; N uni1FE1 ; G 2512 +U 8162 ; WX 579 ; N uni1FE2 ; G 2513 +U 8163 ; WX 579 ; N uni1FE3 ; G 2514 +U 8164 ; WX 635 ; N uni1FE4 ; G 2515 +U 8165 ; WX 635 ; N uni1FE5 ; G 2516 +U 8166 ; WX 579 ; N uni1FE6 ; G 2517 +U 8167 ; WX 579 ; N uni1FE7 ; G 2518 +U 8168 ; WX 611 ; N uni1FE8 ; G 2519 +U 8169 ; WX 611 ; N uni1FE9 ; G 2520 +U 8170 ; WX 845 ; N uni1FEA ; G 2521 +U 8171 ; WX 825 ; N uni1FEB ; G 2522 +U 8172 ; WX 685 ; N uni1FEC ; G 2523 +U 8173 ; WX 500 ; N uni1FED ; G 2524 +U 8174 ; WX 500 ; N uni1FEE ; G 2525 +U 8175 ; WX 500 ; N uni1FEF ; G 2526 +U 8178 ; WX 837 ; N uni1FF2 ; G 2527 +U 8179 ; WX 837 ; N uni1FF3 ; G 2528 +U 8180 ; WX 837 ; N uni1FF4 ; G 2529 +U 8182 ; WX 837 ; N uni1FF6 ; G 2530 +U 8183 ; WX 837 ; N uni1FF7 ; G 2531 +U 8184 ; WX 941 ; N uni1FF8 ; G 2532 +U 8185 ; WX 813 ; N uni1FF9 ; G 2533 +U 8186 ; WX 922 ; N uni1FFA ; G 2534 +U 8187 ; WX 826 ; N uni1FFB ; G 2535 +U 8188 ; WX 764 ; N uni1FFC ; G 2536 +U 8189 ; WX 500 ; N uni1FFD ; G 2537 +U 8190 ; WX 500 ; N uni1FFE ; G 2538 +U 8192 ; WX 500 ; N uni2000 ; G 2539 +U 8193 ; WX 1000 ; N uni2001 ; G 2540 +U 8194 ; WX 500 ; N uni2002 ; G 2541 +U 8195 ; WX 1000 ; N uni2003 ; G 2542 +U 8196 ; WX 330 ; N uni2004 ; G 2543 +U 8197 ; WX 250 ; N uni2005 ; G 2544 +U 8198 ; WX 167 ; N uni2006 ; G 2545 +U 8199 ; WX 636 ; N uni2007 ; G 2546 +U 8200 ; WX 318 ; N uni2008 ; G 2547 +U 8201 ; WX 200 ; N uni2009 ; G 2548 +U 8202 ; WX 100 ; N uni200A ; G 2549 +U 8203 ; WX 0 ; N uni200B ; G 2550 +U 8204 ; WX 0 ; N uni200C ; G 2551 +U 8205 ; WX 0 ; N uni200D ; G 2552 +U 8206 ; WX 0 ; N uni200E ; G 2553 +U 8207 ; WX 0 ; N uni200F ; G 2554 +U 8208 ; WX 361 ; N uni2010 ; G 2555 +U 8209 ; WX 361 ; N uni2011 ; G 2556 +U 8210 ; WX 636 ; N figuredash ; G 2557 +U 8211 ; WX 500 ; N endash ; G 2558 +U 8212 ; WX 1000 ; N emdash ; G 2559 +U 8213 ; WX 1000 ; N uni2015 ; G 2560 +U 8214 ; WX 500 ; N uni2016 ; G 2561 +U 8215 ; WX 500 ; N underscoredbl ; G 2562 +U 8216 ; WX 318 ; N quoteleft ; G 2563 +U 8217 ; WX 318 ; N quoteright ; G 2564 +U 8218 ; WX 318 ; N quotesinglbase ; G 2565 +U 8219 ; WX 318 ; N quotereversed ; G 2566 +U 8220 ; WX 518 ; N quotedblleft ; G 2567 +U 8221 ; WX 518 ; N quotedblright ; G 2568 +U 8222 ; WX 518 ; N quotedblbase ; G 2569 +U 8223 ; WX 518 ; N uni201F ; G 2570 +U 8224 ; WX 500 ; N dagger ; G 2571 +U 8225 ; WX 500 ; N daggerdbl ; G 2572 +U 8226 ; WX 590 ; N bullet ; G 2573 +U 8227 ; WX 590 ; N uni2023 ; G 2574 +U 8228 ; WX 333 ; N onedotenleader ; G 2575 +U 8229 ; WX 667 ; N twodotenleader ; G 2576 +U 8230 ; WX 1000 ; N ellipsis ; G 2577 +U 8231 ; WX 318 ; N uni2027 ; G 2578 +U 8232 ; WX 0 ; N uni2028 ; G 2579 +U 8233 ; WX 0 ; N uni2029 ; G 2580 +U 8234 ; WX 0 ; N uni202A ; G 2581 +U 8235 ; WX 0 ; N uni202B ; G 2582 +U 8236 ; WX 0 ; N uni202C ; G 2583 +U 8237 ; WX 0 ; N uni202D ; G 2584 +U 8238 ; WX 0 ; N uni202E ; G 2585 +U 8239 ; WX 200 ; N uni202F ; G 2586 +U 8240 ; WX 1350 ; N perthousand ; G 2587 +U 8241 ; WX 1690 ; N uni2031 ; G 2588 +U 8242 ; WX 227 ; N minute ; G 2589 +U 8243 ; WX 374 ; N second ; G 2590 +U 8244 ; WX 520 ; N uni2034 ; G 2591 +U 8245 ; WX 227 ; N uni2035 ; G 2592 +U 8246 ; WX 374 ; N uni2036 ; G 2593 +U 8247 ; WX 520 ; N uni2037 ; G 2594 +U 8248 ; WX 339 ; N uni2038 ; G 2595 +U 8249 ; WX 400 ; N guilsinglleft ; G 2596 +U 8250 ; WX 400 ; N guilsinglright ; G 2597 +U 8251 ; WX 838 ; N uni203B ; G 2598 +U 8252 ; WX 485 ; N exclamdbl ; G 2599 +U 8253 ; WX 531 ; N uni203D ; G 2600 +U 8254 ; WX 500 ; N uni203E ; G 2601 +U 8255 ; WX 804 ; N uni203F ; G 2602 +U 8256 ; WX 804 ; N uni2040 ; G 2603 +U 8257 ; WX 250 ; N uni2041 ; G 2604 +U 8258 ; WX 1000 ; N uni2042 ; G 2605 +U 8259 ; WX 500 ; N uni2043 ; G 2606 +U 8260 ; WX 167 ; N fraction ; G 2607 +U 8261 ; WX 390 ; N uni2045 ; G 2608 +U 8262 ; WX 390 ; N uni2046 ; G 2609 +U 8263 ; WX 922 ; N uni2047 ; G 2610 +U 8264 ; WX 733 ; N uni2048 ; G 2611 +U 8265 ; WX 733 ; N uni2049 ; G 2612 +U 8266 ; WX 497 ; N uni204A ; G 2613 +U 8267 ; WX 636 ; N uni204B ; G 2614 +U 8268 ; WX 500 ; N uni204C ; G 2615 +U 8269 ; WX 500 ; N uni204D ; G 2616 +U 8270 ; WX 500 ; N uni204E ; G 2617 +U 8271 ; WX 337 ; N uni204F ; G 2618 +U 8272 ; WX 804 ; N uni2050 ; G 2619 +U 8273 ; WX 500 ; N uni2051 ; G 2620 +U 8274 ; WX 450 ; N uni2052 ; G 2621 +U 8275 ; WX 1000 ; N uni2053 ; G 2622 +U 8276 ; WX 804 ; N uni2054 ; G 2623 +U 8277 ; WX 838 ; N uni2055 ; G 2624 +U 8278 ; WX 586 ; N uni2056 ; G 2625 +U 8279 ; WX 663 ; N uni2057 ; G 2626 +U 8280 ; WX 838 ; N uni2058 ; G 2627 +U 8281 ; WX 838 ; N uni2059 ; G 2628 +U 8282 ; WX 318 ; N uni205A ; G 2629 +U 8283 ; WX 797 ; N uni205B ; G 2630 +U 8284 ; WX 838 ; N uni205C ; G 2631 +U 8285 ; WX 318 ; N uni205D ; G 2632 +U 8286 ; WX 318 ; N uni205E ; G 2633 +U 8287 ; WX 222 ; N uni205F ; G 2634 +U 8288 ; WX 0 ; N uni2060 ; G 2635 +U 8289 ; WX 0 ; N uni2061 ; G 2636 +U 8290 ; WX 0 ; N uni2062 ; G 2637 +U 8291 ; WX 0 ; N uni2063 ; G 2638 +U 8292 ; WX 0 ; N uni2064 ; G 2639 +U 8298 ; WX 0 ; N uni206A ; G 2640 +U 8299 ; WX 0 ; N uni206B ; G 2641 +U 8300 ; WX 0 ; N uni206C ; G 2642 +U 8301 ; WX 0 ; N uni206D ; G 2643 +U 8302 ; WX 0 ; N uni206E ; G 2644 +U 8303 ; WX 0 ; N uni206F ; G 2645 +U 8304 ; WX 401 ; N uni2070 ; G 2646 +U 8305 ; WX 179 ; N uni2071 ; G 2647 +U 8308 ; WX 401 ; N uni2074 ; G 2648 +U 8309 ; WX 401 ; N uni2075 ; G 2649 +U 8310 ; WX 401 ; N uni2076 ; G 2650 +U 8311 ; WX 401 ; N uni2077 ; G 2651 +U 8312 ; WX 401 ; N uni2078 ; G 2652 +U 8313 ; WX 401 ; N uni2079 ; G 2653 +U 8314 ; WX 528 ; N uni207A ; G 2654 +U 8315 ; WX 528 ; N uni207B ; G 2655 +U 8316 ; WX 528 ; N uni207C ; G 2656 +U 8317 ; WX 246 ; N uni207D ; G 2657 +U 8318 ; WX 246 ; N uni207E ; G 2658 +U 8319 ; WX 399 ; N uni207F ; G 2659 +U 8320 ; WX 401 ; N uni2080 ; G 2660 +U 8321 ; WX 401 ; N uni2081 ; G 2661 +U 8322 ; WX 401 ; N uni2082 ; G 2662 +U 8323 ; WX 401 ; N uni2083 ; G 2663 +U 8324 ; WX 401 ; N uni2084 ; G 2664 +U 8325 ; WX 401 ; N uni2085 ; G 2665 +U 8326 ; WX 401 ; N uni2086 ; G 2666 +U 8327 ; WX 401 ; N uni2087 ; G 2667 +U 8328 ; WX 401 ; N uni2088 ; G 2668 +U 8329 ; WX 401 ; N uni2089 ; G 2669 +U 8330 ; WX 528 ; N uni208A ; G 2670 +U 8331 ; WX 528 ; N uni208B ; G 2671 +U 8332 ; WX 528 ; N uni208C ; G 2672 +U 8333 ; WX 246 ; N uni208D ; G 2673 +U 8334 ; WX 246 ; N uni208E ; G 2674 +U 8336 ; WX 392 ; N uni2090 ; G 2675 +U 8337 ; WX 417 ; N uni2091 ; G 2676 +U 8338 ; WX 414 ; N uni2092 ; G 2677 +U 8339 ; WX 444 ; N uni2093 ; G 2678 +U 8340 ; WX 417 ; N uni2094 ; G 2679 +U 8341 ; WX 399 ; N uni2095 ; G 2680 +U 8342 ; WX 426 ; N uni2096 ; G 2681 +U 8343 ; WX 166 ; N uni2097 ; G 2682 +U 8344 ; WX 623 ; N uni2098 ; G 2683 +U 8345 ; WX 399 ; N uni2099 ; G 2684 +U 8346 ; WX 428 ; N uni209A ; G 2685 +U 8347 ; WX 373 ; N uni209B ; G 2686 +U 8348 ; WX 295 ; N uni209C ; G 2687 +U 8352 ; WX 877 ; N uni20A0 ; G 2688 +U 8353 ; WX 636 ; N colonmonetary ; G 2689 +U 8354 ; WX 636 ; N uni20A2 ; G 2690 +U 8355 ; WX 636 ; N franc ; G 2691 +U 8356 ; WX 636 ; N lira ; G 2692 +U 8357 ; WX 974 ; N uni20A5 ; G 2693 +U 8358 ; WX 636 ; N uni20A6 ; G 2694 +U 8359 ; WX 1271 ; N peseta ; G 2695 +U 8360 ; WX 1074 ; N uni20A8 ; G 2696 +U 8361 ; WX 989 ; N uni20A9 ; G 2697 +U 8362 ; WX 838 ; N uni20AA ; G 2698 +U 8363 ; WX 636 ; N dong ; G 2699 +U 8364 ; WX 636 ; N Euro ; G 2700 +U 8365 ; WX 636 ; N uni20AD ; G 2701 +U 8366 ; WX 636 ; N uni20AE ; G 2702 +U 8367 ; WX 1272 ; N uni20AF ; G 2703 +U 8368 ; WX 636 ; N uni20B0 ; G 2704 +U 8369 ; WX 636 ; N uni20B1 ; G 2705 +U 8370 ; WX 636 ; N uni20B2 ; G 2706 +U 8371 ; WX 636 ; N uni20B3 ; G 2707 +U 8372 ; WX 774 ; N uni20B4 ; G 2708 +U 8373 ; WX 636 ; N uni20B5 ; G 2709 +U 8376 ; WX 636 ; N uni20B8 ; G 2710 +U 8377 ; WX 636 ; N uni20B9 ; G 2711 +U 8378 ; WX 636 ; N uni20BA ; G 2712 +U 8381 ; WX 636 ; N uni20BD ; G 2713 +U 8400 ; WX 0 ; N uni20D0 ; G 2714 +U 8401 ; WX 0 ; N uni20D1 ; G 2715 +U 8406 ; WX 0 ; N uni20D6 ; G 2716 +U 8407 ; WX 0 ; N uni20D7 ; G 2717 +U 8411 ; WX 0 ; N uni20DB ; G 2718 +U 8412 ; WX 0 ; N uni20DC ; G 2719 +U 8417 ; WX 0 ; N uni20E1 ; G 2720 +U 8448 ; WX 970 ; N uni2100 ; G 2721 +U 8449 ; WX 970 ; N uni2101 ; G 2722 +U 8450 ; WX 698 ; N uni2102 ; G 2723 +U 8451 ; WX 1123 ; N uni2103 ; G 2724 +U 8452 ; WX 896 ; N uni2104 ; G 2725 +U 8453 ; WX 969 ; N uni2105 ; G 2726 +U 8454 ; WX 1032 ; N uni2106 ; G 2727 +U 8455 ; WX 614 ; N uni2107 ; G 2728 +U 8456 ; WX 698 ; N uni2108 ; G 2729 +U 8457 ; WX 952 ; N uni2109 ; G 2730 +U 8459 ; WX 988 ; N uni210B ; G 2731 +U 8460 ; WX 754 ; N uni210C ; G 2732 +U 8461 ; WX 850 ; N uni210D ; G 2733 +U 8462 ; WX 634 ; N uni210E ; G 2734 +U 8463 ; WX 634 ; N uni210F ; G 2735 +U 8464 ; WX 470 ; N uni2110 ; G 2736 +U 8465 ; WX 697 ; N Ifraktur ; G 2737 +U 8466 ; WX 720 ; N uni2112 ; G 2738 +U 8467 ; WX 413 ; N uni2113 ; G 2739 +U 8468 ; WX 818 ; N uni2114 ; G 2740 +U 8469 ; WX 801 ; N uni2115 ; G 2741 +U 8470 ; WX 1040 ; N uni2116 ; G 2742 +U 8471 ; WX 1000 ; N uni2117 ; G 2743 +U 8472 ; WX 697 ; N weierstrass ; G 2744 +U 8473 ; WX 701 ; N uni2119 ; G 2745 +U 8474 ; WX 787 ; N uni211A ; G 2746 +U 8475 ; WX 798 ; N uni211B ; G 2747 +U 8476 ; WX 814 ; N Rfraktur ; G 2748 +U 8477 ; WX 792 ; N uni211D ; G 2749 +U 8478 ; WX 896 ; N prescription ; G 2750 +U 8479 ; WX 684 ; N uni211F ; G 2751 +U 8480 ; WX 1020 ; N uni2120 ; G 2752 +U 8481 ; WX 1014 ; N uni2121 ; G 2753 +U 8482 ; WX 1000 ; N trademark ; G 2754 +U 8483 ; WX 684 ; N uni2123 ; G 2755 +U 8484 ; WX 745 ; N uni2124 ; G 2756 +U 8485 ; WX 578 ; N uni2125 ; G 2757 +U 8486 ; WX 764 ; N uni2126 ; G 2758 +U 8487 ; WX 764 ; N uni2127 ; G 2759 +U 8488 ; WX 616 ; N uni2128 ; G 2760 +U 8489 ; WX 338 ; N uni2129 ; G 2761 +U 8490 ; WX 656 ; N uni212A ; G 2762 +U 8491 ; WX 684 ; N uni212B ; G 2763 +U 8492 ; WX 786 ; N uni212C ; G 2764 +U 8493 ; WX 703 ; N uni212D ; G 2765 +U 8494 ; WX 854 ; N estimated ; G 2766 +U 8495 ; WX 592 ; N uni212F ; G 2767 +U 8496 ; WX 605 ; N uni2130 ; G 2768 +U 8497 ; WX 786 ; N uni2131 ; G 2769 +U 8498 ; WX 575 ; N uni2132 ; G 2770 +U 8499 ; WX 1069 ; N uni2133 ; G 2771 +U 8500 ; WX 462 ; N uni2134 ; G 2772 +U 8501 ; WX 745 ; N aleph ; G 2773 +U 8502 ; WX 674 ; N uni2136 ; G 2774 +U 8503 ; WX 466 ; N uni2137 ; G 2775 +U 8504 ; WX 645 ; N uni2138 ; G 2776 +U 8505 ; WX 380 ; N uni2139 ; G 2777 +U 8506 ; WX 926 ; N uni213A ; G 2778 +U 8507 ; WX 1157 ; N uni213B ; G 2779 +U 8508 ; WX 702 ; N uni213C ; G 2780 +U 8509 ; WX 728 ; N uni213D ; G 2781 +U 8510 ; WX 654 ; N uni213E ; G 2782 +U 8511 ; WX 849 ; N uni213F ; G 2783 +U 8512 ; WX 811 ; N uni2140 ; G 2784 +U 8513 ; WX 775 ; N uni2141 ; G 2785 +U 8514 ; WX 557 ; N uni2142 ; G 2786 +U 8515 ; WX 557 ; N uni2143 ; G 2787 +U 8516 ; WX 611 ; N uni2144 ; G 2788 +U 8517 ; WX 819 ; N uni2145 ; G 2789 +U 8518 ; WX 708 ; N uni2146 ; G 2790 +U 8519 ; WX 615 ; N uni2147 ; G 2791 +U 8520 ; WX 351 ; N uni2148 ; G 2792 +U 8521 ; WX 351 ; N uni2149 ; G 2793 +U 8523 ; WX 780 ; N uni214B ; G 2794 +U 8526 ; WX 526 ; N uni214E ; G 2795 +U 8528 ; WX 969 ; N uni2150 ; G 2796 +U 8529 ; WX 969 ; N uni2151 ; G 2797 +U 8530 ; WX 1370 ; N uni2152 ; G 2798 +U 8531 ; WX 969 ; N onethird ; G 2799 +U 8532 ; WX 969 ; N twothirds ; G 2800 +U 8533 ; WX 969 ; N uni2155 ; G 2801 +U 8534 ; WX 969 ; N uni2156 ; G 2802 +U 8535 ; WX 969 ; N uni2157 ; G 2803 +U 8536 ; WX 969 ; N uni2158 ; G 2804 +U 8537 ; WX 969 ; N uni2159 ; G 2805 +U 8538 ; WX 969 ; N uni215A ; G 2806 +U 8539 ; WX 969 ; N oneeighth ; G 2807 +U 8540 ; WX 969 ; N threeeighths ; G 2808 +U 8541 ; WX 969 ; N fiveeighths ; G 2809 +U 8542 ; WX 969 ; N seveneighths ; G 2810 +U 8543 ; WX 568 ; N uni215F ; G 2811 +U 8544 ; WX 295 ; N uni2160 ; G 2812 +U 8545 ; WX 492 ; N uni2161 ; G 2813 +U 8546 ; WX 689 ; N uni2162 ; G 2814 +U 8547 ; WX 923 ; N uni2163 ; G 2815 +U 8548 ; WX 684 ; N uni2164 ; G 2816 +U 8549 ; WX 922 ; N uni2165 ; G 2817 +U 8550 ; WX 1120 ; N uni2166 ; G 2818 +U 8551 ; WX 1317 ; N uni2167 ; G 2819 +U 8552 ; WX 917 ; N uni2168 ; G 2820 +U 8553 ; WX 685 ; N uni2169 ; G 2821 +U 8554 ; WX 933 ; N uni216A ; G 2822 +U 8555 ; WX 1131 ; N uni216B ; G 2823 +U 8556 ; WX 557 ; N uni216C ; G 2824 +U 8557 ; WX 698 ; N uni216D ; G 2825 +U 8558 ; WX 770 ; N uni216E ; G 2826 +U 8559 ; WX 863 ; N uni216F ; G 2827 +U 8560 ; WX 278 ; N uni2170 ; G 2828 +U 8561 ; WX 458 ; N uni2171 ; G 2829 +U 8562 ; WX 637 ; N uni2172 ; G 2830 +U 8563 ; WX 812 ; N uni2173 ; G 2831 +U 8564 ; WX 592 ; N uni2174 ; G 2832 +U 8565 ; WX 811 ; N uni2175 ; G 2833 +U 8566 ; WX 991 ; N uni2176 ; G 2834 +U 8567 ; WX 1170 ; N uni2177 ; G 2835 +U 8568 ; WX 819 ; N uni2178 ; G 2836 +U 8569 ; WX 592 ; N uni2179 ; G 2837 +U 8570 ; WX 822 ; N uni217A ; G 2838 +U 8571 ; WX 1002 ; N uni217B ; G 2839 +U 8572 ; WX 278 ; N uni217C ; G 2840 +U 8573 ; WX 550 ; N uni217D ; G 2841 +U 8574 ; WX 635 ; N uni217E ; G 2842 +U 8575 ; WX 974 ; N uni217F ; G 2843 +U 8576 ; WX 1245 ; N uni2180 ; G 2844 +U 8577 ; WX 770 ; N uni2181 ; G 2845 +U 8578 ; WX 1245 ; N uni2182 ; G 2846 +U 8579 ; WX 703 ; N uni2183 ; G 2847 +U 8580 ; WX 549 ; N uni2184 ; G 2848 +U 8581 ; WX 698 ; N uni2185 ; G 2849 +U 8585 ; WX 969 ; N uni2189 ; G 2850 +U 8592 ; WX 838 ; N arrowleft ; G 2851 +U 8593 ; WX 838 ; N arrowup ; G 2852 +U 8594 ; WX 838 ; N arrowright ; G 2853 +U 8595 ; WX 838 ; N arrowdown ; G 2854 +U 8596 ; WX 838 ; N arrowboth ; G 2855 +U 8597 ; WX 838 ; N arrowupdn ; G 2856 +U 8598 ; WX 838 ; N uni2196 ; G 2857 +U 8599 ; WX 838 ; N uni2197 ; G 2858 +U 8600 ; WX 838 ; N uni2198 ; G 2859 +U 8601 ; WX 838 ; N uni2199 ; G 2860 +U 8602 ; WX 838 ; N uni219A ; G 2861 +U 8603 ; WX 838 ; N uni219B ; G 2862 +U 8604 ; WX 838 ; N uni219C ; G 2863 +U 8605 ; WX 838 ; N uni219D ; G 2864 +U 8606 ; WX 838 ; N uni219E ; G 2865 +U 8607 ; WX 838 ; N uni219F ; G 2866 +U 8608 ; WX 838 ; N uni21A0 ; G 2867 +U 8609 ; WX 838 ; N uni21A1 ; G 2868 +U 8610 ; WX 838 ; N uni21A2 ; G 2869 +U 8611 ; WX 838 ; N uni21A3 ; G 2870 +U 8612 ; WX 838 ; N uni21A4 ; G 2871 +U 8613 ; WX 838 ; N uni21A5 ; G 2872 +U 8614 ; WX 838 ; N uni21A6 ; G 2873 +U 8615 ; WX 838 ; N uni21A7 ; G 2874 +U 8616 ; WX 838 ; N arrowupdnbse ; G 2875 +U 8617 ; WX 838 ; N uni21A9 ; G 2876 +U 8618 ; WX 838 ; N uni21AA ; G 2877 +U 8619 ; WX 838 ; N uni21AB ; G 2878 +U 8620 ; WX 838 ; N uni21AC ; G 2879 +U 8621 ; WX 838 ; N uni21AD ; G 2880 +U 8622 ; WX 838 ; N uni21AE ; G 2881 +U 8623 ; WX 838 ; N uni21AF ; G 2882 +U 8624 ; WX 838 ; N uni21B0 ; G 2883 +U 8625 ; WX 838 ; N uni21B1 ; G 2884 +U 8626 ; WX 838 ; N uni21B2 ; G 2885 +U 8627 ; WX 838 ; N uni21B3 ; G 2886 +U 8628 ; WX 838 ; N uni21B4 ; G 2887 +U 8629 ; WX 838 ; N carriagereturn ; G 2888 +U 8630 ; WX 838 ; N uni21B6 ; G 2889 +U 8631 ; WX 838 ; N uni21B7 ; G 2890 +U 8632 ; WX 838 ; N uni21B8 ; G 2891 +U 8633 ; WX 838 ; N uni21B9 ; G 2892 +U 8634 ; WX 838 ; N uni21BA ; G 2893 +U 8635 ; WX 838 ; N uni21BB ; G 2894 +U 8636 ; WX 838 ; N uni21BC ; G 2895 +U 8637 ; WX 838 ; N uni21BD ; G 2896 +U 8638 ; WX 838 ; N uni21BE ; G 2897 +U 8639 ; WX 838 ; N uni21BF ; G 2898 +U 8640 ; WX 838 ; N uni21C0 ; G 2899 +U 8641 ; WX 838 ; N uni21C1 ; G 2900 +U 8642 ; WX 838 ; N uni21C2 ; G 2901 +U 8643 ; WX 838 ; N uni21C3 ; G 2902 +U 8644 ; WX 838 ; N uni21C4 ; G 2903 +U 8645 ; WX 838 ; N uni21C5 ; G 2904 +U 8646 ; WX 838 ; N uni21C6 ; G 2905 +U 8647 ; WX 838 ; N uni21C7 ; G 2906 +U 8648 ; WX 838 ; N uni21C8 ; G 2907 +U 8649 ; WX 838 ; N uni21C9 ; G 2908 +U 8650 ; WX 838 ; N uni21CA ; G 2909 +U 8651 ; WX 838 ; N uni21CB ; G 2910 +U 8652 ; WX 838 ; N uni21CC ; G 2911 +U 8653 ; WX 838 ; N uni21CD ; G 2912 +U 8654 ; WX 838 ; N uni21CE ; G 2913 +U 8655 ; WX 838 ; N uni21CF ; G 2914 +U 8656 ; WX 838 ; N arrowdblleft ; G 2915 +U 8657 ; WX 838 ; N arrowdblup ; G 2916 +U 8658 ; WX 838 ; N arrowdblright ; G 2917 +U 8659 ; WX 838 ; N arrowdbldown ; G 2918 +U 8660 ; WX 838 ; N arrowdblboth ; G 2919 +U 8661 ; WX 838 ; N uni21D5 ; G 2920 +U 8662 ; WX 838 ; N uni21D6 ; G 2921 +U 8663 ; WX 838 ; N uni21D7 ; G 2922 +U 8664 ; WX 838 ; N uni21D8 ; G 2923 +U 8665 ; WX 838 ; N uni21D9 ; G 2924 +U 8666 ; WX 838 ; N uni21DA ; G 2925 +U 8667 ; WX 838 ; N uni21DB ; G 2926 +U 8668 ; WX 838 ; N uni21DC ; G 2927 +U 8669 ; WX 838 ; N uni21DD ; G 2928 +U 8670 ; WX 838 ; N uni21DE ; G 2929 +U 8671 ; WX 838 ; N uni21DF ; G 2930 +U 8672 ; WX 838 ; N uni21E0 ; G 2931 +U 8673 ; WX 838 ; N uni21E1 ; G 2932 +U 8674 ; WX 838 ; N uni21E2 ; G 2933 +U 8675 ; WX 838 ; N uni21E3 ; G 2934 +U 8676 ; WX 838 ; N uni21E4 ; G 2935 +U 8677 ; WX 838 ; N uni21E5 ; G 2936 +U 8678 ; WX 838 ; N uni21E6 ; G 2937 +U 8679 ; WX 838 ; N uni21E7 ; G 2938 +U 8680 ; WX 838 ; N uni21E8 ; G 2939 +U 8681 ; WX 838 ; N uni21E9 ; G 2940 +U 8682 ; WX 838 ; N uni21EA ; G 2941 +U 8683 ; WX 838 ; N uni21EB ; G 2942 +U 8684 ; WX 838 ; N uni21EC ; G 2943 +U 8685 ; WX 838 ; N uni21ED ; G 2944 +U 8686 ; WX 838 ; N uni21EE ; G 2945 +U 8687 ; WX 838 ; N uni21EF ; G 2946 +U 8688 ; WX 838 ; N uni21F0 ; G 2947 +U 8689 ; WX 838 ; N uni21F1 ; G 2948 +U 8690 ; WX 838 ; N uni21F2 ; G 2949 +U 8691 ; WX 838 ; N uni21F3 ; G 2950 +U 8692 ; WX 838 ; N uni21F4 ; G 2951 +U 8693 ; WX 838 ; N uni21F5 ; G 2952 +U 8694 ; WX 838 ; N uni21F6 ; G 2953 +U 8695 ; WX 838 ; N uni21F7 ; G 2954 +U 8696 ; WX 838 ; N uni21F8 ; G 2955 +U 8697 ; WX 838 ; N uni21F9 ; G 2956 +U 8698 ; WX 838 ; N uni21FA ; G 2957 +U 8699 ; WX 838 ; N uni21FB ; G 2958 +U 8700 ; WX 838 ; N uni21FC ; G 2959 +U 8701 ; WX 838 ; N uni21FD ; G 2960 +U 8702 ; WX 838 ; N uni21FE ; G 2961 +U 8703 ; WX 838 ; N uni21FF ; G 2962 +U 8704 ; WX 684 ; N universal ; G 2963 +U 8705 ; WX 636 ; N uni2201 ; G 2964 +U 8706 ; WX 517 ; N partialdiff ; G 2965 +U 8707 ; WX 632 ; N existential ; G 2966 +U 8708 ; WX 632 ; N uni2204 ; G 2967 +U 8709 ; WX 871 ; N emptyset ; G 2968 +U 8710 ; WX 669 ; N increment ; G 2969 +U 8711 ; WX 669 ; N gradient ; G 2970 +U 8712 ; WX 871 ; N element ; G 2971 +U 8713 ; WX 871 ; N notelement ; G 2972 +U 8714 ; WX 718 ; N uni220A ; G 2973 +U 8715 ; WX 871 ; N suchthat ; G 2974 +U 8716 ; WX 871 ; N uni220C ; G 2975 +U 8717 ; WX 718 ; N uni220D ; G 2976 +U 8718 ; WX 636 ; N uni220E ; G 2977 +U 8719 ; WX 757 ; N product ; G 2978 +U 8720 ; WX 757 ; N uni2210 ; G 2979 +U 8721 ; WX 674 ; N summation ; G 2980 +U 8722 ; WX 838 ; N minus ; G 2981 +U 8723 ; WX 838 ; N uni2213 ; G 2982 +U 8724 ; WX 838 ; N uni2214 ; G 2983 +U 8725 ; WX 337 ; N uni2215 ; G 2984 +U 8726 ; WX 637 ; N uni2216 ; G 2985 +U 8727 ; WX 838 ; N asteriskmath ; G 2986 +U 8728 ; WX 626 ; N uni2218 ; G 2987 +U 8729 ; WX 626 ; N uni2219 ; G 2988 +U 8730 ; WX 637 ; N radical ; G 2989 +U 8731 ; WX 637 ; N uni221B ; G 2990 +U 8732 ; WX 637 ; N uni221C ; G 2991 +U 8733 ; WX 714 ; N proportional ; G 2992 +U 8734 ; WX 833 ; N infinity ; G 2993 +U 8735 ; WX 838 ; N orthogonal ; G 2994 +U 8736 ; WX 896 ; N angle ; G 2995 +U 8737 ; WX 896 ; N uni2221 ; G 2996 +U 8738 ; WX 838 ; N uni2222 ; G 2997 +U 8739 ; WX 500 ; N uni2223 ; G 2998 +U 8740 ; WX 500 ; N uni2224 ; G 2999 +U 8741 ; WX 500 ; N uni2225 ; G 3000 +U 8742 ; WX 500 ; N uni2226 ; G 3001 +U 8743 ; WX 732 ; N logicaland ; G 3002 +U 8744 ; WX 732 ; N logicalor ; G 3003 +U 8745 ; WX 732 ; N intersection ; G 3004 +U 8746 ; WX 732 ; N union ; G 3005 +U 8747 ; WX 521 ; N integral ; G 3006 +U 8748 ; WX 789 ; N uni222C ; G 3007 +U 8749 ; WX 1057 ; N uni222D ; G 3008 +U 8750 ; WX 521 ; N uni222E ; G 3009 +U 8751 ; WX 789 ; N uni222F ; G 3010 +U 8752 ; WX 1057 ; N uni2230 ; G 3011 +U 8753 ; WX 521 ; N uni2231 ; G 3012 +U 8754 ; WX 521 ; N uni2232 ; G 3013 +U 8755 ; WX 521 ; N uni2233 ; G 3014 +U 8756 ; WX 636 ; N therefore ; G 3015 +U 8757 ; WX 636 ; N uni2235 ; G 3016 +U 8758 ; WX 260 ; N uni2236 ; G 3017 +U 8759 ; WX 636 ; N uni2237 ; G 3018 +U 8760 ; WX 838 ; N uni2238 ; G 3019 +U 8761 ; WX 838 ; N uni2239 ; G 3020 +U 8762 ; WX 838 ; N uni223A ; G 3021 +U 8763 ; WX 838 ; N uni223B ; G 3022 +U 8764 ; WX 838 ; N similar ; G 3023 +U 8765 ; WX 838 ; N uni223D ; G 3024 +U 8766 ; WX 838 ; N uni223E ; G 3025 +U 8767 ; WX 838 ; N uni223F ; G 3026 +U 8768 ; WX 375 ; N uni2240 ; G 3027 +U 8769 ; WX 838 ; N uni2241 ; G 3028 +U 8770 ; WX 838 ; N uni2242 ; G 3029 +U 8771 ; WX 838 ; N uni2243 ; G 3030 +U 8772 ; WX 838 ; N uni2244 ; G 3031 +U 8773 ; WX 838 ; N congruent ; G 3032 +U 8774 ; WX 838 ; N uni2246 ; G 3033 +U 8775 ; WX 838 ; N uni2247 ; G 3034 +U 8776 ; WX 838 ; N approxequal ; G 3035 +U 8777 ; WX 838 ; N uni2249 ; G 3036 +U 8778 ; WX 838 ; N uni224A ; G 3037 +U 8779 ; WX 838 ; N uni224B ; G 3038 +U 8780 ; WX 838 ; N uni224C ; G 3039 +U 8781 ; WX 838 ; N uni224D ; G 3040 +U 8782 ; WX 838 ; N uni224E ; G 3041 +U 8783 ; WX 838 ; N uni224F ; G 3042 +U 8784 ; WX 838 ; N uni2250 ; G 3043 +U 8785 ; WX 838 ; N uni2251 ; G 3044 +U 8786 ; WX 838 ; N uni2252 ; G 3045 +U 8787 ; WX 838 ; N uni2253 ; G 3046 +U 8788 ; WX 1000 ; N uni2254 ; G 3047 +U 8789 ; WX 1000 ; N uni2255 ; G 3048 +U 8790 ; WX 838 ; N uni2256 ; G 3049 +U 8791 ; WX 838 ; N uni2257 ; G 3050 +U 8792 ; WX 838 ; N uni2258 ; G 3051 +U 8793 ; WX 838 ; N uni2259 ; G 3052 +U 8794 ; WX 838 ; N uni225A ; G 3053 +U 8795 ; WX 838 ; N uni225B ; G 3054 +U 8796 ; WX 838 ; N uni225C ; G 3055 +U 8797 ; WX 838 ; N uni225D ; G 3056 +U 8798 ; WX 838 ; N uni225E ; G 3057 +U 8799 ; WX 838 ; N uni225F ; G 3058 +U 8800 ; WX 838 ; N notequal ; G 3059 +U 8801 ; WX 838 ; N equivalence ; G 3060 +U 8802 ; WX 838 ; N uni2262 ; G 3061 +U 8803 ; WX 838 ; N uni2263 ; G 3062 +U 8804 ; WX 838 ; N lessequal ; G 3063 +U 8805 ; WX 838 ; N greaterequal ; G 3064 +U 8806 ; WX 838 ; N uni2266 ; G 3065 +U 8807 ; WX 838 ; N uni2267 ; G 3066 +U 8808 ; WX 838 ; N uni2268 ; G 3067 +U 8809 ; WX 838 ; N uni2269 ; G 3068 +U 8810 ; WX 1047 ; N uni226A ; G 3069 +U 8811 ; WX 1047 ; N uni226B ; G 3070 +U 8812 ; WX 464 ; N uni226C ; G 3071 +U 8813 ; WX 838 ; N uni226D ; G 3072 +U 8814 ; WX 838 ; N uni226E ; G 3073 +U 8815 ; WX 838 ; N uni226F ; G 3074 +U 8816 ; WX 838 ; N uni2270 ; G 3075 +U 8817 ; WX 838 ; N uni2271 ; G 3076 +U 8818 ; WX 838 ; N uni2272 ; G 3077 +U 8819 ; WX 838 ; N uni2273 ; G 3078 +U 8820 ; WX 838 ; N uni2274 ; G 3079 +U 8821 ; WX 838 ; N uni2275 ; G 3080 +U 8822 ; WX 838 ; N uni2276 ; G 3081 +U 8823 ; WX 838 ; N uni2277 ; G 3082 +U 8824 ; WX 838 ; N uni2278 ; G 3083 +U 8825 ; WX 838 ; N uni2279 ; G 3084 +U 8826 ; WX 838 ; N uni227A ; G 3085 +U 8827 ; WX 838 ; N uni227B ; G 3086 +U 8828 ; WX 838 ; N uni227C ; G 3087 +U 8829 ; WX 838 ; N uni227D ; G 3088 +U 8830 ; WX 838 ; N uni227E ; G 3089 +U 8831 ; WX 838 ; N uni227F ; G 3090 +U 8832 ; WX 838 ; N uni2280 ; G 3091 +U 8833 ; WX 838 ; N uni2281 ; G 3092 +U 8834 ; WX 838 ; N propersubset ; G 3093 +U 8835 ; WX 838 ; N propersuperset ; G 3094 +U 8836 ; WX 838 ; N notsubset ; G 3095 +U 8837 ; WX 838 ; N uni2285 ; G 3096 +U 8838 ; WX 838 ; N reflexsubset ; G 3097 +U 8839 ; WX 838 ; N reflexsuperset ; G 3098 +U 8840 ; WX 838 ; N uni2288 ; G 3099 +U 8841 ; WX 838 ; N uni2289 ; G 3100 +U 8842 ; WX 838 ; N uni228A ; G 3101 +U 8843 ; WX 838 ; N uni228B ; G 3102 +U 8844 ; WX 732 ; N uni228C ; G 3103 +U 8845 ; WX 732 ; N uni228D ; G 3104 +U 8846 ; WX 732 ; N uni228E ; G 3105 +U 8847 ; WX 838 ; N uni228F ; G 3106 +U 8848 ; WX 838 ; N uni2290 ; G 3107 +U 8849 ; WX 838 ; N uni2291 ; G 3108 +U 8850 ; WX 838 ; N uni2292 ; G 3109 +U 8851 ; WX 780 ; N uni2293 ; G 3110 +U 8852 ; WX 780 ; N uni2294 ; G 3111 +U 8853 ; WX 838 ; N circleplus ; G 3112 +U 8854 ; WX 838 ; N uni2296 ; G 3113 +U 8855 ; WX 838 ; N circlemultiply ; G 3114 +U 8856 ; WX 838 ; N uni2298 ; G 3115 +U 8857 ; WX 838 ; N uni2299 ; G 3116 +U 8858 ; WX 838 ; N uni229A ; G 3117 +U 8859 ; WX 838 ; N uni229B ; G 3118 +U 8860 ; WX 838 ; N uni229C ; G 3119 +U 8861 ; WX 838 ; N uni229D ; G 3120 +U 8862 ; WX 838 ; N uni229E ; G 3121 +U 8863 ; WX 838 ; N uni229F ; G 3122 +U 8864 ; WX 838 ; N uni22A0 ; G 3123 +U 8865 ; WX 838 ; N uni22A1 ; G 3124 +U 8866 ; WX 871 ; N uni22A2 ; G 3125 +U 8867 ; WX 871 ; N uni22A3 ; G 3126 +U 8868 ; WX 871 ; N uni22A4 ; G 3127 +U 8869 ; WX 871 ; N perpendicular ; G 3128 +U 8870 ; WX 521 ; N uni22A6 ; G 3129 +U 8871 ; WX 521 ; N uni22A7 ; G 3130 +U 8872 ; WX 871 ; N uni22A8 ; G 3131 +U 8873 ; WX 871 ; N uni22A9 ; G 3132 +U 8874 ; WX 871 ; N uni22AA ; G 3133 +U 8875 ; WX 871 ; N uni22AB ; G 3134 +U 8876 ; WX 871 ; N uni22AC ; G 3135 +U 8877 ; WX 871 ; N uni22AD ; G 3136 +U 8878 ; WX 871 ; N uni22AE ; G 3137 +U 8879 ; WX 871 ; N uni22AF ; G 3138 +U 8880 ; WX 838 ; N uni22B0 ; G 3139 +U 8881 ; WX 838 ; N uni22B1 ; G 3140 +U 8882 ; WX 838 ; N uni22B2 ; G 3141 +U 8883 ; WX 838 ; N uni22B3 ; G 3142 +U 8884 ; WX 838 ; N uni22B4 ; G 3143 +U 8885 ; WX 838 ; N uni22B5 ; G 3144 +U 8886 ; WX 1000 ; N uni22B6 ; G 3145 +U 8887 ; WX 1000 ; N uni22B7 ; G 3146 +U 8888 ; WX 838 ; N uni22B8 ; G 3147 +U 8889 ; WX 838 ; N uni22B9 ; G 3148 +U 8890 ; WX 521 ; N uni22BA ; G 3149 +U 8891 ; WX 732 ; N uni22BB ; G 3150 +U 8892 ; WX 732 ; N uni22BC ; G 3151 +U 8893 ; WX 732 ; N uni22BD ; G 3152 +U 8894 ; WX 838 ; N uni22BE ; G 3153 +U 8895 ; WX 838 ; N uni22BF ; G 3154 +U 8896 ; WX 820 ; N uni22C0 ; G 3155 +U 8897 ; WX 820 ; N uni22C1 ; G 3156 +U 8898 ; WX 820 ; N uni22C2 ; G 3157 +U 8899 ; WX 820 ; N uni22C3 ; G 3158 +U 8900 ; WX 626 ; N uni22C4 ; G 3159 +U 8901 ; WX 318 ; N dotmath ; G 3160 +U 8902 ; WX 626 ; N uni22C6 ; G 3161 +U 8903 ; WX 838 ; N uni22C7 ; G 3162 +U 8904 ; WX 1000 ; N uni22C8 ; G 3163 +U 8905 ; WX 1000 ; N uni22C9 ; G 3164 +U 8906 ; WX 1000 ; N uni22CA ; G 3165 +U 8907 ; WX 1000 ; N uni22CB ; G 3166 +U 8908 ; WX 1000 ; N uni22CC ; G 3167 +U 8909 ; WX 838 ; N uni22CD ; G 3168 +U 8910 ; WX 732 ; N uni22CE ; G 3169 +U 8911 ; WX 732 ; N uni22CF ; G 3170 +U 8912 ; WX 838 ; N uni22D0 ; G 3171 +U 8913 ; WX 838 ; N uni22D1 ; G 3172 +U 8914 ; WX 838 ; N uni22D2 ; G 3173 +U 8915 ; WX 838 ; N uni22D3 ; G 3174 +U 8916 ; WX 838 ; N uni22D4 ; G 3175 +U 8917 ; WX 838 ; N uni22D5 ; G 3176 +U 8918 ; WX 838 ; N uni22D6 ; G 3177 +U 8919 ; WX 838 ; N uni22D7 ; G 3178 +U 8920 ; WX 1422 ; N uni22D8 ; G 3179 +U 8921 ; WX 1422 ; N uni22D9 ; G 3180 +U 8922 ; WX 838 ; N uni22DA ; G 3181 +U 8923 ; WX 838 ; N uni22DB ; G 3182 +U 8924 ; WX 838 ; N uni22DC ; G 3183 +U 8925 ; WX 838 ; N uni22DD ; G 3184 +U 8926 ; WX 838 ; N uni22DE ; G 3185 +U 8927 ; WX 838 ; N uni22DF ; G 3186 +U 8928 ; WX 838 ; N uni22E0 ; G 3187 +U 8929 ; WX 838 ; N uni22E1 ; G 3188 +U 8930 ; WX 838 ; N uni22E2 ; G 3189 +U 8931 ; WX 838 ; N uni22E3 ; G 3190 +U 8932 ; WX 838 ; N uni22E4 ; G 3191 +U 8933 ; WX 838 ; N uni22E5 ; G 3192 +U 8934 ; WX 838 ; N uni22E6 ; G 3193 +U 8935 ; WX 838 ; N uni22E7 ; G 3194 +U 8936 ; WX 838 ; N uni22E8 ; G 3195 +U 8937 ; WX 838 ; N uni22E9 ; G 3196 +U 8938 ; WX 838 ; N uni22EA ; G 3197 +U 8939 ; WX 838 ; N uni22EB ; G 3198 +U 8940 ; WX 838 ; N uni22EC ; G 3199 +U 8941 ; WX 838 ; N uni22ED ; G 3200 +U 8942 ; WX 1000 ; N uni22EE ; G 3201 +U 8943 ; WX 1000 ; N uni22EF ; G 3202 +U 8944 ; WX 1000 ; N uni22F0 ; G 3203 +U 8945 ; WX 1000 ; N uni22F1 ; G 3204 +U 8946 ; WX 1000 ; N uni22F2 ; G 3205 +U 8947 ; WX 871 ; N uni22F3 ; G 3206 +U 8948 ; WX 718 ; N uni22F4 ; G 3207 +U 8949 ; WX 871 ; N uni22F5 ; G 3208 +U 8950 ; WX 871 ; N uni22F6 ; G 3209 +U 8951 ; WX 718 ; N uni22F7 ; G 3210 +U 8952 ; WX 871 ; N uni22F8 ; G 3211 +U 8953 ; WX 871 ; N uni22F9 ; G 3212 +U 8954 ; WX 1000 ; N uni22FA ; G 3213 +U 8955 ; WX 871 ; N uni22FB ; G 3214 +U 8956 ; WX 718 ; N uni22FC ; G 3215 +U 8957 ; WX 871 ; N uni22FD ; G 3216 +U 8958 ; WX 718 ; N uni22FE ; G 3217 +U 8959 ; WX 871 ; N uni22FF ; G 3218 +U 8960 ; WX 602 ; N uni2300 ; G 3219 +U 8961 ; WX 602 ; N uni2301 ; G 3220 +U 8962 ; WX 635 ; N house ; G 3221 +U 8963 ; WX 838 ; N uni2303 ; G 3222 +U 8964 ; WX 838 ; N uni2304 ; G 3223 +U 8965 ; WX 838 ; N uni2305 ; G 3224 +U 8966 ; WX 838 ; N uni2306 ; G 3225 +U 8967 ; WX 488 ; N uni2307 ; G 3226 +U 8968 ; WX 390 ; N uni2308 ; G 3227 +U 8969 ; WX 390 ; N uni2309 ; G 3228 +U 8970 ; WX 390 ; N uni230A ; G 3229 +U 8971 ; WX 390 ; N uni230B ; G 3230 +U 8972 ; WX 809 ; N uni230C ; G 3231 +U 8973 ; WX 809 ; N uni230D ; G 3232 +U 8974 ; WX 809 ; N uni230E ; G 3233 +U 8975 ; WX 809 ; N uni230F ; G 3234 +U 8976 ; WX 838 ; N revlogicalnot ; G 3235 +U 8977 ; WX 513 ; N uni2311 ; G 3236 +U 8984 ; WX 1000 ; N uni2318 ; G 3237 +U 8985 ; WX 838 ; N uni2319 ; G 3238 +U 8988 ; WX 469 ; N uni231C ; G 3239 +U 8989 ; WX 469 ; N uni231D ; G 3240 +U 8990 ; WX 469 ; N uni231E ; G 3241 +U 8991 ; WX 469 ; N uni231F ; G 3242 +U 8992 ; WX 521 ; N integraltp ; G 3243 +U 8993 ; WX 521 ; N integralbt ; G 3244 +U 8996 ; WX 1152 ; N uni2324 ; G 3245 +U 8997 ; WX 1152 ; N uni2325 ; G 3246 +U 8998 ; WX 1414 ; N uni2326 ; G 3247 +U 8999 ; WX 1152 ; N uni2327 ; G 3248 +U 9000 ; WX 1443 ; N uni2328 ; G 3249 +U 9003 ; WX 1414 ; N uni232B ; G 3250 +U 9004 ; WX 873 ; N uni232C ; G 3251 +U 9075 ; WX 338 ; N uni2373 ; G 3252 +U 9076 ; WX 635 ; N uni2374 ; G 3253 +U 9077 ; WX 837 ; N uni2375 ; G 3254 +U 9082 ; WX 659 ; N uni237A ; G 3255 +U 9085 ; WX 757 ; N uni237D ; G 3256 +U 9095 ; WX 1152 ; N uni2387 ; G 3257 +U 9108 ; WX 873 ; N uni2394 ; G 3258 +U 9115 ; WX 500 ; N uni239B ; G 3259 +U 9116 ; WX 500 ; N uni239C ; G 3260 +U 9117 ; WX 500 ; N uni239D ; G 3261 +U 9118 ; WX 500 ; N uni239E ; G 3262 +U 9119 ; WX 500 ; N uni239F ; G 3263 +U 9120 ; WX 500 ; N uni23A0 ; G 3264 +U 9121 ; WX 500 ; N uni23A1 ; G 3265 +U 9122 ; WX 500 ; N uni23A2 ; G 3266 +U 9123 ; WX 500 ; N uni23A3 ; G 3267 +U 9124 ; WX 500 ; N uni23A4 ; G 3268 +U 9125 ; WX 500 ; N uni23A5 ; G 3269 +U 9126 ; WX 500 ; N uni23A6 ; G 3270 +U 9127 ; WX 750 ; N uni23A7 ; G 3271 +U 9128 ; WX 750 ; N uni23A8 ; G 3272 +U 9129 ; WX 750 ; N uni23A9 ; G 3273 +U 9130 ; WX 750 ; N uni23AA ; G 3274 +U 9131 ; WX 750 ; N uni23AB ; G 3275 +U 9132 ; WX 750 ; N uni23AC ; G 3276 +U 9133 ; WX 750 ; N uni23AD ; G 3277 +U 9134 ; WX 521 ; N uni23AE ; G 3278 +U 9166 ; WX 838 ; N uni23CE ; G 3279 +U 9167 ; WX 945 ; N uni23CF ; G 3280 +U 9187 ; WX 873 ; N uni23E3 ; G 3281 +U 9189 ; WX 769 ; N uni23E5 ; G 3282 +U 9192 ; WX 636 ; N uni23E8 ; G 3283 +U 9250 ; WX 635 ; N uni2422 ; G 3284 +U 9251 ; WX 635 ; N uni2423 ; G 3285 +U 9312 ; WX 896 ; N uni2460 ; G 3286 +U 9313 ; WX 896 ; N uni2461 ; G 3287 +U 9314 ; WX 896 ; N uni2462 ; G 3288 +U 9315 ; WX 896 ; N uni2463 ; G 3289 +U 9316 ; WX 896 ; N uni2464 ; G 3290 +U 9317 ; WX 896 ; N uni2465 ; G 3291 +U 9318 ; WX 896 ; N uni2466 ; G 3292 +U 9319 ; WX 896 ; N uni2467 ; G 3293 +U 9320 ; WX 896 ; N uni2468 ; G 3294 +U 9321 ; WX 896 ; N uni2469 ; G 3295 +U 9472 ; WX 602 ; N SF100000 ; G 3296 +U 9473 ; WX 602 ; N uni2501 ; G 3297 +U 9474 ; WX 602 ; N SF110000 ; G 3298 +U 9475 ; WX 602 ; N uni2503 ; G 3299 +U 9476 ; WX 602 ; N uni2504 ; G 3300 +U 9477 ; WX 602 ; N uni2505 ; G 3301 +U 9478 ; WX 602 ; N uni2506 ; G 3302 +U 9479 ; WX 602 ; N uni2507 ; G 3303 +U 9480 ; WX 602 ; N uni2508 ; G 3304 +U 9481 ; WX 602 ; N uni2509 ; G 3305 +U 9482 ; WX 602 ; N uni250A ; G 3306 +U 9483 ; WX 602 ; N uni250B ; G 3307 +U 9484 ; WX 602 ; N SF010000 ; G 3308 +U 9485 ; WX 602 ; N uni250D ; G 3309 +U 9486 ; WX 602 ; N uni250E ; G 3310 +U 9487 ; WX 602 ; N uni250F ; G 3311 +U 9488 ; WX 602 ; N SF030000 ; G 3312 +U 9489 ; WX 602 ; N uni2511 ; G 3313 +U 9490 ; WX 602 ; N uni2512 ; G 3314 +U 9491 ; WX 602 ; N uni2513 ; G 3315 +U 9492 ; WX 602 ; N SF020000 ; G 3316 +U 9493 ; WX 602 ; N uni2515 ; G 3317 +U 9494 ; WX 602 ; N uni2516 ; G 3318 +U 9495 ; WX 602 ; N uni2517 ; G 3319 +U 9496 ; WX 602 ; N SF040000 ; G 3320 +U 9497 ; WX 602 ; N uni2519 ; G 3321 +U 9498 ; WX 602 ; N uni251A ; G 3322 +U 9499 ; WX 602 ; N uni251B ; G 3323 +U 9500 ; WX 602 ; N SF080000 ; G 3324 +U 9501 ; WX 602 ; N uni251D ; G 3325 +U 9502 ; WX 602 ; N uni251E ; G 3326 +U 9503 ; WX 602 ; N uni251F ; G 3327 +U 9504 ; WX 602 ; N uni2520 ; G 3328 +U 9505 ; WX 602 ; N uni2521 ; G 3329 +U 9506 ; WX 602 ; N uni2522 ; G 3330 +U 9507 ; WX 602 ; N uni2523 ; G 3331 +U 9508 ; WX 602 ; N SF090000 ; G 3332 +U 9509 ; WX 602 ; N uni2525 ; G 3333 +U 9510 ; WX 602 ; N uni2526 ; G 3334 +U 9511 ; WX 602 ; N uni2527 ; G 3335 +U 9512 ; WX 602 ; N uni2528 ; G 3336 +U 9513 ; WX 602 ; N uni2529 ; G 3337 +U 9514 ; WX 602 ; N uni252A ; G 3338 +U 9515 ; WX 602 ; N uni252B ; G 3339 +U 9516 ; WX 602 ; N SF060000 ; G 3340 +U 9517 ; WX 602 ; N uni252D ; G 3341 +U 9518 ; WX 602 ; N uni252E ; G 3342 +U 9519 ; WX 602 ; N uni252F ; G 3343 +U 9520 ; WX 602 ; N uni2530 ; G 3344 +U 9521 ; WX 602 ; N uni2531 ; G 3345 +U 9522 ; WX 602 ; N uni2532 ; G 3346 +U 9523 ; WX 602 ; N uni2533 ; G 3347 +U 9524 ; WX 602 ; N SF070000 ; G 3348 +U 9525 ; WX 602 ; N uni2535 ; G 3349 +U 9526 ; WX 602 ; N uni2536 ; G 3350 +U 9527 ; WX 602 ; N uni2537 ; G 3351 +U 9528 ; WX 602 ; N uni2538 ; G 3352 +U 9529 ; WX 602 ; N uni2539 ; G 3353 +U 9530 ; WX 602 ; N uni253A ; G 3354 +U 9531 ; WX 602 ; N uni253B ; G 3355 +U 9532 ; WX 602 ; N SF050000 ; G 3356 +U 9533 ; WX 602 ; N uni253D ; G 3357 +U 9534 ; WX 602 ; N uni253E ; G 3358 +U 9535 ; WX 602 ; N uni253F ; G 3359 +U 9536 ; WX 602 ; N uni2540 ; G 3360 +U 9537 ; WX 602 ; N uni2541 ; G 3361 +U 9538 ; WX 602 ; N uni2542 ; G 3362 +U 9539 ; WX 602 ; N uni2543 ; G 3363 +U 9540 ; WX 602 ; N uni2544 ; G 3364 +U 9541 ; WX 602 ; N uni2545 ; G 3365 +U 9542 ; WX 602 ; N uni2546 ; G 3366 +U 9543 ; WX 602 ; N uni2547 ; G 3367 +U 9544 ; WX 602 ; N uni2548 ; G 3368 +U 9545 ; WX 602 ; N uni2549 ; G 3369 +U 9546 ; WX 602 ; N uni254A ; G 3370 +U 9547 ; WX 602 ; N uni254B ; G 3371 +U 9548 ; WX 602 ; N uni254C ; G 3372 +U 9549 ; WX 602 ; N uni254D ; G 3373 +U 9550 ; WX 602 ; N uni254E ; G 3374 +U 9551 ; WX 602 ; N uni254F ; G 3375 +U 9552 ; WX 602 ; N SF430000 ; G 3376 +U 9553 ; WX 602 ; N SF240000 ; G 3377 +U 9554 ; WX 602 ; N SF510000 ; G 3378 +U 9555 ; WX 602 ; N SF520000 ; G 3379 +U 9556 ; WX 602 ; N SF390000 ; G 3380 +U 9557 ; WX 602 ; N SF220000 ; G 3381 +U 9558 ; WX 602 ; N SF210000 ; G 3382 +U 9559 ; WX 602 ; N SF250000 ; G 3383 +U 9560 ; WX 602 ; N SF500000 ; G 3384 +U 9561 ; WX 602 ; N SF490000 ; G 3385 +U 9562 ; WX 602 ; N SF380000 ; G 3386 +U 9563 ; WX 602 ; N SF280000 ; G 3387 +U 9564 ; WX 602 ; N SF270000 ; G 3388 +U 9565 ; WX 602 ; N SF260000 ; G 3389 +U 9566 ; WX 602 ; N SF360000 ; G 3390 +U 9567 ; WX 602 ; N SF370000 ; G 3391 +U 9568 ; WX 602 ; N SF420000 ; G 3392 +U 9569 ; WX 602 ; N SF190000 ; G 3393 +U 9570 ; WX 602 ; N SF200000 ; G 3394 +U 9571 ; WX 602 ; N SF230000 ; G 3395 +U 9572 ; WX 602 ; N SF470000 ; G 3396 +U 9573 ; WX 602 ; N SF480000 ; G 3397 +U 9574 ; WX 602 ; N SF410000 ; G 3398 +U 9575 ; WX 602 ; N SF450000 ; G 3399 +U 9576 ; WX 602 ; N SF460000 ; G 3400 +U 9577 ; WX 602 ; N SF400000 ; G 3401 +U 9578 ; WX 602 ; N SF540000 ; G 3402 +U 9579 ; WX 602 ; N SF530000 ; G 3403 +U 9580 ; WX 602 ; N SF440000 ; G 3404 +U 9581 ; WX 602 ; N uni256D ; G 3405 +U 9582 ; WX 602 ; N uni256E ; G 3406 +U 9583 ; WX 602 ; N uni256F ; G 3407 +U 9584 ; WX 602 ; N uni2570 ; G 3408 +U 9585 ; WX 602 ; N uni2571 ; G 3409 +U 9586 ; WX 602 ; N uni2572 ; G 3410 +U 9587 ; WX 602 ; N uni2573 ; G 3411 +U 9588 ; WX 602 ; N uni2574 ; G 3412 +U 9589 ; WX 602 ; N uni2575 ; G 3413 +U 9590 ; WX 602 ; N uni2576 ; G 3414 +U 9591 ; WX 602 ; N uni2577 ; G 3415 +U 9592 ; WX 602 ; N uni2578 ; G 3416 +U 9593 ; WX 602 ; N uni2579 ; G 3417 +U 9594 ; WX 602 ; N uni257A ; G 3418 +U 9595 ; WX 602 ; N uni257B ; G 3419 +U 9596 ; WX 602 ; N uni257C ; G 3420 +U 9597 ; WX 602 ; N uni257D ; G 3421 +U 9598 ; WX 602 ; N uni257E ; G 3422 +U 9599 ; WX 602 ; N uni257F ; G 3423 +U 9600 ; WX 769 ; N upblock ; G 3424 +U 9601 ; WX 769 ; N uni2581 ; G 3425 +U 9602 ; WX 769 ; N uni2582 ; G 3426 +U 9603 ; WX 769 ; N uni2583 ; G 3427 +U 9604 ; WX 769 ; N dnblock ; G 3428 +U 9605 ; WX 769 ; N uni2585 ; G 3429 +U 9606 ; WX 769 ; N uni2586 ; G 3430 +U 9607 ; WX 769 ; N uni2587 ; G 3431 +U 9608 ; WX 769 ; N block ; G 3432 +U 9609 ; WX 769 ; N uni2589 ; G 3433 +U 9610 ; WX 769 ; N uni258A ; G 3434 +U 9611 ; WX 769 ; N uni258B ; G 3435 +U 9612 ; WX 769 ; N lfblock ; G 3436 +U 9613 ; WX 769 ; N uni258D ; G 3437 +U 9614 ; WX 769 ; N uni258E ; G 3438 +U 9615 ; WX 769 ; N uni258F ; G 3439 +U 9616 ; WX 769 ; N rtblock ; G 3440 +U 9617 ; WX 769 ; N ltshade ; G 3441 +U 9618 ; WX 769 ; N shade ; G 3442 +U 9619 ; WX 769 ; N dkshade ; G 3443 +U 9620 ; WX 769 ; N uni2594 ; G 3444 +U 9621 ; WX 769 ; N uni2595 ; G 3445 +U 9622 ; WX 769 ; N uni2596 ; G 3446 +U 9623 ; WX 769 ; N uni2597 ; G 3447 +U 9624 ; WX 769 ; N uni2598 ; G 3448 +U 9625 ; WX 769 ; N uni2599 ; G 3449 +U 9626 ; WX 769 ; N uni259A ; G 3450 +U 9627 ; WX 769 ; N uni259B ; G 3451 +U 9628 ; WX 769 ; N uni259C ; G 3452 +U 9629 ; WX 769 ; N uni259D ; G 3453 +U 9630 ; WX 769 ; N uni259E ; G 3454 +U 9631 ; WX 769 ; N uni259F ; G 3455 +U 9632 ; WX 945 ; N filledbox ; G 3456 +U 9633 ; WX 945 ; N H22073 ; G 3457 +U 9634 ; WX 945 ; N uni25A2 ; G 3458 +U 9635 ; WX 945 ; N uni25A3 ; G 3459 +U 9636 ; WX 945 ; N uni25A4 ; G 3460 +U 9637 ; WX 945 ; N uni25A5 ; G 3461 +U 9638 ; WX 945 ; N uni25A6 ; G 3462 +U 9639 ; WX 945 ; N uni25A7 ; G 3463 +U 9640 ; WX 945 ; N uni25A8 ; G 3464 +U 9641 ; WX 945 ; N uni25A9 ; G 3465 +U 9642 ; WX 678 ; N H18543 ; G 3466 +U 9643 ; WX 678 ; N H18551 ; G 3467 +U 9644 ; WX 945 ; N filledrect ; G 3468 +U 9645 ; WX 945 ; N uni25AD ; G 3469 +U 9646 ; WX 550 ; N uni25AE ; G 3470 +U 9647 ; WX 550 ; N uni25AF ; G 3471 +U 9648 ; WX 769 ; N uni25B0 ; G 3472 +U 9649 ; WX 769 ; N uni25B1 ; G 3473 +U 9650 ; WX 769 ; N triagup ; G 3474 +U 9651 ; WX 769 ; N uni25B3 ; G 3475 +U 9652 ; WX 502 ; N uni25B4 ; G 3476 +U 9653 ; WX 502 ; N uni25B5 ; G 3477 +U 9654 ; WX 769 ; N uni25B6 ; G 3478 +U 9655 ; WX 769 ; N uni25B7 ; G 3479 +U 9656 ; WX 502 ; N uni25B8 ; G 3480 +U 9657 ; WX 502 ; N uni25B9 ; G 3481 +U 9658 ; WX 769 ; N triagrt ; G 3482 +U 9659 ; WX 769 ; N uni25BB ; G 3483 +U 9660 ; WX 769 ; N triagdn ; G 3484 +U 9661 ; WX 769 ; N uni25BD ; G 3485 +U 9662 ; WX 502 ; N uni25BE ; G 3486 +U 9663 ; WX 502 ; N uni25BF ; G 3487 +U 9664 ; WX 769 ; N uni25C0 ; G 3488 +U 9665 ; WX 769 ; N uni25C1 ; G 3489 +U 9666 ; WX 502 ; N uni25C2 ; G 3490 +U 9667 ; WX 502 ; N uni25C3 ; G 3491 +U 9668 ; WX 769 ; N triaglf ; G 3492 +U 9669 ; WX 769 ; N uni25C5 ; G 3493 +U 9670 ; WX 769 ; N uni25C6 ; G 3494 +U 9671 ; WX 769 ; N uni25C7 ; G 3495 +U 9672 ; WX 769 ; N uni25C8 ; G 3496 +U 9673 ; WX 873 ; N uni25C9 ; G 3497 +U 9674 ; WX 494 ; N lozenge ; G 3498 +U 9675 ; WX 873 ; N circle ; G 3499 +U 9676 ; WX 873 ; N uni25CC ; G 3500 +U 9677 ; WX 873 ; N uni25CD ; G 3501 +U 9678 ; WX 873 ; N uni25CE ; G 3502 +U 9679 ; WX 873 ; N H18533 ; G 3503 +U 9680 ; WX 873 ; N uni25D0 ; G 3504 +U 9681 ; WX 873 ; N uni25D1 ; G 3505 +U 9682 ; WX 873 ; N uni25D2 ; G 3506 +U 9683 ; WX 873 ; N uni25D3 ; G 3507 +U 9684 ; WX 873 ; N uni25D4 ; G 3508 +U 9685 ; WX 873 ; N uni25D5 ; G 3509 +U 9686 ; WX 527 ; N uni25D6 ; G 3510 +U 9687 ; WX 527 ; N uni25D7 ; G 3511 +U 9688 ; WX 791 ; N invbullet ; G 3512 +U 9689 ; WX 970 ; N invcircle ; G 3513 +U 9690 ; WX 970 ; N uni25DA ; G 3514 +U 9691 ; WX 970 ; N uni25DB ; G 3515 +U 9692 ; WX 387 ; N uni25DC ; G 3516 +U 9693 ; WX 387 ; N uni25DD ; G 3517 +U 9694 ; WX 387 ; N uni25DE ; G 3518 +U 9695 ; WX 387 ; N uni25DF ; G 3519 +U 9696 ; WX 769 ; N uni25E0 ; G 3520 +U 9697 ; WX 769 ; N uni25E1 ; G 3521 +U 9698 ; WX 769 ; N uni25E2 ; G 3522 +U 9699 ; WX 769 ; N uni25E3 ; G 3523 +U 9700 ; WX 769 ; N uni25E4 ; G 3524 +U 9701 ; WX 769 ; N uni25E5 ; G 3525 +U 9702 ; WX 590 ; N openbullet ; G 3526 +U 9703 ; WX 945 ; N uni25E7 ; G 3527 +U 9704 ; WX 945 ; N uni25E8 ; G 3528 +U 9705 ; WX 945 ; N uni25E9 ; G 3529 +U 9706 ; WX 945 ; N uni25EA ; G 3530 +U 9707 ; WX 945 ; N uni25EB ; G 3531 +U 9708 ; WX 769 ; N uni25EC ; G 3532 +U 9709 ; WX 769 ; N uni25ED ; G 3533 +U 9710 ; WX 769 ; N uni25EE ; G 3534 +U 9711 ; WX 1119 ; N uni25EF ; G 3535 +U 9712 ; WX 945 ; N uni25F0 ; G 3536 +U 9713 ; WX 945 ; N uni25F1 ; G 3537 +U 9714 ; WX 945 ; N uni25F2 ; G 3538 +U 9715 ; WX 945 ; N uni25F3 ; G 3539 +U 9716 ; WX 873 ; N uni25F4 ; G 3540 +U 9717 ; WX 873 ; N uni25F5 ; G 3541 +U 9718 ; WX 873 ; N uni25F6 ; G 3542 +U 9719 ; WX 873 ; N uni25F7 ; G 3543 +U 9720 ; WX 769 ; N uni25F8 ; G 3544 +U 9721 ; WX 769 ; N uni25F9 ; G 3545 +U 9722 ; WX 769 ; N uni25FA ; G 3546 +U 9723 ; WX 830 ; N uni25FB ; G 3547 +U 9724 ; WX 830 ; N uni25FC ; G 3548 +U 9725 ; WX 732 ; N uni25FD ; G 3549 +U 9726 ; WX 732 ; N uni25FE ; G 3550 +U 9727 ; WX 769 ; N uni25FF ; G 3551 +U 9728 ; WX 896 ; N uni2600 ; G 3552 +U 9729 ; WX 1000 ; N uni2601 ; G 3553 +U 9730 ; WX 896 ; N uni2602 ; G 3554 +U 9731 ; WX 896 ; N uni2603 ; G 3555 +U 9732 ; WX 896 ; N uni2604 ; G 3556 +U 9733 ; WX 896 ; N uni2605 ; G 3557 +U 9734 ; WX 896 ; N uni2606 ; G 3558 +U 9735 ; WX 573 ; N uni2607 ; G 3559 +U 9736 ; WX 896 ; N uni2608 ; G 3560 +U 9737 ; WX 896 ; N uni2609 ; G 3561 +U 9738 ; WX 888 ; N uni260A ; G 3562 +U 9739 ; WX 888 ; N uni260B ; G 3563 +U 9740 ; WX 671 ; N uni260C ; G 3564 +U 9741 ; WX 1013 ; N uni260D ; G 3565 +U 9742 ; WX 1246 ; N uni260E ; G 3566 +U 9743 ; WX 1250 ; N uni260F ; G 3567 +U 9744 ; WX 896 ; N uni2610 ; G 3568 +U 9745 ; WX 896 ; N uni2611 ; G 3569 +U 9746 ; WX 896 ; N uni2612 ; G 3570 +U 9747 ; WX 532 ; N uni2613 ; G 3571 +U 9748 ; WX 896 ; N uni2614 ; G 3572 +U 9749 ; WX 896 ; N uni2615 ; G 3573 +U 9750 ; WX 896 ; N uni2616 ; G 3574 +U 9751 ; WX 896 ; N uni2617 ; G 3575 +U 9752 ; WX 896 ; N uni2618 ; G 3576 +U 9753 ; WX 896 ; N uni2619 ; G 3577 +U 9754 ; WX 896 ; N uni261A ; G 3578 +U 9755 ; WX 896 ; N uni261B ; G 3579 +U 9756 ; WX 896 ; N uni261C ; G 3580 +U 9757 ; WX 609 ; N uni261D ; G 3581 +U 9758 ; WX 896 ; N uni261E ; G 3582 +U 9759 ; WX 609 ; N uni261F ; G 3583 +U 9760 ; WX 896 ; N uni2620 ; G 3584 +U 9761 ; WX 896 ; N uni2621 ; G 3585 +U 9762 ; WX 896 ; N uni2622 ; G 3586 +U 9763 ; WX 896 ; N uni2623 ; G 3587 +U 9764 ; WX 669 ; N uni2624 ; G 3588 +U 9765 ; WX 746 ; N uni2625 ; G 3589 +U 9766 ; WX 649 ; N uni2626 ; G 3590 +U 9767 ; WX 784 ; N uni2627 ; G 3591 +U 9768 ; WX 545 ; N uni2628 ; G 3592 +U 9769 ; WX 896 ; N uni2629 ; G 3593 +U 9770 ; WX 896 ; N uni262A ; G 3594 +U 9771 ; WX 896 ; N uni262B ; G 3595 +U 9772 ; WX 710 ; N uni262C ; G 3596 +U 9773 ; WX 896 ; N uni262D ; G 3597 +U 9774 ; WX 896 ; N uni262E ; G 3598 +U 9775 ; WX 896 ; N uni262F ; G 3599 +U 9776 ; WX 890 ; N uni2630 ; G 3600 +U 9777 ; WX 890 ; N uni2631 ; G 3601 +U 9778 ; WX 890 ; N uni2632 ; G 3602 +U 9779 ; WX 890 ; N uni2633 ; G 3603 +U 9780 ; WX 890 ; N uni2634 ; G 3604 +U 9781 ; WX 890 ; N uni2635 ; G 3605 +U 9782 ; WX 890 ; N uni2636 ; G 3606 +U 9783 ; WX 890 ; N uni2637 ; G 3607 +U 9784 ; WX 896 ; N uni2638 ; G 3608 +U 9785 ; WX 1042 ; N uni2639 ; G 3609 +U 9786 ; WX 1042 ; N smileface ; G 3610 +U 9787 ; WX 1042 ; N invsmileface ; G 3611 +U 9788 ; WX 896 ; N sun ; G 3612 +U 9789 ; WX 896 ; N uni263D ; G 3613 +U 9790 ; WX 896 ; N uni263E ; G 3614 +U 9791 ; WX 614 ; N uni263F ; G 3615 +U 9792 ; WX 732 ; N female ; G 3616 +U 9793 ; WX 732 ; N uni2641 ; G 3617 +U 9794 ; WX 896 ; N male ; G 3618 +U 9795 ; WX 896 ; N uni2643 ; G 3619 +U 9796 ; WX 896 ; N uni2644 ; G 3620 +U 9797 ; WX 896 ; N uni2645 ; G 3621 +U 9798 ; WX 896 ; N uni2646 ; G 3622 +U 9799 ; WX 896 ; N uni2647 ; G 3623 +U 9800 ; WX 896 ; N uni2648 ; G 3624 +U 9801 ; WX 896 ; N uni2649 ; G 3625 +U 9802 ; WX 896 ; N uni264A ; G 3626 +U 9803 ; WX 896 ; N uni264B ; G 3627 +U 9804 ; WX 896 ; N uni264C ; G 3628 +U 9805 ; WX 896 ; N uni264D ; G 3629 +U 9806 ; WX 896 ; N uni264E ; G 3630 +U 9807 ; WX 896 ; N uni264F ; G 3631 +U 9808 ; WX 896 ; N uni2650 ; G 3632 +U 9809 ; WX 896 ; N uni2651 ; G 3633 +U 9810 ; WX 896 ; N uni2652 ; G 3634 +U 9811 ; WX 896 ; N uni2653 ; G 3635 +U 9812 ; WX 896 ; N uni2654 ; G 3636 +U 9813 ; WX 896 ; N uni2655 ; G 3637 +U 9814 ; WX 896 ; N uni2656 ; G 3638 +U 9815 ; WX 896 ; N uni2657 ; G 3639 +U 9816 ; WX 896 ; N uni2658 ; G 3640 +U 9817 ; WX 896 ; N uni2659 ; G 3641 +U 9818 ; WX 896 ; N uni265A ; G 3642 +U 9819 ; WX 896 ; N uni265B ; G 3643 +U 9820 ; WX 896 ; N uni265C ; G 3644 +U 9821 ; WX 896 ; N uni265D ; G 3645 +U 9822 ; WX 896 ; N uni265E ; G 3646 +U 9823 ; WX 896 ; N uni265F ; G 3647 +U 9824 ; WX 896 ; N spade ; G 3648 +U 9825 ; WX 896 ; N uni2661 ; G 3649 +U 9826 ; WX 896 ; N uni2662 ; G 3650 +U 9827 ; WX 896 ; N club ; G 3651 +U 9828 ; WX 896 ; N uni2664 ; G 3652 +U 9829 ; WX 896 ; N heart ; G 3653 +U 9830 ; WX 896 ; N diamond ; G 3654 +U 9831 ; WX 896 ; N uni2667 ; G 3655 +U 9832 ; WX 896 ; N uni2668 ; G 3656 +U 9833 ; WX 472 ; N uni2669 ; G 3657 +U 9834 ; WX 638 ; N musicalnote ; G 3658 +U 9835 ; WX 896 ; N musicalnotedbl ; G 3659 +U 9836 ; WX 896 ; N uni266C ; G 3660 +U 9837 ; WX 472 ; N uni266D ; G 3661 +U 9838 ; WX 357 ; N uni266E ; G 3662 +U 9839 ; WX 484 ; N uni266F ; G 3663 +U 9840 ; WX 748 ; N uni2670 ; G 3664 +U 9841 ; WX 766 ; N uni2671 ; G 3665 +U 9842 ; WX 896 ; N uni2672 ; G 3666 +U 9843 ; WX 896 ; N uni2673 ; G 3667 +U 9844 ; WX 896 ; N uni2674 ; G 3668 +U 9845 ; WX 896 ; N uni2675 ; G 3669 +U 9846 ; WX 896 ; N uni2676 ; G 3670 +U 9847 ; WX 896 ; N uni2677 ; G 3671 +U 9848 ; WX 896 ; N uni2678 ; G 3672 +U 9849 ; WX 896 ; N uni2679 ; G 3673 +U 9850 ; WX 896 ; N uni267A ; G 3674 +U 9851 ; WX 896 ; N uni267B ; G 3675 +U 9852 ; WX 896 ; N uni267C ; G 3676 +U 9853 ; WX 896 ; N uni267D ; G 3677 +U 9854 ; WX 896 ; N uni267E ; G 3678 +U 9855 ; WX 896 ; N uni267F ; G 3679 +U 9856 ; WX 869 ; N uni2680 ; G 3680 +U 9857 ; WX 869 ; N uni2681 ; G 3681 +U 9858 ; WX 869 ; N uni2682 ; G 3682 +U 9859 ; WX 869 ; N uni2683 ; G 3683 +U 9860 ; WX 869 ; N uni2684 ; G 3684 +U 9861 ; WX 869 ; N uni2685 ; G 3685 +U 9862 ; WX 890 ; N uni2686 ; G 3686 +U 9863 ; WX 890 ; N uni2687 ; G 3687 +U 9864 ; WX 890 ; N uni2688 ; G 3688 +U 9865 ; WX 890 ; N uni2689 ; G 3689 +U 9866 ; WX 890 ; N uni268A ; G 3690 +U 9867 ; WX 890 ; N uni268B ; G 3691 +U 9868 ; WX 890 ; N uni268C ; G 3692 +U 9869 ; WX 890 ; N uni268D ; G 3693 +U 9870 ; WX 890 ; N uni268E ; G 3694 +U 9871 ; WX 890 ; N uni268F ; G 3695 +U 9872 ; WX 750 ; N uni2690 ; G 3696 +U 9873 ; WX 750 ; N uni2691 ; G 3697 +U 9874 ; WX 890 ; N uni2692 ; G 3698 +U 9875 ; WX 816 ; N uni2693 ; G 3699 +U 9876 ; WX 716 ; N uni2694 ; G 3700 +U 9877 ; WX 537 ; N uni2695 ; G 3701 +U 9878 ; WX 852 ; N uni2696 ; G 3702 +U 9879 ; WX 890 ; N uni2697 ; G 3703 +U 9880 ; WX 684 ; N uni2698 ; G 3704 +U 9881 ; WX 896 ; N uni2699 ; G 3705 +U 9882 ; WX 708 ; N uni269A ; G 3706 +U 9883 ; WX 890 ; N uni269B ; G 3707 +U 9884 ; WX 890 ; N uni269C ; G 3708 +U 9886 ; WX 896 ; N uni269E ; G 3709 +U 9887 ; WX 896 ; N uni269F ; G 3710 +U 9888 ; WX 890 ; N uni26A0 ; G 3711 +U 9889 ; WX 702 ; N uni26A1 ; G 3712 +U 9890 ; WX 1004 ; N uni26A2 ; G 3713 +U 9891 ; WX 1089 ; N uni26A3 ; G 3714 +U 9892 ; WX 1175 ; N uni26A4 ; G 3715 +U 9893 ; WX 903 ; N uni26A5 ; G 3716 +U 9894 ; WX 838 ; N uni26A6 ; G 3717 +U 9895 ; WX 838 ; N uni26A7 ; G 3718 +U 9896 ; WX 838 ; N uni26A8 ; G 3719 +U 9897 ; WX 838 ; N uni26A9 ; G 3720 +U 9898 ; WX 838 ; N uni26AA ; G 3721 +U 9899 ; WX 838 ; N uni26AB ; G 3722 +U 9900 ; WX 838 ; N uni26AC ; G 3723 +U 9901 ; WX 838 ; N uni26AD ; G 3724 +U 9902 ; WX 838 ; N uni26AE ; G 3725 +U 9903 ; WX 838 ; N uni26AF ; G 3726 +U 9904 ; WX 844 ; N uni26B0 ; G 3727 +U 9905 ; WX 838 ; N uni26B1 ; G 3728 +U 9906 ; WX 732 ; N uni26B2 ; G 3729 +U 9907 ; WX 732 ; N uni26B3 ; G 3730 +U 9908 ; WX 732 ; N uni26B4 ; G 3731 +U 9909 ; WX 732 ; N uni26B5 ; G 3732 +U 9910 ; WX 850 ; N uni26B6 ; G 3733 +U 9911 ; WX 732 ; N uni26B7 ; G 3734 +U 9912 ; WX 732 ; N uni26B8 ; G 3735 +U 9920 ; WX 838 ; N uni26C0 ; G 3736 +U 9921 ; WX 838 ; N uni26C1 ; G 3737 +U 9922 ; WX 838 ; N uni26C2 ; G 3738 +U 9923 ; WX 838 ; N uni26C3 ; G 3739 +U 9954 ; WX 732 ; N uni26E2 ; G 3740 +U 9985 ; WX 838 ; N uni2701 ; G 3741 +U 9986 ; WX 838 ; N uni2702 ; G 3742 +U 9987 ; WX 838 ; N uni2703 ; G 3743 +U 9988 ; WX 838 ; N uni2704 ; G 3744 +U 9990 ; WX 838 ; N uni2706 ; G 3745 +U 9991 ; WX 838 ; N uni2707 ; G 3746 +U 9992 ; WX 838 ; N uni2708 ; G 3747 +U 9993 ; WX 838 ; N uni2709 ; G 3748 +U 9996 ; WX 838 ; N uni270C ; G 3749 +U 9997 ; WX 838 ; N uni270D ; G 3750 +U 9998 ; WX 838 ; N uni270E ; G 3751 +U 9999 ; WX 838 ; N uni270F ; G 3752 +U 10000 ; WX 838 ; N uni2710 ; G 3753 +U 10001 ; WX 838 ; N uni2711 ; G 3754 +U 10002 ; WX 838 ; N uni2712 ; G 3755 +U 10003 ; WX 838 ; N uni2713 ; G 3756 +U 10004 ; WX 838 ; N uni2714 ; G 3757 +U 10005 ; WX 838 ; N uni2715 ; G 3758 +U 10006 ; WX 838 ; N uni2716 ; G 3759 +U 10007 ; WX 838 ; N uni2717 ; G 3760 +U 10008 ; WX 838 ; N uni2718 ; G 3761 +U 10009 ; WX 838 ; N uni2719 ; G 3762 +U 10010 ; WX 838 ; N uni271A ; G 3763 +U 10011 ; WX 838 ; N uni271B ; G 3764 +U 10012 ; WX 838 ; N uni271C ; G 3765 +U 10013 ; WX 838 ; N uni271D ; G 3766 +U 10014 ; WX 838 ; N uni271E ; G 3767 +U 10015 ; WX 838 ; N uni271F ; G 3768 +U 10016 ; WX 838 ; N uni2720 ; G 3769 +U 10017 ; WX 838 ; N uni2721 ; G 3770 +U 10018 ; WX 838 ; N uni2722 ; G 3771 +U 10019 ; WX 838 ; N uni2723 ; G 3772 +U 10020 ; WX 838 ; N uni2724 ; G 3773 +U 10021 ; WX 838 ; N uni2725 ; G 3774 +U 10022 ; WX 838 ; N uni2726 ; G 3775 +U 10023 ; WX 838 ; N uni2727 ; G 3776 +U 10025 ; WX 838 ; N uni2729 ; G 3777 +U 10026 ; WX 838 ; N uni272A ; G 3778 +U 10027 ; WX 838 ; N uni272B ; G 3779 +U 10028 ; WX 838 ; N uni272C ; G 3780 +U 10029 ; WX 838 ; N uni272D ; G 3781 +U 10030 ; WX 838 ; N uni272E ; G 3782 +U 10031 ; WX 838 ; N uni272F ; G 3783 +U 10032 ; WX 838 ; N uni2730 ; G 3784 +U 10033 ; WX 838 ; N uni2731 ; G 3785 +U 10034 ; WX 838 ; N uni2732 ; G 3786 +U 10035 ; WX 838 ; N uni2733 ; G 3787 +U 10036 ; WX 838 ; N uni2734 ; G 3788 +U 10037 ; WX 838 ; N uni2735 ; G 3789 +U 10038 ; WX 838 ; N uni2736 ; G 3790 +U 10039 ; WX 838 ; N uni2737 ; G 3791 +U 10040 ; WX 838 ; N uni2738 ; G 3792 +U 10041 ; WX 838 ; N uni2739 ; G 3793 +U 10042 ; WX 838 ; N uni273A ; G 3794 +U 10043 ; WX 838 ; N uni273B ; G 3795 +U 10044 ; WX 838 ; N uni273C ; G 3796 +U 10045 ; WX 838 ; N uni273D ; G 3797 +U 10046 ; WX 838 ; N uni273E ; G 3798 +U 10047 ; WX 838 ; N uni273F ; G 3799 +U 10048 ; WX 838 ; N uni2740 ; G 3800 +U 10049 ; WX 838 ; N uni2741 ; G 3801 +U 10050 ; WX 838 ; N uni2742 ; G 3802 +U 10051 ; WX 838 ; N uni2743 ; G 3803 +U 10052 ; WX 838 ; N uni2744 ; G 3804 +U 10053 ; WX 838 ; N uni2745 ; G 3805 +U 10054 ; WX 838 ; N uni2746 ; G 3806 +U 10055 ; WX 838 ; N uni2747 ; G 3807 +U 10056 ; WX 838 ; N uni2748 ; G 3808 +U 10057 ; WX 838 ; N uni2749 ; G 3809 +U 10058 ; WX 838 ; N uni274A ; G 3810 +U 10059 ; WX 838 ; N uni274B ; G 3811 +U 10061 ; WX 896 ; N uni274D ; G 3812 +U 10063 ; WX 896 ; N uni274F ; G 3813 +U 10064 ; WX 896 ; N uni2750 ; G 3814 +U 10065 ; WX 896 ; N uni2751 ; G 3815 +U 10066 ; WX 896 ; N uni2752 ; G 3816 +U 10070 ; WX 896 ; N uni2756 ; G 3817 +U 10072 ; WX 838 ; N uni2758 ; G 3818 +U 10073 ; WX 838 ; N uni2759 ; G 3819 +U 10074 ; WX 838 ; N uni275A ; G 3820 +U 10075 ; WX 322 ; N uni275B ; G 3821 +U 10076 ; WX 322 ; N uni275C ; G 3822 +U 10077 ; WX 538 ; N uni275D ; G 3823 +U 10078 ; WX 538 ; N uni275E ; G 3824 +U 10081 ; WX 838 ; N uni2761 ; G 3825 +U 10082 ; WX 838 ; N uni2762 ; G 3826 +U 10083 ; WX 838 ; N uni2763 ; G 3827 +U 10084 ; WX 838 ; N uni2764 ; G 3828 +U 10085 ; WX 838 ; N uni2765 ; G 3829 +U 10086 ; WX 838 ; N uni2766 ; G 3830 +U 10087 ; WX 838 ; N uni2767 ; G 3831 +U 10088 ; WX 838 ; N uni2768 ; G 3832 +U 10089 ; WX 838 ; N uni2769 ; G 3833 +U 10090 ; WX 838 ; N uni276A ; G 3834 +U 10091 ; WX 838 ; N uni276B ; G 3835 +U 10092 ; WX 838 ; N uni276C ; G 3836 +U 10093 ; WX 838 ; N uni276D ; G 3837 +U 10094 ; WX 838 ; N uni276E ; G 3838 +U 10095 ; WX 838 ; N uni276F ; G 3839 +U 10096 ; WX 838 ; N uni2770 ; G 3840 +U 10097 ; WX 838 ; N uni2771 ; G 3841 +U 10098 ; WX 838 ; N uni2772 ; G 3842 +U 10099 ; WX 838 ; N uni2773 ; G 3843 +U 10100 ; WX 838 ; N uni2774 ; G 3844 +U 10101 ; WX 838 ; N uni2775 ; G 3845 +U 10102 ; WX 896 ; N uni2776 ; G 3846 +U 10103 ; WX 896 ; N uni2777 ; G 3847 +U 10104 ; WX 896 ; N uni2778 ; G 3848 +U 10105 ; WX 896 ; N uni2779 ; G 3849 +U 10106 ; WX 896 ; N uni277A ; G 3850 +U 10107 ; WX 896 ; N uni277B ; G 3851 +U 10108 ; WX 896 ; N uni277C ; G 3852 +U 10109 ; WX 896 ; N uni277D ; G 3853 +U 10110 ; WX 896 ; N uni277E ; G 3854 +U 10111 ; WX 896 ; N uni277F ; G 3855 +U 10112 ; WX 838 ; N uni2780 ; G 3856 +U 10113 ; WX 838 ; N uni2781 ; G 3857 +U 10114 ; WX 838 ; N uni2782 ; G 3858 +U 10115 ; WX 838 ; N uni2783 ; G 3859 +U 10116 ; WX 838 ; N uni2784 ; G 3860 +U 10117 ; WX 838 ; N uni2785 ; G 3861 +U 10118 ; WX 838 ; N uni2786 ; G 3862 +U 10119 ; WX 838 ; N uni2787 ; G 3863 +U 10120 ; WX 838 ; N uni2788 ; G 3864 +U 10121 ; WX 838 ; N uni2789 ; G 3865 +U 10122 ; WX 838 ; N uni278A ; G 3866 +U 10123 ; WX 838 ; N uni278B ; G 3867 +U 10124 ; WX 838 ; N uni278C ; G 3868 +U 10125 ; WX 838 ; N uni278D ; G 3869 +U 10126 ; WX 838 ; N uni278E ; G 3870 +U 10127 ; WX 838 ; N uni278F ; G 3871 +U 10128 ; WX 838 ; N uni2790 ; G 3872 +U 10129 ; WX 838 ; N uni2791 ; G 3873 +U 10130 ; WX 838 ; N uni2792 ; G 3874 +U 10131 ; WX 838 ; N uni2793 ; G 3875 +U 10132 ; WX 838 ; N uni2794 ; G 3876 +U 10136 ; WX 838 ; N uni2798 ; G 3877 +U 10137 ; WX 838 ; N uni2799 ; G 3878 +U 10138 ; WX 838 ; N uni279A ; G 3879 +U 10139 ; WX 838 ; N uni279B ; G 3880 +U 10140 ; WX 838 ; N uni279C ; G 3881 +U 10141 ; WX 838 ; N uni279D ; G 3882 +U 10142 ; WX 838 ; N uni279E ; G 3883 +U 10143 ; WX 838 ; N uni279F ; G 3884 +U 10144 ; WX 838 ; N uni27A0 ; G 3885 +U 10145 ; WX 838 ; N uni27A1 ; G 3886 +U 10146 ; WX 838 ; N uni27A2 ; G 3887 +U 10147 ; WX 838 ; N uni27A3 ; G 3888 +U 10148 ; WX 838 ; N uni27A4 ; G 3889 +U 10149 ; WX 838 ; N uni27A5 ; G 3890 +U 10150 ; WX 838 ; N uni27A6 ; G 3891 +U 10151 ; WX 838 ; N uni27A7 ; G 3892 +U 10152 ; WX 838 ; N uni27A8 ; G 3893 +U 10153 ; WX 838 ; N uni27A9 ; G 3894 +U 10154 ; WX 838 ; N uni27AA ; G 3895 +U 10155 ; WX 838 ; N uni27AB ; G 3896 +U 10156 ; WX 838 ; N uni27AC ; G 3897 +U 10157 ; WX 838 ; N uni27AD ; G 3898 +U 10158 ; WX 838 ; N uni27AE ; G 3899 +U 10159 ; WX 838 ; N uni27AF ; G 3900 +U 10161 ; WX 838 ; N uni27B1 ; G 3901 +U 10162 ; WX 838 ; N uni27B2 ; G 3902 +U 10163 ; WX 838 ; N uni27B3 ; G 3903 +U 10164 ; WX 838 ; N uni27B4 ; G 3904 +U 10165 ; WX 838 ; N uni27B5 ; G 3905 +U 10166 ; WX 838 ; N uni27B6 ; G 3906 +U 10167 ; WX 838 ; N uni27B7 ; G 3907 +U 10168 ; WX 838 ; N uni27B8 ; G 3908 +U 10169 ; WX 838 ; N uni27B9 ; G 3909 +U 10170 ; WX 838 ; N uni27BA ; G 3910 +U 10171 ; WX 838 ; N uni27BB ; G 3911 +U 10172 ; WX 838 ; N uni27BC ; G 3912 +U 10173 ; WX 838 ; N uni27BD ; G 3913 +U 10174 ; WX 838 ; N uni27BE ; G 3914 +U 10181 ; WX 390 ; N uni27C5 ; G 3915 +U 10182 ; WX 390 ; N uni27C6 ; G 3916 +U 10208 ; WX 494 ; N uni27E0 ; G 3917 +U 10214 ; WX 495 ; N uni27E6 ; G 3918 +U 10215 ; WX 495 ; N uni27E7 ; G 3919 +U 10216 ; WX 390 ; N uni27E8 ; G 3920 +U 10217 ; WX 390 ; N uni27E9 ; G 3921 +U 10218 ; WX 556 ; N uni27EA ; G 3922 +U 10219 ; WX 556 ; N uni27EB ; G 3923 +U 10224 ; WX 838 ; N uni27F0 ; G 3924 +U 10225 ; WX 838 ; N uni27F1 ; G 3925 +U 10226 ; WX 838 ; N uni27F2 ; G 3926 +U 10227 ; WX 838 ; N uni27F3 ; G 3927 +U 10228 ; WX 1157 ; N uni27F4 ; G 3928 +U 10229 ; WX 1434 ; N uni27F5 ; G 3929 +U 10230 ; WX 1434 ; N uni27F6 ; G 3930 +U 10231 ; WX 1434 ; N uni27F7 ; G 3931 +U 10232 ; WX 1434 ; N uni27F8 ; G 3932 +U 10233 ; WX 1434 ; N uni27F9 ; G 3933 +U 10234 ; WX 1434 ; N uni27FA ; G 3934 +U 10235 ; WX 1434 ; N uni27FB ; G 3935 +U 10236 ; WX 1434 ; N uni27FC ; G 3936 +U 10237 ; WX 1434 ; N uni27FD ; G 3937 +U 10238 ; WX 1434 ; N uni27FE ; G 3938 +U 10239 ; WX 1434 ; N uni27FF ; G 3939 +U 10240 ; WX 732 ; N uni2800 ; G 3940 +U 10241 ; WX 732 ; N uni2801 ; G 3941 +U 10242 ; WX 732 ; N uni2802 ; G 3942 +U 10243 ; WX 732 ; N uni2803 ; G 3943 +U 10244 ; WX 732 ; N uni2804 ; G 3944 +U 10245 ; WX 732 ; N uni2805 ; G 3945 +U 10246 ; WX 732 ; N uni2806 ; G 3946 +U 10247 ; WX 732 ; N uni2807 ; G 3947 +U 10248 ; WX 732 ; N uni2808 ; G 3948 +U 10249 ; WX 732 ; N uni2809 ; G 3949 +U 10250 ; WX 732 ; N uni280A ; G 3950 +U 10251 ; WX 732 ; N uni280B ; G 3951 +U 10252 ; WX 732 ; N uni280C ; G 3952 +U 10253 ; WX 732 ; N uni280D ; G 3953 +U 10254 ; WX 732 ; N uni280E ; G 3954 +U 10255 ; WX 732 ; N uni280F ; G 3955 +U 10256 ; WX 732 ; N uni2810 ; G 3956 +U 10257 ; WX 732 ; N uni2811 ; G 3957 +U 10258 ; WX 732 ; N uni2812 ; G 3958 +U 10259 ; WX 732 ; N uni2813 ; G 3959 +U 10260 ; WX 732 ; N uni2814 ; G 3960 +U 10261 ; WX 732 ; N uni2815 ; G 3961 +U 10262 ; WX 732 ; N uni2816 ; G 3962 +U 10263 ; WX 732 ; N uni2817 ; G 3963 +U 10264 ; WX 732 ; N uni2818 ; G 3964 +U 10265 ; WX 732 ; N uni2819 ; G 3965 +U 10266 ; WX 732 ; N uni281A ; G 3966 +U 10267 ; WX 732 ; N uni281B ; G 3967 +U 10268 ; WX 732 ; N uni281C ; G 3968 +U 10269 ; WX 732 ; N uni281D ; G 3969 +U 10270 ; WX 732 ; N uni281E ; G 3970 +U 10271 ; WX 732 ; N uni281F ; G 3971 +U 10272 ; WX 732 ; N uni2820 ; G 3972 +U 10273 ; WX 732 ; N uni2821 ; G 3973 +U 10274 ; WX 732 ; N uni2822 ; G 3974 +U 10275 ; WX 732 ; N uni2823 ; G 3975 +U 10276 ; WX 732 ; N uni2824 ; G 3976 +U 10277 ; WX 732 ; N uni2825 ; G 3977 +U 10278 ; WX 732 ; N uni2826 ; G 3978 +U 10279 ; WX 732 ; N uni2827 ; G 3979 +U 10280 ; WX 732 ; N uni2828 ; G 3980 +U 10281 ; WX 732 ; N uni2829 ; G 3981 +U 10282 ; WX 732 ; N uni282A ; G 3982 +U 10283 ; WX 732 ; N uni282B ; G 3983 +U 10284 ; WX 732 ; N uni282C ; G 3984 +U 10285 ; WX 732 ; N uni282D ; G 3985 +U 10286 ; WX 732 ; N uni282E ; G 3986 +U 10287 ; WX 732 ; N uni282F ; G 3987 +U 10288 ; WX 732 ; N uni2830 ; G 3988 +U 10289 ; WX 732 ; N uni2831 ; G 3989 +U 10290 ; WX 732 ; N uni2832 ; G 3990 +U 10291 ; WX 732 ; N uni2833 ; G 3991 +U 10292 ; WX 732 ; N uni2834 ; G 3992 +U 10293 ; WX 732 ; N uni2835 ; G 3993 +U 10294 ; WX 732 ; N uni2836 ; G 3994 +U 10295 ; WX 732 ; N uni2837 ; G 3995 +U 10296 ; WX 732 ; N uni2838 ; G 3996 +U 10297 ; WX 732 ; N uni2839 ; G 3997 +U 10298 ; WX 732 ; N uni283A ; G 3998 +U 10299 ; WX 732 ; N uni283B ; G 3999 +U 10300 ; WX 732 ; N uni283C ; G 4000 +U 10301 ; WX 732 ; N uni283D ; G 4001 +U 10302 ; WX 732 ; N uni283E ; G 4002 +U 10303 ; WX 732 ; N uni283F ; G 4003 +U 10304 ; WX 732 ; N uni2840 ; G 4004 +U 10305 ; WX 732 ; N uni2841 ; G 4005 +U 10306 ; WX 732 ; N uni2842 ; G 4006 +U 10307 ; WX 732 ; N uni2843 ; G 4007 +U 10308 ; WX 732 ; N uni2844 ; G 4008 +U 10309 ; WX 732 ; N uni2845 ; G 4009 +U 10310 ; WX 732 ; N uni2846 ; G 4010 +U 10311 ; WX 732 ; N uni2847 ; G 4011 +U 10312 ; WX 732 ; N uni2848 ; G 4012 +U 10313 ; WX 732 ; N uni2849 ; G 4013 +U 10314 ; WX 732 ; N uni284A ; G 4014 +U 10315 ; WX 732 ; N uni284B ; G 4015 +U 10316 ; WX 732 ; N uni284C ; G 4016 +U 10317 ; WX 732 ; N uni284D ; G 4017 +U 10318 ; WX 732 ; N uni284E ; G 4018 +U 10319 ; WX 732 ; N uni284F ; G 4019 +U 10320 ; WX 732 ; N uni2850 ; G 4020 +U 10321 ; WX 732 ; N uni2851 ; G 4021 +U 10322 ; WX 732 ; N uni2852 ; G 4022 +U 10323 ; WX 732 ; N uni2853 ; G 4023 +U 10324 ; WX 732 ; N uni2854 ; G 4024 +U 10325 ; WX 732 ; N uni2855 ; G 4025 +U 10326 ; WX 732 ; N uni2856 ; G 4026 +U 10327 ; WX 732 ; N uni2857 ; G 4027 +U 10328 ; WX 732 ; N uni2858 ; G 4028 +U 10329 ; WX 732 ; N uni2859 ; G 4029 +U 10330 ; WX 732 ; N uni285A ; G 4030 +U 10331 ; WX 732 ; N uni285B ; G 4031 +U 10332 ; WX 732 ; N uni285C ; G 4032 +U 10333 ; WX 732 ; N uni285D ; G 4033 +U 10334 ; WX 732 ; N uni285E ; G 4034 +U 10335 ; WX 732 ; N uni285F ; G 4035 +U 10336 ; WX 732 ; N uni2860 ; G 4036 +U 10337 ; WX 732 ; N uni2861 ; G 4037 +U 10338 ; WX 732 ; N uni2862 ; G 4038 +U 10339 ; WX 732 ; N uni2863 ; G 4039 +U 10340 ; WX 732 ; N uni2864 ; G 4040 +U 10341 ; WX 732 ; N uni2865 ; G 4041 +U 10342 ; WX 732 ; N uni2866 ; G 4042 +U 10343 ; WX 732 ; N uni2867 ; G 4043 +U 10344 ; WX 732 ; N uni2868 ; G 4044 +U 10345 ; WX 732 ; N uni2869 ; G 4045 +U 10346 ; WX 732 ; N uni286A ; G 4046 +U 10347 ; WX 732 ; N uni286B ; G 4047 +U 10348 ; WX 732 ; N uni286C ; G 4048 +U 10349 ; WX 732 ; N uni286D ; G 4049 +U 10350 ; WX 732 ; N uni286E ; G 4050 +U 10351 ; WX 732 ; N uni286F ; G 4051 +U 10352 ; WX 732 ; N uni2870 ; G 4052 +U 10353 ; WX 732 ; N uni2871 ; G 4053 +U 10354 ; WX 732 ; N uni2872 ; G 4054 +U 10355 ; WX 732 ; N uni2873 ; G 4055 +U 10356 ; WX 732 ; N uni2874 ; G 4056 +U 10357 ; WX 732 ; N uni2875 ; G 4057 +U 10358 ; WX 732 ; N uni2876 ; G 4058 +U 10359 ; WX 732 ; N uni2877 ; G 4059 +U 10360 ; WX 732 ; N uni2878 ; G 4060 +U 10361 ; WX 732 ; N uni2879 ; G 4061 +U 10362 ; WX 732 ; N uni287A ; G 4062 +U 10363 ; WX 732 ; N uni287B ; G 4063 +U 10364 ; WX 732 ; N uni287C ; G 4064 +U 10365 ; WX 732 ; N uni287D ; G 4065 +U 10366 ; WX 732 ; N uni287E ; G 4066 +U 10367 ; WX 732 ; N uni287F ; G 4067 +U 10368 ; WX 732 ; N uni2880 ; G 4068 +U 10369 ; WX 732 ; N uni2881 ; G 4069 +U 10370 ; WX 732 ; N uni2882 ; G 4070 +U 10371 ; WX 732 ; N uni2883 ; G 4071 +U 10372 ; WX 732 ; N uni2884 ; G 4072 +U 10373 ; WX 732 ; N uni2885 ; G 4073 +U 10374 ; WX 732 ; N uni2886 ; G 4074 +U 10375 ; WX 732 ; N uni2887 ; G 4075 +U 10376 ; WX 732 ; N uni2888 ; G 4076 +U 10377 ; WX 732 ; N uni2889 ; G 4077 +U 10378 ; WX 732 ; N uni288A ; G 4078 +U 10379 ; WX 732 ; N uni288B ; G 4079 +U 10380 ; WX 732 ; N uni288C ; G 4080 +U 10381 ; WX 732 ; N uni288D ; G 4081 +U 10382 ; WX 732 ; N uni288E ; G 4082 +U 10383 ; WX 732 ; N uni288F ; G 4083 +U 10384 ; WX 732 ; N uni2890 ; G 4084 +U 10385 ; WX 732 ; N uni2891 ; G 4085 +U 10386 ; WX 732 ; N uni2892 ; G 4086 +U 10387 ; WX 732 ; N uni2893 ; G 4087 +U 10388 ; WX 732 ; N uni2894 ; G 4088 +U 10389 ; WX 732 ; N uni2895 ; G 4089 +U 10390 ; WX 732 ; N uni2896 ; G 4090 +U 10391 ; WX 732 ; N uni2897 ; G 4091 +U 10392 ; WX 732 ; N uni2898 ; G 4092 +U 10393 ; WX 732 ; N uni2899 ; G 4093 +U 10394 ; WX 732 ; N uni289A ; G 4094 +U 10395 ; WX 732 ; N uni289B ; G 4095 +U 10396 ; WX 732 ; N uni289C ; G 4096 +U 10397 ; WX 732 ; N uni289D ; G 4097 +U 10398 ; WX 732 ; N uni289E ; G 4098 +U 10399 ; WX 732 ; N uni289F ; G 4099 +U 10400 ; WX 732 ; N uni28A0 ; G 4100 +U 10401 ; WX 732 ; N uni28A1 ; G 4101 +U 10402 ; WX 732 ; N uni28A2 ; G 4102 +U 10403 ; WX 732 ; N uni28A3 ; G 4103 +U 10404 ; WX 732 ; N uni28A4 ; G 4104 +U 10405 ; WX 732 ; N uni28A5 ; G 4105 +U 10406 ; WX 732 ; N uni28A6 ; G 4106 +U 10407 ; WX 732 ; N uni28A7 ; G 4107 +U 10408 ; WX 732 ; N uni28A8 ; G 4108 +U 10409 ; WX 732 ; N uni28A9 ; G 4109 +U 10410 ; WX 732 ; N uni28AA ; G 4110 +U 10411 ; WX 732 ; N uni28AB ; G 4111 +U 10412 ; WX 732 ; N uni28AC ; G 4112 +U 10413 ; WX 732 ; N uni28AD ; G 4113 +U 10414 ; WX 732 ; N uni28AE ; G 4114 +U 10415 ; WX 732 ; N uni28AF ; G 4115 +U 10416 ; WX 732 ; N uni28B0 ; G 4116 +U 10417 ; WX 732 ; N uni28B1 ; G 4117 +U 10418 ; WX 732 ; N uni28B2 ; G 4118 +U 10419 ; WX 732 ; N uni28B3 ; G 4119 +U 10420 ; WX 732 ; N uni28B4 ; G 4120 +U 10421 ; WX 732 ; N uni28B5 ; G 4121 +U 10422 ; WX 732 ; N uni28B6 ; G 4122 +U 10423 ; WX 732 ; N uni28B7 ; G 4123 +U 10424 ; WX 732 ; N uni28B8 ; G 4124 +U 10425 ; WX 732 ; N uni28B9 ; G 4125 +U 10426 ; WX 732 ; N uni28BA ; G 4126 +U 10427 ; WX 732 ; N uni28BB ; G 4127 +U 10428 ; WX 732 ; N uni28BC ; G 4128 +U 10429 ; WX 732 ; N uni28BD ; G 4129 +U 10430 ; WX 732 ; N uni28BE ; G 4130 +U 10431 ; WX 732 ; N uni28BF ; G 4131 +U 10432 ; WX 732 ; N uni28C0 ; G 4132 +U 10433 ; WX 732 ; N uni28C1 ; G 4133 +U 10434 ; WX 732 ; N uni28C2 ; G 4134 +U 10435 ; WX 732 ; N uni28C3 ; G 4135 +U 10436 ; WX 732 ; N uni28C4 ; G 4136 +U 10437 ; WX 732 ; N uni28C5 ; G 4137 +U 10438 ; WX 732 ; N uni28C6 ; G 4138 +U 10439 ; WX 732 ; N uni28C7 ; G 4139 +U 10440 ; WX 732 ; N uni28C8 ; G 4140 +U 10441 ; WX 732 ; N uni28C9 ; G 4141 +U 10442 ; WX 732 ; N uni28CA ; G 4142 +U 10443 ; WX 732 ; N uni28CB ; G 4143 +U 10444 ; WX 732 ; N uni28CC ; G 4144 +U 10445 ; WX 732 ; N uni28CD ; G 4145 +U 10446 ; WX 732 ; N uni28CE ; G 4146 +U 10447 ; WX 732 ; N uni28CF ; G 4147 +U 10448 ; WX 732 ; N uni28D0 ; G 4148 +U 10449 ; WX 732 ; N uni28D1 ; G 4149 +U 10450 ; WX 732 ; N uni28D2 ; G 4150 +U 10451 ; WX 732 ; N uni28D3 ; G 4151 +U 10452 ; WX 732 ; N uni28D4 ; G 4152 +U 10453 ; WX 732 ; N uni28D5 ; G 4153 +U 10454 ; WX 732 ; N uni28D6 ; G 4154 +U 10455 ; WX 732 ; N uni28D7 ; G 4155 +U 10456 ; WX 732 ; N uni28D8 ; G 4156 +U 10457 ; WX 732 ; N uni28D9 ; G 4157 +U 10458 ; WX 732 ; N uni28DA ; G 4158 +U 10459 ; WX 732 ; N uni28DB ; G 4159 +U 10460 ; WX 732 ; N uni28DC ; G 4160 +U 10461 ; WX 732 ; N uni28DD ; G 4161 +U 10462 ; WX 732 ; N uni28DE ; G 4162 +U 10463 ; WX 732 ; N uni28DF ; G 4163 +U 10464 ; WX 732 ; N uni28E0 ; G 4164 +U 10465 ; WX 732 ; N uni28E1 ; G 4165 +U 10466 ; WX 732 ; N uni28E2 ; G 4166 +U 10467 ; WX 732 ; N uni28E3 ; G 4167 +U 10468 ; WX 732 ; N uni28E4 ; G 4168 +U 10469 ; WX 732 ; N uni28E5 ; G 4169 +U 10470 ; WX 732 ; N uni28E6 ; G 4170 +U 10471 ; WX 732 ; N uni28E7 ; G 4171 +U 10472 ; WX 732 ; N uni28E8 ; G 4172 +U 10473 ; WX 732 ; N uni28E9 ; G 4173 +U 10474 ; WX 732 ; N uni28EA ; G 4174 +U 10475 ; WX 732 ; N uni28EB ; G 4175 +U 10476 ; WX 732 ; N uni28EC ; G 4176 +U 10477 ; WX 732 ; N uni28ED ; G 4177 +U 10478 ; WX 732 ; N uni28EE ; G 4178 +U 10479 ; WX 732 ; N uni28EF ; G 4179 +U 10480 ; WX 732 ; N uni28F0 ; G 4180 +U 10481 ; WX 732 ; N uni28F1 ; G 4181 +U 10482 ; WX 732 ; N uni28F2 ; G 4182 +U 10483 ; WX 732 ; N uni28F3 ; G 4183 +U 10484 ; WX 732 ; N uni28F4 ; G 4184 +U 10485 ; WX 732 ; N uni28F5 ; G 4185 +U 10486 ; WX 732 ; N uni28F6 ; G 4186 +U 10487 ; WX 732 ; N uni28F7 ; G 4187 +U 10488 ; WX 732 ; N uni28F8 ; G 4188 +U 10489 ; WX 732 ; N uni28F9 ; G 4189 +U 10490 ; WX 732 ; N uni28FA ; G 4190 +U 10491 ; WX 732 ; N uni28FB ; G 4191 +U 10492 ; WX 732 ; N uni28FC ; G 4192 +U 10493 ; WX 732 ; N uni28FD ; G 4193 +U 10494 ; WX 732 ; N uni28FE ; G 4194 +U 10495 ; WX 732 ; N uni28FF ; G 4195 +U 10502 ; WX 838 ; N uni2906 ; G 4196 +U 10503 ; WX 838 ; N uni2907 ; G 4197 +U 10506 ; WX 838 ; N uni290A ; G 4198 +U 10507 ; WX 838 ; N uni290B ; G 4199 +U 10560 ; WX 683 ; N uni2940 ; G 4200 +U 10561 ; WX 683 ; N uni2941 ; G 4201 +U 10627 ; WX 734 ; N uni2983 ; G 4202 +U 10628 ; WX 734 ; N uni2984 ; G 4203 +U 10702 ; WX 838 ; N uni29CE ; G 4204 +U 10703 ; WX 1000 ; N uni29CF ; G 4205 +U 10704 ; WX 1000 ; N uni29D0 ; G 4206 +U 10705 ; WX 1000 ; N uni29D1 ; G 4207 +U 10706 ; WX 1000 ; N uni29D2 ; G 4208 +U 10707 ; WX 1000 ; N uni29D3 ; G 4209 +U 10708 ; WX 1000 ; N uni29D4 ; G 4210 +U 10709 ; WX 1000 ; N uni29D5 ; G 4211 +U 10731 ; WX 494 ; N uni29EB ; G 4212 +U 10746 ; WX 838 ; N uni29FA ; G 4213 +U 10747 ; WX 838 ; N uni29FB ; G 4214 +U 10752 ; WX 1000 ; N uni2A00 ; G 4215 +U 10753 ; WX 1000 ; N uni2A01 ; G 4216 +U 10754 ; WX 1000 ; N uni2A02 ; G 4217 +U 10764 ; WX 1325 ; N uni2A0C ; G 4218 +U 10765 ; WX 521 ; N uni2A0D ; G 4219 +U 10766 ; WX 521 ; N uni2A0E ; G 4220 +U 10767 ; WX 521 ; N uni2A0F ; G 4221 +U 10768 ; WX 521 ; N uni2A10 ; G 4222 +U 10769 ; WX 521 ; N uni2A11 ; G 4223 +U 10770 ; WX 521 ; N uni2A12 ; G 4224 +U 10771 ; WX 521 ; N uni2A13 ; G 4225 +U 10772 ; WX 521 ; N uni2A14 ; G 4226 +U 10773 ; WX 521 ; N uni2A15 ; G 4227 +U 10774 ; WX 521 ; N uni2A16 ; G 4228 +U 10775 ; WX 521 ; N uni2A17 ; G 4229 +U 10776 ; WX 521 ; N uni2A18 ; G 4230 +U 10777 ; WX 521 ; N uni2A19 ; G 4231 +U 10778 ; WX 521 ; N uni2A1A ; G 4232 +U 10779 ; WX 521 ; N uni2A1B ; G 4233 +U 10780 ; WX 521 ; N uni2A1C ; G 4234 +U 10799 ; WX 838 ; N uni2A2F ; G 4235 +U 10858 ; WX 838 ; N uni2A6A ; G 4236 +U 10859 ; WX 838 ; N uni2A6B ; G 4237 +U 10877 ; WX 838 ; N uni2A7D ; G 4238 +U 10878 ; WX 838 ; N uni2A7E ; G 4239 +U 10879 ; WX 838 ; N uni2A7F ; G 4240 +U 10880 ; WX 838 ; N uni2A80 ; G 4241 +U 10881 ; WX 838 ; N uni2A81 ; G 4242 +U 10882 ; WX 838 ; N uni2A82 ; G 4243 +U 10883 ; WX 838 ; N uni2A83 ; G 4244 +U 10884 ; WX 838 ; N uni2A84 ; G 4245 +U 10885 ; WX 838 ; N uni2A85 ; G 4246 +U 10886 ; WX 838 ; N uni2A86 ; G 4247 +U 10887 ; WX 838 ; N uni2A87 ; G 4248 +U 10888 ; WX 838 ; N uni2A88 ; G 4249 +U 10889 ; WX 838 ; N uni2A89 ; G 4250 +U 10890 ; WX 838 ; N uni2A8A ; G 4251 +U 10891 ; WX 838 ; N uni2A8B ; G 4252 +U 10892 ; WX 838 ; N uni2A8C ; G 4253 +U 10893 ; WX 838 ; N uni2A8D ; G 4254 +U 10894 ; WX 838 ; N uni2A8E ; G 4255 +U 10895 ; WX 838 ; N uni2A8F ; G 4256 +U 10896 ; WX 838 ; N uni2A90 ; G 4257 +U 10897 ; WX 838 ; N uni2A91 ; G 4258 +U 10898 ; WX 838 ; N uni2A92 ; G 4259 +U 10899 ; WX 838 ; N uni2A93 ; G 4260 +U 10900 ; WX 838 ; N uni2A94 ; G 4261 +U 10901 ; WX 838 ; N uni2A95 ; G 4262 +U 10902 ; WX 838 ; N uni2A96 ; G 4263 +U 10903 ; WX 838 ; N uni2A97 ; G 4264 +U 10904 ; WX 838 ; N uni2A98 ; G 4265 +U 10905 ; WX 838 ; N uni2A99 ; G 4266 +U 10906 ; WX 838 ; N uni2A9A ; G 4267 +U 10907 ; WX 838 ; N uni2A9B ; G 4268 +U 10908 ; WX 838 ; N uni2A9C ; G 4269 +U 10909 ; WX 838 ; N uni2A9D ; G 4270 +U 10910 ; WX 838 ; N uni2A9E ; G 4271 +U 10911 ; WX 838 ; N uni2A9F ; G 4272 +U 10912 ; WX 838 ; N uni2AA0 ; G 4273 +U 10926 ; WX 838 ; N uni2AAE ; G 4274 +U 10927 ; WX 838 ; N uni2AAF ; G 4275 +U 10928 ; WX 838 ; N uni2AB0 ; G 4276 +U 10929 ; WX 838 ; N uni2AB1 ; G 4277 +U 10930 ; WX 838 ; N uni2AB2 ; G 4278 +U 10931 ; WX 838 ; N uni2AB3 ; G 4279 +U 10932 ; WX 838 ; N uni2AB4 ; G 4280 +U 10933 ; WX 838 ; N uni2AB5 ; G 4281 +U 10934 ; WX 838 ; N uni2AB6 ; G 4282 +U 10935 ; WX 838 ; N uni2AB7 ; G 4283 +U 10936 ; WX 838 ; N uni2AB8 ; G 4284 +U 10937 ; WX 838 ; N uni2AB9 ; G 4285 +U 10938 ; WX 838 ; N uni2ABA ; G 4286 +U 11001 ; WX 838 ; N uni2AF9 ; G 4287 +U 11002 ; WX 838 ; N uni2AFA ; G 4288 +U 11008 ; WX 838 ; N uni2B00 ; G 4289 +U 11009 ; WX 838 ; N uni2B01 ; G 4290 +U 11010 ; WX 838 ; N uni2B02 ; G 4291 +U 11011 ; WX 838 ; N uni2B03 ; G 4292 +U 11012 ; WX 838 ; N uni2B04 ; G 4293 +U 11013 ; WX 838 ; N uni2B05 ; G 4294 +U 11014 ; WX 838 ; N uni2B06 ; G 4295 +U 11015 ; WX 838 ; N uni2B07 ; G 4296 +U 11016 ; WX 838 ; N uni2B08 ; G 4297 +U 11017 ; WX 838 ; N uni2B09 ; G 4298 +U 11018 ; WX 838 ; N uni2B0A ; G 4299 +U 11019 ; WX 838 ; N uni2B0B ; G 4300 +U 11020 ; WX 838 ; N uni2B0C ; G 4301 +U 11021 ; WX 838 ; N uni2B0D ; G 4302 +U 11022 ; WX 836 ; N uni2B0E ; G 4303 +U 11023 ; WX 836 ; N uni2B0F ; G 4304 +U 11024 ; WX 836 ; N uni2B10 ; G 4305 +U 11025 ; WX 836 ; N uni2B11 ; G 4306 +U 11026 ; WX 945 ; N uni2B12 ; G 4307 +U 11027 ; WX 945 ; N uni2B13 ; G 4308 +U 11028 ; WX 945 ; N uni2B14 ; G 4309 +U 11029 ; WX 945 ; N uni2B15 ; G 4310 +U 11030 ; WX 769 ; N uni2B16 ; G 4311 +U 11031 ; WX 769 ; N uni2B17 ; G 4312 +U 11032 ; WX 769 ; N uni2B18 ; G 4313 +U 11033 ; WX 769 ; N uni2B19 ; G 4314 +U 11034 ; WX 945 ; N uni2B1A ; G 4315 +U 11039 ; WX 869 ; N uni2B1F ; G 4316 +U 11040 ; WX 869 ; N uni2B20 ; G 4317 +U 11041 ; WX 873 ; N uni2B21 ; G 4318 +U 11042 ; WX 873 ; N uni2B22 ; G 4319 +U 11043 ; WX 873 ; N uni2B23 ; G 4320 +U 11044 ; WX 1119 ; N uni2B24 ; G 4321 +U 11091 ; WX 869 ; N uni2B53 ; G 4322 +U 11092 ; WX 869 ; N uni2B54 ; G 4323 +U 11360 ; WX 557 ; N uni2C60 ; G 4324 +U 11361 ; WX 278 ; N uni2C61 ; G 4325 +U 11362 ; WX 557 ; N uni2C62 ; G 4326 +U 11363 ; WX 603 ; N uni2C63 ; G 4327 +U 11364 ; WX 695 ; N uni2C64 ; G 4328 +U 11365 ; WX 613 ; N uni2C65 ; G 4329 +U 11366 ; WX 392 ; N uni2C66 ; G 4330 +U 11367 ; WX 752 ; N uni2C67 ; G 4331 +U 11368 ; WX 634 ; N uni2C68 ; G 4332 +U 11369 ; WX 656 ; N uni2C69 ; G 4333 +U 11370 ; WX 579 ; N uni2C6A ; G 4334 +U 11371 ; WX 685 ; N uni2C6B ; G 4335 +U 11372 ; WX 525 ; N uni2C6C ; G 4336 +U 11373 ; WX 781 ; N uni2C6D ; G 4337 +U 11374 ; WX 863 ; N uni2C6E ; G 4338 +U 11375 ; WX 684 ; N uni2C6F ; G 4339 +U 11376 ; WX 781 ; N uni2C70 ; G 4340 +U 11377 ; WX 734 ; N uni2C71 ; G 4341 +U 11378 ; WX 1128 ; N uni2C72 ; G 4342 +U 11379 ; WX 961 ; N uni2C73 ; G 4343 +U 11380 ; WX 592 ; N uni2C74 ; G 4344 +U 11381 ; WX 654 ; N uni2C75 ; G 4345 +U 11382 ; WX 568 ; N uni2C76 ; G 4346 +U 11383 ; WX 660 ; N uni2C77 ; G 4347 +U 11385 ; WX 414 ; N uni2C79 ; G 4348 +U 11386 ; WX 612 ; N uni2C7A ; G 4349 +U 11387 ; WX 491 ; N uni2C7B ; G 4350 +U 11388 ; WX 175 ; N uni2C7C ; G 4351 +U 11389 ; WX 431 ; N uni2C7D ; G 4352 +U 11390 ; WX 635 ; N uni2C7E ; G 4353 +U 11391 ; WX 685 ; N uni2C7F ; G 4354 +U 11520 ; WX 591 ; N uni2D00 ; G 4355 +U 11521 ; WX 595 ; N uni2D01 ; G 4356 +U 11522 ; WX 564 ; N uni2D02 ; G 4357 +U 11523 ; WX 602 ; N uni2D03 ; G 4358 +U 11524 ; WX 587 ; N uni2D04 ; G 4359 +U 11525 ; WX 911 ; N uni2D05 ; G 4360 +U 11526 ; WX 626 ; N uni2D06 ; G 4361 +U 11527 ; WX 952 ; N uni2D07 ; G 4362 +U 11528 ; WX 595 ; N uni2D08 ; G 4363 +U 11529 ; WX 607 ; N uni2D09 ; G 4364 +U 11530 ; WX 954 ; N uni2D0A ; G 4365 +U 11531 ; WX 620 ; N uni2D0B ; G 4366 +U 11532 ; WX 595 ; N uni2D0C ; G 4367 +U 11533 ; WX 926 ; N uni2D0D ; G 4368 +U 11534 ; WX 595 ; N uni2D0E ; G 4369 +U 11535 ; WX 806 ; N uni2D0F ; G 4370 +U 11536 ; WX 931 ; N uni2D10 ; G 4371 +U 11537 ; WX 584 ; N uni2D11 ; G 4372 +U 11538 ; WX 592 ; N uni2D12 ; G 4373 +U 11539 ; WX 923 ; N uni2D13 ; G 4374 +U 11540 ; WX 953 ; N uni2D14 ; G 4375 +U 11541 ; WX 828 ; N uni2D15 ; G 4376 +U 11542 ; WX 596 ; N uni2D16 ; G 4377 +U 11543 ; WX 595 ; N uni2D17 ; G 4378 +U 11544 ; WX 590 ; N uni2D18 ; G 4379 +U 11545 ; WX 592 ; N uni2D19 ; G 4380 +U 11546 ; WX 592 ; N uni2D1A ; G 4381 +U 11547 ; WX 621 ; N uni2D1B ; G 4382 +U 11548 ; WX 920 ; N uni2D1C ; G 4383 +U 11549 ; WX 589 ; N uni2D1D ; G 4384 +U 11550 ; WX 586 ; N uni2D1E ; G 4385 +U 11551 ; WX 581 ; N uni2D1F ; G 4386 +U 11552 ; WX 914 ; N uni2D20 ; G 4387 +U 11553 ; WX 596 ; N uni2D21 ; G 4388 +U 11554 ; WX 595 ; N uni2D22 ; G 4389 +U 11555 ; WX 592 ; N uni2D23 ; G 4390 +U 11556 ; WX 642 ; N uni2D24 ; G 4391 +U 11557 ; WX 901 ; N uni2D25 ; G 4392 +U 11800 ; WX 531 ; N uni2E18 ; G 4393 +U 11807 ; WX 838 ; N uni2E1F ; G 4394 +U 11810 ; WX 390 ; N uni2E22 ; G 4395 +U 11811 ; WX 390 ; N uni2E23 ; G 4396 +U 11812 ; WX 390 ; N uni2E24 ; G 4397 +U 11813 ; WX 390 ; N uni2E25 ; G 4398 +U 11822 ; WX 531 ; N uni2E2E ; G 4399 +U 19904 ; WX 896 ; N uni4DC0 ; G 4400 +U 19905 ; WX 896 ; N uni4DC1 ; G 4401 +U 19906 ; WX 896 ; N uni4DC2 ; G 4402 +U 19907 ; WX 896 ; N uni4DC3 ; G 4403 +U 19908 ; WX 896 ; N uni4DC4 ; G 4404 +U 19909 ; WX 896 ; N uni4DC5 ; G 4405 +U 19910 ; WX 896 ; N uni4DC6 ; G 4406 +U 19911 ; WX 896 ; N uni4DC7 ; G 4407 +U 19912 ; WX 896 ; N uni4DC8 ; G 4408 +U 19913 ; WX 896 ; N uni4DC9 ; G 4409 +U 19914 ; WX 896 ; N uni4DCA ; G 4410 +U 19915 ; WX 896 ; N uni4DCB ; G 4411 +U 19916 ; WX 896 ; N uni4DCC ; G 4412 +U 19917 ; WX 896 ; N uni4DCD ; G 4413 +U 19918 ; WX 896 ; N uni4DCE ; G 4414 +U 19919 ; WX 896 ; N uni4DCF ; G 4415 +U 19920 ; WX 896 ; N uni4DD0 ; G 4416 +U 19921 ; WX 896 ; N uni4DD1 ; G 4417 +U 19922 ; WX 896 ; N uni4DD2 ; G 4418 +U 19923 ; WX 896 ; N uni4DD3 ; G 4419 +U 19924 ; WX 896 ; N uni4DD4 ; G 4420 +U 19925 ; WX 896 ; N uni4DD5 ; G 4421 +U 19926 ; WX 896 ; N uni4DD6 ; G 4422 +U 19927 ; WX 896 ; N uni4DD7 ; G 4423 +U 19928 ; WX 896 ; N uni4DD8 ; G 4424 +U 19929 ; WX 896 ; N uni4DD9 ; G 4425 +U 19930 ; WX 896 ; N uni4DDA ; G 4426 +U 19931 ; WX 896 ; N uni4DDB ; G 4427 +U 19932 ; WX 896 ; N uni4DDC ; G 4428 +U 19933 ; WX 896 ; N uni4DDD ; G 4429 +U 19934 ; WX 896 ; N uni4DDE ; G 4430 +U 19935 ; WX 896 ; N uni4DDF ; G 4431 +U 19936 ; WX 896 ; N uni4DE0 ; G 4432 +U 19937 ; WX 896 ; N uni4DE1 ; G 4433 +U 19938 ; WX 896 ; N uni4DE2 ; G 4434 +U 19939 ; WX 896 ; N uni4DE3 ; G 4435 +U 19940 ; WX 896 ; N uni4DE4 ; G 4436 +U 19941 ; WX 896 ; N uni4DE5 ; G 4437 +U 19942 ; WX 896 ; N uni4DE6 ; G 4438 +U 19943 ; WX 896 ; N uni4DE7 ; G 4439 +U 19944 ; WX 896 ; N uni4DE8 ; G 4440 +U 19945 ; WX 896 ; N uni4DE9 ; G 4441 +U 19946 ; WX 896 ; N uni4DEA ; G 4442 +U 19947 ; WX 896 ; N uni4DEB ; G 4443 +U 19948 ; WX 896 ; N uni4DEC ; G 4444 +U 19949 ; WX 896 ; N uni4DED ; G 4445 +U 19950 ; WX 896 ; N uni4DEE ; G 4446 +U 19951 ; WX 896 ; N uni4DEF ; G 4447 +U 19952 ; WX 896 ; N uni4DF0 ; G 4448 +U 19953 ; WX 896 ; N uni4DF1 ; G 4449 +U 19954 ; WX 896 ; N uni4DF2 ; G 4450 +U 19955 ; WX 896 ; N uni4DF3 ; G 4451 +U 19956 ; WX 896 ; N uni4DF4 ; G 4452 +U 19957 ; WX 896 ; N uni4DF5 ; G 4453 +U 19958 ; WX 896 ; N uni4DF6 ; G 4454 +U 19959 ; WX 896 ; N uni4DF7 ; G 4455 +U 19960 ; WX 896 ; N uni4DF8 ; G 4456 +U 19961 ; WX 896 ; N uni4DF9 ; G 4457 +U 19962 ; WX 896 ; N uni4DFA ; G 4458 +U 19963 ; WX 896 ; N uni4DFB ; G 4459 +U 19964 ; WX 896 ; N uni4DFC ; G 4460 +U 19965 ; WX 896 ; N uni4DFD ; G 4461 +U 19966 ; WX 896 ; N uni4DFE ; G 4462 +U 19967 ; WX 896 ; N uni4DFF ; G 4463 +U 42192 ; WX 686 ; N uniA4D0 ; G 4464 +U 42193 ; WX 603 ; N uniA4D1 ; G 4465 +U 42194 ; WX 603 ; N uniA4D2 ; G 4466 +U 42195 ; WX 770 ; N uniA4D3 ; G 4467 +U 42196 ; WX 611 ; N uniA4D4 ; G 4468 +U 42197 ; WX 611 ; N uniA4D5 ; G 4469 +U 42198 ; WX 775 ; N uniA4D6 ; G 4470 +U 42199 ; WX 656 ; N uniA4D7 ; G 4471 +U 42200 ; WX 656 ; N uniA4D8 ; G 4472 +U 42201 ; WX 512 ; N uniA4D9 ; G 4473 +U 42202 ; WX 698 ; N uniA4DA ; G 4474 +U 42203 ; WX 703 ; N uniA4DB ; G 4475 +U 42204 ; WX 685 ; N uniA4DC ; G 4476 +U 42205 ; WX 575 ; N uniA4DD ; G 4477 +U 42206 ; WX 575 ; N uniA4DE ; G 4478 +U 42207 ; WX 863 ; N uniA4DF ; G 4479 +U 42208 ; WX 748 ; N uniA4E0 ; G 4480 +U 42209 ; WX 557 ; N uniA4E1 ; G 4481 +U 42210 ; WX 635 ; N uniA4E2 ; G 4482 +U 42211 ; WX 695 ; N uniA4E3 ; G 4483 +U 42212 ; WX 695 ; N uniA4E4 ; G 4484 +U 42213 ; WX 684 ; N uniA4E5 ; G 4485 +U 42214 ; WX 684 ; N uniA4E6 ; G 4486 +U 42215 ; WX 752 ; N uniA4E7 ; G 4487 +U 42216 ; WX 775 ; N uniA4E8 ; G 4488 +U 42217 ; WX 512 ; N uniA4E9 ; G 4489 +U 42218 ; WX 989 ; N uniA4EA ; G 4490 +U 42219 ; WX 685 ; N uniA4EB ; G 4491 +U 42220 ; WX 611 ; N uniA4EC ; G 4492 +U 42221 ; WX 686 ; N uniA4ED ; G 4493 +U 42222 ; WX 684 ; N uniA4EE ; G 4494 +U 42223 ; WX 684 ; N uniA4EF ; G 4495 +U 42224 ; WX 632 ; N uniA4F0 ; G 4496 +U 42225 ; WX 632 ; N uniA4F1 ; G 4497 +U 42226 ; WX 295 ; N uniA4F2 ; G 4498 +U 42227 ; WX 787 ; N uniA4F3 ; G 4499 +U 42228 ; WX 732 ; N uniA4F4 ; G 4500 +U 42229 ; WX 732 ; N uniA4F5 ; G 4501 +U 42230 ; WX 557 ; N uniA4F6 ; G 4502 +U 42231 ; WX 767 ; N uniA4F7 ; G 4503 +U 42232 ; WX 300 ; N uniA4F8 ; G 4504 +U 42233 ; WX 300 ; N uniA4F9 ; G 4505 +U 42234 ; WX 596 ; N uniA4FA ; G 4506 +U 42235 ; WX 596 ; N uniA4FB ; G 4507 +U 42236 ; WX 300 ; N uniA4FC ; G 4508 +U 42237 ; WX 300 ; N uniA4FD ; G 4509 +U 42238 ; WX 588 ; N uniA4FE ; G 4510 +U 42239 ; WX 588 ; N uniA4FF ; G 4511 +U 42564 ; WX 635 ; N uniA644 ; G 4512 +U 42565 ; WX 521 ; N uniA645 ; G 4513 +U 42566 ; WX 354 ; N uniA646 ; G 4514 +U 42567 ; WX 338 ; N uniA647 ; G 4515 +U 42572 ; WX 1180 ; N uniA64C ; G 4516 +U 42573 ; WX 1028 ; N uniA64D ; G 4517 +U 42576 ; WX 1029 ; N uniA650 ; G 4518 +U 42577 ; WX 906 ; N uniA651 ; G 4519 +U 42580 ; WX 1080 ; N uniA654 ; G 4520 +U 42581 ; WX 842 ; N uniA655 ; G 4521 +U 42582 ; WX 985 ; N uniA656 ; G 4522 +U 42583 ; WX 847 ; N uniA657 ; G 4523 +U 42594 ; WX 1024 ; N uniA662 ; G 4524 +U 42595 ; WX 925 ; N uniA663 ; G 4525 +U 42596 ; WX 1014 ; N uniA664 ; G 4526 +U 42597 ; WX 900 ; N uniA665 ; G 4527 +U 42598 ; WX 863 ; N uniA666 ; G 4528 +U 42599 ; WX 1008 ; N uniA667 ; G 4529 +U 42600 ; WX 787 ; N uniA668 ; G 4530 +U 42601 ; WX 612 ; N uniA669 ; G 4531 +U 42602 ; WX 855 ; N uniA66A ; G 4532 +U 42603 ; WX 712 ; N uniA66B ; G 4533 +U 42604 ; WX 1358 ; N uniA66C ; G 4534 +U 42605 ; WX 1019 ; N uniA66D ; G 4535 +U 42606 ; WX 879 ; N uniA66E ; G 4536 +U 42634 ; WX 805 ; N uniA68A ; G 4537 +U 42635 ; WX 722 ; N uniA68B ; G 4538 +U 42636 ; WX 611 ; N uniA68C ; G 4539 +U 42637 ; WX 583 ; N uniA68D ; G 4540 +U 42644 ; WX 686 ; N uniA694 ; G 4541 +U 42645 ; WX 634 ; N uniA695 ; G 4542 +U 42648 ; WX 1358 ; N uniA698 ; G 4543 +U 42649 ; WX 1019 ; N uniA699 ; G 4544 +U 42760 ; WX 493 ; N uniA708 ; G 4545 +U 42761 ; WX 493 ; N uniA709 ; G 4546 +U 42762 ; WX 493 ; N uniA70A ; G 4547 +U 42763 ; WX 493 ; N uniA70B ; G 4548 +U 42764 ; WX 493 ; N uniA70C ; G 4549 +U 42765 ; WX 493 ; N uniA70D ; G 4550 +U 42766 ; WX 493 ; N uniA70E ; G 4551 +U 42767 ; WX 493 ; N uniA70F ; G 4552 +U 42768 ; WX 493 ; N uniA710 ; G 4553 +U 42769 ; WX 493 ; N uniA711 ; G 4554 +U 42770 ; WX 493 ; N uniA712 ; G 4555 +U 42771 ; WX 493 ; N uniA713 ; G 4556 +U 42772 ; WX 493 ; N uniA714 ; G 4557 +U 42773 ; WX 493 ; N uniA715 ; G 4558 +U 42774 ; WX 493 ; N uniA716 ; G 4559 +U 42779 ; WX 369 ; N uniA71B ; G 4560 +U 42780 ; WX 369 ; N uniA71C ; G 4561 +U 42781 ; WX 252 ; N uniA71D ; G 4562 +U 42782 ; WX 252 ; N uniA71E ; G 4563 +U 42783 ; WX 252 ; N uniA71F ; G 4564 +U 42786 ; WX 385 ; N uniA722 ; G 4565 +U 42787 ; WX 356 ; N uniA723 ; G 4566 +U 42788 ; WX 472 ; N uniA724 ; G 4567 +U 42789 ; WX 472 ; N uniA725 ; G 4568 +U 42790 ; WX 752 ; N uniA726 ; G 4569 +U 42791 ; WX 634 ; N uniA727 ; G 4570 +U 42792 ; WX 878 ; N uniA728 ; G 4571 +U 42793 ; WX 709 ; N uniA729 ; G 4572 +U 42794 ; WX 614 ; N uniA72A ; G 4573 +U 42795 ; WX 541 ; N uniA72B ; G 4574 +U 42800 ; WX 491 ; N uniA730 ; G 4575 +U 42801 ; WX 521 ; N uniA731 ; G 4576 +U 42802 ; WX 1250 ; N uniA732 ; G 4577 +U 42803 ; WX 985 ; N uniA733 ; G 4578 +U 42804 ; WX 1219 ; N uniA734 ; G 4579 +U 42805 ; WX 1000 ; N uniA735 ; G 4580 +U 42806 ; WX 1155 ; N uniA736 ; G 4581 +U 42807 ; WX 996 ; N uniA737 ; G 4582 +U 42808 ; WX 971 ; N uniA738 ; G 4583 +U 42809 ; WX 818 ; N uniA739 ; G 4584 +U 42810 ; WX 971 ; N uniA73A ; G 4585 +U 42811 ; WX 818 ; N uniA73B ; G 4586 +U 42812 ; WX 959 ; N uniA73C ; G 4587 +U 42813 ; WX 818 ; N uniA73D ; G 4588 +U 42814 ; WX 698 ; N uniA73E ; G 4589 +U 42815 ; WX 549 ; N uniA73F ; G 4590 +U 42816 ; WX 656 ; N uniA740 ; G 4591 +U 42817 ; WX 579 ; N uniA741 ; G 4592 +U 42822 ; WX 680 ; N uniA746 ; G 4593 +U 42823 ; WX 392 ; N uniA747 ; G 4594 +U 42824 ; WX 582 ; N uniA748 ; G 4595 +U 42825 ; WX 427 ; N uniA749 ; G 4596 +U 42826 ; WX 807 ; N uniA74A ; G 4597 +U 42827 ; WX 704 ; N uniA74B ; G 4598 +U 42830 ; WX 1358 ; N uniA74E ; G 4599 +U 42831 ; WX 1019 ; N uniA74F ; G 4600 +U 42832 ; WX 603 ; N uniA750 ; G 4601 +U 42833 ; WX 635 ; N uniA751 ; G 4602 +U 42834 ; WX 734 ; N uniA752 ; G 4603 +U 42835 ; WX 774 ; N uniA753 ; G 4604 +U 42838 ; WX 787 ; N uniA756 ; G 4605 +U 42839 ; WX 635 ; N uniA757 ; G 4606 +U 42852 ; WX 605 ; N uniA764 ; G 4607 +U 42853 ; WX 635 ; N uniA765 ; G 4608 +U 42854 ; WX 605 ; N uniA766 ; G 4609 +U 42855 ; WX 635 ; N uniA767 ; G 4610 +U 42880 ; WX 557 ; N uniA780 ; G 4611 +U 42881 ; WX 278 ; N uniA781 ; G 4612 +U 42882 ; WX 735 ; N uniA782 ; G 4613 +U 42883 ; WX 634 ; N uniA783 ; G 4614 +U 42889 ; WX 337 ; N uniA789 ; G 4615 +U 42890 ; WX 376 ; N uniA78A ; G 4616 +U 42891 ; WX 401 ; N uniA78B ; G 4617 +U 42892 ; WX 275 ; N uniA78C ; G 4618 +U 42893 ; WX 686 ; N uniA78D ; G 4619 +U 42894 ; WX 487 ; N uniA78E ; G 4620 +U 42896 ; WX 772 ; N uniA790 ; G 4621 +U 42897 ; WX 667 ; N uniA791 ; G 4622 +U 42912 ; WX 775 ; N uniA7A0 ; G 4623 +U 42913 ; WX 635 ; N uniA7A1 ; G 4624 +U 42914 ; WX 656 ; N uniA7A2 ; G 4625 +U 42915 ; WX 579 ; N uniA7A3 ; G 4626 +U 42916 ; WX 748 ; N uniA7A4 ; G 4627 +U 42917 ; WX 634 ; N uniA7A5 ; G 4628 +U 42918 ; WX 695 ; N uniA7A6 ; G 4629 +U 42919 ; WX 411 ; N uniA7A7 ; G 4630 +U 42920 ; WX 635 ; N uniA7A8 ; G 4631 +U 42921 ; WX 521 ; N uniA7A9 ; G 4632 +U 42922 ; WX 872 ; N uniA7AA ; G 4633 +U 43000 ; WX 577 ; N uniA7F8 ; G 4634 +U 43001 ; WX 644 ; N uniA7F9 ; G 4635 +U 43002 ; WX 915 ; N uniA7FA ; G 4636 +U 43003 ; WX 575 ; N uniA7FB ; G 4637 +U 43004 ; WX 603 ; N uniA7FC ; G 4638 +U 43005 ; WX 863 ; N uniA7FD ; G 4639 +U 43006 ; WX 295 ; N uniA7FE ; G 4640 +U 43007 ; WX 1199 ; N uniA7FF ; G 4641 +U 61184 ; WX 213 ; N uni02E5.5 ; G 4642 +U 61185 ; WX 238 ; N uni02E6.5 ; G 4643 +U 61186 ; WX 257 ; N uni02E7.5 ; G 4644 +U 61187 ; WX 264 ; N uni02E8.5 ; G 4645 +U 61188 ; WX 267 ; N uni02E9.5 ; G 4646 +U 61189 ; WX 238 ; N uni02E5.4 ; G 4647 +U 61190 ; WX 213 ; N uni02E6.4 ; G 4648 +U 61191 ; WX 238 ; N uni02E7.4 ; G 4649 +U 61192 ; WX 257 ; N uni02E8.4 ; G 4650 +U 61193 ; WX 264 ; N uni02E9.4 ; G 4651 +U 61194 ; WX 257 ; N uni02E5.3 ; G 4652 +U 61195 ; WX 238 ; N uni02E6.3 ; G 4653 +U 61196 ; WX 213 ; N uni02E7.3 ; G 4654 +U 61197 ; WX 238 ; N uni02E8.3 ; G 4655 +U 61198 ; WX 257 ; N uni02E9.3 ; G 4656 +U 61199 ; WX 264 ; N uni02E5.2 ; G 4657 +U 61200 ; WX 257 ; N uni02E6.2 ; G 4658 +U 61201 ; WX 238 ; N uni02E7.2 ; G 4659 +U 61202 ; WX 213 ; N uni02E8.2 ; G 4660 +U 61203 ; WX 238 ; N uni02E9.2 ; G 4661 +U 61204 ; WX 267 ; N uni02E5.1 ; G 4662 +U 61205 ; WX 264 ; N uni02E6.1 ; G 4663 +U 61206 ; WX 257 ; N uni02E7.1 ; G 4664 +U 61207 ; WX 238 ; N uni02E8.1 ; G 4665 +U 61208 ; WX 213 ; N uni02E9.1 ; G 4666 +U 61209 ; WX 275 ; N stem ; G 4667 +U 62464 ; WX 580 ; N uniF400 ; G 4668 +U 62465 ; WX 580 ; N uniF401 ; G 4669 +U 62466 ; WX 624 ; N uniF402 ; G 4670 +U 62467 ; WX 889 ; N uniF403 ; G 4671 +U 62468 ; WX 585 ; N uniF404 ; G 4672 +U 62469 ; WX 580 ; N uniF405 ; G 4673 +U 62470 ; WX 653 ; N uniF406 ; G 4674 +U 62471 ; WX 882 ; N uniF407 ; G 4675 +U 62472 ; WX 555 ; N uniF408 ; G 4676 +U 62473 ; WX 580 ; N uniF409 ; G 4677 +U 62474 ; WX 1168 ; N uniF40A ; G 4678 +U 62475 ; WX 589 ; N uniF40B ; G 4679 +U 62476 ; WX 590 ; N uniF40C ; G 4680 +U 62477 ; WX 869 ; N uniF40D ; G 4681 +U 62478 ; WX 580 ; N uniF40E ; G 4682 +U 62479 ; WX 589 ; N uniF40F ; G 4683 +U 62480 ; WX 914 ; N uniF410 ; G 4684 +U 62481 ; WX 590 ; N uniF411 ; G 4685 +U 62482 ; WX 731 ; N uniF412 ; G 4686 +U 62483 ; WX 583 ; N uniF413 ; G 4687 +U 62484 ; WX 872 ; N uniF414 ; G 4688 +U 62485 ; WX 589 ; N uniF415 ; G 4689 +U 62486 ; WX 895 ; N uniF416 ; G 4690 +U 62487 ; WX 589 ; N uniF417 ; G 4691 +U 62488 ; WX 589 ; N uniF418 ; G 4692 +U 62489 ; WX 590 ; N uniF419 ; G 4693 +U 62490 ; WX 649 ; N uniF41A ; G 4694 +U 62491 ; WX 589 ; N uniF41B ; G 4695 +U 62492 ; WX 589 ; N uniF41C ; G 4696 +U 62493 ; WX 599 ; N uniF41D ; G 4697 +U 62494 ; WX 590 ; N uniF41E ; G 4698 +U 62495 ; WX 516 ; N uniF41F ; G 4699 +U 62496 ; WX 580 ; N uniF420 ; G 4700 +U 62497 ; WX 584 ; N uniF421 ; G 4701 +U 62498 ; WX 580 ; N uniF422 ; G 4702 +U 62499 ; WX 580 ; N uniF423 ; G 4703 +U 62500 ; WX 581 ; N uniF424 ; G 4704 +U 62501 ; WX 638 ; N uniF425 ; G 4705 +U 62502 ; WX 955 ; N uniF426 ; G 4706 +U 62504 ; WX 931 ; N uniF428 ; G 4707 +U 62505 ; WX 808 ; N uniF429 ; G 4708 +U 62506 ; WX 508 ; N uniF42A ; G 4709 +U 62507 ; WX 508 ; N uniF42B ; G 4710 +U 62508 ; WX 508 ; N uniF42C ; G 4711 +U 62509 ; WX 508 ; N uniF42D ; G 4712 +U 62510 ; WX 508 ; N uniF42E ; G 4713 +U 62511 ; WX 508 ; N uniF42F ; G 4714 +U 62512 ; WX 508 ; N uniF430 ; G 4715 +U 62513 ; WX 508 ; N uniF431 ; G 4716 +U 62514 ; WX 508 ; N uniF432 ; G 4717 +U 62515 ; WX 508 ; N uniF433 ; G 4718 +U 62516 ; WX 518 ; N uniF434 ; G 4719 +U 62517 ; WX 518 ; N uniF435 ; G 4720 +U 62518 ; WX 518 ; N uniF436 ; G 4721 +U 62519 ; WX 787 ; N uniF437 ; G 4722 +U 62520 ; WX 787 ; N uniF438 ; G 4723 +U 62521 ; WX 787 ; N uniF439 ; G 4724 +U 62522 ; WX 787 ; N uniF43A ; G 4725 +U 62523 ; WX 787 ; N uniF43B ; G 4726 +U 62524 ; WX 546 ; N uniF43C ; G 4727 +U 62525 ; WX 546 ; N uniF43D ; G 4728 +U 62526 ; WX 546 ; N uniF43E ; G 4729 +U 62527 ; WX 546 ; N uniF43F ; G 4730 +U 62528 ; WX 546 ; N uniF440 ; G 4731 +U 62529 ; WX 546 ; N uniF441 ; G 4732 +U 63173 ; WX 612 ; N uniF6C5 ; G 4733 +U 64256 ; WX 722 ; N uniFB00 ; G 4734 +U 64257 ; WX 646 ; N fi ; G 4735 +U 64258 ; WX 646 ; N fl ; G 4736 +U 64259 ; WX 1000 ; N uniFB03 ; G 4737 +U 64260 ; WX 1000 ; N uniFB04 ; G 4738 +U 64261 ; WX 686 ; N uniFB05 ; G 4739 +U 64262 ; WX 861 ; N uniFB06 ; G 4740 +U 64275 ; WX 1202 ; N uniFB13 ; G 4741 +U 64276 ; WX 1202 ; N uniFB14 ; G 4742 +U 64277 ; WX 1196 ; N uniFB15 ; G 4743 +U 64278 ; WX 1186 ; N uniFB16 ; G 4744 +U 64279 ; WX 1529 ; N uniFB17 ; G 4745 +U 64285 ; WX 224 ; N uniFB1D ; G 4746 +U 64286 ; WX 0 ; N uniFB1E ; G 4747 +U 64287 ; WX 471 ; N uniFB1F ; G 4748 +U 64288 ; WX 636 ; N uniFB20 ; G 4749 +U 64289 ; WX 856 ; N uniFB21 ; G 4750 +U 64290 ; WX 774 ; N uniFB22 ; G 4751 +U 64291 ; WX 906 ; N uniFB23 ; G 4752 +U 64292 ; WX 771 ; N uniFB24 ; G 4753 +U 64293 ; WX 843 ; N uniFB25 ; G 4754 +U 64294 ; WX 855 ; N uniFB26 ; G 4755 +U 64295 ; WX 807 ; N uniFB27 ; G 4756 +U 64296 ; WX 875 ; N uniFB28 ; G 4757 +U 64297 ; WX 838 ; N uniFB29 ; G 4758 +U 64298 ; WX 708 ; N uniFB2A ; G 4759 +U 64299 ; WX 708 ; N uniFB2B ; G 4760 +U 64300 ; WX 708 ; N uniFB2C ; G 4761 +U 64301 ; WX 708 ; N uniFB2D ; G 4762 +U 64302 ; WX 668 ; N uniFB2E ; G 4763 +U 64303 ; WX 668 ; N uniFB2F ; G 4764 +U 64304 ; WX 668 ; N uniFB30 ; G 4765 +U 64305 ; WX 578 ; N uniFB31 ; G 4766 +U 64306 ; WX 412 ; N uniFB32 ; G 4767 +U 64307 ; WX 546 ; N uniFB33 ; G 4768 +U 64308 ; WX 653 ; N uniFB34 ; G 4769 +U 64309 ; WX 272 ; N uniFB35 ; G 4770 +U 64310 ; WX 346 ; N uniFB36 ; G 4771 +U 64311 ; WX 1000 ; N uniFB37 ; G 4772 +U 64312 ; WX 648 ; N uniFB38 ; G 4773 +U 64313 ; WX 307 ; N uniFB39 ; G 4774 +U 64314 ; WX 537 ; N uniFB3A ; G 4775 +U 64315 ; WX 529 ; N uniFB3B ; G 4776 +U 64316 ; WX 568 ; N uniFB3C ; G 4777 +U 64317 ; WX 1000 ; N uniFB3D ; G 4778 +U 64318 ; WX 679 ; N uniFB3E ; G 4779 +U 64319 ; WX 1000 ; N uniFB3F ; G 4780 +U 64320 ; WX 400 ; N uniFB40 ; G 4781 +U 64321 ; WX 649 ; N uniFB41 ; G 4782 +U 64322 ; WX 1000 ; N uniFB42 ; G 4783 +U 64323 ; WX 640 ; N uniFB43 ; G 4784 +U 64324 ; WX 625 ; N uniFB44 ; G 4785 +U 64325 ; WX 1000 ; N uniFB45 ; G 4786 +U 64326 ; WX 593 ; N uniFB46 ; G 4787 +U 64327 ; WX 709 ; N uniFB47 ; G 4788 +U 64328 ; WX 564 ; N uniFB48 ; G 4789 +U 64329 ; WX 708 ; N uniFB49 ; G 4790 +U 64330 ; WX 657 ; N uniFB4A ; G 4791 +U 64331 ; WX 272 ; N uniFB4B ; G 4792 +U 64332 ; WX 578 ; N uniFB4C ; G 4793 +U 64333 ; WX 529 ; N uniFB4D ; G 4794 +U 64334 ; WX 625 ; N uniFB4E ; G 4795 +U 64335 ; WX 629 ; N uniFB4F ; G 4796 +U 65024 ; WX 0 ; N uniFE00 ; G 4797 +U 65025 ; WX 0 ; N uniFE01 ; G 4798 +U 65026 ; WX 0 ; N uniFE02 ; G 4799 +U 65027 ; WX 0 ; N uniFE03 ; G 4800 +U 65028 ; WX 0 ; N uniFE04 ; G 4801 +U 65029 ; WX 0 ; N uniFE05 ; G 4802 +U 65030 ; WX 0 ; N uniFE06 ; G 4803 +U 65031 ; WX 0 ; N uniFE07 ; G 4804 +U 65032 ; WX 0 ; N uniFE08 ; G 4805 +U 65033 ; WX 0 ; N uniFE09 ; G 4806 +U 65034 ; WX 0 ; N uniFE0A ; G 4807 +U 65035 ; WX 0 ; N uniFE0B ; G 4808 +U 65036 ; WX 0 ; N uniFE0C ; G 4809 +U 65037 ; WX 0 ; N uniFE0D ; G 4810 +U 65038 ; WX 0 ; N uniFE0E ; G 4811 +U 65039 ; WX 0 ; N uniFE0F ; G 4812 +U 65056 ; WX 0 ; N uniFE20 ; G 4813 +U 65057 ; WX 0 ; N uniFE21 ; G 4814 +U 65058 ; WX 0 ; N uniFE22 ; G 4815 +U 65059 ; WX 0 ; N uniFE23 ; G 4816 +U 65529 ; WX 0 ; N uniFFF9 ; G 4817 +U 65530 ; WX 0 ; N uniFFFA ; G 4818 +U 65531 ; WX 0 ; N uniFFFB ; G 4819 +U 65532 ; WX 0 ; N uniFFFC ; G 4820 +U 65533 ; WX 1025 ; N uniFFFD ; G 4821 +EndCharMetrics +StartKernData +StartKernPairs 1029 + +KPX dollar seven -149 +KPX dollar nine -102 +KPX dollar colon -36 +KPX dollar Hcircumflex -149 +KPX dollar Hbar -149 +KPX dollar Kcommaaccent -36 +KPX dollar uni01DC -149 + +KPX percent less -36 +KPX percent kgreenlandic -36 +KPX percent lacute -36 +KPX percent uni01F4 -36 + +KPX ampersand six 38 +KPX ampersand Gcircumflex 38 +KPX ampersand Gbreve 38 +KPX ampersand Gdotaccent 38 +KPX ampersand Gcommaaccent 38 +KPX ampersand uni01DA 38 + +KPX parenright dollar -120 +KPX parenright X -83 +KPX parenright guillemotright -83 +KPX parenright onequarter -83 +KPX parenright onehalf -83 +KPX parenright threequarters -83 +KPX parenright Acircumflex -120 +KPX parenright Adieresis -120 +KPX parenright AE -120 +KPX parenright imacron -83 +KPX parenright ibreve -83 +KPX parenright iogonek -83 +KPX parenright dotlessi -83 +KPX parenright ij -83 +KPX parenright jcircumflex -83 + +KPX period ampersand -55 +KPX period two -55 +KPX period eight -36 +KPX period D -73 +KPX period H -73 +KPX period R -73 +KPX period X -55 +KPX period backslash -55 +KPX period cent -73 +KPX period sterling -73 +KPX period currency -73 +KPX period yen -73 +KPX period brokenbar -73 +KPX period section -73 +KPX period dieresis -36 +KPX period ordfeminine -73 +KPX period guillemotleft -73 +KPX period logicalnot -73 +KPX period sfthyphen -73 +KPX period acute -73 +KPX period mu -73 +KPX period paragraph -73 +KPX period periodcentered -73 +KPX period cedilla -73 +KPX period ordmasculine -92 +KPX period guillemotright -55 +KPX period onequarter -55 +KPX period onehalf -55 +KPX period threequarters -55 +KPX period questiondown -55 +KPX period Aacute -55 +KPX period Egrave -55 +KPX period Icircumflex -55 +KPX period Yacute -73 +KPX period Ebreve -55 +KPX period ebreve -92 +KPX period Idot -36 +KPX period dotlessi -55 + +KPX slash two -63 +KPX slash seven -139 +KPX slash nine -149 +KPX slash colon -83 +KPX slash less -196 +KPX slash backslash -73 +KPX slash questiondown -73 +KPX slash Aacute -73 +KPX slash Ebreve -63 +KPX slash Hbar -139 +KPX slash lacute -196 + +KPX two semicolon -55 + +KPX three dollar -102 + + +KPX six six -73 +KPX six Gdotaccent -73 +KPX six Gcommaaccent -73 + +KPX seven dollar -188 +KPX seven D -215 +KPX seven F -253 +KPX seven H -253 +KPX seven R -253 +KPX seven U -159 +KPX seven V -243 +KPX seven X -206 +KPX seven Z -167 +KPX seven backslash -178 +KPX seven cent -215 +KPX seven sterling -215 +KPX seven currency -215 +KPX seven yen -215 +KPX seven brokenbar -215 +KPX seven section -215 +KPX seven dieresis -253 +KPX seven copyright -253 +KPX seven ordfeminine -253 +KPX seven guillemotleft -253 +KPX seven logicalnot -253 +KPX seven sfthyphen -253 +KPX seven acute -253 +KPX seven mu -253 +KPX seven paragraph -253 +KPX seven periodcentered -253 +KPX seven cedilla -253 +KPX seven ordmasculine -253 +KPX seven guillemotright -206 +KPX seven onequarter -206 +KPX seven onehalf -206 +KPX seven threequarters -206 +KPX seven questiondown -178 +KPX seven Aacute -178 +KPX seven Eacute -253 +KPX seven Idieresis -253 +KPX seven Yacute -253 +KPX seven ebreve -253 +KPX seven edotaccent -159 +KPX seven ecaron -159 +KPX seven gdotaccent -243 +KPX seven gcommaaccent -243 +KPX seven dotlessi -206 + +KPX nine dollar -139 +KPX nine D -131 +KPX nine H -120 +KPX nine R -120 +KPX nine X -36 +KPX nine cent -131 +KPX nine sterling -131 +KPX nine currency -131 +KPX nine yen -131 +KPX nine brokenbar -131 +KPX nine section -131 +KPX nine dieresis -149 +KPX nine ordfeminine -120 +KPX nine guillemotleft -120 +KPX nine logicalnot -120 +KPX nine sfthyphen -120 +KPX nine acute -120 +KPX nine mu -120 +KPX nine paragraph -120 +KPX nine periodcentered -120 +KPX nine cedilla -120 +KPX nine ordmasculine -120 +KPX nine guillemotright -36 +KPX nine onequarter -36 +KPX nine onehalf -36 +KPX nine threequarters -36 +KPX nine Yacute -120 +KPX nine ebreve -120 +KPX nine dotlessi -36 + +KPX colon dollar -102 +KPX colon D -112 +KPX colon U -36 +KPX colon cent -112 +KPX colon sterling -112 +KPX colon currency -112 +KPX colon yen -112 +KPX colon brokenbar -112 +KPX colon section -112 +KPX colon dieresis -112 +KPX colon edotaccent -36 +KPX colon ecaron -36 + +KPX semicolon ampersand -36 +KPX semicolon two -73 +KPX semicolon Egrave -36 +KPX semicolon Icircumflex -36 +KPX semicolon Ebreve -55 + +KPX less dollar -159 +KPX less ampersand -36 +KPX less two -36 +KPX less D -188 +KPX less H -225 +KPX less L -36 +KPX less R -225 +KPX less X -188 +KPX less cent -188 +KPX less sterling -188 +KPX less currency -188 +KPX less yen -188 +KPX less brokenbar -188 +KPX less section -188 +KPX less dieresis -188 +KPX less ordfeminine -225 +KPX less guillemotleft -225 +KPX less logicalnot -225 +KPX less sfthyphen -225 +KPX less acute -225 +KPX less mu -225 +KPX less paragraph -225 +KPX less periodcentered -225 +KPX less cedilla -225 +KPX less ordmasculine -225 +KPX less guillemotright -188 +KPX less onequarter -188 +KPX less onehalf -188 +KPX less threequarters -188 +KPX less Egrave -36 +KPX less Icircumflex -36 +KPX less Yacute -225 +KPX less Ebreve -36 +KPX less ebreve -225 +KPX less dotlessi -188 + + + + + + + + + + +KPX Acircumflex seven -149 +KPX Acircumflex nine -102 +KPX Acircumflex colon -36 +KPX Acircumflex Hcircumflex -149 +KPX Acircumflex Hbar -149 +KPX Acircumflex Kcommaaccent -36 +KPX Acircumflex uni01DC -149 + +KPX Adieresis seven -149 +KPX Adieresis nine -102 +KPX Adieresis colon -36 +KPX Adieresis Hcircumflex -149 +KPX Adieresis Hbar -149 +KPX Adieresis Kcommaaccent -36 +KPX Adieresis uni01DC -149 + +KPX AE seven -149 +KPX AE nine -102 +KPX AE colon -36 +KPX AE Hcircumflex -149 +KPX AE Hbar -149 +KPX AE Kcommaaccent -36 +KPX AE uni01DC -149 + +KPX Egrave six 38 +KPX Egrave Gcircumflex 38 +KPX Egrave Gbreve 38 +KPX Egrave Gdotaccent 38 +KPX Egrave Gcommaaccent 38 +KPX Egrave uni01DA 38 + +KPX Ecircumflex six 38 +KPX Ecircumflex Gcircumflex 38 +KPX Ecircumflex Gbreve 38 +KPX Ecircumflex Gdotaccent 38 +KPX Ecircumflex Gcommaaccent 38 +KPX Ecircumflex uni01DA 38 + +KPX Igrave six 38 +KPX Igrave Gcircumflex 38 +KPX Igrave Gbreve 38 +KPX Igrave Gdotaccent 38 +KPX Igrave Gcommaaccent 38 +KPX Igrave uni01DA 38 + +KPX Icircumflex six 38 +KPX Icircumflex Gcircumflex 38 +KPX Icircumflex Gbreve 38 +KPX Icircumflex Gdotaccent 38 +KPX Icircumflex Gcommaaccent 38 +KPX Icircumflex uni01DA 38 + +KPX ucircumflex two -63 +KPX ucircumflex seven -139 +KPX ucircumflex nine -149 +KPX ucircumflex colon -83 +KPX ucircumflex less -196 +KPX ucircumflex backslash -73 +KPX ucircumflex questiondown -73 +KPX ucircumflex Aacute -73 +KPX ucircumflex Ebreve -63 +KPX ucircumflex Hbar -139 +KPX ucircumflex lacute -196 + +KPX ydieresis two -63 +KPX ydieresis seven -139 +KPX ydieresis nine -149 +KPX ydieresis colon -83 +KPX ydieresis less -196 +KPX ydieresis backslash -73 +KPX ydieresis questiondown -73 +KPX ydieresis Aacute -73 +KPX ydieresis Ebreve -63 +KPX ydieresis Hbar -139 +KPX ydieresis lacute -196 + +KPX abreve two -63 +KPX abreve seven -139 +KPX abreve nine -149 +KPX abreve colon -83 +KPX abreve less -196 +KPX abreve backslash -73 +KPX abreve questiondown -73 +KPX abreve Aacute -73 +KPX abreve Ebreve -63 +KPX abreve Hbar -139 +KPX abreve lacute -196 + + + +KPX Gdotaccent six -73 +KPX Gdotaccent Gdotaccent -73 +KPX Gdotaccent Gcommaaccent -73 + +KPX Gcommaaccent six -73 +KPX Gcommaaccent Gdotaccent -73 +KPX Gcommaaccent Gcommaaccent -73 + +KPX Hbar dollar -188 +KPX Hbar D -215 +KPX Hbar F -253 +KPX Hbar H -253 +KPX Hbar R -253 +KPX Hbar U -159 +KPX Hbar V -243 +KPX Hbar X -206 +KPX Hbar Z -167 +KPX Hbar backslash -178 +KPX Hbar cent -215 +KPX Hbar sterling -215 +KPX Hbar currency -215 +KPX Hbar yen -215 +KPX Hbar brokenbar -215 +KPX Hbar section -215 +KPX Hbar dieresis -253 +KPX Hbar copyright -253 +KPX Hbar ordfeminine -253 +KPX Hbar guillemotleft -253 +KPX Hbar logicalnot -253 +KPX Hbar sfthyphen -253 +KPX Hbar acute -253 +KPX Hbar mu -253 +KPX Hbar paragraph -253 +KPX Hbar periodcentered -253 +KPX Hbar cedilla -253 +KPX Hbar ordmasculine -253 +KPX Hbar guillemotright -206 +KPX Hbar onequarter -206 +KPX Hbar onehalf -206 +KPX Hbar threequarters -206 +KPX Hbar questiondown -178 +KPX Hbar Aacute -178 +KPX Hbar Eacute -253 +KPX Hbar Idieresis -253 +KPX Hbar Yacute -253 +KPX Hbar ebreve -253 +KPX Hbar edotaccent -159 +KPX Hbar ecaron -159 +KPX Hbar gdotaccent -243 +KPX Hbar gcommaaccent -243 +KPX Hbar dotlessi -206 + +KPX lacute dollar -159 +KPX lacute ampersand -36 +KPX lacute two -36 +KPX lacute D -188 +KPX lacute H -225 +KPX lacute L -36 +KPX lacute R -225 +KPX lacute X -188 +KPX lacute cent -188 +KPX lacute sterling -188 +KPX lacute currency -188 +KPX lacute yen -188 +KPX lacute brokenbar -188 +KPX lacute section -188 +KPX lacute dieresis -188 +KPX lacute ordfeminine -225 +KPX lacute guillemotleft -225 +KPX lacute logicalnot -225 +KPX lacute sfthyphen -225 +KPX lacute acute -225 +KPX lacute mu -225 +KPX lacute paragraph -225 +KPX lacute periodcentered -225 +KPX lacute cedilla -225 +KPX lacute ordmasculine -225 +KPX lacute guillemotright -188 +KPX lacute onequarter -188 +KPX lacute onehalf -188 +KPX lacute threequarters -188 +KPX lacute Egrave -36 +KPX lacute Icircumflex -36 +KPX lacute Yacute -225 +KPX lacute Ebreve -36 +KPX lacute ebreve -225 +KPX lacute dotlessi -188 + + +KPX uni027D dollar -243 +KPX uni027D nine 75 +KPX uni027D less 47 +KPX uni027D lacute 47 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans.ttf b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans.ttf new file mode 100644 index 0000000..e5f7eec Binary files /dev/null and b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans.ttf differ diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans.ufm b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans.ufm new file mode 100644 index 0000000..82dfd81 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSans.ufm @@ -0,0 +1,6661 @@ +StartFontMetrics 4.1 +Notice Converted by PHP-font-lib +Comment https://github.com/PhenX/php-font-lib +EncodingScheme FontSpecific +FontName DejaVu Sans +FontSubfamily Book +UniqueID DejaVu Sans +FullName DejaVu Sans +Version Version 2.37 +PostScriptName DejaVuSans +Manufacturer DejaVu fonts team +FontVendorURL http://dejavu.sourceforge.net +LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License +PreferredFamily DejaVu Sans +PreferredSubfamily Book +Weight Medium +ItalicAngle 0 +IsFixedPitch false +UnderlineThickness 44 +UnderlinePosition -63 +FontHeightOffset 0 +Ascender 928 +Descender -236 +FontBBox -1021 -463 1793 1232 +StartCharMetrics 6253 +U 32 ; WX 318 ; N space ; G 3 +U 33 ; WX 401 ; N exclam ; G 4 +U 34 ; WX 460 ; N quotedbl ; G 5 +U 35 ; WX 838 ; N numbersign ; G 6 +U 36 ; WX 636 ; N dollar ; G 7 +U 37 ; WX 950 ; N percent ; G 8 +U 38 ; WX 780 ; N ampersand ; G 9 +U 39 ; WX 275 ; N quotesingle ; G 10 +U 40 ; WX 390 ; N parenleft ; G 11 +U 41 ; WX 390 ; N parenright ; G 12 +U 42 ; WX 500 ; N asterisk ; G 13 +U 43 ; WX 838 ; N plus ; G 14 +U 44 ; WX 318 ; N comma ; G 15 +U 45 ; WX 361 ; N hyphen ; G 16 +U 46 ; WX 318 ; N period ; G 17 +U 47 ; WX 337 ; N slash ; G 18 +U 48 ; WX 636 ; N zero ; G 19 +U 49 ; WX 636 ; N one ; G 20 +U 50 ; WX 636 ; N two ; G 21 +U 51 ; WX 636 ; N three ; G 22 +U 52 ; WX 636 ; N four ; G 23 +U 53 ; WX 636 ; N five ; G 24 +U 54 ; WX 636 ; N six ; G 25 +U 55 ; WX 636 ; N seven ; G 26 +U 56 ; WX 636 ; N eight ; G 27 +U 57 ; WX 636 ; N nine ; G 28 +U 58 ; WX 337 ; N colon ; G 29 +U 59 ; WX 337 ; N semicolon ; G 30 +U 60 ; WX 838 ; N less ; G 31 +U 61 ; WX 838 ; N equal ; G 32 +U 62 ; WX 838 ; N greater ; G 33 +U 63 ; WX 531 ; N question ; G 34 +U 64 ; WX 1000 ; N at ; G 35 +U 65 ; WX 684 ; N A ; G 36 +U 66 ; WX 686 ; N B ; G 37 +U 67 ; WX 698 ; N C ; G 38 +U 68 ; WX 770 ; N D ; G 39 +U 69 ; WX 632 ; N E ; G 40 +U 70 ; WX 575 ; N F ; G 41 +U 71 ; WX 775 ; N G ; G 42 +U 72 ; WX 752 ; N H ; G 43 +U 73 ; WX 295 ; N I ; G 44 +U 74 ; WX 295 ; N J ; G 45 +U 75 ; WX 656 ; N K ; G 46 +U 76 ; WX 557 ; N L ; G 47 +U 77 ; WX 863 ; N M ; G 48 +U 78 ; WX 748 ; N N ; G 49 +U 79 ; WX 787 ; N O ; G 50 +U 80 ; WX 603 ; N P ; G 51 +U 81 ; WX 787 ; N Q ; G 52 +U 82 ; WX 695 ; N R ; G 53 +U 83 ; WX 635 ; N S ; G 54 +U 84 ; WX 611 ; N T ; G 55 +U 85 ; WX 732 ; N U ; G 56 +U 86 ; WX 684 ; N V ; G 57 +U 87 ; WX 989 ; N W ; G 58 +U 88 ; WX 685 ; N X ; G 59 +U 89 ; WX 611 ; N Y ; G 60 +U 90 ; WX 685 ; N Z ; G 61 +U 91 ; WX 390 ; N bracketleft ; G 62 +U 92 ; WX 337 ; N backslash ; G 63 +U 93 ; WX 390 ; N bracketright ; G 64 +U 94 ; WX 838 ; N asciicircum ; G 65 +U 95 ; WX 500 ; N underscore ; G 66 +U 96 ; WX 500 ; N grave ; G 67 +U 97 ; WX 613 ; N a ; G 68 +U 98 ; WX 635 ; N b ; G 69 +U 99 ; WX 550 ; N c ; G 70 +U 100 ; WX 635 ; N d ; G 71 +U 101 ; WX 615 ; N e ; G 72 +U 102 ; WX 352 ; N f ; G 73 +U 103 ; WX 635 ; N g ; G 74 +U 104 ; WX 634 ; N h ; G 75 +U 105 ; WX 278 ; N i ; G 76 +U 106 ; WX 278 ; N j ; G 77 +U 107 ; WX 579 ; N k ; G 78 +U 108 ; WX 278 ; N l ; G 79 +U 109 ; WX 974 ; N m ; G 80 +U 110 ; WX 634 ; N n ; G 81 +U 111 ; WX 612 ; N o ; G 82 +U 112 ; WX 635 ; N p ; G 83 +U 113 ; WX 635 ; N q ; G 84 +U 114 ; WX 411 ; N r ; G 85 +U 115 ; WX 521 ; N s ; G 86 +U 116 ; WX 392 ; N t ; G 87 +U 117 ; WX 634 ; N u ; G 88 +U 118 ; WX 592 ; N v ; G 89 +U 119 ; WX 818 ; N w ; G 90 +U 120 ; WX 592 ; N x ; G 91 +U 121 ; WX 592 ; N y ; G 92 +U 122 ; WX 525 ; N z ; G 93 +U 123 ; WX 636 ; N braceleft ; G 94 +U 124 ; WX 337 ; N bar ; G 95 +U 125 ; WX 636 ; N braceright ; G 96 +U 126 ; WX 838 ; N asciitilde ; G 97 +U 160 ; WX 318 ; N nbspace ; G 98 +U 161 ; WX 401 ; N exclamdown ; G 99 +U 162 ; WX 636 ; N cent ; G 100 +U 163 ; WX 636 ; N sterling ; G 101 +U 164 ; WX 636 ; N currency ; G 102 +U 165 ; WX 636 ; N yen ; G 103 +U 166 ; WX 337 ; N brokenbar ; G 104 +U 167 ; WX 500 ; N section ; G 105 +U 168 ; WX 500 ; N dieresis ; G 106 +U 169 ; WX 1000 ; N copyright ; G 107 +U 170 ; WX 471 ; N ordfeminine ; G 108 +U 171 ; WX 612 ; N guillemotleft ; G 109 +U 172 ; WX 838 ; N logicalnot ; G 110 +U 173 ; WX 361 ; N sfthyphen ; G 111 +U 174 ; WX 1000 ; N registered ; G 112 +U 175 ; WX 500 ; N macron ; G 113 +U 176 ; WX 500 ; N degree ; G 114 +U 177 ; WX 838 ; N plusminus ; G 115 +U 178 ; WX 401 ; N twosuperior ; G 116 +U 179 ; WX 401 ; N threesuperior ; G 117 +U 180 ; WX 500 ; N acute ; G 118 +U 181 ; WX 636 ; N mu ; G 119 +U 182 ; WX 636 ; N paragraph ; G 120 +U 183 ; WX 318 ; N periodcentered ; G 121 +U 184 ; WX 500 ; N cedilla ; G 122 +U 185 ; WX 401 ; N onesuperior ; G 123 +U 186 ; WX 471 ; N ordmasculine ; G 124 +U 187 ; WX 612 ; N guillemotright ; G 125 +U 188 ; WX 969 ; N onequarter ; G 126 +U 189 ; WX 969 ; N onehalf ; G 127 +U 190 ; WX 969 ; N threequarters ; G 128 +U 191 ; WX 531 ; N questiondown ; G 129 +U 192 ; WX 684 ; N Agrave ; G 130 +U 193 ; WX 684 ; N Aacute ; G 131 +U 194 ; WX 684 ; N Acircumflex ; G 132 +U 195 ; WX 684 ; N Atilde ; G 133 +U 196 ; WX 684 ; N Adieresis ; G 134 +U 197 ; WX 684 ; N Aring ; G 135 +U 198 ; WX 974 ; N AE ; G 136 +U 199 ; WX 698 ; N Ccedilla ; G 137 +U 200 ; WX 632 ; N Egrave ; G 138 +U 201 ; WX 632 ; N Eacute ; G 139 +U 202 ; WX 632 ; N Ecircumflex ; G 140 +U 203 ; WX 632 ; N Edieresis ; G 141 +U 204 ; WX 295 ; N Igrave ; G 142 +U 205 ; WX 295 ; N Iacute ; G 143 +U 206 ; WX 295 ; N Icircumflex ; G 144 +U 207 ; WX 295 ; N Idieresis ; G 145 +U 208 ; WX 775 ; N Eth ; G 146 +U 209 ; WX 748 ; N Ntilde ; G 147 +U 210 ; WX 787 ; N Ograve ; G 148 +U 211 ; WX 787 ; N Oacute ; G 149 +U 212 ; WX 787 ; N Ocircumflex ; G 150 +U 213 ; WX 787 ; N Otilde ; G 151 +U 214 ; WX 787 ; N Odieresis ; G 152 +U 215 ; WX 838 ; N multiply ; G 153 +U 216 ; WX 787 ; N Oslash ; G 154 +U 217 ; WX 732 ; N Ugrave ; G 155 +U 218 ; WX 732 ; N Uacute ; G 156 +U 219 ; WX 732 ; N Ucircumflex ; G 157 +U 220 ; WX 732 ; N Udieresis ; G 158 +U 221 ; WX 611 ; N Yacute ; G 159 +U 222 ; WX 605 ; N Thorn ; G 160 +U 223 ; WX 630 ; N germandbls ; G 161 +U 224 ; WX 613 ; N agrave ; G 162 +U 225 ; WX 613 ; N aacute ; G 163 +U 226 ; WX 613 ; N acircumflex ; G 164 +U 227 ; WX 613 ; N atilde ; G 165 +U 228 ; WX 613 ; N adieresis ; G 166 +U 229 ; WX 613 ; N aring ; G 167 +U 230 ; WX 982 ; N ae ; G 168 +U 231 ; WX 550 ; N ccedilla ; G 169 +U 232 ; WX 615 ; N egrave ; G 170 +U 233 ; WX 615 ; N eacute ; G 171 +U 234 ; WX 615 ; N ecircumflex ; G 172 +U 235 ; WX 615 ; N edieresis ; G 173 +U 236 ; WX 278 ; N igrave ; G 174 +U 237 ; WX 278 ; N iacute ; G 175 +U 238 ; WX 278 ; N icircumflex ; G 176 +U 239 ; WX 278 ; N idieresis ; G 177 +U 240 ; WX 612 ; N eth ; G 178 +U 241 ; WX 634 ; N ntilde ; G 179 +U 242 ; WX 612 ; N ograve ; G 180 +U 243 ; WX 612 ; N oacute ; G 181 +U 244 ; WX 612 ; N ocircumflex ; G 182 +U 245 ; WX 612 ; N otilde ; G 183 +U 246 ; WX 612 ; N odieresis ; G 184 +U 247 ; WX 838 ; N divide ; G 185 +U 248 ; WX 612 ; N oslash ; G 186 +U 249 ; WX 634 ; N ugrave ; G 187 +U 250 ; WX 634 ; N uacute ; G 188 +U 251 ; WX 634 ; N ucircumflex ; G 189 +U 252 ; WX 634 ; N udieresis ; G 190 +U 253 ; WX 592 ; N yacute ; G 191 +U 254 ; WX 635 ; N thorn ; G 192 +U 255 ; WX 592 ; N ydieresis ; G 193 +U 256 ; WX 684 ; N Amacron ; G 194 +U 257 ; WX 613 ; N amacron ; G 195 +U 258 ; WX 684 ; N Abreve ; G 196 +U 259 ; WX 613 ; N abreve ; G 197 +U 260 ; WX 684 ; N Aogonek ; G 198 +U 261 ; WX 613 ; N aogonek ; G 199 +U 262 ; WX 698 ; N Cacute ; G 200 +U 263 ; WX 550 ; N cacute ; G 201 +U 264 ; WX 698 ; N Ccircumflex ; G 202 +U 265 ; WX 550 ; N ccircumflex ; G 203 +U 266 ; WX 698 ; N Cdotaccent ; G 204 +U 267 ; WX 550 ; N cdotaccent ; G 205 +U 268 ; WX 698 ; N Ccaron ; G 206 +U 269 ; WX 550 ; N ccaron ; G 207 +U 270 ; WX 770 ; N Dcaron ; G 208 +U 271 ; WX 635 ; N dcaron ; G 209 +U 272 ; WX 775 ; N Dcroat ; G 210 +U 273 ; WX 635 ; N dmacron ; G 211 +U 274 ; WX 632 ; N Emacron ; G 212 +U 275 ; WX 615 ; N emacron ; G 213 +U 276 ; WX 632 ; N Ebreve ; G 214 +U 277 ; WX 615 ; N ebreve ; G 215 +U 278 ; WX 632 ; N Edotaccent ; G 216 +U 279 ; WX 615 ; N edotaccent ; G 217 +U 280 ; WX 632 ; N Eogonek ; G 218 +U 281 ; WX 615 ; N eogonek ; G 219 +U 282 ; WX 632 ; N Ecaron ; G 220 +U 283 ; WX 615 ; N ecaron ; G 221 +U 284 ; WX 775 ; N Gcircumflex ; G 222 +U 285 ; WX 635 ; N gcircumflex ; G 223 +U 286 ; WX 775 ; N Gbreve ; G 224 +U 287 ; WX 635 ; N gbreve ; G 225 +U 288 ; WX 775 ; N Gdotaccent ; G 226 +U 289 ; WX 635 ; N gdotaccent ; G 227 +U 290 ; WX 775 ; N Gcommaaccent ; G 228 +U 291 ; WX 635 ; N gcommaaccent ; G 229 +U 292 ; WX 752 ; N Hcircumflex ; G 230 +U 293 ; WX 634 ; N hcircumflex ; G 231 +U 294 ; WX 916 ; N Hbar ; G 232 +U 295 ; WX 695 ; N hbar ; G 233 +U 296 ; WX 295 ; N Itilde ; G 234 +U 297 ; WX 278 ; N itilde ; G 235 +U 298 ; WX 295 ; N Imacron ; G 236 +U 299 ; WX 278 ; N imacron ; G 237 +U 300 ; WX 295 ; N Ibreve ; G 238 +U 301 ; WX 278 ; N ibreve ; G 239 +U 302 ; WX 295 ; N Iogonek ; G 240 +U 303 ; WX 278 ; N iogonek ; G 241 +U 304 ; WX 295 ; N Idot ; G 242 +U 305 ; WX 278 ; N dotlessi ; G 243 +U 306 ; WX 590 ; N IJ ; G 244 +U 307 ; WX 556 ; N ij ; G 245 +U 308 ; WX 295 ; N Jcircumflex ; G 246 +U 309 ; WX 278 ; N jcircumflex ; G 247 +U 310 ; WX 656 ; N Kcommaaccent ; G 248 +U 311 ; WX 579 ; N kcommaaccent ; G 249 +U 312 ; WX 579 ; N kgreenlandic ; G 250 +U 313 ; WX 557 ; N Lacute ; G 251 +U 314 ; WX 278 ; N lacute ; G 252 +U 315 ; WX 557 ; N Lcommaaccent ; G 253 +U 316 ; WX 278 ; N lcommaaccent ; G 254 +U 317 ; WX 557 ; N Lcaron ; G 255 +U 318 ; WX 375 ; N lcaron ; G 256 +U 319 ; WX 557 ; N Ldot ; G 257 +U 320 ; WX 342 ; N ldot ; G 258 +U 321 ; WX 562 ; N Lslash ; G 259 +U 322 ; WX 284 ; N lslash ; G 260 +U 323 ; WX 748 ; N Nacute ; G 261 +U 324 ; WX 634 ; N nacute ; G 262 +U 325 ; WX 748 ; N Ncommaaccent ; G 263 +U 326 ; WX 634 ; N ncommaaccent ; G 264 +U 327 ; WX 748 ; N Ncaron ; G 265 +U 328 ; WX 634 ; N ncaron ; G 266 +U 329 ; WX 813 ; N napostrophe ; G 267 +U 330 ; WX 748 ; N Eng ; G 268 +U 331 ; WX 634 ; N eng ; G 269 +U 332 ; WX 787 ; N Omacron ; G 270 +U 333 ; WX 612 ; N omacron ; G 271 +U 334 ; WX 787 ; N Obreve ; G 272 +U 335 ; WX 612 ; N obreve ; G 273 +U 336 ; WX 787 ; N Ohungarumlaut ; G 274 +U 337 ; WX 612 ; N ohungarumlaut ; G 275 +U 338 ; WX 1070 ; N OE ; G 276 +U 339 ; WX 1023 ; N oe ; G 277 +U 340 ; WX 695 ; N Racute ; G 278 +U 341 ; WX 411 ; N racute ; G 279 +U 342 ; WX 695 ; N Rcommaaccent ; G 280 +U 343 ; WX 411 ; N rcommaaccent ; G 281 +U 344 ; WX 695 ; N Rcaron ; G 282 +U 345 ; WX 411 ; N rcaron ; G 283 +U 346 ; WX 635 ; N Sacute ; G 284 +U 347 ; WX 521 ; N sacute ; G 285 +U 348 ; WX 635 ; N Scircumflex ; G 286 +U 349 ; WX 521 ; N scircumflex ; G 287 +U 350 ; WX 635 ; N Scedilla ; G 288 +U 351 ; WX 521 ; N scedilla ; G 289 +U 352 ; WX 635 ; N Scaron ; G 290 +U 353 ; WX 521 ; N scaron ; G 291 +U 354 ; WX 611 ; N Tcommaaccent ; G 292 +U 355 ; WX 392 ; N tcommaaccent ; G 293 +U 356 ; WX 611 ; N Tcaron ; G 294 +U 357 ; WX 392 ; N tcaron ; G 295 +U 358 ; WX 611 ; N Tbar ; G 296 +U 359 ; WX 392 ; N tbar ; G 297 +U 360 ; WX 732 ; N Utilde ; G 298 +U 361 ; WX 634 ; N utilde ; G 299 +U 362 ; WX 732 ; N Umacron ; G 300 +U 363 ; WX 634 ; N umacron ; G 301 +U 364 ; WX 732 ; N Ubreve ; G 302 +U 365 ; WX 634 ; N ubreve ; G 303 +U 366 ; WX 732 ; N Uring ; G 304 +U 367 ; WX 634 ; N uring ; G 305 +U 368 ; WX 732 ; N Uhungarumlaut ; G 306 +U 369 ; WX 634 ; N uhungarumlaut ; G 307 +U 370 ; WX 732 ; N Uogonek ; G 308 +U 371 ; WX 634 ; N uogonek ; G 309 +U 372 ; WX 989 ; N Wcircumflex ; G 310 +U 373 ; WX 818 ; N wcircumflex ; G 311 +U 374 ; WX 611 ; N Ycircumflex ; G 312 +U 375 ; WX 592 ; N ycircumflex ; G 313 +U 376 ; WX 611 ; N Ydieresis ; G 314 +U 377 ; WX 685 ; N Zacute ; G 315 +U 378 ; WX 525 ; N zacute ; G 316 +U 379 ; WX 685 ; N Zdotaccent ; G 317 +U 380 ; WX 525 ; N zdotaccent ; G 318 +U 381 ; WX 685 ; N Zcaron ; G 319 +U 382 ; WX 525 ; N zcaron ; G 320 +U 383 ; WX 352 ; N longs ; G 321 +U 384 ; WX 635 ; N uni0180 ; G 322 +U 385 ; WX 735 ; N uni0181 ; G 323 +U 386 ; WX 686 ; N uni0182 ; G 324 +U 387 ; WX 635 ; N uni0183 ; G 325 +U 388 ; WX 686 ; N uni0184 ; G 326 +U 389 ; WX 635 ; N uni0185 ; G 327 +U 390 ; WX 703 ; N uni0186 ; G 328 +U 391 ; WX 698 ; N uni0187 ; G 329 +U 392 ; WX 550 ; N uni0188 ; G 330 +U 393 ; WX 775 ; N uni0189 ; G 331 +U 394 ; WX 819 ; N uni018A ; G 332 +U 395 ; WX 686 ; N uni018B ; G 333 +U 396 ; WX 635 ; N uni018C ; G 334 +U 397 ; WX 612 ; N uni018D ; G 335 +U 398 ; WX 632 ; N uni018E ; G 336 +U 399 ; WX 787 ; N uni018F ; G 337 +U 400 ; WX 614 ; N uni0190 ; G 338 +U 401 ; WX 575 ; N uni0191 ; G 339 +U 402 ; WX 352 ; N florin ; G 340 +U 403 ; WX 775 ; N uni0193 ; G 341 +U 404 ; WX 687 ; N uni0194 ; G 342 +U 405 ; WX 984 ; N uni0195 ; G 343 +U 406 ; WX 354 ; N uni0196 ; G 344 +U 407 ; WX 295 ; N uni0197 ; G 345 +U 408 ; WX 746 ; N uni0198 ; G 346 +U 409 ; WX 579 ; N uni0199 ; G 347 +U 410 ; WX 278 ; N uni019A ; G 348 +U 411 ; WX 592 ; N uni019B ; G 349 +U 412 ; WX 974 ; N uni019C ; G 350 +U 413 ; WX 748 ; N uni019D ; G 351 +U 414 ; WX 634 ; N uni019E ; G 352 +U 415 ; WX 787 ; N uni019F ; G 353 +U 416 ; WX 913 ; N Ohorn ; G 354 +U 417 ; WX 612 ; N ohorn ; G 355 +U 418 ; WX 949 ; N uni01A2 ; G 356 +U 419 ; WX 759 ; N uni01A3 ; G 357 +U 420 ; WX 652 ; N uni01A4 ; G 358 +U 421 ; WX 635 ; N uni01A5 ; G 359 +U 422 ; WX 695 ; N uni01A6 ; G 360 +U 423 ; WX 635 ; N uni01A7 ; G 361 +U 424 ; WX 521 ; N uni01A8 ; G 362 +U 425 ; WX 632 ; N uni01A9 ; G 363 +U 426 ; WX 336 ; N uni01AA ; G 364 +U 427 ; WX 392 ; N uni01AB ; G 365 +U 428 ; WX 611 ; N uni01AC ; G 366 +U 429 ; WX 392 ; N uni01AD ; G 367 +U 430 ; WX 611 ; N uni01AE ; G 368 +U 431 ; WX 858 ; N Uhorn ; G 369 +U 432 ; WX 634 ; N uhorn ; G 370 +U 433 ; WX 764 ; N uni01B1 ; G 371 +U 434 ; WX 721 ; N uni01B2 ; G 372 +U 435 ; WX 744 ; N uni01B3 ; G 373 +U 436 ; WX 730 ; N uni01B4 ; G 374 +U 437 ; WX 685 ; N uni01B5 ; G 375 +U 438 ; WX 525 ; N uni01B6 ; G 376 +U 439 ; WX 666 ; N uni01B7 ; G 377 +U 440 ; WX 666 ; N uni01B8 ; G 378 +U 441 ; WX 578 ; N uni01B9 ; G 379 +U 442 ; WX 525 ; N uni01BA ; G 380 +U 443 ; WX 636 ; N uni01BB ; G 381 +U 444 ; WX 666 ; N uni01BC ; G 382 +U 445 ; WX 578 ; N uni01BD ; G 383 +U 446 ; WX 510 ; N uni01BE ; G 384 +U 447 ; WX 635 ; N uni01BF ; G 385 +U 448 ; WX 295 ; N uni01C0 ; G 386 +U 449 ; WX 492 ; N uni01C1 ; G 387 +U 450 ; WX 459 ; N uni01C2 ; G 388 +U 451 ; WX 295 ; N uni01C3 ; G 389 +U 452 ; WX 1422 ; N uni01C4 ; G 390 +U 453 ; WX 1299 ; N uni01C5 ; G 391 +U 454 ; WX 1154 ; N uni01C6 ; G 392 +U 455 ; WX 835 ; N uni01C7 ; G 393 +U 456 ; WX 787 ; N uni01C8 ; G 394 +U 457 ; WX 457 ; N uni01C9 ; G 395 +U 458 ; WX 931 ; N uni01CA ; G 396 +U 459 ; WX 924 ; N uni01CB ; G 397 +U 460 ; WX 797 ; N uni01CC ; G 398 +U 461 ; WX 684 ; N uni01CD ; G 399 +U 462 ; WX 613 ; N uni01CE ; G 400 +U 463 ; WX 295 ; N uni01CF ; G 401 +U 464 ; WX 278 ; N uni01D0 ; G 402 +U 465 ; WX 787 ; N uni01D1 ; G 403 +U 466 ; WX 612 ; N uni01D2 ; G 404 +U 467 ; WX 732 ; N uni01D3 ; G 405 +U 468 ; WX 634 ; N uni01D4 ; G 406 +U 469 ; WX 732 ; N uni01D5 ; G 407 +U 470 ; WX 634 ; N uni01D6 ; G 408 +U 471 ; WX 732 ; N uni01D7 ; G 409 +U 472 ; WX 634 ; N uni01D8 ; G 410 +U 473 ; WX 732 ; N uni01D9 ; G 411 +U 474 ; WX 634 ; N uni01DA ; G 412 +U 475 ; WX 732 ; N uni01DB ; G 413 +U 476 ; WX 634 ; N uni01DC ; G 414 +U 477 ; WX 615 ; N uni01DD ; G 415 +U 478 ; WX 684 ; N uni01DE ; G 416 +U 479 ; WX 613 ; N uni01DF ; G 417 +U 480 ; WX 684 ; N uni01E0 ; G 418 +U 481 ; WX 613 ; N uni01E1 ; G 419 +U 482 ; WX 974 ; N uni01E2 ; G 420 +U 483 ; WX 982 ; N uni01E3 ; G 421 +U 484 ; WX 775 ; N uni01E4 ; G 422 +U 485 ; WX 635 ; N uni01E5 ; G 423 +U 486 ; WX 775 ; N Gcaron ; G 424 +U 487 ; WX 635 ; N gcaron ; G 425 +U 488 ; WX 656 ; N uni01E8 ; G 426 +U 489 ; WX 579 ; N uni01E9 ; G 427 +U 490 ; WX 787 ; N uni01EA ; G 428 +U 491 ; WX 612 ; N uni01EB ; G 429 +U 492 ; WX 787 ; N uni01EC ; G 430 +U 493 ; WX 612 ; N uni01ED ; G 431 +U 494 ; WX 666 ; N uni01EE ; G 432 +U 495 ; WX 578 ; N uni01EF ; G 433 +U 496 ; WX 278 ; N uni01F0 ; G 434 +U 497 ; WX 1422 ; N uni01F1 ; G 435 +U 498 ; WX 1299 ; N uni01F2 ; G 436 +U 499 ; WX 1154 ; N uni01F3 ; G 437 +U 500 ; WX 775 ; N uni01F4 ; G 438 +U 501 ; WX 635 ; N uni01F5 ; G 439 +U 502 ; WX 1113 ; N uni01F6 ; G 440 +U 503 ; WX 682 ; N uni01F7 ; G 441 +U 504 ; WX 748 ; N uni01F8 ; G 442 +U 505 ; WX 634 ; N uni01F9 ; G 443 +U 506 ; WX 684 ; N Aringacute ; G 444 +U 507 ; WX 613 ; N aringacute ; G 445 +U 508 ; WX 974 ; N AEacute ; G 446 +U 509 ; WX 982 ; N aeacute ; G 447 +U 510 ; WX 787 ; N Oslashacute ; G 448 +U 511 ; WX 612 ; N oslashacute ; G 449 +U 512 ; WX 684 ; N uni0200 ; G 450 +U 513 ; WX 613 ; N uni0201 ; G 451 +U 514 ; WX 684 ; N uni0202 ; G 452 +U 515 ; WX 613 ; N uni0203 ; G 453 +U 516 ; WX 632 ; N uni0204 ; G 454 +U 517 ; WX 615 ; N uni0205 ; G 455 +U 518 ; WX 632 ; N uni0206 ; G 456 +U 519 ; WX 615 ; N uni0207 ; G 457 +U 520 ; WX 295 ; N uni0208 ; G 458 +U 521 ; WX 278 ; N uni0209 ; G 459 +U 522 ; WX 295 ; N uni020A ; G 460 +U 523 ; WX 278 ; N uni020B ; G 461 +U 524 ; WX 787 ; N uni020C ; G 462 +U 525 ; WX 612 ; N uni020D ; G 463 +U 526 ; WX 787 ; N uni020E ; G 464 +U 527 ; WX 612 ; N uni020F ; G 465 +U 528 ; WX 695 ; N uni0210 ; G 466 +U 529 ; WX 411 ; N uni0211 ; G 467 +U 530 ; WX 695 ; N uni0212 ; G 468 +U 531 ; WX 411 ; N uni0213 ; G 469 +U 532 ; WX 732 ; N uni0214 ; G 470 +U 533 ; WX 634 ; N uni0215 ; G 471 +U 534 ; WX 732 ; N uni0216 ; G 472 +U 535 ; WX 634 ; N uni0217 ; G 473 +U 536 ; WX 635 ; N Scommaaccent ; G 474 +U 537 ; WX 521 ; N scommaaccent ; G 475 +U 538 ; WX 611 ; N uni021A ; G 476 +U 539 ; WX 392 ; N uni021B ; G 477 +U 540 ; WX 627 ; N uni021C ; G 478 +U 541 ; WX 521 ; N uni021D ; G 479 +U 542 ; WX 752 ; N uni021E ; G 480 +U 543 ; WX 634 ; N uni021F ; G 481 +U 544 ; WX 735 ; N uni0220 ; G 482 +U 545 ; WX 838 ; N uni0221 ; G 483 +U 546 ; WX 698 ; N uni0222 ; G 484 +U 547 ; WX 610 ; N uni0223 ; G 485 +U 548 ; WX 685 ; N uni0224 ; G 486 +U 549 ; WX 525 ; N uni0225 ; G 487 +U 550 ; WX 684 ; N uni0226 ; G 488 +U 551 ; WX 613 ; N uni0227 ; G 489 +U 552 ; WX 632 ; N uni0228 ; G 490 +U 553 ; WX 615 ; N uni0229 ; G 491 +U 554 ; WX 787 ; N uni022A ; G 492 +U 555 ; WX 612 ; N uni022B ; G 493 +U 556 ; WX 787 ; N uni022C ; G 494 +U 557 ; WX 612 ; N uni022D ; G 495 +U 558 ; WX 787 ; N uni022E ; G 496 +U 559 ; WX 612 ; N uni022F ; G 497 +U 560 ; WX 787 ; N uni0230 ; G 498 +U 561 ; WX 612 ; N uni0231 ; G 499 +U 562 ; WX 611 ; N uni0232 ; G 500 +U 563 ; WX 592 ; N uni0233 ; G 501 +U 564 ; WX 475 ; N uni0234 ; G 502 +U 565 ; WX 843 ; N uni0235 ; G 503 +U 566 ; WX 477 ; N uni0236 ; G 504 +U 567 ; WX 278 ; N dotlessj ; G 505 +U 568 ; WX 998 ; N uni0238 ; G 506 +U 569 ; WX 998 ; N uni0239 ; G 507 +U 570 ; WX 684 ; N uni023A ; G 508 +U 571 ; WX 698 ; N uni023B ; G 509 +U 572 ; WX 550 ; N uni023C ; G 510 +U 573 ; WX 557 ; N uni023D ; G 511 +U 574 ; WX 611 ; N uni023E ; G 512 +U 575 ; WX 521 ; N uni023F ; G 513 +U 576 ; WX 525 ; N uni0240 ; G 514 +U 577 ; WX 603 ; N uni0241 ; G 515 +U 578 ; WX 479 ; N uni0242 ; G 516 +U 579 ; WX 686 ; N uni0243 ; G 517 +U 580 ; WX 732 ; N uni0244 ; G 518 +U 581 ; WX 684 ; N uni0245 ; G 519 +U 582 ; WX 632 ; N uni0246 ; G 520 +U 583 ; WX 615 ; N uni0247 ; G 521 +U 584 ; WX 295 ; N uni0248 ; G 522 +U 585 ; WX 278 ; N uni0249 ; G 523 +U 586 ; WX 781 ; N uni024A ; G 524 +U 587 ; WX 635 ; N uni024B ; G 525 +U 588 ; WX 695 ; N uni024C ; G 526 +U 589 ; WX 411 ; N uni024D ; G 527 +U 590 ; WX 611 ; N uni024E ; G 528 +U 591 ; WX 592 ; N uni024F ; G 529 +U 592 ; WX 600 ; N uni0250 ; G 530 +U 593 ; WX 635 ; N uni0251 ; G 531 +U 594 ; WX 635 ; N uni0252 ; G 532 +U 595 ; WX 635 ; N uni0253 ; G 533 +U 596 ; WX 549 ; N uni0254 ; G 534 +U 597 ; WX 550 ; N uni0255 ; G 535 +U 598 ; WX 635 ; N uni0256 ; G 536 +U 599 ; WX 696 ; N uni0257 ; G 537 +U 600 ; WX 615 ; N uni0258 ; G 538 +U 601 ; WX 615 ; N uni0259 ; G 539 +U 602 ; WX 819 ; N uni025A ; G 540 +U 603 ; WX 541 ; N uni025B ; G 541 +U 604 ; WX 532 ; N uni025C ; G 542 +U 605 ; WX 775 ; N uni025D ; G 543 +U 606 ; WX 664 ; N uni025E ; G 544 +U 607 ; WX 278 ; N uni025F ; G 545 +U 608 ; WX 696 ; N uni0260 ; G 546 +U 609 ; WX 635 ; N uni0261 ; G 547 +U 610 ; WX 629 ; N uni0262 ; G 548 +U 611 ; WX 596 ; N uni0263 ; G 549 +U 612 ; WX 596 ; N uni0264 ; G 550 +U 613 ; WX 634 ; N uni0265 ; G 551 +U 614 ; WX 634 ; N uni0266 ; G 552 +U 615 ; WX 634 ; N uni0267 ; G 553 +U 616 ; WX 278 ; N uni0268 ; G 554 +U 617 ; WX 338 ; N uni0269 ; G 555 +U 618 ; WX 372 ; N uni026A ; G 556 +U 619 ; WX 396 ; N uni026B ; G 557 +U 620 ; WX 487 ; N uni026C ; G 558 +U 621 ; WX 278 ; N uni026D ; G 559 +U 622 ; WX 706 ; N uni026E ; G 560 +U 623 ; WX 974 ; N uni026F ; G 561 +U 624 ; WX 974 ; N uni0270 ; G 562 +U 625 ; WX 974 ; N uni0271 ; G 563 +U 626 ; WX 646 ; N uni0272 ; G 564 +U 627 ; WX 642 ; N uni0273 ; G 565 +U 628 ; WX 634 ; N uni0274 ; G 566 +U 629 ; WX 612 ; N uni0275 ; G 567 +U 630 ; WX 858 ; N uni0276 ; G 568 +U 631 ; WX 728 ; N uni0277 ; G 569 +U 632 ; WX 660 ; N uni0278 ; G 570 +U 633 ; WX 414 ; N uni0279 ; G 571 +U 634 ; WX 414 ; N uni027A ; G 572 +U 635 ; WX 414 ; N uni027B ; G 573 +U 636 ; WX 411 ; N uni027C ; G 574 +U 637 ; WX 411 ; N uni027D ; G 575 +U 638 ; WX 530 ; N uni027E ; G 576 +U 639 ; WX 530 ; N uni027F ; G 577 +U 640 ; WX 604 ; N uni0280 ; G 578 +U 641 ; WX 604 ; N uni0281 ; G 579 +U 642 ; WX 521 ; N uni0282 ; G 580 +U 643 ; WX 336 ; N uni0283 ; G 581 +U 644 ; WX 336 ; N uni0284 ; G 582 +U 645 ; WX 461 ; N uni0285 ; G 583 +U 646 ; WX 336 ; N uni0286 ; G 584 +U 647 ; WX 392 ; N uni0287 ; G 585 +U 648 ; WX 392 ; N uni0288 ; G 586 +U 649 ; WX 634 ; N uni0289 ; G 587 +U 650 ; WX 618 ; N uni028A ; G 588 +U 651 ; WX 598 ; N uni028B ; G 589 +U 652 ; WX 592 ; N uni028C ; G 590 +U 653 ; WX 818 ; N uni028D ; G 591 +U 654 ; WX 592 ; N uni028E ; G 592 +U 655 ; WX 611 ; N uni028F ; G 593 +U 656 ; WX 525 ; N uni0290 ; G 594 +U 657 ; WX 525 ; N uni0291 ; G 595 +U 658 ; WX 578 ; N uni0292 ; G 596 +U 659 ; WX 578 ; N uni0293 ; G 597 +U 660 ; WX 510 ; N uni0294 ; G 598 +U 661 ; WX 510 ; N uni0295 ; G 599 +U 662 ; WX 510 ; N uni0296 ; G 600 +U 663 ; WX 510 ; N uni0297 ; G 601 +U 664 ; WX 787 ; N uni0298 ; G 602 +U 665 ; WX 580 ; N uni0299 ; G 603 +U 666 ; WX 664 ; N uni029A ; G 604 +U 667 ; WX 708 ; N uni029B ; G 605 +U 668 ; WX 654 ; N uni029C ; G 606 +U 669 ; WX 292 ; N uni029D ; G 607 +U 670 ; WX 667 ; N uni029E ; G 608 +U 671 ; WX 507 ; N uni029F ; G 609 +U 672 ; WX 727 ; N uni02A0 ; G 610 +U 673 ; WX 510 ; N uni02A1 ; G 611 +U 674 ; WX 510 ; N uni02A2 ; G 612 +U 675 ; WX 1014 ; N uni02A3 ; G 613 +U 676 ; WX 1058 ; N uni02A4 ; G 614 +U 677 ; WX 1013 ; N uni02A5 ; G 615 +U 678 ; WX 830 ; N uni02A6 ; G 616 +U 679 ; WX 610 ; N uni02A7 ; G 617 +U 680 ; WX 778 ; N uni02A8 ; G 618 +U 681 ; WX 848 ; N uni02A9 ; G 619 +U 682 ; WX 706 ; N uni02AA ; G 620 +U 683 ; WX 654 ; N uni02AB ; G 621 +U 684 ; WX 515 ; N uni02AC ; G 622 +U 685 ; WX 515 ; N uni02AD ; G 623 +U 686 ; WX 661 ; N uni02AE ; G 624 +U 687 ; WX 664 ; N uni02AF ; G 625 +U 688 ; WX 404 ; N uni02B0 ; G 626 +U 689 ; WX 399 ; N uni02B1 ; G 627 +U 690 ; WX 175 ; N uni02B2 ; G 628 +U 691 ; WX 259 ; N uni02B3 ; G 629 +U 692 ; WX 295 ; N uni02B4 ; G 630 +U 693 ; WX 296 ; N uni02B5 ; G 631 +U 694 ; WX 379 ; N uni02B6 ; G 632 +U 695 ; WX 515 ; N uni02B7 ; G 633 +U 696 ; WX 373 ; N uni02B8 ; G 634 +U 697 ; WX 278 ; N uni02B9 ; G 635 +U 698 ; WX 460 ; N uni02BA ; G 636 +U 699 ; WX 318 ; N uni02BB ; G 637 +U 700 ; WX 318 ; N uni02BC ; G 638 +U 701 ; WX 318 ; N uni02BD ; G 639 +U 702 ; WX 307 ; N uni02BE ; G 640 +U 703 ; WX 307 ; N uni02BF ; G 641 +U 704 ; WX 370 ; N uni02C0 ; G 642 +U 705 ; WX 370 ; N uni02C1 ; G 643 +U 706 ; WX 500 ; N uni02C2 ; G 644 +U 707 ; WX 500 ; N uni02C3 ; G 645 +U 708 ; WX 500 ; N uni02C4 ; G 646 +U 709 ; WX 500 ; N uni02C5 ; G 647 +U 710 ; WX 500 ; N circumflex ; G 648 +U 711 ; WX 500 ; N caron ; G 649 +U 712 ; WX 275 ; N uni02C8 ; G 650 +U 713 ; WX 500 ; N uni02C9 ; G 651 +U 714 ; WX 500 ; N uni02CA ; G 652 +U 715 ; WX 500 ; N uni02CB ; G 653 +U 716 ; WX 275 ; N uni02CC ; G 654 +U 717 ; WX 500 ; N uni02CD ; G 655 +U 718 ; WX 500 ; N uni02CE ; G 656 +U 719 ; WX 500 ; N uni02CF ; G 657 +U 720 ; WX 337 ; N uni02D0 ; G 658 +U 721 ; WX 337 ; N uni02D1 ; G 659 +U 722 ; WX 307 ; N uni02D2 ; G 660 +U 723 ; WX 307 ; N uni02D3 ; G 661 +U 724 ; WX 500 ; N uni02D4 ; G 662 +U 725 ; WX 500 ; N uni02D5 ; G 663 +U 726 ; WX 390 ; N uni02D6 ; G 664 +U 727 ; WX 317 ; N uni02D7 ; G 665 +U 728 ; WX 500 ; N breve ; G 666 +U 729 ; WX 500 ; N dotaccent ; G 667 +U 730 ; WX 500 ; N ring ; G 668 +U 731 ; WX 500 ; N ogonek ; G 669 +U 732 ; WX 500 ; N tilde ; G 670 +U 733 ; WX 500 ; N hungarumlaut ; G 671 +U 734 ; WX 315 ; N uni02DE ; G 672 +U 735 ; WX 500 ; N uni02DF ; G 673 +U 736 ; WX 426 ; N uni02E0 ; G 674 +U 737 ; WX 166 ; N uni02E1 ; G 675 +U 738 ; WX 373 ; N uni02E2 ; G 676 +U 739 ; WX 444 ; N uni02E3 ; G 677 +U 740 ; WX 370 ; N uni02E4 ; G 678 +U 741 ; WX 493 ; N uni02E5 ; G 679 +U 742 ; WX 493 ; N uni02E6 ; G 680 +U 743 ; WX 493 ; N uni02E7 ; G 681 +U 744 ; WX 493 ; N uni02E8 ; G 682 +U 745 ; WX 493 ; N uni02E9 ; G 683 +U 748 ; WX 500 ; N uni02EC ; G 684 +U 749 ; WX 500 ; N uni02ED ; G 685 +U 750 ; WX 518 ; N uni02EE ; G 686 +U 755 ; WX 500 ; N uni02F3 ; G 687 +U 759 ; WX 500 ; N uni02F7 ; G 688 +U 768 ; WX 0 ; N gravecomb ; G 689 +U 769 ; WX 0 ; N acutecomb ; G 690 +U 770 ; WX 0 ; N uni0302 ; G 691 +U 771 ; WX 0 ; N tildecomb ; G 692 +U 772 ; WX 0 ; N uni0304 ; G 693 +U 773 ; WX 0 ; N uni0305 ; G 694 +U 774 ; WX 0 ; N uni0306 ; G 695 +U 775 ; WX 0 ; N uni0307 ; G 696 +U 776 ; WX 0 ; N uni0308 ; G 697 +U 777 ; WX 0 ; N hookabovecomb ; G 698 +U 778 ; WX 0 ; N uni030A ; G 699 +U 779 ; WX 0 ; N uni030B ; G 700 +U 780 ; WX 0 ; N uni030C ; G 701 +U 781 ; WX 0 ; N uni030D ; G 702 +U 782 ; WX 0 ; N uni030E ; G 703 +U 783 ; WX 0 ; N uni030F ; G 704 +U 784 ; WX 0 ; N uni0310 ; G 705 +U 785 ; WX 0 ; N uni0311 ; G 706 +U 786 ; WX 0 ; N uni0312 ; G 707 +U 787 ; WX 0 ; N uni0313 ; G 708 +U 788 ; WX 0 ; N uni0314 ; G 709 +U 789 ; WX 0 ; N uni0315 ; G 710 +U 790 ; WX 0 ; N uni0316 ; G 711 +U 791 ; WX 0 ; N uni0317 ; G 712 +U 792 ; WX 0 ; N uni0318 ; G 713 +U 793 ; WX 0 ; N uni0319 ; G 714 +U 794 ; WX 0 ; N uni031A ; G 715 +U 795 ; WX 0 ; N uni031B ; G 716 +U 796 ; WX 0 ; N uni031C ; G 717 +U 797 ; WX 0 ; N uni031D ; G 718 +U 798 ; WX 0 ; N uni031E ; G 719 +U 799 ; WX 0 ; N uni031F ; G 720 +U 800 ; WX 0 ; N uni0320 ; G 721 +U 801 ; WX 0 ; N uni0321 ; G 722 +U 802 ; WX 0 ; N uni0322 ; G 723 +U 803 ; WX 0 ; N dotbelowcomb ; G 724 +U 804 ; WX 0 ; N uni0324 ; G 725 +U 805 ; WX 0 ; N uni0325 ; G 726 +U 806 ; WX 0 ; N uni0326 ; G 727 +U 807 ; WX 0 ; N uni0327 ; G 728 +U 808 ; WX 0 ; N uni0328 ; G 729 +U 809 ; WX 0 ; N uni0329 ; G 730 +U 810 ; WX 0 ; N uni032A ; G 731 +U 811 ; WX 0 ; N uni032B ; G 732 +U 812 ; WX 0 ; N uni032C ; G 733 +U 813 ; WX 0 ; N uni032D ; G 734 +U 814 ; WX 0 ; N uni032E ; G 735 +U 815 ; WX 0 ; N uni032F ; G 736 +U 816 ; WX 0 ; N uni0330 ; G 737 +U 817 ; WX 0 ; N uni0331 ; G 738 +U 818 ; WX 0 ; N uni0332 ; G 739 +U 819 ; WX 0 ; N uni0333 ; G 740 +U 820 ; WX 0 ; N uni0334 ; G 741 +U 821 ; WX 0 ; N uni0335 ; G 742 +U 822 ; WX 0 ; N uni0336 ; G 743 +U 823 ; WX 0 ; N uni0337 ; G 744 +U 824 ; WX 0 ; N uni0338 ; G 745 +U 825 ; WX 0 ; N uni0339 ; G 746 +U 826 ; WX 0 ; N uni033A ; G 747 +U 827 ; WX 0 ; N uni033B ; G 748 +U 828 ; WX 0 ; N uni033C ; G 749 +U 829 ; WX 0 ; N uni033D ; G 750 +U 830 ; WX 0 ; N uni033E ; G 751 +U 831 ; WX 0 ; N uni033F ; G 752 +U 832 ; WX 0 ; N uni0340 ; G 753 +U 833 ; WX 0 ; N uni0341 ; G 754 +U 834 ; WX 0 ; N uni0342 ; G 755 +U 835 ; WX 0 ; N uni0343 ; G 756 +U 836 ; WX 0 ; N uni0344 ; G 757 +U 837 ; WX 0 ; N uni0345 ; G 758 +U 838 ; WX 0 ; N uni0346 ; G 759 +U 839 ; WX 0 ; N uni0347 ; G 760 +U 840 ; WX 0 ; N uni0348 ; G 761 +U 841 ; WX 0 ; N uni0349 ; G 762 +U 842 ; WX 0 ; N uni034A ; G 763 +U 843 ; WX 0 ; N uni034B ; G 764 +U 844 ; WX 0 ; N uni034C ; G 765 +U 845 ; WX 0 ; N uni034D ; G 766 +U 846 ; WX 0 ; N uni034E ; G 767 +U 847 ; WX 0 ; N uni034F ; G 768 +U 849 ; WX 0 ; N uni0351 ; G 769 +U 850 ; WX 0 ; N uni0352 ; G 770 +U 851 ; WX 0 ; N uni0353 ; G 771 +U 855 ; WX 0 ; N uni0357 ; G 772 +U 856 ; WX 0 ; N uni0358 ; G 773 +U 858 ; WX 0 ; N uni035A ; G 774 +U 860 ; WX 0 ; N uni035C ; G 775 +U 861 ; WX 0 ; N uni035D ; G 776 +U 862 ; WX 0 ; N uni035E ; G 777 +U 863 ; WX 0 ; N uni035F ; G 778 +U 864 ; WX 0 ; N uni0360 ; G 779 +U 865 ; WX 0 ; N uni0361 ; G 780 +U 866 ; WX 0 ; N uni0362 ; G 781 +U 880 ; WX 654 ; N uni0370 ; G 782 +U 881 ; WX 568 ; N uni0371 ; G 783 +U 882 ; WX 862 ; N uni0372 ; G 784 +U 883 ; WX 647 ; N uni0373 ; G 785 +U 884 ; WX 278 ; N uni0374 ; G 786 +U 885 ; WX 278 ; N uni0375 ; G 787 +U 886 ; WX 748 ; N uni0376 ; G 788 +U 887 ; WX 650 ; N uni0377 ; G 789 +U 890 ; WX 500 ; N uni037A ; G 790 +U 891 ; WX 549 ; N uni037B ; G 791 +U 892 ; WX 550 ; N uni037C ; G 792 +U 893 ; WX 549 ; N uni037D ; G 793 +U 894 ; WX 337 ; N uni037E ; G 794 +U 895 ; WX 295 ; N uni037F ; G 795 +U 900 ; WX 500 ; N tonos ; G 796 +U 901 ; WX 500 ; N dieresistonos ; G 797 +U 902 ; WX 692 ; N Alphatonos ; G 798 +U 903 ; WX 318 ; N anoteleia ; G 799 +U 904 ; WX 746 ; N Epsilontonos ; G 800 +U 905 ; WX 871 ; N Etatonos ; G 801 +U 906 ; WX 408 ; N Iotatonos ; G 802 +U 908 ; WX 813 ; N Omicrontonos ; G 803 +U 910 ; WX 825 ; N Upsilontonos ; G 804 +U 911 ; WX 826 ; N Omegatonos ; G 805 +U 912 ; WX 338 ; N iotadieresistonos ; G 806 +U 913 ; WX 684 ; N Alpha ; G 807 +U 914 ; WX 686 ; N Beta ; G 808 +U 915 ; WX 557 ; N Gamma ; G 809 +U 916 ; WX 684 ; N uni0394 ; G 810 +U 917 ; WX 632 ; N Epsilon ; G 811 +U 918 ; WX 685 ; N Zeta ; G 812 +U 919 ; WX 752 ; N Eta ; G 813 +U 920 ; WX 787 ; N Theta ; G 814 +U 921 ; WX 295 ; N Iota ; G 815 +U 922 ; WX 656 ; N Kappa ; G 816 +U 923 ; WX 684 ; N Lambda ; G 817 +U 924 ; WX 863 ; N Mu ; G 818 +U 925 ; WX 748 ; N Nu ; G 819 +U 926 ; WX 632 ; N Xi ; G 820 +U 927 ; WX 787 ; N Omicron ; G 821 +U 928 ; WX 752 ; N Pi ; G 822 +U 929 ; WX 603 ; N Rho ; G 823 +U 931 ; WX 632 ; N Sigma ; G 824 +U 932 ; WX 611 ; N Tau ; G 825 +U 933 ; WX 611 ; N Upsilon ; G 826 +U 934 ; WX 787 ; N Phi ; G 827 +U 935 ; WX 685 ; N Chi ; G 828 +U 936 ; WX 787 ; N Psi ; G 829 +U 937 ; WX 764 ; N Omega ; G 830 +U 938 ; WX 295 ; N Iotadieresis ; G 831 +U 939 ; WX 611 ; N Upsilondieresis ; G 832 +U 940 ; WX 659 ; N alphatonos ; G 833 +U 941 ; WX 541 ; N epsilontonos ; G 834 +U 942 ; WX 634 ; N etatonos ; G 835 +U 943 ; WX 338 ; N iotatonos ; G 836 +U 944 ; WX 579 ; N upsilondieresistonos ; G 837 +U 945 ; WX 659 ; N alpha ; G 838 +U 946 ; WX 638 ; N beta ; G 839 +U 947 ; WX 592 ; N gamma ; G 840 +U 948 ; WX 612 ; N delta ; G 841 +U 949 ; WX 541 ; N epsilon ; G 842 +U 950 ; WX 544 ; N zeta ; G 843 +U 951 ; WX 634 ; N eta ; G 844 +U 952 ; WX 612 ; N theta ; G 845 +U 953 ; WX 338 ; N iota ; G 846 +U 954 ; WX 589 ; N kappa ; G 847 +U 955 ; WX 592 ; N lambda ; G 848 +U 956 ; WX 636 ; N uni03BC ; G 849 +U 957 ; WX 559 ; N nu ; G 850 +U 958 ; WX 558 ; N xi ; G 851 +U 959 ; WX 612 ; N omicron ; G 852 +U 960 ; WX 602 ; N pi ; G 853 +U 961 ; WX 635 ; N rho ; G 854 +U 962 ; WX 587 ; N sigma1 ; G 855 +U 963 ; WX 634 ; N sigma ; G 856 +U 964 ; WX 602 ; N tau ; G 857 +U 965 ; WX 579 ; N upsilon ; G 858 +U 966 ; WX 660 ; N phi ; G 859 +U 967 ; WX 578 ; N chi ; G 860 +U 968 ; WX 660 ; N psi ; G 861 +U 969 ; WX 837 ; N omega ; G 862 +U 970 ; WX 338 ; N iotadieresis ; G 863 +U 971 ; WX 579 ; N upsilondieresis ; G 864 +U 972 ; WX 612 ; N omicrontonos ; G 865 +U 973 ; WX 579 ; N upsilontonos ; G 866 +U 974 ; WX 837 ; N omegatonos ; G 867 +U 975 ; WX 656 ; N uni03CF ; G 868 +U 976 ; WX 614 ; N uni03D0 ; G 869 +U 977 ; WX 619 ; N theta1 ; G 870 +U 978 ; WX 699 ; N Upsilon1 ; G 871 +U 979 ; WX 842 ; N uni03D3 ; G 872 +U 980 ; WX 699 ; N uni03D4 ; G 873 +U 981 ; WX 660 ; N phi1 ; G 874 +U 982 ; WX 837 ; N omega1 ; G 875 +U 983 ; WX 664 ; N uni03D7 ; G 876 +U 984 ; WX 787 ; N uni03D8 ; G 877 +U 985 ; WX 612 ; N uni03D9 ; G 878 +U 986 ; WX 648 ; N uni03DA ; G 879 +U 987 ; WX 587 ; N uni03DB ; G 880 +U 988 ; WX 575 ; N uni03DC ; G 881 +U 989 ; WX 458 ; N uni03DD ; G 882 +U 990 ; WX 660 ; N uni03DE ; G 883 +U 991 ; WX 660 ; N uni03DF ; G 884 +U 992 ; WX 865 ; N uni03E0 ; G 885 +U 993 ; WX 627 ; N uni03E1 ; G 886 +U 994 ; WX 934 ; N uni03E2 ; G 887 +U 995 ; WX 837 ; N uni03E3 ; G 888 +U 996 ; WX 758 ; N uni03E4 ; G 889 +U 997 ; WX 659 ; N uni03E5 ; G 890 +U 998 ; WX 792 ; N uni03E6 ; G 891 +U 999 ; WX 615 ; N uni03E7 ; G 892 +U 1000 ; WX 687 ; N uni03E8 ; G 893 +U 1001 ; WX 607 ; N uni03E9 ; G 894 +U 1002 ; WX 768 ; N uni03EA ; G 895 +U 1003 ; WX 625 ; N uni03EB ; G 896 +U 1004 ; WX 699 ; N uni03EC ; G 897 +U 1005 ; WX 612 ; N uni03ED ; G 898 +U 1006 ; WX 611 ; N uni03EE ; G 899 +U 1007 ; WX 536 ; N uni03EF ; G 900 +U 1008 ; WX 664 ; N uni03F0 ; G 901 +U 1009 ; WX 635 ; N uni03F1 ; G 902 +U 1010 ; WX 550 ; N uni03F2 ; G 903 +U 1011 ; WX 278 ; N uni03F3 ; G 904 +U 1012 ; WX 787 ; N uni03F4 ; G 905 +U 1013 ; WX 615 ; N uni03F5 ; G 906 +U 1014 ; WX 615 ; N uni03F6 ; G 907 +U 1015 ; WX 605 ; N uni03F7 ; G 908 +U 1016 ; WX 635 ; N uni03F8 ; G 909 +U 1017 ; WX 698 ; N uni03F9 ; G 910 +U 1018 ; WX 863 ; N uni03FA ; G 911 +U 1019 ; WX 651 ; N uni03FB ; G 912 +U 1020 ; WX 635 ; N uni03FC ; G 913 +U 1021 ; WX 703 ; N uni03FD ; G 914 +U 1022 ; WX 698 ; N uni03FE ; G 915 +U 1023 ; WX 703 ; N uni03FF ; G 916 +U 1024 ; WX 632 ; N uni0400 ; G 917 +U 1025 ; WX 632 ; N uni0401 ; G 918 +U 1026 ; WX 786 ; N uni0402 ; G 919 +U 1027 ; WX 610 ; N uni0403 ; G 920 +U 1028 ; WX 698 ; N uni0404 ; G 921 +U 1029 ; WX 635 ; N uni0405 ; G 922 +U 1030 ; WX 295 ; N uni0406 ; G 923 +U 1031 ; WX 295 ; N uni0407 ; G 924 +U 1032 ; WX 295 ; N uni0408 ; G 925 +U 1033 ; WX 1094 ; N uni0409 ; G 926 +U 1034 ; WX 1045 ; N uni040A ; G 927 +U 1035 ; WX 786 ; N uni040B ; G 928 +U 1036 ; WX 710 ; N uni040C ; G 929 +U 1037 ; WX 748 ; N uni040D ; G 930 +U 1038 ; WX 609 ; N uni040E ; G 931 +U 1039 ; WX 752 ; N uni040F ; G 932 +U 1040 ; WX 684 ; N uni0410 ; G 933 +U 1041 ; WX 686 ; N uni0411 ; G 934 +U 1042 ; WX 686 ; N uni0412 ; G 935 +U 1043 ; WX 610 ; N uni0413 ; G 936 +U 1044 ; WX 781 ; N uni0414 ; G 937 +U 1045 ; WX 632 ; N uni0415 ; G 938 +U 1046 ; WX 1077 ; N uni0416 ; G 939 +U 1047 ; WX 641 ; N uni0417 ; G 940 +U 1048 ; WX 748 ; N uni0418 ; G 941 +U 1049 ; WX 748 ; N uni0419 ; G 942 +U 1050 ; WX 710 ; N uni041A ; G 943 +U 1051 ; WX 752 ; N uni041B ; G 944 +U 1052 ; WX 863 ; N uni041C ; G 945 +U 1053 ; WX 752 ; N uni041D ; G 946 +U 1054 ; WX 787 ; N uni041E ; G 947 +U 1055 ; WX 752 ; N uni041F ; G 948 +U 1056 ; WX 603 ; N uni0420 ; G 949 +U 1057 ; WX 698 ; N uni0421 ; G 950 +U 1058 ; WX 611 ; N uni0422 ; G 951 +U 1059 ; WX 609 ; N uni0423 ; G 952 +U 1060 ; WX 861 ; N uni0424 ; G 953 +U 1061 ; WX 685 ; N uni0425 ; G 954 +U 1062 ; WX 776 ; N uni0426 ; G 955 +U 1063 ; WX 686 ; N uni0427 ; G 956 +U 1064 ; WX 1069 ; N uni0428 ; G 957 +U 1065 ; WX 1094 ; N uni0429 ; G 958 +U 1066 ; WX 833 ; N uni042A ; G 959 +U 1067 ; WX 882 ; N uni042B ; G 960 +U 1068 ; WX 686 ; N uni042C ; G 961 +U 1069 ; WX 698 ; N uni042D ; G 962 +U 1070 ; WX 1080 ; N uni042E ; G 963 +U 1071 ; WX 695 ; N uni042F ; G 964 +U 1072 ; WX 613 ; N uni0430 ; G 965 +U 1073 ; WX 617 ; N uni0431 ; G 966 +U 1074 ; WX 589 ; N uni0432 ; G 967 +U 1075 ; WX 525 ; N uni0433 ; G 968 +U 1076 ; WX 691 ; N uni0434 ; G 969 +U 1077 ; WX 615 ; N uni0435 ; G 970 +U 1078 ; WX 901 ; N uni0436 ; G 971 +U 1079 ; WX 532 ; N uni0437 ; G 972 +U 1080 ; WX 650 ; N uni0438 ; G 973 +U 1081 ; WX 650 ; N uni0439 ; G 974 +U 1082 ; WX 604 ; N uni043A ; G 975 +U 1083 ; WX 639 ; N uni043B ; G 976 +U 1084 ; WX 754 ; N uni043C ; G 977 +U 1085 ; WX 654 ; N uni043D ; G 978 +U 1086 ; WX 612 ; N uni043E ; G 979 +U 1087 ; WX 654 ; N uni043F ; G 980 +U 1088 ; WX 635 ; N uni0440 ; G 981 +U 1089 ; WX 550 ; N uni0441 ; G 982 +U 1090 ; WX 583 ; N uni0442 ; G 983 +U 1091 ; WX 592 ; N uni0443 ; G 984 +U 1092 ; WX 855 ; N uni0444 ; G 985 +U 1093 ; WX 592 ; N uni0445 ; G 986 +U 1094 ; WX 681 ; N uni0446 ; G 987 +U 1095 ; WX 591 ; N uni0447 ; G 988 +U 1096 ; WX 915 ; N uni0448 ; G 989 +U 1097 ; WX 942 ; N uni0449 ; G 990 +U 1098 ; WX 707 ; N uni044A ; G 991 +U 1099 ; WX 790 ; N uni044B ; G 992 +U 1100 ; WX 589 ; N uni044C ; G 993 +U 1101 ; WX 549 ; N uni044D ; G 994 +U 1102 ; WX 842 ; N uni044E ; G 995 +U 1103 ; WX 602 ; N uni044F ; G 996 +U 1104 ; WX 615 ; N uni0450 ; G 997 +U 1105 ; WX 615 ; N uni0451 ; G 998 +U 1106 ; WX 625 ; N uni0452 ; G 999 +U 1107 ; WX 525 ; N uni0453 ; G 1000 +U 1108 ; WX 549 ; N uni0454 ; G 1001 +U 1109 ; WX 521 ; N uni0455 ; G 1002 +U 1110 ; WX 278 ; N uni0456 ; G 1003 +U 1111 ; WX 278 ; N uni0457 ; G 1004 +U 1112 ; WX 278 ; N uni0458 ; G 1005 +U 1113 ; WX 902 ; N uni0459 ; G 1006 +U 1114 ; WX 898 ; N uni045A ; G 1007 +U 1115 ; WX 652 ; N uni045B ; G 1008 +U 1116 ; WX 604 ; N uni045C ; G 1009 +U 1117 ; WX 650 ; N uni045D ; G 1010 +U 1118 ; WX 592 ; N uni045E ; G 1011 +U 1119 ; WX 654 ; N uni045F ; G 1012 +U 1120 ; WX 934 ; N uni0460 ; G 1013 +U 1121 ; WX 837 ; N uni0461 ; G 1014 +U 1122 ; WX 771 ; N uni0462 ; G 1015 +U 1123 ; WX 672 ; N uni0463 ; G 1016 +U 1124 ; WX 942 ; N uni0464 ; G 1017 +U 1125 ; WX 749 ; N uni0465 ; G 1018 +U 1126 ; WX 879 ; N uni0466 ; G 1019 +U 1127 ; WX 783 ; N uni0467 ; G 1020 +U 1128 ; WX 1160 ; N uni0468 ; G 1021 +U 1129 ; WX 1001 ; N uni0469 ; G 1022 +U 1130 ; WX 787 ; N uni046A ; G 1023 +U 1131 ; WX 612 ; N uni046B ; G 1024 +U 1132 ; WX 1027 ; N uni046C ; G 1025 +U 1133 ; WX 824 ; N uni046D ; G 1026 +U 1134 ; WX 636 ; N uni046E ; G 1027 +U 1135 ; WX 541 ; N uni046F ; G 1028 +U 1136 ; WX 856 ; N uni0470 ; G 1029 +U 1137 ; WX 876 ; N uni0471 ; G 1030 +U 1138 ; WX 787 ; N uni0472 ; G 1031 +U 1139 ; WX 612 ; N uni0473 ; G 1032 +U 1140 ; WX 781 ; N uni0474 ; G 1033 +U 1141 ; WX 665 ; N uni0475 ; G 1034 +U 1142 ; WX 781 ; N uni0476 ; G 1035 +U 1143 ; WX 665 ; N uni0477 ; G 1036 +U 1144 ; WX 992 ; N uni0478 ; G 1037 +U 1145 ; WX 904 ; N uni0479 ; G 1038 +U 1146 ; WX 953 ; N uni047A ; G 1039 +U 1147 ; WX 758 ; N uni047B ; G 1040 +U 1148 ; WX 1180 ; N uni047C ; G 1041 +U 1149 ; WX 1028 ; N uni047D ; G 1042 +U 1150 ; WX 934 ; N uni047E ; G 1043 +U 1151 ; WX 837 ; N uni047F ; G 1044 +U 1152 ; WX 698 ; N uni0480 ; G 1045 +U 1153 ; WX 550 ; N uni0481 ; G 1046 +U 1154 ; WX 502 ; N uni0482 ; G 1047 +U 1155 ; WX 0 ; N uni0483 ; G 1048 +U 1156 ; WX 0 ; N uni0484 ; G 1049 +U 1157 ; WX 0 ; N uni0485 ; G 1050 +U 1158 ; WX 0 ; N uni0486 ; G 1051 +U 1159 ; WX 0 ; N uni0487 ; G 1052 +U 1160 ; WX 418 ; N uni0488 ; G 1053 +U 1161 ; WX 418 ; N uni0489 ; G 1054 +U 1162 ; WX 772 ; N uni048A ; G 1055 +U 1163 ; WX 677 ; N uni048B ; G 1056 +U 1164 ; WX 686 ; N uni048C ; G 1057 +U 1165 ; WX 589 ; N uni048D ; G 1058 +U 1166 ; WX 603 ; N uni048E ; G 1059 +U 1167 ; WX 635 ; N uni048F ; G 1060 +U 1168 ; WX 610 ; N uni0490 ; G 1061 +U 1169 ; WX 525 ; N uni0491 ; G 1062 +U 1170 ; WX 675 ; N uni0492 ; G 1063 +U 1171 ; WX 590 ; N uni0493 ; G 1064 +U 1172 ; WX 624 ; N uni0494 ; G 1065 +U 1173 ; WX 530 ; N uni0495 ; G 1066 +U 1174 ; WX 1077 ; N uni0496 ; G 1067 +U 1175 ; WX 901 ; N uni0497 ; G 1068 +U 1176 ; WX 641 ; N uni0498 ; G 1069 +U 1177 ; WX 532 ; N uni0499 ; G 1070 +U 1178 ; WX 710 ; N uni049A ; G 1071 +U 1179 ; WX 604 ; N uni049B ; G 1072 +U 1180 ; WX 710 ; N uni049C ; G 1073 +U 1181 ; WX 604 ; N uni049D ; G 1074 +U 1182 ; WX 710 ; N uni049E ; G 1075 +U 1183 ; WX 604 ; N uni049F ; G 1076 +U 1184 ; WX 856 ; N uni04A0 ; G 1077 +U 1185 ; WX 832 ; N uni04A1 ; G 1078 +U 1186 ; WX 752 ; N uni04A2 ; G 1079 +U 1187 ; WX 661 ; N uni04A3 ; G 1080 +U 1188 ; WX 1014 ; N uni04A4 ; G 1081 +U 1189 ; WX 877 ; N uni04A5 ; G 1082 +U 1190 ; WX 1081 ; N uni04A6 ; G 1083 +U 1191 ; WX 916 ; N uni04A7 ; G 1084 +U 1192 ; WX 878 ; N uni04A8 ; G 1085 +U 1193 ; WX 693 ; N uni04A9 ; G 1086 +U 1194 ; WX 698 ; N uni04AA ; G 1087 +U 1195 ; WX 550 ; N uni04AB ; G 1088 +U 1196 ; WX 611 ; N uni04AC ; G 1089 +U 1197 ; WX 583 ; N uni04AD ; G 1090 +U 1198 ; WX 611 ; N uni04AE ; G 1091 +U 1199 ; WX 592 ; N uni04AF ; G 1092 +U 1200 ; WX 611 ; N uni04B0 ; G 1093 +U 1201 ; WX 592 ; N uni04B1 ; G 1094 +U 1202 ; WX 685 ; N uni04B2 ; G 1095 +U 1203 ; WX 592 ; N uni04B3 ; G 1096 +U 1204 ; WX 934 ; N uni04B4 ; G 1097 +U 1205 ; WX 807 ; N uni04B5 ; G 1098 +U 1206 ; WX 686 ; N uni04B6 ; G 1099 +U 1207 ; WX 591 ; N uni04B7 ; G 1100 +U 1208 ; WX 686 ; N uni04B8 ; G 1101 +U 1209 ; WX 591 ; N uni04B9 ; G 1102 +U 1210 ; WX 686 ; N uni04BA ; G 1103 +U 1211 ; WX 634 ; N uni04BB ; G 1104 +U 1212 ; WX 941 ; N uni04BC ; G 1105 +U 1213 ; WX 728 ; N uni04BD ; G 1106 +U 1214 ; WX 941 ; N uni04BE ; G 1107 +U 1215 ; WX 728 ; N uni04BF ; G 1108 +U 1216 ; WX 295 ; N uni04C0 ; G 1109 +U 1217 ; WX 1077 ; N uni04C1 ; G 1110 +U 1218 ; WX 901 ; N uni04C2 ; G 1111 +U 1219 ; WX 656 ; N uni04C3 ; G 1112 +U 1220 ; WX 604 ; N uni04C4 ; G 1113 +U 1221 ; WX 776 ; N uni04C5 ; G 1114 +U 1222 ; WX 670 ; N uni04C6 ; G 1115 +U 1223 ; WX 752 ; N uni04C7 ; G 1116 +U 1224 ; WX 661 ; N uni04C8 ; G 1117 +U 1225 ; WX 776 ; N uni04C9 ; G 1118 +U 1226 ; WX 681 ; N uni04CA ; G 1119 +U 1227 ; WX 686 ; N uni04CB ; G 1120 +U 1228 ; WX 591 ; N uni04CC ; G 1121 +U 1229 ; WX 888 ; N uni04CD ; G 1122 +U 1230 ; WX 774 ; N uni04CE ; G 1123 +U 1231 ; WX 278 ; N uni04CF ; G 1124 +U 1232 ; WX 684 ; N uni04D0 ; G 1125 +U 1233 ; WX 613 ; N uni04D1 ; G 1126 +U 1234 ; WX 684 ; N uni04D2 ; G 1127 +U 1235 ; WX 613 ; N uni04D3 ; G 1128 +U 1236 ; WX 974 ; N uni04D4 ; G 1129 +U 1237 ; WX 982 ; N uni04D5 ; G 1130 +U 1238 ; WX 632 ; N uni04D6 ; G 1131 +U 1239 ; WX 615 ; N uni04D7 ; G 1132 +U 1240 ; WX 787 ; N uni04D8 ; G 1133 +U 1241 ; WX 615 ; N uni04D9 ; G 1134 +U 1242 ; WX 787 ; N uni04DA ; G 1135 +U 1243 ; WX 615 ; N uni04DB ; G 1136 +U 1244 ; WX 1077 ; N uni04DC ; G 1137 +U 1245 ; WX 901 ; N uni04DD ; G 1138 +U 1246 ; WX 641 ; N uni04DE ; G 1139 +U 1247 ; WX 532 ; N uni04DF ; G 1140 +U 1248 ; WX 666 ; N uni04E0 ; G 1141 +U 1249 ; WX 578 ; N uni04E1 ; G 1142 +U 1250 ; WX 748 ; N uni04E2 ; G 1143 +U 1251 ; WX 650 ; N uni04E3 ; G 1144 +U 1252 ; WX 748 ; N uni04E4 ; G 1145 +U 1253 ; WX 650 ; N uni04E5 ; G 1146 +U 1254 ; WX 787 ; N uni04E6 ; G 1147 +U 1255 ; WX 612 ; N uni04E7 ; G 1148 +U 1256 ; WX 787 ; N uni04E8 ; G 1149 +U 1257 ; WX 612 ; N uni04E9 ; G 1150 +U 1258 ; WX 787 ; N uni04EA ; G 1151 +U 1259 ; WX 612 ; N uni04EB ; G 1152 +U 1260 ; WX 698 ; N uni04EC ; G 1153 +U 1261 ; WX 549 ; N uni04ED ; G 1154 +U 1262 ; WX 609 ; N uni04EE ; G 1155 +U 1263 ; WX 592 ; N uni04EF ; G 1156 +U 1264 ; WX 609 ; N uni04F0 ; G 1157 +U 1265 ; WX 592 ; N uni04F1 ; G 1158 +U 1266 ; WX 609 ; N uni04F2 ; G 1159 +U 1267 ; WX 592 ; N uni04F3 ; G 1160 +U 1268 ; WX 686 ; N uni04F4 ; G 1161 +U 1269 ; WX 591 ; N uni04F5 ; G 1162 +U 1270 ; WX 610 ; N uni04F6 ; G 1163 +U 1271 ; WX 525 ; N uni04F7 ; G 1164 +U 1272 ; WX 882 ; N uni04F8 ; G 1165 +U 1273 ; WX 790 ; N uni04F9 ; G 1166 +U 1274 ; WX 675 ; N uni04FA ; G 1167 +U 1275 ; WX 590 ; N uni04FB ; G 1168 +U 1276 ; WX 685 ; N uni04FC ; G 1169 +U 1277 ; WX 592 ; N uni04FD ; G 1170 +U 1278 ; WX 685 ; N uni04FE ; G 1171 +U 1279 ; WX 592 ; N uni04FF ; G 1172 +U 1280 ; WX 686 ; N uni0500 ; G 1173 +U 1281 ; WX 589 ; N uni0501 ; G 1174 +U 1282 ; WX 1006 ; N uni0502 ; G 1175 +U 1283 ; WX 897 ; N uni0503 ; G 1176 +U 1284 ; WX 975 ; N uni0504 ; G 1177 +U 1285 ; WX 869 ; N uni0505 ; G 1178 +U 1286 ; WX 679 ; N uni0506 ; G 1179 +U 1287 ; WX 588 ; N uni0507 ; G 1180 +U 1288 ; WX 1072 ; N uni0508 ; G 1181 +U 1289 ; WX 957 ; N uni0509 ; G 1182 +U 1290 ; WX 1113 ; N uni050A ; G 1183 +U 1291 ; WX 967 ; N uni050B ; G 1184 +U 1292 ; WX 775 ; N uni050C ; G 1185 +U 1293 ; WX 660 ; N uni050D ; G 1186 +U 1294 ; WX 773 ; N uni050E ; G 1187 +U 1295 ; WX 711 ; N uni050F ; G 1188 +U 1296 ; WX 614 ; N uni0510 ; G 1189 +U 1297 ; WX 541 ; N uni0511 ; G 1190 +U 1298 ; WX 752 ; N uni0512 ; G 1191 +U 1299 ; WX 639 ; N uni0513 ; G 1192 +U 1300 ; WX 1169 ; N uni0514 ; G 1193 +U 1301 ; WX 994 ; N uni0515 ; G 1194 +U 1302 ; WX 894 ; N uni0516 ; G 1195 +U 1303 ; WX 864 ; N uni0517 ; G 1196 +U 1304 ; WX 1032 ; N uni0518 ; G 1197 +U 1305 ; WX 986 ; N uni0519 ; G 1198 +U 1306 ; WX 787 ; N uni051A ; G 1199 +U 1307 ; WX 635 ; N uni051B ; G 1200 +U 1308 ; WX 989 ; N uni051C ; G 1201 +U 1309 ; WX 818 ; N uni051D ; G 1202 +U 1310 ; WX 710 ; N uni051E ; G 1203 +U 1311 ; WX 604 ; N uni051F ; G 1204 +U 1312 ; WX 1081 ; N uni0520 ; G 1205 +U 1313 ; WX 905 ; N uni0521 ; G 1206 +U 1314 ; WX 1081 ; N uni0522 ; G 1207 +U 1315 ; WX 912 ; N uni0523 ; G 1208 +U 1316 ; WX 793 ; N uni0524 ; G 1209 +U 1317 ; WX 683 ; N uni0525 ; G 1210 +U 1329 ; WX 766 ; N uni0531 ; G 1211 +U 1330 ; WX 732 ; N uni0532 ; G 1212 +U 1331 ; WX 753 ; N uni0533 ; G 1213 +U 1332 ; WX 753 ; N uni0534 ; G 1214 +U 1333 ; WX 732 ; N uni0535 ; G 1215 +U 1334 ; WX 772 ; N uni0536 ; G 1216 +U 1335 ; WX 640 ; N uni0537 ; G 1217 +U 1336 ; WX 732 ; N uni0538 ; G 1218 +U 1337 ; WX 859 ; N uni0539 ; G 1219 +U 1338 ; WX 753 ; N uni053A ; G 1220 +U 1339 ; WX 691 ; N uni053B ; G 1221 +U 1340 ; WX 533 ; N uni053C ; G 1222 +U 1341 ; WX 922 ; N uni053D ; G 1223 +U 1342 ; WX 863 ; N uni053E ; G 1224 +U 1343 ; WX 732 ; N uni053F ; G 1225 +U 1344 ; WX 716 ; N uni0540 ; G 1226 +U 1345 ; WX 766 ; N uni0541 ; G 1227 +U 1346 ; WX 753 ; N uni0542 ; G 1228 +U 1347 ; WX 767 ; N uni0543 ; G 1229 +U 1348 ; WX 792 ; N uni0544 ; G 1230 +U 1349 ; WX 728 ; N uni0545 ; G 1231 +U 1350 ; WX 729 ; N uni0546 ; G 1232 +U 1351 ; WX 757 ; N uni0547 ; G 1233 +U 1352 ; WX 732 ; N uni0548 ; G 1234 +U 1353 ; WX 713 ; N uni0549 ; G 1235 +U 1354 ; WX 800 ; N uni054A ; G 1236 +U 1355 ; WX 768 ; N uni054B ; G 1237 +U 1356 ; WX 792 ; N uni054C ; G 1238 +U 1357 ; WX 732 ; N uni054D ; G 1239 +U 1358 ; WX 753 ; N uni054E ; G 1240 +U 1359 ; WX 705 ; N uni054F ; G 1241 +U 1360 ; WX 694 ; N uni0550 ; G 1242 +U 1361 ; WX 744 ; N uni0551 ; G 1243 +U 1362 ; WX 538 ; N uni0552 ; G 1244 +U 1363 ; WX 811 ; N uni0553 ; G 1245 +U 1364 ; WX 757 ; N uni0554 ; G 1246 +U 1365 ; WX 787 ; N uni0555 ; G 1247 +U 1366 ; WX 790 ; N uni0556 ; G 1248 +U 1369 ; WX 307 ; N uni0559 ; G 1249 +U 1370 ; WX 318 ; N uni055A ; G 1250 +U 1371 ; WX 234 ; N uni055B ; G 1251 +U 1372 ; WX 361 ; N uni055C ; G 1252 +U 1373 ; WX 238 ; N uni055D ; G 1253 +U 1374 ; WX 405 ; N uni055E ; G 1254 +U 1375 ; WX 500 ; N uni055F ; G 1255 +U 1377 ; WX 974 ; N uni0561 ; G 1256 +U 1378 ; WX 634 ; N uni0562 ; G 1257 +U 1379 ; WX 658 ; N uni0563 ; G 1258 +U 1380 ; WX 663 ; N uni0564 ; G 1259 +U 1381 ; WX 634 ; N uni0565 ; G 1260 +U 1382 ; WX 635 ; N uni0566 ; G 1261 +U 1383 ; WX 515 ; N uni0567 ; G 1262 +U 1384 ; WX 634 ; N uni0568 ; G 1263 +U 1385 ; WX 738 ; N uni0569 ; G 1264 +U 1386 ; WX 658 ; N uni056A ; G 1265 +U 1387 ; WX 634 ; N uni056B ; G 1266 +U 1388 ; WX 271 ; N uni056C ; G 1267 +U 1389 ; WX 980 ; N uni056D ; G 1268 +U 1390 ; WX 623 ; N uni056E ; G 1269 +U 1391 ; WX 634 ; N uni056F ; G 1270 +U 1392 ; WX 634 ; N uni0570 ; G 1271 +U 1393 ; WX 608 ; N uni0571 ; G 1272 +U 1394 ; WX 634 ; N uni0572 ; G 1273 +U 1395 ; WX 629 ; N uni0573 ; G 1274 +U 1396 ; WX 634 ; N uni0574 ; G 1275 +U 1397 ; WX 271 ; N uni0575 ; G 1276 +U 1398 ; WX 634 ; N uni0576 ; G 1277 +U 1399 ; WX 499 ; N uni0577 ; G 1278 +U 1400 ; WX 634 ; N uni0578 ; G 1279 +U 1401 ; WX 404 ; N uni0579 ; G 1280 +U 1402 ; WX 974 ; N uni057A ; G 1281 +U 1403 ; WX 560 ; N uni057B ; G 1282 +U 1404 ; WX 648 ; N uni057C ; G 1283 +U 1405 ; WX 634 ; N uni057D ; G 1284 +U 1406 ; WX 634 ; N uni057E ; G 1285 +U 1407 ; WX 974 ; N uni057F ; G 1286 +U 1408 ; WX 634 ; N uni0580 ; G 1287 +U 1409 ; WX 633 ; N uni0581 ; G 1288 +U 1410 ; WX 435 ; N uni0582 ; G 1289 +U 1411 ; WX 974 ; N uni0583 ; G 1290 +U 1412 ; WX 636 ; N uni0584 ; G 1291 +U 1413 ; WX 609 ; N uni0585 ; G 1292 +U 1414 ; WX 805 ; N uni0586 ; G 1293 +U 1415 ; WX 812 ; N uni0587 ; G 1294 +U 1417 ; WX 337 ; N uni0589 ; G 1295 +U 1418 ; WX 361 ; N uni058A ; G 1296 +U 1456 ; WX 0 ; N uni05B0 ; G 1297 +U 1457 ; WX 0 ; N uni05B1 ; G 1298 +U 1458 ; WX 0 ; N uni05B2 ; G 1299 +U 1459 ; WX 0 ; N uni05B3 ; G 1300 +U 1460 ; WX 0 ; N uni05B4 ; G 1301 +U 1461 ; WX 0 ; N uni05B5 ; G 1302 +U 1462 ; WX 0 ; N uni05B6 ; G 1303 +U 1463 ; WX 0 ; N uni05B7 ; G 1304 +U 1464 ; WX 0 ; N uni05B8 ; G 1305 +U 1465 ; WX 0 ; N uni05B9 ; G 1306 +U 1466 ; WX 0 ; N uni05BA ; G 1307 +U 1467 ; WX 0 ; N uni05BB ; G 1308 +U 1468 ; WX 0 ; N uni05BC ; G 1309 +U 1469 ; WX 0 ; N uni05BD ; G 1310 +U 1470 ; WX 361 ; N uni05BE ; G 1311 +U 1471 ; WX 0 ; N uni05BF ; G 1312 +U 1472 ; WX 295 ; N uni05C0 ; G 1313 +U 1473 ; WX 0 ; N uni05C1 ; G 1314 +U 1474 ; WX 0 ; N uni05C2 ; G 1315 +U 1475 ; WX 295 ; N uni05C3 ; G 1316 +U 1478 ; WX 441 ; N uni05C6 ; G 1317 +U 1479 ; WX 0 ; N uni05C7 ; G 1318 +U 1488 ; WX 668 ; N uni05D0 ; G 1319 +U 1489 ; WX 578 ; N uni05D1 ; G 1320 +U 1490 ; WX 412 ; N uni05D2 ; G 1321 +U 1491 ; WX 546 ; N uni05D3 ; G 1322 +U 1492 ; WX 653 ; N uni05D4 ; G 1323 +U 1493 ; WX 272 ; N uni05D5 ; G 1324 +U 1494 ; WX 346 ; N uni05D6 ; G 1325 +U 1495 ; WX 653 ; N uni05D7 ; G 1326 +U 1496 ; WX 648 ; N uni05D8 ; G 1327 +U 1497 ; WX 224 ; N uni05D9 ; G 1328 +U 1498 ; WX 537 ; N uni05DA ; G 1329 +U 1499 ; WX 529 ; N uni05DB ; G 1330 +U 1500 ; WX 568 ; N uni05DC ; G 1331 +U 1501 ; WX 664 ; N uni05DD ; G 1332 +U 1502 ; WX 679 ; N uni05DE ; G 1333 +U 1503 ; WX 272 ; N uni05DF ; G 1334 +U 1504 ; WX 400 ; N uni05E0 ; G 1335 +U 1505 ; WX 649 ; N uni05E1 ; G 1336 +U 1506 ; WX 626 ; N uni05E2 ; G 1337 +U 1507 ; WX 640 ; N uni05E3 ; G 1338 +U 1508 ; WX 625 ; N uni05E4 ; G 1339 +U 1509 ; WX 540 ; N uni05E5 ; G 1340 +U 1510 ; WX 593 ; N uni05E6 ; G 1341 +U 1511 ; WX 709 ; N uni05E7 ; G 1342 +U 1512 ; WX 564 ; N uni05E8 ; G 1343 +U 1513 ; WX 708 ; N uni05E9 ; G 1344 +U 1514 ; WX 657 ; N uni05EA ; G 1345 +U 1520 ; WX 471 ; N uni05F0 ; G 1346 +U 1521 ; WX 423 ; N uni05F1 ; G 1347 +U 1522 ; WX 331 ; N uni05F2 ; G 1348 +U 1523 ; WX 416 ; N uni05F3 ; G 1349 +U 1524 ; WX 645 ; N uni05F4 ; G 1350 +U 1542 ; WX 637 ; N uni0606 ; G 1351 +U 1543 ; WX 637 ; N uni0607 ; G 1352 +U 1545 ; WX 757 ; N uni0609 ; G 1353 +U 1546 ; WX 977 ; N uni060A ; G 1354 +U 1548 ; WX 323 ; N uni060C ; G 1355 +U 1557 ; WX 0 ; N uni0615 ; G 1356 +U 1563 ; WX 318 ; N uni061B ; G 1357 +U 1567 ; WX 531 ; N uni061F ; G 1358 +U 1569 ; WX 470 ; N uni0621 ; G 1359 +U 1570 ; WX 278 ; N uni0622 ; G 1360 +U 1571 ; WX 278 ; N uni0623 ; G 1361 +U 1572 ; WX 483 ; N uni0624 ; G 1362 +U 1573 ; WX 278 ; N uni0625 ; G 1363 +U 1574 ; WX 783 ; N uni0626 ; G 1364 +U 1575 ; WX 278 ; N uni0627 ; G 1365 +U 1576 ; WX 941 ; N uni0628 ; G 1366 +U 1577 ; WX 524 ; N uni0629 ; G 1367 +U 1578 ; WX 941 ; N uni062A ; G 1368 +U 1579 ; WX 941 ; N uni062B ; G 1369 +U 1580 ; WX 646 ; N uni062C ; G 1370 +U 1581 ; WX 646 ; N uni062D ; G 1371 +U 1582 ; WX 646 ; N uni062E ; G 1372 +U 1583 ; WX 445 ; N uni062F ; G 1373 +U 1584 ; WX 445 ; N uni0630 ; G 1374 +U 1585 ; WX 483 ; N uni0631 ; G 1375 +U 1586 ; WX 483 ; N uni0632 ; G 1376 +U 1587 ; WX 1221 ; N uni0633 ; G 1377 +U 1588 ; WX 1221 ; N uni0634 ; G 1378 +U 1589 ; WX 1209 ; N uni0635 ; G 1379 +U 1590 ; WX 1209 ; N uni0636 ; G 1380 +U 1591 ; WX 925 ; N uni0637 ; G 1381 +U 1592 ; WX 925 ; N uni0638 ; G 1382 +U 1593 ; WX 597 ; N uni0639 ; G 1383 +U 1594 ; WX 597 ; N uni063A ; G 1384 +U 1600 ; WX 293 ; N uni0640 ; G 1385 +U 1601 ; WX 1037 ; N uni0641 ; G 1386 +U 1602 ; WX 776 ; N uni0642 ; G 1387 +U 1603 ; WX 824 ; N uni0643 ; G 1388 +U 1604 ; WX 727 ; N uni0644 ; G 1389 +U 1605 ; WX 619 ; N uni0645 ; G 1390 +U 1606 ; WX 734 ; N uni0646 ; G 1391 +U 1607 ; WX 524 ; N uni0647 ; G 1392 +U 1608 ; WX 483 ; N uni0648 ; G 1393 +U 1609 ; WX 783 ; N uni0649 ; G 1394 +U 1610 ; WX 783 ; N uni064A ; G 1395 +U 1611 ; WX 0 ; N uni064B ; G 1396 +U 1612 ; WX 0 ; N uni064C ; G 1397 +U 1613 ; WX 0 ; N uni064D ; G 1398 +U 1614 ; WX 0 ; N uni064E ; G 1399 +U 1615 ; WX 0 ; N uni064F ; G 1400 +U 1616 ; WX 0 ; N uni0650 ; G 1401 +U 1617 ; WX 0 ; N uni0651 ; G 1402 +U 1618 ; WX 0 ; N uni0652 ; G 1403 +U 1619 ; WX 0 ; N uni0653 ; G 1404 +U 1620 ; WX 0 ; N uni0654 ; G 1405 +U 1621 ; WX 0 ; N uni0655 ; G 1406 +U 1623 ; WX 0 ; N uni0657 ; G 1407 +U 1626 ; WX 500 ; N uni065A ; G 1408 +U 1632 ; WX 537 ; N uni0660 ; G 1409 +U 1633 ; WX 537 ; N uni0661 ; G 1410 +U 1634 ; WX 537 ; N uni0662 ; G 1411 +U 1635 ; WX 537 ; N uni0663 ; G 1412 +U 1636 ; WX 537 ; N uni0664 ; G 1413 +U 1637 ; WX 537 ; N uni0665 ; G 1414 +U 1638 ; WX 537 ; N uni0666 ; G 1415 +U 1639 ; WX 537 ; N uni0667 ; G 1416 +U 1640 ; WX 537 ; N uni0668 ; G 1417 +U 1641 ; WX 537 ; N uni0669 ; G 1418 +U 1642 ; WX 537 ; N uni066A ; G 1419 +U 1643 ; WX 325 ; N uni066B ; G 1420 +U 1644 ; WX 318 ; N uni066C ; G 1421 +U 1645 ; WX 545 ; N uni066D ; G 1422 +U 1646 ; WX 941 ; N uni066E ; G 1423 +U 1647 ; WX 776 ; N uni066F ; G 1424 +U 1648 ; WX 0 ; N uni0670 ; G 1425 +U 1652 ; WX 292 ; N uni0674 ; G 1426 +U 1657 ; WX 941 ; N uni0679 ; G 1427 +U 1658 ; WX 941 ; N uni067A ; G 1428 +U 1659 ; WX 941 ; N uni067B ; G 1429 +U 1660 ; WX 941 ; N uni067C ; G 1430 +U 1661 ; WX 941 ; N uni067D ; G 1431 +U 1662 ; WX 941 ; N uni067E ; G 1432 +U 1663 ; WX 941 ; N uni067F ; G 1433 +U 1664 ; WX 941 ; N uni0680 ; G 1434 +U 1665 ; WX 646 ; N uni0681 ; G 1435 +U 1666 ; WX 646 ; N uni0682 ; G 1436 +U 1667 ; WX 646 ; N uni0683 ; G 1437 +U 1668 ; WX 646 ; N uni0684 ; G 1438 +U 1669 ; WX 646 ; N uni0685 ; G 1439 +U 1670 ; WX 646 ; N uni0686 ; G 1440 +U 1671 ; WX 646 ; N uni0687 ; G 1441 +U 1672 ; WX 445 ; N uni0688 ; G 1442 +U 1673 ; WX 445 ; N uni0689 ; G 1443 +U 1674 ; WX 445 ; N uni068A ; G 1444 +U 1675 ; WX 445 ; N uni068B ; G 1445 +U 1676 ; WX 445 ; N uni068C ; G 1446 +U 1677 ; WX 445 ; N uni068D ; G 1447 +U 1678 ; WX 445 ; N uni068E ; G 1448 +U 1679 ; WX 445 ; N uni068F ; G 1449 +U 1680 ; WX 445 ; N uni0690 ; G 1450 +U 1681 ; WX 483 ; N uni0691 ; G 1451 +U 1682 ; WX 483 ; N uni0692 ; G 1452 +U 1683 ; WX 498 ; N uni0693 ; G 1453 +U 1684 ; WX 530 ; N uni0694 ; G 1454 +U 1685 ; WX 610 ; N uni0695 ; G 1455 +U 1686 ; WX 530 ; N uni0696 ; G 1456 +U 1687 ; WX 483 ; N uni0697 ; G 1457 +U 1688 ; WX 483 ; N uni0698 ; G 1458 +U 1689 ; WX 483 ; N uni0699 ; G 1459 +U 1690 ; WX 1221 ; N uni069A ; G 1460 +U 1691 ; WX 1221 ; N uni069B ; G 1461 +U 1692 ; WX 1221 ; N uni069C ; G 1462 +U 1693 ; WX 1209 ; N uni069D ; G 1463 +U 1694 ; WX 1209 ; N uni069E ; G 1464 +U 1695 ; WX 925 ; N uni069F ; G 1465 +U 1696 ; WX 597 ; N uni06A0 ; G 1466 +U 1697 ; WX 1037 ; N uni06A1 ; G 1467 +U 1698 ; WX 1037 ; N uni06A2 ; G 1468 +U 1699 ; WX 1037 ; N uni06A3 ; G 1469 +U 1700 ; WX 1037 ; N uni06A4 ; G 1470 +U 1701 ; WX 1037 ; N uni06A5 ; G 1471 +U 1702 ; WX 1037 ; N uni06A6 ; G 1472 +U 1703 ; WX 776 ; N uni06A7 ; G 1473 +U 1704 ; WX 776 ; N uni06A8 ; G 1474 +U 1705 ; WX 895 ; N uni06A9 ; G 1475 +U 1706 ; WX 1054 ; N uni06AA ; G 1476 +U 1707 ; WX 895 ; N uni06AB ; G 1477 +U 1708 ; WX 824 ; N uni06AC ; G 1478 +U 1709 ; WX 824 ; N uni06AD ; G 1479 +U 1710 ; WX 824 ; N uni06AE ; G 1480 +U 1711 ; WX 895 ; N uni06AF ; G 1481 +U 1712 ; WX 895 ; N uni06B0 ; G 1482 +U 1713 ; WX 895 ; N uni06B1 ; G 1483 +U 1714 ; WX 895 ; N uni06B2 ; G 1484 +U 1715 ; WX 895 ; N uni06B3 ; G 1485 +U 1716 ; WX 895 ; N uni06B4 ; G 1486 +U 1717 ; WX 727 ; N uni06B5 ; G 1487 +U 1718 ; WX 727 ; N uni06B6 ; G 1488 +U 1719 ; WX 727 ; N uni06B7 ; G 1489 +U 1720 ; WX 727 ; N uni06B8 ; G 1490 +U 1721 ; WX 734 ; N uni06B9 ; G 1491 +U 1722 ; WX 734 ; N uni06BA ; G 1492 +U 1723 ; WX 734 ; N uni06BB ; G 1493 +U 1724 ; WX 734 ; N uni06BC ; G 1494 +U 1725 ; WX 734 ; N uni06BD ; G 1495 +U 1726 ; WX 698 ; N uni06BE ; G 1496 +U 1727 ; WX 646 ; N uni06BF ; G 1497 +U 1734 ; WX 483 ; N uni06C6 ; G 1498 +U 1735 ; WX 483 ; N uni06C7 ; G 1499 +U 1736 ; WX 483 ; N uni06C8 ; G 1500 +U 1739 ; WX 483 ; N uni06CB ; G 1501 +U 1740 ; WX 783 ; N uni06CC ; G 1502 +U 1742 ; WX 783 ; N uni06CE ; G 1503 +U 1744 ; WX 783 ; N uni06D0 ; G 1504 +U 1749 ; WX 524 ; N uni06D5 ; G 1505 +U 1776 ; WX 537 ; N uni06F0 ; G 1506 +U 1777 ; WX 537 ; N uni06F1 ; G 1507 +U 1778 ; WX 537 ; N uni06F2 ; G 1508 +U 1779 ; WX 537 ; N uni06F3 ; G 1509 +U 1780 ; WX 537 ; N uni06F4 ; G 1510 +U 1781 ; WX 537 ; N uni06F5 ; G 1511 +U 1782 ; WX 537 ; N uni06F6 ; G 1512 +U 1783 ; WX 537 ; N uni06F7 ; G 1513 +U 1784 ; WX 537 ; N uni06F8 ; G 1514 +U 1785 ; WX 537 ; N uni06F9 ; G 1515 +U 1984 ; WX 636 ; N uni07C0 ; G 1516 +U 1985 ; WX 636 ; N uni07C1 ; G 1517 +U 1986 ; WX 636 ; N uni07C2 ; G 1518 +U 1987 ; WX 636 ; N uni07C3 ; G 1519 +U 1988 ; WX 636 ; N uni07C4 ; G 1520 +U 1989 ; WX 636 ; N uni07C5 ; G 1521 +U 1990 ; WX 636 ; N uni07C6 ; G 1522 +U 1991 ; WX 636 ; N uni07C7 ; G 1523 +U 1992 ; WX 636 ; N uni07C8 ; G 1524 +U 1993 ; WX 636 ; N uni07C9 ; G 1525 +U 1994 ; WX 278 ; N uni07CA ; G 1526 +U 1995 ; WX 571 ; N uni07CB ; G 1527 +U 1996 ; WX 424 ; N uni07CC ; G 1528 +U 1997 ; WX 592 ; N uni07CD ; G 1529 +U 1998 ; WX 654 ; N uni07CE ; G 1530 +U 1999 ; WX 654 ; N uni07CF ; G 1531 +U 2000 ; WX 594 ; N uni07D0 ; G 1532 +U 2001 ; WX 654 ; N uni07D1 ; G 1533 +U 2002 ; WX 829 ; N uni07D2 ; G 1534 +U 2003 ; WX 438 ; N uni07D3 ; G 1535 +U 2004 ; WX 438 ; N uni07D4 ; G 1536 +U 2005 ; WX 559 ; N uni07D5 ; G 1537 +U 2006 ; WX 612 ; N uni07D6 ; G 1538 +U 2007 ; WX 350 ; N uni07D7 ; G 1539 +U 2008 ; WX 959 ; N uni07D8 ; G 1540 +U 2009 ; WX 473 ; N uni07D9 ; G 1541 +U 2010 ; WX 783 ; N uni07DA ; G 1542 +U 2011 ; WX 654 ; N uni07DB ; G 1543 +U 2012 ; WX 625 ; N uni07DC ; G 1544 +U 2013 ; WX 734 ; N uni07DD ; G 1545 +U 2014 ; WX 530 ; N uni07DE ; G 1546 +U 2015 ; WX 724 ; N uni07DF ; G 1547 +U 2016 ; WX 473 ; N uni07E0 ; G 1548 +U 2017 ; WX 625 ; N uni07E1 ; G 1549 +U 2018 ; WX 594 ; N uni07E2 ; G 1550 +U 2019 ; WX 530 ; N uni07E3 ; G 1551 +U 2020 ; WX 530 ; N uni07E4 ; G 1552 +U 2021 ; WX 522 ; N uni07E5 ; G 1553 +U 2022 ; WX 594 ; N uni07E6 ; G 1554 +U 2023 ; WX 594 ; N uni07E7 ; G 1555 +U 2027 ; WX 0 ; N uni07EB ; G 1556 +U 2028 ; WX 0 ; N uni07EC ; G 1557 +U 2029 ; WX 0 ; N uni07ED ; G 1558 +U 2030 ; WX 0 ; N uni07EE ; G 1559 +U 2031 ; WX 0 ; N uni07EF ; G 1560 +U 2032 ; WX 0 ; N uni07F0 ; G 1561 +U 2033 ; WX 0 ; N uni07F1 ; G 1562 +U 2034 ; WX 0 ; N uni07F2 ; G 1563 +U 2035 ; WX 0 ; N uni07F3 ; G 1564 +U 2036 ; WX 313 ; N uni07F4 ; G 1565 +U 2037 ; WX 313 ; N uni07F5 ; G 1566 +U 2040 ; WX 560 ; N uni07F8 ; G 1567 +U 2041 ; WX 560 ; N uni07F9 ; G 1568 +U 2042 ; WX 361 ; N uni07FA ; G 1569 +U 3647 ; WX 636 ; N uni0E3F ; G 1570 +U 3713 ; WX 670 ; N uni0E81 ; G 1571 +U 3714 ; WX 684 ; N uni0E82 ; G 1572 +U 3716 ; WX 688 ; N uni0E84 ; G 1573 +U 3719 ; WX 482 ; N uni0E87 ; G 1574 +U 3720 ; WX 628 ; N uni0E88 ; G 1575 +U 3722 ; WX 684 ; N uni0E8A ; G 1576 +U 3725 ; WX 688 ; N uni0E8D ; G 1577 +U 3732 ; WX 669 ; N uni0E94 ; G 1578 +U 3733 ; WX 642 ; N uni0E95 ; G 1579 +U 3734 ; WX 645 ; N uni0E96 ; G 1580 +U 3735 ; WX 655 ; N uni0E97 ; G 1581 +U 3737 ; WX 659 ; N uni0E99 ; G 1582 +U 3738 ; WX 625 ; N uni0E9A ; G 1583 +U 3739 ; WX 625 ; N uni0E9B ; G 1584 +U 3740 ; WX 745 ; N uni0E9C ; G 1585 +U 3741 ; WX 767 ; N uni0E9D ; G 1586 +U 3742 ; WX 687 ; N uni0E9E ; G 1587 +U 3743 ; WX 687 ; N uni0E9F ; G 1588 +U 3745 ; WX 702 ; N uni0EA1 ; G 1589 +U 3746 ; WX 688 ; N uni0EA2 ; G 1590 +U 3747 ; WX 684 ; N uni0EA3 ; G 1591 +U 3749 ; WX 649 ; N uni0EA5 ; G 1592 +U 3751 ; WX 632 ; N uni0EA7 ; G 1593 +U 3754 ; WX 703 ; N uni0EAA ; G 1594 +U 3755 ; WX 819 ; N uni0EAB ; G 1595 +U 3757 ; WX 633 ; N uni0EAD ; G 1596 +U 3758 ; WX 684 ; N uni0EAE ; G 1597 +U 3759 ; WX 788 ; N uni0EAF ; G 1598 +U 3760 ; WX 632 ; N uni0EB0 ; G 1599 +U 3761 ; WX 0 ; N uni0EB1 ; G 1600 +U 3762 ; WX 539 ; N uni0EB2 ; G 1601 +U 3763 ; WX 539 ; N uni0EB3 ; G 1602 +U 3764 ; WX 0 ; N uni0EB4 ; G 1603 +U 3765 ; WX 0 ; N uni0EB5 ; G 1604 +U 3766 ; WX 0 ; N uni0EB6 ; G 1605 +U 3767 ; WX 0 ; N uni0EB7 ; G 1606 +U 3768 ; WX 0 ; N uni0EB8 ; G 1607 +U 3769 ; WX 0 ; N uni0EB9 ; G 1608 +U 3771 ; WX 0 ; N uni0EBB ; G 1609 +U 3772 ; WX 0 ; N uni0EBC ; G 1610 +U 3773 ; WX 663 ; N uni0EBD ; G 1611 +U 3776 ; WX 375 ; N uni0EC0 ; G 1612 +U 3777 ; WX 657 ; N uni0EC1 ; G 1613 +U 3778 ; WX 460 ; N uni0EC2 ; G 1614 +U 3779 ; WX 547 ; N uni0EC3 ; G 1615 +U 3780 ; WX 491 ; N uni0EC4 ; G 1616 +U 3782 ; WX 674 ; N uni0EC6 ; G 1617 +U 3784 ; WX 0 ; N uni0EC8 ; G 1618 +U 3785 ; WX 0 ; N uni0EC9 ; G 1619 +U 3786 ; WX 0 ; N uni0ECA ; G 1620 +U 3787 ; WX 0 ; N uni0ECB ; G 1621 +U 3788 ; WX 0 ; N uni0ECC ; G 1622 +U 3789 ; WX 0 ; N uni0ECD ; G 1623 +U 3792 ; WX 636 ; N uni0ED0 ; G 1624 +U 3793 ; WX 641 ; N uni0ED1 ; G 1625 +U 3794 ; WX 641 ; N uni0ED2 ; G 1626 +U 3795 ; WX 670 ; N uni0ED3 ; G 1627 +U 3796 ; WX 625 ; N uni0ED4 ; G 1628 +U 3797 ; WX 625 ; N uni0ED5 ; G 1629 +U 3798 ; WX 703 ; N uni0ED6 ; G 1630 +U 3799 ; WX 670 ; N uni0ED7 ; G 1631 +U 3800 ; WX 674 ; N uni0ED8 ; G 1632 +U 3801 ; WX 677 ; N uni0ED9 ; G 1633 +U 3804 ; WX 1028 ; N uni0EDC ; G 1634 +U 3805 ; WX 1028 ; N uni0EDD ; G 1635 +U 4256 ; WX 874 ; N uni10A0 ; G 1636 +U 4257 ; WX 733 ; N uni10A1 ; G 1637 +U 4258 ; WX 679 ; N uni10A2 ; G 1638 +U 4259 ; WX 834 ; N uni10A3 ; G 1639 +U 4260 ; WX 615 ; N uni10A4 ; G 1640 +U 4261 ; WX 768 ; N uni10A5 ; G 1641 +U 4262 ; WX 753 ; N uni10A6 ; G 1642 +U 4263 ; WX 914 ; N uni10A7 ; G 1643 +U 4264 ; WX 453 ; N uni10A8 ; G 1644 +U 4265 ; WX 620 ; N uni10A9 ; G 1645 +U 4266 ; WX 843 ; N uni10AA ; G 1646 +U 4267 ; WX 882 ; N uni10AB ; G 1647 +U 4268 ; WX 625 ; N uni10AC ; G 1648 +U 4269 ; WX 854 ; N uni10AD ; G 1649 +U 4270 ; WX 781 ; N uni10AE ; G 1650 +U 4271 ; WX 629 ; N uni10AF ; G 1651 +U 4272 ; WX 912 ; N uni10B0 ; G 1652 +U 4273 ; WX 621 ; N uni10B1 ; G 1653 +U 4274 ; WX 620 ; N uni10B2 ; G 1654 +U 4275 ; WX 854 ; N uni10B3 ; G 1655 +U 4276 ; WX 866 ; N uni10B4 ; G 1656 +U 4277 ; WX 724 ; N uni10B5 ; G 1657 +U 4278 ; WX 630 ; N uni10B6 ; G 1658 +U 4279 ; WX 621 ; N uni10B7 ; G 1659 +U 4280 ; WX 625 ; N uni10B8 ; G 1660 +U 4281 ; WX 620 ; N uni10B9 ; G 1661 +U 4282 ; WX 818 ; N uni10BA ; G 1662 +U 4283 ; WX 874 ; N uni10BB ; G 1663 +U 4284 ; WX 615 ; N uni10BC ; G 1664 +U 4285 ; WX 623 ; N uni10BD ; G 1665 +U 4286 ; WX 625 ; N uni10BE ; G 1666 +U 4287 ; WX 725 ; N uni10BF ; G 1667 +U 4288 ; WX 844 ; N uni10C0 ; G 1668 +U 4289 ; WX 596 ; N uni10C1 ; G 1669 +U 4290 ; WX 688 ; N uni10C2 ; G 1670 +U 4291 ; WX 596 ; N uni10C3 ; G 1671 +U 4292 ; WX 594 ; N uni10C4 ; G 1672 +U 4293 ; WX 738 ; N uni10C5 ; G 1673 +U 4304 ; WX 508 ; N uni10D0 ; G 1674 +U 4305 ; WX 518 ; N uni10D1 ; G 1675 +U 4306 ; WX 581 ; N uni10D2 ; G 1676 +U 4307 ; WX 818 ; N uni10D3 ; G 1677 +U 4308 ; WX 508 ; N uni10D4 ; G 1678 +U 4309 ; WX 513 ; N uni10D5 ; G 1679 +U 4310 ; WX 500 ; N uni10D6 ; G 1680 +U 4311 ; WX 801 ; N uni10D7 ; G 1681 +U 4312 ; WX 518 ; N uni10D8 ; G 1682 +U 4313 ; WX 510 ; N uni10D9 ; G 1683 +U 4314 ; WX 1064 ; N uni10DA ; G 1684 +U 4315 ; WX 522 ; N uni10DB ; G 1685 +U 4316 ; WX 522 ; N uni10DC ; G 1686 +U 4317 ; WX 786 ; N uni10DD ; G 1687 +U 4318 ; WX 508 ; N uni10DE ; G 1688 +U 4319 ; WX 518 ; N uni10DF ; G 1689 +U 4320 ; WX 796 ; N uni10E0 ; G 1690 +U 4321 ; WX 522 ; N uni10E1 ; G 1691 +U 4322 ; WX 654 ; N uni10E2 ; G 1692 +U 4323 ; WX 522 ; N uni10E3 ; G 1693 +U 4324 ; WX 825 ; N uni10E4 ; G 1694 +U 4325 ; WX 513 ; N uni10E5 ; G 1695 +U 4326 ; WX 786 ; N uni10E6 ; G 1696 +U 4327 ; WX 518 ; N uni10E7 ; G 1697 +U 4328 ; WX 518 ; N uni10E8 ; G 1698 +U 4329 ; WX 522 ; N uni10E9 ; G 1699 +U 4330 ; WX 571 ; N uni10EA ; G 1700 +U 4331 ; WX 522 ; N uni10EB ; G 1701 +U 4332 ; WX 518 ; N uni10EC ; G 1702 +U 4333 ; WX 520 ; N uni10ED ; G 1703 +U 4334 ; WX 522 ; N uni10EE ; G 1704 +U 4335 ; WX 454 ; N uni10EF ; G 1705 +U 4336 ; WX 508 ; N uni10F0 ; G 1706 +U 4337 ; WX 518 ; N uni10F1 ; G 1707 +U 4338 ; WX 508 ; N uni10F2 ; G 1708 +U 4339 ; WX 508 ; N uni10F3 ; G 1709 +U 4340 ; WX 518 ; N uni10F4 ; G 1710 +U 4341 ; WX 554 ; N uni10F5 ; G 1711 +U 4342 ; WX 828 ; N uni10F6 ; G 1712 +U 4343 ; WX 552 ; N uni10F7 ; G 1713 +U 4344 ; WX 508 ; N uni10F8 ; G 1714 +U 4345 ; WX 571 ; N uni10F9 ; G 1715 +U 4346 ; WX 508 ; N uni10FA ; G 1716 +U 4347 ; WX 448 ; N uni10FB ; G 1717 +U 4348 ; WX 324 ; N uni10FC ; G 1718 +U 5121 ; WX 684 ; N uni1401 ; G 1719 +U 5122 ; WX 684 ; N uni1402 ; G 1720 +U 5123 ; WX 684 ; N uni1403 ; G 1721 +U 5124 ; WX 684 ; N uni1404 ; G 1722 +U 5125 ; WX 769 ; N uni1405 ; G 1723 +U 5126 ; WX 769 ; N uni1406 ; G 1724 +U 5127 ; WX 769 ; N uni1407 ; G 1725 +U 5129 ; WX 769 ; N uni1409 ; G 1726 +U 5130 ; WX 769 ; N uni140A ; G 1727 +U 5131 ; WX 769 ; N uni140B ; G 1728 +U 5132 ; WX 835 ; N uni140C ; G 1729 +U 5133 ; WX 834 ; N uni140D ; G 1730 +U 5134 ; WX 835 ; N uni140E ; G 1731 +U 5135 ; WX 834 ; N uni140F ; G 1732 +U 5136 ; WX 835 ; N uni1410 ; G 1733 +U 5137 ; WX 834 ; N uni1411 ; G 1734 +U 5138 ; WX 967 ; N uni1412 ; G 1735 +U 5139 ; WX 1007 ; N uni1413 ; G 1736 +U 5140 ; WX 967 ; N uni1414 ; G 1737 +U 5141 ; WX 1007 ; N uni1415 ; G 1738 +U 5142 ; WX 769 ; N uni1416 ; G 1739 +U 5143 ; WX 967 ; N uni1417 ; G 1740 +U 5144 ; WX 1007 ; N uni1418 ; G 1741 +U 5145 ; WX 967 ; N uni1419 ; G 1742 +U 5146 ; WX 1007 ; N uni141A ; G 1743 +U 5147 ; WX 769 ; N uni141B ; G 1744 +U 5149 ; WX 256 ; N uni141D ; G 1745 +U 5150 ; WX 543 ; N uni141E ; G 1746 +U 5151 ; WX 423 ; N uni141F ; G 1747 +U 5152 ; WX 423 ; N uni1420 ; G 1748 +U 5153 ; WX 389 ; N uni1421 ; G 1749 +U 5154 ; WX 389 ; N uni1422 ; G 1750 +U 5155 ; WX 393 ; N uni1423 ; G 1751 +U 5156 ; WX 389 ; N uni1424 ; G 1752 +U 5157 ; WX 466 ; N uni1425 ; G 1753 +U 5158 ; WX 385 ; N uni1426 ; G 1754 +U 5159 ; WX 256 ; N uni1427 ; G 1755 +U 5160 ; WX 389 ; N uni1428 ; G 1756 +U 5161 ; WX 389 ; N uni1429 ; G 1757 +U 5162 ; WX 389 ; N uni142A ; G 1758 +U 5163 ; WX 1090 ; N uni142B ; G 1759 +U 5164 ; WX 909 ; N uni142C ; G 1760 +U 5165 ; WX 953 ; N uni142D ; G 1761 +U 5166 ; WX 1117 ; N uni142E ; G 1762 +U 5167 ; WX 684 ; N uni142F ; G 1763 +U 5168 ; WX 684 ; N uni1430 ; G 1764 +U 5169 ; WX 684 ; N uni1431 ; G 1765 +U 5170 ; WX 684 ; N uni1432 ; G 1766 +U 5171 ; WX 729 ; N uni1433 ; G 1767 +U 5172 ; WX 729 ; N uni1434 ; G 1768 +U 5173 ; WX 729 ; N uni1435 ; G 1769 +U 5175 ; WX 729 ; N uni1437 ; G 1770 +U 5176 ; WX 729 ; N uni1438 ; G 1771 +U 5177 ; WX 729 ; N uni1439 ; G 1772 +U 5178 ; WX 835 ; N uni143A ; G 1773 +U 5179 ; WX 684 ; N uni143B ; G 1774 +U 5180 ; WX 835 ; N uni143C ; G 1775 +U 5181 ; WX 834 ; N uni143D ; G 1776 +U 5182 ; WX 835 ; N uni143E ; G 1777 +U 5183 ; WX 834 ; N uni143F ; G 1778 +U 5184 ; WX 967 ; N uni1440 ; G 1779 +U 5185 ; WX 1007 ; N uni1441 ; G 1780 +U 5186 ; WX 967 ; N uni1442 ; G 1781 +U 5187 ; WX 1007 ; N uni1443 ; G 1782 +U 5188 ; WX 967 ; N uni1444 ; G 1783 +U 5189 ; WX 1007 ; N uni1445 ; G 1784 +U 5190 ; WX 967 ; N uni1446 ; G 1785 +U 5191 ; WX 1007 ; N uni1447 ; G 1786 +U 5192 ; WX 729 ; N uni1448 ; G 1787 +U 5193 ; WX 508 ; N uni1449 ; G 1788 +U 5194 ; WX 192 ; N uni144A ; G 1789 +U 5196 ; WX 732 ; N uni144C ; G 1790 +U 5197 ; WX 732 ; N uni144D ; G 1791 +U 5198 ; WX 732 ; N uni144E ; G 1792 +U 5199 ; WX 732 ; N uni144F ; G 1793 +U 5200 ; WX 730 ; N uni1450 ; G 1794 +U 5201 ; WX 730 ; N uni1451 ; G 1795 +U 5202 ; WX 730 ; N uni1452 ; G 1796 +U 5204 ; WX 730 ; N uni1454 ; G 1797 +U 5205 ; WX 730 ; N uni1455 ; G 1798 +U 5206 ; WX 730 ; N uni1456 ; G 1799 +U 5207 ; WX 921 ; N uni1457 ; G 1800 +U 5208 ; WX 889 ; N uni1458 ; G 1801 +U 5209 ; WX 921 ; N uni1459 ; G 1802 +U 5210 ; WX 889 ; N uni145A ; G 1803 +U 5211 ; WX 921 ; N uni145B ; G 1804 +U 5212 ; WX 889 ; N uni145C ; G 1805 +U 5213 ; WX 928 ; N uni145D ; G 1806 +U 5214 ; WX 900 ; N uni145E ; G 1807 +U 5215 ; WX 928 ; N uni145F ; G 1808 +U 5216 ; WX 900 ; N uni1460 ; G 1809 +U 5217 ; WX 947 ; N uni1461 ; G 1810 +U 5218 ; WX 900 ; N uni1462 ; G 1811 +U 5219 ; WX 947 ; N uni1463 ; G 1812 +U 5220 ; WX 900 ; N uni1464 ; G 1813 +U 5221 ; WX 947 ; N uni1465 ; G 1814 +U 5222 ; WX 434 ; N uni1466 ; G 1815 +U 5223 ; WX 877 ; N uni1467 ; G 1816 +U 5224 ; WX 877 ; N uni1468 ; G 1817 +U 5225 ; WX 866 ; N uni1469 ; G 1818 +U 5226 ; WX 890 ; N uni146A ; G 1819 +U 5227 ; WX 628 ; N uni146B ; G 1820 +U 5228 ; WX 628 ; N uni146C ; G 1821 +U 5229 ; WX 628 ; N uni146D ; G 1822 +U 5230 ; WX 628 ; N uni146E ; G 1823 +U 5231 ; WX 628 ; N uni146F ; G 1824 +U 5232 ; WX 628 ; N uni1470 ; G 1825 +U 5233 ; WX 628 ; N uni1471 ; G 1826 +U 5234 ; WX 628 ; N uni1472 ; G 1827 +U 5235 ; WX 628 ; N uni1473 ; G 1828 +U 5236 ; WX 860 ; N uni1474 ; G 1829 +U 5237 ; WX 771 ; N uni1475 ; G 1830 +U 5238 ; WX 815 ; N uni1476 ; G 1831 +U 5239 ; WX 816 ; N uni1477 ; G 1832 +U 5240 ; WX 815 ; N uni1478 ; G 1833 +U 5241 ; WX 816 ; N uni1479 ; G 1834 +U 5242 ; WX 860 ; N uni147A ; G 1835 +U 5243 ; WX 771 ; N uni147B ; G 1836 +U 5244 ; WX 860 ; N uni147C ; G 1837 +U 5245 ; WX 771 ; N uni147D ; G 1838 +U 5246 ; WX 815 ; N uni147E ; G 1839 +U 5247 ; WX 816 ; N uni147F ; G 1840 +U 5248 ; WX 815 ; N uni1480 ; G 1841 +U 5249 ; WX 816 ; N uni1481 ; G 1842 +U 5250 ; WX 815 ; N uni1482 ; G 1843 +U 5251 ; WX 407 ; N uni1483 ; G 1844 +U 5252 ; WX 407 ; N uni1484 ; G 1845 +U 5253 ; WX 750 ; N uni1485 ; G 1846 +U 5254 ; WX 775 ; N uni1486 ; G 1847 +U 5255 ; WX 750 ; N uni1487 ; G 1848 +U 5256 ; WX 775 ; N uni1488 ; G 1849 +U 5257 ; WX 628 ; N uni1489 ; G 1850 +U 5258 ; WX 628 ; N uni148A ; G 1851 +U 5259 ; WX 628 ; N uni148B ; G 1852 +U 5260 ; WX 628 ; N uni148C ; G 1853 +U 5261 ; WX 628 ; N uni148D ; G 1854 +U 5262 ; WX 628 ; N uni148E ; G 1855 +U 5263 ; WX 628 ; N uni148F ; G 1856 +U 5264 ; WX 628 ; N uni1490 ; G 1857 +U 5265 ; WX 628 ; N uni1491 ; G 1858 +U 5266 ; WX 860 ; N uni1492 ; G 1859 +U 5267 ; WX 771 ; N uni1493 ; G 1860 +U 5268 ; WX 815 ; N uni1494 ; G 1861 +U 5269 ; WX 816 ; N uni1495 ; G 1862 +U 5270 ; WX 815 ; N uni1496 ; G 1863 +U 5271 ; WX 816 ; N uni1497 ; G 1864 +U 5272 ; WX 860 ; N uni1498 ; G 1865 +U 5273 ; WX 771 ; N uni1499 ; G 1866 +U 5274 ; WX 860 ; N uni149A ; G 1867 +U 5275 ; WX 771 ; N uni149B ; G 1868 +U 5276 ; WX 815 ; N uni149C ; G 1869 +U 5277 ; WX 816 ; N uni149D ; G 1870 +U 5278 ; WX 815 ; N uni149E ; G 1871 +U 5279 ; WX 816 ; N uni149F ; G 1872 +U 5280 ; WX 815 ; N uni14A0 ; G 1873 +U 5281 ; WX 435 ; N uni14A1 ; G 1874 +U 5282 ; WX 435 ; N uni14A2 ; G 1875 +U 5283 ; WX 610 ; N uni14A3 ; G 1876 +U 5284 ; WX 557 ; N uni14A4 ; G 1877 +U 5285 ; WX 557 ; N uni14A5 ; G 1878 +U 5286 ; WX 557 ; N uni14A6 ; G 1879 +U 5287 ; WX 610 ; N uni14A7 ; G 1880 +U 5288 ; WX 610 ; N uni14A8 ; G 1881 +U 5289 ; WX 610 ; N uni14A9 ; G 1882 +U 5290 ; WX 557 ; N uni14AA ; G 1883 +U 5291 ; WX 557 ; N uni14AB ; G 1884 +U 5292 ; WX 749 ; N uni14AC ; G 1885 +U 5293 ; WX 769 ; N uni14AD ; G 1886 +U 5294 ; WX 746 ; N uni14AE ; G 1887 +U 5295 ; WX 764 ; N uni14AF ; G 1888 +U 5296 ; WX 746 ; N uni14B0 ; G 1889 +U 5297 ; WX 764 ; N uni14B1 ; G 1890 +U 5298 ; WX 749 ; N uni14B2 ; G 1891 +U 5299 ; WX 769 ; N uni14B3 ; G 1892 +U 5300 ; WX 749 ; N uni14B4 ; G 1893 +U 5301 ; WX 769 ; N uni14B5 ; G 1894 +U 5302 ; WX 746 ; N uni14B6 ; G 1895 +U 5303 ; WX 764 ; N uni14B7 ; G 1896 +U 5304 ; WX 746 ; N uni14B8 ; G 1897 +U 5305 ; WX 764 ; N uni14B9 ; G 1898 +U 5306 ; WX 746 ; N uni14BA ; G 1899 +U 5307 ; WX 386 ; N uni14BB ; G 1900 +U 5308 ; WX 508 ; N uni14BC ; G 1901 +U 5309 ; WX 386 ; N uni14BD ; G 1902 +U 5312 ; WX 852 ; N uni14C0 ; G 1903 +U 5313 ; WX 852 ; N uni14C1 ; G 1904 +U 5314 ; WX 852 ; N uni14C2 ; G 1905 +U 5315 ; WX 852 ; N uni14C3 ; G 1906 +U 5316 ; WX 852 ; N uni14C4 ; G 1907 +U 5317 ; WX 852 ; N uni14C5 ; G 1908 +U 5318 ; WX 852 ; N uni14C6 ; G 1909 +U 5319 ; WX 852 ; N uni14C7 ; G 1910 +U 5320 ; WX 852 ; N uni14C8 ; G 1911 +U 5321 ; WX 1069 ; N uni14C9 ; G 1912 +U 5322 ; WX 1035 ; N uni14CA ; G 1913 +U 5323 ; WX 1059 ; N uni14CB ; G 1914 +U 5324 ; WX 852 ; N uni14CC ; G 1915 +U 5325 ; WX 1059 ; N uni14CD ; G 1916 +U 5326 ; WX 852 ; N uni14CE ; G 1917 +U 5327 ; WX 852 ; N uni14CF ; G 1918 +U 5328 ; WX 600 ; N uni14D0 ; G 1919 +U 5329 ; WX 453 ; N uni14D1 ; G 1920 +U 5330 ; WX 600 ; N uni14D2 ; G 1921 +U 5331 ; WX 852 ; N uni14D3 ; G 1922 +U 5332 ; WX 852 ; N uni14D4 ; G 1923 +U 5333 ; WX 852 ; N uni14D5 ; G 1924 +U 5334 ; WX 852 ; N uni14D6 ; G 1925 +U 5335 ; WX 852 ; N uni14D7 ; G 1926 +U 5336 ; WX 852 ; N uni14D8 ; G 1927 +U 5337 ; WX 852 ; N uni14D9 ; G 1928 +U 5338 ; WX 852 ; N uni14DA ; G 1929 +U 5339 ; WX 852 ; N uni14DB ; G 1930 +U 5340 ; WX 1069 ; N uni14DC ; G 1931 +U 5341 ; WX 1035 ; N uni14DD ; G 1932 +U 5342 ; WX 1059 ; N uni14DE ; G 1933 +U 5343 ; WX 1030 ; N uni14DF ; G 1934 +U 5344 ; WX 1059 ; N uni14E0 ; G 1935 +U 5345 ; WX 1030 ; N uni14E1 ; G 1936 +U 5346 ; WX 1069 ; N uni14E2 ; G 1937 +U 5347 ; WX 1035 ; N uni14E3 ; G 1938 +U 5348 ; WX 1069 ; N uni14E4 ; G 1939 +U 5349 ; WX 1035 ; N uni14E5 ; G 1940 +U 5350 ; WX 1083 ; N uni14E6 ; G 1941 +U 5351 ; WX 1030 ; N uni14E7 ; G 1942 +U 5352 ; WX 1083 ; N uni14E8 ; G 1943 +U 5353 ; WX 1030 ; N uni14E9 ; G 1944 +U 5354 ; WX 600 ; N uni14EA ; G 1945 +U 5356 ; WX 729 ; N uni14EC ; G 1946 +U 5357 ; WX 603 ; N uni14ED ; G 1947 +U 5358 ; WX 603 ; N uni14EE ; G 1948 +U 5359 ; WX 603 ; N uni14EF ; G 1949 +U 5360 ; WX 603 ; N uni14F0 ; G 1950 +U 5361 ; WX 603 ; N uni14F1 ; G 1951 +U 5362 ; WX 603 ; N uni14F2 ; G 1952 +U 5363 ; WX 603 ; N uni14F3 ; G 1953 +U 5364 ; WX 603 ; N uni14F4 ; G 1954 +U 5365 ; WX 603 ; N uni14F5 ; G 1955 +U 5366 ; WX 834 ; N uni14F6 ; G 1956 +U 5367 ; WX 754 ; N uni14F7 ; G 1957 +U 5368 ; WX 792 ; N uni14F8 ; G 1958 +U 5369 ; WX 771 ; N uni14F9 ; G 1959 +U 5370 ; WX 792 ; N uni14FA ; G 1960 +U 5371 ; WX 771 ; N uni14FB ; G 1961 +U 5372 ; WX 834 ; N uni14FC ; G 1962 +U 5373 ; WX 754 ; N uni14FD ; G 1963 +U 5374 ; WX 834 ; N uni14FE ; G 1964 +U 5375 ; WX 754 ; N uni14FF ; G 1965 +U 5376 ; WX 792 ; N uni1500 ; G 1966 +U 5377 ; WX 771 ; N uni1501 ; G 1967 +U 5378 ; WX 792 ; N uni1502 ; G 1968 +U 5379 ; WX 771 ; N uni1503 ; G 1969 +U 5380 ; WX 792 ; N uni1504 ; G 1970 +U 5381 ; WX 418 ; N uni1505 ; G 1971 +U 5382 ; WX 420 ; N uni1506 ; G 1972 +U 5383 ; WX 418 ; N uni1507 ; G 1973 +U 5392 ; WX 712 ; N uni1510 ; G 1974 +U 5393 ; WX 712 ; N uni1511 ; G 1975 +U 5394 ; WX 712 ; N uni1512 ; G 1976 +U 5395 ; WX 892 ; N uni1513 ; G 1977 +U 5396 ; WX 892 ; N uni1514 ; G 1978 +U 5397 ; WX 892 ; N uni1515 ; G 1979 +U 5398 ; WX 892 ; N uni1516 ; G 1980 +U 5399 ; WX 910 ; N uni1517 ; G 1981 +U 5400 ; WX 872 ; N uni1518 ; G 1982 +U 5401 ; WX 910 ; N uni1519 ; G 1983 +U 5402 ; WX 872 ; N uni151A ; G 1984 +U 5403 ; WX 910 ; N uni151B ; G 1985 +U 5404 ; WX 872 ; N uni151C ; G 1986 +U 5405 ; WX 1140 ; N uni151D ; G 1987 +U 5406 ; WX 1100 ; N uni151E ; G 1988 +U 5407 ; WX 1140 ; N uni151F ; G 1989 +U 5408 ; WX 1100 ; N uni1520 ; G 1990 +U 5409 ; WX 1140 ; N uni1521 ; G 1991 +U 5410 ; WX 1100 ; N uni1522 ; G 1992 +U 5411 ; WX 1140 ; N uni1523 ; G 1993 +U 5412 ; WX 1100 ; N uni1524 ; G 1994 +U 5413 ; WX 641 ; N uni1525 ; G 1995 +U 5414 ; WX 627 ; N uni1526 ; G 1996 +U 5415 ; WX 627 ; N uni1527 ; G 1997 +U 5416 ; WX 627 ; N uni1528 ; G 1998 +U 5417 ; WX 627 ; N uni1529 ; G 1999 +U 5418 ; WX 627 ; N uni152A ; G 2000 +U 5419 ; WX 627 ; N uni152B ; G 2001 +U 5420 ; WX 627 ; N uni152C ; G 2002 +U 5421 ; WX 627 ; N uni152D ; G 2003 +U 5422 ; WX 627 ; N uni152E ; G 2004 +U 5423 ; WX 844 ; N uni152F ; G 2005 +U 5424 ; WX 781 ; N uni1530 ; G 2006 +U 5425 ; WX 816 ; N uni1531 ; G 2007 +U 5426 ; WX 818 ; N uni1532 ; G 2008 +U 5427 ; WX 816 ; N uni1533 ; G 2009 +U 5428 ; WX 818 ; N uni1534 ; G 2010 +U 5429 ; WX 844 ; N uni1535 ; G 2011 +U 5430 ; WX 781 ; N uni1536 ; G 2012 +U 5431 ; WX 844 ; N uni1537 ; G 2013 +U 5432 ; WX 781 ; N uni1538 ; G 2014 +U 5433 ; WX 816 ; N uni1539 ; G 2015 +U 5434 ; WX 818 ; N uni153A ; G 2016 +U 5435 ; WX 816 ; N uni153B ; G 2017 +U 5436 ; WX 818 ; N uni153C ; G 2018 +U 5437 ; WX 816 ; N uni153D ; G 2019 +U 5438 ; WX 418 ; N uni153E ; G 2020 +U 5440 ; WX 389 ; N uni1540 ; G 2021 +U 5441 ; WX 484 ; N uni1541 ; G 2022 +U 5442 ; WX 916 ; N uni1542 ; G 2023 +U 5443 ; WX 916 ; N uni1543 ; G 2024 +U 5444 ; WX 916 ; N uni1544 ; G 2025 +U 5445 ; WX 916 ; N uni1545 ; G 2026 +U 5446 ; WX 916 ; N uni1546 ; G 2027 +U 5447 ; WX 916 ; N uni1547 ; G 2028 +U 5448 ; WX 603 ; N uni1548 ; G 2029 +U 5449 ; WX 603 ; N uni1549 ; G 2030 +U 5450 ; WX 603 ; N uni154A ; G 2031 +U 5451 ; WX 603 ; N uni154B ; G 2032 +U 5452 ; WX 603 ; N uni154C ; G 2033 +U 5453 ; WX 603 ; N uni154D ; G 2034 +U 5454 ; WX 834 ; N uni154E ; G 2035 +U 5455 ; WX 754 ; N uni154F ; G 2036 +U 5456 ; WX 418 ; N uni1550 ; G 2037 +U 5458 ; WX 729 ; N uni1552 ; G 2038 +U 5459 ; WX 684 ; N uni1553 ; G 2039 +U 5460 ; WX 684 ; N uni1554 ; G 2040 +U 5461 ; WX 684 ; N uni1555 ; G 2041 +U 5462 ; WX 684 ; N uni1556 ; G 2042 +U 5463 ; WX 726 ; N uni1557 ; G 2043 +U 5464 ; WX 726 ; N uni1558 ; G 2044 +U 5465 ; WX 726 ; N uni1559 ; G 2045 +U 5466 ; WX 726 ; N uni155A ; G 2046 +U 5467 ; WX 924 ; N uni155B ; G 2047 +U 5468 ; WX 1007 ; N uni155C ; G 2048 +U 5469 ; WX 508 ; N uni155D ; G 2049 +U 5470 ; WX 732 ; N uni155E ; G 2050 +U 5471 ; WX 732 ; N uni155F ; G 2051 +U 5472 ; WX 732 ; N uni1560 ; G 2052 +U 5473 ; WX 732 ; N uni1561 ; G 2053 +U 5474 ; WX 732 ; N uni1562 ; G 2054 +U 5475 ; WX 732 ; N uni1563 ; G 2055 +U 5476 ; WX 730 ; N uni1564 ; G 2056 +U 5477 ; WX 730 ; N uni1565 ; G 2057 +U 5478 ; WX 730 ; N uni1566 ; G 2058 +U 5479 ; WX 730 ; N uni1567 ; G 2059 +U 5480 ; WX 947 ; N uni1568 ; G 2060 +U 5481 ; WX 900 ; N uni1569 ; G 2061 +U 5482 ; WX 508 ; N uni156A ; G 2062 +U 5492 ; WX 831 ; N uni1574 ; G 2063 +U 5493 ; WX 831 ; N uni1575 ; G 2064 +U 5494 ; WX 831 ; N uni1576 ; G 2065 +U 5495 ; WX 831 ; N uni1577 ; G 2066 +U 5496 ; WX 831 ; N uni1578 ; G 2067 +U 5497 ; WX 831 ; N uni1579 ; G 2068 +U 5498 ; WX 831 ; N uni157A ; G 2069 +U 5499 ; WX 563 ; N uni157B ; G 2070 +U 5500 ; WX 752 ; N uni157C ; G 2071 +U 5501 ; WX 484 ; N uni157D ; G 2072 +U 5502 ; WX 1047 ; N uni157E ; G 2073 +U 5503 ; WX 1047 ; N uni157F ; G 2074 +U 5504 ; WX 1047 ; N uni1580 ; G 2075 +U 5505 ; WX 1047 ; N uni1581 ; G 2076 +U 5506 ; WX 1047 ; N uni1582 ; G 2077 +U 5507 ; WX 1047 ; N uni1583 ; G 2078 +U 5508 ; WX 1047 ; N uni1584 ; G 2079 +U 5509 ; WX 825 ; N uni1585 ; G 2080 +U 5514 ; WX 831 ; N uni158A ; G 2081 +U 5515 ; WX 831 ; N uni158B ; G 2082 +U 5516 ; WX 831 ; N uni158C ; G 2083 +U 5517 ; WX 831 ; N uni158D ; G 2084 +U 5518 ; WX 1259 ; N uni158E ; G 2085 +U 5519 ; WX 1259 ; N uni158F ; G 2086 +U 5520 ; WX 1259 ; N uni1590 ; G 2087 +U 5521 ; WX 1002 ; N uni1591 ; G 2088 +U 5522 ; WX 1002 ; N uni1592 ; G 2089 +U 5523 ; WX 1259 ; N uni1593 ; G 2090 +U 5524 ; WX 1259 ; N uni1594 ; G 2091 +U 5525 ; WX 700 ; N uni1595 ; G 2092 +U 5526 ; WX 1073 ; N uni1596 ; G 2093 +U 5536 ; WX 852 ; N uni15A0 ; G 2094 +U 5537 ; WX 852 ; N uni15A1 ; G 2095 +U 5538 ; WX 852 ; N uni15A2 ; G 2096 +U 5539 ; WX 852 ; N uni15A3 ; G 2097 +U 5540 ; WX 852 ; N uni15A4 ; G 2098 +U 5541 ; WX 852 ; N uni15A5 ; G 2099 +U 5542 ; WX 600 ; N uni15A6 ; G 2100 +U 5543 ; WX 643 ; N uni15A7 ; G 2101 +U 5544 ; WX 643 ; N uni15A8 ; G 2102 +U 5545 ; WX 643 ; N uni15A9 ; G 2103 +U 5546 ; WX 643 ; N uni15AA ; G 2104 +U 5547 ; WX 643 ; N uni15AB ; G 2105 +U 5548 ; WX 643 ; N uni15AC ; G 2106 +U 5549 ; WX 643 ; N uni15AD ; G 2107 +U 5550 ; WX 418 ; N uni15AE ; G 2108 +U 5551 ; WX 628 ; N uni15AF ; G 2109 +U 5598 ; WX 770 ; N uni15DE ; G 2110 +U 5601 ; WX 767 ; N uni15E1 ; G 2111 +U 5702 ; WX 468 ; N uni1646 ; G 2112 +U 5703 ; WX 468 ; N uni1647 ; G 2113 +U 5742 ; WX 444 ; N uni166E ; G 2114 +U 5743 ; WX 1047 ; N uni166F ; G 2115 +U 5744 ; WX 1310 ; N uni1670 ; G 2116 +U 5745 ; WX 1632 ; N uni1671 ; G 2117 +U 5746 ; WX 1632 ; N uni1672 ; G 2118 +U 5747 ; WX 1375 ; N uni1673 ; G 2119 +U 5748 ; WX 1375 ; N uni1674 ; G 2120 +U 5749 ; WX 1632 ; N uni1675 ; G 2121 +U 5750 ; WX 1632 ; N uni1676 ; G 2122 +U 5760 ; WX 477 ; N uni1680 ; G 2123 +U 5761 ; WX 493 ; N uni1681 ; G 2124 +U 5762 ; WX 712 ; N uni1682 ; G 2125 +U 5763 ; WX 931 ; N uni1683 ; G 2126 +U 5764 ; WX 1150 ; N uni1684 ; G 2127 +U 5765 ; WX 1370 ; N uni1685 ; G 2128 +U 5766 ; WX 493 ; N uni1686 ; G 2129 +U 5767 ; WX 712 ; N uni1687 ; G 2130 +U 5768 ; WX 931 ; N uni1688 ; G 2131 +U 5769 ; WX 1150 ; N uni1689 ; G 2132 +U 5770 ; WX 1370 ; N uni168A ; G 2133 +U 5771 ; WX 498 ; N uni168B ; G 2134 +U 5772 ; WX 718 ; N uni168C ; G 2135 +U 5773 ; WX 938 ; N uni168D ; G 2136 +U 5774 ; WX 1159 ; N uni168E ; G 2137 +U 5775 ; WX 1379 ; N uni168F ; G 2138 +U 5776 ; WX 493 ; N uni1690 ; G 2139 +U 5777 ; WX 712 ; N uni1691 ; G 2140 +U 5778 ; WX 930 ; N uni1692 ; G 2141 +U 5779 ; WX 1149 ; N uni1693 ; G 2142 +U 5780 ; WX 1370 ; N uni1694 ; G 2143 +U 5781 ; WX 498 ; N uni1695 ; G 2144 +U 5782 ; WX 752 ; N uni1696 ; G 2145 +U 5783 ; WX 789 ; N uni1697 ; G 2146 +U 5784 ; WX 1205 ; N uni1698 ; G 2147 +U 5785 ; WX 1150 ; N uni1699 ; G 2148 +U 5786 ; WX 683 ; N uni169A ; G 2149 +U 5787 ; WX 507 ; N uni169B ; G 2150 +U 5788 ; WX 507 ; N uni169C ; G 2151 +U 7424 ; WX 592 ; N uni1D00 ; G 2152 +U 7425 ; WX 717 ; N uni1D01 ; G 2153 +U 7426 ; WX 982 ; N uni1D02 ; G 2154 +U 7427 ; WX 586 ; N uni1D03 ; G 2155 +U 7428 ; WX 550 ; N uni1D04 ; G 2156 +U 7429 ; WX 605 ; N uni1D05 ; G 2157 +U 7430 ; WX 605 ; N uni1D06 ; G 2158 +U 7431 ; WX 491 ; N uni1D07 ; G 2159 +U 7432 ; WX 541 ; N uni1D08 ; G 2160 +U 7433 ; WX 278 ; N uni1D09 ; G 2161 +U 7434 ; WX 395 ; N uni1D0A ; G 2162 +U 7435 ; WX 579 ; N uni1D0B ; G 2163 +U 7436 ; WX 583 ; N uni1D0C ; G 2164 +U 7437 ; WX 754 ; N uni1D0D ; G 2165 +U 7438 ; WX 650 ; N uni1D0E ; G 2166 +U 7439 ; WX 612 ; N uni1D0F ; G 2167 +U 7440 ; WX 550 ; N uni1D10 ; G 2168 +U 7441 ; WX 684 ; N uni1D11 ; G 2169 +U 7442 ; WX 684 ; N uni1D12 ; G 2170 +U 7443 ; WX 684 ; N uni1D13 ; G 2171 +U 7444 ; WX 1023 ; N uni1D14 ; G 2172 +U 7446 ; WX 612 ; N uni1D16 ; G 2173 +U 7447 ; WX 612 ; N uni1D17 ; G 2174 +U 7448 ; WX 524 ; N uni1D18 ; G 2175 +U 7449 ; WX 602 ; N uni1D19 ; G 2176 +U 7450 ; WX 602 ; N uni1D1A ; G 2177 +U 7451 ; WX 583 ; N uni1D1B ; G 2178 +U 7452 ; WX 574 ; N uni1D1C ; G 2179 +U 7453 ; WX 737 ; N uni1D1D ; G 2180 +U 7454 ; WX 948 ; N uni1D1E ; G 2181 +U 7455 ; WX 638 ; N uni1D1F ; G 2182 +U 7456 ; WX 592 ; N uni1D20 ; G 2183 +U 7457 ; WX 818 ; N uni1D21 ; G 2184 +U 7458 ; WX 525 ; N uni1D22 ; G 2185 +U 7459 ; WX 526 ; N uni1D23 ; G 2186 +U 7462 ; WX 583 ; N uni1D26 ; G 2187 +U 7463 ; WX 592 ; N uni1D27 ; G 2188 +U 7464 ; WX 564 ; N uni1D28 ; G 2189 +U 7465 ; WX 524 ; N uni1D29 ; G 2190 +U 7466 ; WX 590 ; N uni1D2A ; G 2191 +U 7467 ; WX 639 ; N uni1D2B ; G 2192 +U 7468 ; WX 431 ; N uni1D2C ; G 2193 +U 7469 ; WX 613 ; N uni1D2D ; G 2194 +U 7470 ; WX 432 ; N uni1D2E ; G 2195 +U 7472 ; WX 485 ; N uni1D30 ; G 2196 +U 7473 ; WX 398 ; N uni1D31 ; G 2197 +U 7474 ; WX 398 ; N uni1D32 ; G 2198 +U 7475 ; WX 488 ; N uni1D33 ; G 2199 +U 7476 ; WX 474 ; N uni1D34 ; G 2200 +U 7477 ; WX 186 ; N uni1D35 ; G 2201 +U 7478 ; WX 186 ; N uni1D36 ; G 2202 +U 7479 ; WX 413 ; N uni1D37 ; G 2203 +U 7480 ; WX 351 ; N uni1D38 ; G 2204 +U 7481 ; WX 543 ; N uni1D39 ; G 2205 +U 7482 ; WX 471 ; N uni1D3A ; G 2206 +U 7483 ; WX 471 ; N uni1D3B ; G 2207 +U 7484 ; WX 496 ; N uni1D3C ; G 2208 +U 7485 ; WX 439 ; N uni1D3D ; G 2209 +U 7486 ; WX 380 ; N uni1D3E ; G 2210 +U 7487 ; WX 438 ; N uni1D3F ; G 2211 +U 7488 ; WX 385 ; N uni1D40 ; G 2212 +U 7489 ; WX 461 ; N uni1D41 ; G 2213 +U 7490 ; WX 623 ; N uni1D42 ; G 2214 +U 7491 ; WX 392 ; N uni1D43 ; G 2215 +U 7492 ; WX 392 ; N uni1D44 ; G 2216 +U 7493 ; WX 405 ; N uni1D45 ; G 2217 +U 7494 ; WX 648 ; N uni1D46 ; G 2218 +U 7495 ; WX 428 ; N uni1D47 ; G 2219 +U 7496 ; WX 405 ; N uni1D48 ; G 2220 +U 7497 ; WX 417 ; N uni1D49 ; G 2221 +U 7498 ; WX 417 ; N uni1D4A ; G 2222 +U 7499 ; WX 360 ; N uni1D4B ; G 2223 +U 7500 ; WX 359 ; N uni1D4C ; G 2224 +U 7501 ; WX 405 ; N uni1D4D ; G 2225 +U 7502 ; WX 179 ; N uni1D4E ; G 2226 +U 7503 ; WX 426 ; N uni1D4F ; G 2227 +U 7504 ; WX 623 ; N uni1D50 ; G 2228 +U 7505 ; WX 409 ; N uni1D51 ; G 2229 +U 7506 ; WX 414 ; N uni1D52 ; G 2230 +U 7507 ; WX 370 ; N uni1D53 ; G 2231 +U 7508 ; WX 414 ; N uni1D54 ; G 2232 +U 7509 ; WX 414 ; N uni1D55 ; G 2233 +U 7510 ; WX 428 ; N uni1D56 ; G 2234 +U 7511 ; WX 295 ; N uni1D57 ; G 2235 +U 7512 ; WX 405 ; N uni1D58 ; G 2236 +U 7513 ; WX 470 ; N uni1D59 ; G 2237 +U 7514 ; WX 623 ; N uni1D5A ; G 2238 +U 7515 ; WX 417 ; N uni1D5B ; G 2239 +U 7517 ; WX 402 ; N uni1D5D ; G 2240 +U 7518 ; WX 373 ; N uni1D5E ; G 2241 +U 7519 ; WX 385 ; N uni1D5F ; G 2242 +U 7520 ; WX 416 ; N uni1D60 ; G 2243 +U 7521 ; WX 364 ; N uni1D61 ; G 2244 +U 7522 ; WX 179 ; N uni1D62 ; G 2245 +U 7523 ; WX 259 ; N uni1D63 ; G 2246 +U 7524 ; WX 405 ; N uni1D64 ; G 2247 +U 7525 ; WX 417 ; N uni1D65 ; G 2248 +U 7526 ; WX 402 ; N uni1D66 ; G 2249 +U 7527 ; WX 373 ; N uni1D67 ; G 2250 +U 7528 ; WX 412 ; N uni1D68 ; G 2251 +U 7529 ; WX 416 ; N uni1D69 ; G 2252 +U 7530 ; WX 364 ; N uni1D6A ; G 2253 +U 7543 ; WX 635 ; N uni1D77 ; G 2254 +U 7544 ; WX 474 ; N uni1D78 ; G 2255 +U 7547 ; WX 372 ; N uni1D7B ; G 2256 +U 7549 ; WX 667 ; N uni1D7D ; G 2257 +U 7557 ; WX 278 ; N uni1D85 ; G 2258 +U 7579 ; WX 405 ; N uni1D9B ; G 2259 +U 7580 ; WX 370 ; N uni1D9C ; G 2260 +U 7581 ; WX 370 ; N uni1D9D ; G 2261 +U 7582 ; WX 414 ; N uni1D9E ; G 2262 +U 7583 ; WX 360 ; N uni1D9F ; G 2263 +U 7584 ; WX 296 ; N uni1DA0 ; G 2264 +U 7585 ; WX 233 ; N uni1DA1 ; G 2265 +U 7586 ; WX 405 ; N uni1DA2 ; G 2266 +U 7587 ; WX 405 ; N uni1DA3 ; G 2267 +U 7588 ; WX 261 ; N uni1DA4 ; G 2268 +U 7589 ; WX 250 ; N uni1DA5 ; G 2269 +U 7590 ; WX 261 ; N uni1DA6 ; G 2270 +U 7591 ; WX 261 ; N uni1DA7 ; G 2271 +U 7592 ; WX 234 ; N uni1DA8 ; G 2272 +U 7593 ; WX 250 ; N uni1DA9 ; G 2273 +U 7594 ; WX 235 ; N uni1DAA ; G 2274 +U 7595 ; WX 376 ; N uni1DAB ; G 2275 +U 7596 ; WX 623 ; N uni1DAC ; G 2276 +U 7597 ; WX 623 ; N uni1DAD ; G 2277 +U 7598 ; WX 411 ; N uni1DAE ; G 2278 +U 7599 ; WX 479 ; N uni1DAF ; G 2279 +U 7600 ; WX 409 ; N uni1DB0 ; G 2280 +U 7601 ; WX 414 ; N uni1DB1 ; G 2281 +U 7602 ; WX 414 ; N uni1DB2 ; G 2282 +U 7603 ; WX 360 ; N uni1DB3 ; G 2283 +U 7604 ; WX 287 ; N uni1DB4 ; G 2284 +U 7605 ; WX 295 ; N uni1DB5 ; G 2285 +U 7606 ; WX 508 ; N uni1DB6 ; G 2286 +U 7607 ; WX 418 ; N uni1DB7 ; G 2287 +U 7608 ; WX 361 ; N uni1DB8 ; G 2288 +U 7609 ; WX 406 ; N uni1DB9 ; G 2289 +U 7610 ; WX 417 ; N uni1DBA ; G 2290 +U 7611 ; WX 366 ; N uni1DBB ; G 2291 +U 7612 ; WX 437 ; N uni1DBC ; G 2292 +U 7613 ; WX 366 ; N uni1DBD ; G 2293 +U 7614 ; WX 392 ; N uni1DBE ; G 2294 +U 7615 ; WX 414 ; N uni1DBF ; G 2295 +U 7620 ; WX 0 ; N uni1DC4 ; G 2296 +U 7621 ; WX 0 ; N uni1DC5 ; G 2297 +U 7622 ; WX 0 ; N uni1DC6 ; G 2298 +U 7623 ; WX 0 ; N uni1DC7 ; G 2299 +U 7624 ; WX 0 ; N uni1DC8 ; G 2300 +U 7625 ; WX 0 ; N uni1DC9 ; G 2301 +U 7680 ; WX 684 ; N uni1E00 ; G 2302 +U 7681 ; WX 613 ; N uni1E01 ; G 2303 +U 7682 ; WX 686 ; N uni1E02 ; G 2304 +U 7683 ; WX 635 ; N uni1E03 ; G 2305 +U 7684 ; WX 686 ; N uni1E04 ; G 2306 +U 7685 ; WX 635 ; N uni1E05 ; G 2307 +U 7686 ; WX 686 ; N uni1E06 ; G 2308 +U 7687 ; WX 635 ; N uni1E07 ; G 2309 +U 7688 ; WX 698 ; N uni1E08 ; G 2310 +U 7689 ; WX 550 ; N uni1E09 ; G 2311 +U 7690 ; WX 770 ; N uni1E0A ; G 2312 +U 7691 ; WX 635 ; N uni1E0B ; G 2313 +U 7692 ; WX 770 ; N uni1E0C ; G 2314 +U 7693 ; WX 635 ; N uni1E0D ; G 2315 +U 7694 ; WX 770 ; N uni1E0E ; G 2316 +U 7695 ; WX 635 ; N uni1E0F ; G 2317 +U 7696 ; WX 770 ; N uni1E10 ; G 2318 +U 7697 ; WX 635 ; N uni1E11 ; G 2319 +U 7698 ; WX 770 ; N uni1E12 ; G 2320 +U 7699 ; WX 635 ; N uni1E13 ; G 2321 +U 7700 ; WX 632 ; N uni1E14 ; G 2322 +U 7701 ; WX 615 ; N uni1E15 ; G 2323 +U 7702 ; WX 632 ; N uni1E16 ; G 2324 +U 7703 ; WX 615 ; N uni1E17 ; G 2325 +U 7704 ; WX 632 ; N uni1E18 ; G 2326 +U 7705 ; WX 615 ; N uni1E19 ; G 2327 +U 7706 ; WX 632 ; N uni1E1A ; G 2328 +U 7707 ; WX 615 ; N uni1E1B ; G 2329 +U 7708 ; WX 632 ; N uni1E1C ; G 2330 +U 7709 ; WX 615 ; N uni1E1D ; G 2331 +U 7710 ; WX 575 ; N uni1E1E ; G 2332 +U 7711 ; WX 352 ; N uni1E1F ; G 2333 +U 7712 ; WX 775 ; N uni1E20 ; G 2334 +U 7713 ; WX 635 ; N uni1E21 ; G 2335 +U 7714 ; WX 752 ; N uni1E22 ; G 2336 +U 7715 ; WX 634 ; N uni1E23 ; G 2337 +U 7716 ; WX 752 ; N uni1E24 ; G 2338 +U 7717 ; WX 634 ; N uni1E25 ; G 2339 +U 7718 ; WX 752 ; N uni1E26 ; G 2340 +U 7719 ; WX 634 ; N uni1E27 ; G 2341 +U 7720 ; WX 752 ; N uni1E28 ; G 2342 +U 7721 ; WX 634 ; N uni1E29 ; G 2343 +U 7722 ; WX 752 ; N uni1E2A ; G 2344 +U 7723 ; WX 634 ; N uni1E2B ; G 2345 +U 7724 ; WX 295 ; N uni1E2C ; G 2346 +U 7725 ; WX 278 ; N uni1E2D ; G 2347 +U 7726 ; WX 295 ; N uni1E2E ; G 2348 +U 7727 ; WX 278 ; N uni1E2F ; G 2349 +U 7728 ; WX 656 ; N uni1E30 ; G 2350 +U 7729 ; WX 579 ; N uni1E31 ; G 2351 +U 7730 ; WX 656 ; N uni1E32 ; G 2352 +U 7731 ; WX 579 ; N uni1E33 ; G 2353 +U 7732 ; WX 656 ; N uni1E34 ; G 2354 +U 7733 ; WX 579 ; N uni1E35 ; G 2355 +U 7734 ; WX 557 ; N uni1E36 ; G 2356 +U 7735 ; WX 288 ; N uni1E37 ; G 2357 +U 7736 ; WX 557 ; N uni1E38 ; G 2358 +U 7737 ; WX 288 ; N uni1E39 ; G 2359 +U 7738 ; WX 557 ; N uni1E3A ; G 2360 +U 7739 ; WX 278 ; N uni1E3B ; G 2361 +U 7740 ; WX 557 ; N uni1E3C ; G 2362 +U 7741 ; WX 278 ; N uni1E3D ; G 2363 +U 7742 ; WX 863 ; N uni1E3E ; G 2364 +U 7743 ; WX 974 ; N uni1E3F ; G 2365 +U 7744 ; WX 863 ; N uni1E40 ; G 2366 +U 7745 ; WX 974 ; N uni1E41 ; G 2367 +U 7746 ; WX 863 ; N uni1E42 ; G 2368 +U 7747 ; WX 974 ; N uni1E43 ; G 2369 +U 7748 ; WX 748 ; N uni1E44 ; G 2370 +U 7749 ; WX 634 ; N uni1E45 ; G 2371 +U 7750 ; WX 748 ; N uni1E46 ; G 2372 +U 7751 ; WX 634 ; N uni1E47 ; G 2373 +U 7752 ; WX 748 ; N uni1E48 ; G 2374 +U 7753 ; WX 634 ; N uni1E49 ; G 2375 +U 7754 ; WX 748 ; N uni1E4A ; G 2376 +U 7755 ; WX 634 ; N uni1E4B ; G 2377 +U 7756 ; WX 787 ; N uni1E4C ; G 2378 +U 7757 ; WX 612 ; N uni1E4D ; G 2379 +U 7758 ; WX 787 ; N uni1E4E ; G 2380 +U 7759 ; WX 612 ; N uni1E4F ; G 2381 +U 7760 ; WX 787 ; N uni1E50 ; G 2382 +U 7761 ; WX 612 ; N uni1E51 ; G 2383 +U 7762 ; WX 787 ; N uni1E52 ; G 2384 +U 7763 ; WX 612 ; N uni1E53 ; G 2385 +U 7764 ; WX 603 ; N uni1E54 ; G 2386 +U 7765 ; WX 635 ; N uni1E55 ; G 2387 +U 7766 ; WX 603 ; N uni1E56 ; G 2388 +U 7767 ; WX 635 ; N uni1E57 ; G 2389 +U 7768 ; WX 695 ; N uni1E58 ; G 2390 +U 7769 ; WX 411 ; N uni1E59 ; G 2391 +U 7770 ; WX 695 ; N uni1E5A ; G 2392 +U 7771 ; WX 411 ; N uni1E5B ; G 2393 +U 7772 ; WX 695 ; N uni1E5C ; G 2394 +U 7773 ; WX 411 ; N uni1E5D ; G 2395 +U 7774 ; WX 695 ; N uni1E5E ; G 2396 +U 7775 ; WX 411 ; N uni1E5F ; G 2397 +U 7776 ; WX 635 ; N uni1E60 ; G 2398 +U 7777 ; WX 521 ; N uni1E61 ; G 2399 +U 7778 ; WX 635 ; N uni1E62 ; G 2400 +U 7779 ; WX 521 ; N uni1E63 ; G 2401 +U 7780 ; WX 635 ; N uni1E64 ; G 2402 +U 7781 ; WX 521 ; N uni1E65 ; G 2403 +U 7782 ; WX 635 ; N uni1E66 ; G 2404 +U 7783 ; WX 521 ; N uni1E67 ; G 2405 +U 7784 ; WX 635 ; N uni1E68 ; G 2406 +U 7785 ; WX 521 ; N uni1E69 ; G 2407 +U 7786 ; WX 611 ; N uni1E6A ; G 2408 +U 7787 ; WX 392 ; N uni1E6B ; G 2409 +U 7788 ; WX 611 ; N uni1E6C ; G 2410 +U 7789 ; WX 392 ; N uni1E6D ; G 2411 +U 7790 ; WX 611 ; N uni1E6E ; G 2412 +U 7791 ; WX 392 ; N uni1E6F ; G 2413 +U 7792 ; WX 611 ; N uni1E70 ; G 2414 +U 7793 ; WX 392 ; N uni1E71 ; G 2415 +U 7794 ; WX 732 ; N uni1E72 ; G 2416 +U 7795 ; WX 634 ; N uni1E73 ; G 2417 +U 7796 ; WX 732 ; N uni1E74 ; G 2418 +U 7797 ; WX 634 ; N uni1E75 ; G 2419 +U 7798 ; WX 732 ; N uni1E76 ; G 2420 +U 7799 ; WX 634 ; N uni1E77 ; G 2421 +U 7800 ; WX 732 ; N uni1E78 ; G 2422 +U 7801 ; WX 634 ; N uni1E79 ; G 2423 +U 7802 ; WX 732 ; N uni1E7A ; G 2424 +U 7803 ; WX 634 ; N uni1E7B ; G 2425 +U 7804 ; WX 684 ; N uni1E7C ; G 2426 +U 7805 ; WX 592 ; N uni1E7D ; G 2427 +U 7806 ; WX 684 ; N uni1E7E ; G 2428 +U 7807 ; WX 592 ; N uni1E7F ; G 2429 +U 7808 ; WX 989 ; N Wgrave ; G 2430 +U 7809 ; WX 818 ; N wgrave ; G 2431 +U 7810 ; WX 989 ; N Wacute ; G 2432 +U 7811 ; WX 818 ; N wacute ; G 2433 +U 7812 ; WX 989 ; N Wdieresis ; G 2434 +U 7813 ; WX 818 ; N wdieresis ; G 2435 +U 7814 ; WX 989 ; N uni1E86 ; G 2436 +U 7815 ; WX 818 ; N uni1E87 ; G 2437 +U 7816 ; WX 989 ; N uni1E88 ; G 2438 +U 7817 ; WX 818 ; N uni1E89 ; G 2439 +U 7818 ; WX 685 ; N uni1E8A ; G 2440 +U 7819 ; WX 592 ; N uni1E8B ; G 2441 +U 7820 ; WX 685 ; N uni1E8C ; G 2442 +U 7821 ; WX 592 ; N uni1E8D ; G 2443 +U 7822 ; WX 611 ; N uni1E8E ; G 2444 +U 7823 ; WX 592 ; N uni1E8F ; G 2445 +U 7824 ; WX 685 ; N uni1E90 ; G 2446 +U 7825 ; WX 525 ; N uni1E91 ; G 2447 +U 7826 ; WX 685 ; N uni1E92 ; G 2448 +U 7827 ; WX 525 ; N uni1E93 ; G 2449 +U 7828 ; WX 685 ; N uni1E94 ; G 2450 +U 7829 ; WX 525 ; N uni1E95 ; G 2451 +U 7830 ; WX 634 ; N uni1E96 ; G 2452 +U 7831 ; WX 392 ; N uni1E97 ; G 2453 +U 7832 ; WX 818 ; N uni1E98 ; G 2454 +U 7833 ; WX 592 ; N uni1E99 ; G 2455 +U 7834 ; WX 613 ; N uni1E9A ; G 2456 +U 7835 ; WX 352 ; N uni1E9B ; G 2457 +U 7836 ; WX 352 ; N uni1E9C ; G 2458 +U 7837 ; WX 352 ; N uni1E9D ; G 2459 +U 7838 ; WX 769 ; N uni1E9E ; G 2460 +U 7839 ; WX 612 ; N uni1E9F ; G 2461 +U 7840 ; WX 684 ; N uni1EA0 ; G 2462 +U 7841 ; WX 613 ; N uni1EA1 ; G 2463 +U 7842 ; WX 684 ; N uni1EA2 ; G 2464 +U 7843 ; WX 613 ; N uni1EA3 ; G 2465 +U 7844 ; WX 684 ; N uni1EA4 ; G 2466 +U 7845 ; WX 613 ; N uni1EA5 ; G 2467 +U 7846 ; WX 684 ; N uni1EA6 ; G 2468 +U 7847 ; WX 613 ; N uni1EA7 ; G 2469 +U 7848 ; WX 684 ; N uni1EA8 ; G 2470 +U 7849 ; WX 613 ; N uni1EA9 ; G 2471 +U 7850 ; WX 684 ; N uni1EAA ; G 2472 +U 7851 ; WX 613 ; N uni1EAB ; G 2473 +U 7852 ; WX 684 ; N uni1EAC ; G 2474 +U 7853 ; WX 613 ; N uni1EAD ; G 2475 +U 7854 ; WX 684 ; N uni1EAE ; G 2476 +U 7855 ; WX 613 ; N uni1EAF ; G 2477 +U 7856 ; WX 684 ; N uni1EB0 ; G 2478 +U 7857 ; WX 613 ; N uni1EB1 ; G 2479 +U 7858 ; WX 684 ; N uni1EB2 ; G 2480 +U 7859 ; WX 613 ; N uni1EB3 ; G 2481 +U 7860 ; WX 684 ; N uni1EB4 ; G 2482 +U 7861 ; WX 613 ; N uni1EB5 ; G 2483 +U 7862 ; WX 684 ; N uni1EB6 ; G 2484 +U 7863 ; WX 613 ; N uni1EB7 ; G 2485 +U 7864 ; WX 632 ; N uni1EB8 ; G 2486 +U 7865 ; WX 615 ; N uni1EB9 ; G 2487 +U 7866 ; WX 632 ; N uni1EBA ; G 2488 +U 7867 ; WX 615 ; N uni1EBB ; G 2489 +U 7868 ; WX 632 ; N uni1EBC ; G 2490 +U 7869 ; WX 615 ; N uni1EBD ; G 2491 +U 7870 ; WX 632 ; N uni1EBE ; G 2492 +U 7871 ; WX 615 ; N uni1EBF ; G 2493 +U 7872 ; WX 632 ; N uni1EC0 ; G 2494 +U 7873 ; WX 615 ; N uni1EC1 ; G 2495 +U 7874 ; WX 632 ; N uni1EC2 ; G 2496 +U 7875 ; WX 615 ; N uni1EC3 ; G 2497 +U 7876 ; WX 632 ; N uni1EC4 ; G 2498 +U 7877 ; WX 615 ; N uni1EC5 ; G 2499 +U 7878 ; WX 632 ; N uni1EC6 ; G 2500 +U 7879 ; WX 615 ; N uni1EC7 ; G 2501 +U 7880 ; WX 295 ; N uni1EC8 ; G 2502 +U 7881 ; WX 278 ; N uni1EC9 ; G 2503 +U 7882 ; WX 295 ; N uni1ECA ; G 2504 +U 7883 ; WX 278 ; N uni1ECB ; G 2505 +U 7884 ; WX 787 ; N uni1ECC ; G 2506 +U 7885 ; WX 612 ; N uni1ECD ; G 2507 +U 7886 ; WX 787 ; N uni1ECE ; G 2508 +U 7887 ; WX 612 ; N uni1ECF ; G 2509 +U 7888 ; WX 787 ; N uni1ED0 ; G 2510 +U 7889 ; WX 612 ; N uni1ED1 ; G 2511 +U 7890 ; WX 787 ; N uni1ED2 ; G 2512 +U 7891 ; WX 612 ; N uni1ED3 ; G 2513 +U 7892 ; WX 787 ; N uni1ED4 ; G 2514 +U 7893 ; WX 612 ; N uni1ED5 ; G 2515 +U 7894 ; WX 787 ; N uni1ED6 ; G 2516 +U 7895 ; WX 612 ; N uni1ED7 ; G 2517 +U 7896 ; WX 787 ; N uni1ED8 ; G 2518 +U 7897 ; WX 612 ; N uni1ED9 ; G 2519 +U 7898 ; WX 913 ; N uni1EDA ; G 2520 +U 7899 ; WX 612 ; N uni1EDB ; G 2521 +U 7900 ; WX 913 ; N uni1EDC ; G 2522 +U 7901 ; WX 612 ; N uni1EDD ; G 2523 +U 7902 ; WX 913 ; N uni1EDE ; G 2524 +U 7903 ; WX 612 ; N uni1EDF ; G 2525 +U 7904 ; WX 913 ; N uni1EE0 ; G 2526 +U 7905 ; WX 612 ; N uni1EE1 ; G 2527 +U 7906 ; WX 913 ; N uni1EE2 ; G 2528 +U 7907 ; WX 612 ; N uni1EE3 ; G 2529 +U 7908 ; WX 732 ; N uni1EE4 ; G 2530 +U 7909 ; WX 634 ; N uni1EE5 ; G 2531 +U 7910 ; WX 732 ; N uni1EE6 ; G 2532 +U 7911 ; WX 634 ; N uni1EE7 ; G 2533 +U 7912 ; WX 858 ; N uni1EE8 ; G 2534 +U 7913 ; WX 634 ; N uni1EE9 ; G 2535 +U 7914 ; WX 858 ; N uni1EEA ; G 2536 +U 7915 ; WX 634 ; N uni1EEB ; G 2537 +U 7916 ; WX 858 ; N uni1EEC ; G 2538 +U 7917 ; WX 634 ; N uni1EED ; G 2539 +U 7918 ; WX 858 ; N uni1EEE ; G 2540 +U 7919 ; WX 634 ; N uni1EEF ; G 2541 +U 7920 ; WX 858 ; N uni1EF0 ; G 2542 +U 7921 ; WX 634 ; N uni1EF1 ; G 2543 +U 7922 ; WX 611 ; N Ygrave ; G 2544 +U 7923 ; WX 592 ; N ygrave ; G 2545 +U 7924 ; WX 611 ; N uni1EF4 ; G 2546 +U 7925 ; WX 592 ; N uni1EF5 ; G 2547 +U 7926 ; WX 611 ; N uni1EF6 ; G 2548 +U 7927 ; WX 592 ; N uni1EF7 ; G 2549 +U 7928 ; WX 611 ; N uni1EF8 ; G 2550 +U 7929 ; WX 592 ; N uni1EF9 ; G 2551 +U 7930 ; WX 769 ; N uni1EFA ; G 2552 +U 7931 ; WX 477 ; N uni1EFB ; G 2553 +U 7936 ; WX 659 ; N uni1F00 ; G 2554 +U 7937 ; WX 659 ; N uni1F01 ; G 2555 +U 7938 ; WX 659 ; N uni1F02 ; G 2556 +U 7939 ; WX 659 ; N uni1F03 ; G 2557 +U 7940 ; WX 659 ; N uni1F04 ; G 2558 +U 7941 ; WX 659 ; N uni1F05 ; G 2559 +U 7942 ; WX 659 ; N uni1F06 ; G 2560 +U 7943 ; WX 659 ; N uni1F07 ; G 2561 +U 7944 ; WX 684 ; N uni1F08 ; G 2562 +U 7945 ; WX 684 ; N uni1F09 ; G 2563 +U 7946 ; WX 877 ; N uni1F0A ; G 2564 +U 7947 ; WX 877 ; N uni1F0B ; G 2565 +U 7948 ; WX 769 ; N uni1F0C ; G 2566 +U 7949 ; WX 801 ; N uni1F0D ; G 2567 +U 7950 ; WX 708 ; N uni1F0E ; G 2568 +U 7951 ; WX 743 ; N uni1F0F ; G 2569 +U 7952 ; WX 541 ; N uni1F10 ; G 2570 +U 7953 ; WX 541 ; N uni1F11 ; G 2571 +U 7954 ; WX 541 ; N uni1F12 ; G 2572 +U 7955 ; WX 541 ; N uni1F13 ; G 2573 +U 7956 ; WX 541 ; N uni1F14 ; G 2574 +U 7957 ; WX 541 ; N uni1F15 ; G 2575 +U 7960 ; WX 711 ; N uni1F18 ; G 2576 +U 7961 ; WX 711 ; N uni1F19 ; G 2577 +U 7962 ; WX 966 ; N uni1F1A ; G 2578 +U 7963 ; WX 975 ; N uni1F1B ; G 2579 +U 7964 ; WX 898 ; N uni1F1C ; G 2580 +U 7965 ; WX 928 ; N uni1F1D ; G 2581 +U 7968 ; WX 634 ; N uni1F20 ; G 2582 +U 7969 ; WX 634 ; N uni1F21 ; G 2583 +U 7970 ; WX 634 ; N uni1F22 ; G 2584 +U 7971 ; WX 634 ; N uni1F23 ; G 2585 +U 7972 ; WX 634 ; N uni1F24 ; G 2586 +U 7973 ; WX 634 ; N uni1F25 ; G 2587 +U 7974 ; WX 634 ; N uni1F26 ; G 2588 +U 7975 ; WX 634 ; N uni1F27 ; G 2589 +U 7976 ; WX 837 ; N uni1F28 ; G 2590 +U 7977 ; WX 835 ; N uni1F29 ; G 2591 +U 7978 ; WX 1086 ; N uni1F2A ; G 2592 +U 7979 ; WX 1089 ; N uni1F2B ; G 2593 +U 7980 ; WX 1027 ; N uni1F2C ; G 2594 +U 7981 ; WX 1051 ; N uni1F2D ; G 2595 +U 7982 ; WX 934 ; N uni1F2E ; G 2596 +U 7983 ; WX 947 ; N uni1F2F ; G 2597 +U 7984 ; WX 338 ; N uni1F30 ; G 2598 +U 7985 ; WX 338 ; N uni1F31 ; G 2599 +U 7986 ; WX 338 ; N uni1F32 ; G 2600 +U 7987 ; WX 338 ; N uni1F33 ; G 2601 +U 7988 ; WX 338 ; N uni1F34 ; G 2602 +U 7989 ; WX 338 ; N uni1F35 ; G 2603 +U 7990 ; WX 338 ; N uni1F36 ; G 2604 +U 7991 ; WX 338 ; N uni1F37 ; G 2605 +U 7992 ; WX 380 ; N uni1F38 ; G 2606 +U 7993 ; WX 374 ; N uni1F39 ; G 2607 +U 7994 ; WX 635 ; N uni1F3A ; G 2608 +U 7995 ; WX 635 ; N uni1F3B ; G 2609 +U 7996 ; WX 570 ; N uni1F3C ; G 2610 +U 7997 ; WX 600 ; N uni1F3D ; G 2611 +U 7998 ; WX 489 ; N uni1F3E ; G 2612 +U 7999 ; WX 493 ; N uni1F3F ; G 2613 +U 8000 ; WX 612 ; N uni1F40 ; G 2614 +U 8001 ; WX 612 ; N uni1F41 ; G 2615 +U 8002 ; WX 612 ; N uni1F42 ; G 2616 +U 8003 ; WX 612 ; N uni1F43 ; G 2617 +U 8004 ; WX 612 ; N uni1F44 ; G 2618 +U 8005 ; WX 612 ; N uni1F45 ; G 2619 +U 8008 ; WX 804 ; N uni1F48 ; G 2620 +U 8009 ; WX 848 ; N uni1F49 ; G 2621 +U 8010 ; WX 1095 ; N uni1F4A ; G 2622 +U 8011 ; WX 1100 ; N uni1F4B ; G 2623 +U 8012 ; WX 938 ; N uni1F4C ; G 2624 +U 8013 ; WX 970 ; N uni1F4D ; G 2625 +U 8016 ; WX 579 ; N uni1F50 ; G 2626 +U 8017 ; WX 579 ; N uni1F51 ; G 2627 +U 8018 ; WX 579 ; N uni1F52 ; G 2628 +U 8019 ; WX 579 ; N uni1F53 ; G 2629 +U 8020 ; WX 579 ; N uni1F54 ; G 2630 +U 8021 ; WX 579 ; N uni1F55 ; G 2631 +U 8022 ; WX 579 ; N uni1F56 ; G 2632 +U 8023 ; WX 579 ; N uni1F57 ; G 2633 +U 8025 ; WX 784 ; N uni1F59 ; G 2634 +U 8027 ; WX 998 ; N uni1F5B ; G 2635 +U 8029 ; WX 1012 ; N uni1F5D ; G 2636 +U 8031 ; WX 897 ; N uni1F5F ; G 2637 +U 8032 ; WX 837 ; N uni1F60 ; G 2638 +U 8033 ; WX 837 ; N uni1F61 ; G 2639 +U 8034 ; WX 837 ; N uni1F62 ; G 2640 +U 8035 ; WX 837 ; N uni1F63 ; G 2641 +U 8036 ; WX 837 ; N uni1F64 ; G 2642 +U 8037 ; WX 837 ; N uni1F65 ; G 2643 +U 8038 ; WX 837 ; N uni1F66 ; G 2644 +U 8039 ; WX 837 ; N uni1F67 ; G 2645 +U 8040 ; WX 802 ; N uni1F68 ; G 2646 +U 8041 ; WX 843 ; N uni1F69 ; G 2647 +U 8042 ; WX 1089 ; N uni1F6A ; G 2648 +U 8043 ; WX 1095 ; N uni1F6B ; G 2649 +U 8044 ; WX 946 ; N uni1F6C ; G 2650 +U 8045 ; WX 972 ; N uni1F6D ; G 2651 +U 8046 ; WX 921 ; N uni1F6E ; G 2652 +U 8047 ; WX 952 ; N uni1F6F ; G 2653 +U 8048 ; WX 659 ; N uni1F70 ; G 2654 +U 8049 ; WX 659 ; N uni1F71 ; G 2655 +U 8050 ; WX 541 ; N uni1F72 ; G 2656 +U 8051 ; WX 548 ; N uni1F73 ; G 2657 +U 8052 ; WX 634 ; N uni1F74 ; G 2658 +U 8053 ; WX 654 ; N uni1F75 ; G 2659 +U 8054 ; WX 338 ; N uni1F76 ; G 2660 +U 8055 ; WX 338 ; N uni1F77 ; G 2661 +U 8056 ; WX 612 ; N uni1F78 ; G 2662 +U 8057 ; WX 612 ; N uni1F79 ; G 2663 +U 8058 ; WX 579 ; N uni1F7A ; G 2664 +U 8059 ; WX 579 ; N uni1F7B ; G 2665 +U 8060 ; WX 837 ; N uni1F7C ; G 2666 +U 8061 ; WX 837 ; N uni1F7D ; G 2667 +U 8064 ; WX 659 ; N uni1F80 ; G 2668 +U 8065 ; WX 659 ; N uni1F81 ; G 2669 +U 8066 ; WX 659 ; N uni1F82 ; G 2670 +U 8067 ; WX 659 ; N uni1F83 ; G 2671 +U 8068 ; WX 659 ; N uni1F84 ; G 2672 +U 8069 ; WX 659 ; N uni1F85 ; G 2673 +U 8070 ; WX 659 ; N uni1F86 ; G 2674 +U 8071 ; WX 659 ; N uni1F87 ; G 2675 +U 8072 ; WX 684 ; N uni1F88 ; G 2676 +U 8073 ; WX 684 ; N uni1F89 ; G 2677 +U 8074 ; WX 877 ; N uni1F8A ; G 2678 +U 8075 ; WX 877 ; N uni1F8B ; G 2679 +U 8076 ; WX 769 ; N uni1F8C ; G 2680 +U 8077 ; WX 801 ; N uni1F8D ; G 2681 +U 8078 ; WX 708 ; N uni1F8E ; G 2682 +U 8079 ; WX 743 ; N uni1F8F ; G 2683 +U 8080 ; WX 634 ; N uni1F90 ; G 2684 +U 8081 ; WX 634 ; N uni1F91 ; G 2685 +U 8082 ; WX 634 ; N uni1F92 ; G 2686 +U 8083 ; WX 634 ; N uni1F93 ; G 2687 +U 8084 ; WX 634 ; N uni1F94 ; G 2688 +U 8085 ; WX 634 ; N uni1F95 ; G 2689 +U 8086 ; WX 634 ; N uni1F96 ; G 2690 +U 8087 ; WX 634 ; N uni1F97 ; G 2691 +U 8088 ; WX 837 ; N uni1F98 ; G 2692 +U 8089 ; WX 835 ; N uni1F99 ; G 2693 +U 8090 ; WX 1086 ; N uni1F9A ; G 2694 +U 8091 ; WX 1089 ; N uni1F9B ; G 2695 +U 8092 ; WX 1027 ; N uni1F9C ; G 2696 +U 8093 ; WX 1051 ; N uni1F9D ; G 2697 +U 8094 ; WX 934 ; N uni1F9E ; G 2698 +U 8095 ; WX 947 ; N uni1F9F ; G 2699 +U 8096 ; WX 837 ; N uni1FA0 ; G 2700 +U 8097 ; WX 837 ; N uni1FA1 ; G 2701 +U 8098 ; WX 837 ; N uni1FA2 ; G 2702 +U 8099 ; WX 837 ; N uni1FA3 ; G 2703 +U 8100 ; WX 837 ; N uni1FA4 ; G 2704 +U 8101 ; WX 837 ; N uni1FA5 ; G 2705 +U 8102 ; WX 837 ; N uni1FA6 ; G 2706 +U 8103 ; WX 837 ; N uni1FA7 ; G 2707 +U 8104 ; WX 802 ; N uni1FA8 ; G 2708 +U 8105 ; WX 843 ; N uni1FA9 ; G 2709 +U 8106 ; WX 1089 ; N uni1FAA ; G 2710 +U 8107 ; WX 1095 ; N uni1FAB ; G 2711 +U 8108 ; WX 946 ; N uni1FAC ; G 2712 +U 8109 ; WX 972 ; N uni1FAD ; G 2713 +U 8110 ; WX 921 ; N uni1FAE ; G 2714 +U 8111 ; WX 952 ; N uni1FAF ; G 2715 +U 8112 ; WX 659 ; N uni1FB0 ; G 2716 +U 8113 ; WX 659 ; N uni1FB1 ; G 2717 +U 8114 ; WX 659 ; N uni1FB2 ; G 2718 +U 8115 ; WX 659 ; N uni1FB3 ; G 2719 +U 8116 ; WX 659 ; N uni1FB4 ; G 2720 +U 8118 ; WX 659 ; N uni1FB6 ; G 2721 +U 8119 ; WX 659 ; N uni1FB7 ; G 2722 +U 8120 ; WX 684 ; N uni1FB8 ; G 2723 +U 8121 ; WX 684 ; N uni1FB9 ; G 2724 +U 8122 ; WX 716 ; N uni1FBA ; G 2725 +U 8123 ; WX 692 ; N uni1FBB ; G 2726 +U 8124 ; WX 684 ; N uni1FBC ; G 2727 +U 8125 ; WX 500 ; N uni1FBD ; G 2728 +U 8126 ; WX 500 ; N uni1FBE ; G 2729 +U 8127 ; WX 500 ; N uni1FBF ; G 2730 +U 8128 ; WX 500 ; N uni1FC0 ; G 2731 +U 8129 ; WX 500 ; N uni1FC1 ; G 2732 +U 8130 ; WX 634 ; N uni1FC2 ; G 2733 +U 8131 ; WX 634 ; N uni1FC3 ; G 2734 +U 8132 ; WX 654 ; N uni1FC4 ; G 2735 +U 8134 ; WX 634 ; N uni1FC6 ; G 2736 +U 8135 ; WX 634 ; N uni1FC7 ; G 2737 +U 8136 ; WX 805 ; N uni1FC8 ; G 2738 +U 8137 ; WX 746 ; N uni1FC9 ; G 2739 +U 8138 ; WX 931 ; N uni1FCA ; G 2740 +U 8139 ; WX 871 ; N uni1FCB ; G 2741 +U 8140 ; WX 752 ; N uni1FCC ; G 2742 +U 8141 ; WX 500 ; N uni1FCD ; G 2743 +U 8142 ; WX 500 ; N uni1FCE ; G 2744 +U 8143 ; WX 500 ; N uni1FCF ; G 2745 +U 8144 ; WX 338 ; N uni1FD0 ; G 2746 +U 8145 ; WX 338 ; N uni1FD1 ; G 2747 +U 8146 ; WX 338 ; N uni1FD2 ; G 2748 +U 8147 ; WX 338 ; N uni1FD3 ; G 2749 +U 8150 ; WX 338 ; N uni1FD6 ; G 2750 +U 8151 ; WX 338 ; N uni1FD7 ; G 2751 +U 8152 ; WX 295 ; N uni1FD8 ; G 2752 +U 8153 ; WX 295 ; N uni1FD9 ; G 2753 +U 8154 ; WX 475 ; N uni1FDA ; G 2754 +U 8155 ; WX 408 ; N uni1FDB ; G 2755 +U 8157 ; WX 500 ; N uni1FDD ; G 2756 +U 8158 ; WX 500 ; N uni1FDE ; G 2757 +U 8159 ; WX 500 ; N uni1FDF ; G 2758 +U 8160 ; WX 579 ; N uni1FE0 ; G 2759 +U 8161 ; WX 579 ; N uni1FE1 ; G 2760 +U 8162 ; WX 579 ; N uni1FE2 ; G 2761 +U 8163 ; WX 579 ; N uni1FE3 ; G 2762 +U 8164 ; WX 635 ; N uni1FE4 ; G 2763 +U 8165 ; WX 635 ; N uni1FE5 ; G 2764 +U 8166 ; WX 579 ; N uni1FE6 ; G 2765 +U 8167 ; WX 579 ; N uni1FE7 ; G 2766 +U 8168 ; WX 611 ; N uni1FE8 ; G 2767 +U 8169 ; WX 611 ; N uni1FE9 ; G 2768 +U 8170 ; WX 845 ; N uni1FEA ; G 2769 +U 8171 ; WX 825 ; N uni1FEB ; G 2770 +U 8172 ; WX 685 ; N uni1FEC ; G 2771 +U 8173 ; WX 500 ; N uni1FED ; G 2772 +U 8174 ; WX 500 ; N uni1FEE ; G 2773 +U 8175 ; WX 500 ; N uni1FEF ; G 2774 +U 8178 ; WX 837 ; N uni1FF2 ; G 2775 +U 8179 ; WX 837 ; N uni1FF3 ; G 2776 +U 8180 ; WX 837 ; N uni1FF4 ; G 2777 +U 8182 ; WX 837 ; N uni1FF6 ; G 2778 +U 8183 ; WX 837 ; N uni1FF7 ; G 2779 +U 8184 ; WX 941 ; N uni1FF8 ; G 2780 +U 8185 ; WX 813 ; N uni1FF9 ; G 2781 +U 8186 ; WX 922 ; N uni1FFA ; G 2782 +U 8187 ; WX 826 ; N uni1FFB ; G 2783 +U 8188 ; WX 764 ; N uni1FFC ; G 2784 +U 8189 ; WX 500 ; N uni1FFD ; G 2785 +U 8190 ; WX 500 ; N uni1FFE ; G 2786 +U 8192 ; WX 500 ; N uni2000 ; G 2787 +U 8193 ; WX 1000 ; N uni2001 ; G 2788 +U 8194 ; WX 500 ; N uni2002 ; G 2789 +U 8195 ; WX 1000 ; N uni2003 ; G 2790 +U 8196 ; WX 330 ; N uni2004 ; G 2791 +U 8197 ; WX 250 ; N uni2005 ; G 2792 +U 8198 ; WX 167 ; N uni2006 ; G 2793 +U 8199 ; WX 636 ; N uni2007 ; G 2794 +U 8200 ; WX 318 ; N uni2008 ; G 2795 +U 8201 ; WX 200 ; N uni2009 ; G 2796 +U 8202 ; WX 100 ; N uni200A ; G 2797 +U 8203 ; WX 0 ; N uni200B ; G 2798 +U 8204 ; WX 0 ; N uni200C ; G 2799 +U 8205 ; WX 0 ; N uni200D ; G 2800 +U 8206 ; WX 0 ; N uni200E ; G 2801 +U 8207 ; WX 0 ; N uni200F ; G 2802 +U 8208 ; WX 361 ; N uni2010 ; G 2803 +U 8209 ; WX 361 ; N uni2011 ; G 2804 +U 8210 ; WX 636 ; N figuredash ; G 2805 +U 8211 ; WX 500 ; N endash ; G 2806 +U 8212 ; WX 1000 ; N emdash ; G 2807 +U 8213 ; WX 1000 ; N uni2015 ; G 2808 +U 8214 ; WX 500 ; N uni2016 ; G 2809 +U 8215 ; WX 500 ; N underscoredbl ; G 2810 +U 8216 ; WX 318 ; N quoteleft ; G 2811 +U 8217 ; WX 318 ; N quoteright ; G 2812 +U 8218 ; WX 318 ; N quotesinglbase ; G 2813 +U 8219 ; WX 318 ; N quotereversed ; G 2814 +U 8220 ; WX 518 ; N quotedblleft ; G 2815 +U 8221 ; WX 518 ; N quotedblright ; G 2816 +U 8222 ; WX 518 ; N quotedblbase ; G 2817 +U 8223 ; WX 518 ; N uni201F ; G 2818 +U 8224 ; WX 500 ; N dagger ; G 2819 +U 8225 ; WX 500 ; N daggerdbl ; G 2820 +U 8226 ; WX 590 ; N bullet ; G 2821 +U 8227 ; WX 590 ; N uni2023 ; G 2822 +U 8228 ; WX 334 ; N onedotenleader ; G 2823 +U 8229 ; WX 667 ; N twodotenleader ; G 2824 +U 8230 ; WX 1000 ; N ellipsis ; G 2825 +U 8231 ; WX 318 ; N uni2027 ; G 2826 +U 8232 ; WX 0 ; N uni2028 ; G 2827 +U 8233 ; WX 0 ; N uni2029 ; G 2828 +U 8234 ; WX 0 ; N uni202A ; G 2829 +U 8235 ; WX 0 ; N uni202B ; G 2830 +U 8236 ; WX 0 ; N uni202C ; G 2831 +U 8237 ; WX 0 ; N uni202D ; G 2832 +U 8238 ; WX 0 ; N uni202E ; G 2833 +U 8239 ; WX 200 ; N uni202F ; G 2834 +U 8240 ; WX 1342 ; N perthousand ; G 2835 +U 8241 ; WX 1735 ; N uni2031 ; G 2836 +U 8242 ; WX 227 ; N minute ; G 2837 +U 8243 ; WX 374 ; N second ; G 2838 +U 8244 ; WX 520 ; N uni2034 ; G 2839 +U 8245 ; WX 227 ; N uni2035 ; G 2840 +U 8246 ; WX 374 ; N uni2036 ; G 2841 +U 8247 ; WX 520 ; N uni2037 ; G 2842 +U 8248 ; WX 339 ; N uni2038 ; G 2843 +U 8249 ; WX 400 ; N guilsinglleft ; G 2844 +U 8250 ; WX 400 ; N guilsinglright ; G 2845 +U 8251 ; WX 838 ; N uni203B ; G 2846 +U 8252 ; WX 485 ; N exclamdbl ; G 2847 +U 8253 ; WX 531 ; N uni203D ; G 2848 +U 8254 ; WX 500 ; N uni203E ; G 2849 +U 8255 ; WX 804 ; N uni203F ; G 2850 +U 8256 ; WX 804 ; N uni2040 ; G 2851 +U 8257 ; WX 250 ; N uni2041 ; G 2852 +U 8258 ; WX 1000 ; N uni2042 ; G 2853 +U 8259 ; WX 500 ; N uni2043 ; G 2854 +U 8260 ; WX 167 ; N fraction ; G 2855 +U 8261 ; WX 390 ; N uni2045 ; G 2856 +U 8262 ; WX 390 ; N uni2046 ; G 2857 +U 8263 ; WX 922 ; N uni2047 ; G 2858 +U 8264 ; WX 733 ; N uni2048 ; G 2859 +U 8265 ; WX 733 ; N uni2049 ; G 2860 +U 8266 ; WX 497 ; N uni204A ; G 2861 +U 8267 ; WX 636 ; N uni204B ; G 2862 +U 8268 ; WX 500 ; N uni204C ; G 2863 +U 8269 ; WX 500 ; N uni204D ; G 2864 +U 8270 ; WX 500 ; N uni204E ; G 2865 +U 8271 ; WX 337 ; N uni204F ; G 2866 +U 8272 ; WX 804 ; N uni2050 ; G 2867 +U 8273 ; WX 500 ; N uni2051 ; G 2868 +U 8274 ; WX 450 ; N uni2052 ; G 2869 +U 8275 ; WX 1000 ; N uni2053 ; G 2870 +U 8276 ; WX 804 ; N uni2054 ; G 2871 +U 8277 ; WX 838 ; N uni2055 ; G 2872 +U 8278 ; WX 586 ; N uni2056 ; G 2873 +U 8279 ; WX 663 ; N uni2057 ; G 2874 +U 8280 ; WX 838 ; N uni2058 ; G 2875 +U 8281 ; WX 838 ; N uni2059 ; G 2876 +U 8282 ; WX 318 ; N uni205A ; G 2877 +U 8283 ; WX 797 ; N uni205B ; G 2878 +U 8284 ; WX 838 ; N uni205C ; G 2879 +U 8285 ; WX 318 ; N uni205D ; G 2880 +U 8286 ; WX 318 ; N uni205E ; G 2881 +U 8287 ; WX 222 ; N uni205F ; G 2882 +U 8288 ; WX 0 ; N uni2060 ; G 2883 +U 8289 ; WX 0 ; N uni2061 ; G 2884 +U 8290 ; WX 0 ; N uni2062 ; G 2885 +U 8291 ; WX 0 ; N uni2063 ; G 2886 +U 8292 ; WX 0 ; N uni2064 ; G 2887 +U 8298 ; WX 0 ; N uni206A ; G 2888 +U 8299 ; WX 0 ; N uni206B ; G 2889 +U 8300 ; WX 0 ; N uni206C ; G 2890 +U 8301 ; WX 0 ; N uni206D ; G 2891 +U 8302 ; WX 0 ; N uni206E ; G 2892 +U 8303 ; WX 0 ; N uni206F ; G 2893 +U 8304 ; WX 401 ; N uni2070 ; G 2894 +U 8305 ; WX 179 ; N uni2071 ; G 2895 +U 8308 ; WX 401 ; N uni2074 ; G 2896 +U 8309 ; WX 401 ; N uni2075 ; G 2897 +U 8310 ; WX 401 ; N uni2076 ; G 2898 +U 8311 ; WX 401 ; N uni2077 ; G 2899 +U 8312 ; WX 401 ; N uni2078 ; G 2900 +U 8313 ; WX 401 ; N uni2079 ; G 2901 +U 8314 ; WX 528 ; N uni207A ; G 2902 +U 8315 ; WX 528 ; N uni207B ; G 2903 +U 8316 ; WX 528 ; N uni207C ; G 2904 +U 8317 ; WX 246 ; N uni207D ; G 2905 +U 8318 ; WX 246 ; N uni207E ; G 2906 +U 8319 ; WX 398 ; N uni207F ; G 2907 +U 8320 ; WX 401 ; N uni2080 ; G 2908 +U 8321 ; WX 401 ; N uni2081 ; G 2909 +U 8322 ; WX 401 ; N uni2082 ; G 2910 +U 8323 ; WX 401 ; N uni2083 ; G 2911 +U 8324 ; WX 401 ; N uni2084 ; G 2912 +U 8325 ; WX 401 ; N uni2085 ; G 2913 +U 8326 ; WX 401 ; N uni2086 ; G 2914 +U 8327 ; WX 401 ; N uni2087 ; G 2915 +U 8328 ; WX 401 ; N uni2088 ; G 2916 +U 8329 ; WX 401 ; N uni2089 ; G 2917 +U 8330 ; WX 528 ; N uni208A ; G 2918 +U 8331 ; WX 528 ; N uni208B ; G 2919 +U 8332 ; WX 528 ; N uni208C ; G 2920 +U 8333 ; WX 246 ; N uni208D ; G 2921 +U 8334 ; WX 246 ; N uni208E ; G 2922 +U 8336 ; WX 392 ; N uni2090 ; G 2923 +U 8337 ; WX 417 ; N uni2091 ; G 2924 +U 8338 ; WX 414 ; N uni2092 ; G 2925 +U 8339 ; WX 444 ; N uni2093 ; G 2926 +U 8340 ; WX 417 ; N uni2094 ; G 2927 +U 8341 ; WX 404 ; N uni2095 ; G 2928 +U 8342 ; WX 426 ; N uni2096 ; G 2929 +U 8343 ; WX 166 ; N uni2097 ; G 2930 +U 8344 ; WX 623 ; N uni2098 ; G 2931 +U 8345 ; WX 398 ; N uni2099 ; G 2932 +U 8346 ; WX 428 ; N uni209A ; G 2933 +U 8347 ; WX 373 ; N uni209B ; G 2934 +U 8348 ; WX 295 ; N uni209C ; G 2935 +U 8352 ; WX 877 ; N uni20A0 ; G 2936 +U 8353 ; WX 636 ; N colonmonetary ; G 2937 +U 8354 ; WX 636 ; N uni20A2 ; G 2938 +U 8355 ; WX 636 ; N franc ; G 2939 +U 8356 ; WX 636 ; N lira ; G 2940 +U 8357 ; WX 974 ; N uni20A5 ; G 2941 +U 8358 ; WX 636 ; N uni20A6 ; G 2942 +U 8359 ; WX 1272 ; N peseta ; G 2943 +U 8360 ; WX 1074 ; N uni20A8 ; G 2944 +U 8361 ; WX 989 ; N uni20A9 ; G 2945 +U 8362 ; WX 784 ; N uni20AA ; G 2946 +U 8363 ; WX 636 ; N dong ; G 2947 +U 8364 ; WX 636 ; N Euro ; G 2948 +U 8365 ; WX 636 ; N uni20AD ; G 2949 +U 8366 ; WX 636 ; N uni20AE ; G 2950 +U 8367 ; WX 1272 ; N uni20AF ; G 2951 +U 8368 ; WX 636 ; N uni20B0 ; G 2952 +U 8369 ; WX 636 ; N uni20B1 ; G 2953 +U 8370 ; WX 636 ; N uni20B2 ; G 2954 +U 8371 ; WX 636 ; N uni20B3 ; G 2955 +U 8372 ; WX 774 ; N uni20B4 ; G 2956 +U 8373 ; WX 636 ; N uni20B5 ; G 2957 +U 8376 ; WX 636 ; N uni20B8 ; G 2958 +U 8377 ; WX 636 ; N uni20B9 ; G 2959 +U 8378 ; WX 636 ; N uni20BA ; G 2960 +U 8381 ; WX 636 ; N uni20BD ; G 2961 +U 8400 ; WX 0 ; N uni20D0 ; G 2962 +U 8401 ; WX 0 ; N uni20D1 ; G 2963 +U 8406 ; WX 0 ; N uni20D6 ; G 2964 +U 8407 ; WX 0 ; N uni20D7 ; G 2965 +U 8411 ; WX 0 ; N uni20DB ; G 2966 +U 8412 ; WX 0 ; N uni20DC ; G 2967 +U 8417 ; WX 0 ; N uni20E1 ; G 2968 +U 8448 ; WX 1019 ; N uni2100 ; G 2969 +U 8449 ; WX 1019 ; N uni2101 ; G 2970 +U 8450 ; WX 698 ; N uni2102 ; G 2971 +U 8451 ; WX 1123 ; N uni2103 ; G 2972 +U 8452 ; WX 642 ; N uni2104 ; G 2973 +U 8453 ; WX 1019 ; N uni2105 ; G 2974 +U 8454 ; WX 1067 ; N uni2106 ; G 2975 +U 8455 ; WX 614 ; N uni2107 ; G 2976 +U 8456 ; WX 698 ; N uni2108 ; G 2977 +U 8457 ; WX 952 ; N uni2109 ; G 2978 +U 8459 ; WX 988 ; N uni210B ; G 2979 +U 8460 ; WX 754 ; N uni210C ; G 2980 +U 8461 ; WX 850 ; N uni210D ; G 2981 +U 8462 ; WX 634 ; N uni210E ; G 2982 +U 8463 ; WX 634 ; N uni210F ; G 2983 +U 8464 ; WX 470 ; N uni2110 ; G 2984 +U 8465 ; WX 697 ; N Ifraktur ; G 2985 +U 8466 ; WX 720 ; N uni2112 ; G 2986 +U 8467 ; WX 413 ; N uni2113 ; G 2987 +U 8468 ; WX 818 ; N uni2114 ; G 2988 +U 8469 ; WX 801 ; N uni2115 ; G 2989 +U 8470 ; WX 1040 ; N uni2116 ; G 2990 +U 8471 ; WX 1000 ; N uni2117 ; G 2991 +U 8472 ; WX 697 ; N weierstrass ; G 2992 +U 8473 ; WX 701 ; N uni2119 ; G 2993 +U 8474 ; WX 787 ; N uni211A ; G 2994 +U 8475 ; WX 798 ; N uni211B ; G 2995 +U 8476 ; WX 814 ; N Rfraktur ; G 2996 +U 8477 ; WX 792 ; N uni211D ; G 2997 +U 8478 ; WX 896 ; N prescription ; G 2998 +U 8479 ; WX 684 ; N uni211F ; G 2999 +U 8480 ; WX 1020 ; N uni2120 ; G 3000 +U 8481 ; WX 1074 ; N uni2121 ; G 3001 +U 8482 ; WX 1000 ; N trademark ; G 3002 +U 8483 ; WX 684 ; N uni2123 ; G 3003 +U 8484 ; WX 745 ; N uni2124 ; G 3004 +U 8485 ; WX 578 ; N uni2125 ; G 3005 +U 8486 ; WX 764 ; N uni2126 ; G 3006 +U 8487 ; WX 764 ; N uni2127 ; G 3007 +U 8488 ; WX 616 ; N uni2128 ; G 3008 +U 8489 ; WX 338 ; N uni2129 ; G 3009 +U 8490 ; WX 656 ; N uni212A ; G 3010 +U 8491 ; WX 684 ; N uni212B ; G 3011 +U 8492 ; WX 786 ; N uni212C ; G 3012 +U 8493 ; WX 703 ; N uni212D ; G 3013 +U 8494 ; WX 854 ; N estimated ; G 3014 +U 8495 ; WX 592 ; N uni212F ; G 3015 +U 8496 ; WX 605 ; N uni2130 ; G 3016 +U 8497 ; WX 786 ; N uni2131 ; G 3017 +U 8498 ; WX 575 ; N uni2132 ; G 3018 +U 8499 ; WX 1069 ; N uni2133 ; G 3019 +U 8500 ; WX 462 ; N uni2134 ; G 3020 +U 8501 ; WX 745 ; N aleph ; G 3021 +U 8502 ; WX 674 ; N uni2136 ; G 3022 +U 8503 ; WX 466 ; N uni2137 ; G 3023 +U 8504 ; WX 645 ; N uni2138 ; G 3024 +U 8505 ; WX 380 ; N uni2139 ; G 3025 +U 8506 ; WX 926 ; N uni213A ; G 3026 +U 8507 ; WX 1194 ; N uni213B ; G 3027 +U 8508 ; WX 702 ; N uni213C ; G 3028 +U 8509 ; WX 728 ; N uni213D ; G 3029 +U 8510 ; WX 654 ; N uni213E ; G 3030 +U 8511 ; WX 849 ; N uni213F ; G 3031 +U 8512 ; WX 811 ; N uni2140 ; G 3032 +U 8513 ; WX 775 ; N uni2141 ; G 3033 +U 8514 ; WX 557 ; N uni2142 ; G 3034 +U 8515 ; WX 557 ; N uni2143 ; G 3035 +U 8516 ; WX 611 ; N uni2144 ; G 3036 +U 8517 ; WX 819 ; N uni2145 ; G 3037 +U 8518 ; WX 708 ; N uni2146 ; G 3038 +U 8519 ; WX 615 ; N uni2147 ; G 3039 +U 8520 ; WX 351 ; N uni2148 ; G 3040 +U 8521 ; WX 351 ; N uni2149 ; G 3041 +U 8523 ; WX 780 ; N uni214B ; G 3042 +U 8526 ; WX 526 ; N uni214E ; G 3043 +U 8528 ; WX 969 ; N uni2150 ; G 3044 +U 8529 ; WX 969 ; N uni2151 ; G 3045 +U 8530 ; WX 1370 ; N uni2152 ; G 3046 +U 8531 ; WX 969 ; N onethird ; G 3047 +U 8532 ; WX 969 ; N twothirds ; G 3048 +U 8533 ; WX 969 ; N uni2155 ; G 3049 +U 8534 ; WX 969 ; N uni2156 ; G 3050 +U 8535 ; WX 969 ; N uni2157 ; G 3051 +U 8536 ; WX 969 ; N uni2158 ; G 3052 +U 8537 ; WX 969 ; N uni2159 ; G 3053 +U 8538 ; WX 969 ; N uni215A ; G 3054 +U 8539 ; WX 969 ; N oneeighth ; G 3055 +U 8540 ; WX 969 ; N threeeighths ; G 3056 +U 8541 ; WX 969 ; N fiveeighths ; G 3057 +U 8542 ; WX 969 ; N seveneighths ; G 3058 +U 8543 ; WX 568 ; N uni215F ; G 3059 +U 8544 ; WX 295 ; N uni2160 ; G 3060 +U 8545 ; WX 492 ; N uni2161 ; G 3061 +U 8546 ; WX 689 ; N uni2162 ; G 3062 +U 8547 ; WX 923 ; N uni2163 ; G 3063 +U 8548 ; WX 684 ; N uni2164 ; G 3064 +U 8549 ; WX 922 ; N uni2165 ; G 3065 +U 8550 ; WX 1120 ; N uni2166 ; G 3066 +U 8551 ; WX 1317 ; N uni2167 ; G 3067 +U 8552 ; WX 917 ; N uni2168 ; G 3068 +U 8553 ; WX 685 ; N uni2169 ; G 3069 +U 8554 ; WX 933 ; N uni216A ; G 3070 +U 8555 ; WX 1131 ; N uni216B ; G 3071 +U 8556 ; WX 557 ; N uni216C ; G 3072 +U 8557 ; WX 698 ; N uni216D ; G 3073 +U 8558 ; WX 770 ; N uni216E ; G 3074 +U 8559 ; WX 863 ; N uni216F ; G 3075 +U 8560 ; WX 278 ; N uni2170 ; G 3076 +U 8561 ; WX 458 ; N uni2171 ; G 3077 +U 8562 ; WX 637 ; N uni2172 ; G 3078 +U 8563 ; WX 812 ; N uni2173 ; G 3079 +U 8564 ; WX 592 ; N uni2174 ; G 3080 +U 8565 ; WX 811 ; N uni2175 ; G 3081 +U 8566 ; WX 991 ; N uni2176 ; G 3082 +U 8567 ; WX 1170 ; N uni2177 ; G 3083 +U 8568 ; WX 819 ; N uni2178 ; G 3084 +U 8569 ; WX 592 ; N uni2179 ; G 3085 +U 8570 ; WX 822 ; N uni217A ; G 3086 +U 8571 ; WX 1002 ; N uni217B ; G 3087 +U 8572 ; WX 278 ; N uni217C ; G 3088 +U 8573 ; WX 550 ; N uni217D ; G 3089 +U 8574 ; WX 635 ; N uni217E ; G 3090 +U 8575 ; WX 974 ; N uni217F ; G 3091 +U 8576 ; WX 1245 ; N uni2180 ; G 3092 +U 8577 ; WX 770 ; N uni2181 ; G 3093 +U 8578 ; WX 1245 ; N uni2182 ; G 3094 +U 8579 ; WX 703 ; N uni2183 ; G 3095 +U 8580 ; WX 549 ; N uni2184 ; G 3096 +U 8581 ; WX 698 ; N uni2185 ; G 3097 +U 8585 ; WX 969 ; N uni2189 ; G 3098 +U 8592 ; WX 838 ; N arrowleft ; G 3099 +U 8593 ; WX 838 ; N arrowup ; G 3100 +U 8594 ; WX 838 ; N arrowright ; G 3101 +U 8595 ; WX 838 ; N arrowdown ; G 3102 +U 8596 ; WX 838 ; N arrowboth ; G 3103 +U 8597 ; WX 838 ; N arrowupdn ; G 3104 +U 8598 ; WX 838 ; N uni2196 ; G 3105 +U 8599 ; WX 838 ; N uni2197 ; G 3106 +U 8600 ; WX 838 ; N uni2198 ; G 3107 +U 8601 ; WX 838 ; N uni2199 ; G 3108 +U 8602 ; WX 838 ; N uni219A ; G 3109 +U 8603 ; WX 838 ; N uni219B ; G 3110 +U 8604 ; WX 838 ; N uni219C ; G 3111 +U 8605 ; WX 838 ; N uni219D ; G 3112 +U 8606 ; WX 838 ; N uni219E ; G 3113 +U 8607 ; WX 838 ; N uni219F ; G 3114 +U 8608 ; WX 838 ; N uni21A0 ; G 3115 +U 8609 ; WX 838 ; N uni21A1 ; G 3116 +U 8610 ; WX 838 ; N uni21A2 ; G 3117 +U 8611 ; WX 838 ; N uni21A3 ; G 3118 +U 8612 ; WX 838 ; N uni21A4 ; G 3119 +U 8613 ; WX 838 ; N uni21A5 ; G 3120 +U 8614 ; WX 838 ; N uni21A6 ; G 3121 +U 8615 ; WX 838 ; N uni21A7 ; G 3122 +U 8616 ; WX 838 ; N arrowupdnbse ; G 3123 +U 8617 ; WX 838 ; N uni21A9 ; G 3124 +U 8618 ; WX 838 ; N uni21AA ; G 3125 +U 8619 ; WX 838 ; N uni21AB ; G 3126 +U 8620 ; WX 838 ; N uni21AC ; G 3127 +U 8621 ; WX 838 ; N uni21AD ; G 3128 +U 8622 ; WX 838 ; N uni21AE ; G 3129 +U 8623 ; WX 838 ; N uni21AF ; G 3130 +U 8624 ; WX 838 ; N uni21B0 ; G 3131 +U 8625 ; WX 838 ; N uni21B1 ; G 3132 +U 8626 ; WX 838 ; N uni21B2 ; G 3133 +U 8627 ; WX 838 ; N uni21B3 ; G 3134 +U 8628 ; WX 838 ; N uni21B4 ; G 3135 +U 8629 ; WX 838 ; N carriagereturn ; G 3136 +U 8630 ; WX 838 ; N uni21B6 ; G 3137 +U 8631 ; WX 838 ; N uni21B7 ; G 3138 +U 8632 ; WX 838 ; N uni21B8 ; G 3139 +U 8633 ; WX 838 ; N uni21B9 ; G 3140 +U 8634 ; WX 838 ; N uni21BA ; G 3141 +U 8635 ; WX 838 ; N uni21BB ; G 3142 +U 8636 ; WX 838 ; N uni21BC ; G 3143 +U 8637 ; WX 838 ; N uni21BD ; G 3144 +U 8638 ; WX 838 ; N uni21BE ; G 3145 +U 8639 ; WX 838 ; N uni21BF ; G 3146 +U 8640 ; WX 838 ; N uni21C0 ; G 3147 +U 8641 ; WX 838 ; N uni21C1 ; G 3148 +U 8642 ; WX 838 ; N uni21C2 ; G 3149 +U 8643 ; WX 838 ; N uni21C3 ; G 3150 +U 8644 ; WX 838 ; N uni21C4 ; G 3151 +U 8645 ; WX 838 ; N uni21C5 ; G 3152 +U 8646 ; WX 838 ; N uni21C6 ; G 3153 +U 8647 ; WX 838 ; N uni21C7 ; G 3154 +U 8648 ; WX 838 ; N uni21C8 ; G 3155 +U 8649 ; WX 838 ; N uni21C9 ; G 3156 +U 8650 ; WX 838 ; N uni21CA ; G 3157 +U 8651 ; WX 838 ; N uni21CB ; G 3158 +U 8652 ; WX 838 ; N uni21CC ; G 3159 +U 8653 ; WX 838 ; N uni21CD ; G 3160 +U 8654 ; WX 838 ; N uni21CE ; G 3161 +U 8655 ; WX 838 ; N uni21CF ; G 3162 +U 8656 ; WX 838 ; N arrowdblleft ; G 3163 +U 8657 ; WX 838 ; N arrowdblup ; G 3164 +U 8658 ; WX 838 ; N arrowdblright ; G 3165 +U 8659 ; WX 838 ; N arrowdbldown ; G 3166 +U 8660 ; WX 838 ; N arrowdblboth ; G 3167 +U 8661 ; WX 838 ; N uni21D5 ; G 3168 +U 8662 ; WX 838 ; N uni21D6 ; G 3169 +U 8663 ; WX 838 ; N uni21D7 ; G 3170 +U 8664 ; WX 838 ; N uni21D8 ; G 3171 +U 8665 ; WX 838 ; N uni21D9 ; G 3172 +U 8666 ; WX 838 ; N uni21DA ; G 3173 +U 8667 ; WX 838 ; N uni21DB ; G 3174 +U 8668 ; WX 838 ; N uni21DC ; G 3175 +U 8669 ; WX 838 ; N uni21DD ; G 3176 +U 8670 ; WX 838 ; N uni21DE ; G 3177 +U 8671 ; WX 838 ; N uni21DF ; G 3178 +U 8672 ; WX 838 ; N uni21E0 ; G 3179 +U 8673 ; WX 838 ; N uni21E1 ; G 3180 +U 8674 ; WX 838 ; N uni21E2 ; G 3181 +U 8675 ; WX 838 ; N uni21E3 ; G 3182 +U 8676 ; WX 838 ; N uni21E4 ; G 3183 +U 8677 ; WX 838 ; N uni21E5 ; G 3184 +U 8678 ; WX 838 ; N uni21E6 ; G 3185 +U 8679 ; WX 838 ; N uni21E7 ; G 3186 +U 8680 ; WX 838 ; N uni21E8 ; G 3187 +U 8681 ; WX 838 ; N uni21E9 ; G 3188 +U 8682 ; WX 838 ; N uni21EA ; G 3189 +U 8683 ; WX 838 ; N uni21EB ; G 3190 +U 8684 ; WX 838 ; N uni21EC ; G 3191 +U 8685 ; WX 838 ; N uni21ED ; G 3192 +U 8686 ; WX 838 ; N uni21EE ; G 3193 +U 8687 ; WX 838 ; N uni21EF ; G 3194 +U 8688 ; WX 838 ; N uni21F0 ; G 3195 +U 8689 ; WX 838 ; N uni21F1 ; G 3196 +U 8690 ; WX 838 ; N uni21F2 ; G 3197 +U 8691 ; WX 838 ; N uni21F3 ; G 3198 +U 8692 ; WX 838 ; N uni21F4 ; G 3199 +U 8693 ; WX 838 ; N uni21F5 ; G 3200 +U 8694 ; WX 838 ; N uni21F6 ; G 3201 +U 8695 ; WX 838 ; N uni21F7 ; G 3202 +U 8696 ; WX 838 ; N uni21F8 ; G 3203 +U 8697 ; WX 838 ; N uni21F9 ; G 3204 +U 8698 ; WX 838 ; N uni21FA ; G 3205 +U 8699 ; WX 838 ; N uni21FB ; G 3206 +U 8700 ; WX 838 ; N uni21FC ; G 3207 +U 8701 ; WX 838 ; N uni21FD ; G 3208 +U 8702 ; WX 838 ; N uni21FE ; G 3209 +U 8703 ; WX 838 ; N uni21FF ; G 3210 +U 8704 ; WX 684 ; N universal ; G 3211 +U 8705 ; WX 636 ; N uni2201 ; G 3212 +U 8706 ; WX 517 ; N partialdiff ; G 3213 +U 8707 ; WX 632 ; N existential ; G 3214 +U 8708 ; WX 632 ; N uni2204 ; G 3215 +U 8709 ; WX 871 ; N emptyset ; G 3216 +U 8710 ; WX 669 ; N increment ; G 3217 +U 8711 ; WX 669 ; N gradient ; G 3218 +U 8712 ; WX 871 ; N element ; G 3219 +U 8713 ; WX 871 ; N notelement ; G 3220 +U 8714 ; WX 718 ; N uni220A ; G 3221 +U 8715 ; WX 871 ; N suchthat ; G 3222 +U 8716 ; WX 871 ; N uni220C ; G 3223 +U 8717 ; WX 718 ; N uni220D ; G 3224 +U 8718 ; WX 636 ; N uni220E ; G 3225 +U 8719 ; WX 757 ; N product ; G 3226 +U 8720 ; WX 757 ; N uni2210 ; G 3227 +U 8721 ; WX 674 ; N summation ; G 3228 +U 8722 ; WX 838 ; N minus ; G 3229 +U 8723 ; WX 838 ; N uni2213 ; G 3230 +U 8724 ; WX 838 ; N uni2214 ; G 3231 +U 8725 ; WX 337 ; N uni2215 ; G 3232 +U 8726 ; WX 637 ; N uni2216 ; G 3233 +U 8727 ; WX 838 ; N asteriskmath ; G 3234 +U 8728 ; WX 626 ; N uni2218 ; G 3235 +U 8729 ; WX 626 ; N uni2219 ; G 3236 +U 8730 ; WX 637 ; N radical ; G 3237 +U 8731 ; WX 637 ; N uni221B ; G 3238 +U 8732 ; WX 637 ; N uni221C ; G 3239 +U 8733 ; WX 714 ; N proportional ; G 3240 +U 8734 ; WX 833 ; N infinity ; G 3241 +U 8735 ; WX 838 ; N orthogonal ; G 3242 +U 8736 ; WX 896 ; N angle ; G 3243 +U 8737 ; WX 896 ; N uni2221 ; G 3244 +U 8738 ; WX 838 ; N uni2222 ; G 3245 +U 8739 ; WX 500 ; N uni2223 ; G 3246 +U 8740 ; WX 500 ; N uni2224 ; G 3247 +U 8741 ; WX 500 ; N uni2225 ; G 3248 +U 8742 ; WX 500 ; N uni2226 ; G 3249 +U 8743 ; WX 732 ; N logicaland ; G 3250 +U 8744 ; WX 732 ; N logicalor ; G 3251 +U 8745 ; WX 732 ; N intersection ; G 3252 +U 8746 ; WX 732 ; N union ; G 3253 +U 8747 ; WX 521 ; N integral ; G 3254 +U 8748 ; WX 789 ; N uni222C ; G 3255 +U 8749 ; WX 1057 ; N uni222D ; G 3256 +U 8750 ; WX 521 ; N uni222E ; G 3257 +U 8751 ; WX 789 ; N uni222F ; G 3258 +U 8752 ; WX 1057 ; N uni2230 ; G 3259 +U 8753 ; WX 521 ; N uni2231 ; G 3260 +U 8754 ; WX 521 ; N uni2232 ; G 3261 +U 8755 ; WX 521 ; N uni2233 ; G 3262 +U 8756 ; WX 636 ; N therefore ; G 3263 +U 8757 ; WX 636 ; N uni2235 ; G 3264 +U 8758 ; WX 260 ; N uni2236 ; G 3265 +U 8759 ; WX 636 ; N uni2237 ; G 3266 +U 8760 ; WX 838 ; N uni2238 ; G 3267 +U 8761 ; WX 838 ; N uni2239 ; G 3268 +U 8762 ; WX 838 ; N uni223A ; G 3269 +U 8763 ; WX 838 ; N uni223B ; G 3270 +U 8764 ; WX 838 ; N similar ; G 3271 +U 8765 ; WX 838 ; N uni223D ; G 3272 +U 8766 ; WX 838 ; N uni223E ; G 3273 +U 8767 ; WX 838 ; N uni223F ; G 3274 +U 8768 ; WX 375 ; N uni2240 ; G 3275 +U 8769 ; WX 838 ; N uni2241 ; G 3276 +U 8770 ; WX 838 ; N uni2242 ; G 3277 +U 8771 ; WX 838 ; N uni2243 ; G 3278 +U 8772 ; WX 838 ; N uni2244 ; G 3279 +U 8773 ; WX 838 ; N congruent ; G 3280 +U 8774 ; WX 838 ; N uni2246 ; G 3281 +U 8775 ; WX 838 ; N uni2247 ; G 3282 +U 8776 ; WX 838 ; N approxequal ; G 3283 +U 8777 ; WX 838 ; N uni2249 ; G 3284 +U 8778 ; WX 838 ; N uni224A ; G 3285 +U 8779 ; WX 838 ; N uni224B ; G 3286 +U 8780 ; WX 838 ; N uni224C ; G 3287 +U 8781 ; WX 838 ; N uni224D ; G 3288 +U 8782 ; WX 838 ; N uni224E ; G 3289 +U 8783 ; WX 838 ; N uni224F ; G 3290 +U 8784 ; WX 838 ; N uni2250 ; G 3291 +U 8785 ; WX 838 ; N uni2251 ; G 3292 +U 8786 ; WX 839 ; N uni2252 ; G 3293 +U 8787 ; WX 839 ; N uni2253 ; G 3294 +U 8788 ; WX 1000 ; N uni2254 ; G 3295 +U 8789 ; WX 1000 ; N uni2255 ; G 3296 +U 8790 ; WX 838 ; N uni2256 ; G 3297 +U 8791 ; WX 838 ; N uni2257 ; G 3298 +U 8792 ; WX 838 ; N uni2258 ; G 3299 +U 8793 ; WX 838 ; N uni2259 ; G 3300 +U 8794 ; WX 838 ; N uni225A ; G 3301 +U 8795 ; WX 838 ; N uni225B ; G 3302 +U 8796 ; WX 838 ; N uni225C ; G 3303 +U 8797 ; WX 838 ; N uni225D ; G 3304 +U 8798 ; WX 838 ; N uni225E ; G 3305 +U 8799 ; WX 838 ; N uni225F ; G 3306 +U 8800 ; WX 838 ; N notequal ; G 3307 +U 8801 ; WX 838 ; N equivalence ; G 3308 +U 8802 ; WX 838 ; N uni2262 ; G 3309 +U 8803 ; WX 838 ; N uni2263 ; G 3310 +U 8804 ; WX 838 ; N lessequal ; G 3311 +U 8805 ; WX 838 ; N greaterequal ; G 3312 +U 8806 ; WX 838 ; N uni2266 ; G 3313 +U 8807 ; WX 838 ; N uni2267 ; G 3314 +U 8808 ; WX 838 ; N uni2268 ; G 3315 +U 8809 ; WX 838 ; N uni2269 ; G 3316 +U 8810 ; WX 1047 ; N uni226A ; G 3317 +U 8811 ; WX 1047 ; N uni226B ; G 3318 +U 8812 ; WX 464 ; N uni226C ; G 3319 +U 8813 ; WX 838 ; N uni226D ; G 3320 +U 8814 ; WX 838 ; N uni226E ; G 3321 +U 8815 ; WX 838 ; N uni226F ; G 3322 +U 8816 ; WX 838 ; N uni2270 ; G 3323 +U 8817 ; WX 838 ; N uni2271 ; G 3324 +U 8818 ; WX 838 ; N uni2272 ; G 3325 +U 8819 ; WX 838 ; N uni2273 ; G 3326 +U 8820 ; WX 838 ; N uni2274 ; G 3327 +U 8821 ; WX 838 ; N uni2275 ; G 3328 +U 8822 ; WX 838 ; N uni2276 ; G 3329 +U 8823 ; WX 838 ; N uni2277 ; G 3330 +U 8824 ; WX 838 ; N uni2278 ; G 3331 +U 8825 ; WX 838 ; N uni2279 ; G 3332 +U 8826 ; WX 838 ; N uni227A ; G 3333 +U 8827 ; WX 838 ; N uni227B ; G 3334 +U 8828 ; WX 838 ; N uni227C ; G 3335 +U 8829 ; WX 838 ; N uni227D ; G 3336 +U 8830 ; WX 838 ; N uni227E ; G 3337 +U 8831 ; WX 838 ; N uni227F ; G 3338 +U 8832 ; WX 838 ; N uni2280 ; G 3339 +U 8833 ; WX 838 ; N uni2281 ; G 3340 +U 8834 ; WX 838 ; N propersubset ; G 3341 +U 8835 ; WX 838 ; N propersuperset ; G 3342 +U 8836 ; WX 838 ; N notsubset ; G 3343 +U 8837 ; WX 838 ; N uni2285 ; G 3344 +U 8838 ; WX 838 ; N reflexsubset ; G 3345 +U 8839 ; WX 838 ; N reflexsuperset ; G 3346 +U 8840 ; WX 838 ; N uni2288 ; G 3347 +U 8841 ; WX 838 ; N uni2289 ; G 3348 +U 8842 ; WX 838 ; N uni228A ; G 3349 +U 8843 ; WX 838 ; N uni228B ; G 3350 +U 8844 ; WX 732 ; N uni228C ; G 3351 +U 8845 ; WX 732 ; N uni228D ; G 3352 +U 8846 ; WX 732 ; N uni228E ; G 3353 +U 8847 ; WX 838 ; N uni228F ; G 3354 +U 8848 ; WX 838 ; N uni2290 ; G 3355 +U 8849 ; WX 838 ; N uni2291 ; G 3356 +U 8850 ; WX 838 ; N uni2292 ; G 3357 +U 8851 ; WX 780 ; N uni2293 ; G 3358 +U 8852 ; WX 780 ; N uni2294 ; G 3359 +U 8853 ; WX 838 ; N circleplus ; G 3360 +U 8854 ; WX 838 ; N uni2296 ; G 3361 +U 8855 ; WX 838 ; N circlemultiply ; G 3362 +U 8856 ; WX 838 ; N uni2298 ; G 3363 +U 8857 ; WX 838 ; N uni2299 ; G 3364 +U 8858 ; WX 838 ; N uni229A ; G 3365 +U 8859 ; WX 838 ; N uni229B ; G 3366 +U 8860 ; WX 838 ; N uni229C ; G 3367 +U 8861 ; WX 838 ; N uni229D ; G 3368 +U 8862 ; WX 838 ; N uni229E ; G 3369 +U 8863 ; WX 838 ; N uni229F ; G 3370 +U 8864 ; WX 838 ; N uni22A0 ; G 3371 +U 8865 ; WX 838 ; N uni22A1 ; G 3372 +U 8866 ; WX 871 ; N uni22A2 ; G 3373 +U 8867 ; WX 871 ; N uni22A3 ; G 3374 +U 8868 ; WX 871 ; N uni22A4 ; G 3375 +U 8869 ; WX 871 ; N perpendicular ; G 3376 +U 8870 ; WX 521 ; N uni22A6 ; G 3377 +U 8871 ; WX 521 ; N uni22A7 ; G 3378 +U 8872 ; WX 871 ; N uni22A8 ; G 3379 +U 8873 ; WX 871 ; N uni22A9 ; G 3380 +U 8874 ; WX 871 ; N uni22AA ; G 3381 +U 8875 ; WX 871 ; N uni22AB ; G 3382 +U 8876 ; WX 871 ; N uni22AC ; G 3383 +U 8877 ; WX 871 ; N uni22AD ; G 3384 +U 8878 ; WX 871 ; N uni22AE ; G 3385 +U 8879 ; WX 871 ; N uni22AF ; G 3386 +U 8880 ; WX 838 ; N uni22B0 ; G 3387 +U 8881 ; WX 838 ; N uni22B1 ; G 3388 +U 8882 ; WX 838 ; N uni22B2 ; G 3389 +U 8883 ; WX 838 ; N uni22B3 ; G 3390 +U 8884 ; WX 838 ; N uni22B4 ; G 3391 +U 8885 ; WX 838 ; N uni22B5 ; G 3392 +U 8886 ; WX 1000 ; N uni22B6 ; G 3393 +U 8887 ; WX 1000 ; N uni22B7 ; G 3394 +U 8888 ; WX 838 ; N uni22B8 ; G 3395 +U 8889 ; WX 838 ; N uni22B9 ; G 3396 +U 8890 ; WX 521 ; N uni22BA ; G 3397 +U 8891 ; WX 732 ; N uni22BB ; G 3398 +U 8892 ; WX 732 ; N uni22BC ; G 3399 +U 8893 ; WX 732 ; N uni22BD ; G 3400 +U 8894 ; WX 838 ; N uni22BE ; G 3401 +U 8895 ; WX 838 ; N uni22BF ; G 3402 +U 8896 ; WX 820 ; N uni22C0 ; G 3403 +U 8897 ; WX 820 ; N uni22C1 ; G 3404 +U 8898 ; WX 820 ; N uni22C2 ; G 3405 +U 8899 ; WX 820 ; N uni22C3 ; G 3406 +U 8900 ; WX 626 ; N uni22C4 ; G 3407 +U 8901 ; WX 318 ; N dotmath ; G 3408 +U 8902 ; WX 626 ; N uni22C6 ; G 3409 +U 8903 ; WX 838 ; N uni22C7 ; G 3410 +U 8904 ; WX 1000 ; N uni22C8 ; G 3411 +U 8905 ; WX 1000 ; N uni22C9 ; G 3412 +U 8906 ; WX 1000 ; N uni22CA ; G 3413 +U 8907 ; WX 1000 ; N uni22CB ; G 3414 +U 8908 ; WX 1000 ; N uni22CC ; G 3415 +U 8909 ; WX 838 ; N uni22CD ; G 3416 +U 8910 ; WX 732 ; N uni22CE ; G 3417 +U 8911 ; WX 732 ; N uni22CF ; G 3418 +U 8912 ; WX 838 ; N uni22D0 ; G 3419 +U 8913 ; WX 838 ; N uni22D1 ; G 3420 +U 8914 ; WX 838 ; N uni22D2 ; G 3421 +U 8915 ; WX 838 ; N uni22D3 ; G 3422 +U 8916 ; WX 838 ; N uni22D4 ; G 3423 +U 8917 ; WX 838 ; N uni22D5 ; G 3424 +U 8918 ; WX 838 ; N uni22D6 ; G 3425 +U 8919 ; WX 838 ; N uni22D7 ; G 3426 +U 8920 ; WX 1422 ; N uni22D8 ; G 3427 +U 8921 ; WX 1422 ; N uni22D9 ; G 3428 +U 8922 ; WX 838 ; N uni22DA ; G 3429 +U 8923 ; WX 838 ; N uni22DB ; G 3430 +U 8924 ; WX 838 ; N uni22DC ; G 3431 +U 8925 ; WX 838 ; N uni22DD ; G 3432 +U 8926 ; WX 838 ; N uni22DE ; G 3433 +U 8927 ; WX 838 ; N uni22DF ; G 3434 +U 8928 ; WX 838 ; N uni22E0 ; G 3435 +U 8929 ; WX 838 ; N uni22E1 ; G 3436 +U 8930 ; WX 838 ; N uni22E2 ; G 3437 +U 8931 ; WX 838 ; N uni22E3 ; G 3438 +U 8932 ; WX 838 ; N uni22E4 ; G 3439 +U 8933 ; WX 838 ; N uni22E5 ; G 3440 +U 8934 ; WX 838 ; N uni22E6 ; G 3441 +U 8935 ; WX 838 ; N uni22E7 ; G 3442 +U 8936 ; WX 838 ; N uni22E8 ; G 3443 +U 8937 ; WX 838 ; N uni22E9 ; G 3444 +U 8938 ; WX 838 ; N uni22EA ; G 3445 +U 8939 ; WX 838 ; N uni22EB ; G 3446 +U 8940 ; WX 838 ; N uni22EC ; G 3447 +U 8941 ; WX 838 ; N uni22ED ; G 3448 +U 8942 ; WX 1000 ; N uni22EE ; G 3449 +U 8943 ; WX 1000 ; N uni22EF ; G 3450 +U 8944 ; WX 1000 ; N uni22F0 ; G 3451 +U 8945 ; WX 1000 ; N uni22F1 ; G 3452 +U 8946 ; WX 1000 ; N uni22F2 ; G 3453 +U 8947 ; WX 871 ; N uni22F3 ; G 3454 +U 8948 ; WX 718 ; N uni22F4 ; G 3455 +U 8949 ; WX 871 ; N uni22F5 ; G 3456 +U 8950 ; WX 871 ; N uni22F6 ; G 3457 +U 8951 ; WX 718 ; N uni22F7 ; G 3458 +U 8952 ; WX 871 ; N uni22F8 ; G 3459 +U 8953 ; WX 871 ; N uni22F9 ; G 3460 +U 8954 ; WX 1000 ; N uni22FA ; G 3461 +U 8955 ; WX 871 ; N uni22FB ; G 3462 +U 8956 ; WX 718 ; N uni22FC ; G 3463 +U 8957 ; WX 871 ; N uni22FD ; G 3464 +U 8958 ; WX 718 ; N uni22FE ; G 3465 +U 8959 ; WX 871 ; N uni22FF ; G 3466 +U 8960 ; WX 602 ; N uni2300 ; G 3467 +U 8961 ; WX 602 ; N uni2301 ; G 3468 +U 8962 ; WX 635 ; N house ; G 3469 +U 8963 ; WX 838 ; N uni2303 ; G 3470 +U 8964 ; WX 838 ; N uni2304 ; G 3471 +U 8965 ; WX 838 ; N uni2305 ; G 3472 +U 8966 ; WX 838 ; N uni2306 ; G 3473 +U 8967 ; WX 488 ; N uni2307 ; G 3474 +U 8968 ; WX 390 ; N uni2308 ; G 3475 +U 8969 ; WX 390 ; N uni2309 ; G 3476 +U 8970 ; WX 390 ; N uni230A ; G 3477 +U 8971 ; WX 390 ; N uni230B ; G 3478 +U 8972 ; WX 809 ; N uni230C ; G 3479 +U 8973 ; WX 809 ; N uni230D ; G 3480 +U 8974 ; WX 809 ; N uni230E ; G 3481 +U 8975 ; WX 809 ; N uni230F ; G 3482 +U 8976 ; WX 838 ; N revlogicalnot ; G 3483 +U 8977 ; WX 513 ; N uni2311 ; G 3484 +U 8984 ; WX 1000 ; N uni2318 ; G 3485 +U 8985 ; WX 838 ; N uni2319 ; G 3486 +U 8988 ; WX 469 ; N uni231C ; G 3487 +U 8989 ; WX 469 ; N uni231D ; G 3488 +U 8990 ; WX 469 ; N uni231E ; G 3489 +U 8991 ; WX 469 ; N uni231F ; G 3490 +U 8992 ; WX 521 ; N integraltp ; G 3491 +U 8993 ; WX 521 ; N integralbt ; G 3492 +U 8996 ; WX 1152 ; N uni2324 ; G 3493 +U 8997 ; WX 1152 ; N uni2325 ; G 3494 +U 8998 ; WX 1414 ; N uni2326 ; G 3495 +U 8999 ; WX 1152 ; N uni2327 ; G 3496 +U 9000 ; WX 1443 ; N uni2328 ; G 3497 +U 9003 ; WX 1414 ; N uni232B ; G 3498 +U 9004 ; WX 873 ; N uni232C ; G 3499 +U 9075 ; WX 338 ; N uni2373 ; G 3500 +U 9076 ; WX 635 ; N uni2374 ; G 3501 +U 9077 ; WX 837 ; N uni2375 ; G 3502 +U 9082 ; WX 659 ; N uni237A ; G 3503 +U 9085 ; WX 757 ; N uni237D ; G 3504 +U 9095 ; WX 1152 ; N uni2387 ; G 3505 +U 9108 ; WX 873 ; N uni2394 ; G 3506 +U 9115 ; WX 500 ; N uni239B ; G 3507 +U 9116 ; WX 500 ; N uni239C ; G 3508 +U 9117 ; WX 500 ; N uni239D ; G 3509 +U 9118 ; WX 500 ; N uni239E ; G 3510 +U 9119 ; WX 500 ; N uni239F ; G 3511 +U 9120 ; WX 500 ; N uni23A0 ; G 3512 +U 9121 ; WX 500 ; N uni23A1 ; G 3513 +U 9122 ; WX 500 ; N uni23A2 ; G 3514 +U 9123 ; WX 500 ; N uni23A3 ; G 3515 +U 9124 ; WX 500 ; N uni23A4 ; G 3516 +U 9125 ; WX 500 ; N uni23A5 ; G 3517 +U 9126 ; WX 500 ; N uni23A6 ; G 3518 +U 9127 ; WX 750 ; N uni23A7 ; G 3519 +U 9128 ; WX 750 ; N uni23A8 ; G 3520 +U 9129 ; WX 750 ; N uni23A9 ; G 3521 +U 9130 ; WX 750 ; N uni23AA ; G 3522 +U 9131 ; WX 750 ; N uni23AB ; G 3523 +U 9132 ; WX 750 ; N uni23AC ; G 3524 +U 9133 ; WX 750 ; N uni23AD ; G 3525 +U 9134 ; WX 521 ; N uni23AE ; G 3526 +U 9166 ; WX 838 ; N uni23CE ; G 3527 +U 9167 ; WX 945 ; N uni23CF ; G 3528 +U 9187 ; WX 873 ; N uni23E3 ; G 3529 +U 9189 ; WX 769 ; N uni23E5 ; G 3530 +U 9192 ; WX 636 ; N uni23E8 ; G 3531 +U 9250 ; WX 635 ; N uni2422 ; G 3532 +U 9251 ; WX 635 ; N uni2423 ; G 3533 +U 9312 ; WX 896 ; N uni2460 ; G 3534 +U 9313 ; WX 896 ; N uni2461 ; G 3535 +U 9314 ; WX 896 ; N uni2462 ; G 3536 +U 9315 ; WX 896 ; N uni2463 ; G 3537 +U 9316 ; WX 896 ; N uni2464 ; G 3538 +U 9317 ; WX 896 ; N uni2465 ; G 3539 +U 9318 ; WX 896 ; N uni2466 ; G 3540 +U 9319 ; WX 896 ; N uni2467 ; G 3541 +U 9320 ; WX 896 ; N uni2468 ; G 3542 +U 9321 ; WX 896 ; N uni2469 ; G 3543 +U 9472 ; WX 602 ; N SF100000 ; G 3544 +U 9473 ; WX 602 ; N uni2501 ; G 3545 +U 9474 ; WX 602 ; N SF110000 ; G 3546 +U 9475 ; WX 602 ; N uni2503 ; G 3547 +U 9476 ; WX 602 ; N uni2504 ; G 3548 +U 9477 ; WX 602 ; N uni2505 ; G 3549 +U 9478 ; WX 602 ; N uni2506 ; G 3550 +U 9479 ; WX 602 ; N uni2507 ; G 3551 +U 9480 ; WX 602 ; N uni2508 ; G 3552 +U 9481 ; WX 602 ; N uni2509 ; G 3553 +U 9482 ; WX 602 ; N uni250A ; G 3554 +U 9483 ; WX 602 ; N uni250B ; G 3555 +U 9484 ; WX 602 ; N SF010000 ; G 3556 +U 9485 ; WX 602 ; N uni250D ; G 3557 +U 9486 ; WX 602 ; N uni250E ; G 3558 +U 9487 ; WX 602 ; N uni250F ; G 3559 +U 9488 ; WX 602 ; N SF030000 ; G 3560 +U 9489 ; WX 602 ; N uni2511 ; G 3561 +U 9490 ; WX 602 ; N uni2512 ; G 3562 +U 9491 ; WX 602 ; N uni2513 ; G 3563 +U 9492 ; WX 602 ; N SF020000 ; G 3564 +U 9493 ; WX 602 ; N uni2515 ; G 3565 +U 9494 ; WX 602 ; N uni2516 ; G 3566 +U 9495 ; WX 602 ; N uni2517 ; G 3567 +U 9496 ; WX 602 ; N SF040000 ; G 3568 +U 9497 ; WX 602 ; N uni2519 ; G 3569 +U 9498 ; WX 602 ; N uni251A ; G 3570 +U 9499 ; WX 602 ; N uni251B ; G 3571 +U 9500 ; WX 602 ; N SF080000 ; G 3572 +U 9501 ; WX 602 ; N uni251D ; G 3573 +U 9502 ; WX 602 ; N uni251E ; G 3574 +U 9503 ; WX 602 ; N uni251F ; G 3575 +U 9504 ; WX 602 ; N uni2520 ; G 3576 +U 9505 ; WX 602 ; N uni2521 ; G 3577 +U 9506 ; WX 602 ; N uni2522 ; G 3578 +U 9507 ; WX 602 ; N uni2523 ; G 3579 +U 9508 ; WX 602 ; N SF090000 ; G 3580 +U 9509 ; WX 602 ; N uni2525 ; G 3581 +U 9510 ; WX 602 ; N uni2526 ; G 3582 +U 9511 ; WX 602 ; N uni2527 ; G 3583 +U 9512 ; WX 602 ; N uni2528 ; G 3584 +U 9513 ; WX 602 ; N uni2529 ; G 3585 +U 9514 ; WX 602 ; N uni252A ; G 3586 +U 9515 ; WX 602 ; N uni252B ; G 3587 +U 9516 ; WX 602 ; N SF060000 ; G 3588 +U 9517 ; WX 602 ; N uni252D ; G 3589 +U 9518 ; WX 602 ; N uni252E ; G 3590 +U 9519 ; WX 602 ; N uni252F ; G 3591 +U 9520 ; WX 602 ; N uni2530 ; G 3592 +U 9521 ; WX 602 ; N uni2531 ; G 3593 +U 9522 ; WX 602 ; N uni2532 ; G 3594 +U 9523 ; WX 602 ; N uni2533 ; G 3595 +U 9524 ; WX 602 ; N SF070000 ; G 3596 +U 9525 ; WX 602 ; N uni2535 ; G 3597 +U 9526 ; WX 602 ; N uni2536 ; G 3598 +U 9527 ; WX 602 ; N uni2537 ; G 3599 +U 9528 ; WX 602 ; N uni2538 ; G 3600 +U 9529 ; WX 602 ; N uni2539 ; G 3601 +U 9530 ; WX 602 ; N uni253A ; G 3602 +U 9531 ; WX 602 ; N uni253B ; G 3603 +U 9532 ; WX 602 ; N SF050000 ; G 3604 +U 9533 ; WX 602 ; N uni253D ; G 3605 +U 9534 ; WX 602 ; N uni253E ; G 3606 +U 9535 ; WX 602 ; N uni253F ; G 3607 +U 9536 ; WX 602 ; N uni2540 ; G 3608 +U 9537 ; WX 602 ; N uni2541 ; G 3609 +U 9538 ; WX 602 ; N uni2542 ; G 3610 +U 9539 ; WX 602 ; N uni2543 ; G 3611 +U 9540 ; WX 602 ; N uni2544 ; G 3612 +U 9541 ; WX 602 ; N uni2545 ; G 3613 +U 9542 ; WX 602 ; N uni2546 ; G 3614 +U 9543 ; WX 602 ; N uni2547 ; G 3615 +U 9544 ; WX 602 ; N uni2548 ; G 3616 +U 9545 ; WX 602 ; N uni2549 ; G 3617 +U 9546 ; WX 602 ; N uni254A ; G 3618 +U 9547 ; WX 602 ; N uni254B ; G 3619 +U 9548 ; WX 602 ; N uni254C ; G 3620 +U 9549 ; WX 602 ; N uni254D ; G 3621 +U 9550 ; WX 602 ; N uni254E ; G 3622 +U 9551 ; WX 602 ; N uni254F ; G 3623 +U 9552 ; WX 602 ; N SF430000 ; G 3624 +U 9553 ; WX 602 ; N SF240000 ; G 3625 +U 9554 ; WX 602 ; N SF510000 ; G 3626 +U 9555 ; WX 602 ; N SF520000 ; G 3627 +U 9556 ; WX 602 ; N SF390000 ; G 3628 +U 9557 ; WX 602 ; N SF220000 ; G 3629 +U 9558 ; WX 602 ; N SF210000 ; G 3630 +U 9559 ; WX 602 ; N SF250000 ; G 3631 +U 9560 ; WX 602 ; N SF500000 ; G 3632 +U 9561 ; WX 602 ; N SF490000 ; G 3633 +U 9562 ; WX 602 ; N SF380000 ; G 3634 +U 9563 ; WX 602 ; N SF280000 ; G 3635 +U 9564 ; WX 602 ; N SF270000 ; G 3636 +U 9565 ; WX 602 ; N SF260000 ; G 3637 +U 9566 ; WX 602 ; N SF360000 ; G 3638 +U 9567 ; WX 602 ; N SF370000 ; G 3639 +U 9568 ; WX 602 ; N SF420000 ; G 3640 +U 9569 ; WX 602 ; N SF190000 ; G 3641 +U 9570 ; WX 602 ; N SF200000 ; G 3642 +U 9571 ; WX 602 ; N SF230000 ; G 3643 +U 9572 ; WX 602 ; N SF470000 ; G 3644 +U 9573 ; WX 602 ; N SF480000 ; G 3645 +U 9574 ; WX 602 ; N SF410000 ; G 3646 +U 9575 ; WX 602 ; N SF450000 ; G 3647 +U 9576 ; WX 602 ; N SF460000 ; G 3648 +U 9577 ; WX 602 ; N SF400000 ; G 3649 +U 9578 ; WX 602 ; N SF540000 ; G 3650 +U 9579 ; WX 602 ; N SF530000 ; G 3651 +U 9580 ; WX 602 ; N SF440000 ; G 3652 +U 9581 ; WX 602 ; N uni256D ; G 3653 +U 9582 ; WX 602 ; N uni256E ; G 3654 +U 9583 ; WX 602 ; N uni256F ; G 3655 +U 9584 ; WX 602 ; N uni2570 ; G 3656 +U 9585 ; WX 602 ; N uni2571 ; G 3657 +U 9586 ; WX 602 ; N uni2572 ; G 3658 +U 9587 ; WX 602 ; N uni2573 ; G 3659 +U 9588 ; WX 602 ; N uni2574 ; G 3660 +U 9589 ; WX 602 ; N uni2575 ; G 3661 +U 9590 ; WX 602 ; N uni2576 ; G 3662 +U 9591 ; WX 602 ; N uni2577 ; G 3663 +U 9592 ; WX 602 ; N uni2578 ; G 3664 +U 9593 ; WX 602 ; N uni2579 ; G 3665 +U 9594 ; WX 602 ; N uni257A ; G 3666 +U 9595 ; WX 602 ; N uni257B ; G 3667 +U 9596 ; WX 602 ; N uni257C ; G 3668 +U 9597 ; WX 602 ; N uni257D ; G 3669 +U 9598 ; WX 602 ; N uni257E ; G 3670 +U 9599 ; WX 602 ; N uni257F ; G 3671 +U 9600 ; WX 769 ; N upblock ; G 3672 +U 9601 ; WX 769 ; N uni2581 ; G 3673 +U 9602 ; WX 769 ; N uni2582 ; G 3674 +U 9603 ; WX 769 ; N uni2583 ; G 3675 +U 9604 ; WX 769 ; N dnblock ; G 3676 +U 9605 ; WX 769 ; N uni2585 ; G 3677 +U 9606 ; WX 769 ; N uni2586 ; G 3678 +U 9607 ; WX 769 ; N uni2587 ; G 3679 +U 9608 ; WX 769 ; N block ; G 3680 +U 9609 ; WX 769 ; N uni2589 ; G 3681 +U 9610 ; WX 769 ; N uni258A ; G 3682 +U 9611 ; WX 769 ; N uni258B ; G 3683 +U 9612 ; WX 769 ; N lfblock ; G 3684 +U 9613 ; WX 769 ; N uni258D ; G 3685 +U 9614 ; WX 769 ; N uni258E ; G 3686 +U 9615 ; WX 769 ; N uni258F ; G 3687 +U 9616 ; WX 769 ; N rtblock ; G 3688 +U 9617 ; WX 769 ; N ltshade ; G 3689 +U 9618 ; WX 769 ; N shade ; G 3690 +U 9619 ; WX 769 ; N dkshade ; G 3691 +U 9620 ; WX 769 ; N uni2594 ; G 3692 +U 9621 ; WX 769 ; N uni2595 ; G 3693 +U 9622 ; WX 769 ; N uni2596 ; G 3694 +U 9623 ; WX 769 ; N uni2597 ; G 3695 +U 9624 ; WX 769 ; N uni2598 ; G 3696 +U 9625 ; WX 769 ; N uni2599 ; G 3697 +U 9626 ; WX 769 ; N uni259A ; G 3698 +U 9627 ; WX 769 ; N uni259B ; G 3699 +U 9628 ; WX 769 ; N uni259C ; G 3700 +U 9629 ; WX 769 ; N uni259D ; G 3701 +U 9630 ; WX 769 ; N uni259E ; G 3702 +U 9631 ; WX 769 ; N uni259F ; G 3703 +U 9632 ; WX 945 ; N filledbox ; G 3704 +U 9633 ; WX 945 ; N H22073 ; G 3705 +U 9634 ; WX 945 ; N uni25A2 ; G 3706 +U 9635 ; WX 945 ; N uni25A3 ; G 3707 +U 9636 ; WX 945 ; N uni25A4 ; G 3708 +U 9637 ; WX 945 ; N uni25A5 ; G 3709 +U 9638 ; WX 945 ; N uni25A6 ; G 3710 +U 9639 ; WX 945 ; N uni25A7 ; G 3711 +U 9640 ; WX 945 ; N uni25A8 ; G 3712 +U 9641 ; WX 945 ; N uni25A9 ; G 3713 +U 9642 ; WX 678 ; N H18543 ; G 3714 +U 9643 ; WX 678 ; N H18551 ; G 3715 +U 9644 ; WX 945 ; N filledrect ; G 3716 +U 9645 ; WX 945 ; N uni25AD ; G 3717 +U 9646 ; WX 550 ; N uni25AE ; G 3718 +U 9647 ; WX 550 ; N uni25AF ; G 3719 +U 9648 ; WX 769 ; N uni25B0 ; G 3720 +U 9649 ; WX 769 ; N uni25B1 ; G 3721 +U 9650 ; WX 769 ; N triagup ; G 3722 +U 9651 ; WX 769 ; N uni25B3 ; G 3723 +U 9652 ; WX 502 ; N uni25B4 ; G 3724 +U 9653 ; WX 502 ; N uni25B5 ; G 3725 +U 9654 ; WX 769 ; N uni25B6 ; G 3726 +U 9655 ; WX 769 ; N uni25B7 ; G 3727 +U 9656 ; WX 502 ; N uni25B8 ; G 3728 +U 9657 ; WX 502 ; N uni25B9 ; G 3729 +U 9658 ; WX 769 ; N triagrt ; G 3730 +U 9659 ; WX 769 ; N uni25BB ; G 3731 +U 9660 ; WX 769 ; N triagdn ; G 3732 +U 9661 ; WX 769 ; N uni25BD ; G 3733 +U 9662 ; WX 502 ; N uni25BE ; G 3734 +U 9663 ; WX 502 ; N uni25BF ; G 3735 +U 9664 ; WX 769 ; N uni25C0 ; G 3736 +U 9665 ; WX 769 ; N uni25C1 ; G 3737 +U 9666 ; WX 502 ; N uni25C2 ; G 3738 +U 9667 ; WX 502 ; N uni25C3 ; G 3739 +U 9668 ; WX 769 ; N triaglf ; G 3740 +U 9669 ; WX 769 ; N uni25C5 ; G 3741 +U 9670 ; WX 769 ; N uni25C6 ; G 3742 +U 9671 ; WX 769 ; N uni25C7 ; G 3743 +U 9672 ; WX 769 ; N uni25C8 ; G 3744 +U 9673 ; WX 873 ; N uni25C9 ; G 3745 +U 9674 ; WX 494 ; N lozenge ; G 3746 +U 9675 ; WX 873 ; N circle ; G 3747 +U 9676 ; WX 873 ; N uni25CC ; G 3748 +U 9677 ; WX 873 ; N uni25CD ; G 3749 +U 9678 ; WX 873 ; N uni25CE ; G 3750 +U 9679 ; WX 873 ; N H18533 ; G 3751 +U 9680 ; WX 873 ; N uni25D0 ; G 3752 +U 9681 ; WX 873 ; N uni25D1 ; G 3753 +U 9682 ; WX 873 ; N uni25D2 ; G 3754 +U 9683 ; WX 873 ; N uni25D3 ; G 3755 +U 9684 ; WX 873 ; N uni25D4 ; G 3756 +U 9685 ; WX 873 ; N uni25D5 ; G 3757 +U 9686 ; WX 527 ; N uni25D6 ; G 3758 +U 9687 ; WX 527 ; N uni25D7 ; G 3759 +U 9688 ; WX 791 ; N invbullet ; G 3760 +U 9689 ; WX 970 ; N invcircle ; G 3761 +U 9690 ; WX 970 ; N uni25DA ; G 3762 +U 9691 ; WX 970 ; N uni25DB ; G 3763 +U 9692 ; WX 387 ; N uni25DC ; G 3764 +U 9693 ; WX 387 ; N uni25DD ; G 3765 +U 9694 ; WX 387 ; N uni25DE ; G 3766 +U 9695 ; WX 387 ; N uni25DF ; G 3767 +U 9696 ; WX 873 ; N uni25E0 ; G 3768 +U 9697 ; WX 873 ; N uni25E1 ; G 3769 +U 9698 ; WX 769 ; N uni25E2 ; G 3770 +U 9699 ; WX 769 ; N uni25E3 ; G 3771 +U 9700 ; WX 769 ; N uni25E4 ; G 3772 +U 9701 ; WX 769 ; N uni25E5 ; G 3773 +U 9702 ; WX 590 ; N openbullet ; G 3774 +U 9703 ; WX 945 ; N uni25E7 ; G 3775 +U 9704 ; WX 945 ; N uni25E8 ; G 3776 +U 9705 ; WX 945 ; N uni25E9 ; G 3777 +U 9706 ; WX 945 ; N uni25EA ; G 3778 +U 9707 ; WX 945 ; N uni25EB ; G 3779 +U 9708 ; WX 769 ; N uni25EC ; G 3780 +U 9709 ; WX 769 ; N uni25ED ; G 3781 +U 9710 ; WX 769 ; N uni25EE ; G 3782 +U 9711 ; WX 1119 ; N uni25EF ; G 3783 +U 9712 ; WX 945 ; N uni25F0 ; G 3784 +U 9713 ; WX 945 ; N uni25F1 ; G 3785 +U 9714 ; WX 945 ; N uni25F2 ; G 3786 +U 9715 ; WX 945 ; N uni25F3 ; G 3787 +U 9716 ; WX 873 ; N uni25F4 ; G 3788 +U 9717 ; WX 873 ; N uni25F5 ; G 3789 +U 9718 ; WX 873 ; N uni25F6 ; G 3790 +U 9719 ; WX 873 ; N uni25F7 ; G 3791 +U 9720 ; WX 769 ; N uni25F8 ; G 3792 +U 9721 ; WX 769 ; N uni25F9 ; G 3793 +U 9722 ; WX 769 ; N uni25FA ; G 3794 +U 9723 ; WX 830 ; N uni25FB ; G 3795 +U 9724 ; WX 830 ; N uni25FC ; G 3796 +U 9725 ; WX 732 ; N uni25FD ; G 3797 +U 9726 ; WX 732 ; N uni25FE ; G 3798 +U 9727 ; WX 769 ; N uni25FF ; G 3799 +U 9728 ; WX 896 ; N uni2600 ; G 3800 +U 9729 ; WX 1000 ; N uni2601 ; G 3801 +U 9730 ; WX 896 ; N uni2602 ; G 3802 +U 9731 ; WX 896 ; N uni2603 ; G 3803 +U 9732 ; WX 896 ; N uni2604 ; G 3804 +U 9733 ; WX 896 ; N uni2605 ; G 3805 +U 9734 ; WX 896 ; N uni2606 ; G 3806 +U 9735 ; WX 573 ; N uni2607 ; G 3807 +U 9736 ; WX 896 ; N uni2608 ; G 3808 +U 9737 ; WX 896 ; N uni2609 ; G 3809 +U 9738 ; WX 888 ; N uni260A ; G 3810 +U 9739 ; WX 888 ; N uni260B ; G 3811 +U 9740 ; WX 671 ; N uni260C ; G 3812 +U 9741 ; WX 1013 ; N uni260D ; G 3813 +U 9742 ; WX 1246 ; N uni260E ; G 3814 +U 9743 ; WX 1250 ; N uni260F ; G 3815 +U 9744 ; WX 896 ; N uni2610 ; G 3816 +U 9745 ; WX 896 ; N uni2611 ; G 3817 +U 9746 ; WX 896 ; N uni2612 ; G 3818 +U 9747 ; WX 532 ; N uni2613 ; G 3819 +U 9748 ; WX 896 ; N uni2614 ; G 3820 +U 9749 ; WX 896 ; N uni2615 ; G 3821 +U 9750 ; WX 896 ; N uni2616 ; G 3822 +U 9751 ; WX 896 ; N uni2617 ; G 3823 +U 9752 ; WX 896 ; N uni2618 ; G 3824 +U 9753 ; WX 896 ; N uni2619 ; G 3825 +U 9754 ; WX 896 ; N uni261A ; G 3826 +U 9755 ; WX 896 ; N uni261B ; G 3827 +U 9756 ; WX 896 ; N uni261C ; G 3828 +U 9757 ; WX 609 ; N uni261D ; G 3829 +U 9758 ; WX 896 ; N uni261E ; G 3830 +U 9759 ; WX 609 ; N uni261F ; G 3831 +U 9760 ; WX 896 ; N uni2620 ; G 3832 +U 9761 ; WX 896 ; N uni2621 ; G 3833 +U 9762 ; WX 896 ; N uni2622 ; G 3834 +U 9763 ; WX 896 ; N uni2623 ; G 3835 +U 9764 ; WX 669 ; N uni2624 ; G 3836 +U 9765 ; WX 746 ; N uni2625 ; G 3837 +U 9766 ; WX 649 ; N uni2626 ; G 3838 +U 9767 ; WX 784 ; N uni2627 ; G 3839 +U 9768 ; WX 545 ; N uni2628 ; G 3840 +U 9769 ; WX 896 ; N uni2629 ; G 3841 +U 9770 ; WX 896 ; N uni262A ; G 3842 +U 9771 ; WX 896 ; N uni262B ; G 3843 +U 9772 ; WX 710 ; N uni262C ; G 3844 +U 9773 ; WX 896 ; N uni262D ; G 3845 +U 9774 ; WX 896 ; N uni262E ; G 3846 +U 9775 ; WX 896 ; N uni262F ; G 3847 +U 9776 ; WX 896 ; N uni2630 ; G 3848 +U 9777 ; WX 896 ; N uni2631 ; G 3849 +U 9778 ; WX 896 ; N uni2632 ; G 3850 +U 9779 ; WX 896 ; N uni2633 ; G 3851 +U 9780 ; WX 896 ; N uni2634 ; G 3852 +U 9781 ; WX 896 ; N uni2635 ; G 3853 +U 9782 ; WX 896 ; N uni2636 ; G 3854 +U 9783 ; WX 896 ; N uni2637 ; G 3855 +U 9784 ; WX 896 ; N uni2638 ; G 3856 +U 9785 ; WX 1042 ; N uni2639 ; G 3857 +U 9786 ; WX 1042 ; N smileface ; G 3858 +U 9787 ; WX 1042 ; N invsmileface ; G 3859 +U 9788 ; WX 896 ; N sun ; G 3860 +U 9789 ; WX 896 ; N uni263D ; G 3861 +U 9790 ; WX 896 ; N uni263E ; G 3862 +U 9791 ; WX 614 ; N uni263F ; G 3863 +U 9792 ; WX 732 ; N female ; G 3864 +U 9793 ; WX 732 ; N uni2641 ; G 3865 +U 9794 ; WX 896 ; N male ; G 3866 +U 9795 ; WX 896 ; N uni2643 ; G 3867 +U 9796 ; WX 896 ; N uni2644 ; G 3868 +U 9797 ; WX 896 ; N uni2645 ; G 3869 +U 9798 ; WX 896 ; N uni2646 ; G 3870 +U 9799 ; WX 896 ; N uni2647 ; G 3871 +U 9800 ; WX 896 ; N uni2648 ; G 3872 +U 9801 ; WX 896 ; N uni2649 ; G 3873 +U 9802 ; WX 896 ; N uni264A ; G 3874 +U 9803 ; WX 896 ; N uni264B ; G 3875 +U 9804 ; WX 896 ; N uni264C ; G 3876 +U 9805 ; WX 896 ; N uni264D ; G 3877 +U 9806 ; WX 896 ; N uni264E ; G 3878 +U 9807 ; WX 896 ; N uni264F ; G 3879 +U 9808 ; WX 896 ; N uni2650 ; G 3880 +U 9809 ; WX 896 ; N uni2651 ; G 3881 +U 9810 ; WX 896 ; N uni2652 ; G 3882 +U 9811 ; WX 896 ; N uni2653 ; G 3883 +U 9812 ; WX 896 ; N uni2654 ; G 3884 +U 9813 ; WX 896 ; N uni2655 ; G 3885 +U 9814 ; WX 896 ; N uni2656 ; G 3886 +U 9815 ; WX 896 ; N uni2657 ; G 3887 +U 9816 ; WX 896 ; N uni2658 ; G 3888 +U 9817 ; WX 896 ; N uni2659 ; G 3889 +U 9818 ; WX 896 ; N uni265A ; G 3890 +U 9819 ; WX 896 ; N uni265B ; G 3891 +U 9820 ; WX 896 ; N uni265C ; G 3892 +U 9821 ; WX 896 ; N uni265D ; G 3893 +U 9822 ; WX 896 ; N uni265E ; G 3894 +U 9823 ; WX 896 ; N uni265F ; G 3895 +U 9824 ; WX 896 ; N spade ; G 3896 +U 9825 ; WX 896 ; N uni2661 ; G 3897 +U 9826 ; WX 896 ; N uni2662 ; G 3898 +U 9827 ; WX 896 ; N club ; G 3899 +U 9828 ; WX 896 ; N uni2664 ; G 3900 +U 9829 ; WX 896 ; N heart ; G 3901 +U 9830 ; WX 896 ; N diamond ; G 3902 +U 9831 ; WX 896 ; N uni2667 ; G 3903 +U 9832 ; WX 896 ; N uni2668 ; G 3904 +U 9833 ; WX 472 ; N uni2669 ; G 3905 +U 9834 ; WX 638 ; N musicalnote ; G 3906 +U 9835 ; WX 896 ; N musicalnotedbl ; G 3907 +U 9836 ; WX 896 ; N uni266C ; G 3908 +U 9837 ; WX 472 ; N uni266D ; G 3909 +U 9838 ; WX 357 ; N uni266E ; G 3910 +U 9839 ; WX 484 ; N uni266F ; G 3911 +U 9840 ; WX 748 ; N uni2670 ; G 3912 +U 9841 ; WX 766 ; N uni2671 ; G 3913 +U 9842 ; WX 896 ; N uni2672 ; G 3914 +U 9843 ; WX 896 ; N uni2673 ; G 3915 +U 9844 ; WX 896 ; N uni2674 ; G 3916 +U 9845 ; WX 896 ; N uni2675 ; G 3917 +U 9846 ; WX 896 ; N uni2676 ; G 3918 +U 9847 ; WX 896 ; N uni2677 ; G 3919 +U 9848 ; WX 896 ; N uni2678 ; G 3920 +U 9849 ; WX 896 ; N uni2679 ; G 3921 +U 9850 ; WX 896 ; N uni267A ; G 3922 +U 9851 ; WX 896 ; N uni267B ; G 3923 +U 9852 ; WX 896 ; N uni267C ; G 3924 +U 9853 ; WX 896 ; N uni267D ; G 3925 +U 9854 ; WX 896 ; N uni267E ; G 3926 +U 9855 ; WX 896 ; N uni267F ; G 3927 +U 9856 ; WX 869 ; N uni2680 ; G 3928 +U 9857 ; WX 869 ; N uni2681 ; G 3929 +U 9858 ; WX 869 ; N uni2682 ; G 3930 +U 9859 ; WX 869 ; N uni2683 ; G 3931 +U 9860 ; WX 869 ; N uni2684 ; G 3932 +U 9861 ; WX 869 ; N uni2685 ; G 3933 +U 9862 ; WX 896 ; N uni2686 ; G 3934 +U 9863 ; WX 896 ; N uni2687 ; G 3935 +U 9864 ; WX 896 ; N uni2688 ; G 3936 +U 9865 ; WX 896 ; N uni2689 ; G 3937 +U 9866 ; WX 896 ; N uni268A ; G 3938 +U 9867 ; WX 896 ; N uni268B ; G 3939 +U 9868 ; WX 896 ; N uni268C ; G 3940 +U 9869 ; WX 896 ; N uni268D ; G 3941 +U 9870 ; WX 896 ; N uni268E ; G 3942 +U 9871 ; WX 896 ; N uni268F ; G 3943 +U 9872 ; WX 896 ; N uni2690 ; G 3944 +U 9873 ; WX 896 ; N uni2691 ; G 3945 +U 9874 ; WX 896 ; N uni2692 ; G 3946 +U 9875 ; WX 896 ; N uni2693 ; G 3947 +U 9876 ; WX 896 ; N uni2694 ; G 3948 +U 9877 ; WX 541 ; N uni2695 ; G 3949 +U 9878 ; WX 896 ; N uni2696 ; G 3950 +U 9879 ; WX 896 ; N uni2697 ; G 3951 +U 9880 ; WX 896 ; N uni2698 ; G 3952 +U 9881 ; WX 896 ; N uni2699 ; G 3953 +U 9882 ; WX 896 ; N uni269A ; G 3954 +U 9883 ; WX 896 ; N uni269B ; G 3955 +U 9884 ; WX 896 ; N uni269C ; G 3956 +U 9886 ; WX 896 ; N uni269E ; G 3957 +U 9887 ; WX 896 ; N uni269F ; G 3958 +U 9888 ; WX 896 ; N uni26A0 ; G 3959 +U 9889 ; WX 702 ; N uni26A1 ; G 3960 +U 9890 ; WX 1004 ; N uni26A2 ; G 3961 +U 9891 ; WX 1089 ; N uni26A3 ; G 3962 +U 9892 ; WX 1175 ; N uni26A4 ; G 3963 +U 9893 ; WX 903 ; N uni26A5 ; G 3964 +U 9894 ; WX 838 ; N uni26A6 ; G 3965 +U 9895 ; WX 838 ; N uni26A7 ; G 3966 +U 9896 ; WX 838 ; N uni26A8 ; G 3967 +U 9897 ; WX 838 ; N uni26A9 ; G 3968 +U 9898 ; WX 838 ; N uni26AA ; G 3969 +U 9899 ; WX 838 ; N uni26AB ; G 3970 +U 9900 ; WX 838 ; N uni26AC ; G 3971 +U 9901 ; WX 838 ; N uni26AD ; G 3972 +U 9902 ; WX 838 ; N uni26AE ; G 3973 +U 9903 ; WX 838 ; N uni26AF ; G 3974 +U 9904 ; WX 844 ; N uni26B0 ; G 3975 +U 9905 ; WX 838 ; N uni26B1 ; G 3976 +U 9906 ; WX 732 ; N uni26B2 ; G 3977 +U 9907 ; WX 732 ; N uni26B3 ; G 3978 +U 9908 ; WX 732 ; N uni26B4 ; G 3979 +U 9909 ; WX 732 ; N uni26B5 ; G 3980 +U 9910 ; WX 850 ; N uni26B6 ; G 3981 +U 9911 ; WX 732 ; N uni26B7 ; G 3982 +U 9912 ; WX 732 ; N uni26B8 ; G 3983 +U 9920 ; WX 838 ; N uni26C0 ; G 3984 +U 9921 ; WX 838 ; N uni26C1 ; G 3985 +U 9922 ; WX 838 ; N uni26C2 ; G 3986 +U 9923 ; WX 838 ; N uni26C3 ; G 3987 +U 9954 ; WX 732 ; N uni26E2 ; G 3988 +U 9985 ; WX 838 ; N uni2701 ; G 3989 +U 9986 ; WX 838 ; N uni2702 ; G 3990 +U 9987 ; WX 838 ; N uni2703 ; G 3991 +U 9988 ; WX 838 ; N uni2704 ; G 3992 +U 9990 ; WX 838 ; N uni2706 ; G 3993 +U 9991 ; WX 838 ; N uni2707 ; G 3994 +U 9992 ; WX 838 ; N uni2708 ; G 3995 +U 9993 ; WX 838 ; N uni2709 ; G 3996 +U 9996 ; WX 838 ; N uni270C ; G 3997 +U 9997 ; WX 838 ; N uni270D ; G 3998 +U 9998 ; WX 838 ; N uni270E ; G 3999 +U 9999 ; WX 838 ; N uni270F ; G 4000 +U 10000 ; WX 838 ; N uni2710 ; G 4001 +U 10001 ; WX 838 ; N uni2711 ; G 4002 +U 10002 ; WX 838 ; N uni2712 ; G 4003 +U 10003 ; WX 838 ; N uni2713 ; G 4004 +U 10004 ; WX 838 ; N uni2714 ; G 4005 +U 10005 ; WX 838 ; N uni2715 ; G 4006 +U 10006 ; WX 838 ; N uni2716 ; G 4007 +U 10007 ; WX 838 ; N uni2717 ; G 4008 +U 10008 ; WX 838 ; N uni2718 ; G 4009 +U 10009 ; WX 838 ; N uni2719 ; G 4010 +U 10010 ; WX 838 ; N uni271A ; G 4011 +U 10011 ; WX 838 ; N uni271B ; G 4012 +U 10012 ; WX 838 ; N uni271C ; G 4013 +U 10013 ; WX 838 ; N uni271D ; G 4014 +U 10014 ; WX 838 ; N uni271E ; G 4015 +U 10015 ; WX 838 ; N uni271F ; G 4016 +U 10016 ; WX 838 ; N uni2720 ; G 4017 +U 10017 ; WX 838 ; N uni2721 ; G 4018 +U 10018 ; WX 838 ; N uni2722 ; G 4019 +U 10019 ; WX 838 ; N uni2723 ; G 4020 +U 10020 ; WX 838 ; N uni2724 ; G 4021 +U 10021 ; WX 838 ; N uni2725 ; G 4022 +U 10022 ; WX 838 ; N uni2726 ; G 4023 +U 10023 ; WX 838 ; N uni2727 ; G 4024 +U 10025 ; WX 838 ; N uni2729 ; G 4025 +U 10026 ; WX 838 ; N uni272A ; G 4026 +U 10027 ; WX 838 ; N uni272B ; G 4027 +U 10028 ; WX 838 ; N uni272C ; G 4028 +U 10029 ; WX 838 ; N uni272D ; G 4029 +U 10030 ; WX 838 ; N uni272E ; G 4030 +U 10031 ; WX 838 ; N uni272F ; G 4031 +U 10032 ; WX 838 ; N uni2730 ; G 4032 +U 10033 ; WX 838 ; N uni2731 ; G 4033 +U 10034 ; WX 838 ; N uni2732 ; G 4034 +U 10035 ; WX 838 ; N uni2733 ; G 4035 +U 10036 ; WX 838 ; N uni2734 ; G 4036 +U 10037 ; WX 838 ; N uni2735 ; G 4037 +U 10038 ; WX 838 ; N uni2736 ; G 4038 +U 10039 ; WX 838 ; N uni2737 ; G 4039 +U 10040 ; WX 838 ; N uni2738 ; G 4040 +U 10041 ; WX 838 ; N uni2739 ; G 4041 +U 10042 ; WX 838 ; N uni273A ; G 4042 +U 10043 ; WX 838 ; N uni273B ; G 4043 +U 10044 ; WX 838 ; N uni273C ; G 4044 +U 10045 ; WX 838 ; N uni273D ; G 4045 +U 10046 ; WX 838 ; N uni273E ; G 4046 +U 10047 ; WX 838 ; N uni273F ; G 4047 +U 10048 ; WX 838 ; N uni2740 ; G 4048 +U 10049 ; WX 838 ; N uni2741 ; G 4049 +U 10050 ; WX 838 ; N uni2742 ; G 4050 +U 10051 ; WX 838 ; N uni2743 ; G 4051 +U 10052 ; WX 838 ; N uni2744 ; G 4052 +U 10053 ; WX 838 ; N uni2745 ; G 4053 +U 10054 ; WX 838 ; N uni2746 ; G 4054 +U 10055 ; WX 838 ; N uni2747 ; G 4055 +U 10056 ; WX 838 ; N uni2748 ; G 4056 +U 10057 ; WX 838 ; N uni2749 ; G 4057 +U 10058 ; WX 838 ; N uni274A ; G 4058 +U 10059 ; WX 838 ; N uni274B ; G 4059 +U 10061 ; WX 896 ; N uni274D ; G 4060 +U 10063 ; WX 896 ; N uni274F ; G 4061 +U 10064 ; WX 896 ; N uni2750 ; G 4062 +U 10065 ; WX 896 ; N uni2751 ; G 4063 +U 10066 ; WX 896 ; N uni2752 ; G 4064 +U 10070 ; WX 896 ; N uni2756 ; G 4065 +U 10072 ; WX 838 ; N uni2758 ; G 4066 +U 10073 ; WX 838 ; N uni2759 ; G 4067 +U 10074 ; WX 838 ; N uni275A ; G 4068 +U 10075 ; WX 322 ; N uni275B ; G 4069 +U 10076 ; WX 322 ; N uni275C ; G 4070 +U 10077 ; WX 538 ; N uni275D ; G 4071 +U 10078 ; WX 538 ; N uni275E ; G 4072 +U 10081 ; WX 838 ; N uni2761 ; G 4073 +U 10082 ; WX 838 ; N uni2762 ; G 4074 +U 10083 ; WX 838 ; N uni2763 ; G 4075 +U 10084 ; WX 838 ; N uni2764 ; G 4076 +U 10085 ; WX 838 ; N uni2765 ; G 4077 +U 10086 ; WX 838 ; N uni2766 ; G 4078 +U 10087 ; WX 838 ; N uni2767 ; G 4079 +U 10088 ; WX 838 ; N uni2768 ; G 4080 +U 10089 ; WX 838 ; N uni2769 ; G 4081 +U 10090 ; WX 838 ; N uni276A ; G 4082 +U 10091 ; WX 838 ; N uni276B ; G 4083 +U 10092 ; WX 838 ; N uni276C ; G 4084 +U 10093 ; WX 838 ; N uni276D ; G 4085 +U 10094 ; WX 838 ; N uni276E ; G 4086 +U 10095 ; WX 838 ; N uni276F ; G 4087 +U 10096 ; WX 838 ; N uni2770 ; G 4088 +U 10097 ; WX 838 ; N uni2771 ; G 4089 +U 10098 ; WX 838 ; N uni2772 ; G 4090 +U 10099 ; WX 838 ; N uni2773 ; G 4091 +U 10100 ; WX 838 ; N uni2774 ; G 4092 +U 10101 ; WX 838 ; N uni2775 ; G 4093 +U 10102 ; WX 896 ; N uni2776 ; G 4094 +U 10103 ; WX 896 ; N uni2777 ; G 4095 +U 10104 ; WX 896 ; N uni2778 ; G 4096 +U 10105 ; WX 896 ; N uni2779 ; G 4097 +U 10106 ; WX 896 ; N uni277A ; G 4098 +U 10107 ; WX 896 ; N uni277B ; G 4099 +U 10108 ; WX 896 ; N uni277C ; G 4100 +U 10109 ; WX 896 ; N uni277D ; G 4101 +U 10110 ; WX 896 ; N uni277E ; G 4102 +U 10111 ; WX 896 ; N uni277F ; G 4103 +U 10112 ; WX 838 ; N uni2780 ; G 4104 +U 10113 ; WX 838 ; N uni2781 ; G 4105 +U 10114 ; WX 838 ; N uni2782 ; G 4106 +U 10115 ; WX 838 ; N uni2783 ; G 4107 +U 10116 ; WX 838 ; N uni2784 ; G 4108 +U 10117 ; WX 838 ; N uni2785 ; G 4109 +U 10118 ; WX 838 ; N uni2786 ; G 4110 +U 10119 ; WX 838 ; N uni2787 ; G 4111 +U 10120 ; WX 838 ; N uni2788 ; G 4112 +U 10121 ; WX 838 ; N uni2789 ; G 4113 +U 10122 ; WX 838 ; N uni278A ; G 4114 +U 10123 ; WX 838 ; N uni278B ; G 4115 +U 10124 ; WX 838 ; N uni278C ; G 4116 +U 10125 ; WX 838 ; N uni278D ; G 4117 +U 10126 ; WX 838 ; N uni278E ; G 4118 +U 10127 ; WX 838 ; N uni278F ; G 4119 +U 10128 ; WX 838 ; N uni2790 ; G 4120 +U 10129 ; WX 838 ; N uni2791 ; G 4121 +U 10130 ; WX 838 ; N uni2792 ; G 4122 +U 10131 ; WX 838 ; N uni2793 ; G 4123 +U 10132 ; WX 838 ; N uni2794 ; G 4124 +U 10136 ; WX 838 ; N uni2798 ; G 4125 +U 10137 ; WX 838 ; N uni2799 ; G 4126 +U 10138 ; WX 838 ; N uni279A ; G 4127 +U 10139 ; WX 838 ; N uni279B ; G 4128 +U 10140 ; WX 838 ; N uni279C ; G 4129 +U 10141 ; WX 838 ; N uni279D ; G 4130 +U 10142 ; WX 838 ; N uni279E ; G 4131 +U 10143 ; WX 838 ; N uni279F ; G 4132 +U 10144 ; WX 838 ; N uni27A0 ; G 4133 +U 10145 ; WX 838 ; N uni27A1 ; G 4134 +U 10146 ; WX 838 ; N uni27A2 ; G 4135 +U 10147 ; WX 838 ; N uni27A3 ; G 4136 +U 10148 ; WX 838 ; N uni27A4 ; G 4137 +U 10149 ; WX 838 ; N uni27A5 ; G 4138 +U 10150 ; WX 838 ; N uni27A6 ; G 4139 +U 10151 ; WX 838 ; N uni27A7 ; G 4140 +U 10152 ; WX 838 ; N uni27A8 ; G 4141 +U 10153 ; WX 838 ; N uni27A9 ; G 4142 +U 10154 ; WX 838 ; N uni27AA ; G 4143 +U 10155 ; WX 838 ; N uni27AB ; G 4144 +U 10156 ; WX 838 ; N uni27AC ; G 4145 +U 10157 ; WX 838 ; N uni27AD ; G 4146 +U 10158 ; WX 838 ; N uni27AE ; G 4147 +U 10159 ; WX 838 ; N uni27AF ; G 4148 +U 10161 ; WX 838 ; N uni27B1 ; G 4149 +U 10162 ; WX 838 ; N uni27B2 ; G 4150 +U 10163 ; WX 838 ; N uni27B3 ; G 4151 +U 10164 ; WX 838 ; N uni27B4 ; G 4152 +U 10165 ; WX 838 ; N uni27B5 ; G 4153 +U 10166 ; WX 838 ; N uni27B6 ; G 4154 +U 10167 ; WX 838 ; N uni27B7 ; G 4155 +U 10168 ; WX 838 ; N uni27B8 ; G 4156 +U 10169 ; WX 838 ; N uni27B9 ; G 4157 +U 10170 ; WX 838 ; N uni27BA ; G 4158 +U 10171 ; WX 838 ; N uni27BB ; G 4159 +U 10172 ; WX 838 ; N uni27BC ; G 4160 +U 10173 ; WX 838 ; N uni27BD ; G 4161 +U 10174 ; WX 838 ; N uni27BE ; G 4162 +U 10181 ; WX 390 ; N uni27C5 ; G 4163 +U 10182 ; WX 390 ; N uni27C6 ; G 4164 +U 10208 ; WX 494 ; N uni27E0 ; G 4165 +U 10214 ; WX 495 ; N uni27E6 ; G 4166 +U 10215 ; WX 495 ; N uni27E7 ; G 4167 +U 10216 ; WX 390 ; N uni27E8 ; G 4168 +U 10217 ; WX 390 ; N uni27E9 ; G 4169 +U 10218 ; WX 556 ; N uni27EA ; G 4170 +U 10219 ; WX 556 ; N uni27EB ; G 4171 +U 10224 ; WX 838 ; N uni27F0 ; G 4172 +U 10225 ; WX 838 ; N uni27F1 ; G 4173 +U 10226 ; WX 838 ; N uni27F2 ; G 4174 +U 10227 ; WX 838 ; N uni27F3 ; G 4175 +U 10228 ; WX 1157 ; N uni27F4 ; G 4176 +U 10229 ; WX 1434 ; N uni27F5 ; G 4177 +U 10230 ; WX 1434 ; N uni27F6 ; G 4178 +U 10231 ; WX 1434 ; N uni27F7 ; G 4179 +U 10232 ; WX 1434 ; N uni27F8 ; G 4180 +U 10233 ; WX 1434 ; N uni27F9 ; G 4181 +U 10234 ; WX 1434 ; N uni27FA ; G 4182 +U 10235 ; WX 1434 ; N uni27FB ; G 4183 +U 10236 ; WX 1434 ; N uni27FC ; G 4184 +U 10237 ; WX 1434 ; N uni27FD ; G 4185 +U 10238 ; WX 1434 ; N uni27FE ; G 4186 +U 10239 ; WX 1434 ; N uni27FF ; G 4187 +U 10240 ; WX 732 ; N uni2800 ; G 4188 +U 10241 ; WX 732 ; N uni2801 ; G 4189 +U 10242 ; WX 732 ; N uni2802 ; G 4190 +U 10243 ; WX 732 ; N uni2803 ; G 4191 +U 10244 ; WX 732 ; N uni2804 ; G 4192 +U 10245 ; WX 732 ; N uni2805 ; G 4193 +U 10246 ; WX 732 ; N uni2806 ; G 4194 +U 10247 ; WX 732 ; N uni2807 ; G 4195 +U 10248 ; WX 732 ; N uni2808 ; G 4196 +U 10249 ; WX 732 ; N uni2809 ; G 4197 +U 10250 ; WX 732 ; N uni280A ; G 4198 +U 10251 ; WX 732 ; N uni280B ; G 4199 +U 10252 ; WX 732 ; N uni280C ; G 4200 +U 10253 ; WX 732 ; N uni280D ; G 4201 +U 10254 ; WX 732 ; N uni280E ; G 4202 +U 10255 ; WX 732 ; N uni280F ; G 4203 +U 10256 ; WX 732 ; N uni2810 ; G 4204 +U 10257 ; WX 732 ; N uni2811 ; G 4205 +U 10258 ; WX 732 ; N uni2812 ; G 4206 +U 10259 ; WX 732 ; N uni2813 ; G 4207 +U 10260 ; WX 732 ; N uni2814 ; G 4208 +U 10261 ; WX 732 ; N uni2815 ; G 4209 +U 10262 ; WX 732 ; N uni2816 ; G 4210 +U 10263 ; WX 732 ; N uni2817 ; G 4211 +U 10264 ; WX 732 ; N uni2818 ; G 4212 +U 10265 ; WX 732 ; N uni2819 ; G 4213 +U 10266 ; WX 732 ; N uni281A ; G 4214 +U 10267 ; WX 732 ; N uni281B ; G 4215 +U 10268 ; WX 732 ; N uni281C ; G 4216 +U 10269 ; WX 732 ; N uni281D ; G 4217 +U 10270 ; WX 732 ; N uni281E ; G 4218 +U 10271 ; WX 732 ; N uni281F ; G 4219 +U 10272 ; WX 732 ; N uni2820 ; G 4220 +U 10273 ; WX 732 ; N uni2821 ; G 4221 +U 10274 ; WX 732 ; N uni2822 ; G 4222 +U 10275 ; WX 732 ; N uni2823 ; G 4223 +U 10276 ; WX 732 ; N uni2824 ; G 4224 +U 10277 ; WX 732 ; N uni2825 ; G 4225 +U 10278 ; WX 732 ; N uni2826 ; G 4226 +U 10279 ; WX 732 ; N uni2827 ; G 4227 +U 10280 ; WX 732 ; N uni2828 ; G 4228 +U 10281 ; WX 732 ; N uni2829 ; G 4229 +U 10282 ; WX 732 ; N uni282A ; G 4230 +U 10283 ; WX 732 ; N uni282B ; G 4231 +U 10284 ; WX 732 ; N uni282C ; G 4232 +U 10285 ; WX 732 ; N uni282D ; G 4233 +U 10286 ; WX 732 ; N uni282E ; G 4234 +U 10287 ; WX 732 ; N uni282F ; G 4235 +U 10288 ; WX 732 ; N uni2830 ; G 4236 +U 10289 ; WX 732 ; N uni2831 ; G 4237 +U 10290 ; WX 732 ; N uni2832 ; G 4238 +U 10291 ; WX 732 ; N uni2833 ; G 4239 +U 10292 ; WX 732 ; N uni2834 ; G 4240 +U 10293 ; WX 732 ; N uni2835 ; G 4241 +U 10294 ; WX 732 ; N uni2836 ; G 4242 +U 10295 ; WX 732 ; N uni2837 ; G 4243 +U 10296 ; WX 732 ; N uni2838 ; G 4244 +U 10297 ; WX 732 ; N uni2839 ; G 4245 +U 10298 ; WX 732 ; N uni283A ; G 4246 +U 10299 ; WX 732 ; N uni283B ; G 4247 +U 10300 ; WX 732 ; N uni283C ; G 4248 +U 10301 ; WX 732 ; N uni283D ; G 4249 +U 10302 ; WX 732 ; N uni283E ; G 4250 +U 10303 ; WX 732 ; N uni283F ; G 4251 +U 10304 ; WX 732 ; N uni2840 ; G 4252 +U 10305 ; WX 732 ; N uni2841 ; G 4253 +U 10306 ; WX 732 ; N uni2842 ; G 4254 +U 10307 ; WX 732 ; N uni2843 ; G 4255 +U 10308 ; WX 732 ; N uni2844 ; G 4256 +U 10309 ; WX 732 ; N uni2845 ; G 4257 +U 10310 ; WX 732 ; N uni2846 ; G 4258 +U 10311 ; WX 732 ; N uni2847 ; G 4259 +U 10312 ; WX 732 ; N uni2848 ; G 4260 +U 10313 ; WX 732 ; N uni2849 ; G 4261 +U 10314 ; WX 732 ; N uni284A ; G 4262 +U 10315 ; WX 732 ; N uni284B ; G 4263 +U 10316 ; WX 732 ; N uni284C ; G 4264 +U 10317 ; WX 732 ; N uni284D ; G 4265 +U 10318 ; WX 732 ; N uni284E ; G 4266 +U 10319 ; WX 732 ; N uni284F ; G 4267 +U 10320 ; WX 732 ; N uni2850 ; G 4268 +U 10321 ; WX 732 ; N uni2851 ; G 4269 +U 10322 ; WX 732 ; N uni2852 ; G 4270 +U 10323 ; WX 732 ; N uni2853 ; G 4271 +U 10324 ; WX 732 ; N uni2854 ; G 4272 +U 10325 ; WX 732 ; N uni2855 ; G 4273 +U 10326 ; WX 732 ; N uni2856 ; G 4274 +U 10327 ; WX 732 ; N uni2857 ; G 4275 +U 10328 ; WX 732 ; N uni2858 ; G 4276 +U 10329 ; WX 732 ; N uni2859 ; G 4277 +U 10330 ; WX 732 ; N uni285A ; G 4278 +U 10331 ; WX 732 ; N uni285B ; G 4279 +U 10332 ; WX 732 ; N uni285C ; G 4280 +U 10333 ; WX 732 ; N uni285D ; G 4281 +U 10334 ; WX 732 ; N uni285E ; G 4282 +U 10335 ; WX 732 ; N uni285F ; G 4283 +U 10336 ; WX 732 ; N uni2860 ; G 4284 +U 10337 ; WX 732 ; N uni2861 ; G 4285 +U 10338 ; WX 732 ; N uni2862 ; G 4286 +U 10339 ; WX 732 ; N uni2863 ; G 4287 +U 10340 ; WX 732 ; N uni2864 ; G 4288 +U 10341 ; WX 732 ; N uni2865 ; G 4289 +U 10342 ; WX 732 ; N uni2866 ; G 4290 +U 10343 ; WX 732 ; N uni2867 ; G 4291 +U 10344 ; WX 732 ; N uni2868 ; G 4292 +U 10345 ; WX 732 ; N uni2869 ; G 4293 +U 10346 ; WX 732 ; N uni286A ; G 4294 +U 10347 ; WX 732 ; N uni286B ; G 4295 +U 10348 ; WX 732 ; N uni286C ; G 4296 +U 10349 ; WX 732 ; N uni286D ; G 4297 +U 10350 ; WX 732 ; N uni286E ; G 4298 +U 10351 ; WX 732 ; N uni286F ; G 4299 +U 10352 ; WX 732 ; N uni2870 ; G 4300 +U 10353 ; WX 732 ; N uni2871 ; G 4301 +U 10354 ; WX 732 ; N uni2872 ; G 4302 +U 10355 ; WX 732 ; N uni2873 ; G 4303 +U 10356 ; WX 732 ; N uni2874 ; G 4304 +U 10357 ; WX 732 ; N uni2875 ; G 4305 +U 10358 ; WX 732 ; N uni2876 ; G 4306 +U 10359 ; WX 732 ; N uni2877 ; G 4307 +U 10360 ; WX 732 ; N uni2878 ; G 4308 +U 10361 ; WX 732 ; N uni2879 ; G 4309 +U 10362 ; WX 732 ; N uni287A ; G 4310 +U 10363 ; WX 732 ; N uni287B ; G 4311 +U 10364 ; WX 732 ; N uni287C ; G 4312 +U 10365 ; WX 732 ; N uni287D ; G 4313 +U 10366 ; WX 732 ; N uni287E ; G 4314 +U 10367 ; WX 732 ; N uni287F ; G 4315 +U 10368 ; WX 732 ; N uni2880 ; G 4316 +U 10369 ; WX 732 ; N uni2881 ; G 4317 +U 10370 ; WX 732 ; N uni2882 ; G 4318 +U 10371 ; WX 732 ; N uni2883 ; G 4319 +U 10372 ; WX 732 ; N uni2884 ; G 4320 +U 10373 ; WX 732 ; N uni2885 ; G 4321 +U 10374 ; WX 732 ; N uni2886 ; G 4322 +U 10375 ; WX 732 ; N uni2887 ; G 4323 +U 10376 ; WX 732 ; N uni2888 ; G 4324 +U 10377 ; WX 732 ; N uni2889 ; G 4325 +U 10378 ; WX 732 ; N uni288A ; G 4326 +U 10379 ; WX 732 ; N uni288B ; G 4327 +U 10380 ; WX 732 ; N uni288C ; G 4328 +U 10381 ; WX 732 ; N uni288D ; G 4329 +U 10382 ; WX 732 ; N uni288E ; G 4330 +U 10383 ; WX 732 ; N uni288F ; G 4331 +U 10384 ; WX 732 ; N uni2890 ; G 4332 +U 10385 ; WX 732 ; N uni2891 ; G 4333 +U 10386 ; WX 732 ; N uni2892 ; G 4334 +U 10387 ; WX 732 ; N uni2893 ; G 4335 +U 10388 ; WX 732 ; N uni2894 ; G 4336 +U 10389 ; WX 732 ; N uni2895 ; G 4337 +U 10390 ; WX 732 ; N uni2896 ; G 4338 +U 10391 ; WX 732 ; N uni2897 ; G 4339 +U 10392 ; WX 732 ; N uni2898 ; G 4340 +U 10393 ; WX 732 ; N uni2899 ; G 4341 +U 10394 ; WX 732 ; N uni289A ; G 4342 +U 10395 ; WX 732 ; N uni289B ; G 4343 +U 10396 ; WX 732 ; N uni289C ; G 4344 +U 10397 ; WX 732 ; N uni289D ; G 4345 +U 10398 ; WX 732 ; N uni289E ; G 4346 +U 10399 ; WX 732 ; N uni289F ; G 4347 +U 10400 ; WX 732 ; N uni28A0 ; G 4348 +U 10401 ; WX 732 ; N uni28A1 ; G 4349 +U 10402 ; WX 732 ; N uni28A2 ; G 4350 +U 10403 ; WX 732 ; N uni28A3 ; G 4351 +U 10404 ; WX 732 ; N uni28A4 ; G 4352 +U 10405 ; WX 732 ; N uni28A5 ; G 4353 +U 10406 ; WX 732 ; N uni28A6 ; G 4354 +U 10407 ; WX 732 ; N uni28A7 ; G 4355 +U 10408 ; WX 732 ; N uni28A8 ; G 4356 +U 10409 ; WX 732 ; N uni28A9 ; G 4357 +U 10410 ; WX 732 ; N uni28AA ; G 4358 +U 10411 ; WX 732 ; N uni28AB ; G 4359 +U 10412 ; WX 732 ; N uni28AC ; G 4360 +U 10413 ; WX 732 ; N uni28AD ; G 4361 +U 10414 ; WX 732 ; N uni28AE ; G 4362 +U 10415 ; WX 732 ; N uni28AF ; G 4363 +U 10416 ; WX 732 ; N uni28B0 ; G 4364 +U 10417 ; WX 732 ; N uni28B1 ; G 4365 +U 10418 ; WX 732 ; N uni28B2 ; G 4366 +U 10419 ; WX 732 ; N uni28B3 ; G 4367 +U 10420 ; WX 732 ; N uni28B4 ; G 4368 +U 10421 ; WX 732 ; N uni28B5 ; G 4369 +U 10422 ; WX 732 ; N uni28B6 ; G 4370 +U 10423 ; WX 732 ; N uni28B7 ; G 4371 +U 10424 ; WX 732 ; N uni28B8 ; G 4372 +U 10425 ; WX 732 ; N uni28B9 ; G 4373 +U 10426 ; WX 732 ; N uni28BA ; G 4374 +U 10427 ; WX 732 ; N uni28BB ; G 4375 +U 10428 ; WX 732 ; N uni28BC ; G 4376 +U 10429 ; WX 732 ; N uni28BD ; G 4377 +U 10430 ; WX 732 ; N uni28BE ; G 4378 +U 10431 ; WX 732 ; N uni28BF ; G 4379 +U 10432 ; WX 732 ; N uni28C0 ; G 4380 +U 10433 ; WX 732 ; N uni28C1 ; G 4381 +U 10434 ; WX 732 ; N uni28C2 ; G 4382 +U 10435 ; WX 732 ; N uni28C3 ; G 4383 +U 10436 ; WX 732 ; N uni28C4 ; G 4384 +U 10437 ; WX 732 ; N uni28C5 ; G 4385 +U 10438 ; WX 732 ; N uni28C6 ; G 4386 +U 10439 ; WX 732 ; N uni28C7 ; G 4387 +U 10440 ; WX 732 ; N uni28C8 ; G 4388 +U 10441 ; WX 732 ; N uni28C9 ; G 4389 +U 10442 ; WX 732 ; N uni28CA ; G 4390 +U 10443 ; WX 732 ; N uni28CB ; G 4391 +U 10444 ; WX 732 ; N uni28CC ; G 4392 +U 10445 ; WX 732 ; N uni28CD ; G 4393 +U 10446 ; WX 732 ; N uni28CE ; G 4394 +U 10447 ; WX 732 ; N uni28CF ; G 4395 +U 10448 ; WX 732 ; N uni28D0 ; G 4396 +U 10449 ; WX 732 ; N uni28D1 ; G 4397 +U 10450 ; WX 732 ; N uni28D2 ; G 4398 +U 10451 ; WX 732 ; N uni28D3 ; G 4399 +U 10452 ; WX 732 ; N uni28D4 ; G 4400 +U 10453 ; WX 732 ; N uni28D5 ; G 4401 +U 10454 ; WX 732 ; N uni28D6 ; G 4402 +U 10455 ; WX 732 ; N uni28D7 ; G 4403 +U 10456 ; WX 732 ; N uni28D8 ; G 4404 +U 10457 ; WX 732 ; N uni28D9 ; G 4405 +U 10458 ; WX 732 ; N uni28DA ; G 4406 +U 10459 ; WX 732 ; N uni28DB ; G 4407 +U 10460 ; WX 732 ; N uni28DC ; G 4408 +U 10461 ; WX 732 ; N uni28DD ; G 4409 +U 10462 ; WX 732 ; N uni28DE ; G 4410 +U 10463 ; WX 732 ; N uni28DF ; G 4411 +U 10464 ; WX 732 ; N uni28E0 ; G 4412 +U 10465 ; WX 732 ; N uni28E1 ; G 4413 +U 10466 ; WX 732 ; N uni28E2 ; G 4414 +U 10467 ; WX 732 ; N uni28E3 ; G 4415 +U 10468 ; WX 732 ; N uni28E4 ; G 4416 +U 10469 ; WX 732 ; N uni28E5 ; G 4417 +U 10470 ; WX 732 ; N uni28E6 ; G 4418 +U 10471 ; WX 732 ; N uni28E7 ; G 4419 +U 10472 ; WX 732 ; N uni28E8 ; G 4420 +U 10473 ; WX 732 ; N uni28E9 ; G 4421 +U 10474 ; WX 732 ; N uni28EA ; G 4422 +U 10475 ; WX 732 ; N uni28EB ; G 4423 +U 10476 ; WX 732 ; N uni28EC ; G 4424 +U 10477 ; WX 732 ; N uni28ED ; G 4425 +U 10478 ; WX 732 ; N uni28EE ; G 4426 +U 10479 ; WX 732 ; N uni28EF ; G 4427 +U 10480 ; WX 732 ; N uni28F0 ; G 4428 +U 10481 ; WX 732 ; N uni28F1 ; G 4429 +U 10482 ; WX 732 ; N uni28F2 ; G 4430 +U 10483 ; WX 732 ; N uni28F3 ; G 4431 +U 10484 ; WX 732 ; N uni28F4 ; G 4432 +U 10485 ; WX 732 ; N uni28F5 ; G 4433 +U 10486 ; WX 732 ; N uni28F6 ; G 4434 +U 10487 ; WX 732 ; N uni28F7 ; G 4435 +U 10488 ; WX 732 ; N uni28F8 ; G 4436 +U 10489 ; WX 732 ; N uni28F9 ; G 4437 +U 10490 ; WX 732 ; N uni28FA ; G 4438 +U 10491 ; WX 732 ; N uni28FB ; G 4439 +U 10492 ; WX 732 ; N uni28FC ; G 4440 +U 10493 ; WX 732 ; N uni28FD ; G 4441 +U 10494 ; WX 732 ; N uni28FE ; G 4442 +U 10495 ; WX 732 ; N uni28FF ; G 4443 +U 10502 ; WX 838 ; N uni2906 ; G 4444 +U 10503 ; WX 838 ; N uni2907 ; G 4445 +U 10506 ; WX 838 ; N uni290A ; G 4446 +U 10507 ; WX 838 ; N uni290B ; G 4447 +U 10560 ; WX 683 ; N uni2940 ; G 4448 +U 10561 ; WX 683 ; N uni2941 ; G 4449 +U 10627 ; WX 734 ; N uni2983 ; G 4450 +U 10628 ; WX 734 ; N uni2984 ; G 4451 +U 10702 ; WX 838 ; N uni29CE ; G 4452 +U 10703 ; WX 1000 ; N uni29CF ; G 4453 +U 10704 ; WX 1000 ; N uni29D0 ; G 4454 +U 10705 ; WX 1000 ; N uni29D1 ; G 4455 +U 10706 ; WX 1000 ; N uni29D2 ; G 4456 +U 10707 ; WX 1000 ; N uni29D3 ; G 4457 +U 10708 ; WX 1000 ; N uni29D4 ; G 4458 +U 10709 ; WX 1000 ; N uni29D5 ; G 4459 +U 10731 ; WX 494 ; N uni29EB ; G 4460 +U 10746 ; WX 838 ; N uni29FA ; G 4461 +U 10747 ; WX 838 ; N uni29FB ; G 4462 +U 10752 ; WX 1000 ; N uni2A00 ; G 4463 +U 10753 ; WX 1000 ; N uni2A01 ; G 4464 +U 10754 ; WX 1000 ; N uni2A02 ; G 4465 +U 10764 ; WX 1325 ; N uni2A0C ; G 4466 +U 10765 ; WX 521 ; N uni2A0D ; G 4467 +U 10766 ; WX 521 ; N uni2A0E ; G 4468 +U 10767 ; WX 521 ; N uni2A0F ; G 4469 +U 10768 ; WX 521 ; N uni2A10 ; G 4470 +U 10769 ; WX 521 ; N uni2A11 ; G 4471 +U 10770 ; WX 521 ; N uni2A12 ; G 4472 +U 10771 ; WX 521 ; N uni2A13 ; G 4473 +U 10772 ; WX 521 ; N uni2A14 ; G 4474 +U 10773 ; WX 521 ; N uni2A15 ; G 4475 +U 10774 ; WX 521 ; N uni2A16 ; G 4476 +U 10775 ; WX 521 ; N uni2A17 ; G 4477 +U 10776 ; WX 521 ; N uni2A18 ; G 4478 +U 10777 ; WX 521 ; N uni2A19 ; G 4479 +U 10778 ; WX 521 ; N uni2A1A ; G 4480 +U 10779 ; WX 521 ; N uni2A1B ; G 4481 +U 10780 ; WX 521 ; N uni2A1C ; G 4482 +U 10799 ; WX 838 ; N uni2A2F ; G 4483 +U 10858 ; WX 838 ; N uni2A6A ; G 4484 +U 10859 ; WX 838 ; N uni2A6B ; G 4485 +U 10877 ; WX 838 ; N uni2A7D ; G 4486 +U 10878 ; WX 838 ; N uni2A7E ; G 4487 +U 10879 ; WX 838 ; N uni2A7F ; G 4488 +U 10880 ; WX 838 ; N uni2A80 ; G 4489 +U 10881 ; WX 838 ; N uni2A81 ; G 4490 +U 10882 ; WX 838 ; N uni2A82 ; G 4491 +U 10883 ; WX 838 ; N uni2A83 ; G 4492 +U 10884 ; WX 838 ; N uni2A84 ; G 4493 +U 10885 ; WX 838 ; N uni2A85 ; G 4494 +U 10886 ; WX 838 ; N uni2A86 ; G 4495 +U 10887 ; WX 838 ; N uni2A87 ; G 4496 +U 10888 ; WX 838 ; N uni2A88 ; G 4497 +U 10889 ; WX 838 ; N uni2A89 ; G 4498 +U 10890 ; WX 838 ; N uni2A8A ; G 4499 +U 10891 ; WX 838 ; N uni2A8B ; G 4500 +U 10892 ; WX 838 ; N uni2A8C ; G 4501 +U 10893 ; WX 838 ; N uni2A8D ; G 4502 +U 10894 ; WX 838 ; N uni2A8E ; G 4503 +U 10895 ; WX 838 ; N uni2A8F ; G 4504 +U 10896 ; WX 838 ; N uni2A90 ; G 4505 +U 10897 ; WX 838 ; N uni2A91 ; G 4506 +U 10898 ; WX 838 ; N uni2A92 ; G 4507 +U 10899 ; WX 838 ; N uni2A93 ; G 4508 +U 10900 ; WX 838 ; N uni2A94 ; G 4509 +U 10901 ; WX 838 ; N uni2A95 ; G 4510 +U 10902 ; WX 838 ; N uni2A96 ; G 4511 +U 10903 ; WX 838 ; N uni2A97 ; G 4512 +U 10904 ; WX 838 ; N uni2A98 ; G 4513 +U 10905 ; WX 838 ; N uni2A99 ; G 4514 +U 10906 ; WX 838 ; N uni2A9A ; G 4515 +U 10907 ; WX 838 ; N uni2A9B ; G 4516 +U 10908 ; WX 838 ; N uni2A9C ; G 4517 +U 10909 ; WX 838 ; N uni2A9D ; G 4518 +U 10910 ; WX 838 ; N uni2A9E ; G 4519 +U 10911 ; WX 838 ; N uni2A9F ; G 4520 +U 10912 ; WX 838 ; N uni2AA0 ; G 4521 +U 10926 ; WX 838 ; N uni2AAE ; G 4522 +U 10927 ; WX 838 ; N uni2AAF ; G 4523 +U 10928 ; WX 838 ; N uni2AB0 ; G 4524 +U 10929 ; WX 838 ; N uni2AB1 ; G 4525 +U 10930 ; WX 838 ; N uni2AB2 ; G 4526 +U 10931 ; WX 838 ; N uni2AB3 ; G 4527 +U 10932 ; WX 838 ; N uni2AB4 ; G 4528 +U 10933 ; WX 838 ; N uni2AB5 ; G 4529 +U 10934 ; WX 838 ; N uni2AB6 ; G 4530 +U 10935 ; WX 838 ; N uni2AB7 ; G 4531 +U 10936 ; WX 838 ; N uni2AB8 ; G 4532 +U 10937 ; WX 838 ; N uni2AB9 ; G 4533 +U 10938 ; WX 838 ; N uni2ABA ; G 4534 +U 11001 ; WX 838 ; N uni2AF9 ; G 4535 +U 11002 ; WX 838 ; N uni2AFA ; G 4536 +U 11008 ; WX 838 ; N uni2B00 ; G 4537 +U 11009 ; WX 838 ; N uni2B01 ; G 4538 +U 11010 ; WX 838 ; N uni2B02 ; G 4539 +U 11011 ; WX 838 ; N uni2B03 ; G 4540 +U 11012 ; WX 838 ; N uni2B04 ; G 4541 +U 11013 ; WX 838 ; N uni2B05 ; G 4542 +U 11014 ; WX 838 ; N uni2B06 ; G 4543 +U 11015 ; WX 838 ; N uni2B07 ; G 4544 +U 11016 ; WX 838 ; N uni2B08 ; G 4545 +U 11017 ; WX 838 ; N uni2B09 ; G 4546 +U 11018 ; WX 838 ; N uni2B0A ; G 4547 +U 11019 ; WX 838 ; N uni2B0B ; G 4548 +U 11020 ; WX 838 ; N uni2B0C ; G 4549 +U 11021 ; WX 838 ; N uni2B0D ; G 4550 +U 11022 ; WX 836 ; N uni2B0E ; G 4551 +U 11023 ; WX 836 ; N uni2B0F ; G 4552 +U 11024 ; WX 836 ; N uni2B10 ; G 4553 +U 11025 ; WX 836 ; N uni2B11 ; G 4554 +U 11026 ; WX 945 ; N uni2B12 ; G 4555 +U 11027 ; WX 945 ; N uni2B13 ; G 4556 +U 11028 ; WX 945 ; N uni2B14 ; G 4557 +U 11029 ; WX 945 ; N uni2B15 ; G 4558 +U 11030 ; WX 769 ; N uni2B16 ; G 4559 +U 11031 ; WX 769 ; N uni2B17 ; G 4560 +U 11032 ; WX 769 ; N uni2B18 ; G 4561 +U 11033 ; WX 769 ; N uni2B19 ; G 4562 +U 11034 ; WX 945 ; N uni2B1A ; G 4563 +U 11039 ; WX 869 ; N uni2B1F ; G 4564 +U 11040 ; WX 869 ; N uni2B20 ; G 4565 +U 11041 ; WX 873 ; N uni2B21 ; G 4566 +U 11042 ; WX 873 ; N uni2B22 ; G 4567 +U 11043 ; WX 873 ; N uni2B23 ; G 4568 +U 11044 ; WX 1119 ; N uni2B24 ; G 4569 +U 11091 ; WX 869 ; N uni2B53 ; G 4570 +U 11092 ; WX 869 ; N uni2B54 ; G 4571 +U 11360 ; WX 557 ; N uni2C60 ; G 4572 +U 11361 ; WX 278 ; N uni2C61 ; G 4573 +U 11362 ; WX 557 ; N uni2C62 ; G 4574 +U 11363 ; WX 603 ; N uni2C63 ; G 4575 +U 11364 ; WX 695 ; N uni2C64 ; G 4576 +U 11365 ; WX 613 ; N uni2C65 ; G 4577 +U 11366 ; WX 392 ; N uni2C66 ; G 4578 +U 11367 ; WX 752 ; N uni2C67 ; G 4579 +U 11368 ; WX 634 ; N uni2C68 ; G 4580 +U 11369 ; WX 656 ; N uni2C69 ; G 4581 +U 11370 ; WX 579 ; N uni2C6A ; G 4582 +U 11371 ; WX 685 ; N uni2C6B ; G 4583 +U 11372 ; WX 525 ; N uni2C6C ; G 4584 +U 11373 ; WX 781 ; N uni2C6D ; G 4585 +U 11374 ; WX 863 ; N uni2C6E ; G 4586 +U 11375 ; WX 684 ; N uni2C6F ; G 4587 +U 11376 ; WX 781 ; N uni2C70 ; G 4588 +U 11377 ; WX 734 ; N uni2C71 ; G 4589 +U 11378 ; WX 1128 ; N uni2C72 ; G 4590 +U 11379 ; WX 961 ; N uni2C73 ; G 4591 +U 11380 ; WX 592 ; N uni2C74 ; G 4592 +U 11381 ; WX 654 ; N uni2C75 ; G 4593 +U 11382 ; WX 568 ; N uni2C76 ; G 4594 +U 11383 ; WX 660 ; N uni2C77 ; G 4595 +U 11385 ; WX 414 ; N uni2C79 ; G 4596 +U 11386 ; WX 612 ; N uni2C7A ; G 4597 +U 11387 ; WX 491 ; N uni2C7B ; G 4598 +U 11388 ; WX 175 ; N uni2C7C ; G 4599 +U 11389 ; WX 431 ; N uni2C7D ; G 4600 +U 11390 ; WX 635 ; N uni2C7E ; G 4601 +U 11391 ; WX 685 ; N uni2C7F ; G 4602 +U 11520 ; WX 591 ; N uni2D00 ; G 4603 +U 11521 ; WX 595 ; N uni2D01 ; G 4604 +U 11522 ; WX 564 ; N uni2D02 ; G 4605 +U 11523 ; WX 602 ; N uni2D03 ; G 4606 +U 11524 ; WX 587 ; N uni2D04 ; G 4607 +U 11525 ; WX 911 ; N uni2D05 ; G 4608 +U 11526 ; WX 626 ; N uni2D06 ; G 4609 +U 11527 ; WX 952 ; N uni2D07 ; G 4610 +U 11528 ; WX 595 ; N uni2D08 ; G 4611 +U 11529 ; WX 607 ; N uni2D09 ; G 4612 +U 11530 ; WX 954 ; N uni2D0A ; G 4613 +U 11531 ; WX 620 ; N uni2D0B ; G 4614 +U 11532 ; WX 595 ; N uni2D0C ; G 4615 +U 11533 ; WX 926 ; N uni2D0D ; G 4616 +U 11534 ; WX 595 ; N uni2D0E ; G 4617 +U 11535 ; WX 806 ; N uni2D0F ; G 4618 +U 11536 ; WX 931 ; N uni2D10 ; G 4619 +U 11537 ; WX 584 ; N uni2D11 ; G 4620 +U 11538 ; WX 592 ; N uni2D12 ; G 4621 +U 11539 ; WX 923 ; N uni2D13 ; G 4622 +U 11540 ; WX 953 ; N uni2D14 ; G 4623 +U 11541 ; WX 828 ; N uni2D15 ; G 4624 +U 11542 ; WX 596 ; N uni2D16 ; G 4625 +U 11543 ; WX 595 ; N uni2D17 ; G 4626 +U 11544 ; WX 590 ; N uni2D18 ; G 4627 +U 11545 ; WX 592 ; N uni2D19 ; G 4628 +U 11546 ; WX 592 ; N uni2D1A ; G 4629 +U 11547 ; WX 621 ; N uni2D1B ; G 4630 +U 11548 ; WX 920 ; N uni2D1C ; G 4631 +U 11549 ; WX 589 ; N uni2D1D ; G 4632 +U 11550 ; WX 586 ; N uni2D1E ; G 4633 +U 11551 ; WX 581 ; N uni2D1F ; G 4634 +U 11552 ; WX 914 ; N uni2D20 ; G 4635 +U 11553 ; WX 596 ; N uni2D21 ; G 4636 +U 11554 ; WX 595 ; N uni2D22 ; G 4637 +U 11555 ; WX 592 ; N uni2D23 ; G 4638 +U 11556 ; WX 642 ; N uni2D24 ; G 4639 +U 11557 ; WX 901 ; N uni2D25 ; G 4640 +U 11568 ; WX 646 ; N uni2D30 ; G 4641 +U 11569 ; WX 888 ; N uni2D31 ; G 4642 +U 11570 ; WX 888 ; N uni2D32 ; G 4643 +U 11571 ; WX 682 ; N uni2D33 ; G 4644 +U 11572 ; WX 684 ; N uni2D34 ; G 4645 +U 11573 ; WX 635 ; N uni2D35 ; G 4646 +U 11574 ; WX 562 ; N uni2D36 ; G 4647 +U 11575 ; WX 684 ; N uni2D37 ; G 4648 +U 11576 ; WX 684 ; N uni2D38 ; G 4649 +U 11577 ; WX 632 ; N uni2D39 ; G 4650 +U 11578 ; WX 632 ; N uni2D3A ; G 4651 +U 11579 ; WX 683 ; N uni2D3B ; G 4652 +U 11580 ; WX 875 ; N uni2D3C ; G 4653 +U 11581 ; WX 685 ; N uni2D3D ; G 4654 +U 11582 ; WX 491 ; N uni2D3E ; G 4655 +U 11583 ; WX 685 ; N uni2D3F ; G 4656 +U 11584 ; WX 888 ; N uni2D40 ; G 4657 +U 11585 ; WX 888 ; N uni2D41 ; G 4658 +U 11586 ; WX 300 ; N uni2D42 ; G 4659 +U 11587 ; WX 627 ; N uni2D43 ; G 4660 +U 11588 ; WX 752 ; N uni2D44 ; G 4661 +U 11589 ; WX 656 ; N uni2D45 ; G 4662 +U 11590 ; WX 527 ; N uni2D46 ; G 4663 +U 11591 ; WX 685 ; N uni2D47 ; G 4664 +U 11592 ; WX 645 ; N uni2D48 ; G 4665 +U 11593 ; WX 632 ; N uni2D49 ; G 4666 +U 11594 ; WX 502 ; N uni2D4A ; G 4667 +U 11595 ; WX 953 ; N uni2D4B ; G 4668 +U 11596 ; WX 778 ; N uni2D4C ; G 4669 +U 11597 ; WX 748 ; N uni2D4D ; G 4670 +U 11598 ; WX 621 ; N uni2D4E ; G 4671 +U 11599 ; WX 295 ; N uni2D4F ; G 4672 +U 11600 ; WX 778 ; N uni2D50 ; G 4673 +U 11601 ; WX 295 ; N uni2D51 ; G 4674 +U 11602 ; WX 752 ; N uni2D52 ; G 4675 +U 11603 ; WX 633 ; N uni2D53 ; G 4676 +U 11604 ; WX 888 ; N uni2D54 ; G 4677 +U 11605 ; WX 888 ; N uni2D55 ; G 4678 +U 11606 ; WX 752 ; N uni2D56 ; G 4679 +U 11607 ; WX 320 ; N uni2D57 ; G 4680 +U 11608 ; WX 749 ; N uni2D58 ; G 4681 +U 11609 ; WX 888 ; N uni2D59 ; G 4682 +U 11610 ; WX 888 ; N uni2D5A ; G 4683 +U 11611 ; WX 698 ; N uni2D5B ; G 4684 +U 11612 ; WX 768 ; N uni2D5C ; G 4685 +U 11613 ; WX 685 ; N uni2D5D ; G 4686 +U 11614 ; WX 698 ; N uni2D5E ; G 4687 +U 11615 ; WX 622 ; N uni2D5F ; G 4688 +U 11616 ; WX 684 ; N uni2D60 ; G 4689 +U 11617 ; WX 752 ; N uni2D61 ; G 4690 +U 11618 ; WX 632 ; N uni2D62 ; G 4691 +U 11619 ; WX 788 ; N uni2D63 ; G 4692 +U 11620 ; WX 567 ; N uni2D64 ; G 4693 +U 11621 ; WX 788 ; N uni2D65 ; G 4694 +U 11631 ; WX 515 ; N uni2D6F ; G 4695 +U 11800 ; WX 531 ; N uni2E18 ; G 4696 +U 11807 ; WX 838 ; N uni2E1F ; G 4697 +U 11810 ; WX 390 ; N uni2E22 ; G 4698 +U 11811 ; WX 390 ; N uni2E23 ; G 4699 +U 11812 ; WX 390 ; N uni2E24 ; G 4700 +U 11813 ; WX 390 ; N uni2E25 ; G 4701 +U 11822 ; WX 531 ; N uni2E2E ; G 4702 +U 19904 ; WX 896 ; N uni4DC0 ; G 4703 +U 19905 ; WX 896 ; N uni4DC1 ; G 4704 +U 19906 ; WX 896 ; N uni4DC2 ; G 4705 +U 19907 ; WX 896 ; N uni4DC3 ; G 4706 +U 19908 ; WX 896 ; N uni4DC4 ; G 4707 +U 19909 ; WX 896 ; N uni4DC5 ; G 4708 +U 19910 ; WX 896 ; N uni4DC6 ; G 4709 +U 19911 ; WX 896 ; N uni4DC7 ; G 4710 +U 19912 ; WX 896 ; N uni4DC8 ; G 4711 +U 19913 ; WX 896 ; N uni4DC9 ; G 4712 +U 19914 ; WX 896 ; N uni4DCA ; G 4713 +U 19915 ; WX 896 ; N uni4DCB ; G 4714 +U 19916 ; WX 896 ; N uni4DCC ; G 4715 +U 19917 ; WX 896 ; N uni4DCD ; G 4716 +U 19918 ; WX 896 ; N uni4DCE ; G 4717 +U 19919 ; WX 896 ; N uni4DCF ; G 4718 +U 19920 ; WX 896 ; N uni4DD0 ; G 4719 +U 19921 ; WX 896 ; N uni4DD1 ; G 4720 +U 19922 ; WX 896 ; N uni4DD2 ; G 4721 +U 19923 ; WX 896 ; N uni4DD3 ; G 4722 +U 19924 ; WX 896 ; N uni4DD4 ; G 4723 +U 19925 ; WX 896 ; N uni4DD5 ; G 4724 +U 19926 ; WX 896 ; N uni4DD6 ; G 4725 +U 19927 ; WX 896 ; N uni4DD7 ; G 4726 +U 19928 ; WX 896 ; N uni4DD8 ; G 4727 +U 19929 ; WX 896 ; N uni4DD9 ; G 4728 +U 19930 ; WX 896 ; N uni4DDA ; G 4729 +U 19931 ; WX 896 ; N uni4DDB ; G 4730 +U 19932 ; WX 896 ; N uni4DDC ; G 4731 +U 19933 ; WX 896 ; N uni4DDD ; G 4732 +U 19934 ; WX 896 ; N uni4DDE ; G 4733 +U 19935 ; WX 896 ; N uni4DDF ; G 4734 +U 19936 ; WX 896 ; N uni4DE0 ; G 4735 +U 19937 ; WX 896 ; N uni4DE1 ; G 4736 +U 19938 ; WX 896 ; N uni4DE2 ; G 4737 +U 19939 ; WX 896 ; N uni4DE3 ; G 4738 +U 19940 ; WX 896 ; N uni4DE4 ; G 4739 +U 19941 ; WX 896 ; N uni4DE5 ; G 4740 +U 19942 ; WX 896 ; N uni4DE6 ; G 4741 +U 19943 ; WX 896 ; N uni4DE7 ; G 4742 +U 19944 ; WX 896 ; N uni4DE8 ; G 4743 +U 19945 ; WX 896 ; N uni4DE9 ; G 4744 +U 19946 ; WX 896 ; N uni4DEA ; G 4745 +U 19947 ; WX 896 ; N uni4DEB ; G 4746 +U 19948 ; WX 896 ; N uni4DEC ; G 4747 +U 19949 ; WX 896 ; N uni4DED ; G 4748 +U 19950 ; WX 896 ; N uni4DEE ; G 4749 +U 19951 ; WX 896 ; N uni4DEF ; G 4750 +U 19952 ; WX 896 ; N uni4DF0 ; G 4751 +U 19953 ; WX 896 ; N uni4DF1 ; G 4752 +U 19954 ; WX 896 ; N uni4DF2 ; G 4753 +U 19955 ; WX 896 ; N uni4DF3 ; G 4754 +U 19956 ; WX 896 ; N uni4DF4 ; G 4755 +U 19957 ; WX 896 ; N uni4DF5 ; G 4756 +U 19958 ; WX 896 ; N uni4DF6 ; G 4757 +U 19959 ; WX 896 ; N uni4DF7 ; G 4758 +U 19960 ; WX 896 ; N uni4DF8 ; G 4759 +U 19961 ; WX 896 ; N uni4DF9 ; G 4760 +U 19962 ; WX 896 ; N uni4DFA ; G 4761 +U 19963 ; WX 896 ; N uni4DFB ; G 4762 +U 19964 ; WX 896 ; N uni4DFC ; G 4763 +U 19965 ; WX 896 ; N uni4DFD ; G 4764 +U 19966 ; WX 896 ; N uni4DFE ; G 4765 +U 19967 ; WX 896 ; N uni4DFF ; G 4766 +U 42192 ; WX 686 ; N uniA4D0 ; G 4767 +U 42193 ; WX 603 ; N uniA4D1 ; G 4768 +U 42194 ; WX 603 ; N uniA4D2 ; G 4769 +U 42195 ; WX 770 ; N uniA4D3 ; G 4770 +U 42196 ; WX 611 ; N uniA4D4 ; G 4771 +U 42197 ; WX 611 ; N uniA4D5 ; G 4772 +U 42198 ; WX 775 ; N uniA4D6 ; G 4773 +U 42199 ; WX 656 ; N uniA4D7 ; G 4774 +U 42200 ; WX 656 ; N uniA4D8 ; G 4775 +U 42201 ; WX 512 ; N uniA4D9 ; G 4776 +U 42202 ; WX 698 ; N uniA4DA ; G 4777 +U 42203 ; WX 703 ; N uniA4DB ; G 4778 +U 42204 ; WX 685 ; N uniA4DC ; G 4779 +U 42205 ; WX 575 ; N uniA4DD ; G 4780 +U 42206 ; WX 575 ; N uniA4DE ; G 4781 +U 42207 ; WX 863 ; N uniA4DF ; G 4782 +U 42208 ; WX 748 ; N uniA4E0 ; G 4783 +U 42209 ; WX 557 ; N uniA4E1 ; G 4784 +U 42210 ; WX 635 ; N uniA4E2 ; G 4785 +U 42211 ; WX 695 ; N uniA4E3 ; G 4786 +U 42212 ; WX 695 ; N uniA4E4 ; G 4787 +U 42213 ; WX 684 ; N uniA4E5 ; G 4788 +U 42214 ; WX 684 ; N uniA4E6 ; G 4789 +U 42215 ; WX 752 ; N uniA4E7 ; G 4790 +U 42216 ; WX 775 ; N uniA4E8 ; G 4791 +U 42217 ; WX 512 ; N uniA4E9 ; G 4792 +U 42218 ; WX 989 ; N uniA4EA ; G 4793 +U 42219 ; WX 685 ; N uniA4EB ; G 4794 +U 42220 ; WX 611 ; N uniA4EC ; G 4795 +U 42221 ; WX 686 ; N uniA4ED ; G 4796 +U 42222 ; WX 684 ; N uniA4EE ; G 4797 +U 42223 ; WX 684 ; N uniA4EF ; G 4798 +U 42224 ; WX 632 ; N uniA4F0 ; G 4799 +U 42225 ; WX 632 ; N uniA4F1 ; G 4800 +U 42226 ; WX 295 ; N uniA4F2 ; G 4801 +U 42227 ; WX 787 ; N uniA4F3 ; G 4802 +U 42228 ; WX 732 ; N uniA4F4 ; G 4803 +U 42229 ; WX 732 ; N uniA4F5 ; G 4804 +U 42230 ; WX 557 ; N uniA4F6 ; G 4805 +U 42231 ; WX 767 ; N uniA4F7 ; G 4806 +U 42232 ; WX 300 ; N uniA4F8 ; G 4807 +U 42233 ; WX 300 ; N uniA4F9 ; G 4808 +U 42234 ; WX 596 ; N uniA4FA ; G 4809 +U 42235 ; WX 596 ; N uniA4FB ; G 4810 +U 42236 ; WX 300 ; N uniA4FC ; G 4811 +U 42237 ; WX 300 ; N uniA4FD ; G 4812 +U 42238 ; WX 588 ; N uniA4FE ; G 4813 +U 42239 ; WX 588 ; N uniA4FF ; G 4814 +U 42564 ; WX 635 ; N uniA644 ; G 4815 +U 42565 ; WX 521 ; N uniA645 ; G 4816 +U 42566 ; WX 354 ; N uniA646 ; G 4817 +U 42567 ; WX 338 ; N uniA647 ; G 4818 +U 42572 ; WX 1180 ; N uniA64C ; G 4819 +U 42573 ; WX 1028 ; N uniA64D ; G 4820 +U 42576 ; WX 1029 ; N uniA650 ; G 4821 +U 42577 ; WX 906 ; N uniA651 ; G 4822 +U 42580 ; WX 1080 ; N uniA654 ; G 4823 +U 42581 ; WX 842 ; N uniA655 ; G 4824 +U 42582 ; WX 977 ; N uniA656 ; G 4825 +U 42583 ; WX 843 ; N uniA657 ; G 4826 +U 42594 ; WX 1062 ; N uniA662 ; G 4827 +U 42595 ; WX 912 ; N uniA663 ; G 4828 +U 42596 ; WX 1066 ; N uniA664 ; G 4829 +U 42597 ; WX 901 ; N uniA665 ; G 4830 +U 42598 ; WX 1178 ; N uniA666 ; G 4831 +U 42599 ; WX 1008 ; N uniA667 ; G 4832 +U 42600 ; WX 787 ; N uniA668 ; G 4833 +U 42601 ; WX 612 ; N uniA669 ; G 4834 +U 42602 ; WX 855 ; N uniA66A ; G 4835 +U 42603 ; WX 712 ; N uniA66B ; G 4836 +U 42604 ; WX 1358 ; N uniA66C ; G 4837 +U 42605 ; WX 1019 ; N uniA66D ; G 4838 +U 42606 ; WX 879 ; N uniA66E ; G 4839 +U 42634 ; WX 782 ; N uniA68A ; G 4840 +U 42635 ; WX 685 ; N uniA68B ; G 4841 +U 42636 ; WX 611 ; N uniA68C ; G 4842 +U 42637 ; WX 583 ; N uniA68D ; G 4843 +U 42644 ; WX 686 ; N uniA694 ; G 4844 +U 42645 ; WX 634 ; N uniA695 ; G 4845 +U 42648 ; WX 1358 ; N uniA698 ; G 4846 +U 42649 ; WX 1019 ; N uniA699 ; G 4847 +U 42760 ; WX 493 ; N uniA708 ; G 4848 +U 42761 ; WX 493 ; N uniA709 ; G 4849 +U 42762 ; WX 493 ; N uniA70A ; G 4850 +U 42763 ; WX 493 ; N uniA70B ; G 4851 +U 42764 ; WX 493 ; N uniA70C ; G 4852 +U 42765 ; WX 493 ; N uniA70D ; G 4853 +U 42766 ; WX 493 ; N uniA70E ; G 4854 +U 42767 ; WX 493 ; N uniA70F ; G 4855 +U 42768 ; WX 493 ; N uniA710 ; G 4856 +U 42769 ; WX 493 ; N uniA711 ; G 4857 +U 42770 ; WX 493 ; N uniA712 ; G 4858 +U 42771 ; WX 493 ; N uniA713 ; G 4859 +U 42772 ; WX 493 ; N uniA714 ; G 4860 +U 42773 ; WX 493 ; N uniA715 ; G 4861 +U 42774 ; WX 493 ; N uniA716 ; G 4862 +U 42779 ; WX 369 ; N uniA71B ; G 4863 +U 42780 ; WX 369 ; N uniA71C ; G 4864 +U 42781 ; WX 252 ; N uniA71D ; G 4865 +U 42782 ; WX 252 ; N uniA71E ; G 4866 +U 42783 ; WX 252 ; N uniA71F ; G 4867 +U 42786 ; WX 385 ; N uniA722 ; G 4868 +U 42787 ; WX 356 ; N uniA723 ; G 4869 +U 42788 ; WX 472 ; N uniA724 ; G 4870 +U 42789 ; WX 472 ; N uniA725 ; G 4871 +U 42790 ; WX 752 ; N uniA726 ; G 4872 +U 42791 ; WX 634 ; N uniA727 ; G 4873 +U 42792 ; WX 878 ; N uniA728 ; G 4874 +U 42793 ; WX 709 ; N uniA729 ; G 4875 +U 42794 ; WX 614 ; N uniA72A ; G 4876 +U 42795 ; WX 541 ; N uniA72B ; G 4877 +U 42800 ; WX 491 ; N uniA730 ; G 4878 +U 42801 ; WX 521 ; N uniA731 ; G 4879 +U 42802 ; WX 1250 ; N uniA732 ; G 4880 +U 42803 ; WX 985 ; N uniA733 ; G 4881 +U 42804 ; WX 1203 ; N uniA734 ; G 4882 +U 42805 ; WX 990 ; N uniA735 ; G 4883 +U 42806 ; WX 1142 ; N uniA736 ; G 4884 +U 42807 ; WX 981 ; N uniA737 ; G 4885 +U 42808 ; WX 971 ; N uniA738 ; G 4886 +U 42809 ; WX 818 ; N uniA739 ; G 4887 +U 42810 ; WX 971 ; N uniA73A ; G 4888 +U 42811 ; WX 818 ; N uniA73B ; G 4889 +U 42812 ; WX 959 ; N uniA73C ; G 4890 +U 42813 ; WX 818 ; N uniA73D ; G 4891 +U 42814 ; WX 703 ; N uniA73E ; G 4892 +U 42815 ; WX 549 ; N uniA73F ; G 4893 +U 42816 ; WX 656 ; N uniA740 ; G 4894 +U 42817 ; WX 583 ; N uniA741 ; G 4895 +U 42822 ; WX 680 ; N uniA746 ; G 4896 +U 42823 ; WX 392 ; N uniA747 ; G 4897 +U 42824 ; WX 582 ; N uniA748 ; G 4898 +U 42825 ; WX 427 ; N uniA749 ; G 4899 +U 42826 ; WX 807 ; N uniA74A ; G 4900 +U 42827 ; WX 704 ; N uniA74B ; G 4901 +U 42830 ; WX 1358 ; N uniA74E ; G 4902 +U 42831 ; WX 1019 ; N uniA74F ; G 4903 +U 42832 ; WX 603 ; N uniA750 ; G 4904 +U 42833 ; WX 635 ; N uniA751 ; G 4905 +U 42834 ; WX 734 ; N uniA752 ; G 4906 +U 42835 ; WX 774 ; N uniA753 ; G 4907 +U 42838 ; WX 787 ; N uniA756 ; G 4908 +U 42839 ; WX 635 ; N uniA757 ; G 4909 +U 42852 ; WX 605 ; N uniA764 ; G 4910 +U 42853 ; WX 635 ; N uniA765 ; G 4911 +U 42854 ; WX 605 ; N uniA766 ; G 4912 +U 42855 ; WX 635 ; N uniA767 ; G 4913 +U 42880 ; WX 557 ; N uniA780 ; G 4914 +U 42881 ; WX 278 ; N uniA781 ; G 4915 +U 42882 ; WX 735 ; N uniA782 ; G 4916 +U 42883 ; WX 634 ; N uniA783 ; G 4917 +U 42889 ; WX 337 ; N uniA789 ; G 4918 +U 42890 ; WX 376 ; N uniA78A ; G 4919 +U 42891 ; WX 401 ; N uniA78B ; G 4920 +U 42892 ; WX 275 ; N uniA78C ; G 4921 +U 42893 ; WX 686 ; N uniA78D ; G 4922 +U 42894 ; WX 487 ; N uniA78E ; G 4923 +U 42896 ; WX 772 ; N uniA790 ; G 4924 +U 42897 ; WX 667 ; N uniA791 ; G 4925 +U 42912 ; WX 775 ; N uniA7A0 ; G 4926 +U 42913 ; WX 635 ; N uniA7A1 ; G 4927 +U 42914 ; WX 656 ; N uniA7A2 ; G 4928 +U 42915 ; WX 579 ; N uniA7A3 ; G 4929 +U 42916 ; WX 748 ; N uniA7A4 ; G 4930 +U 42917 ; WX 634 ; N uniA7A5 ; G 4931 +U 42918 ; WX 695 ; N uniA7A6 ; G 4932 +U 42919 ; WX 411 ; N uniA7A7 ; G 4933 +U 42920 ; WX 635 ; N uniA7A8 ; G 4934 +U 42921 ; WX 521 ; N uniA7A9 ; G 4935 +U 42922 ; WX 801 ; N uniA7AA ; G 4936 +U 43000 ; WX 577 ; N uniA7F8 ; G 4937 +U 43001 ; WX 644 ; N uniA7F9 ; G 4938 +U 43002 ; WX 915 ; N uniA7FA ; G 4939 +U 43003 ; WX 575 ; N uniA7FB ; G 4940 +U 43004 ; WX 603 ; N uniA7FC ; G 4941 +U 43005 ; WX 863 ; N uniA7FD ; G 4942 +U 43006 ; WX 295 ; N uniA7FE ; G 4943 +U 43007 ; WX 1199 ; N uniA7FF ; G 4944 +U 61184 ; WX 213 ; N uni02E5.5 ; G 4945 +U 61185 ; WX 238 ; N uni02E6.5 ; G 4946 +U 61186 ; WX 257 ; N uni02E7.5 ; G 4947 +U 61187 ; WX 264 ; N uni02E8.5 ; G 4948 +U 61188 ; WX 267 ; N uni02E9.5 ; G 4949 +U 61189 ; WX 238 ; N uni02E5.4 ; G 4950 +U 61190 ; WX 213 ; N uni02E6.4 ; G 4951 +U 61191 ; WX 238 ; N uni02E7.4 ; G 4952 +U 61192 ; WX 257 ; N uni02E8.4 ; G 4953 +U 61193 ; WX 264 ; N uni02E9.4 ; G 4954 +U 61194 ; WX 257 ; N uni02E5.3 ; G 4955 +U 61195 ; WX 238 ; N uni02E6.3 ; G 4956 +U 61196 ; WX 213 ; N uni02E7.3 ; G 4957 +U 61197 ; WX 238 ; N uni02E8.3 ; G 4958 +U 61198 ; WX 257 ; N uni02E9.3 ; G 4959 +U 61199 ; WX 264 ; N uni02E5.2 ; G 4960 +U 61200 ; WX 257 ; N uni02E6.2 ; G 4961 +U 61201 ; WX 238 ; N uni02E7.2 ; G 4962 +U 61202 ; WX 213 ; N uni02E8.2 ; G 4963 +U 61203 ; WX 238 ; N uni02E9.2 ; G 4964 +U 61204 ; WX 267 ; N uni02E5.1 ; G 4965 +U 61205 ; WX 264 ; N uni02E6.1 ; G 4966 +U 61206 ; WX 257 ; N uni02E7.1 ; G 4967 +U 61207 ; WX 238 ; N uni02E8.1 ; G 4968 +U 61208 ; WX 213 ; N uni02E9.1 ; G 4969 +U 61209 ; WX 275 ; N stem ; G 4970 +U 61440 ; WX 977 ; N uniF000 ; G 4971 +U 61441 ; WX 977 ; N uniF001 ; G 4972 +U 61442 ; WX 977 ; N uniF002 ; G 4973 +U 61443 ; WX 977 ; N uniF003 ; G 4974 +U 62464 ; WX 580 ; N uniF400 ; G 4975 +U 62465 ; WX 580 ; N uniF401 ; G 4976 +U 62466 ; WX 624 ; N uniF402 ; G 4977 +U 62467 ; WX 889 ; N uniF403 ; G 4978 +U 62468 ; WX 585 ; N uniF404 ; G 4979 +U 62469 ; WX 580 ; N uniF405 ; G 4980 +U 62470 ; WX 653 ; N uniF406 ; G 4981 +U 62471 ; WX 882 ; N uniF407 ; G 4982 +U 62472 ; WX 555 ; N uniF408 ; G 4983 +U 62473 ; WX 580 ; N uniF409 ; G 4984 +U 62474 ; WX 1168 ; N uniF40A ; G 4985 +U 62475 ; WX 589 ; N uniF40B ; G 4986 +U 62476 ; WX 590 ; N uniF40C ; G 4987 +U 62477 ; WX 869 ; N uniF40D ; G 4988 +U 62478 ; WX 580 ; N uniF40E ; G 4989 +U 62479 ; WX 589 ; N uniF40F ; G 4990 +U 62480 ; WX 914 ; N uniF410 ; G 4991 +U 62481 ; WX 590 ; N uniF411 ; G 4992 +U 62482 ; WX 731 ; N uniF412 ; G 4993 +U 62483 ; WX 583 ; N uniF413 ; G 4994 +U 62484 ; WX 872 ; N uniF414 ; G 4995 +U 62485 ; WX 589 ; N uniF415 ; G 4996 +U 62486 ; WX 895 ; N uniF416 ; G 4997 +U 62487 ; WX 589 ; N uniF417 ; G 4998 +U 62488 ; WX 589 ; N uniF418 ; G 4999 +U 62489 ; WX 590 ; N uniF419 ; G 5000 +U 62490 ; WX 649 ; N uniF41A ; G 5001 +U 62491 ; WX 589 ; N uniF41B ; G 5002 +U 62492 ; WX 589 ; N uniF41C ; G 5003 +U 62493 ; WX 599 ; N uniF41D ; G 5004 +U 62494 ; WX 590 ; N uniF41E ; G 5005 +U 62495 ; WX 516 ; N uniF41F ; G 5006 +U 62496 ; WX 580 ; N uniF420 ; G 5007 +U 62497 ; WX 584 ; N uniF421 ; G 5008 +U 62498 ; WX 580 ; N uniF422 ; G 5009 +U 62499 ; WX 580 ; N uniF423 ; G 5010 +U 62500 ; WX 581 ; N uniF424 ; G 5011 +U 62501 ; WX 638 ; N uniF425 ; G 5012 +U 62502 ; WX 955 ; N uniF426 ; G 5013 +U 62504 ; WX 931 ; N uniF428 ; G 5014 +U 62505 ; WX 808 ; N uniF429 ; G 5015 +U 62506 ; WX 508 ; N uniF42A ; G 5016 +U 62507 ; WX 508 ; N uniF42B ; G 5017 +U 62508 ; WX 508 ; N uniF42C ; G 5018 +U 62509 ; WX 508 ; N uniF42D ; G 5019 +U 62510 ; WX 508 ; N uniF42E ; G 5020 +U 62511 ; WX 508 ; N uniF42F ; G 5021 +U 62512 ; WX 508 ; N uniF430 ; G 5022 +U 62513 ; WX 508 ; N uniF431 ; G 5023 +U 62514 ; WX 508 ; N uniF432 ; G 5024 +U 62515 ; WX 508 ; N uniF433 ; G 5025 +U 62516 ; WX 518 ; N uniF434 ; G 5026 +U 62517 ; WX 518 ; N uniF435 ; G 5027 +U 62518 ; WX 518 ; N uniF436 ; G 5028 +U 62519 ; WX 787 ; N uniF437 ; G 5029 +U 62520 ; WX 787 ; N uniF438 ; G 5030 +U 62521 ; WX 787 ; N uniF439 ; G 5031 +U 62522 ; WX 787 ; N uniF43A ; G 5032 +U 62523 ; WX 787 ; N uniF43B ; G 5033 +U 62524 ; WX 546 ; N uniF43C ; G 5034 +U 62525 ; WX 546 ; N uniF43D ; G 5035 +U 62526 ; WX 546 ; N uniF43E ; G 5036 +U 62527 ; WX 546 ; N uniF43F ; G 5037 +U 62528 ; WX 546 ; N uniF440 ; G 5038 +U 62529 ; WX 546 ; N uniF441 ; G 5039 +U 63173 ; WX 612 ; N uniF6C5 ; G 5040 +U 64256 ; WX 689 ; N uniFB00 ; G 5041 +U 64257 ; WX 630 ; N fi ; G 5042 +U 64258 ; WX 630 ; N fl ; G 5043 +U 64259 ; WX 967 ; N uniFB03 ; G 5044 +U 64260 ; WX 967 ; N uniFB04 ; G 5045 +U 64261 ; WX 686 ; N uniFB05 ; G 5046 +U 64262 ; WX 861 ; N uniFB06 ; G 5047 +U 64275 ; WX 1202 ; N uniFB13 ; G 5048 +U 64276 ; WX 1202 ; N uniFB14 ; G 5049 +U 64277 ; WX 1196 ; N uniFB15 ; G 5050 +U 64278 ; WX 1186 ; N uniFB16 ; G 5051 +U 64279 ; WX 1529 ; N uniFB17 ; G 5052 +U 64285 ; WX 224 ; N uniFB1D ; G 5053 +U 64286 ; WX 0 ; N uniFB1E ; G 5054 +U 64287 ; WX 331 ; N uniFB1F ; G 5055 +U 64288 ; WX 636 ; N uniFB20 ; G 5056 +U 64289 ; WX 856 ; N uniFB21 ; G 5057 +U 64290 ; WX 774 ; N uniFB22 ; G 5058 +U 64291 ; WX 906 ; N uniFB23 ; G 5059 +U 64292 ; WX 771 ; N uniFB24 ; G 5060 +U 64293 ; WX 843 ; N uniFB25 ; G 5061 +U 64294 ; WX 855 ; N uniFB26 ; G 5062 +U 64295 ; WX 807 ; N uniFB27 ; G 5063 +U 64296 ; WX 875 ; N uniFB28 ; G 5064 +U 64297 ; WX 838 ; N uniFB29 ; G 5065 +U 64298 ; WX 708 ; N uniFB2A ; G 5066 +U 64299 ; WX 708 ; N uniFB2B ; G 5067 +U 64300 ; WX 708 ; N uniFB2C ; G 5068 +U 64301 ; WX 708 ; N uniFB2D ; G 5069 +U 64302 ; WX 668 ; N uniFB2E ; G 5070 +U 64303 ; WX 668 ; N uniFB2F ; G 5071 +U 64304 ; WX 668 ; N uniFB30 ; G 5072 +U 64305 ; WX 578 ; N uniFB31 ; G 5073 +U 64306 ; WX 412 ; N uniFB32 ; G 5074 +U 64307 ; WX 546 ; N uniFB33 ; G 5075 +U 64308 ; WX 653 ; N uniFB34 ; G 5076 +U 64309 ; WX 355 ; N uniFB35 ; G 5077 +U 64310 ; WX 406 ; N uniFB36 ; G 5078 +U 64312 ; WX 648 ; N uniFB38 ; G 5079 +U 64313 ; WX 330 ; N uniFB39 ; G 5080 +U 64314 ; WX 537 ; N uniFB3A ; G 5081 +U 64315 ; WX 529 ; N uniFB3B ; G 5082 +U 64316 ; WX 568 ; N uniFB3C ; G 5083 +U 64318 ; WX 679 ; N uniFB3E ; G 5084 +U 64320 ; WX 399 ; N uniFB40 ; G 5085 +U 64321 ; WX 649 ; N uniFB41 ; G 5086 +U 64323 ; WX 640 ; N uniFB43 ; G 5087 +U 64324 ; WX 625 ; N uniFB44 ; G 5088 +U 64326 ; WX 593 ; N uniFB46 ; G 5089 +U 64327 ; WX 709 ; N uniFB47 ; G 5090 +U 64328 ; WX 564 ; N uniFB48 ; G 5091 +U 64329 ; WX 708 ; N uniFB49 ; G 5092 +U 64330 ; WX 657 ; N uniFB4A ; G 5093 +U 64331 ; WX 272 ; N uniFB4B ; G 5094 +U 64332 ; WX 578 ; N uniFB4C ; G 5095 +U 64333 ; WX 529 ; N uniFB4D ; G 5096 +U 64334 ; WX 625 ; N uniFB4E ; G 5097 +U 64335 ; WX 629 ; N uniFB4F ; G 5098 +U 64338 ; WX 941 ; N uniFB52 ; G 5099 +U 64339 ; WX 982 ; N uniFB53 ; G 5100 +U 64340 ; WX 278 ; N uniFB54 ; G 5101 +U 64341 ; WX 302 ; N uniFB55 ; G 5102 +U 64342 ; WX 941 ; N uniFB56 ; G 5103 +U 64343 ; WX 982 ; N uniFB57 ; G 5104 +U 64344 ; WX 278 ; N uniFB58 ; G 5105 +U 64345 ; WX 302 ; N uniFB59 ; G 5106 +U 64346 ; WX 941 ; N uniFB5A ; G 5107 +U 64347 ; WX 982 ; N uniFB5B ; G 5108 +U 64348 ; WX 278 ; N uniFB5C ; G 5109 +U 64349 ; WX 302 ; N uniFB5D ; G 5110 +U 64350 ; WX 941 ; N uniFB5E ; G 5111 +U 64351 ; WX 982 ; N uniFB5F ; G 5112 +U 64352 ; WX 278 ; N uniFB60 ; G 5113 +U 64353 ; WX 302 ; N uniFB61 ; G 5114 +U 64354 ; WX 941 ; N uniFB62 ; G 5115 +U 64355 ; WX 982 ; N uniFB63 ; G 5116 +U 64356 ; WX 278 ; N uniFB64 ; G 5117 +U 64357 ; WX 302 ; N uniFB65 ; G 5118 +U 64358 ; WX 941 ; N uniFB66 ; G 5119 +U 64359 ; WX 982 ; N uniFB67 ; G 5120 +U 64360 ; WX 278 ; N uniFB68 ; G 5121 +U 64361 ; WX 302 ; N uniFB69 ; G 5122 +U 64362 ; WX 1037 ; N uniFB6A ; G 5123 +U 64363 ; WX 1035 ; N uniFB6B ; G 5124 +U 64364 ; WX 478 ; N uniFB6C ; G 5125 +U 64365 ; WX 506 ; N uniFB6D ; G 5126 +U 64366 ; WX 1037 ; N uniFB6E ; G 5127 +U 64367 ; WX 1035 ; N uniFB6F ; G 5128 +U 64368 ; WX 478 ; N uniFB70 ; G 5129 +U 64369 ; WX 506 ; N uniFB71 ; G 5130 +U 64370 ; WX 646 ; N uniFB72 ; G 5131 +U 64371 ; WX 646 ; N uniFB73 ; G 5132 +U 64372 ; WX 618 ; N uniFB74 ; G 5133 +U 64373 ; WX 646 ; N uniFB75 ; G 5134 +U 64374 ; WX 646 ; N uniFB76 ; G 5135 +U 64375 ; WX 646 ; N uniFB77 ; G 5136 +U 64376 ; WX 618 ; N uniFB78 ; G 5137 +U 64377 ; WX 646 ; N uniFB79 ; G 5138 +U 64378 ; WX 646 ; N uniFB7A ; G 5139 +U 64379 ; WX 646 ; N uniFB7B ; G 5140 +U 64380 ; WX 618 ; N uniFB7C ; G 5141 +U 64381 ; WX 646 ; N uniFB7D ; G 5142 +U 64382 ; WX 646 ; N uniFB7E ; G 5143 +U 64383 ; WX 646 ; N uniFB7F ; G 5144 +U 64384 ; WX 618 ; N uniFB80 ; G 5145 +U 64385 ; WX 646 ; N uniFB81 ; G 5146 +U 64386 ; WX 445 ; N uniFB82 ; G 5147 +U 64387 ; WX 525 ; N uniFB83 ; G 5148 +U 64388 ; WX 445 ; N uniFB84 ; G 5149 +U 64389 ; WX 525 ; N uniFB85 ; G 5150 +U 64390 ; WX 445 ; N uniFB86 ; G 5151 +U 64391 ; WX 525 ; N uniFB87 ; G 5152 +U 64392 ; WX 445 ; N uniFB88 ; G 5153 +U 64393 ; WX 525 ; N uniFB89 ; G 5154 +U 64394 ; WX 483 ; N uniFB8A ; G 5155 +U 64395 ; WX 552 ; N uniFB8B ; G 5156 +U 64396 ; WX 483 ; N uniFB8C ; G 5157 +U 64397 ; WX 552 ; N uniFB8D ; G 5158 +U 64398 ; WX 895 ; N uniFB8E ; G 5159 +U 64399 ; WX 895 ; N uniFB8F ; G 5160 +U 64400 ; WX 476 ; N uniFB90 ; G 5161 +U 64401 ; WX 552 ; N uniFB91 ; G 5162 +U 64402 ; WX 895 ; N uniFB92 ; G 5163 +U 64403 ; WX 895 ; N uniFB93 ; G 5164 +U 64404 ; WX 476 ; N uniFB94 ; G 5165 +U 64405 ; WX 552 ; N uniFB95 ; G 5166 +U 64406 ; WX 895 ; N uniFB96 ; G 5167 +U 64407 ; WX 895 ; N uniFB97 ; G 5168 +U 64408 ; WX 476 ; N uniFB98 ; G 5169 +U 64409 ; WX 552 ; N uniFB99 ; G 5170 +U 64410 ; WX 895 ; N uniFB9A ; G 5171 +U 64411 ; WX 895 ; N uniFB9B ; G 5172 +U 64412 ; WX 476 ; N uniFB9C ; G 5173 +U 64413 ; WX 552 ; N uniFB9D ; G 5174 +U 64414 ; WX 734 ; N uniFB9E ; G 5175 +U 64415 ; WX 761 ; N uniFB9F ; G 5176 +U 64416 ; WX 734 ; N uniFBA0 ; G 5177 +U 64417 ; WX 761 ; N uniFBA1 ; G 5178 +U 64418 ; WX 278 ; N uniFBA2 ; G 5179 +U 64419 ; WX 302 ; N uniFBA3 ; G 5180 +U 64426 ; WX 698 ; N uniFBAA ; G 5181 +U 64427 ; WX 632 ; N uniFBAB ; G 5182 +U 64428 ; WX 527 ; N uniFBAC ; G 5183 +U 64429 ; WX 461 ; N uniFBAD ; G 5184 +U 64467 ; WX 824 ; N uniFBD3 ; G 5185 +U 64468 ; WX 843 ; N uniFBD4 ; G 5186 +U 64469 ; WX 476 ; N uniFBD5 ; G 5187 +U 64470 ; WX 552 ; N uniFBD6 ; G 5188 +U 64471 ; WX 483 ; N uniFBD7 ; G 5189 +U 64472 ; WX 517 ; N uniFBD8 ; G 5190 +U 64473 ; WX 483 ; N uniFBD9 ; G 5191 +U 64474 ; WX 517 ; N uniFBDA ; G 5192 +U 64475 ; WX 483 ; N uniFBDB ; G 5193 +U 64476 ; WX 517 ; N uniFBDC ; G 5194 +U 64478 ; WX 483 ; N uniFBDE ; G 5195 +U 64479 ; WX 517 ; N uniFBDF ; G 5196 +U 64484 ; WX 783 ; N uniFBE4 ; G 5197 +U 64485 ; WX 833 ; N uniFBE5 ; G 5198 +U 64486 ; WX 278 ; N uniFBE6 ; G 5199 +U 64487 ; WX 302 ; N uniFBE7 ; G 5200 +U 64488 ; WX 278 ; N uniFBE8 ; G 5201 +U 64489 ; WX 302 ; N uniFBE9 ; G 5202 +U 64508 ; WX 783 ; N uniFBFC ; G 5203 +U 64509 ; WX 833 ; N uniFBFD ; G 5204 +U 64510 ; WX 278 ; N uniFBFE ; G 5205 +U 64511 ; WX 302 ; N uniFBFF ; G 5206 +U 65024 ; WX 0 ; N uniFE00 ; G 5207 +U 65025 ; WX 0 ; N uniFE01 ; G 5208 +U 65026 ; WX 0 ; N uniFE02 ; G 5209 +U 65027 ; WX 0 ; N uniFE03 ; G 5210 +U 65028 ; WX 0 ; N uniFE04 ; G 5211 +U 65029 ; WX 0 ; N uniFE05 ; G 5212 +U 65030 ; WX 0 ; N uniFE06 ; G 5213 +U 65031 ; WX 0 ; N uniFE07 ; G 5214 +U 65032 ; WX 0 ; N uniFE08 ; G 5215 +U 65033 ; WX 0 ; N uniFE09 ; G 5216 +U 65034 ; WX 0 ; N uniFE0A ; G 5217 +U 65035 ; WX 0 ; N uniFE0B ; G 5218 +U 65036 ; WX 0 ; N uniFE0C ; G 5219 +U 65037 ; WX 0 ; N uniFE0D ; G 5220 +U 65038 ; WX 0 ; N uniFE0E ; G 5221 +U 65039 ; WX 0 ; N uniFE0F ; G 5222 +U 65056 ; WX 0 ; N uniFE20 ; G 5223 +U 65057 ; WX 0 ; N uniFE21 ; G 5224 +U 65058 ; WX 0 ; N uniFE22 ; G 5225 +U 65059 ; WX 0 ; N uniFE23 ; G 5226 +U 65136 ; WX 293 ; N uniFE70 ; G 5227 +U 65137 ; WX 293 ; N uniFE71 ; G 5228 +U 65138 ; WX 293 ; N uniFE72 ; G 5229 +U 65139 ; WX 262 ; N uniFE73 ; G 5230 +U 65140 ; WX 293 ; N uniFE74 ; G 5231 +U 65142 ; WX 293 ; N uniFE76 ; G 5232 +U 65143 ; WX 293 ; N uniFE77 ; G 5233 +U 65144 ; WX 293 ; N uniFE78 ; G 5234 +U 65145 ; WX 293 ; N uniFE79 ; G 5235 +U 65146 ; WX 293 ; N uniFE7A ; G 5236 +U 65147 ; WX 293 ; N uniFE7B ; G 5237 +U 65148 ; WX 293 ; N uniFE7C ; G 5238 +U 65149 ; WX 293 ; N uniFE7D ; G 5239 +U 65150 ; WX 293 ; N uniFE7E ; G 5240 +U 65151 ; WX 293 ; N uniFE7F ; G 5241 +U 65152 ; WX 470 ; N uniFE80 ; G 5242 +U 65153 ; WX 278 ; N uniFE81 ; G 5243 +U 65154 ; WX 305 ; N uniFE82 ; G 5244 +U 65155 ; WX 278 ; N uniFE83 ; G 5245 +U 65156 ; WX 305 ; N uniFE84 ; G 5246 +U 65157 ; WX 483 ; N uniFE85 ; G 5247 +U 65158 ; WX 517 ; N uniFE86 ; G 5248 +U 65159 ; WX 278 ; N uniFE87 ; G 5249 +U 65160 ; WX 305 ; N uniFE88 ; G 5250 +U 65161 ; WX 783 ; N uniFE89 ; G 5251 +U 65162 ; WX 833 ; N uniFE8A ; G 5252 +U 65163 ; WX 278 ; N uniFE8B ; G 5253 +U 65164 ; WX 302 ; N uniFE8C ; G 5254 +U 65165 ; WX 278 ; N uniFE8D ; G 5255 +U 65166 ; WX 305 ; N uniFE8E ; G 5256 +U 65167 ; WX 941 ; N uniFE8F ; G 5257 +U 65168 ; WX 982 ; N uniFE90 ; G 5258 +U 65169 ; WX 278 ; N uniFE91 ; G 5259 +U 65170 ; WX 302 ; N uniFE92 ; G 5260 +U 65171 ; WX 524 ; N uniFE93 ; G 5261 +U 65172 ; WX 536 ; N uniFE94 ; G 5262 +U 65173 ; WX 941 ; N uniFE95 ; G 5263 +U 65174 ; WX 982 ; N uniFE96 ; G 5264 +U 65175 ; WX 278 ; N uniFE97 ; G 5265 +U 65176 ; WX 302 ; N uniFE98 ; G 5266 +U 65177 ; WX 941 ; N uniFE99 ; G 5267 +U 65178 ; WX 982 ; N uniFE9A ; G 5268 +U 65179 ; WX 278 ; N uniFE9B ; G 5269 +U 65180 ; WX 302 ; N uniFE9C ; G 5270 +U 65181 ; WX 646 ; N uniFE9D ; G 5271 +U 65182 ; WX 646 ; N uniFE9E ; G 5272 +U 65183 ; WX 618 ; N uniFE9F ; G 5273 +U 65184 ; WX 646 ; N uniFEA0 ; G 5274 +U 65185 ; WX 646 ; N uniFEA1 ; G 5275 +U 65186 ; WX 646 ; N uniFEA2 ; G 5276 +U 65187 ; WX 618 ; N uniFEA3 ; G 5277 +U 65188 ; WX 646 ; N uniFEA4 ; G 5278 +U 65189 ; WX 646 ; N uniFEA5 ; G 5279 +U 65190 ; WX 646 ; N uniFEA6 ; G 5280 +U 65191 ; WX 618 ; N uniFEA7 ; G 5281 +U 65192 ; WX 646 ; N uniFEA8 ; G 5282 +U 65193 ; WX 445 ; N uniFEA9 ; G 5283 +U 65194 ; WX 525 ; N uniFEAA ; G 5284 +U 65195 ; WX 445 ; N uniFEAB ; G 5285 +U 65196 ; WX 525 ; N uniFEAC ; G 5286 +U 65197 ; WX 483 ; N uniFEAD ; G 5287 +U 65198 ; WX 552 ; N uniFEAE ; G 5288 +U 65199 ; WX 483 ; N uniFEAF ; G 5289 +U 65200 ; WX 552 ; N uniFEB0 ; G 5290 +U 65201 ; WX 1221 ; N uniFEB1 ; G 5291 +U 65202 ; WX 1275 ; N uniFEB2 ; G 5292 +U 65203 ; WX 838 ; N uniFEB3 ; G 5293 +U 65204 ; WX 892 ; N uniFEB4 ; G 5294 +U 65205 ; WX 1221 ; N uniFEB5 ; G 5295 +U 65206 ; WX 1275 ; N uniFEB6 ; G 5296 +U 65207 ; WX 838 ; N uniFEB7 ; G 5297 +U 65208 ; WX 892 ; N uniFEB8 ; G 5298 +U 65209 ; WX 1209 ; N uniFEB9 ; G 5299 +U 65210 ; WX 1225 ; N uniFEBA ; G 5300 +U 65211 ; WX 849 ; N uniFEBB ; G 5301 +U 65212 ; WX 867 ; N uniFEBC ; G 5302 +U 65213 ; WX 1209 ; N uniFEBD ; G 5303 +U 65214 ; WX 1225 ; N uniFEBE ; G 5304 +U 65215 ; WX 849 ; N uniFEBF ; G 5305 +U 65216 ; WX 867 ; N uniFEC0 ; G 5306 +U 65217 ; WX 925 ; N uniFEC1 ; G 5307 +U 65218 ; WX 949 ; N uniFEC2 ; G 5308 +U 65219 ; WX 796 ; N uniFEC3 ; G 5309 +U 65220 ; WX 820 ; N uniFEC4 ; G 5310 +U 65221 ; WX 925 ; N uniFEC5 ; G 5311 +U 65222 ; WX 949 ; N uniFEC6 ; G 5312 +U 65223 ; WX 796 ; N uniFEC7 ; G 5313 +U 65224 ; WX 820 ; N uniFEC8 ; G 5314 +U 65225 ; WX 597 ; N uniFEC9 ; G 5315 +U 65226 ; WX 532 ; N uniFECA ; G 5316 +U 65227 ; WX 597 ; N uniFECB ; G 5317 +U 65228 ; WX 482 ; N uniFECC ; G 5318 +U 65229 ; WX 597 ; N uniFECD ; G 5319 +U 65230 ; WX 532 ; N uniFECE ; G 5320 +U 65231 ; WX 523 ; N uniFECF ; G 5321 +U 65232 ; WX 482 ; N uniFED0 ; G 5322 +U 65233 ; WX 1037 ; N uniFED1 ; G 5323 +U 65234 ; WX 1035 ; N uniFED2 ; G 5324 +U 65235 ; WX 478 ; N uniFED3 ; G 5325 +U 65236 ; WX 506 ; N uniFED4 ; G 5326 +U 65237 ; WX 776 ; N uniFED5 ; G 5327 +U 65238 ; WX 834 ; N uniFED6 ; G 5328 +U 65239 ; WX 478 ; N uniFED7 ; G 5329 +U 65240 ; WX 506 ; N uniFED8 ; G 5330 +U 65241 ; WX 824 ; N uniFED9 ; G 5331 +U 65242 ; WX 843 ; N uniFEDA ; G 5332 +U 65243 ; WX 476 ; N uniFEDB ; G 5333 +U 65244 ; WX 552 ; N uniFEDC ; G 5334 +U 65245 ; WX 727 ; N uniFEDD ; G 5335 +U 65246 ; WX 757 ; N uniFEDE ; G 5336 +U 65247 ; WX 305 ; N uniFEDF ; G 5337 +U 65248 ; WX 331 ; N uniFEE0 ; G 5338 +U 65249 ; WX 619 ; N uniFEE1 ; G 5339 +U 65250 ; WX 666 ; N uniFEE2 ; G 5340 +U 65251 ; WX 536 ; N uniFEE3 ; G 5341 +U 65252 ; WX 578 ; N uniFEE4 ; G 5342 +U 65253 ; WX 734 ; N uniFEE5 ; G 5343 +U 65254 ; WX 761 ; N uniFEE6 ; G 5344 +U 65255 ; WX 278 ; N uniFEE7 ; G 5345 +U 65256 ; WX 302 ; N uniFEE8 ; G 5346 +U 65257 ; WX 524 ; N uniFEE9 ; G 5347 +U 65258 ; WX 536 ; N uniFEEA ; G 5348 +U 65259 ; WX 527 ; N uniFEEB ; G 5349 +U 65260 ; WX 461 ; N uniFEEC ; G 5350 +U 65261 ; WX 483 ; N uniFEED ; G 5351 +U 65262 ; WX 517 ; N uniFEEE ; G 5352 +U 65263 ; WX 783 ; N uniFEEF ; G 5353 +U 65264 ; WX 833 ; N uniFEF0 ; G 5354 +U 65265 ; WX 783 ; N uniFEF1 ; G 5355 +U 65266 ; WX 833 ; N uniFEF2 ; G 5356 +U 65267 ; WX 278 ; N uniFEF3 ; G 5357 +U 65268 ; WX 302 ; N uniFEF4 ; G 5358 +U 65269 ; WX 570 ; N uniFEF5 ; G 5359 +U 65270 ; WX 597 ; N uniFEF6 ; G 5360 +U 65271 ; WX 570 ; N uniFEF7 ; G 5361 +U 65272 ; WX 597 ; N uniFEF8 ; G 5362 +U 65273 ; WX 570 ; N uniFEF9 ; G 5363 +U 65274 ; WX 597 ; N uniFEFA ; G 5364 +U 65275 ; WX 570 ; N uniFEFB ; G 5365 +U 65276 ; WX 597 ; N uniFEFC ; G 5366 +U 65279 ; WX 0 ; N uniFEFF ; G 5367 +U 65529 ; WX 0 ; N uniFFF9 ; G 5368 +U 65530 ; WX 0 ; N uniFFFA ; G 5369 +U 65531 ; WX 0 ; N uniFFFB ; G 5370 +U 65532 ; WX 0 ; N uniFFFC ; G 5371 +U 65533 ; WX 1025 ; N uniFFFD ; G 5372 +EndCharMetrics +StartKernData +StartKernPairs 2727 + +KPX dollar dollar 57 +KPX dollar ampersand -36 +KPX dollar asterisk -36 +KPX dollar two -36 +KPX dollar four -36 +KPX dollar seven -159 +KPX dollar nine -131 +KPX dollar colon -112 +KPX dollar less -159 +KPX dollar F -36 +KPX dollar G -36 +KPX dollar H -36 +KPX dollar I -73 +KPX dollar R -36 +KPX dollar T -36 +KPX dollar W -36 +KPX dollar Y -120 +KPX dollar Z -83 +KPX dollar backslash -139 +KPX dollar m -73 +KPX dollar copyright -36 +KPX dollar ordfeminine -36 +KPX dollar guillemotleft -36 +KPX dollar logicalnot -36 +KPX dollar sfthyphen -36 +KPX dollar acute -36 +KPX dollar mu -36 +KPX dollar paragraph -36 +KPX dollar periodcentered -36 +KPX dollar cedilla -36 +KPX dollar questiondown -139 +KPX dollar Aacute -139 +KPX dollar Acircumflex 57 +KPX dollar Adieresis 57 +KPX dollar AE 57 +KPX dollar Egrave -36 +KPX dollar Eacute -36 +KPX dollar Ecircumflex -36 +KPX dollar Edieresis -36 +KPX dollar Igrave -36 +KPX dollar Iacute -36 +KPX dollar Icircumflex -36 +KPX dollar Idieresis -36 +KPX dollar Ntilde -36 +KPX dollar Oacute -36 +KPX dollar Otilde -36 +KPX dollar multiply -36 +KPX dollar Ugrave -36 +KPX dollar Ucircumflex -36 +KPX dollar Yacute -36 +KPX dollar Thorn -36 +KPX dollar agrave -36 +KPX dollar acircumflex -36 +KPX dollar Dcaron -36 +KPX dollar dcaron -36 +KPX dollar Dcroat -36 +KPX dollar dmacron -36 +KPX dollar Emacron -36 +KPX dollar emacron -36 +KPX dollar Hcircumflex -159 +KPX dollar hcircumflex -36 +KPX dollar Hbar -159 +KPX dollar hbar -36 +KPX dollar Kcommaaccent -112 +KPX dollar kcommaaccent -83 +KPX dollar kgreenlandic -159 +KPX dollar Lacute -139 +KPX dollar lacute -159 +KPX dollar uni0188 -36 +KPX dollar uni01AC -36 +KPX dollar uni01AD -36 +KPX dollar uni01AE -36 +KPX dollar Uhorn -36 +KPX dollar uni01DC -159 +KPX dollar uni01DD -36 +KPX dollar uni01F0 -36 +KPX dollar uni01F3 -36 +KPX dollar uni01F4 -159 +KPX dollar uni01F5 -139 + +KPX percent ampersand -36 +KPX percent asterisk -36 +KPX percent two -36 +KPX percent six -36 +KPX percent nine -63 +KPX percent colon -73 +KPX percent less -112 +KPX percent m -63 +KPX percent braceright -36 +KPX percent Egrave -36 +KPX percent Ecircumflex -36 +KPX percent Igrave -36 +KPX percent Icircumflex -36 +KPX percent Thorn -36 +KPX percent agrave -36 +KPX percent acircumflex -36 +KPX percent adieresis -36 +KPX percent Dcaron -36 +KPX percent Dcroat -36 +KPX percent Emacron -36 +KPX percent Gcircumflex -36 +KPX percent Gbreve -36 +KPX percent Gdotaccent -36 +KPX percent Gcommaaccent -36 +KPX percent Kcommaaccent -73 +KPX percent kgreenlandic -112 +KPX percent lacute -112 +KPX percent uni01AC -36 +KPX percent uni01AE -36 +KPX percent uni01DA -36 +KPX percent uni01F0 -36 + +KPX ampersand less -36 +KPX ampersand m -36 +KPX ampersand braceright -36 +KPX ampersand kgreenlandic -36 +KPX ampersand lacute -36 +KPX ampersand uni01F4 -36 + +KPX quotesingle dollar -36 +KPX quotesingle nine -36 +KPX quotesingle less -112 +KPX quotesingle m -36 +KPX quotesingle braceright -36 +KPX quotesingle Acircumflex -36 +KPX quotesingle Adieresis -36 +KPX quotesingle AE -36 +KPX quotesingle kgreenlandic -112 +KPX quotesingle lacute -112 +KPX quotesingle uni01F4 -112 + +KPX parenright dollar -188 +KPX parenright six -36 +KPX parenright seven -36 +KPX parenright D -188 +KPX parenright H -112 +KPX parenright L -149 +KPX parenright R -73 +KPX parenright U -149 +KPX parenright X -112 +KPX parenright backslash -188 +KPX parenright cent -188 +KPX parenright sterling -188 +KPX parenright currency -188 +KPX parenright yen -188 +KPX parenright brokenbar -188 +KPX parenright section -188 +KPX parenright ordfeminine -112 +KPX parenright guillemotleft -112 +KPX parenright logicalnot -112 +KPX parenright sfthyphen -112 +KPX parenright acute -73 +KPX parenright mu -73 +KPX parenright paragraph -73 +KPX parenright periodcentered -73 +KPX parenright cedilla -73 +KPX parenright guillemotright -112 +KPX parenright onequarter -112 +KPX parenright onehalf -112 +KPX parenright threequarters -112 +KPX parenright questiondown -188 +KPX parenright Aacute -188 +KPX parenright Acircumflex -188 +KPX parenright Atilde -188 +KPX parenright Adieresis -188 +KPX parenright Aring -188 +KPX parenright AE -188 +KPX parenright Ccedilla -188 +KPX parenright Otilde -112 +KPX parenright multiply -112 +KPX parenright Ugrave -112 +KPX parenright Ucircumflex -112 +KPX parenright Yacute -112 +KPX parenright ntilde -149 +KPX parenright otilde -149 +KPX parenright dcaron -73 +KPX parenright dmacron -73 +KPX parenright emacron -73 +KPX parenright edotaccent -149 +KPX parenright eogonek -149 +KPX parenright ecaron -149 +KPX parenright Gcircumflex -36 +KPX parenright Gbreve -36 +KPX parenright Gdotaccent -36 +KPX parenright Gcommaaccent -36 +KPX parenright Hcircumflex -36 +KPX parenright Hbar -36 +KPX parenright Itilde -36 +KPX parenright imacron -112 +KPX parenright ibreve -112 +KPX parenright iogonek -112 +KPX parenright dotlessi -112 +KPX parenright ij -112 +KPX parenright jcircumflex -112 +KPX parenright Lacute -188 +KPX parenright uni01AD -73 +KPX parenright Uhorn -73 +KPX parenright uni01DA -36 +KPX parenright uni01DC -36 +KPX parenright uni01F1 -73 +KPX parenright uni01F5 -188 + +KPX asterisk seven -73 +KPX asterisk less -102 +KPX asterisk m -36 +KPX asterisk braceright -36 +KPX asterisk Hbar -73 +KPX asterisk lacute -102 + + +KPX hyphen dollar -36 +KPX hyphen m -36 +KPX hyphen braceright -36 + +KPX period dollar -36 +KPX period ampersand -112 +KPX period two -112 +KPX period seven -159 +KPX period eight -55 +KPX period colon -73 +KPX period less -73 +KPX period D -36 +KPX period H -102 +KPX period R -102 +KPX period X -102 +KPX period backslash -149 +KPX period m -131 +KPX period cent -36 +KPX period sterling -36 +KPX period currency -36 +KPX period yen -36 +KPX period brokenbar -36 +KPX period section -36 +KPX period ordfeminine -102 +KPX period guillemotleft -102 +KPX period logicalnot -102 +KPX period sfthyphen -102 +KPX period acute -102 +KPX period mu -102 +KPX period paragraph -102 +KPX period periodcentered -102 +KPX period cedilla -102 +KPX period guillemotright -102 +KPX period onequarter -102 +KPX period onehalf -102 +KPX period threequarters -102 +KPX period questiondown -149 +KPX period Aacute -149 +KPX period Egrave -112 +KPX period Icircumflex -112 +KPX period Yacute -102 +KPX period Hbar -159 +KPX period Idot -55 +KPX period dotlessi -102 +KPX period lacute -73 + +KPX slash dollar 47 +KPX slash two -73 +KPX slash seven -282 +KPX slash eight -102 +KPX slash nine -225 +KPX slash colon -188 +KPX slash less -272 +KPX slash H -36 +KPX slash R -36 +KPX slash X -36 +KPX slash backslash -188 +KPX slash ordfeminine -36 +KPX slash guillemotleft -36 +KPX slash logicalnot -36 +KPX slash sfthyphen -36 +KPX slash acute -36 +KPX slash mu -36 +KPX slash paragraph -36 +KPX slash periodcentered -36 +KPX slash cedilla -36 +KPX slash guillemotright -36 +KPX slash onequarter -36 +KPX slash onehalf -36 +KPX slash threequarters -36 +KPX slash questiondown -188 +KPX slash Aacute -188 +KPX slash Yacute -36 +KPX slash Hbar -282 +KPX slash Idot -102 +KPX slash dotlessi -36 +KPX slash lacute -272 + +KPX two dollar -36 +KPX two nine -36 +KPX two semicolon -131 +KPX two less -112 +KPX two m -36 +KPX two lacute -112 + +KPX three dollar -131 +KPX three less -45 +KPX three D -92 +KPX three H -73 +KPX three L -45 +KPX three Q -36 +KPX three R -73 +KPX three U -36 +KPX three V -36 +KPX three X -36 +KPX three m -36 +KPX three cent -92 +KPX three sterling -92 +KPX three currency -92 +KPX three yen -92 +KPX three brokenbar -92 +KPX three section -92 +KPX three ordfeminine -73 +KPX three guillemotleft -73 +KPX three logicalnot -73 +KPX three sfthyphen -73 +KPX three threesuperior -36 +KPX three acute -73 +KPX three mu -73 +KPX three paragraph -73 +KPX three periodcentered -73 +KPX three cedilla -73 +KPX three guillemotright -36 +KPX three onequarter -36 +KPX three onehalf -36 +KPX three threequarters -36 +KPX three Yacute -73 +KPX three Cdotaccent -36 +KPX three edotaccent -36 +KPX three ecaron -36 +KPX three gdotaccent -36 +KPX three gcommaaccent -36 +KPX three dotlessi -36 +KPX three lacute -45 + + +KPX five dollar -83 +KPX five ampersand -102 +KPX five seven -149 +KPX five nine -112 +KPX five colon -83 +KPX five less -131 +KPX five D -45 +KPX five H -92 +KPX five R -92 +KPX five X -92 +KPX five backslash -112 +KPX five m -112 +KPX five braceright -36 +KPX five cent -45 +KPX five sterling -45 +KPX five currency -45 +KPX five yen -45 +KPX five brokenbar -45 +KPX five section -45 +KPX five ordfeminine -92 +KPX five guillemotleft -92 +KPX five logicalnot -92 +KPX five sfthyphen -92 +KPX five acute -92 +KPX five mu -92 +KPX five paragraph -92 +KPX five periodcentered -92 +KPX five cedilla -92 +KPX five guillemotright -92 +KPX five onequarter -92 +KPX five onehalf -92 +KPX five threequarters -92 +KPX five questiondown -112 +KPX five Aacute -112 +KPX five Egrave -102 +KPX five Icircumflex -102 +KPX five Yacute -92 +KPX five Hbar -149 +KPX five dotlessi -92 +KPX five lacute -131 + +KPX six dollar 38 + +KPX seven dollar -159 +KPX seven ampersand -120 +KPX seven seven -36 +KPX seven D -339 +KPX seven F -348 +KPX seven H -348 +KPX seven L -63 +KPX seven R -348 +KPX seven U -301 +KPX seven V -339 +KPX seven X -311 +KPX seven Z -339 +KPX seven backslash -319 +KPX seven m -188 +KPX seven braceright -112 +KPX seven cent -239 +KPX seven sterling -339 +KPX seven currency -239 +KPX seven yen -239 +KPX seven brokenbar -239 +KPX seven section -239 +KPX seven copyright -348 +KPX seven ordfeminine -288 +KPX seven guillemotleft -348 +KPX seven logicalnot -288 +KPX seven sfthyphen -288 +KPX seven acute -268 +KPX seven mu -348 +KPX seven paragraph -268 +KPX seven periodcentered -268 +KPX seven cedilla -268 +KPX seven guillemotright -281 +KPX seven onequarter -311 +KPX seven onehalf -281 +KPX seven threequarters -281 +KPX seven questiondown -319 +KPX seven Aacute -319 +KPX seven Egrave -120 +KPX seven Eacute -348 +KPX seven Icircumflex -120 +KPX seven Idieresis -348 +KPX seven Yacute -348 +KPX seven edotaccent -301 +KPX seven ecaron -301 +KPX seven gdotaccent -339 +KPX seven gcommaaccent -339 +KPX seven Hbar -36 +KPX seven dotlessi -311 + +KPX eight equal -36 +KPX eight Ldot -36 + +KPX nine dollar -131 +KPX nine two -36 +KPX nine D -159 +KPX nine H -159 +KPX nine L -45 +KPX nine R -159 +KPX nine X -139 +KPX nine backslash -55 +KPX nine m -178 +KPX nine braceright -112 +KPX nine cent -159 +KPX nine sterling -159 +KPX nine currency -159 +KPX nine yen -159 +KPX nine brokenbar -159 +KPX nine section -159 +KPX nine ordfeminine -159 +KPX nine guillemotleft -159 +KPX nine logicalnot -159 +KPX nine sfthyphen -159 +KPX nine acute -159 +KPX nine mu -159 +KPX nine paragraph -159 +KPX nine periodcentered -159 +KPX nine cedilla -159 +KPX nine guillemotright -139 +KPX nine onequarter -139 +KPX nine onehalf -139 +KPX nine threequarters -139 +KPX nine questiondown -55 +KPX nine Aacute -55 +KPX nine Yacute -159 +KPX nine dotlessi -139 + +KPX colon dollar -112 +KPX colon D -131 +KPX colon H -120 +KPX colon L -45 +KPX colon R -120 +KPX colon U -92 +KPX colon X -73 +KPX colon backslash -36 +KPX colon m -112 +KPX colon braceright -36 +KPX colon cent -131 +KPX colon sterling -131 +KPX colon currency -131 +KPX colon yen -131 +KPX colon brokenbar -131 +KPX colon section -131 +KPX colon ordfeminine -120 +KPX colon guillemotleft -120 +KPX colon logicalnot -120 +KPX colon sfthyphen -120 +KPX colon acute -120 +KPX colon mu -120 +KPX colon paragraph -120 +KPX colon periodcentered -120 +KPX colon cedilla -120 +KPX colon guillemotright -73 +KPX colon onequarter -73 +KPX colon onehalf -73 +KPX colon threequarters -73 +KPX colon questiondown -36 +KPX colon Aacute -36 +KPX colon Yacute -120 +KPX colon edotaccent -92 +KPX colon ecaron -92 +KPX colon dotlessi -73 + +KPX semicolon ampersand -149 +KPX semicolon two -131 +KPX semicolon seven -36 +KPX semicolon H -92 +KPX semicolon m -112 +KPX semicolon ordfeminine -92 +KPX semicolon guillemotleft -92 +KPX semicolon logicalnot -92 +KPX semicolon sfthyphen -92 +KPX semicolon Egrave -149 +KPX semicolon Icircumflex -149 +KPX semicolon Yacute -92 +KPX semicolon Hbar -36 + +KPX less dollar -159 +KPX less ampersand -112 +KPX less two -112 +KPX less D -282 +KPX less H -272 +KPX less L -73 +KPX less R -272 +KPX less X -235 +KPX less m -225 +KPX less braceright -149 +KPX less cent -282 +KPX less sterling -282 +KPX less currency -282 +KPX less yen -282 +KPX less brokenbar -282 +KPX less section -282 +KPX less ordfeminine -272 +KPX less guillemotleft -272 +KPX less logicalnot -272 +KPX less sfthyphen -272 +KPX less acute -272 +KPX less mu -272 +KPX less paragraph -272 +KPX less periodcentered -272 +KPX less cedilla -272 +KPX less guillemotright -235 +KPX less onequarter -235 +KPX less onehalf -235 +KPX less threequarters -235 +KPX less Egrave -112 +KPX less Icircumflex -112 +KPX less Yacute -272 +KPX less dotlessi -235 + + +KPX H bracketleft -36 + +KPX I W -36 +KPX I Z -36 +KPX I backslash -36 +KPX I m -73 +KPX I braceright -36 +KPX I questiondown -36 +KPX I Aacute -36 +KPX I hbar -36 + +KPX N D -36 +KPX N H -73 +KPX N R -73 +KPX N X -63 +KPX N backslash -73 +KPX N cent -36 +KPX N sterling -36 +KPX N currency -36 +KPX N yen -36 +KPX N brokenbar -36 +KPX N section -36 +KPX N ordfeminine -73 +KPX N guillemotleft -73 +KPX N logicalnot -73 +KPX N sfthyphen -73 +KPX N acute -73 +KPX N mu -73 +KPX N paragraph -73 +KPX N periodcentered -73 +KPX N cedilla -73 +KPX N guillemotright -63 +KPX N onequarter -63 +KPX N onehalf -63 +KPX N threequarters -63 +KPX N questiondown -73 +KPX N Aacute -73 +KPX N Yacute -73 +KPX N dotlessi -63 + + +KPX R bracketleft -63 + +KPX U F -45 +KPX U G -36 +KPX U H -45 +KPX U J -36 +KPX U K -36 +KPX U P -36 +KPX U Q -36 +KPX U R -45 +KPX U T -36 +KPX U U -36 +KPX U bracketleft -55 +KPX U m -73 +KPX U copyright -45 +KPX U ordfeminine -45 +KPX U guillemotleft -45 +KPX U logicalnot -45 +KPX U sfthyphen -45 +KPX U threesuperior -36 +KPX U acute -45 +KPX U mu -45 +KPX U paragraph -45 +KPX U periodcentered -45 +KPX U cedilla -45 +KPX U Eacute -45 +KPX U Idieresis -45 +KPX U Ntilde 72 +KPX U Yacute -45 +KPX U aacute -36 +KPX U Cdotaccent -36 +KPX U edotaccent -36 +KPX U ecaron -36 + +KPX Y m -36 +KPX Y braceright -36 + +KPX Z m -36 +KPX Z braceright -36 + +KPX bracketleft F -36 +KPX bracketleft H -63 +KPX bracketleft R -63 +KPX bracketleft copyright -36 +KPX bracketleft ordfeminine -63 +KPX bracketleft guillemotleft -63 +KPX bracketleft logicalnot -63 +KPX bracketleft sfthyphen -63 +KPX bracketleft acute -63 +KPX bracketleft mu -63 +KPX bracketleft paragraph -63 +KPX bracketleft periodcentered -63 +KPX bracketleft cedilla -63 +KPX bracketleft Eacute -36 +KPX bracketleft Idieresis -36 +KPX bracketleft Yacute -63 + +KPX backslash m -36 +KPX backslash braceright -36 + +KPX m percent -36 +KPX m ampersand -36 +KPX m quotesingle -36 +KPX m asterisk -36 +KPX m hyphen -36 +KPX m seven -112 +KPX m nine -112 +KPX m colon -36 +KPX m less -149 +KPX m Y -36 +KPX m Z -36 +KPX m backslash -36 +KPX m questiondown -36 +KPX m Aacute -36 +KPX m Egrave -36 +KPX m Icircumflex -36 +KPX m Eth -36 +KPX m agrave -36 +KPX m Hbar -112 +KPX m lacute -149 + +KPX braceright dollar -73 +KPX braceright percent -73 +KPX braceright ampersand -36 +KPX braceright quotesingle -36 +KPX braceright hyphen -36 +KPX braceright two -36 +KPX braceright seven -188 +KPX braceright nine -178 +KPX braceright colon -112 +KPX braceright semicolon -112 +KPX braceright less -225 +KPX braceright Y -36 +KPX braceright Z -36 +KPX braceright backslash -36 +KPX braceright questiondown -36 +KPX braceright Aacute -36 +KPX braceright Egrave -36 +KPX braceright Icircumflex -36 +KPX braceright Eth -36 +KPX braceright Hbar -188 +KPX braceright lacute -225 + + + +KPX ordfeminine bracketleft -36 + +KPX guillemotleft bracketleft -36 + +KPX logicalnot bracketleft -36 + +KPX sfthyphen bracketleft -36 + + + +KPX acute bracketleft -63 + +KPX mu bracketleft -63 + +KPX paragraph bracketleft -63 + +KPX periodcentered bracketleft -63 + +KPX cedilla bracketleft -63 + +KPX questiondown m -36 +KPX questiondown braceright -36 + +KPX Aacute m -36 +KPX Aacute braceright -36 + +KPX Acircumflex dollar 57 +KPX Acircumflex ampersand -36 +KPX Acircumflex asterisk -36 +KPX Acircumflex two -36 +KPX Acircumflex four -36 +KPX Acircumflex seven -159 +KPX Acircumflex nine -131 +KPX Acircumflex colon -112 +KPX Acircumflex less -159 +KPX Acircumflex F -36 +KPX Acircumflex G -36 +KPX Acircumflex H -36 +KPX Acircumflex I -73 +KPX Acircumflex R -36 +KPX Acircumflex T -36 +KPX Acircumflex W -36 +KPX Acircumflex Y -120 +KPX Acircumflex Z -83 +KPX Acircumflex backslash -139 +KPX Acircumflex m -73 +KPX Acircumflex copyright -36 +KPX Acircumflex ordfeminine -36 +KPX Acircumflex guillemotleft -36 +KPX Acircumflex logicalnot -36 +KPX Acircumflex sfthyphen -36 +KPX Acircumflex acute -36 +KPX Acircumflex mu -36 +KPX Acircumflex paragraph -36 +KPX Acircumflex periodcentered -36 +KPX Acircumflex cedilla -36 +KPX Acircumflex questiondown -139 +KPX Acircumflex Aacute -139 +KPX Acircumflex Acircumflex 57 +KPX Acircumflex Adieresis 57 +KPX Acircumflex AE 57 +KPX Acircumflex Egrave -36 +KPX Acircumflex Ecircumflex -36 +KPX Acircumflex Igrave -36 +KPX Acircumflex Iacute -36 +KPX Acircumflex Icircumflex -36 +KPX Acircumflex Ntilde -36 +KPX Acircumflex Oacute -36 +KPX Acircumflex Otilde -36 +KPX Acircumflex multiply -36 +KPX Acircumflex Ugrave -36 +KPX Acircumflex Ucircumflex -36 +KPX Acircumflex Yacute -36 +KPX Acircumflex Thorn -36 +KPX Acircumflex acircumflex -36 +KPX Acircumflex Dcaron -36 +KPX Acircumflex dcaron -36 +KPX Acircumflex Dcroat -36 +KPX Acircumflex dmacron -36 +KPX Acircumflex Emacron -36 +KPX Acircumflex emacron -36 +KPX Acircumflex Hcircumflex -159 +KPX Acircumflex hcircumflex -36 +KPX Acircumflex Hbar -159 +KPX Acircumflex hbar -36 +KPX Acircumflex Kcommaaccent -112 +KPX Acircumflex kcommaaccent -83 +KPX Acircumflex kgreenlandic -159 +KPX Acircumflex Lacute -139 +KPX Acircumflex lacute -159 +KPX Acircumflex uni01F0 -36 +KPX Acircumflex uni01F1 -36 + +KPX Adieresis dollar 57 +KPX Adieresis ampersand -36 +KPX Adieresis asterisk -36 +KPX Adieresis two -36 +KPX Adieresis four -36 +KPX Adieresis seven -159 +KPX Adieresis nine -131 +KPX Adieresis colon -112 +KPX Adieresis less -159 +KPX Adieresis F -36 +KPX Adieresis G -36 +KPX Adieresis H -36 +KPX Adieresis I -73 +KPX Adieresis R -36 +KPX Adieresis T -36 +KPX Adieresis W -36 +KPX Adieresis Y -120 +KPX Adieresis Z -83 +KPX Adieresis backslash -139 +KPX Adieresis m -73 +KPX Adieresis copyright -36 +KPX Adieresis ordfeminine -36 +KPX Adieresis guillemotleft -36 +KPX Adieresis logicalnot -36 +KPX Adieresis sfthyphen -36 +KPX Adieresis acute -36 +KPX Adieresis mu -36 +KPX Adieresis paragraph -36 +KPX Adieresis periodcentered -36 +KPX Adieresis cedilla -36 +KPX Adieresis questiondown -139 +KPX Adieresis Aacute -139 +KPX Adieresis Acircumflex 57 +KPX Adieresis Adieresis 57 +KPX Adieresis AE 57 +KPX Adieresis Egrave -36 +KPX Adieresis Ecircumflex -36 +KPX Adieresis Igrave -36 +KPX Adieresis Iacute -36 +KPX Adieresis Icircumflex -36 +KPX Adieresis Ntilde -36 +KPX Adieresis Oacute -36 +KPX Adieresis Otilde -36 +KPX Adieresis multiply -36 +KPX Adieresis Ugrave -36 +KPX Adieresis Ucircumflex -36 +KPX Adieresis Yacute -36 +KPX Adieresis Thorn -36 +KPX Adieresis acircumflex -36 +KPX Adieresis Dcaron -36 +KPX Adieresis dcaron -36 +KPX Adieresis Dcroat -36 +KPX Adieresis dmacron -36 +KPX Adieresis Emacron -36 +KPX Adieresis emacron -36 +KPX Adieresis Hcircumflex -159 +KPX Adieresis hcircumflex -36 +KPX Adieresis Hbar -159 +KPX Adieresis hbar -36 +KPX Adieresis Kcommaaccent -112 +KPX Adieresis kcommaaccent -83 +KPX Adieresis kgreenlandic -159 +KPX Adieresis Lacute -139 +KPX Adieresis lacute -159 +KPX Adieresis uni01F0 -36 +KPX Adieresis uni01F1 -36 + +KPX AE dollar 57 +KPX AE ampersand -36 +KPX AE asterisk -36 +KPX AE two -36 +KPX AE four -36 +KPX AE seven -159 +KPX AE nine -131 +KPX AE colon -112 +KPX AE less -159 +KPX AE F -36 +KPX AE G -36 +KPX AE H -36 +KPX AE I -73 +KPX AE R -36 +KPX AE T -36 +KPX AE W -36 +KPX AE Y -120 +KPX AE Z -83 +KPX AE m -73 +KPX AE copyright -36 +KPX AE ordfeminine -36 +KPX AE guillemotleft -36 +KPX AE logicalnot -36 +KPX AE sfthyphen -36 +KPX AE acute -36 +KPX AE mu -36 +KPX AE paragraph -36 +KPX AE periodcentered -36 +KPX AE cedilla -36 +KPX AE Acircumflex 57 +KPX AE Adieresis 57 +KPX AE AE 57 +KPX AE Egrave -36 +KPX AE Ecircumflex -36 +KPX AE Igrave -36 +KPX AE Iacute -36 +KPX AE Icircumflex -36 +KPX AE Ntilde -36 +KPX AE Oacute -36 +KPX AE Otilde -36 +KPX AE multiply -36 +KPX AE Ugrave -36 +KPX AE Ucircumflex -36 +KPX AE Yacute -36 +KPX AE Thorn -36 +KPX AE acircumflex -36 +KPX AE Dcaron -36 +KPX AE dcaron -36 +KPX AE Dcroat -36 +KPX AE dmacron -36 +KPX AE emacron -36 +KPX AE Hcircumflex -159 +KPX AE hcircumflex -36 +KPX AE Hbar -159 +KPX AE hbar -36 +KPX AE Kcommaaccent -112 +KPX AE kcommaaccent -83 +KPX AE kgreenlandic -159 +KPX AE lacute -159 +KPX AE uni01F0 -36 +KPX AE uni01F1 -36 + +KPX Egrave less -36 +KPX Egrave m -36 +KPX Egrave braceright -36 +KPX Egrave lacute -36 + +KPX Icircumflex less -36 +KPX Icircumflex m -36 +KPX Icircumflex braceright -36 +KPX Icircumflex lacute -36 + +KPX Eth dollar -36 +KPX Eth nine -36 +KPX Eth less -112 +KPX Eth m -36 +KPX Eth braceright -36 +KPX Eth Acircumflex -36 +KPX Eth Adieresis -36 +KPX Eth AE -36 +KPX Eth kgreenlandic -112 +KPX Eth lacute -112 +KPX Eth uni01F4 -112 + +KPX Ograve dollar -36 +KPX Ograve nine -36 +KPX Ograve less -112 +KPX Ograve m -36 +KPX Ograve braceright -36 +KPX Ograve lacute -112 + +KPX Yacute bracketleft -36 + +KPX agrave seven -73 +KPX agrave less -102 +KPX agrave m -36 +KPX agrave braceright -36 +KPX agrave Hbar -73 +KPX agrave lacute -102 + +KPX ucircumflex dollar 47 +KPX ucircumflex two -73 +KPX ucircumflex seven -282 +KPX ucircumflex eight -102 +KPX ucircumflex nine -225 +KPX ucircumflex colon -188 +KPX ucircumflex less -272 +KPX ucircumflex H -36 +KPX ucircumflex R -36 +KPX ucircumflex X -36 +KPX ucircumflex backslash -188 +KPX ucircumflex ordfeminine -36 +KPX ucircumflex guillemotleft -36 +KPX ucircumflex logicalnot -36 +KPX ucircumflex sfthyphen -36 +KPX ucircumflex acute -36 +KPX ucircumflex mu -36 +KPX ucircumflex paragraph -36 +KPX ucircumflex periodcentered -36 +KPX ucircumflex cedilla -36 +KPX ucircumflex guillemotright -36 +KPX ucircumflex onequarter -36 +KPX ucircumflex onehalf -36 +KPX ucircumflex threequarters -36 +KPX ucircumflex questiondown -188 +KPX ucircumflex Aacute -188 +KPX ucircumflex Yacute -36 +KPX ucircumflex Hbar -282 +KPX ucircumflex Idot -102 +KPX ucircumflex dotlessi -36 +KPX ucircumflex lacute -272 + +KPX ydieresis dollar 47 +KPX ydieresis two -73 +KPX ydieresis seven -282 +KPX ydieresis eight -102 +KPX ydieresis nine -225 +KPX ydieresis colon -188 +KPX ydieresis less -272 +KPX ydieresis H -36 +KPX ydieresis R -36 +KPX ydieresis X -36 +KPX ydieresis backslash -188 +KPX ydieresis ordfeminine -36 +KPX ydieresis guillemotleft -36 +KPX ydieresis logicalnot -36 +KPX ydieresis sfthyphen -36 +KPX ydieresis acute -36 +KPX ydieresis mu -36 +KPX ydieresis paragraph -36 +KPX ydieresis periodcentered -36 +KPX ydieresis cedilla -36 +KPX ydieresis guillemotright -36 +KPX ydieresis onequarter -36 +KPX ydieresis onehalf -36 +KPX ydieresis threequarters -36 +KPX ydieresis questiondown -188 +KPX ydieresis Aacute -188 +KPX ydieresis Yacute -36 +KPX ydieresis Hbar -282 +KPX ydieresis Idot -102 +KPX ydieresis dotlessi -36 +KPX ydieresis lacute -272 + +KPX Abreve O -193 + + +KPX Edotaccent dollar -83 +KPX Edotaccent ampersand -102 +KPX Edotaccent seven -149 +KPX Edotaccent nine -112 +KPX Edotaccent colon -83 +KPX Edotaccent less -131 +KPX Edotaccent D -45 +KPX Edotaccent H -92 +KPX Edotaccent R -92 +KPX Edotaccent X -92 +KPX Edotaccent backslash -112 +KPX Edotaccent m -112 +KPX Edotaccent braceright -36 +KPX Edotaccent cent -45 +KPX Edotaccent sterling -45 +KPX Edotaccent currency -45 +KPX Edotaccent yen -45 +KPX Edotaccent brokenbar -45 +KPX Edotaccent section -45 +KPX Edotaccent ordfeminine -92 +KPX Edotaccent guillemotleft -92 +KPX Edotaccent logicalnot -92 +KPX Edotaccent sfthyphen -92 +KPX Edotaccent acute -92 +KPX Edotaccent mu -92 +KPX Edotaccent paragraph -92 +KPX Edotaccent periodcentered -92 +KPX Edotaccent cedilla -92 +KPX Edotaccent guillemotright -92 +KPX Edotaccent onequarter -92 +KPX Edotaccent onehalf -92 +KPX Edotaccent threequarters -92 +KPX Edotaccent questiondown -112 +KPX Edotaccent Aacute -112 +KPX Edotaccent Egrave -102 +KPX Edotaccent Icircumflex -102 +KPX Edotaccent Yacute -92 +KPX Edotaccent Hbar -149 +KPX Edotaccent dotlessi -92 +KPX Edotaccent lacute -131 + +KPX edotaccent F -45 +KPX edotaccent G -36 +KPX edotaccent H -45 +KPX edotaccent J -36 +KPX edotaccent K -36 +KPX edotaccent P -36 +KPX edotaccent Q -36 +KPX edotaccent R -45 +KPX edotaccent T -36 +KPX edotaccent U -36 +KPX edotaccent bracketleft -55 +KPX edotaccent m -73 +KPX edotaccent copyright -45 +KPX edotaccent ordfeminine -45 +KPX edotaccent guillemotleft -45 +KPX edotaccent logicalnot -45 +KPX edotaccent sfthyphen -45 +KPX edotaccent threesuperior -36 +KPX edotaccent acute -45 +KPX edotaccent mu -45 +KPX edotaccent paragraph -45 +KPX edotaccent periodcentered -45 +KPX edotaccent cedilla -45 +KPX edotaccent Eacute -45 +KPX edotaccent Idieresis -45 +KPX edotaccent Ntilde 72 +KPX edotaccent Yacute -45 +KPX edotaccent aacute -36 +KPX edotaccent Cdotaccent -36 +KPX edotaccent edotaccent -36 +KPX edotaccent ecaron -36 + +KPX Ecaron dollar -83 +KPX Ecaron ampersand -102 +KPX Ecaron seven -149 +KPX Ecaron nine -112 +KPX Ecaron colon -83 +KPX Ecaron less -131 +KPX Ecaron D -45 +KPX Ecaron H -92 +KPX Ecaron R -92 +KPX Ecaron X -92 +KPX Ecaron backslash -112 +KPX Ecaron m -112 +KPX Ecaron braceright -36 +KPX Ecaron cent -45 +KPX Ecaron sterling -45 +KPX Ecaron currency -45 +KPX Ecaron yen -45 +KPX Ecaron brokenbar -45 +KPX Ecaron section -45 +KPX Ecaron ordfeminine -92 +KPX Ecaron guillemotleft -92 +KPX Ecaron logicalnot -92 +KPX Ecaron sfthyphen -92 +KPX Ecaron acute -92 +KPX Ecaron mu -92 +KPX Ecaron paragraph -92 +KPX Ecaron periodcentered -92 +KPX Ecaron cedilla -92 +KPX Ecaron guillemotright -92 +KPX Ecaron onequarter -92 +KPX Ecaron onehalf -92 +KPX Ecaron threequarters -92 +KPX Ecaron questiondown -112 +KPX Ecaron Aacute -112 +KPX Ecaron Egrave -102 +KPX Ecaron Icircumflex -102 +KPX Ecaron Yacute -92 +KPX Ecaron Hbar -149 +KPX Ecaron dotlessi -92 +KPX Ecaron lacute -131 + +KPX ecaron F -45 +KPX ecaron G -36 +KPX ecaron H -45 +KPX ecaron J -36 +KPX ecaron K -36 +KPX ecaron P -36 +KPX ecaron Q -36 +KPX ecaron R -45 +KPX ecaron T -36 +KPX ecaron U -36 +KPX ecaron bracketleft -55 +KPX ecaron m -73 +KPX ecaron copyright -45 +KPX ecaron ordfeminine -45 +KPX ecaron guillemotleft -45 +KPX ecaron logicalnot -45 +KPX ecaron sfthyphen -45 +KPX ecaron threesuperior -36 +KPX ecaron acute -45 +KPX ecaron mu -45 +KPX ecaron paragraph -45 +KPX ecaron periodcentered -45 +KPX ecaron cedilla -45 +KPX ecaron Eacute -45 +KPX ecaron Idieresis -45 +KPX ecaron Ntilde -36 +KPX ecaron Yacute -45 +KPX ecaron aacute -36 +KPX ecaron Cdotaccent -36 +KPX ecaron edotaccent -36 +KPX ecaron ecaron -36 + +KPX Gdotaccent dollar 38 + +KPX Gcommaaccent dollar 38 + +KPX Hbar dollar -159 +KPX Hbar ampersand -120 +KPX Hbar seven -36 +KPX Hbar D -339 +KPX Hbar F -348 +KPX Hbar H -348 +KPX Hbar L -63 +KPX Hbar R -348 +KPX Hbar U -301 +KPX Hbar V -339 +KPX Hbar X -311 +KPX Hbar Z -339 +KPX Hbar backslash -319 +KPX Hbar m -188 +KPX Hbar braceright -112 +KPX Hbar cent -339 +KPX Hbar sterling -339 +KPX Hbar currency -339 +KPX Hbar yen -339 +KPX Hbar brokenbar -339 +KPX Hbar section -339 +KPX Hbar copyright -348 +KPX Hbar ordfeminine -348 +KPX Hbar guillemotleft -348 +KPX Hbar logicalnot -348 +KPX Hbar sfthyphen -348 +KPX Hbar acute -348 +KPX Hbar mu -348 +KPX Hbar paragraph -348 +KPX Hbar periodcentered -348 +KPX Hbar cedilla -348 +KPX Hbar guillemotright -311 +KPX Hbar onequarter -311 +KPX Hbar onehalf -311 +KPX Hbar threequarters -311 +KPX Hbar questiondown -319 +KPX Hbar Aacute -319 +KPX Hbar Egrave -120 +KPX Hbar Eacute -348 +KPX Hbar Icircumflex -120 +KPX Hbar Idieresis -348 +KPX Hbar Yacute -348 +KPX Hbar edotaccent -301 +KPX Hbar ecaron -301 +KPX Hbar gdotaccent -339 +KPX Hbar gcommaaccent -339 +KPX Hbar Hbar -36 +KPX Hbar dotlessi -311 + +KPX Idot equal -36 +KPX Idot Ldot -36 + +KPX lacute dollar -159 +KPX lacute ampersand -112 +KPX lacute two -112 +KPX lacute D -282 +KPX lacute H -272 +KPX lacute L -73 +KPX lacute R -272 +KPX lacute X -235 +KPX lacute m -225 +KPX lacute braceright -149 +KPX lacute cent -282 +KPX lacute sterling -282 +KPX lacute currency -282 +KPX lacute yen -282 +KPX lacute brokenbar -282 +KPX lacute section -282 +KPX lacute ordfeminine -272 +KPX lacute guillemotleft -272 +KPX lacute logicalnot -272 +KPX lacute sfthyphen -272 +KPX lacute acute -272 +KPX lacute mu -272 +KPX lacute paragraph -272 +KPX lacute periodcentered -272 +KPX lacute cedilla -272 +KPX lacute guillemotright -235 +KPX lacute onequarter -235 +KPX lacute onehalf -235 +KPX lacute threequarters -235 +KPX lacute Egrave -112 +KPX lacute Icircumflex -112 +KPX lacute Yacute -272 +KPX lacute dotlessi -235 + +EndKernPairs +EndKernData +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Bold.ttf b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Bold.ttf new file mode 100644 index 0000000..8184ced Binary files /dev/null and b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Bold.ttf differ diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Bold.ufm b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Bold.ufm new file mode 100644 index 0000000..d598e20 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Bold.ufm @@ -0,0 +1,3285 @@ +StartFontMetrics 4.1 +Notice Converted by PHP-font-lib +Comment https://github.com/PhenX/php-font-lib +EncodingScheme FontSpecific +FontName DejaVu Sans Mono +FontSubfamily Bold +UniqueID DejaVu Sans Mono Bold +FullName DejaVu Sans Mono Bold +Version Version 2.37 +PostScriptName DejaVuSansMono-Bold +Manufacturer DejaVu fonts team +FontVendorURL http://dejavu.sourceforge.net +LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License +Weight Bold +ItalicAngle 0 +IsFixedPitch true +UnderlineThickness 44 +UnderlinePosition -63 +FontHeightOffset 0 +Ascender 928 +Descender -236 +FontBBox -447 -394 731 1041 +StartCharMetrics 3316 +U 32 ; WX 602 ; N space ; G 3 +U 33 ; WX 602 ; N exclam ; G 4 +U 34 ; WX 602 ; N quotedbl ; G 5 +U 35 ; WX 602 ; N numbersign ; G 6 +U 36 ; WX 602 ; N dollar ; G 7 +U 37 ; WX 602 ; N percent ; G 8 +U 38 ; WX 602 ; N ampersand ; G 9 +U 39 ; WX 602 ; N quotesingle ; G 10 +U 40 ; WX 602 ; N parenleft ; G 11 +U 41 ; WX 602 ; N parenright ; G 12 +U 42 ; WX 602 ; N asterisk ; G 13 +U 43 ; WX 602 ; N plus ; G 14 +U 44 ; WX 602 ; N comma ; G 15 +U 45 ; WX 602 ; N hyphen ; G 16 +U 46 ; WX 602 ; N period ; G 17 +U 47 ; WX 602 ; N slash ; G 18 +U 48 ; WX 602 ; N zero ; G 19 +U 49 ; WX 602 ; N one ; G 20 +U 50 ; WX 602 ; N two ; G 21 +U 51 ; WX 602 ; N three ; G 22 +U 52 ; WX 602 ; N four ; G 23 +U 53 ; WX 602 ; N five ; G 24 +U 54 ; WX 602 ; N six ; G 25 +U 55 ; WX 602 ; N seven ; G 26 +U 56 ; WX 602 ; N eight ; G 27 +U 57 ; WX 602 ; N nine ; G 28 +U 58 ; WX 602 ; N colon ; G 29 +U 59 ; WX 602 ; N semicolon ; G 30 +U 60 ; WX 602 ; N less ; G 31 +U 61 ; WX 602 ; N equal ; G 32 +U 62 ; WX 602 ; N greater ; G 33 +U 63 ; WX 602 ; N question ; G 34 +U 64 ; WX 602 ; N at ; G 35 +U 65 ; WX 602 ; N A ; G 36 +U 66 ; WX 602 ; N B ; G 37 +U 67 ; WX 602 ; N C ; G 38 +U 68 ; WX 602 ; N D ; G 39 +U 69 ; WX 602 ; N E ; G 40 +U 70 ; WX 602 ; N F ; G 41 +U 71 ; WX 602 ; N G ; G 42 +U 72 ; WX 602 ; N H ; G 43 +U 73 ; WX 602 ; N I ; G 44 +U 74 ; WX 602 ; N J ; G 45 +U 75 ; WX 602 ; N K ; G 46 +U 76 ; WX 602 ; N L ; G 47 +U 77 ; WX 602 ; N M ; G 48 +U 78 ; WX 602 ; N N ; G 49 +U 79 ; WX 602 ; N O ; G 50 +U 80 ; WX 602 ; N P ; G 51 +U 81 ; WX 602 ; N Q ; G 52 +U 82 ; WX 602 ; N R ; G 53 +U 83 ; WX 602 ; N S ; G 54 +U 84 ; WX 602 ; N T ; G 55 +U 85 ; WX 602 ; N U ; G 56 +U 86 ; WX 602 ; N V ; G 57 +U 87 ; WX 602 ; N W ; G 58 +U 88 ; WX 602 ; N X ; G 59 +U 89 ; WX 602 ; N Y ; G 60 +U 90 ; WX 602 ; N Z ; G 61 +U 91 ; WX 602 ; N bracketleft ; G 62 +U 92 ; WX 602 ; N backslash ; G 63 +U 93 ; WX 602 ; N bracketright ; G 64 +U 94 ; WX 602 ; N asciicircum ; G 65 +U 95 ; WX 602 ; N underscore ; G 66 +U 96 ; WX 602 ; N grave ; G 67 +U 97 ; WX 602 ; N a ; G 68 +U 98 ; WX 602 ; N b ; G 69 +U 99 ; WX 602 ; N c ; G 70 +U 100 ; WX 602 ; N d ; G 71 +U 101 ; WX 602 ; N e ; G 72 +U 102 ; WX 602 ; N f ; G 73 +U 103 ; WX 602 ; N g ; G 74 +U 104 ; WX 602 ; N h ; G 75 +U 105 ; WX 602 ; N i ; G 76 +U 106 ; WX 602 ; N j ; G 77 +U 107 ; WX 602 ; N k ; G 78 +U 108 ; WX 602 ; N l ; G 79 +U 109 ; WX 602 ; N m ; G 80 +U 110 ; WX 602 ; N n ; G 81 +U 111 ; WX 602 ; N o ; G 82 +U 112 ; WX 602 ; N p ; G 83 +U 113 ; WX 602 ; N q ; G 84 +U 114 ; WX 602 ; N r ; G 85 +U 115 ; WX 602 ; N s ; G 86 +U 116 ; WX 602 ; N t ; G 87 +U 117 ; WX 602 ; N u ; G 88 +U 118 ; WX 602 ; N v ; G 89 +U 119 ; WX 602 ; N w ; G 90 +U 120 ; WX 602 ; N x ; G 91 +U 121 ; WX 602 ; N y ; G 92 +U 122 ; WX 602 ; N z ; G 93 +U 123 ; WX 602 ; N braceleft ; G 94 +U 124 ; WX 602 ; N bar ; G 95 +U 125 ; WX 602 ; N braceright ; G 96 +U 126 ; WX 602 ; N asciitilde ; G 97 +U 160 ; WX 602 ; N nbspace ; G 98 +U 161 ; WX 602 ; N exclamdown ; G 99 +U 162 ; WX 602 ; N cent ; G 100 +U 163 ; WX 602 ; N sterling ; G 101 +U 164 ; WX 602 ; N currency ; G 102 +U 165 ; WX 602 ; N yen ; G 103 +U 166 ; WX 602 ; N brokenbar ; G 104 +U 167 ; WX 602 ; N section ; G 105 +U 168 ; WX 602 ; N dieresis ; G 106 +U 169 ; WX 602 ; N copyright ; G 107 +U 170 ; WX 602 ; N ordfeminine ; G 108 +U 171 ; WX 602 ; N guillemotleft ; G 109 +U 172 ; WX 602 ; N logicalnot ; G 110 +U 173 ; WX 602 ; N sfthyphen ; G 111 +U 174 ; WX 602 ; N registered ; G 112 +U 175 ; WX 602 ; N macron ; G 113 +U 176 ; WX 602 ; N degree ; G 114 +U 177 ; WX 602 ; N plusminus ; G 115 +U 178 ; WX 602 ; N twosuperior ; G 116 +U 179 ; WX 602 ; N threesuperior ; G 117 +U 180 ; WX 602 ; N acute ; G 118 +U 181 ; WX 602 ; N mu ; G 119 +U 182 ; WX 602 ; N paragraph ; G 120 +U 183 ; WX 602 ; N periodcentered ; G 121 +U 184 ; WX 602 ; N cedilla ; G 122 +U 185 ; WX 602 ; N onesuperior ; G 123 +U 186 ; WX 602 ; N ordmasculine ; G 124 +U 187 ; WX 602 ; N guillemotright ; G 125 +U 188 ; WX 602 ; N onequarter ; G 126 +U 189 ; WX 602 ; N onehalf ; G 127 +U 190 ; WX 602 ; N threequarters ; G 128 +U 191 ; WX 602 ; N questiondown ; G 129 +U 192 ; WX 602 ; N Agrave ; G 130 +U 193 ; WX 602 ; N Aacute ; G 131 +U 194 ; WX 602 ; N Acircumflex ; G 132 +U 195 ; WX 602 ; N Atilde ; G 133 +U 196 ; WX 602 ; N Adieresis ; G 134 +U 197 ; WX 602 ; N Aring ; G 135 +U 198 ; WX 602 ; N AE ; G 136 +U 199 ; WX 602 ; N Ccedilla ; G 137 +U 200 ; WX 602 ; N Egrave ; G 138 +U 201 ; WX 602 ; N Eacute ; G 139 +U 202 ; WX 602 ; N Ecircumflex ; G 140 +U 203 ; WX 602 ; N Edieresis ; G 141 +U 204 ; WX 602 ; N Igrave ; G 142 +U 205 ; WX 602 ; N Iacute ; G 143 +U 206 ; WX 602 ; N Icircumflex ; G 144 +U 207 ; WX 602 ; N Idieresis ; G 145 +U 208 ; WX 602 ; N Eth ; G 146 +U 209 ; WX 602 ; N Ntilde ; G 147 +U 210 ; WX 602 ; N Ograve ; G 148 +U 211 ; WX 602 ; N Oacute ; G 149 +U 212 ; WX 602 ; N Ocircumflex ; G 150 +U 213 ; WX 602 ; N Otilde ; G 151 +U 214 ; WX 602 ; N Odieresis ; G 152 +U 215 ; WX 602 ; N multiply ; G 153 +U 216 ; WX 602 ; N Oslash ; G 154 +U 217 ; WX 602 ; N Ugrave ; G 155 +U 218 ; WX 602 ; N Uacute ; G 156 +U 219 ; WX 602 ; N Ucircumflex ; G 157 +U 220 ; WX 602 ; N Udieresis ; G 158 +U 221 ; WX 602 ; N Yacute ; G 159 +U 222 ; WX 602 ; N Thorn ; G 160 +U 223 ; WX 602 ; N germandbls ; G 161 +U 224 ; WX 602 ; N agrave ; G 162 +U 225 ; WX 602 ; N aacute ; G 163 +U 226 ; WX 602 ; N acircumflex ; G 164 +U 227 ; WX 602 ; N atilde ; G 165 +U 228 ; WX 602 ; N adieresis ; G 166 +U 229 ; WX 602 ; N aring ; G 167 +U 230 ; WX 602 ; N ae ; G 168 +U 231 ; WX 602 ; N ccedilla ; G 169 +U 232 ; WX 602 ; N egrave ; G 170 +U 233 ; WX 602 ; N eacute ; G 171 +U 234 ; WX 602 ; N ecircumflex ; G 172 +U 235 ; WX 602 ; N edieresis ; G 173 +U 236 ; WX 602 ; N igrave ; G 174 +U 237 ; WX 602 ; N iacute ; G 175 +U 238 ; WX 602 ; N icircumflex ; G 176 +U 239 ; WX 602 ; N idieresis ; G 177 +U 240 ; WX 602 ; N eth ; G 178 +U 241 ; WX 602 ; N ntilde ; G 179 +U 242 ; WX 602 ; N ograve ; G 180 +U 243 ; WX 602 ; N oacute ; G 181 +U 244 ; WX 602 ; N ocircumflex ; G 182 +U 245 ; WX 602 ; N otilde ; G 183 +U 246 ; WX 602 ; N odieresis ; G 184 +U 247 ; WX 602 ; N divide ; G 185 +U 248 ; WX 602 ; N oslash ; G 186 +U 249 ; WX 602 ; N ugrave ; G 187 +U 250 ; WX 602 ; N uacute ; G 188 +U 251 ; WX 602 ; N ucircumflex ; G 189 +U 252 ; WX 602 ; N udieresis ; G 190 +U 253 ; WX 602 ; N yacute ; G 191 +U 254 ; WX 602 ; N thorn ; G 192 +U 255 ; WX 602 ; N ydieresis ; G 193 +U 256 ; WX 602 ; N Amacron ; G 194 +U 257 ; WX 602 ; N amacron ; G 195 +U 258 ; WX 602 ; N Abreve ; G 196 +U 259 ; WX 602 ; N abreve ; G 197 +U 260 ; WX 602 ; N Aogonek ; G 198 +U 261 ; WX 602 ; N aogonek ; G 199 +U 262 ; WX 602 ; N Cacute ; G 200 +U 263 ; WX 602 ; N cacute ; G 201 +U 264 ; WX 602 ; N Ccircumflex ; G 202 +U 265 ; WX 602 ; N ccircumflex ; G 203 +U 266 ; WX 602 ; N Cdotaccent ; G 204 +U 267 ; WX 602 ; N cdotaccent ; G 205 +U 268 ; WX 602 ; N Ccaron ; G 206 +U 269 ; WX 602 ; N ccaron ; G 207 +U 270 ; WX 602 ; N Dcaron ; G 208 +U 271 ; WX 602 ; N dcaron ; G 209 +U 272 ; WX 602 ; N Dcroat ; G 210 +U 273 ; WX 602 ; N dmacron ; G 211 +U 274 ; WX 602 ; N Emacron ; G 212 +U 275 ; WX 602 ; N emacron ; G 213 +U 276 ; WX 602 ; N Ebreve ; G 214 +U 277 ; WX 602 ; N ebreve ; G 215 +U 278 ; WX 602 ; N Edotaccent ; G 216 +U 279 ; WX 602 ; N edotaccent ; G 217 +U 280 ; WX 602 ; N Eogonek ; G 218 +U 281 ; WX 602 ; N eogonek ; G 219 +U 282 ; WX 602 ; N Ecaron ; G 220 +U 283 ; WX 602 ; N ecaron ; G 221 +U 284 ; WX 602 ; N Gcircumflex ; G 222 +U 285 ; WX 602 ; N gcircumflex ; G 223 +U 286 ; WX 602 ; N Gbreve ; G 224 +U 287 ; WX 602 ; N gbreve ; G 225 +U 288 ; WX 602 ; N Gdotaccent ; G 226 +U 289 ; WX 602 ; N gdotaccent ; G 227 +U 290 ; WX 602 ; N Gcommaaccent ; G 228 +U 291 ; WX 602 ; N gcommaaccent ; G 229 +U 292 ; WX 602 ; N Hcircumflex ; G 230 +U 293 ; WX 602 ; N hcircumflex ; G 231 +U 294 ; WX 602 ; N Hbar ; G 232 +U 295 ; WX 602 ; N hbar ; G 233 +U 296 ; WX 602 ; N Itilde ; G 234 +U 297 ; WX 602 ; N itilde ; G 235 +U 298 ; WX 602 ; N Imacron ; G 236 +U 299 ; WX 602 ; N imacron ; G 237 +U 300 ; WX 602 ; N Ibreve ; G 238 +U 301 ; WX 602 ; N ibreve ; G 239 +U 302 ; WX 602 ; N Iogonek ; G 240 +U 303 ; WX 602 ; N iogonek ; G 241 +U 304 ; WX 602 ; N Idot ; G 242 +U 305 ; WX 602 ; N dotlessi ; G 243 +U 306 ; WX 602 ; N IJ ; G 244 +U 307 ; WX 602 ; N ij ; G 245 +U 308 ; WX 602 ; N Jcircumflex ; G 246 +U 309 ; WX 602 ; N jcircumflex ; G 247 +U 310 ; WX 602 ; N Kcommaaccent ; G 248 +U 311 ; WX 602 ; N kcommaaccent ; G 249 +U 312 ; WX 602 ; N kgreenlandic ; G 250 +U 313 ; WX 602 ; N Lacute ; G 251 +U 314 ; WX 602 ; N lacute ; G 252 +U 315 ; WX 602 ; N Lcommaaccent ; G 253 +U 316 ; WX 602 ; N lcommaaccent ; G 254 +U 317 ; WX 602 ; N Lcaron ; G 255 +U 318 ; WX 602 ; N lcaron ; G 256 +U 319 ; WX 602 ; N Ldot ; G 257 +U 320 ; WX 602 ; N ldot ; G 258 +U 321 ; WX 602 ; N Lslash ; G 259 +U 322 ; WX 602 ; N lslash ; G 260 +U 323 ; WX 602 ; N Nacute ; G 261 +U 324 ; WX 602 ; N nacute ; G 262 +U 325 ; WX 602 ; N Ncommaaccent ; G 263 +U 326 ; WX 602 ; N ncommaaccent ; G 264 +U 327 ; WX 602 ; N Ncaron ; G 265 +U 328 ; WX 602 ; N ncaron ; G 266 +U 329 ; WX 602 ; N napostrophe ; G 267 +U 330 ; WX 602 ; N Eng ; G 268 +U 331 ; WX 602 ; N eng ; G 269 +U 332 ; WX 602 ; N Omacron ; G 270 +U 333 ; WX 602 ; N omacron ; G 271 +U 334 ; WX 602 ; N Obreve ; G 272 +U 335 ; WX 602 ; N obreve ; G 273 +U 336 ; WX 602 ; N Ohungarumlaut ; G 274 +U 337 ; WX 602 ; N ohungarumlaut ; G 275 +U 338 ; WX 602 ; N OE ; G 276 +U 339 ; WX 602 ; N oe ; G 277 +U 340 ; WX 602 ; N Racute ; G 278 +U 341 ; WX 602 ; N racute ; G 279 +U 342 ; WX 602 ; N Rcommaaccent ; G 280 +U 343 ; WX 602 ; N rcommaaccent ; G 281 +U 344 ; WX 602 ; N Rcaron ; G 282 +U 345 ; WX 602 ; N rcaron ; G 283 +U 346 ; WX 602 ; N Sacute ; G 284 +U 347 ; WX 602 ; N sacute ; G 285 +U 348 ; WX 602 ; N Scircumflex ; G 286 +U 349 ; WX 602 ; N scircumflex ; G 287 +U 350 ; WX 602 ; N Scedilla ; G 288 +U 351 ; WX 602 ; N scedilla ; G 289 +U 352 ; WX 602 ; N Scaron ; G 290 +U 353 ; WX 602 ; N scaron ; G 291 +U 354 ; WX 602 ; N Tcommaaccent ; G 292 +U 355 ; WX 602 ; N tcommaaccent ; G 293 +U 356 ; WX 602 ; N Tcaron ; G 294 +U 357 ; WX 602 ; N tcaron ; G 295 +U 358 ; WX 602 ; N Tbar ; G 296 +U 359 ; WX 602 ; N tbar ; G 297 +U 360 ; WX 602 ; N Utilde ; G 298 +U 361 ; WX 602 ; N utilde ; G 299 +U 362 ; WX 602 ; N Umacron ; G 300 +U 363 ; WX 602 ; N umacron ; G 301 +U 364 ; WX 602 ; N Ubreve ; G 302 +U 365 ; WX 602 ; N ubreve ; G 303 +U 366 ; WX 602 ; N Uring ; G 304 +U 367 ; WX 602 ; N uring ; G 305 +U 368 ; WX 602 ; N Uhungarumlaut ; G 306 +U 369 ; WX 602 ; N uhungarumlaut ; G 307 +U 370 ; WX 602 ; N Uogonek ; G 308 +U 371 ; WX 602 ; N uogonek ; G 309 +U 372 ; WX 602 ; N Wcircumflex ; G 310 +U 373 ; WX 602 ; N wcircumflex ; G 311 +U 374 ; WX 602 ; N Ycircumflex ; G 312 +U 375 ; WX 602 ; N ycircumflex ; G 313 +U 376 ; WX 602 ; N Ydieresis ; G 314 +U 377 ; WX 602 ; N Zacute ; G 315 +U 378 ; WX 602 ; N zacute ; G 316 +U 379 ; WX 602 ; N Zdotaccent ; G 317 +U 380 ; WX 602 ; N zdotaccent ; G 318 +U 381 ; WX 602 ; N Zcaron ; G 319 +U 382 ; WX 602 ; N zcaron ; G 320 +U 383 ; WX 602 ; N longs ; G 321 +U 384 ; WX 602 ; N uni0180 ; G 322 +U 385 ; WX 602 ; N uni0181 ; G 323 +U 386 ; WX 602 ; N uni0182 ; G 324 +U 387 ; WX 602 ; N uni0183 ; G 325 +U 388 ; WX 602 ; N uni0184 ; G 326 +U 389 ; WX 602 ; N uni0185 ; G 327 +U 390 ; WX 602 ; N uni0186 ; G 328 +U 391 ; WX 602 ; N uni0187 ; G 329 +U 392 ; WX 602 ; N uni0188 ; G 330 +U 393 ; WX 602 ; N uni0189 ; G 331 +U 394 ; WX 602 ; N uni018A ; G 332 +U 395 ; WX 602 ; N uni018B ; G 333 +U 396 ; WX 602 ; N uni018C ; G 334 +U 397 ; WX 602 ; N uni018D ; G 335 +U 398 ; WX 602 ; N uni018E ; G 336 +U 399 ; WX 602 ; N uni018F ; G 337 +U 400 ; WX 602 ; N uni0190 ; G 338 +U 401 ; WX 602 ; N uni0191 ; G 339 +U 402 ; WX 602 ; N florin ; G 340 +U 403 ; WX 602 ; N uni0193 ; G 341 +U 404 ; WX 602 ; N uni0194 ; G 342 +U 405 ; WX 602 ; N uni0195 ; G 343 +U 406 ; WX 602 ; N uni0196 ; G 344 +U 407 ; WX 602 ; N uni0197 ; G 345 +U 408 ; WX 602 ; N uni0198 ; G 346 +U 409 ; WX 602 ; N uni0199 ; G 347 +U 410 ; WX 602 ; N uni019A ; G 348 +U 411 ; WX 602 ; N uni019B ; G 349 +U 412 ; WX 602 ; N uni019C ; G 350 +U 413 ; WX 602 ; N uni019D ; G 351 +U 414 ; WX 602 ; N uni019E ; G 352 +U 415 ; WX 602 ; N uni019F ; G 353 +U 416 ; WX 602 ; N Ohorn ; G 354 +U 417 ; WX 602 ; N ohorn ; G 355 +U 418 ; WX 602 ; N uni01A2 ; G 356 +U 419 ; WX 602 ; N uni01A3 ; G 357 +U 420 ; WX 602 ; N uni01A4 ; G 358 +U 421 ; WX 602 ; N uni01A5 ; G 359 +U 422 ; WX 602 ; N uni01A6 ; G 360 +U 423 ; WX 602 ; N uni01A7 ; G 361 +U 424 ; WX 602 ; N uni01A8 ; G 362 +U 425 ; WX 602 ; N uni01A9 ; G 363 +U 426 ; WX 602 ; N uni01AA ; G 364 +U 427 ; WX 602 ; N uni01AB ; G 365 +U 428 ; WX 602 ; N uni01AC ; G 366 +U 429 ; WX 602 ; N uni01AD ; G 367 +U 430 ; WX 602 ; N uni01AE ; G 368 +U 431 ; WX 602 ; N Uhorn ; G 369 +U 432 ; WX 602 ; N uhorn ; G 370 +U 433 ; WX 602 ; N uni01B1 ; G 371 +U 434 ; WX 602 ; N uni01B2 ; G 372 +U 435 ; WX 602 ; N uni01B3 ; G 373 +U 436 ; WX 602 ; N uni01B4 ; G 374 +U 437 ; WX 602 ; N uni01B5 ; G 375 +U 438 ; WX 602 ; N uni01B6 ; G 376 +U 439 ; WX 602 ; N uni01B7 ; G 377 +U 440 ; WX 602 ; N uni01B8 ; G 378 +U 441 ; WX 602 ; N uni01B9 ; G 379 +U 442 ; WX 602 ; N uni01BA ; G 380 +U 443 ; WX 602 ; N uni01BB ; G 381 +U 444 ; WX 602 ; N uni01BC ; G 382 +U 445 ; WX 602 ; N uni01BD ; G 383 +U 446 ; WX 602 ; N uni01BE ; G 384 +U 447 ; WX 602 ; N uni01BF ; G 385 +U 448 ; WX 602 ; N uni01C0 ; G 386 +U 449 ; WX 602 ; N uni01C1 ; G 387 +U 450 ; WX 602 ; N uni01C2 ; G 388 +U 451 ; WX 602 ; N uni01C3 ; G 389 +U 461 ; WX 602 ; N uni01CD ; G 390 +U 462 ; WX 602 ; N uni01CE ; G 391 +U 463 ; WX 602 ; N uni01CF ; G 392 +U 464 ; WX 602 ; N uni01D0 ; G 393 +U 465 ; WX 602 ; N uni01D1 ; G 394 +U 466 ; WX 602 ; N uni01D2 ; G 395 +U 467 ; WX 602 ; N uni01D3 ; G 396 +U 468 ; WX 602 ; N uni01D4 ; G 397 +U 469 ; WX 602 ; N uni01D5 ; G 398 +U 470 ; WX 602 ; N uni01D6 ; G 399 +U 471 ; WX 602 ; N uni01D7 ; G 400 +U 472 ; WX 602 ; N uni01D8 ; G 401 +U 473 ; WX 602 ; N uni01D9 ; G 402 +U 474 ; WX 602 ; N uni01DA ; G 403 +U 475 ; WX 602 ; N uni01DB ; G 404 +U 476 ; WX 602 ; N uni01DC ; G 405 +U 477 ; WX 602 ; N uni01DD ; G 406 +U 478 ; WX 602 ; N uni01DE ; G 407 +U 479 ; WX 602 ; N uni01DF ; G 408 +U 480 ; WX 602 ; N uni01E0 ; G 409 +U 481 ; WX 602 ; N uni01E1 ; G 410 +U 482 ; WX 602 ; N uni01E2 ; G 411 +U 483 ; WX 602 ; N uni01E3 ; G 412 +U 486 ; WX 602 ; N Gcaron ; G 413 +U 487 ; WX 602 ; N gcaron ; G 414 +U 488 ; WX 602 ; N uni01E8 ; G 415 +U 489 ; WX 602 ; N uni01E9 ; G 416 +U 490 ; WX 602 ; N uni01EA ; G 417 +U 491 ; WX 602 ; N uni01EB ; G 418 +U 492 ; WX 602 ; N uni01EC ; G 419 +U 493 ; WX 602 ; N uni01ED ; G 420 +U 494 ; WX 602 ; N uni01EE ; G 421 +U 495 ; WX 602 ; N uni01EF ; G 422 +U 496 ; WX 602 ; N uni01F0 ; G 423 +U 500 ; WX 602 ; N uni01F4 ; G 424 +U 501 ; WX 602 ; N uni01F5 ; G 425 +U 502 ; WX 602 ; N uni01F6 ; G 426 +U 504 ; WX 602 ; N uni01F8 ; G 427 +U 505 ; WX 602 ; N uni01F9 ; G 428 +U 508 ; WX 602 ; N AEacute ; G 429 +U 509 ; WX 602 ; N aeacute ; G 430 +U 510 ; WX 602 ; N Oslashacute ; G 431 +U 511 ; WX 602 ; N oslashacute ; G 432 +U 512 ; WX 602 ; N uni0200 ; G 433 +U 513 ; WX 602 ; N uni0201 ; G 434 +U 514 ; WX 602 ; N uni0202 ; G 435 +U 515 ; WX 602 ; N uni0203 ; G 436 +U 516 ; WX 602 ; N uni0204 ; G 437 +U 517 ; WX 602 ; N uni0205 ; G 438 +U 518 ; WX 602 ; N uni0206 ; G 439 +U 519 ; WX 602 ; N uni0207 ; G 440 +U 520 ; WX 602 ; N uni0208 ; G 441 +U 521 ; WX 602 ; N uni0209 ; G 442 +U 522 ; WX 602 ; N uni020A ; G 443 +U 523 ; WX 602 ; N uni020B ; G 444 +U 524 ; WX 602 ; N uni020C ; G 445 +U 525 ; WX 602 ; N uni020D ; G 446 +U 526 ; WX 602 ; N uni020E ; G 447 +U 527 ; WX 602 ; N uni020F ; G 448 +U 528 ; WX 602 ; N uni0210 ; G 449 +U 529 ; WX 602 ; N uni0211 ; G 450 +U 530 ; WX 602 ; N uni0212 ; G 451 +U 531 ; WX 602 ; N uni0213 ; G 452 +U 532 ; WX 602 ; N uni0214 ; G 453 +U 533 ; WX 602 ; N uni0215 ; G 454 +U 534 ; WX 602 ; N uni0216 ; G 455 +U 535 ; WX 602 ; N uni0217 ; G 456 +U 536 ; WX 602 ; N Scommaaccent ; G 457 +U 537 ; WX 602 ; N scommaaccent ; G 458 +U 538 ; WX 602 ; N uni021A ; G 459 +U 539 ; WX 602 ; N uni021B ; G 460 +U 540 ; WX 602 ; N uni021C ; G 461 +U 541 ; WX 602 ; N uni021D ; G 462 +U 542 ; WX 602 ; N uni021E ; G 463 +U 543 ; WX 602 ; N uni021F ; G 464 +U 544 ; WX 602 ; N uni0220 ; G 465 +U 545 ; WX 602 ; N uni0221 ; G 466 +U 548 ; WX 602 ; N uni0224 ; G 467 +U 549 ; WX 602 ; N uni0225 ; G 468 +U 550 ; WX 602 ; N uni0226 ; G 469 +U 551 ; WX 602 ; N uni0227 ; G 470 +U 552 ; WX 602 ; N uni0228 ; G 471 +U 553 ; WX 602 ; N uni0229 ; G 472 +U 554 ; WX 602 ; N uni022A ; G 473 +U 555 ; WX 602 ; N uni022B ; G 474 +U 556 ; WX 602 ; N uni022C ; G 475 +U 557 ; WX 602 ; N uni022D ; G 476 +U 558 ; WX 602 ; N uni022E ; G 477 +U 559 ; WX 602 ; N uni022F ; G 478 +U 560 ; WX 602 ; N uni0230 ; G 479 +U 561 ; WX 602 ; N uni0231 ; G 480 +U 562 ; WX 602 ; N uni0232 ; G 481 +U 563 ; WX 602 ; N uni0233 ; G 482 +U 564 ; WX 602 ; N uni0234 ; G 483 +U 565 ; WX 602 ; N uni0235 ; G 484 +U 566 ; WX 602 ; N uni0236 ; G 485 +U 567 ; WX 602 ; N dotlessj ; G 486 +U 568 ; WX 602 ; N uni0238 ; G 487 +U 569 ; WX 602 ; N uni0239 ; G 488 +U 570 ; WX 602 ; N uni023A ; G 489 +U 571 ; WX 602 ; N uni023B ; G 490 +U 572 ; WX 602 ; N uni023C ; G 491 +U 573 ; WX 602 ; N uni023D ; G 492 +U 574 ; WX 602 ; N uni023E ; G 493 +U 575 ; WX 602 ; N uni023F ; G 494 +U 576 ; WX 602 ; N uni0240 ; G 495 +U 577 ; WX 602 ; N uni0241 ; G 496 +U 579 ; WX 602 ; N uni0243 ; G 497 +U 580 ; WX 602 ; N uni0244 ; G 498 +U 581 ; WX 602 ; N uni0245 ; G 499 +U 588 ; WX 602 ; N uni024C ; G 500 +U 589 ; WX 602 ; N uni024D ; G 501 +U 592 ; WX 602 ; N uni0250 ; G 502 +U 593 ; WX 602 ; N uni0251 ; G 503 +U 594 ; WX 602 ; N uni0252 ; G 504 +U 595 ; WX 602 ; N uni0253 ; G 505 +U 596 ; WX 602 ; N uni0254 ; G 506 +U 597 ; WX 602 ; N uni0255 ; G 507 +U 598 ; WX 602 ; N uni0256 ; G 508 +U 599 ; WX 602 ; N uni0257 ; G 509 +U 600 ; WX 602 ; N uni0258 ; G 510 +U 601 ; WX 602 ; N uni0259 ; G 511 +U 602 ; WX 602 ; N uni025A ; G 512 +U 603 ; WX 602 ; N uni025B ; G 513 +U 604 ; WX 602 ; N uni025C ; G 514 +U 605 ; WX 602 ; N uni025D ; G 515 +U 606 ; WX 602 ; N uni025E ; G 516 +U 607 ; WX 602 ; N uni025F ; G 517 +U 608 ; WX 602 ; N uni0260 ; G 518 +U 609 ; WX 602 ; N uni0261 ; G 519 +U 610 ; WX 602 ; N uni0262 ; G 520 +U 611 ; WX 602 ; N uni0263 ; G 521 +U 612 ; WX 602 ; N uni0264 ; G 522 +U 613 ; WX 602 ; N uni0265 ; G 523 +U 614 ; WX 602 ; N uni0266 ; G 524 +U 615 ; WX 602 ; N uni0267 ; G 525 +U 616 ; WX 602 ; N uni0268 ; G 526 +U 617 ; WX 602 ; N uni0269 ; G 527 +U 618 ; WX 602 ; N uni026A ; G 528 +U 619 ; WX 602 ; N uni026B ; G 529 +U 620 ; WX 602 ; N uni026C ; G 530 +U 621 ; WX 602 ; N uni026D ; G 531 +U 622 ; WX 602 ; N uni026E ; G 532 +U 623 ; WX 602 ; N uni026F ; G 533 +U 624 ; WX 602 ; N uni0270 ; G 534 +U 625 ; WX 602 ; N uni0271 ; G 535 +U 626 ; WX 602 ; N uni0272 ; G 536 +U 627 ; WX 602 ; N uni0273 ; G 537 +U 628 ; WX 602 ; N uni0274 ; G 538 +U 629 ; WX 602 ; N uni0275 ; G 539 +U 630 ; WX 602 ; N uni0276 ; G 540 +U 631 ; WX 602 ; N uni0277 ; G 541 +U 632 ; WX 602 ; N uni0278 ; G 542 +U 633 ; WX 602 ; N uni0279 ; G 543 +U 634 ; WX 602 ; N uni027A ; G 544 +U 635 ; WX 602 ; N uni027B ; G 545 +U 636 ; WX 602 ; N uni027C ; G 546 +U 637 ; WX 602 ; N uni027D ; G 547 +U 638 ; WX 602 ; N uni027E ; G 548 +U 639 ; WX 602 ; N uni027F ; G 549 +U 640 ; WX 602 ; N uni0280 ; G 550 +U 641 ; WX 602 ; N uni0281 ; G 551 +U 642 ; WX 602 ; N uni0282 ; G 552 +U 643 ; WX 602 ; N uni0283 ; G 553 +U 644 ; WX 602 ; N uni0284 ; G 554 +U 645 ; WX 602 ; N uni0285 ; G 555 +U 646 ; WX 602 ; N uni0286 ; G 556 +U 647 ; WX 602 ; N uni0287 ; G 557 +U 648 ; WX 602 ; N uni0288 ; G 558 +U 649 ; WX 602 ; N uni0289 ; G 559 +U 650 ; WX 602 ; N uni028A ; G 560 +U 651 ; WX 602 ; N uni028B ; G 561 +U 652 ; WX 602 ; N uni028C ; G 562 +U 653 ; WX 602 ; N uni028D ; G 563 +U 654 ; WX 602 ; N uni028E ; G 564 +U 655 ; WX 602 ; N uni028F ; G 565 +U 656 ; WX 602 ; N uni0290 ; G 566 +U 657 ; WX 602 ; N uni0291 ; G 567 +U 658 ; WX 602 ; N uni0292 ; G 568 +U 659 ; WX 602 ; N uni0293 ; G 569 +U 660 ; WX 602 ; N uni0294 ; G 570 +U 661 ; WX 602 ; N uni0295 ; G 571 +U 662 ; WX 602 ; N uni0296 ; G 572 +U 663 ; WX 602 ; N uni0297 ; G 573 +U 664 ; WX 602 ; N uni0298 ; G 574 +U 665 ; WX 602 ; N uni0299 ; G 575 +U 666 ; WX 602 ; N uni029A ; G 576 +U 667 ; WX 602 ; N uni029B ; G 577 +U 668 ; WX 602 ; N uni029C ; G 578 +U 669 ; WX 602 ; N uni029D ; G 579 +U 670 ; WX 602 ; N uni029E ; G 580 +U 671 ; WX 602 ; N uni029F ; G 581 +U 672 ; WX 602 ; N uni02A0 ; G 582 +U 673 ; WX 602 ; N uni02A1 ; G 583 +U 674 ; WX 602 ; N uni02A2 ; G 584 +U 675 ; WX 602 ; N uni02A3 ; G 585 +U 676 ; WX 602 ; N uni02A4 ; G 586 +U 677 ; WX 602 ; N uni02A5 ; G 587 +U 678 ; WX 602 ; N uni02A6 ; G 588 +U 679 ; WX 602 ; N uni02A7 ; G 589 +U 680 ; WX 602 ; N uni02A8 ; G 590 +U 681 ; WX 602 ; N uni02A9 ; G 591 +U 682 ; WX 602 ; N uni02AA ; G 592 +U 683 ; WX 602 ; N uni02AB ; G 593 +U 684 ; WX 602 ; N uni02AC ; G 594 +U 685 ; WX 602 ; N uni02AD ; G 595 +U 686 ; WX 602 ; N uni02AE ; G 596 +U 687 ; WX 602 ; N uni02AF ; G 597 +U 688 ; WX 602 ; N uni02B0 ; G 598 +U 689 ; WX 602 ; N uni02B1 ; G 599 +U 690 ; WX 602 ; N uni02B2 ; G 600 +U 691 ; WX 602 ; N uni02B3 ; G 601 +U 692 ; WX 602 ; N uni02B4 ; G 602 +U 693 ; WX 602 ; N uni02B5 ; G 603 +U 694 ; WX 602 ; N uni02B6 ; G 604 +U 695 ; WX 602 ; N uni02B7 ; G 605 +U 696 ; WX 602 ; N uni02B8 ; G 606 +U 697 ; WX 602 ; N uni02B9 ; G 607 +U 699 ; WX 602 ; N uni02BB ; G 608 +U 700 ; WX 602 ; N uni02BC ; G 609 +U 701 ; WX 602 ; N uni02BD ; G 610 +U 702 ; WX 602 ; N uni02BE ; G 611 +U 703 ; WX 602 ; N uni02BF ; G 612 +U 704 ; WX 602 ; N uni02C0 ; G 613 +U 705 ; WX 602 ; N uni02C1 ; G 614 +U 710 ; WX 602 ; N circumflex ; G 615 +U 711 ; WX 602 ; N caron ; G 616 +U 712 ; WX 602 ; N uni02C8 ; G 617 +U 713 ; WX 602 ; N uni02C9 ; G 618 +U 716 ; WX 602 ; N uni02CC ; G 619 +U 717 ; WX 602 ; N uni02CD ; G 620 +U 718 ; WX 602 ; N uni02CE ; G 621 +U 719 ; WX 602 ; N uni02CF ; G 622 +U 720 ; WX 602 ; N uni02D0 ; G 623 +U 721 ; WX 602 ; N uni02D1 ; G 624 +U 722 ; WX 602 ; N uni02D2 ; G 625 +U 723 ; WX 602 ; N uni02D3 ; G 626 +U 726 ; WX 602 ; N uni02D6 ; G 627 +U 727 ; WX 602 ; N uni02D7 ; G 628 +U 728 ; WX 602 ; N breve ; G 629 +U 729 ; WX 602 ; N dotaccent ; G 630 +U 730 ; WX 602 ; N ring ; G 631 +U 731 ; WX 602 ; N ogonek ; G 632 +U 732 ; WX 602 ; N tilde ; G 633 +U 733 ; WX 602 ; N hungarumlaut ; G 634 +U 734 ; WX 602 ; N uni02DE ; G 635 +U 736 ; WX 602 ; N uni02E0 ; G 636 +U 737 ; WX 602 ; N uni02E1 ; G 637 +U 738 ; WX 602 ; N uni02E2 ; G 638 +U 739 ; WX 602 ; N uni02E3 ; G 639 +U 740 ; WX 602 ; N uni02E4 ; G 640 +U 741 ; WX 602 ; N uni02E5 ; G 641 +U 742 ; WX 602 ; N uni02E6 ; G 642 +U 743 ; WX 602 ; N uni02E7 ; G 643 +U 744 ; WX 602 ; N uni02E8 ; G 644 +U 745 ; WX 602 ; N uni02E9 ; G 645 +U 750 ; WX 602 ; N uni02EE ; G 646 +U 755 ; WX 602 ; N uni02F3 ; G 647 +U 768 ; WX 602 ; N gravecomb ; G 648 +U 769 ; WX 602 ; N acutecomb ; G 649 +U 770 ; WX 602 ; N uni0302 ; G 650 +U 771 ; WX 602 ; N tildecomb ; G 651 +U 772 ; WX 602 ; N uni0304 ; G 652 +U 773 ; WX 602 ; N uni0305 ; G 653 +U 774 ; WX 602 ; N uni0306 ; G 654 +U 775 ; WX 602 ; N uni0307 ; G 655 +U 776 ; WX 602 ; N uni0308 ; G 656 +U 777 ; WX 602 ; N hookabovecomb ; G 657 +U 778 ; WX 602 ; N uni030A ; G 658 +U 779 ; WX 602 ; N uni030B ; G 659 +U 780 ; WX 602 ; N uni030C ; G 660 +U 781 ; WX 602 ; N uni030D ; G 661 +U 782 ; WX 602 ; N uni030E ; G 662 +U 783 ; WX 602 ; N uni030F ; G 663 +U 784 ; WX 602 ; N uni0310 ; G 664 +U 785 ; WX 602 ; N uni0311 ; G 665 +U 786 ; WX 602 ; N uni0312 ; G 666 +U 787 ; WX 602 ; N uni0313 ; G 667 +U 788 ; WX 602 ; N uni0314 ; G 668 +U 789 ; WX 602 ; N uni0315 ; G 669 +U 790 ; WX 602 ; N uni0316 ; G 670 +U 791 ; WX 602 ; N uni0317 ; G 671 +U 792 ; WX 602 ; N uni0318 ; G 672 +U 793 ; WX 602 ; N uni0319 ; G 673 +U 794 ; WX 602 ; N uni031A ; G 674 +U 795 ; WX 602 ; N uni031B ; G 675 +U 796 ; WX 602 ; N uni031C ; G 676 +U 797 ; WX 602 ; N uni031D ; G 677 +U 798 ; WX 602 ; N uni031E ; G 678 +U 799 ; WX 602 ; N uni031F ; G 679 +U 800 ; WX 602 ; N uni0320 ; G 680 +U 801 ; WX 602 ; N uni0321 ; G 681 +U 802 ; WX 602 ; N uni0322 ; G 682 +U 803 ; WX 602 ; N dotbelowcomb ; G 683 +U 804 ; WX 602 ; N uni0324 ; G 684 +U 805 ; WX 602 ; N uni0325 ; G 685 +U 806 ; WX 602 ; N uni0326 ; G 686 +U 807 ; WX 602 ; N uni0327 ; G 687 +U 808 ; WX 602 ; N uni0328 ; G 688 +U 809 ; WX 602 ; N uni0329 ; G 689 +U 810 ; WX 602 ; N uni032A ; G 690 +U 811 ; WX 602 ; N uni032B ; G 691 +U 812 ; WX 602 ; N uni032C ; G 692 +U 813 ; WX 602 ; N uni032D ; G 693 +U 814 ; WX 602 ; N uni032E ; G 694 +U 815 ; WX 602 ; N uni032F ; G 695 +U 816 ; WX 602 ; N uni0330 ; G 696 +U 817 ; WX 602 ; N uni0331 ; G 697 +U 818 ; WX 602 ; N uni0332 ; G 698 +U 819 ; WX 602 ; N uni0333 ; G 699 +U 820 ; WX 602 ; N uni0334 ; G 700 +U 821 ; WX 602 ; N uni0335 ; G 701 +U 822 ; WX 602 ; N uni0336 ; G 702 +U 823 ; WX 602 ; N uni0337 ; G 703 +U 824 ; WX 602 ; N uni0338 ; G 704 +U 825 ; WX 602 ; N uni0339 ; G 705 +U 826 ; WX 602 ; N uni033A ; G 706 +U 827 ; WX 602 ; N uni033B ; G 707 +U 828 ; WX 602 ; N uni033C ; G 708 +U 829 ; WX 602 ; N uni033D ; G 709 +U 830 ; WX 602 ; N uni033E ; G 710 +U 831 ; WX 602 ; N uni033F ; G 711 +U 835 ; WX 602 ; N uni0343 ; G 712 +U 856 ; WX 602 ; N uni0358 ; G 713 +U 865 ; WX 602 ; N uni0361 ; G 714 +U 884 ; WX 602 ; N uni0374 ; G 715 +U 885 ; WX 602 ; N uni0375 ; G 716 +U 886 ; WX 602 ; N uni0376 ; G 717 +U 887 ; WX 602 ; N uni0377 ; G 718 +U 890 ; WX 602 ; N uni037A ; G 719 +U 891 ; WX 602 ; N uni037B ; G 720 +U 892 ; WX 602 ; N uni037C ; G 721 +U 893 ; WX 602 ; N uni037D ; G 722 +U 894 ; WX 602 ; N uni037E ; G 723 +U 895 ; WX 602 ; N uni037F ; G 724 +U 900 ; WX 602 ; N tonos ; G 725 +U 901 ; WX 602 ; N dieresistonos ; G 726 +U 902 ; WX 602 ; N Alphatonos ; G 727 +U 903 ; WX 602 ; N anoteleia ; G 728 +U 904 ; WX 602 ; N Epsilontonos ; G 729 +U 905 ; WX 602 ; N Etatonos ; G 730 +U 906 ; WX 602 ; N Iotatonos ; G 731 +U 908 ; WX 602 ; N Omicrontonos ; G 732 +U 910 ; WX 602 ; N Upsilontonos ; G 733 +U 911 ; WX 602 ; N Omegatonos ; G 734 +U 912 ; WX 602 ; N iotadieresistonos ; G 735 +U 913 ; WX 602 ; N Alpha ; G 736 +U 914 ; WX 602 ; N Beta ; G 737 +U 915 ; WX 602 ; N Gamma ; G 738 +U 916 ; WX 602 ; N uni0394 ; G 739 +U 917 ; WX 602 ; N Epsilon ; G 740 +U 918 ; WX 602 ; N Zeta ; G 741 +U 919 ; WX 602 ; N Eta ; G 742 +U 920 ; WX 602 ; N Theta ; G 743 +U 921 ; WX 602 ; N Iota ; G 744 +U 922 ; WX 602 ; N Kappa ; G 745 +U 923 ; WX 602 ; N Lambda ; G 746 +U 924 ; WX 602 ; N Mu ; G 747 +U 925 ; WX 602 ; N Nu ; G 748 +U 926 ; WX 602 ; N Xi ; G 749 +U 927 ; WX 602 ; N Omicron ; G 750 +U 928 ; WX 602 ; N Pi ; G 751 +U 929 ; WX 602 ; N Rho ; G 752 +U 931 ; WX 602 ; N Sigma ; G 753 +U 932 ; WX 602 ; N Tau ; G 754 +U 933 ; WX 602 ; N Upsilon ; G 755 +U 934 ; WX 602 ; N Phi ; G 756 +U 935 ; WX 602 ; N Chi ; G 757 +U 936 ; WX 602 ; N Psi ; G 758 +U 937 ; WX 602 ; N Omega ; G 759 +U 938 ; WX 602 ; N Iotadieresis ; G 760 +U 939 ; WX 602 ; N Upsilondieresis ; G 761 +U 940 ; WX 602 ; N alphatonos ; G 762 +U 941 ; WX 602 ; N epsilontonos ; G 763 +U 942 ; WX 602 ; N etatonos ; G 764 +U 943 ; WX 602 ; N iotatonos ; G 765 +U 944 ; WX 602 ; N upsilondieresistonos ; G 766 +U 945 ; WX 602 ; N alpha ; G 767 +U 946 ; WX 602 ; N beta ; G 768 +U 947 ; WX 602 ; N gamma ; G 769 +U 948 ; WX 602 ; N delta ; G 770 +U 949 ; WX 602 ; N epsilon ; G 771 +U 950 ; WX 602 ; N zeta ; G 772 +U 951 ; WX 602 ; N eta ; G 773 +U 952 ; WX 602 ; N theta ; G 774 +U 953 ; WX 602 ; N iota ; G 775 +U 954 ; WX 602 ; N kappa ; G 776 +U 955 ; WX 602 ; N lambda ; G 777 +U 956 ; WX 602 ; N uni03BC ; G 778 +U 957 ; WX 602 ; N nu ; G 779 +U 958 ; WX 602 ; N xi ; G 780 +U 959 ; WX 602 ; N omicron ; G 781 +U 960 ; WX 602 ; N pi ; G 782 +U 961 ; WX 602 ; N rho ; G 783 +U 962 ; WX 602 ; N sigma1 ; G 784 +U 963 ; WX 602 ; N sigma ; G 785 +U 964 ; WX 602 ; N tau ; G 786 +U 965 ; WX 602 ; N upsilon ; G 787 +U 966 ; WX 602 ; N phi ; G 788 +U 967 ; WX 602 ; N chi ; G 789 +U 968 ; WX 602 ; N psi ; G 790 +U 969 ; WX 602 ; N omega ; G 791 +U 970 ; WX 602 ; N iotadieresis ; G 792 +U 971 ; WX 602 ; N upsilondieresis ; G 793 +U 972 ; WX 602 ; N omicrontonos ; G 794 +U 973 ; WX 602 ; N upsilontonos ; G 795 +U 974 ; WX 602 ; N omegatonos ; G 796 +U 976 ; WX 602 ; N uni03D0 ; G 797 +U 977 ; WX 602 ; N theta1 ; G 798 +U 978 ; WX 602 ; N Upsilon1 ; G 799 +U 979 ; WX 602 ; N uni03D3 ; G 800 +U 980 ; WX 602 ; N uni03D4 ; G 801 +U 981 ; WX 602 ; N phi1 ; G 802 +U 982 ; WX 602 ; N omega1 ; G 803 +U 983 ; WX 602 ; N uni03D7 ; G 804 +U 984 ; WX 602 ; N uni03D8 ; G 805 +U 985 ; WX 602 ; N uni03D9 ; G 806 +U 986 ; WX 602 ; N uni03DA ; G 807 +U 987 ; WX 602 ; N uni03DB ; G 808 +U 988 ; WX 602 ; N uni03DC ; G 809 +U 989 ; WX 602 ; N uni03DD ; G 810 +U 990 ; WX 602 ; N uni03DE ; G 811 +U 991 ; WX 602 ; N uni03DF ; G 812 +U 992 ; WX 602 ; N uni03E0 ; G 813 +U 993 ; WX 602 ; N uni03E1 ; G 814 +U 1008 ; WX 602 ; N uni03F0 ; G 815 +U 1009 ; WX 602 ; N uni03F1 ; G 816 +U 1010 ; WX 602 ; N uni03F2 ; G 817 +U 1011 ; WX 602 ; N uni03F3 ; G 818 +U 1012 ; WX 602 ; N uni03F4 ; G 819 +U 1013 ; WX 602 ; N uni03F5 ; G 820 +U 1014 ; WX 602 ; N uni03F6 ; G 821 +U 1015 ; WX 602 ; N uni03F7 ; G 822 +U 1016 ; WX 602 ; N uni03F8 ; G 823 +U 1017 ; WX 602 ; N uni03F9 ; G 824 +U 1018 ; WX 602 ; N uni03FA ; G 825 +U 1019 ; WX 602 ; N uni03FB ; G 826 +U 1020 ; WX 602 ; N uni03FC ; G 827 +U 1021 ; WX 602 ; N uni03FD ; G 828 +U 1022 ; WX 602 ; N uni03FE ; G 829 +U 1023 ; WX 602 ; N uni03FF ; G 830 +U 1024 ; WX 602 ; N uni0400 ; G 831 +U 1025 ; WX 602 ; N uni0401 ; G 832 +U 1026 ; WX 602 ; N uni0402 ; G 833 +U 1027 ; WX 602 ; N uni0403 ; G 834 +U 1028 ; WX 602 ; N uni0404 ; G 835 +U 1029 ; WX 602 ; N uni0405 ; G 836 +U 1030 ; WX 602 ; N uni0406 ; G 837 +U 1031 ; WX 602 ; N uni0407 ; G 838 +U 1032 ; WX 602 ; N uni0408 ; G 839 +U 1033 ; WX 602 ; N uni0409 ; G 840 +U 1034 ; WX 602 ; N uni040A ; G 841 +U 1035 ; WX 602 ; N uni040B ; G 842 +U 1036 ; WX 602 ; N uni040C ; G 843 +U 1037 ; WX 602 ; N uni040D ; G 844 +U 1038 ; WX 602 ; N uni040E ; G 845 +U 1039 ; WX 602 ; N uni040F ; G 846 +U 1040 ; WX 602 ; N uni0410 ; G 847 +U 1041 ; WX 602 ; N uni0411 ; G 848 +U 1042 ; WX 602 ; N uni0412 ; G 849 +U 1043 ; WX 602 ; N uni0413 ; G 850 +U 1044 ; WX 602 ; N uni0414 ; G 851 +U 1045 ; WX 602 ; N uni0415 ; G 852 +U 1046 ; WX 602 ; N uni0416 ; G 853 +U 1047 ; WX 602 ; N uni0417 ; G 854 +U 1048 ; WX 602 ; N uni0418 ; G 855 +U 1049 ; WX 602 ; N uni0419 ; G 856 +U 1050 ; WX 602 ; N uni041A ; G 857 +U 1051 ; WX 602 ; N uni041B ; G 858 +U 1052 ; WX 602 ; N uni041C ; G 859 +U 1053 ; WX 602 ; N uni041D ; G 860 +U 1054 ; WX 602 ; N uni041E ; G 861 +U 1055 ; WX 602 ; N uni041F ; G 862 +U 1056 ; WX 602 ; N uni0420 ; G 863 +U 1057 ; WX 602 ; N uni0421 ; G 864 +U 1058 ; WX 602 ; N uni0422 ; G 865 +U 1059 ; WX 602 ; N uni0423 ; G 866 +U 1060 ; WX 602 ; N uni0424 ; G 867 +U 1061 ; WX 602 ; N uni0425 ; G 868 +U 1062 ; WX 602 ; N uni0426 ; G 869 +U 1063 ; WX 602 ; N uni0427 ; G 870 +U 1064 ; WX 602 ; N uni0428 ; G 871 +U 1065 ; WX 602 ; N uni0429 ; G 872 +U 1066 ; WX 602 ; N uni042A ; G 873 +U 1067 ; WX 602 ; N uni042B ; G 874 +U 1068 ; WX 602 ; N uni042C ; G 875 +U 1069 ; WX 602 ; N uni042D ; G 876 +U 1070 ; WX 602 ; N uni042E ; G 877 +U 1071 ; WX 602 ; N uni042F ; G 878 +U 1072 ; WX 602 ; N uni0430 ; G 879 +U 1073 ; WX 602 ; N uni0431 ; G 880 +U 1074 ; WX 602 ; N uni0432 ; G 881 +U 1075 ; WX 602 ; N uni0433 ; G 882 +U 1076 ; WX 602 ; N uni0434 ; G 883 +U 1077 ; WX 602 ; N uni0435 ; G 884 +U 1078 ; WX 602 ; N uni0436 ; G 885 +U 1079 ; WX 602 ; N uni0437 ; G 886 +U 1080 ; WX 602 ; N uni0438 ; G 887 +U 1081 ; WX 602 ; N uni0439 ; G 888 +U 1082 ; WX 602 ; N uni043A ; G 889 +U 1083 ; WX 602 ; N uni043B ; G 890 +U 1084 ; WX 602 ; N uni043C ; G 891 +U 1085 ; WX 602 ; N uni043D ; G 892 +U 1086 ; WX 602 ; N uni043E ; G 893 +U 1087 ; WX 602 ; N uni043F ; G 894 +U 1088 ; WX 602 ; N uni0440 ; G 895 +U 1089 ; WX 602 ; N uni0441 ; G 896 +U 1090 ; WX 602 ; N uni0442 ; G 897 +U 1091 ; WX 602 ; N uni0443 ; G 898 +U 1092 ; WX 602 ; N uni0444 ; G 899 +U 1093 ; WX 602 ; N uni0445 ; G 900 +U 1094 ; WX 602 ; N uni0446 ; G 901 +U 1095 ; WX 602 ; N uni0447 ; G 902 +U 1096 ; WX 602 ; N uni0448 ; G 903 +U 1097 ; WX 602 ; N uni0449 ; G 904 +U 1098 ; WX 602 ; N uni044A ; G 905 +U 1099 ; WX 602 ; N uni044B ; G 906 +U 1100 ; WX 602 ; N uni044C ; G 907 +U 1101 ; WX 602 ; N uni044D ; G 908 +U 1102 ; WX 602 ; N uni044E ; G 909 +U 1103 ; WX 602 ; N uni044F ; G 910 +U 1104 ; WX 602 ; N uni0450 ; G 911 +U 1105 ; WX 602 ; N uni0451 ; G 912 +U 1106 ; WX 602 ; N uni0452 ; G 913 +U 1107 ; WX 602 ; N uni0453 ; G 914 +U 1108 ; WX 602 ; N uni0454 ; G 915 +U 1109 ; WX 602 ; N uni0455 ; G 916 +U 1110 ; WX 602 ; N uni0456 ; G 917 +U 1111 ; WX 602 ; N uni0457 ; G 918 +U 1112 ; WX 602 ; N uni0458 ; G 919 +U 1113 ; WX 602 ; N uni0459 ; G 920 +U 1114 ; WX 602 ; N uni045A ; G 921 +U 1115 ; WX 602 ; N uni045B ; G 922 +U 1116 ; WX 602 ; N uni045C ; G 923 +U 1117 ; WX 602 ; N uni045D ; G 924 +U 1118 ; WX 602 ; N uni045E ; G 925 +U 1119 ; WX 602 ; N uni045F ; G 926 +U 1122 ; WX 602 ; N uni0462 ; G 927 +U 1123 ; WX 602 ; N uni0463 ; G 928 +U 1138 ; WX 602 ; N uni0472 ; G 929 +U 1139 ; WX 602 ; N uni0473 ; G 930 +U 1168 ; WX 602 ; N uni0490 ; G 931 +U 1169 ; WX 602 ; N uni0491 ; G 932 +U 1170 ; WX 602 ; N uni0492 ; G 933 +U 1171 ; WX 602 ; N uni0493 ; G 934 +U 1172 ; WX 602 ; N uni0494 ; G 935 +U 1173 ; WX 602 ; N uni0495 ; G 936 +U 1174 ; WX 602 ; N uni0496 ; G 937 +U 1175 ; WX 602 ; N uni0497 ; G 938 +U 1176 ; WX 602 ; N uni0498 ; G 939 +U 1177 ; WX 602 ; N uni0499 ; G 940 +U 1178 ; WX 602 ; N uni049A ; G 941 +U 1179 ; WX 602 ; N uni049B ; G 942 +U 1186 ; WX 602 ; N uni04A2 ; G 943 +U 1187 ; WX 602 ; N uni04A3 ; G 944 +U 1188 ; WX 602 ; N uni04A4 ; G 945 +U 1189 ; WX 602 ; N uni04A5 ; G 946 +U 1194 ; WX 602 ; N uni04AA ; G 947 +U 1195 ; WX 602 ; N uni04AB ; G 948 +U 1196 ; WX 602 ; N uni04AC ; G 949 +U 1197 ; WX 602 ; N uni04AD ; G 950 +U 1198 ; WX 602 ; N uni04AE ; G 951 +U 1199 ; WX 602 ; N uni04AF ; G 952 +U 1200 ; WX 602 ; N uni04B0 ; G 953 +U 1201 ; WX 602 ; N uni04B1 ; G 954 +U 1202 ; WX 602 ; N uni04B2 ; G 955 +U 1203 ; WX 602 ; N uni04B3 ; G 956 +U 1210 ; WX 602 ; N uni04BA ; G 957 +U 1211 ; WX 602 ; N uni04BB ; G 958 +U 1216 ; WX 602 ; N uni04C0 ; G 959 +U 1217 ; WX 602 ; N uni04C1 ; G 960 +U 1218 ; WX 602 ; N uni04C2 ; G 961 +U 1219 ; WX 602 ; N uni04C3 ; G 962 +U 1220 ; WX 602 ; N uni04C4 ; G 963 +U 1223 ; WX 602 ; N uni04C7 ; G 964 +U 1224 ; WX 602 ; N uni04C8 ; G 965 +U 1227 ; WX 602 ; N uni04CB ; G 966 +U 1228 ; WX 602 ; N uni04CC ; G 967 +U 1231 ; WX 602 ; N uni04CF ; G 968 +U 1232 ; WX 602 ; N uni04D0 ; G 969 +U 1233 ; WX 602 ; N uni04D1 ; G 970 +U 1234 ; WX 602 ; N uni04D2 ; G 971 +U 1235 ; WX 602 ; N uni04D3 ; G 972 +U 1236 ; WX 602 ; N uni04D4 ; G 973 +U 1237 ; WX 602 ; N uni04D5 ; G 974 +U 1238 ; WX 602 ; N uni04D6 ; G 975 +U 1239 ; WX 602 ; N uni04D7 ; G 976 +U 1240 ; WX 602 ; N uni04D8 ; G 977 +U 1241 ; WX 602 ; N uni04D9 ; G 978 +U 1242 ; WX 602 ; N uni04DA ; G 979 +U 1243 ; WX 602 ; N uni04DB ; G 980 +U 1244 ; WX 602 ; N uni04DC ; G 981 +U 1245 ; WX 602 ; N uni04DD ; G 982 +U 1246 ; WX 602 ; N uni04DE ; G 983 +U 1247 ; WX 602 ; N uni04DF ; G 984 +U 1248 ; WX 602 ; N uni04E0 ; G 985 +U 1249 ; WX 602 ; N uni04E1 ; G 986 +U 1250 ; WX 602 ; N uni04E2 ; G 987 +U 1251 ; WX 602 ; N uni04E3 ; G 988 +U 1252 ; WX 602 ; N uni04E4 ; G 989 +U 1253 ; WX 602 ; N uni04E5 ; G 990 +U 1254 ; WX 602 ; N uni04E6 ; G 991 +U 1255 ; WX 602 ; N uni04E7 ; G 992 +U 1256 ; WX 602 ; N uni04E8 ; G 993 +U 1257 ; WX 602 ; N uni04E9 ; G 994 +U 1258 ; WX 602 ; N uni04EA ; G 995 +U 1259 ; WX 602 ; N uni04EB ; G 996 +U 1260 ; WX 602 ; N uni04EC ; G 997 +U 1261 ; WX 602 ; N uni04ED ; G 998 +U 1262 ; WX 602 ; N uni04EE ; G 999 +U 1263 ; WX 602 ; N uni04EF ; G 1000 +U 1264 ; WX 602 ; N uni04F0 ; G 1001 +U 1265 ; WX 602 ; N uni04F1 ; G 1002 +U 1266 ; WX 602 ; N uni04F2 ; G 1003 +U 1267 ; WX 602 ; N uni04F3 ; G 1004 +U 1268 ; WX 602 ; N uni04F4 ; G 1005 +U 1269 ; WX 602 ; N uni04F5 ; G 1006 +U 1270 ; WX 602 ; N uni04F6 ; G 1007 +U 1271 ; WX 602 ; N uni04F7 ; G 1008 +U 1272 ; WX 602 ; N uni04F8 ; G 1009 +U 1273 ; WX 602 ; N uni04F9 ; G 1010 +U 1296 ; WX 602 ; N uni0510 ; G 1011 +U 1297 ; WX 602 ; N uni0511 ; G 1012 +U 1306 ; WX 602 ; N uni051A ; G 1013 +U 1307 ; WX 602 ; N uni051B ; G 1014 +U 1308 ; WX 602 ; N uni051C ; G 1015 +U 1309 ; WX 602 ; N uni051D ; G 1016 +U 1329 ; WX 602 ; N uni0531 ; G 1017 +U 1330 ; WX 602 ; N uni0532 ; G 1018 +U 1331 ; WX 602 ; N uni0533 ; G 1019 +U 1332 ; WX 602 ; N uni0534 ; G 1020 +U 1333 ; WX 602 ; N uni0535 ; G 1021 +U 1334 ; WX 602 ; N uni0536 ; G 1022 +U 1335 ; WX 602 ; N uni0537 ; G 1023 +U 1336 ; WX 602 ; N uni0538 ; G 1024 +U 1337 ; WX 602 ; N uni0539 ; G 1025 +U 1338 ; WX 602 ; N uni053A ; G 1026 +U 1339 ; WX 602 ; N uni053B ; G 1027 +U 1340 ; WX 602 ; N uni053C ; G 1028 +U 1341 ; WX 602 ; N uni053D ; G 1029 +U 1342 ; WX 602 ; N uni053E ; G 1030 +U 1343 ; WX 602 ; N uni053F ; G 1031 +U 1344 ; WX 602 ; N uni0540 ; G 1032 +U 1345 ; WX 602 ; N uni0541 ; G 1033 +U 1346 ; WX 602 ; N uni0542 ; G 1034 +U 1347 ; WX 602 ; N uni0543 ; G 1035 +U 1348 ; WX 602 ; N uni0544 ; G 1036 +U 1349 ; WX 602 ; N uni0545 ; G 1037 +U 1350 ; WX 602 ; N uni0546 ; G 1038 +U 1351 ; WX 602 ; N uni0547 ; G 1039 +U 1352 ; WX 602 ; N uni0548 ; G 1040 +U 1353 ; WX 602 ; N uni0549 ; G 1041 +U 1354 ; WX 602 ; N uni054A ; G 1042 +U 1355 ; WX 602 ; N uni054B ; G 1043 +U 1356 ; WX 602 ; N uni054C ; G 1044 +U 1357 ; WX 602 ; N uni054D ; G 1045 +U 1358 ; WX 602 ; N uni054E ; G 1046 +U 1359 ; WX 602 ; N uni054F ; G 1047 +U 1360 ; WX 602 ; N uni0550 ; G 1048 +U 1361 ; WX 602 ; N uni0551 ; G 1049 +U 1362 ; WX 602 ; N uni0552 ; G 1050 +U 1363 ; WX 602 ; N uni0553 ; G 1051 +U 1364 ; WX 602 ; N uni0554 ; G 1052 +U 1365 ; WX 602 ; N uni0555 ; G 1053 +U 1366 ; WX 602 ; N uni0556 ; G 1054 +U 1369 ; WX 602 ; N uni0559 ; G 1055 +U 1370 ; WX 602 ; N uni055A ; G 1056 +U 1371 ; WX 602 ; N uni055B ; G 1057 +U 1372 ; WX 602 ; N uni055C ; G 1058 +U 1373 ; WX 602 ; N uni055D ; G 1059 +U 1374 ; WX 602 ; N uni055E ; G 1060 +U 1375 ; WX 602 ; N uni055F ; G 1061 +U 1377 ; WX 602 ; N uni0561 ; G 1062 +U 1378 ; WX 602 ; N uni0562 ; G 1063 +U 1379 ; WX 602 ; N uni0563 ; G 1064 +U 1380 ; WX 602 ; N uni0564 ; G 1065 +U 1381 ; WX 602 ; N uni0565 ; G 1066 +U 1382 ; WX 602 ; N uni0566 ; G 1067 +U 1383 ; WX 602 ; N uni0567 ; G 1068 +U 1384 ; WX 602 ; N uni0568 ; G 1069 +U 1385 ; WX 602 ; N uni0569 ; G 1070 +U 1386 ; WX 602 ; N uni056A ; G 1071 +U 1387 ; WX 602 ; N uni056B ; G 1072 +U 1388 ; WX 602 ; N uni056C ; G 1073 +U 1389 ; WX 602 ; N uni056D ; G 1074 +U 1390 ; WX 602 ; N uni056E ; G 1075 +U 1391 ; WX 602 ; N uni056F ; G 1076 +U 1392 ; WX 602 ; N uni0570 ; G 1077 +U 1393 ; WX 602 ; N uni0571 ; G 1078 +U 1394 ; WX 602 ; N uni0572 ; G 1079 +U 1395 ; WX 602 ; N uni0573 ; G 1080 +U 1396 ; WX 602 ; N uni0574 ; G 1081 +U 1397 ; WX 602 ; N uni0575 ; G 1082 +U 1398 ; WX 602 ; N uni0576 ; G 1083 +U 1399 ; WX 602 ; N uni0577 ; G 1084 +U 1400 ; WX 602 ; N uni0578 ; G 1085 +U 1401 ; WX 602 ; N uni0579 ; G 1086 +U 1402 ; WX 602 ; N uni057A ; G 1087 +U 1403 ; WX 602 ; N uni057B ; G 1088 +U 1404 ; WX 602 ; N uni057C ; G 1089 +U 1405 ; WX 602 ; N uni057D ; G 1090 +U 1406 ; WX 602 ; N uni057E ; G 1091 +U 1407 ; WX 602 ; N uni057F ; G 1092 +U 1408 ; WX 602 ; N uni0580 ; G 1093 +U 1409 ; WX 602 ; N uni0581 ; G 1094 +U 1410 ; WX 602 ; N uni0582 ; G 1095 +U 1411 ; WX 602 ; N uni0583 ; G 1096 +U 1412 ; WX 602 ; N uni0584 ; G 1097 +U 1413 ; WX 602 ; N uni0585 ; G 1098 +U 1414 ; WX 602 ; N uni0586 ; G 1099 +U 1415 ; WX 602 ; N uni0587 ; G 1100 +U 1417 ; WX 602 ; N uni0589 ; G 1101 +U 1418 ; WX 602 ; N uni058A ; G 1102 +U 1542 ; WX 602 ; N uni0606 ; G 1103 +U 1543 ; WX 602 ; N uni0607 ; G 1104 +U 1545 ; WX 602 ; N uni0609 ; G 1105 +U 1546 ; WX 602 ; N uni060A ; G 1106 +U 1548 ; WX 602 ; N uni060C ; G 1107 +U 1557 ; WX 602 ; N uni0615 ; G 1108 +U 1563 ; WX 602 ; N uni061B ; G 1109 +U 1567 ; WX 602 ; N uni061F ; G 1110 +U 1569 ; WX 602 ; N uni0621 ; G 1111 +U 1570 ; WX 602 ; N uni0622 ; G 1112 +U 1571 ; WX 602 ; N uni0623 ; G 1113 +U 1572 ; WX 602 ; N uni0624 ; G 1114 +U 1573 ; WX 602 ; N uni0625 ; G 1115 +U 1574 ; WX 602 ; N uni0626 ; G 1116 +U 1575 ; WX 602 ; N uni0627 ; G 1117 +U 1576 ; WX 602 ; N uni0628 ; G 1118 +U 1577 ; WX 602 ; N uni0629 ; G 1119 +U 1578 ; WX 602 ; N uni062A ; G 1120 +U 1579 ; WX 602 ; N uni062B ; G 1121 +U 1580 ; WX 602 ; N uni062C ; G 1122 +U 1581 ; WX 602 ; N uni062D ; G 1123 +U 1582 ; WX 602 ; N uni062E ; G 1124 +U 1583 ; WX 602 ; N uni062F ; G 1125 +U 1584 ; WX 602 ; N uni0630 ; G 1126 +U 1585 ; WX 602 ; N uni0631 ; G 1127 +U 1586 ; WX 602 ; N uni0632 ; G 1128 +U 1587 ; WX 602 ; N uni0633 ; G 1129 +U 1588 ; WX 602 ; N uni0634 ; G 1130 +U 1589 ; WX 602 ; N uni0635 ; G 1131 +U 1590 ; WX 602 ; N uni0636 ; G 1132 +U 1591 ; WX 602 ; N uni0637 ; G 1133 +U 1592 ; WX 602 ; N uni0638 ; G 1134 +U 1593 ; WX 602 ; N uni0639 ; G 1135 +U 1594 ; WX 602 ; N uni063A ; G 1136 +U 1600 ; WX 602 ; N uni0640 ; G 1137 +U 1601 ; WX 602 ; N uni0641 ; G 1138 +U 1602 ; WX 602 ; N uni0642 ; G 1139 +U 1603 ; WX 602 ; N uni0643 ; G 1140 +U 1604 ; WX 602 ; N uni0644 ; G 1141 +U 1605 ; WX 602 ; N uni0645 ; G 1142 +U 1606 ; WX 602 ; N uni0646 ; G 1143 +U 1607 ; WX 602 ; N uni0647 ; G 1144 +U 1608 ; WX 602 ; N uni0648 ; G 1145 +U 1609 ; WX 602 ; N uni0649 ; G 1146 +U 1610 ; WX 602 ; N uni064A ; G 1147 +U 1611 ; WX 602 ; N uni064B ; G 1148 +U 1612 ; WX 602 ; N uni064C ; G 1149 +U 1613 ; WX 602 ; N uni064D ; G 1150 +U 1614 ; WX 602 ; N uni064E ; G 1151 +U 1615 ; WX 602 ; N uni064F ; G 1152 +U 1616 ; WX 602 ; N uni0650 ; G 1153 +U 1617 ; WX 602 ; N uni0651 ; G 1154 +U 1618 ; WX 602 ; N uni0652 ; G 1155 +U 1619 ; WX 602 ; N uni0653 ; G 1156 +U 1620 ; WX 602 ; N uni0654 ; G 1157 +U 1621 ; WX 602 ; N uni0655 ; G 1158 +U 1626 ; WX 602 ; N uni065A ; G 1159 +U 1632 ; WX 602 ; N uni0660 ; G 1160 +U 1633 ; WX 602 ; N uni0661 ; G 1161 +U 1634 ; WX 602 ; N uni0662 ; G 1162 +U 1635 ; WX 602 ; N uni0663 ; G 1163 +U 1636 ; WX 602 ; N uni0664 ; G 1164 +U 1637 ; WX 602 ; N uni0665 ; G 1165 +U 1638 ; WX 602 ; N uni0666 ; G 1166 +U 1639 ; WX 602 ; N uni0667 ; G 1167 +U 1640 ; WX 602 ; N uni0668 ; G 1168 +U 1641 ; WX 602 ; N uni0669 ; G 1169 +U 1642 ; WX 602 ; N uni066A ; G 1170 +U 1643 ; WX 602 ; N uni066B ; G 1171 +U 1644 ; WX 602 ; N uni066C ; G 1172 +U 1645 ; WX 602 ; N uni066D ; G 1173 +U 1652 ; WX 602 ; N uni0674 ; G 1174 +U 1657 ; WX 602 ; N uni0679 ; G 1175 +U 1658 ; WX 602 ; N uni067A ; G 1176 +U 1659 ; WX 602 ; N uni067B ; G 1177 +U 1662 ; WX 602 ; N uni067E ; G 1178 +U 1663 ; WX 602 ; N uni067F ; G 1179 +U 1664 ; WX 602 ; N uni0680 ; G 1180 +U 1667 ; WX 602 ; N uni0683 ; G 1181 +U 1668 ; WX 602 ; N uni0684 ; G 1182 +U 1670 ; WX 602 ; N uni0686 ; G 1183 +U 1671 ; WX 602 ; N uni0687 ; G 1184 +U 1681 ; WX 602 ; N uni0691 ; G 1185 +U 1688 ; WX 602 ; N uni0698 ; G 1186 +U 1700 ; WX 602 ; N uni06A4 ; G 1187 +U 1705 ; WX 602 ; N uni06A9 ; G 1188 +U 1711 ; WX 602 ; N uni06AF ; G 1189 +U 1726 ; WX 602 ; N uni06BE ; G 1190 +U 1740 ; WX 602 ; N uni06CC ; G 1191 +U 1776 ; WX 602 ; N uni06F0 ; G 1192 +U 1777 ; WX 602 ; N uni06F1 ; G 1193 +U 1778 ; WX 602 ; N uni06F2 ; G 1194 +U 1779 ; WX 602 ; N uni06F3 ; G 1195 +U 1780 ; WX 602 ; N uni06F4 ; G 1196 +U 1781 ; WX 602 ; N uni06F5 ; G 1197 +U 1782 ; WX 602 ; N uni06F6 ; G 1198 +U 1783 ; WX 602 ; N uni06F7 ; G 1199 +U 1784 ; WX 602 ; N uni06F8 ; G 1200 +U 1785 ; WX 602 ; N uni06F9 ; G 1201 +U 3647 ; WX 602 ; N uni0E3F ; G 1202 +U 3713 ; WX 602 ; N uni0E81 ; G 1203 +U 3714 ; WX 602 ; N uni0E82 ; G 1204 +U 3716 ; WX 602 ; N uni0E84 ; G 1205 +U 3719 ; WX 602 ; N uni0E87 ; G 1206 +U 3720 ; WX 602 ; N uni0E88 ; G 1207 +U 3722 ; WX 602 ; N uni0E8A ; G 1208 +U 3725 ; WX 602 ; N uni0E8D ; G 1209 +U 3732 ; WX 602 ; N uni0E94 ; G 1210 +U 3733 ; WX 602 ; N uni0E95 ; G 1211 +U 3734 ; WX 602 ; N uni0E96 ; G 1212 +U 3735 ; WX 602 ; N uni0E97 ; G 1213 +U 3737 ; WX 602 ; N uni0E99 ; G 1214 +U 3738 ; WX 602 ; N uni0E9A ; G 1215 +U 3739 ; WX 602 ; N uni0E9B ; G 1216 +U 3740 ; WX 602 ; N uni0E9C ; G 1217 +U 3741 ; WX 602 ; N uni0E9D ; G 1218 +U 3742 ; WX 602 ; N uni0E9E ; G 1219 +U 3743 ; WX 602 ; N uni0E9F ; G 1220 +U 3745 ; WX 602 ; N uni0EA1 ; G 1221 +U 3746 ; WX 602 ; N uni0EA2 ; G 1222 +U 3747 ; WX 602 ; N uni0EA3 ; G 1223 +U 3749 ; WX 602 ; N uni0EA5 ; G 1224 +U 3751 ; WX 602 ; N uni0EA7 ; G 1225 +U 3754 ; WX 602 ; N uni0EAA ; G 1226 +U 3755 ; WX 602 ; N uni0EAB ; G 1227 +U 3757 ; WX 602 ; N uni0EAD ; G 1228 +U 3758 ; WX 602 ; N uni0EAE ; G 1229 +U 3759 ; WX 602 ; N uni0EAF ; G 1230 +U 3760 ; WX 602 ; N uni0EB0 ; G 1231 +U 3761 ; WX 602 ; N uni0EB1 ; G 1232 +U 3762 ; WX 602 ; N uni0EB2 ; G 1233 +U 3763 ; WX 602 ; N uni0EB3 ; G 1234 +U 3764 ; WX 602 ; N uni0EB4 ; G 1235 +U 3765 ; WX 602 ; N uni0EB5 ; G 1236 +U 3766 ; WX 602 ; N uni0EB6 ; G 1237 +U 3767 ; WX 602 ; N uni0EB7 ; G 1238 +U 3768 ; WX 602 ; N uni0EB8 ; G 1239 +U 3769 ; WX 602 ; N uni0EB9 ; G 1240 +U 3771 ; WX 602 ; N uni0EBB ; G 1241 +U 3772 ; WX 602 ; N uni0EBC ; G 1242 +U 3784 ; WX 602 ; N uni0EC8 ; G 1243 +U 3785 ; WX 602 ; N uni0EC9 ; G 1244 +U 3786 ; WX 602 ; N uni0ECA ; G 1245 +U 3787 ; WX 602 ; N uni0ECB ; G 1246 +U 3788 ; WX 602 ; N uni0ECC ; G 1247 +U 3789 ; WX 602 ; N uni0ECD ; G 1248 +U 4304 ; WX 602 ; N uni10D0 ; G 1249 +U 4305 ; WX 602 ; N uni10D1 ; G 1250 +U 4306 ; WX 602 ; N uni10D2 ; G 1251 +U 4307 ; WX 602 ; N uni10D3 ; G 1252 +U 4308 ; WX 602 ; N uni10D4 ; G 1253 +U 4309 ; WX 602 ; N uni10D5 ; G 1254 +U 4310 ; WX 602 ; N uni10D6 ; G 1255 +U 4311 ; WX 602 ; N uni10D7 ; G 1256 +U 4312 ; WX 602 ; N uni10D8 ; G 1257 +U 4313 ; WX 602 ; N uni10D9 ; G 1258 +U 4314 ; WX 602 ; N uni10DA ; G 1259 +U 4315 ; WX 602 ; N uni10DB ; G 1260 +U 4316 ; WX 602 ; N uni10DC ; G 1261 +U 4317 ; WX 602 ; N uni10DD ; G 1262 +U 4318 ; WX 602 ; N uni10DE ; G 1263 +U 4319 ; WX 602 ; N uni10DF ; G 1264 +U 4320 ; WX 602 ; N uni10E0 ; G 1265 +U 4321 ; WX 602 ; N uni10E1 ; G 1266 +U 4322 ; WX 602 ; N uni10E2 ; G 1267 +U 4323 ; WX 602 ; N uni10E3 ; G 1268 +U 4324 ; WX 602 ; N uni10E4 ; G 1269 +U 4325 ; WX 602 ; N uni10E5 ; G 1270 +U 4326 ; WX 602 ; N uni10E6 ; G 1271 +U 4327 ; WX 602 ; N uni10E7 ; G 1272 +U 4328 ; WX 602 ; N uni10E8 ; G 1273 +U 4329 ; WX 602 ; N uni10E9 ; G 1274 +U 4330 ; WX 602 ; N uni10EA ; G 1275 +U 4331 ; WX 602 ; N uni10EB ; G 1276 +U 4332 ; WX 602 ; N uni10EC ; G 1277 +U 4333 ; WX 602 ; N uni10ED ; G 1278 +U 4334 ; WX 602 ; N uni10EE ; G 1279 +U 4335 ; WX 602 ; N uni10EF ; G 1280 +U 4336 ; WX 602 ; N uni10F0 ; G 1281 +U 4337 ; WX 602 ; N uni10F1 ; G 1282 +U 4338 ; WX 602 ; N uni10F2 ; G 1283 +U 4339 ; WX 602 ; N uni10F3 ; G 1284 +U 4340 ; WX 602 ; N uni10F4 ; G 1285 +U 4341 ; WX 602 ; N uni10F5 ; G 1286 +U 4342 ; WX 602 ; N uni10F6 ; G 1287 +U 4343 ; WX 602 ; N uni10F7 ; G 1288 +U 4344 ; WX 602 ; N uni10F8 ; G 1289 +U 4345 ; WX 602 ; N uni10F9 ; G 1290 +U 4346 ; WX 602 ; N uni10FA ; G 1291 +U 4347 ; WX 602 ; N uni10FB ; G 1292 +U 4348 ; WX 602 ; N uni10FC ; G 1293 +U 7426 ; WX 602 ; N uni1D02 ; G 1294 +U 7432 ; WX 602 ; N uni1D08 ; G 1295 +U 7433 ; WX 602 ; N uni1D09 ; G 1296 +U 7444 ; WX 602 ; N uni1D14 ; G 1297 +U 7446 ; WX 602 ; N uni1D16 ; G 1298 +U 7447 ; WX 602 ; N uni1D17 ; G 1299 +U 7453 ; WX 602 ; N uni1D1D ; G 1300 +U 7454 ; WX 602 ; N uni1D1E ; G 1301 +U 7455 ; WX 602 ; N uni1D1F ; G 1302 +U 7468 ; WX 602 ; N uni1D2C ; G 1303 +U 7469 ; WX 602 ; N uni1D2D ; G 1304 +U 7470 ; WX 602 ; N uni1D2E ; G 1305 +U 7472 ; WX 602 ; N uni1D30 ; G 1306 +U 7473 ; WX 602 ; N uni1D31 ; G 1307 +U 7474 ; WX 602 ; N uni1D32 ; G 1308 +U 7475 ; WX 602 ; N uni1D33 ; G 1309 +U 7476 ; WX 602 ; N uni1D34 ; G 1310 +U 7477 ; WX 602 ; N uni1D35 ; G 1311 +U 7478 ; WX 602 ; N uni1D36 ; G 1312 +U 7479 ; WX 602 ; N uni1D37 ; G 1313 +U 7480 ; WX 602 ; N uni1D38 ; G 1314 +U 7481 ; WX 602 ; N uni1D39 ; G 1315 +U 7482 ; WX 602 ; N uni1D3A ; G 1316 +U 7483 ; WX 602 ; N uni1D3B ; G 1317 +U 7484 ; WX 602 ; N uni1D3C ; G 1318 +U 7486 ; WX 602 ; N uni1D3E ; G 1319 +U 7487 ; WX 602 ; N uni1D3F ; G 1320 +U 7488 ; WX 602 ; N uni1D40 ; G 1321 +U 7489 ; WX 602 ; N uni1D41 ; G 1322 +U 7490 ; WX 602 ; N uni1D42 ; G 1323 +U 7491 ; WX 602 ; N uni1D43 ; G 1324 +U 7492 ; WX 602 ; N uni1D44 ; G 1325 +U 7493 ; WX 602 ; N uni1D45 ; G 1326 +U 7494 ; WX 602 ; N uni1D46 ; G 1327 +U 7495 ; WX 602 ; N uni1D47 ; G 1328 +U 7496 ; WX 602 ; N uni1D48 ; G 1329 +U 7497 ; WX 602 ; N uni1D49 ; G 1330 +U 7498 ; WX 602 ; N uni1D4A ; G 1331 +U 7499 ; WX 602 ; N uni1D4B ; G 1332 +U 7500 ; WX 602 ; N uni1D4C ; G 1333 +U 7501 ; WX 602 ; N uni1D4D ; G 1334 +U 7502 ; WX 602 ; N uni1D4E ; G 1335 +U 7503 ; WX 602 ; N uni1D4F ; G 1336 +U 7504 ; WX 602 ; N uni1D50 ; G 1337 +U 7505 ; WX 602 ; N uni1D51 ; G 1338 +U 7506 ; WX 602 ; N uni1D52 ; G 1339 +U 7507 ; WX 602 ; N uni1D53 ; G 1340 +U 7508 ; WX 602 ; N uni1D54 ; G 1341 +U 7509 ; WX 602 ; N uni1D55 ; G 1342 +U 7510 ; WX 602 ; N uni1D56 ; G 1343 +U 7511 ; WX 602 ; N uni1D57 ; G 1344 +U 7512 ; WX 602 ; N uni1D58 ; G 1345 +U 7513 ; WX 602 ; N uni1D59 ; G 1346 +U 7514 ; WX 602 ; N uni1D5A ; G 1347 +U 7515 ; WX 602 ; N uni1D5B ; G 1348 +U 7522 ; WX 602 ; N uni1D62 ; G 1349 +U 7523 ; WX 602 ; N uni1D63 ; G 1350 +U 7524 ; WX 602 ; N uni1D64 ; G 1351 +U 7525 ; WX 602 ; N uni1D65 ; G 1352 +U 7543 ; WX 602 ; N uni1D77 ; G 1353 +U 7544 ; WX 602 ; N uni1D78 ; G 1354 +U 7547 ; WX 602 ; N uni1D7B ; G 1355 +U 7557 ; WX 602 ; N uni1D85 ; G 1356 +U 7579 ; WX 602 ; N uni1D9B ; G 1357 +U 7580 ; WX 602 ; N uni1D9C ; G 1358 +U 7581 ; WX 602 ; N uni1D9D ; G 1359 +U 7582 ; WX 602 ; N uni1D9E ; G 1360 +U 7583 ; WX 602 ; N uni1D9F ; G 1361 +U 7584 ; WX 602 ; N uni1DA0 ; G 1362 +U 7585 ; WX 602 ; N uni1DA1 ; G 1363 +U 7586 ; WX 602 ; N uni1DA2 ; G 1364 +U 7587 ; WX 602 ; N uni1DA3 ; G 1365 +U 7588 ; WX 602 ; N uni1DA4 ; G 1366 +U 7589 ; WX 602 ; N uni1DA5 ; G 1367 +U 7590 ; WX 602 ; N uni1DA6 ; G 1368 +U 7591 ; WX 602 ; N uni1DA7 ; G 1369 +U 7592 ; WX 602 ; N uni1DA8 ; G 1370 +U 7593 ; WX 602 ; N uni1DA9 ; G 1371 +U 7594 ; WX 602 ; N uni1DAA ; G 1372 +U 7595 ; WX 602 ; N uni1DAB ; G 1373 +U 7596 ; WX 602 ; N uni1DAC ; G 1374 +U 7597 ; WX 602 ; N uni1DAD ; G 1375 +U 7598 ; WX 602 ; N uni1DAE ; G 1376 +U 7599 ; WX 602 ; N uni1DAF ; G 1377 +U 7600 ; WX 602 ; N uni1DB0 ; G 1378 +U 7601 ; WX 602 ; N uni1DB1 ; G 1379 +U 7602 ; WX 602 ; N uni1DB2 ; G 1380 +U 7603 ; WX 602 ; N uni1DB3 ; G 1381 +U 7604 ; WX 602 ; N uni1DB4 ; G 1382 +U 7605 ; WX 602 ; N uni1DB5 ; G 1383 +U 7606 ; WX 602 ; N uni1DB6 ; G 1384 +U 7607 ; WX 602 ; N uni1DB7 ; G 1385 +U 7609 ; WX 602 ; N uni1DB9 ; G 1386 +U 7610 ; WX 602 ; N uni1DBA ; G 1387 +U 7611 ; WX 602 ; N uni1DBB ; G 1388 +U 7612 ; WX 602 ; N uni1DBC ; G 1389 +U 7613 ; WX 602 ; N uni1DBD ; G 1390 +U 7614 ; WX 602 ; N uni1DBE ; G 1391 +U 7615 ; WX 602 ; N uni1DBF ; G 1392 +U 7680 ; WX 602 ; N uni1E00 ; G 1393 +U 7681 ; WX 602 ; N uni1E01 ; G 1394 +U 7682 ; WX 602 ; N uni1E02 ; G 1395 +U 7683 ; WX 602 ; N uni1E03 ; G 1396 +U 7684 ; WX 602 ; N uni1E04 ; G 1397 +U 7685 ; WX 602 ; N uni1E05 ; G 1398 +U 7686 ; WX 602 ; N uni1E06 ; G 1399 +U 7687 ; WX 602 ; N uni1E07 ; G 1400 +U 7688 ; WX 602 ; N uni1E08 ; G 1401 +U 7689 ; WX 602 ; N uni1E09 ; G 1402 +U 7690 ; WX 602 ; N uni1E0A ; G 1403 +U 7691 ; WX 602 ; N uni1E0B ; G 1404 +U 7692 ; WX 602 ; N uni1E0C ; G 1405 +U 7693 ; WX 602 ; N uni1E0D ; G 1406 +U 7694 ; WX 602 ; N uni1E0E ; G 1407 +U 7695 ; WX 602 ; N uni1E0F ; G 1408 +U 7696 ; WX 602 ; N uni1E10 ; G 1409 +U 7697 ; WX 602 ; N uni1E11 ; G 1410 +U 7698 ; WX 602 ; N uni1E12 ; G 1411 +U 7699 ; WX 602 ; N uni1E13 ; G 1412 +U 7704 ; WX 602 ; N uni1E18 ; G 1413 +U 7705 ; WX 602 ; N uni1E19 ; G 1414 +U 7706 ; WX 602 ; N uni1E1A ; G 1415 +U 7707 ; WX 602 ; N uni1E1B ; G 1416 +U 7708 ; WX 602 ; N uni1E1C ; G 1417 +U 7709 ; WX 602 ; N uni1E1D ; G 1418 +U 7710 ; WX 602 ; N uni1E1E ; G 1419 +U 7711 ; WX 602 ; N uni1E1F ; G 1420 +U 7712 ; WX 602 ; N uni1E20 ; G 1421 +U 7713 ; WX 602 ; N uni1E21 ; G 1422 +U 7714 ; WX 602 ; N uni1E22 ; G 1423 +U 7715 ; WX 602 ; N uni1E23 ; G 1424 +U 7716 ; WX 602 ; N uni1E24 ; G 1425 +U 7717 ; WX 602 ; N uni1E25 ; G 1426 +U 7718 ; WX 602 ; N uni1E26 ; G 1427 +U 7719 ; WX 602 ; N uni1E27 ; G 1428 +U 7720 ; WX 602 ; N uni1E28 ; G 1429 +U 7721 ; WX 602 ; N uni1E29 ; G 1430 +U 7722 ; WX 602 ; N uni1E2A ; G 1431 +U 7723 ; WX 602 ; N uni1E2B ; G 1432 +U 7724 ; WX 602 ; N uni1E2C ; G 1433 +U 7725 ; WX 602 ; N uni1E2D ; G 1434 +U 7728 ; WX 602 ; N uni1E30 ; G 1435 +U 7729 ; WX 602 ; N uni1E31 ; G 1436 +U 7730 ; WX 602 ; N uni1E32 ; G 1437 +U 7731 ; WX 602 ; N uni1E33 ; G 1438 +U 7732 ; WX 602 ; N uni1E34 ; G 1439 +U 7733 ; WX 602 ; N uni1E35 ; G 1440 +U 7734 ; WX 602 ; N uni1E36 ; G 1441 +U 7735 ; WX 602 ; N uni1E37 ; G 1442 +U 7736 ; WX 602 ; N uni1E38 ; G 1443 +U 7737 ; WX 602 ; N uni1E39 ; G 1444 +U 7738 ; WX 602 ; N uni1E3A ; G 1445 +U 7739 ; WX 602 ; N uni1E3B ; G 1446 +U 7740 ; WX 602 ; N uni1E3C ; G 1447 +U 7741 ; WX 602 ; N uni1E3D ; G 1448 +U 7742 ; WX 602 ; N uni1E3E ; G 1449 +U 7743 ; WX 602 ; N uni1E3F ; G 1450 +U 7744 ; WX 602 ; N uni1E40 ; G 1451 +U 7745 ; WX 602 ; N uni1E41 ; G 1452 +U 7746 ; WX 602 ; N uni1E42 ; G 1453 +U 7747 ; WX 602 ; N uni1E43 ; G 1454 +U 7748 ; WX 602 ; N uni1E44 ; G 1455 +U 7749 ; WX 602 ; N uni1E45 ; G 1456 +U 7750 ; WX 602 ; N uni1E46 ; G 1457 +U 7751 ; WX 602 ; N uni1E47 ; G 1458 +U 7752 ; WX 602 ; N uni1E48 ; G 1459 +U 7753 ; WX 602 ; N uni1E49 ; G 1460 +U 7754 ; WX 602 ; N uni1E4A ; G 1461 +U 7755 ; WX 602 ; N uni1E4B ; G 1462 +U 7756 ; WX 602 ; N uni1E4C ; G 1463 +U 7757 ; WX 602 ; N uni1E4D ; G 1464 +U 7764 ; WX 602 ; N uni1E54 ; G 1465 +U 7765 ; WX 602 ; N uni1E55 ; G 1466 +U 7766 ; WX 602 ; N uni1E56 ; G 1467 +U 7767 ; WX 602 ; N uni1E57 ; G 1468 +U 7768 ; WX 602 ; N uni1E58 ; G 1469 +U 7769 ; WX 602 ; N uni1E59 ; G 1470 +U 7770 ; WX 602 ; N uni1E5A ; G 1471 +U 7771 ; WX 602 ; N uni1E5B ; G 1472 +U 7772 ; WX 602 ; N uni1E5C ; G 1473 +U 7773 ; WX 602 ; N uni1E5D ; G 1474 +U 7774 ; WX 602 ; N uni1E5E ; G 1475 +U 7775 ; WX 602 ; N uni1E5F ; G 1476 +U 7776 ; WX 602 ; N uni1E60 ; G 1477 +U 7777 ; WX 602 ; N uni1E61 ; G 1478 +U 7778 ; WX 602 ; N uni1E62 ; G 1479 +U 7779 ; WX 602 ; N uni1E63 ; G 1480 +U 7784 ; WX 602 ; N uni1E68 ; G 1481 +U 7785 ; WX 602 ; N uni1E69 ; G 1482 +U 7786 ; WX 602 ; N uni1E6A ; G 1483 +U 7787 ; WX 602 ; N uni1E6B ; G 1484 +U 7788 ; WX 602 ; N uni1E6C ; G 1485 +U 7789 ; WX 602 ; N uni1E6D ; G 1486 +U 7790 ; WX 602 ; N uni1E6E ; G 1487 +U 7791 ; WX 602 ; N uni1E6F ; G 1488 +U 7792 ; WX 602 ; N uni1E70 ; G 1489 +U 7793 ; WX 602 ; N uni1E71 ; G 1490 +U 7794 ; WX 602 ; N uni1E72 ; G 1491 +U 7795 ; WX 602 ; N uni1E73 ; G 1492 +U 7796 ; WX 602 ; N uni1E74 ; G 1493 +U 7797 ; WX 602 ; N uni1E75 ; G 1494 +U 7798 ; WX 602 ; N uni1E76 ; G 1495 +U 7799 ; WX 602 ; N uni1E77 ; G 1496 +U 7800 ; WX 602 ; N uni1E78 ; G 1497 +U 7801 ; WX 602 ; N uni1E79 ; G 1498 +U 7804 ; WX 602 ; N uni1E7C ; G 1499 +U 7805 ; WX 602 ; N uni1E7D ; G 1500 +U 7806 ; WX 602 ; N uni1E7E ; G 1501 +U 7807 ; WX 602 ; N uni1E7F ; G 1502 +U 7808 ; WX 602 ; N Wgrave ; G 1503 +U 7809 ; WX 602 ; N wgrave ; G 1504 +U 7810 ; WX 602 ; N Wacute ; G 1505 +U 7811 ; WX 602 ; N wacute ; G 1506 +U 7812 ; WX 602 ; N Wdieresis ; G 1507 +U 7813 ; WX 602 ; N wdieresis ; G 1508 +U 7814 ; WX 602 ; N uni1E86 ; G 1509 +U 7815 ; WX 602 ; N uni1E87 ; G 1510 +U 7816 ; WX 602 ; N uni1E88 ; G 1511 +U 7817 ; WX 602 ; N uni1E89 ; G 1512 +U 7818 ; WX 602 ; N uni1E8A ; G 1513 +U 7819 ; WX 602 ; N uni1E8B ; G 1514 +U 7820 ; WX 602 ; N uni1E8C ; G 1515 +U 7821 ; WX 602 ; N uni1E8D ; G 1516 +U 7822 ; WX 602 ; N uni1E8E ; G 1517 +U 7823 ; WX 602 ; N uni1E8F ; G 1518 +U 7824 ; WX 602 ; N uni1E90 ; G 1519 +U 7825 ; WX 602 ; N uni1E91 ; G 1520 +U 7826 ; WX 602 ; N uni1E92 ; G 1521 +U 7827 ; WX 602 ; N uni1E93 ; G 1522 +U 7828 ; WX 602 ; N uni1E94 ; G 1523 +U 7829 ; WX 602 ; N uni1E95 ; G 1524 +U 7830 ; WX 602 ; N uni1E96 ; G 1525 +U 7831 ; WX 602 ; N uni1E97 ; G 1526 +U 7832 ; WX 602 ; N uni1E98 ; G 1527 +U 7833 ; WX 602 ; N uni1E99 ; G 1528 +U 7835 ; WX 602 ; N uni1E9B ; G 1529 +U 7839 ; WX 602 ; N uni1E9F ; G 1530 +U 7840 ; WX 602 ; N uni1EA0 ; G 1531 +U 7841 ; WX 602 ; N uni1EA1 ; G 1532 +U 7852 ; WX 602 ; N uni1EAC ; G 1533 +U 7853 ; WX 602 ; N uni1EAD ; G 1534 +U 7856 ; WX 602 ; N uni1EB0 ; G 1535 +U 7857 ; WX 602 ; N uni1EB1 ; G 1536 +U 7862 ; WX 602 ; N uni1EB6 ; G 1537 +U 7863 ; WX 602 ; N uni1EB7 ; G 1538 +U 7864 ; WX 602 ; N uni1EB8 ; G 1539 +U 7865 ; WX 602 ; N uni1EB9 ; G 1540 +U 7868 ; WX 602 ; N uni1EBC ; G 1541 +U 7869 ; WX 602 ; N uni1EBD ; G 1542 +U 7878 ; WX 602 ; N uni1EC6 ; G 1543 +U 7879 ; WX 602 ; N uni1EC7 ; G 1544 +U 7882 ; WX 602 ; N uni1ECA ; G 1545 +U 7883 ; WX 602 ; N uni1ECB ; G 1546 +U 7884 ; WX 602 ; N uni1ECC ; G 1547 +U 7885 ; WX 602 ; N uni1ECD ; G 1548 +U 7896 ; WX 602 ; N uni1ED8 ; G 1549 +U 7897 ; WX 602 ; N uni1ED9 ; G 1550 +U 7898 ; WX 602 ; N uni1EDA ; G 1551 +U 7899 ; WX 602 ; N uni1EDB ; G 1552 +U 7900 ; WX 602 ; N uni1EDC ; G 1553 +U 7901 ; WX 602 ; N uni1EDD ; G 1554 +U 7904 ; WX 602 ; N uni1EE0 ; G 1555 +U 7905 ; WX 602 ; N uni1EE1 ; G 1556 +U 7906 ; WX 602 ; N uni1EE2 ; G 1557 +U 7907 ; WX 602 ; N uni1EE3 ; G 1558 +U 7908 ; WX 602 ; N uni1EE4 ; G 1559 +U 7909 ; WX 602 ; N uni1EE5 ; G 1560 +U 7912 ; WX 602 ; N uni1EE8 ; G 1561 +U 7913 ; WX 602 ; N uni1EE9 ; G 1562 +U 7914 ; WX 602 ; N uni1EEA ; G 1563 +U 7915 ; WX 602 ; N uni1EEB ; G 1564 +U 7918 ; WX 602 ; N uni1EEE ; G 1565 +U 7919 ; WX 602 ; N uni1EEF ; G 1566 +U 7920 ; WX 602 ; N uni1EF0 ; G 1567 +U 7921 ; WX 602 ; N uni1EF1 ; G 1568 +U 7922 ; WX 602 ; N Ygrave ; G 1569 +U 7923 ; WX 602 ; N ygrave ; G 1570 +U 7924 ; WX 602 ; N uni1EF4 ; G 1571 +U 7925 ; WX 602 ; N uni1EF5 ; G 1572 +U 7928 ; WX 602 ; N uni1EF8 ; G 1573 +U 7929 ; WX 602 ; N uni1EF9 ; G 1574 +U 7936 ; WX 602 ; N uni1F00 ; G 1575 +U 7937 ; WX 602 ; N uni1F01 ; G 1576 +U 7938 ; WX 602 ; N uni1F02 ; G 1577 +U 7939 ; WX 602 ; N uni1F03 ; G 1578 +U 7940 ; WX 602 ; N uni1F04 ; G 1579 +U 7941 ; WX 602 ; N uni1F05 ; G 1580 +U 7942 ; WX 602 ; N uni1F06 ; G 1581 +U 7943 ; WX 602 ; N uni1F07 ; G 1582 +U 7944 ; WX 602 ; N uni1F08 ; G 1583 +U 7945 ; WX 602 ; N uni1F09 ; G 1584 +U 7946 ; WX 602 ; N uni1F0A ; G 1585 +U 7947 ; WX 602 ; N uni1F0B ; G 1586 +U 7948 ; WX 602 ; N uni1F0C ; G 1587 +U 7949 ; WX 602 ; N uni1F0D ; G 1588 +U 7950 ; WX 602 ; N uni1F0E ; G 1589 +U 7951 ; WX 602 ; N uni1F0F ; G 1590 +U 7952 ; WX 602 ; N uni1F10 ; G 1591 +U 7953 ; WX 602 ; N uni1F11 ; G 1592 +U 7954 ; WX 602 ; N uni1F12 ; G 1593 +U 7955 ; WX 602 ; N uni1F13 ; G 1594 +U 7956 ; WX 602 ; N uni1F14 ; G 1595 +U 7957 ; WX 602 ; N uni1F15 ; G 1596 +U 7960 ; WX 602 ; N uni1F18 ; G 1597 +U 7961 ; WX 602 ; N uni1F19 ; G 1598 +U 7962 ; WX 602 ; N uni1F1A ; G 1599 +U 7963 ; WX 602 ; N uni1F1B ; G 1600 +U 7964 ; WX 602 ; N uni1F1C ; G 1601 +U 7965 ; WX 602 ; N uni1F1D ; G 1602 +U 7968 ; WX 602 ; N uni1F20 ; G 1603 +U 7969 ; WX 602 ; N uni1F21 ; G 1604 +U 7970 ; WX 602 ; N uni1F22 ; G 1605 +U 7971 ; WX 602 ; N uni1F23 ; G 1606 +U 7972 ; WX 602 ; N uni1F24 ; G 1607 +U 7973 ; WX 602 ; N uni1F25 ; G 1608 +U 7974 ; WX 602 ; N uni1F26 ; G 1609 +U 7975 ; WX 602 ; N uni1F27 ; G 1610 +U 7976 ; WX 602 ; N uni1F28 ; G 1611 +U 7977 ; WX 602 ; N uni1F29 ; G 1612 +U 7978 ; WX 602 ; N uni1F2A ; G 1613 +U 7979 ; WX 602 ; N uni1F2B ; G 1614 +U 7980 ; WX 602 ; N uni1F2C ; G 1615 +U 7981 ; WX 602 ; N uni1F2D ; G 1616 +U 7982 ; WX 602 ; N uni1F2E ; G 1617 +U 7983 ; WX 602 ; N uni1F2F ; G 1618 +U 7984 ; WX 602 ; N uni1F30 ; G 1619 +U 7985 ; WX 602 ; N uni1F31 ; G 1620 +U 7986 ; WX 602 ; N uni1F32 ; G 1621 +U 7987 ; WX 602 ; N uni1F33 ; G 1622 +U 7988 ; WX 602 ; N uni1F34 ; G 1623 +U 7989 ; WX 602 ; N uni1F35 ; G 1624 +U 7990 ; WX 602 ; N uni1F36 ; G 1625 +U 7991 ; WX 602 ; N uni1F37 ; G 1626 +U 7992 ; WX 602 ; N uni1F38 ; G 1627 +U 7993 ; WX 602 ; N uni1F39 ; G 1628 +U 7994 ; WX 602 ; N uni1F3A ; G 1629 +U 7995 ; WX 602 ; N uni1F3B ; G 1630 +U 7996 ; WX 602 ; N uni1F3C ; G 1631 +U 7997 ; WX 602 ; N uni1F3D ; G 1632 +U 7998 ; WX 602 ; N uni1F3E ; G 1633 +U 7999 ; WX 602 ; N uni1F3F ; G 1634 +U 8000 ; WX 602 ; N uni1F40 ; G 1635 +U 8001 ; WX 602 ; N uni1F41 ; G 1636 +U 8002 ; WX 602 ; N uni1F42 ; G 1637 +U 8003 ; WX 602 ; N uni1F43 ; G 1638 +U 8004 ; WX 602 ; N uni1F44 ; G 1639 +U 8005 ; WX 602 ; N uni1F45 ; G 1640 +U 8008 ; WX 602 ; N uni1F48 ; G 1641 +U 8009 ; WX 602 ; N uni1F49 ; G 1642 +U 8010 ; WX 602 ; N uni1F4A ; G 1643 +U 8011 ; WX 602 ; N uni1F4B ; G 1644 +U 8012 ; WX 602 ; N uni1F4C ; G 1645 +U 8013 ; WX 602 ; N uni1F4D ; G 1646 +U 8016 ; WX 602 ; N uni1F50 ; G 1647 +U 8017 ; WX 602 ; N uni1F51 ; G 1648 +U 8018 ; WX 602 ; N uni1F52 ; G 1649 +U 8019 ; WX 602 ; N uni1F53 ; G 1650 +U 8020 ; WX 602 ; N uni1F54 ; G 1651 +U 8021 ; WX 602 ; N uni1F55 ; G 1652 +U 8022 ; WX 602 ; N uni1F56 ; G 1653 +U 8023 ; WX 602 ; N uni1F57 ; G 1654 +U 8025 ; WX 602 ; N uni1F59 ; G 1655 +U 8027 ; WX 602 ; N uni1F5B ; G 1656 +U 8029 ; WX 602 ; N uni1F5D ; G 1657 +U 8031 ; WX 602 ; N uni1F5F ; G 1658 +U 8032 ; WX 602 ; N uni1F60 ; G 1659 +U 8033 ; WX 602 ; N uni1F61 ; G 1660 +U 8034 ; WX 602 ; N uni1F62 ; G 1661 +U 8035 ; WX 602 ; N uni1F63 ; G 1662 +U 8036 ; WX 602 ; N uni1F64 ; G 1663 +U 8037 ; WX 602 ; N uni1F65 ; G 1664 +U 8038 ; WX 602 ; N uni1F66 ; G 1665 +U 8039 ; WX 602 ; N uni1F67 ; G 1666 +U 8040 ; WX 602 ; N uni1F68 ; G 1667 +U 8041 ; WX 602 ; N uni1F69 ; G 1668 +U 8042 ; WX 602 ; N uni1F6A ; G 1669 +U 8043 ; WX 602 ; N uni1F6B ; G 1670 +U 8044 ; WX 602 ; N uni1F6C ; G 1671 +U 8045 ; WX 602 ; N uni1F6D ; G 1672 +U 8046 ; WX 602 ; N uni1F6E ; G 1673 +U 8047 ; WX 602 ; N uni1F6F ; G 1674 +U 8048 ; WX 602 ; N uni1F70 ; G 1675 +U 8049 ; WX 602 ; N uni1F71 ; G 1676 +U 8050 ; WX 602 ; N uni1F72 ; G 1677 +U 8051 ; WX 602 ; N uni1F73 ; G 1678 +U 8052 ; WX 602 ; N uni1F74 ; G 1679 +U 8053 ; WX 602 ; N uni1F75 ; G 1680 +U 8054 ; WX 602 ; N uni1F76 ; G 1681 +U 8055 ; WX 602 ; N uni1F77 ; G 1682 +U 8056 ; WX 602 ; N uni1F78 ; G 1683 +U 8057 ; WX 602 ; N uni1F79 ; G 1684 +U 8058 ; WX 602 ; N uni1F7A ; G 1685 +U 8059 ; WX 602 ; N uni1F7B ; G 1686 +U 8060 ; WX 602 ; N uni1F7C ; G 1687 +U 8061 ; WX 602 ; N uni1F7D ; G 1688 +U 8064 ; WX 602 ; N uni1F80 ; G 1689 +U 8065 ; WX 602 ; N uni1F81 ; G 1690 +U 8066 ; WX 602 ; N uni1F82 ; G 1691 +U 8067 ; WX 602 ; N uni1F83 ; G 1692 +U 8068 ; WX 602 ; N uni1F84 ; G 1693 +U 8069 ; WX 602 ; N uni1F85 ; G 1694 +U 8070 ; WX 602 ; N uni1F86 ; G 1695 +U 8071 ; WX 602 ; N uni1F87 ; G 1696 +U 8072 ; WX 602 ; N uni1F88 ; G 1697 +U 8073 ; WX 602 ; N uni1F89 ; G 1698 +U 8074 ; WX 602 ; N uni1F8A ; G 1699 +U 8075 ; WX 602 ; N uni1F8B ; G 1700 +U 8076 ; WX 602 ; N uni1F8C ; G 1701 +U 8077 ; WX 602 ; N uni1F8D ; G 1702 +U 8078 ; WX 602 ; N uni1F8E ; G 1703 +U 8079 ; WX 602 ; N uni1F8F ; G 1704 +U 8080 ; WX 602 ; N uni1F90 ; G 1705 +U 8081 ; WX 602 ; N uni1F91 ; G 1706 +U 8082 ; WX 602 ; N uni1F92 ; G 1707 +U 8083 ; WX 602 ; N uni1F93 ; G 1708 +U 8084 ; WX 602 ; N uni1F94 ; G 1709 +U 8085 ; WX 602 ; N uni1F95 ; G 1710 +U 8086 ; WX 602 ; N uni1F96 ; G 1711 +U 8087 ; WX 602 ; N uni1F97 ; G 1712 +U 8088 ; WX 602 ; N uni1F98 ; G 1713 +U 8089 ; WX 602 ; N uni1F99 ; G 1714 +U 8090 ; WX 602 ; N uni1F9A ; G 1715 +U 8091 ; WX 602 ; N uni1F9B ; G 1716 +U 8092 ; WX 602 ; N uni1F9C ; G 1717 +U 8093 ; WX 602 ; N uni1F9D ; G 1718 +U 8094 ; WX 602 ; N uni1F9E ; G 1719 +U 8095 ; WX 602 ; N uni1F9F ; G 1720 +U 8096 ; WX 602 ; N uni1FA0 ; G 1721 +U 8097 ; WX 602 ; N uni1FA1 ; G 1722 +U 8098 ; WX 602 ; N uni1FA2 ; G 1723 +U 8099 ; WX 602 ; N uni1FA3 ; G 1724 +U 8100 ; WX 602 ; N uni1FA4 ; G 1725 +U 8101 ; WX 602 ; N uni1FA5 ; G 1726 +U 8102 ; WX 602 ; N uni1FA6 ; G 1727 +U 8103 ; WX 602 ; N uni1FA7 ; G 1728 +U 8104 ; WX 602 ; N uni1FA8 ; G 1729 +U 8105 ; WX 602 ; N uni1FA9 ; G 1730 +U 8106 ; WX 602 ; N uni1FAA ; G 1731 +U 8107 ; WX 602 ; N uni1FAB ; G 1732 +U 8108 ; WX 602 ; N uni1FAC ; G 1733 +U 8109 ; WX 602 ; N uni1FAD ; G 1734 +U 8110 ; WX 602 ; N uni1FAE ; G 1735 +U 8111 ; WX 602 ; N uni1FAF ; G 1736 +U 8112 ; WX 602 ; N uni1FB0 ; G 1737 +U 8113 ; WX 602 ; N uni1FB1 ; G 1738 +U 8114 ; WX 602 ; N uni1FB2 ; G 1739 +U 8115 ; WX 602 ; N uni1FB3 ; G 1740 +U 8116 ; WX 602 ; N uni1FB4 ; G 1741 +U 8118 ; WX 602 ; N uni1FB6 ; G 1742 +U 8119 ; WX 602 ; N uni1FB7 ; G 1743 +U 8120 ; WX 602 ; N uni1FB8 ; G 1744 +U 8121 ; WX 602 ; N uni1FB9 ; G 1745 +U 8122 ; WX 602 ; N uni1FBA ; G 1746 +U 8123 ; WX 602 ; N uni1FBB ; G 1747 +U 8124 ; WX 602 ; N uni1FBC ; G 1748 +U 8125 ; WX 602 ; N uni1FBD ; G 1749 +U 8126 ; WX 602 ; N uni1FBE ; G 1750 +U 8127 ; WX 602 ; N uni1FBF ; G 1751 +U 8128 ; WX 602 ; N uni1FC0 ; G 1752 +U 8129 ; WX 602 ; N uni1FC1 ; G 1753 +U 8130 ; WX 602 ; N uni1FC2 ; G 1754 +U 8131 ; WX 602 ; N uni1FC3 ; G 1755 +U 8132 ; WX 602 ; N uni1FC4 ; G 1756 +U 8134 ; WX 602 ; N uni1FC6 ; G 1757 +U 8135 ; WX 602 ; N uni1FC7 ; G 1758 +U 8136 ; WX 602 ; N uni1FC8 ; G 1759 +U 8137 ; WX 602 ; N uni1FC9 ; G 1760 +U 8138 ; WX 602 ; N uni1FCA ; G 1761 +U 8139 ; WX 602 ; N uni1FCB ; G 1762 +U 8140 ; WX 602 ; N uni1FCC ; G 1763 +U 8141 ; WX 602 ; N uni1FCD ; G 1764 +U 8142 ; WX 602 ; N uni1FCE ; G 1765 +U 8143 ; WX 602 ; N uni1FCF ; G 1766 +U 8144 ; WX 602 ; N uni1FD0 ; G 1767 +U 8145 ; WX 602 ; N uni1FD1 ; G 1768 +U 8146 ; WX 602 ; N uni1FD2 ; G 1769 +U 8147 ; WX 602 ; N uni1FD3 ; G 1770 +U 8150 ; WX 602 ; N uni1FD6 ; G 1771 +U 8151 ; WX 602 ; N uni1FD7 ; G 1772 +U 8152 ; WX 602 ; N uni1FD8 ; G 1773 +U 8153 ; WX 602 ; N uni1FD9 ; G 1774 +U 8154 ; WX 602 ; N uni1FDA ; G 1775 +U 8155 ; WX 602 ; N uni1FDB ; G 1776 +U 8157 ; WX 602 ; N uni1FDD ; G 1777 +U 8158 ; WX 602 ; N uni1FDE ; G 1778 +U 8159 ; WX 602 ; N uni1FDF ; G 1779 +U 8160 ; WX 602 ; N uni1FE0 ; G 1780 +U 8161 ; WX 602 ; N uni1FE1 ; G 1781 +U 8162 ; WX 602 ; N uni1FE2 ; G 1782 +U 8163 ; WX 602 ; N uni1FE3 ; G 1783 +U 8164 ; WX 602 ; N uni1FE4 ; G 1784 +U 8165 ; WX 602 ; N uni1FE5 ; G 1785 +U 8166 ; WX 602 ; N uni1FE6 ; G 1786 +U 8167 ; WX 602 ; N uni1FE7 ; G 1787 +U 8168 ; WX 602 ; N uni1FE8 ; G 1788 +U 8169 ; WX 602 ; N uni1FE9 ; G 1789 +U 8170 ; WX 602 ; N uni1FEA ; G 1790 +U 8171 ; WX 602 ; N uni1FEB ; G 1791 +U 8172 ; WX 602 ; N uni1FEC ; G 1792 +U 8173 ; WX 602 ; N uni1FED ; G 1793 +U 8174 ; WX 602 ; N uni1FEE ; G 1794 +U 8175 ; WX 602 ; N uni1FEF ; G 1795 +U 8178 ; WX 602 ; N uni1FF2 ; G 1796 +U 8179 ; WX 602 ; N uni1FF3 ; G 1797 +U 8180 ; WX 602 ; N uni1FF4 ; G 1798 +U 8182 ; WX 602 ; N uni1FF6 ; G 1799 +U 8183 ; WX 602 ; N uni1FF7 ; G 1800 +U 8184 ; WX 602 ; N uni1FF8 ; G 1801 +U 8185 ; WX 602 ; N uni1FF9 ; G 1802 +U 8186 ; WX 602 ; N uni1FFA ; G 1803 +U 8187 ; WX 602 ; N uni1FFB ; G 1804 +U 8188 ; WX 602 ; N uni1FFC ; G 1805 +U 8189 ; WX 602 ; N uni1FFD ; G 1806 +U 8190 ; WX 602 ; N uni1FFE ; G 1807 +U 8192 ; WX 602 ; N uni2000 ; G 1808 +U 8193 ; WX 602 ; N uni2001 ; G 1809 +U 8194 ; WX 602 ; N uni2002 ; G 1810 +U 8195 ; WX 602 ; N uni2003 ; G 1811 +U 8196 ; WX 602 ; N uni2004 ; G 1812 +U 8197 ; WX 602 ; N uni2005 ; G 1813 +U 8198 ; WX 602 ; N uni2006 ; G 1814 +U 8199 ; WX 602 ; N uni2007 ; G 1815 +U 8200 ; WX 602 ; N uni2008 ; G 1816 +U 8201 ; WX 602 ; N uni2009 ; G 1817 +U 8202 ; WX 602 ; N uni200A ; G 1818 +U 8208 ; WX 602 ; N uni2010 ; G 1819 +U 8209 ; WX 602 ; N uni2011 ; G 1820 +U 8210 ; WX 602 ; N figuredash ; G 1821 +U 8211 ; WX 602 ; N endash ; G 1822 +U 8212 ; WX 602 ; N emdash ; G 1823 +U 8213 ; WX 602 ; N uni2015 ; G 1824 +U 8214 ; WX 602 ; N uni2016 ; G 1825 +U 8215 ; WX 602 ; N underscoredbl ; G 1826 +U 8216 ; WX 602 ; N quoteleft ; G 1827 +U 8217 ; WX 602 ; N quoteright ; G 1828 +U 8218 ; WX 602 ; N quotesinglbase ; G 1829 +U 8219 ; WX 602 ; N quotereversed ; G 1830 +U 8220 ; WX 602 ; N quotedblleft ; G 1831 +U 8221 ; WX 602 ; N quotedblright ; G 1832 +U 8222 ; WX 602 ; N quotedblbase ; G 1833 +U 8223 ; WX 602 ; N uni201F ; G 1834 +U 8224 ; WX 602 ; N dagger ; G 1835 +U 8225 ; WX 602 ; N daggerdbl ; G 1836 +U 8226 ; WX 602 ; N bullet ; G 1837 +U 8227 ; WX 602 ; N uni2023 ; G 1838 +U 8230 ; WX 602 ; N ellipsis ; G 1839 +U 8239 ; WX 602 ; N uni202F ; G 1840 +U 8240 ; WX 602 ; N perthousand ; G 1841 +U 8241 ; WX 602 ; N uni2031 ; G 1842 +U 8242 ; WX 602 ; N minute ; G 1843 +U 8243 ; WX 602 ; N second ; G 1844 +U 8244 ; WX 602 ; N uni2034 ; G 1845 +U 8245 ; WX 602 ; N uni2035 ; G 1846 +U 8246 ; WX 602 ; N uni2036 ; G 1847 +U 8247 ; WX 602 ; N uni2037 ; G 1848 +U 8249 ; WX 602 ; N guilsinglleft ; G 1849 +U 8250 ; WX 602 ; N guilsinglright ; G 1850 +U 8252 ; WX 602 ; N exclamdbl ; G 1851 +U 8253 ; WX 602 ; N uni203D ; G 1852 +U 8254 ; WX 602 ; N uni203E ; G 1853 +U 8255 ; WX 602 ; N uni203F ; G 1854 +U 8261 ; WX 602 ; N uni2045 ; G 1855 +U 8262 ; WX 602 ; N uni2046 ; G 1856 +U 8263 ; WX 602 ; N uni2047 ; G 1857 +U 8264 ; WX 602 ; N uni2048 ; G 1858 +U 8265 ; WX 602 ; N uni2049 ; G 1859 +U 8267 ; WX 602 ; N uni204B ; G 1860 +U 8287 ; WX 602 ; N uni205F ; G 1861 +U 8304 ; WX 602 ; N uni2070 ; G 1862 +U 8305 ; WX 602 ; N uni2071 ; G 1863 +U 8308 ; WX 602 ; N uni2074 ; G 1864 +U 8309 ; WX 602 ; N uni2075 ; G 1865 +U 8310 ; WX 602 ; N uni2076 ; G 1866 +U 8311 ; WX 602 ; N uni2077 ; G 1867 +U 8312 ; WX 602 ; N uni2078 ; G 1868 +U 8313 ; WX 602 ; N uni2079 ; G 1869 +U 8314 ; WX 602 ; N uni207A ; G 1870 +U 8315 ; WX 602 ; N uni207B ; G 1871 +U 8316 ; WX 602 ; N uni207C ; G 1872 +U 8317 ; WX 602 ; N uni207D ; G 1873 +U 8318 ; WX 602 ; N uni207E ; G 1874 +U 8319 ; WX 602 ; N uni207F ; G 1875 +U 8320 ; WX 602 ; N uni2080 ; G 1876 +U 8321 ; WX 602 ; N uni2081 ; G 1877 +U 8322 ; WX 602 ; N uni2082 ; G 1878 +U 8323 ; WX 602 ; N uni2083 ; G 1879 +U 8324 ; WX 602 ; N uni2084 ; G 1880 +U 8325 ; WX 602 ; N uni2085 ; G 1881 +U 8326 ; WX 602 ; N uni2086 ; G 1882 +U 8327 ; WX 602 ; N uni2087 ; G 1883 +U 8328 ; WX 602 ; N uni2088 ; G 1884 +U 8329 ; WX 602 ; N uni2089 ; G 1885 +U 8330 ; WX 602 ; N uni208A ; G 1886 +U 8331 ; WX 602 ; N uni208B ; G 1887 +U 8332 ; WX 602 ; N uni208C ; G 1888 +U 8333 ; WX 602 ; N uni208D ; G 1889 +U 8334 ; WX 602 ; N uni208E ; G 1890 +U 8336 ; WX 602 ; N uni2090 ; G 1891 +U 8337 ; WX 602 ; N uni2091 ; G 1892 +U 8338 ; WX 602 ; N uni2092 ; G 1893 +U 8339 ; WX 602 ; N uni2093 ; G 1894 +U 8340 ; WX 602 ; N uni2094 ; G 1895 +U 8341 ; WX 602 ; N uni2095 ; G 1896 +U 8342 ; WX 602 ; N uni2096 ; G 1897 +U 8343 ; WX 602 ; N uni2097 ; G 1898 +U 8344 ; WX 602 ; N uni2098 ; G 1899 +U 8345 ; WX 602 ; N uni2099 ; G 1900 +U 8346 ; WX 602 ; N uni209A ; G 1901 +U 8347 ; WX 602 ; N uni209B ; G 1902 +U 8348 ; WX 602 ; N uni209C ; G 1903 +U 8352 ; WX 602 ; N uni20A0 ; G 1904 +U 8353 ; WX 602 ; N colonmonetary ; G 1905 +U 8354 ; WX 602 ; N uni20A2 ; G 1906 +U 8355 ; WX 602 ; N franc ; G 1907 +U 8356 ; WX 602 ; N lira ; G 1908 +U 8357 ; WX 602 ; N uni20A5 ; G 1909 +U 8358 ; WX 602 ; N uni20A6 ; G 1910 +U 8359 ; WX 602 ; N peseta ; G 1911 +U 8360 ; WX 602 ; N uni20A8 ; G 1912 +U 8361 ; WX 602 ; N uni20A9 ; G 1913 +U 8362 ; WX 602 ; N uni20AA ; G 1914 +U 8363 ; WX 602 ; N dong ; G 1915 +U 8364 ; WX 602 ; N Euro ; G 1916 +U 8365 ; WX 602 ; N uni20AD ; G 1917 +U 8366 ; WX 602 ; N uni20AE ; G 1918 +U 8367 ; WX 602 ; N uni20AF ; G 1919 +U 8368 ; WX 602 ; N uni20B0 ; G 1920 +U 8369 ; WX 602 ; N uni20B1 ; G 1921 +U 8370 ; WX 602 ; N uni20B2 ; G 1922 +U 8371 ; WX 602 ; N uni20B3 ; G 1923 +U 8372 ; WX 602 ; N uni20B4 ; G 1924 +U 8373 ; WX 602 ; N uni20B5 ; G 1925 +U 8376 ; WX 602 ; N uni20B8 ; G 1926 +U 8377 ; WX 602 ; N uni20B9 ; G 1927 +U 8378 ; WX 602 ; N uni20BA ; G 1928 +U 8381 ; WX 602 ; N uni20BD ; G 1929 +U 8450 ; WX 602 ; N uni2102 ; G 1930 +U 8453 ; WX 602 ; N uni2105 ; G 1931 +U 8461 ; WX 602 ; N uni210D ; G 1932 +U 8462 ; WX 602 ; N uni210E ; G 1933 +U 8463 ; WX 602 ; N uni210F ; G 1934 +U 8469 ; WX 602 ; N uni2115 ; G 1935 +U 8470 ; WX 602 ; N uni2116 ; G 1936 +U 8471 ; WX 602 ; N uni2117 ; G 1937 +U 8473 ; WX 602 ; N uni2119 ; G 1938 +U 8474 ; WX 602 ; N uni211A ; G 1939 +U 8477 ; WX 602 ; N uni211D ; G 1940 +U 8482 ; WX 602 ; N trademark ; G 1941 +U 8484 ; WX 602 ; N uni2124 ; G 1942 +U 8486 ; WX 602 ; N uni2126 ; G 1943 +U 8490 ; WX 602 ; N uni212A ; G 1944 +U 8491 ; WX 602 ; N uni212B ; G 1945 +U 8494 ; WX 602 ; N estimated ; G 1946 +U 8520 ; WX 602 ; N uni2148 ; G 1947 +U 8528 ; WX 602 ; N uni2150 ; G 1948 +U 8529 ; WX 602 ; N uni2151 ; G 1949 +U 8531 ; WX 602 ; N onethird ; G 1950 +U 8532 ; WX 602 ; N twothirds ; G 1951 +U 8533 ; WX 602 ; N uni2155 ; G 1952 +U 8534 ; WX 602 ; N uni2156 ; G 1953 +U 8535 ; WX 602 ; N uni2157 ; G 1954 +U 8536 ; WX 602 ; N uni2158 ; G 1955 +U 8537 ; WX 602 ; N uni2159 ; G 1956 +U 8538 ; WX 602 ; N uni215A ; G 1957 +U 8539 ; WX 602 ; N oneeighth ; G 1958 +U 8540 ; WX 602 ; N threeeighths ; G 1959 +U 8541 ; WX 602 ; N fiveeighths ; G 1960 +U 8542 ; WX 602 ; N seveneighths ; G 1961 +U 8543 ; WX 602 ; N uni215F ; G 1962 +U 8585 ; WX 602 ; N uni2189 ; G 1963 +U 8592 ; WX 602 ; N arrowleft ; G 1964 +U 8593 ; WX 602 ; N arrowup ; G 1965 +U 8594 ; WX 602 ; N arrowright ; G 1966 +U 8595 ; WX 602 ; N arrowdown ; G 1967 +U 8596 ; WX 602 ; N arrowboth ; G 1968 +U 8597 ; WX 602 ; N arrowupdn ; G 1969 +U 8598 ; WX 602 ; N uni2196 ; G 1970 +U 8599 ; WX 602 ; N uni2197 ; G 1971 +U 8600 ; WX 602 ; N uni2198 ; G 1972 +U 8601 ; WX 602 ; N uni2199 ; G 1973 +U 8602 ; WX 602 ; N uni219A ; G 1974 +U 8603 ; WX 602 ; N uni219B ; G 1975 +U 8604 ; WX 602 ; N uni219C ; G 1976 +U 8605 ; WX 602 ; N uni219D ; G 1977 +U 8606 ; WX 602 ; N uni219E ; G 1978 +U 8607 ; WX 602 ; N uni219F ; G 1979 +U 8608 ; WX 602 ; N uni21A0 ; G 1980 +U 8609 ; WX 602 ; N uni21A1 ; G 1981 +U 8610 ; WX 602 ; N uni21A2 ; G 1982 +U 8611 ; WX 602 ; N uni21A3 ; G 1983 +U 8612 ; WX 602 ; N uni21A4 ; G 1984 +U 8613 ; WX 602 ; N uni21A5 ; G 1985 +U 8614 ; WX 602 ; N uni21A6 ; G 1986 +U 8615 ; WX 602 ; N uni21A7 ; G 1987 +U 8616 ; WX 602 ; N arrowupdnbse ; G 1988 +U 8617 ; WX 602 ; N uni21A9 ; G 1989 +U 8618 ; WX 602 ; N uni21AA ; G 1990 +U 8619 ; WX 602 ; N uni21AB ; G 1991 +U 8620 ; WX 602 ; N uni21AC ; G 1992 +U 8621 ; WX 602 ; N uni21AD ; G 1993 +U 8622 ; WX 602 ; N uni21AE ; G 1994 +U 8623 ; WX 602 ; N uni21AF ; G 1995 +U 8624 ; WX 602 ; N uni21B0 ; G 1996 +U 8625 ; WX 602 ; N uni21B1 ; G 1997 +U 8626 ; WX 602 ; N uni21B2 ; G 1998 +U 8627 ; WX 602 ; N uni21B3 ; G 1999 +U 8628 ; WX 602 ; N uni21B4 ; G 2000 +U 8629 ; WX 602 ; N carriagereturn ; G 2001 +U 8630 ; WX 602 ; N uni21B6 ; G 2002 +U 8631 ; WX 602 ; N uni21B7 ; G 2003 +U 8632 ; WX 602 ; N uni21B8 ; G 2004 +U 8633 ; WX 602 ; N uni21B9 ; G 2005 +U 8634 ; WX 602 ; N uni21BA ; G 2006 +U 8635 ; WX 602 ; N uni21BB ; G 2007 +U 8636 ; WX 602 ; N uni21BC ; G 2008 +U 8637 ; WX 602 ; N uni21BD ; G 2009 +U 8638 ; WX 602 ; N uni21BE ; G 2010 +U 8639 ; WX 602 ; N uni21BF ; G 2011 +U 8640 ; WX 602 ; N uni21C0 ; G 2012 +U 8641 ; WX 602 ; N uni21C1 ; G 2013 +U 8642 ; WX 602 ; N uni21C2 ; G 2014 +U 8643 ; WX 602 ; N uni21C3 ; G 2015 +U 8644 ; WX 602 ; N uni21C4 ; G 2016 +U 8645 ; WX 602 ; N uni21C5 ; G 2017 +U 8646 ; WX 602 ; N uni21C6 ; G 2018 +U 8647 ; WX 602 ; N uni21C7 ; G 2019 +U 8648 ; WX 602 ; N uni21C8 ; G 2020 +U 8649 ; WX 602 ; N uni21C9 ; G 2021 +U 8650 ; WX 602 ; N uni21CA ; G 2022 +U 8651 ; WX 602 ; N uni21CB ; G 2023 +U 8652 ; WX 602 ; N uni21CC ; G 2024 +U 8653 ; WX 602 ; N uni21CD ; G 2025 +U 8654 ; WX 602 ; N uni21CE ; G 2026 +U 8655 ; WX 602 ; N uni21CF ; G 2027 +U 8656 ; WX 602 ; N arrowdblleft ; G 2028 +U 8657 ; WX 602 ; N arrowdblup ; G 2029 +U 8658 ; WX 602 ; N arrowdblright ; G 2030 +U 8659 ; WX 602 ; N arrowdbldown ; G 2031 +U 8660 ; WX 602 ; N arrowdblboth ; G 2032 +U 8661 ; WX 602 ; N uni21D5 ; G 2033 +U 8662 ; WX 602 ; N uni21D6 ; G 2034 +U 8663 ; WX 602 ; N uni21D7 ; G 2035 +U 8664 ; WX 602 ; N uni21D8 ; G 2036 +U 8665 ; WX 602 ; N uni21D9 ; G 2037 +U 8666 ; WX 602 ; N uni21DA ; G 2038 +U 8667 ; WX 602 ; N uni21DB ; G 2039 +U 8668 ; WX 602 ; N uni21DC ; G 2040 +U 8669 ; WX 602 ; N uni21DD ; G 2041 +U 8670 ; WX 602 ; N uni21DE ; G 2042 +U 8671 ; WX 602 ; N uni21DF ; G 2043 +U 8672 ; WX 602 ; N uni21E0 ; G 2044 +U 8673 ; WX 602 ; N uni21E1 ; G 2045 +U 8674 ; WX 602 ; N uni21E2 ; G 2046 +U 8675 ; WX 602 ; N uni21E3 ; G 2047 +U 8676 ; WX 602 ; N uni21E4 ; G 2048 +U 8677 ; WX 602 ; N uni21E5 ; G 2049 +U 8678 ; WX 602 ; N uni21E6 ; G 2050 +U 8679 ; WX 602 ; N uni21E7 ; G 2051 +U 8680 ; WX 602 ; N uni21E8 ; G 2052 +U 8681 ; WX 602 ; N uni21E9 ; G 2053 +U 8682 ; WX 602 ; N uni21EA ; G 2054 +U 8683 ; WX 602 ; N uni21EB ; G 2055 +U 8684 ; WX 602 ; N uni21EC ; G 2056 +U 8685 ; WX 602 ; N uni21ED ; G 2057 +U 8686 ; WX 602 ; N uni21EE ; G 2058 +U 8687 ; WX 602 ; N uni21EF ; G 2059 +U 8688 ; WX 602 ; N uni21F0 ; G 2060 +U 8689 ; WX 602 ; N uni21F1 ; G 2061 +U 8690 ; WX 602 ; N uni21F2 ; G 2062 +U 8691 ; WX 602 ; N uni21F3 ; G 2063 +U 8692 ; WX 602 ; N uni21F4 ; G 2064 +U 8693 ; WX 602 ; N uni21F5 ; G 2065 +U 8694 ; WX 602 ; N uni21F6 ; G 2066 +U 8695 ; WX 602 ; N uni21F7 ; G 2067 +U 8696 ; WX 602 ; N uni21F8 ; G 2068 +U 8697 ; WX 602 ; N uni21F9 ; G 2069 +U 8698 ; WX 602 ; N uni21FA ; G 2070 +U 8699 ; WX 602 ; N uni21FB ; G 2071 +U 8700 ; WX 602 ; N uni21FC ; G 2072 +U 8701 ; WX 602 ; N uni21FD ; G 2073 +U 8702 ; WX 602 ; N uni21FE ; G 2074 +U 8703 ; WX 602 ; N uni21FF ; G 2075 +U 8704 ; WX 602 ; N universal ; G 2076 +U 8705 ; WX 602 ; N uni2201 ; G 2077 +U 8706 ; WX 602 ; N partialdiff ; G 2078 +U 8707 ; WX 602 ; N existential ; G 2079 +U 8708 ; WX 602 ; N uni2204 ; G 2080 +U 8709 ; WX 602 ; N emptyset ; G 2081 +U 8710 ; WX 602 ; N increment ; G 2082 +U 8711 ; WX 602 ; N gradient ; G 2083 +U 8712 ; WX 602 ; N element ; G 2084 +U 8713 ; WX 602 ; N notelement ; G 2085 +U 8714 ; WX 602 ; N uni220A ; G 2086 +U 8715 ; WX 602 ; N suchthat ; G 2087 +U 8716 ; WX 602 ; N uni220C ; G 2088 +U 8717 ; WX 602 ; N uni220D ; G 2089 +U 8718 ; WX 602 ; N uni220E ; G 2090 +U 8719 ; WX 602 ; N product ; G 2091 +U 8720 ; WX 602 ; N uni2210 ; G 2092 +U 8721 ; WX 602 ; N summation ; G 2093 +U 8722 ; WX 602 ; N minus ; G 2094 +U 8723 ; WX 602 ; N uni2213 ; G 2095 +U 8725 ; WX 602 ; N uni2215 ; G 2096 +U 8727 ; WX 602 ; N asteriskmath ; G 2097 +U 8728 ; WX 602 ; N uni2218 ; G 2098 +U 8729 ; WX 602 ; N uni2219 ; G 2099 +U 8730 ; WX 602 ; N radical ; G 2100 +U 8731 ; WX 602 ; N uni221B ; G 2101 +U 8732 ; WX 602 ; N uni221C ; G 2102 +U 8733 ; WX 602 ; N proportional ; G 2103 +U 8734 ; WX 602 ; N infinity ; G 2104 +U 8735 ; WX 602 ; N orthogonal ; G 2105 +U 8736 ; WX 602 ; N angle ; G 2106 +U 8739 ; WX 602 ; N uni2223 ; G 2107 +U 8743 ; WX 602 ; N logicaland ; G 2108 +U 8744 ; WX 602 ; N logicalor ; G 2109 +U 8745 ; WX 602 ; N intersection ; G 2110 +U 8746 ; WX 602 ; N union ; G 2111 +U 8747 ; WX 602 ; N integral ; G 2112 +U 8748 ; WX 602 ; N uni222C ; G 2113 +U 8749 ; WX 602 ; N uni222D ; G 2114 +U 8756 ; WX 602 ; N therefore ; G 2115 +U 8757 ; WX 602 ; N uni2235 ; G 2116 +U 8758 ; WX 602 ; N uni2236 ; G 2117 +U 8759 ; WX 602 ; N uni2237 ; G 2118 +U 8760 ; WX 602 ; N uni2238 ; G 2119 +U 8761 ; WX 602 ; N uni2239 ; G 2120 +U 8762 ; WX 602 ; N uni223A ; G 2121 +U 8763 ; WX 602 ; N uni223B ; G 2122 +U 8764 ; WX 602 ; N similar ; G 2123 +U 8765 ; WX 602 ; N uni223D ; G 2124 +U 8769 ; WX 602 ; N uni2241 ; G 2125 +U 8770 ; WX 602 ; N uni2242 ; G 2126 +U 8771 ; WX 602 ; N uni2243 ; G 2127 +U 8772 ; WX 602 ; N uni2244 ; G 2128 +U 8773 ; WX 602 ; N congruent ; G 2129 +U 8774 ; WX 602 ; N uni2246 ; G 2130 +U 8775 ; WX 602 ; N uni2247 ; G 2131 +U 8776 ; WX 602 ; N approxequal ; G 2132 +U 8777 ; WX 602 ; N uni2249 ; G 2133 +U 8778 ; WX 602 ; N uni224A ; G 2134 +U 8779 ; WX 602 ; N uni224B ; G 2135 +U 8780 ; WX 602 ; N uni224C ; G 2136 +U 8781 ; WX 602 ; N uni224D ; G 2137 +U 8782 ; WX 602 ; N uni224E ; G 2138 +U 8783 ; WX 602 ; N uni224F ; G 2139 +U 8784 ; WX 602 ; N uni2250 ; G 2140 +U 8785 ; WX 602 ; N uni2251 ; G 2141 +U 8786 ; WX 602 ; N uni2252 ; G 2142 +U 8787 ; WX 602 ; N uni2253 ; G 2143 +U 8788 ; WX 602 ; N uni2254 ; G 2144 +U 8789 ; WX 602 ; N uni2255 ; G 2145 +U 8790 ; WX 602 ; N uni2256 ; G 2146 +U 8791 ; WX 602 ; N uni2257 ; G 2147 +U 8792 ; WX 602 ; N uni2258 ; G 2148 +U 8793 ; WX 602 ; N uni2259 ; G 2149 +U 8794 ; WX 602 ; N uni225A ; G 2150 +U 8795 ; WX 602 ; N uni225B ; G 2151 +U 8796 ; WX 602 ; N uni225C ; G 2152 +U 8797 ; WX 602 ; N uni225D ; G 2153 +U 8798 ; WX 602 ; N uni225E ; G 2154 +U 8799 ; WX 602 ; N uni225F ; G 2155 +U 8800 ; WX 602 ; N notequal ; G 2156 +U 8801 ; WX 602 ; N equivalence ; G 2157 +U 8802 ; WX 602 ; N uni2262 ; G 2158 +U 8803 ; WX 602 ; N uni2263 ; G 2159 +U 8804 ; WX 602 ; N lessequal ; G 2160 +U 8805 ; WX 602 ; N greaterequal ; G 2161 +U 8806 ; WX 602 ; N uni2266 ; G 2162 +U 8807 ; WX 602 ; N uni2267 ; G 2163 +U 8808 ; WX 602 ; N uni2268 ; G 2164 +U 8809 ; WX 602 ; N uni2269 ; G 2165 +U 8813 ; WX 602 ; N uni226D ; G 2166 +U 8814 ; WX 602 ; N uni226E ; G 2167 +U 8815 ; WX 602 ; N uni226F ; G 2168 +U 8816 ; WX 602 ; N uni2270 ; G 2169 +U 8817 ; WX 602 ; N uni2271 ; G 2170 +U 8818 ; WX 602 ; N uni2272 ; G 2171 +U 8819 ; WX 602 ; N uni2273 ; G 2172 +U 8820 ; WX 602 ; N uni2274 ; G 2173 +U 8821 ; WX 602 ; N uni2275 ; G 2174 +U 8822 ; WX 602 ; N uni2276 ; G 2175 +U 8823 ; WX 602 ; N uni2277 ; G 2176 +U 8824 ; WX 602 ; N uni2278 ; G 2177 +U 8825 ; WX 602 ; N uni2279 ; G 2178 +U 8826 ; WX 602 ; N uni227A ; G 2179 +U 8827 ; WX 602 ; N uni227B ; G 2180 +U 8828 ; WX 602 ; N uni227C ; G 2181 +U 8829 ; WX 602 ; N uni227D ; G 2182 +U 8830 ; WX 602 ; N uni227E ; G 2183 +U 8831 ; WX 602 ; N uni227F ; G 2184 +U 8832 ; WX 602 ; N uni2280 ; G 2185 +U 8833 ; WX 602 ; N uni2281 ; G 2186 +U 8834 ; WX 602 ; N propersubset ; G 2187 +U 8835 ; WX 602 ; N propersuperset ; G 2188 +U 8836 ; WX 602 ; N notsubset ; G 2189 +U 8837 ; WX 602 ; N uni2285 ; G 2190 +U 8838 ; WX 602 ; N reflexsubset ; G 2191 +U 8839 ; WX 602 ; N reflexsuperset ; G 2192 +U 8840 ; WX 602 ; N uni2288 ; G 2193 +U 8841 ; WX 602 ; N uni2289 ; G 2194 +U 8842 ; WX 602 ; N uni228A ; G 2195 +U 8843 ; WX 602 ; N uni228B ; G 2196 +U 8845 ; WX 602 ; N uni228D ; G 2197 +U 8846 ; WX 602 ; N uni228E ; G 2198 +U 8847 ; WX 602 ; N uni228F ; G 2199 +U 8848 ; WX 602 ; N uni2290 ; G 2200 +U 8849 ; WX 602 ; N uni2291 ; G 2201 +U 8850 ; WX 602 ; N uni2292 ; G 2202 +U 8851 ; WX 602 ; N uni2293 ; G 2203 +U 8852 ; WX 602 ; N uni2294 ; G 2204 +U 8853 ; WX 602 ; N circleplus ; G 2205 +U 8854 ; WX 602 ; N uni2296 ; G 2206 +U 8855 ; WX 602 ; N circlemultiply ; G 2207 +U 8856 ; WX 602 ; N uni2298 ; G 2208 +U 8857 ; WX 602 ; N uni2299 ; G 2209 +U 8858 ; WX 602 ; N uni229A ; G 2210 +U 8859 ; WX 602 ; N uni229B ; G 2211 +U 8860 ; WX 602 ; N uni229C ; G 2212 +U 8861 ; WX 602 ; N uni229D ; G 2213 +U 8862 ; WX 602 ; N uni229E ; G 2214 +U 8863 ; WX 602 ; N uni229F ; G 2215 +U 8864 ; WX 602 ; N uni22A0 ; G 2216 +U 8865 ; WX 602 ; N uni22A1 ; G 2217 +U 8866 ; WX 602 ; N uni22A2 ; G 2218 +U 8867 ; WX 602 ; N uni22A3 ; G 2219 +U 8868 ; WX 602 ; N uni22A4 ; G 2220 +U 8869 ; WX 602 ; N perpendicular ; G 2221 +U 8882 ; WX 602 ; N uni22B2 ; G 2222 +U 8883 ; WX 602 ; N uni22B3 ; G 2223 +U 8884 ; WX 602 ; N uni22B4 ; G 2224 +U 8885 ; WX 602 ; N uni22B5 ; G 2225 +U 8888 ; WX 602 ; N uni22B8 ; G 2226 +U 8898 ; WX 602 ; N uni22C2 ; G 2227 +U 8899 ; WX 602 ; N uni22C3 ; G 2228 +U 8900 ; WX 602 ; N uni22C4 ; G 2229 +U 8901 ; WX 602 ; N dotmath ; G 2230 +U 8902 ; WX 602 ; N uni22C6 ; G 2231 +U 8909 ; WX 602 ; N uni22CD ; G 2232 +U 8910 ; WX 602 ; N uni22CE ; G 2233 +U 8911 ; WX 602 ; N uni22CF ; G 2234 +U 8912 ; WX 602 ; N uni22D0 ; G 2235 +U 8913 ; WX 602 ; N uni22D1 ; G 2236 +U 8922 ; WX 602 ; N uni22DA ; G 2237 +U 8923 ; WX 602 ; N uni22DB ; G 2238 +U 8924 ; WX 602 ; N uni22DC ; G 2239 +U 8925 ; WX 602 ; N uni22DD ; G 2240 +U 8926 ; WX 602 ; N uni22DE ; G 2241 +U 8927 ; WX 602 ; N uni22DF ; G 2242 +U 8928 ; WX 602 ; N uni22E0 ; G 2243 +U 8929 ; WX 602 ; N uni22E1 ; G 2244 +U 8930 ; WX 602 ; N uni22E2 ; G 2245 +U 8931 ; WX 602 ; N uni22E3 ; G 2246 +U 8932 ; WX 602 ; N uni22E4 ; G 2247 +U 8933 ; WX 602 ; N uni22E5 ; G 2248 +U 8934 ; WX 602 ; N uni22E6 ; G 2249 +U 8935 ; WX 602 ; N uni22E7 ; G 2250 +U 8936 ; WX 602 ; N uni22E8 ; G 2251 +U 8937 ; WX 602 ; N uni22E9 ; G 2252 +U 8943 ; WX 602 ; N uni22EF ; G 2253 +U 8960 ; WX 602 ; N uni2300 ; G 2254 +U 8961 ; WX 602 ; N uni2301 ; G 2255 +U 8962 ; WX 602 ; N house ; G 2256 +U 8963 ; WX 602 ; N uni2303 ; G 2257 +U 8964 ; WX 602 ; N uni2304 ; G 2258 +U 8965 ; WX 602 ; N uni2305 ; G 2259 +U 8966 ; WX 602 ; N uni2306 ; G 2260 +U 8968 ; WX 602 ; N uni2308 ; G 2261 +U 8969 ; WX 602 ; N uni2309 ; G 2262 +U 8970 ; WX 602 ; N uni230A ; G 2263 +U 8971 ; WX 602 ; N uni230B ; G 2264 +U 8972 ; WX 602 ; N uni230C ; G 2265 +U 8973 ; WX 602 ; N uni230D ; G 2266 +U 8974 ; WX 602 ; N uni230E ; G 2267 +U 8975 ; WX 602 ; N uni230F ; G 2268 +U 8976 ; WX 602 ; N revlogicalnot ; G 2269 +U 8977 ; WX 602 ; N uni2311 ; G 2270 +U 8978 ; WX 602 ; N uni2312 ; G 2271 +U 8979 ; WX 602 ; N uni2313 ; G 2272 +U 8980 ; WX 602 ; N uni2314 ; G 2273 +U 8981 ; WX 602 ; N uni2315 ; G 2274 +U 8984 ; WX 602 ; N uni2318 ; G 2275 +U 8985 ; WX 602 ; N uni2319 ; G 2276 +U 8988 ; WX 602 ; N uni231C ; G 2277 +U 8989 ; WX 602 ; N uni231D ; G 2278 +U 8990 ; WX 602 ; N uni231E ; G 2279 +U 8991 ; WX 602 ; N uni231F ; G 2280 +U 8992 ; WX 602 ; N integraltp ; G 2281 +U 8993 ; WX 602 ; N integralbt ; G 2282 +U 8997 ; WX 602 ; N uni2325 ; G 2283 +U 8998 ; WX 602 ; N uni2326 ; G 2284 +U 8999 ; WX 602 ; N uni2327 ; G 2285 +U 9000 ; WX 602 ; N uni2328 ; G 2286 +U 9003 ; WX 602 ; N uni232B ; G 2287 +U 9013 ; WX 602 ; N uni2335 ; G 2288 +U 9014 ; WX 602 ; N uni2336 ; G 2289 +U 9015 ; WX 602 ; N uni2337 ; G 2290 +U 9016 ; WX 602 ; N uni2338 ; G 2291 +U 9017 ; WX 602 ; N uni2339 ; G 2292 +U 9018 ; WX 602 ; N uni233A ; G 2293 +U 9019 ; WX 602 ; N uni233B ; G 2294 +U 9020 ; WX 602 ; N uni233C ; G 2295 +U 9021 ; WX 602 ; N uni233D ; G 2296 +U 9022 ; WX 602 ; N uni233E ; G 2297 +U 9023 ; WX 602 ; N uni233F ; G 2298 +U 9024 ; WX 602 ; N uni2340 ; G 2299 +U 9025 ; WX 602 ; N uni2341 ; G 2300 +U 9026 ; WX 602 ; N uni2342 ; G 2301 +U 9027 ; WX 602 ; N uni2343 ; G 2302 +U 9028 ; WX 602 ; N uni2344 ; G 2303 +U 9029 ; WX 602 ; N uni2345 ; G 2304 +U 9030 ; WX 602 ; N uni2346 ; G 2305 +U 9031 ; WX 602 ; N uni2347 ; G 2306 +U 9032 ; WX 602 ; N uni2348 ; G 2307 +U 9033 ; WX 602 ; N uni2349 ; G 2308 +U 9034 ; WX 602 ; N uni234A ; G 2309 +U 9035 ; WX 602 ; N uni234B ; G 2310 +U 9036 ; WX 602 ; N uni234C ; G 2311 +U 9037 ; WX 602 ; N uni234D ; G 2312 +U 9038 ; WX 602 ; N uni234E ; G 2313 +U 9039 ; WX 602 ; N uni234F ; G 2314 +U 9040 ; WX 602 ; N uni2350 ; G 2315 +U 9041 ; WX 602 ; N uni2351 ; G 2316 +U 9042 ; WX 602 ; N uni2352 ; G 2317 +U 9043 ; WX 602 ; N uni2353 ; G 2318 +U 9044 ; WX 602 ; N uni2354 ; G 2319 +U 9045 ; WX 602 ; N uni2355 ; G 2320 +U 9046 ; WX 602 ; N uni2356 ; G 2321 +U 9047 ; WX 602 ; N uni2357 ; G 2322 +U 9048 ; WX 602 ; N uni2358 ; G 2323 +U 9049 ; WX 602 ; N uni2359 ; G 2324 +U 9050 ; WX 602 ; N uni235A ; G 2325 +U 9051 ; WX 602 ; N uni235B ; G 2326 +U 9052 ; WX 602 ; N uni235C ; G 2327 +U 9053 ; WX 602 ; N uni235D ; G 2328 +U 9054 ; WX 602 ; N uni235E ; G 2329 +U 9055 ; WX 602 ; N uni235F ; G 2330 +U 9056 ; WX 602 ; N uni2360 ; G 2331 +U 9057 ; WX 602 ; N uni2361 ; G 2332 +U 9058 ; WX 602 ; N uni2362 ; G 2333 +U 9059 ; WX 602 ; N uni2363 ; G 2334 +U 9060 ; WX 602 ; N uni2364 ; G 2335 +U 9061 ; WX 602 ; N uni2365 ; G 2336 +U 9062 ; WX 602 ; N uni2366 ; G 2337 +U 9063 ; WX 602 ; N uni2367 ; G 2338 +U 9064 ; WX 602 ; N uni2368 ; G 2339 +U 9065 ; WX 602 ; N uni2369 ; G 2340 +U 9066 ; WX 602 ; N uni236A ; G 2341 +U 9067 ; WX 602 ; N uni236B ; G 2342 +U 9068 ; WX 602 ; N uni236C ; G 2343 +U 9069 ; WX 602 ; N uni236D ; G 2344 +U 9070 ; WX 602 ; N uni236E ; G 2345 +U 9071 ; WX 602 ; N uni236F ; G 2346 +U 9072 ; WX 602 ; N uni2370 ; G 2347 +U 9073 ; WX 602 ; N uni2371 ; G 2348 +U 9074 ; WX 602 ; N uni2372 ; G 2349 +U 9075 ; WX 602 ; N uni2373 ; G 2350 +U 9076 ; WX 602 ; N uni2374 ; G 2351 +U 9077 ; WX 602 ; N uni2375 ; G 2352 +U 9078 ; WX 602 ; N uni2376 ; G 2353 +U 9079 ; WX 602 ; N uni2377 ; G 2354 +U 9080 ; WX 602 ; N uni2378 ; G 2355 +U 9081 ; WX 602 ; N uni2379 ; G 2356 +U 9082 ; WX 602 ; N uni237A ; G 2357 +U 9085 ; WX 602 ; N uni237D ; G 2358 +U 9088 ; WX 602 ; N uni2380 ; G 2359 +U 9089 ; WX 602 ; N uni2381 ; G 2360 +U 9090 ; WX 602 ; N uni2382 ; G 2361 +U 9091 ; WX 602 ; N uni2383 ; G 2362 +U 9096 ; WX 602 ; N uni2388 ; G 2363 +U 9097 ; WX 602 ; N uni2389 ; G 2364 +U 9098 ; WX 602 ; N uni238A ; G 2365 +U 9099 ; WX 602 ; N uni238B ; G 2366 +U 9109 ; WX 602 ; N uni2395 ; G 2367 +U 9115 ; WX 602 ; N uni239B ; G 2368 +U 9116 ; WX 602 ; N uni239C ; G 2369 +U 9117 ; WX 602 ; N uni239D ; G 2370 +U 9118 ; WX 602 ; N uni239E ; G 2371 +U 9119 ; WX 602 ; N uni239F ; G 2372 +U 9120 ; WX 602 ; N uni23A0 ; G 2373 +U 9121 ; WX 602 ; N uni23A1 ; G 2374 +U 9122 ; WX 602 ; N uni23A2 ; G 2375 +U 9123 ; WX 602 ; N uni23A3 ; G 2376 +U 9124 ; WX 602 ; N uni23A4 ; G 2377 +U 9125 ; WX 602 ; N uni23A5 ; G 2378 +U 9126 ; WX 602 ; N uni23A6 ; G 2379 +U 9127 ; WX 602 ; N uni23A7 ; G 2380 +U 9128 ; WX 602 ; N uni23A8 ; G 2381 +U 9129 ; WX 602 ; N uni23A9 ; G 2382 +U 9130 ; WX 602 ; N uni23AA ; G 2383 +U 9131 ; WX 602 ; N uni23AB ; G 2384 +U 9132 ; WX 602 ; N uni23AC ; G 2385 +U 9133 ; WX 602 ; N uni23AD ; G 2386 +U 9134 ; WX 602 ; N uni23AE ; G 2387 +U 9166 ; WX 602 ; N uni23CE ; G 2388 +U 9167 ; WX 602 ; N uni23CF ; G 2389 +U 9251 ; WX 602 ; N uni2423 ; G 2390 +U 9472 ; WX 602 ; N SF100000 ; G 2391 +U 9473 ; WX 602 ; N uni2501 ; G 2392 +U 9474 ; WX 602 ; N SF110000 ; G 2393 +U 9475 ; WX 602 ; N uni2503 ; G 2394 +U 9476 ; WX 602 ; N uni2504 ; G 2395 +U 9477 ; WX 602 ; N uni2505 ; G 2396 +U 9478 ; WX 602 ; N uni2506 ; G 2397 +U 9479 ; WX 602 ; N uni2507 ; G 2398 +U 9480 ; WX 602 ; N uni2508 ; G 2399 +U 9481 ; WX 602 ; N uni2509 ; G 2400 +U 9482 ; WX 602 ; N uni250A ; G 2401 +U 9483 ; WX 602 ; N uni250B ; G 2402 +U 9484 ; WX 602 ; N SF010000 ; G 2403 +U 9485 ; WX 602 ; N uni250D ; G 2404 +U 9486 ; WX 602 ; N uni250E ; G 2405 +U 9487 ; WX 602 ; N uni250F ; G 2406 +U 9488 ; WX 602 ; N SF030000 ; G 2407 +U 9489 ; WX 602 ; N uni2511 ; G 2408 +U 9490 ; WX 602 ; N uni2512 ; G 2409 +U 9491 ; WX 602 ; N uni2513 ; G 2410 +U 9492 ; WX 602 ; N SF020000 ; G 2411 +U 9493 ; WX 602 ; N uni2515 ; G 2412 +U 9494 ; WX 602 ; N uni2516 ; G 2413 +U 9495 ; WX 602 ; N uni2517 ; G 2414 +U 9496 ; WX 602 ; N SF040000 ; G 2415 +U 9497 ; WX 602 ; N uni2519 ; G 2416 +U 9498 ; WX 602 ; N uni251A ; G 2417 +U 9499 ; WX 602 ; N uni251B ; G 2418 +U 9500 ; WX 602 ; N SF080000 ; G 2419 +U 9501 ; WX 602 ; N uni251D ; G 2420 +U 9502 ; WX 602 ; N uni251E ; G 2421 +U 9503 ; WX 602 ; N uni251F ; G 2422 +U 9504 ; WX 602 ; N uni2520 ; G 2423 +U 9505 ; WX 602 ; N uni2521 ; G 2424 +U 9506 ; WX 602 ; N uni2522 ; G 2425 +U 9507 ; WX 602 ; N uni2523 ; G 2426 +U 9508 ; WX 602 ; N SF090000 ; G 2427 +U 9509 ; WX 602 ; N uni2525 ; G 2428 +U 9510 ; WX 602 ; N uni2526 ; G 2429 +U 9511 ; WX 602 ; N uni2527 ; G 2430 +U 9512 ; WX 602 ; N uni2528 ; G 2431 +U 9513 ; WX 602 ; N uni2529 ; G 2432 +U 9514 ; WX 602 ; N uni252A ; G 2433 +U 9515 ; WX 602 ; N uni252B ; G 2434 +U 9516 ; WX 602 ; N SF060000 ; G 2435 +U 9517 ; WX 602 ; N uni252D ; G 2436 +U 9518 ; WX 602 ; N uni252E ; G 2437 +U 9519 ; WX 602 ; N uni252F ; G 2438 +U 9520 ; WX 602 ; N uni2530 ; G 2439 +U 9521 ; WX 602 ; N uni2531 ; G 2440 +U 9522 ; WX 602 ; N uni2532 ; G 2441 +U 9523 ; WX 602 ; N uni2533 ; G 2442 +U 9524 ; WX 602 ; N SF070000 ; G 2443 +U 9525 ; WX 602 ; N uni2535 ; G 2444 +U 9526 ; WX 602 ; N uni2536 ; G 2445 +U 9527 ; WX 602 ; N uni2537 ; G 2446 +U 9528 ; WX 602 ; N uni2538 ; G 2447 +U 9529 ; WX 602 ; N uni2539 ; G 2448 +U 9530 ; WX 602 ; N uni253A ; G 2449 +U 9531 ; WX 602 ; N uni253B ; G 2450 +U 9532 ; WX 602 ; N SF050000 ; G 2451 +U 9533 ; WX 602 ; N uni253D ; G 2452 +U 9534 ; WX 602 ; N uni253E ; G 2453 +U 9535 ; WX 602 ; N uni253F ; G 2454 +U 9536 ; WX 602 ; N uni2540 ; G 2455 +U 9537 ; WX 602 ; N uni2541 ; G 2456 +U 9538 ; WX 602 ; N uni2542 ; G 2457 +U 9539 ; WX 602 ; N uni2543 ; G 2458 +U 9540 ; WX 602 ; N uni2544 ; G 2459 +U 9541 ; WX 602 ; N uni2545 ; G 2460 +U 9542 ; WX 602 ; N uni2546 ; G 2461 +U 9543 ; WX 602 ; N uni2547 ; G 2462 +U 9544 ; WX 602 ; N uni2548 ; G 2463 +U 9545 ; WX 602 ; N uni2549 ; G 2464 +U 9546 ; WX 602 ; N uni254A ; G 2465 +U 9547 ; WX 602 ; N uni254B ; G 2466 +U 9548 ; WX 602 ; N uni254C ; G 2467 +U 9549 ; WX 602 ; N uni254D ; G 2468 +U 9550 ; WX 602 ; N uni254E ; G 2469 +U 9551 ; WX 602 ; N uni254F ; G 2470 +U 9552 ; WX 602 ; N SF430000 ; G 2471 +U 9553 ; WX 602 ; N SF240000 ; G 2472 +U 9554 ; WX 602 ; N SF510000 ; G 2473 +U 9555 ; WX 602 ; N SF520000 ; G 2474 +U 9556 ; WX 602 ; N SF390000 ; G 2475 +U 9557 ; WX 602 ; N SF220000 ; G 2476 +U 9558 ; WX 602 ; N SF210000 ; G 2477 +U 9559 ; WX 602 ; N SF250000 ; G 2478 +U 9560 ; WX 602 ; N SF500000 ; G 2479 +U 9561 ; WX 602 ; N SF490000 ; G 2480 +U 9562 ; WX 602 ; N SF380000 ; G 2481 +U 9563 ; WX 602 ; N SF280000 ; G 2482 +U 9564 ; WX 602 ; N SF270000 ; G 2483 +U 9565 ; WX 602 ; N SF260000 ; G 2484 +U 9566 ; WX 602 ; N SF360000 ; G 2485 +U 9567 ; WX 602 ; N SF370000 ; G 2486 +U 9568 ; WX 602 ; N SF420000 ; G 2487 +U 9569 ; WX 602 ; N SF190000 ; G 2488 +U 9570 ; WX 602 ; N SF200000 ; G 2489 +U 9571 ; WX 602 ; N SF230000 ; G 2490 +U 9572 ; WX 602 ; N SF470000 ; G 2491 +U 9573 ; WX 602 ; N SF480000 ; G 2492 +U 9574 ; WX 602 ; N SF410000 ; G 2493 +U 9575 ; WX 602 ; N SF450000 ; G 2494 +U 9576 ; WX 602 ; N SF460000 ; G 2495 +U 9577 ; WX 602 ; N SF400000 ; G 2496 +U 9578 ; WX 602 ; N SF540000 ; G 2497 +U 9579 ; WX 602 ; N SF530000 ; G 2498 +U 9580 ; WX 602 ; N SF440000 ; G 2499 +U 9581 ; WX 602 ; N uni256D ; G 2500 +U 9582 ; WX 602 ; N uni256E ; G 2501 +U 9583 ; WX 602 ; N uni256F ; G 2502 +U 9584 ; WX 602 ; N uni2570 ; G 2503 +U 9585 ; WX 602 ; N uni2571 ; G 2504 +U 9586 ; WX 602 ; N uni2572 ; G 2505 +U 9587 ; WX 602 ; N uni2573 ; G 2506 +U 9588 ; WX 602 ; N uni2574 ; G 2507 +U 9589 ; WX 602 ; N uni2575 ; G 2508 +U 9590 ; WX 602 ; N uni2576 ; G 2509 +U 9591 ; WX 602 ; N uni2577 ; G 2510 +U 9592 ; WX 602 ; N uni2578 ; G 2511 +U 9593 ; WX 602 ; N uni2579 ; G 2512 +U 9594 ; WX 602 ; N uni257A ; G 2513 +U 9595 ; WX 602 ; N uni257B ; G 2514 +U 9596 ; WX 602 ; N uni257C ; G 2515 +U 9597 ; WX 602 ; N uni257D ; G 2516 +U 9598 ; WX 602 ; N uni257E ; G 2517 +U 9599 ; WX 602 ; N uni257F ; G 2518 +U 9600 ; WX 602 ; N upblock ; G 2519 +U 9601 ; WX 602 ; N uni2581 ; G 2520 +U 9602 ; WX 602 ; N uni2582 ; G 2521 +U 9603 ; WX 602 ; N uni2583 ; G 2522 +U 9604 ; WX 602 ; N dnblock ; G 2523 +U 9605 ; WX 602 ; N uni2585 ; G 2524 +U 9606 ; WX 602 ; N uni2586 ; G 2525 +U 9607 ; WX 602 ; N uni2587 ; G 2526 +U 9608 ; WX 602 ; N block ; G 2527 +U 9609 ; WX 602 ; N uni2589 ; G 2528 +U 9610 ; WX 602 ; N uni258A ; G 2529 +U 9611 ; WX 602 ; N uni258B ; G 2530 +U 9612 ; WX 602 ; N lfblock ; G 2531 +U 9613 ; WX 602 ; N uni258D ; G 2532 +U 9614 ; WX 602 ; N uni258E ; G 2533 +U 9615 ; WX 602 ; N uni258F ; G 2534 +U 9616 ; WX 602 ; N rtblock ; G 2535 +U 9617 ; WX 602 ; N ltshade ; G 2536 +U 9618 ; WX 602 ; N shade ; G 2537 +U 9619 ; WX 602 ; N dkshade ; G 2538 +U 9620 ; WX 602 ; N uni2594 ; G 2539 +U 9621 ; WX 602 ; N uni2595 ; G 2540 +U 9622 ; WX 602 ; N uni2596 ; G 2541 +U 9623 ; WX 602 ; N uni2597 ; G 2542 +U 9624 ; WX 602 ; N uni2598 ; G 2543 +U 9625 ; WX 602 ; N uni2599 ; G 2544 +U 9626 ; WX 602 ; N uni259A ; G 2545 +U 9627 ; WX 602 ; N uni259B ; G 2546 +U 9628 ; WX 602 ; N uni259C ; G 2547 +U 9629 ; WX 602 ; N uni259D ; G 2548 +U 9630 ; WX 602 ; N uni259E ; G 2549 +U 9631 ; WX 602 ; N uni259F ; G 2550 +U 9632 ; WX 602 ; N filledbox ; G 2551 +U 9633 ; WX 602 ; N H22073 ; G 2552 +U 9634 ; WX 602 ; N uni25A2 ; G 2553 +U 9635 ; WX 602 ; N uni25A3 ; G 2554 +U 9636 ; WX 602 ; N uni25A4 ; G 2555 +U 9637 ; WX 602 ; N uni25A5 ; G 2556 +U 9638 ; WX 602 ; N uni25A6 ; G 2557 +U 9639 ; WX 602 ; N uni25A7 ; G 2558 +U 9640 ; WX 602 ; N uni25A8 ; G 2559 +U 9641 ; WX 602 ; N uni25A9 ; G 2560 +U 9642 ; WX 602 ; N H18543 ; G 2561 +U 9643 ; WX 602 ; N H18551 ; G 2562 +U 9644 ; WX 602 ; N filledrect ; G 2563 +U 9645 ; WX 602 ; N uni25AD ; G 2564 +U 9646 ; WX 602 ; N uni25AE ; G 2565 +U 9647 ; WX 602 ; N uni25AF ; G 2566 +U 9648 ; WX 602 ; N uni25B0 ; G 2567 +U 9649 ; WX 602 ; N uni25B1 ; G 2568 +U 9650 ; WX 602 ; N triagup ; G 2569 +U 9651 ; WX 602 ; N uni25B3 ; G 2570 +U 9652 ; WX 602 ; N uni25B4 ; G 2571 +U 9653 ; WX 602 ; N uni25B5 ; G 2572 +U 9654 ; WX 602 ; N uni25B6 ; G 2573 +U 9655 ; WX 602 ; N uni25B7 ; G 2574 +U 9656 ; WX 602 ; N uni25B8 ; G 2575 +U 9657 ; WX 602 ; N uni25B9 ; G 2576 +U 9658 ; WX 602 ; N triagrt ; G 2577 +U 9659 ; WX 602 ; N uni25BB ; G 2578 +U 9660 ; WX 602 ; N triagdn ; G 2579 +U 9661 ; WX 602 ; N uni25BD ; G 2580 +U 9662 ; WX 602 ; N uni25BE ; G 2581 +U 9663 ; WX 602 ; N uni25BF ; G 2582 +U 9664 ; WX 602 ; N uni25C0 ; G 2583 +U 9665 ; WX 602 ; N uni25C1 ; G 2584 +U 9666 ; WX 602 ; N uni25C2 ; G 2585 +U 9667 ; WX 602 ; N uni25C3 ; G 2586 +U 9668 ; WX 602 ; N triaglf ; G 2587 +U 9669 ; WX 602 ; N uni25C5 ; G 2588 +U 9670 ; WX 602 ; N uni25C6 ; G 2589 +U 9671 ; WX 602 ; N uni25C7 ; G 2590 +U 9672 ; WX 602 ; N uni25C8 ; G 2591 +U 9673 ; WX 602 ; N uni25C9 ; G 2592 +U 9674 ; WX 602 ; N lozenge ; G 2593 +U 9675 ; WX 602 ; N circle ; G 2594 +U 9676 ; WX 602 ; N uni25CC ; G 2595 +U 9677 ; WX 602 ; N uni25CD ; G 2596 +U 9678 ; WX 602 ; N uni25CE ; G 2597 +U 9679 ; WX 602 ; N H18533 ; G 2598 +U 9680 ; WX 602 ; N uni25D0 ; G 2599 +U 9681 ; WX 602 ; N uni25D1 ; G 2600 +U 9682 ; WX 602 ; N uni25D2 ; G 2601 +U 9683 ; WX 602 ; N uni25D3 ; G 2602 +U 9684 ; WX 602 ; N uni25D4 ; G 2603 +U 9685 ; WX 602 ; N uni25D5 ; G 2604 +U 9686 ; WX 602 ; N uni25D6 ; G 2605 +U 9687 ; WX 602 ; N uni25D7 ; G 2606 +U 9688 ; WX 602 ; N invbullet ; G 2607 +U 9689 ; WX 602 ; N invcircle ; G 2608 +U 9690 ; WX 602 ; N uni25DA ; G 2609 +U 9691 ; WX 602 ; N uni25DB ; G 2610 +U 9692 ; WX 602 ; N uni25DC ; G 2611 +U 9693 ; WX 602 ; N uni25DD ; G 2612 +U 9694 ; WX 602 ; N uni25DE ; G 2613 +U 9695 ; WX 602 ; N uni25DF ; G 2614 +U 9696 ; WX 602 ; N uni25E0 ; G 2615 +U 9697 ; WX 602 ; N uni25E1 ; G 2616 +U 9698 ; WX 602 ; N uni25E2 ; G 2617 +U 9699 ; WX 602 ; N uni25E3 ; G 2618 +U 9700 ; WX 602 ; N uni25E4 ; G 2619 +U 9701 ; WX 602 ; N uni25E5 ; G 2620 +U 9702 ; WX 602 ; N openbullet ; G 2621 +U 9703 ; WX 602 ; N uni25E7 ; G 2622 +U 9704 ; WX 602 ; N uni25E8 ; G 2623 +U 9705 ; WX 602 ; N uni25E9 ; G 2624 +U 9706 ; WX 602 ; N uni25EA ; G 2625 +U 9707 ; WX 602 ; N uni25EB ; G 2626 +U 9708 ; WX 602 ; N uni25EC ; G 2627 +U 9709 ; WX 602 ; N uni25ED ; G 2628 +U 9710 ; WX 602 ; N uni25EE ; G 2629 +U 9711 ; WX 602 ; N uni25EF ; G 2630 +U 9712 ; WX 602 ; N uni25F0 ; G 2631 +U 9713 ; WX 602 ; N uni25F1 ; G 2632 +U 9714 ; WX 602 ; N uni25F2 ; G 2633 +U 9715 ; WX 602 ; N uni25F3 ; G 2634 +U 9716 ; WX 602 ; N uni25F4 ; G 2635 +U 9717 ; WX 602 ; N uni25F5 ; G 2636 +U 9718 ; WX 602 ; N uni25F6 ; G 2637 +U 9719 ; WX 602 ; N uni25F7 ; G 2638 +U 9720 ; WX 602 ; N uni25F8 ; G 2639 +U 9721 ; WX 602 ; N uni25F9 ; G 2640 +U 9722 ; WX 602 ; N uni25FA ; G 2641 +U 9723 ; WX 602 ; N uni25FB ; G 2642 +U 9724 ; WX 602 ; N uni25FC ; G 2643 +U 9725 ; WX 602 ; N uni25FD ; G 2644 +U 9726 ; WX 602 ; N uni25FE ; G 2645 +U 9727 ; WX 602 ; N uni25FF ; G 2646 +U 9728 ; WX 602 ; N uni2600 ; G 2647 +U 9729 ; WX 602 ; N uni2601 ; G 2648 +U 9730 ; WX 602 ; N uni2602 ; G 2649 +U 9731 ; WX 602 ; N uni2603 ; G 2650 +U 9732 ; WX 602 ; N uni2604 ; G 2651 +U 9733 ; WX 602 ; N uni2605 ; G 2652 +U 9734 ; WX 602 ; N uni2606 ; G 2653 +U 9735 ; WX 602 ; N uni2607 ; G 2654 +U 9736 ; WX 602 ; N uni2608 ; G 2655 +U 9737 ; WX 602 ; N uni2609 ; G 2656 +U 9738 ; WX 602 ; N uni260A ; G 2657 +U 9739 ; WX 602 ; N uni260B ; G 2658 +U 9740 ; WX 602 ; N uni260C ; G 2659 +U 9741 ; WX 602 ; N uni260D ; G 2660 +U 9742 ; WX 602 ; N uni260E ; G 2661 +U 9743 ; WX 602 ; N uni260F ; G 2662 +U 9744 ; WX 602 ; N uni2610 ; G 2663 +U 9745 ; WX 602 ; N uni2611 ; G 2664 +U 9746 ; WX 602 ; N uni2612 ; G 2665 +U 9747 ; WX 602 ; N uni2613 ; G 2666 +U 9748 ; WX 602 ; N uni2614 ; G 2667 +U 9749 ; WX 602 ; N uni2615 ; G 2668 +U 9750 ; WX 602 ; N uni2616 ; G 2669 +U 9751 ; WX 602 ; N uni2617 ; G 2670 +U 9752 ; WX 602 ; N uni2618 ; G 2671 +U 9753 ; WX 602 ; N uni2619 ; G 2672 +U 9754 ; WX 602 ; N uni261A ; G 2673 +U 9755 ; WX 602 ; N uni261B ; G 2674 +U 9756 ; WX 602 ; N uni261C ; G 2675 +U 9757 ; WX 602 ; N uni261D ; G 2676 +U 9758 ; WX 602 ; N uni261E ; G 2677 +U 9759 ; WX 602 ; N uni261F ; G 2678 +U 9760 ; WX 602 ; N uni2620 ; G 2679 +U 9761 ; WX 602 ; N uni2621 ; G 2680 +U 9762 ; WX 602 ; N uni2622 ; G 2681 +U 9763 ; WX 602 ; N uni2623 ; G 2682 +U 9764 ; WX 602 ; N uni2624 ; G 2683 +U 9765 ; WX 602 ; N uni2625 ; G 2684 +U 9766 ; WX 602 ; N uni2626 ; G 2685 +U 9767 ; WX 602 ; N uni2627 ; G 2686 +U 9768 ; WX 602 ; N uni2628 ; G 2687 +U 9769 ; WX 602 ; N uni2629 ; G 2688 +U 9770 ; WX 602 ; N uni262A ; G 2689 +U 9771 ; WX 602 ; N uni262B ; G 2690 +U 9772 ; WX 602 ; N uni262C ; G 2691 +U 9773 ; WX 602 ; N uni262D ; G 2692 +U 9774 ; WX 602 ; N uni262E ; G 2693 +U 9775 ; WX 602 ; N uni262F ; G 2694 +U 9784 ; WX 602 ; N uni2638 ; G 2695 +U 9785 ; WX 602 ; N uni2639 ; G 2696 +U 9786 ; WX 602 ; N smileface ; G 2697 +U 9787 ; WX 602 ; N invsmileface ; G 2698 +U 9788 ; WX 602 ; N sun ; G 2699 +U 9789 ; WX 602 ; N uni263D ; G 2700 +U 9790 ; WX 602 ; N uni263E ; G 2701 +U 9791 ; WX 602 ; N uni263F ; G 2702 +U 9792 ; WX 602 ; N female ; G 2703 +U 9793 ; WX 602 ; N uni2641 ; G 2704 +U 9794 ; WX 602 ; N male ; G 2705 +U 9795 ; WX 602 ; N uni2643 ; G 2706 +U 9796 ; WX 602 ; N uni2644 ; G 2707 +U 9797 ; WX 602 ; N uni2645 ; G 2708 +U 9798 ; WX 602 ; N uni2646 ; G 2709 +U 9799 ; WX 602 ; N uni2647 ; G 2710 +U 9800 ; WX 602 ; N uni2648 ; G 2711 +U 9801 ; WX 602 ; N uni2649 ; G 2712 +U 9802 ; WX 602 ; N uni264A ; G 2713 +U 9803 ; WX 602 ; N uni264B ; G 2714 +U 9804 ; WX 602 ; N uni264C ; G 2715 +U 9805 ; WX 602 ; N uni264D ; G 2716 +U 9806 ; WX 602 ; N uni264E ; G 2717 +U 9807 ; WX 602 ; N uni264F ; G 2718 +U 9808 ; WX 602 ; N uni2650 ; G 2719 +U 9809 ; WX 602 ; N uni2651 ; G 2720 +U 9810 ; WX 602 ; N uni2652 ; G 2721 +U 9811 ; WX 602 ; N uni2653 ; G 2722 +U 9812 ; WX 602 ; N uni2654 ; G 2723 +U 9813 ; WX 602 ; N uni2655 ; G 2724 +U 9814 ; WX 602 ; N uni2656 ; G 2725 +U 9815 ; WX 602 ; N uni2657 ; G 2726 +U 9816 ; WX 602 ; N uni2658 ; G 2727 +U 9817 ; WX 602 ; N uni2659 ; G 2728 +U 9818 ; WX 602 ; N uni265A ; G 2729 +U 9819 ; WX 602 ; N uni265B ; G 2730 +U 9820 ; WX 602 ; N uni265C ; G 2731 +U 9821 ; WX 602 ; N uni265D ; G 2732 +U 9822 ; WX 602 ; N uni265E ; G 2733 +U 9823 ; WX 602 ; N uni265F ; G 2734 +U 9824 ; WX 602 ; N spade ; G 2735 +U 9825 ; WX 602 ; N uni2661 ; G 2736 +U 9826 ; WX 602 ; N uni2662 ; G 2737 +U 9827 ; WX 602 ; N club ; G 2738 +U 9828 ; WX 602 ; N uni2664 ; G 2739 +U 9829 ; WX 602 ; N heart ; G 2740 +U 9830 ; WX 602 ; N diamond ; G 2741 +U 9831 ; WX 602 ; N uni2667 ; G 2742 +U 9832 ; WX 602 ; N uni2668 ; G 2743 +U 9833 ; WX 602 ; N uni2669 ; G 2744 +U 9834 ; WX 602 ; N musicalnote ; G 2745 +U 9835 ; WX 602 ; N musicalnotedbl ; G 2746 +U 9836 ; WX 602 ; N uni266C ; G 2747 +U 9837 ; WX 602 ; N uni266D ; G 2748 +U 9838 ; WX 602 ; N uni266E ; G 2749 +U 9839 ; WX 602 ; N uni266F ; G 2750 +U 9840 ; WX 602 ; N uni2670 ; G 2751 +U 9841 ; WX 602 ; N uni2671 ; G 2752 +U 9842 ; WX 602 ; N uni2672 ; G 2753 +U 9843 ; WX 602 ; N uni2673 ; G 2754 +U 9844 ; WX 602 ; N uni2674 ; G 2755 +U 9845 ; WX 602 ; N uni2675 ; G 2756 +U 9846 ; WX 602 ; N uni2676 ; G 2757 +U 9847 ; WX 602 ; N uni2677 ; G 2758 +U 9848 ; WX 602 ; N uni2678 ; G 2759 +U 9849 ; WX 602 ; N uni2679 ; G 2760 +U 9850 ; WX 602 ; N uni267A ; G 2761 +U 9851 ; WX 602 ; N uni267B ; G 2762 +U 9852 ; WX 602 ; N uni267C ; G 2763 +U 9853 ; WX 602 ; N uni267D ; G 2764 +U 9854 ; WX 602 ; N uni267E ; G 2765 +U 9855 ; WX 602 ; N uni267F ; G 2766 +U 9856 ; WX 602 ; N uni2680 ; G 2767 +U 9857 ; WX 602 ; N uni2681 ; G 2768 +U 9858 ; WX 602 ; N uni2682 ; G 2769 +U 9859 ; WX 602 ; N uni2683 ; G 2770 +U 9860 ; WX 602 ; N uni2684 ; G 2771 +U 9861 ; WX 602 ; N uni2685 ; G 2772 +U 9862 ; WX 602 ; N uni2686 ; G 2773 +U 9863 ; WX 602 ; N uni2687 ; G 2774 +U 9864 ; WX 602 ; N uni2688 ; G 2775 +U 9865 ; WX 602 ; N uni2689 ; G 2776 +U 9866 ; WX 602 ; N uni268A ; G 2777 +U 9867 ; WX 602 ; N uni268B ; G 2778 +U 9872 ; WX 602 ; N uni2690 ; G 2779 +U 9873 ; WX 602 ; N uni2691 ; G 2780 +U 9874 ; WX 602 ; N uni2692 ; G 2781 +U 9875 ; WX 602 ; N uni2693 ; G 2782 +U 9876 ; WX 602 ; N uni2694 ; G 2783 +U 9877 ; WX 602 ; N uni2695 ; G 2784 +U 9878 ; WX 602 ; N uni2696 ; G 2785 +U 9879 ; WX 602 ; N uni2697 ; G 2786 +U 9880 ; WX 602 ; N uni2698 ; G 2787 +U 9881 ; WX 602 ; N uni2699 ; G 2788 +U 9882 ; WX 602 ; N uni269A ; G 2789 +U 9883 ; WX 602 ; N uni269B ; G 2790 +U 9884 ; WX 602 ; N uni269C ; G 2791 +U 9888 ; WX 602 ; N uni26A0 ; G 2792 +U 9889 ; WX 602 ; N uni26A1 ; G 2793 +U 9904 ; WX 602 ; N uni26B0 ; G 2794 +U 9905 ; WX 602 ; N uni26B1 ; G 2795 +U 9985 ; WX 602 ; N uni2701 ; G 2796 +U 9986 ; WX 602 ; N uni2702 ; G 2797 +U 9987 ; WX 602 ; N uni2703 ; G 2798 +U 9988 ; WX 602 ; N uni2704 ; G 2799 +U 9990 ; WX 602 ; N uni2706 ; G 2800 +U 9991 ; WX 602 ; N uni2707 ; G 2801 +U 9992 ; WX 602 ; N uni2708 ; G 2802 +U 9993 ; WX 602 ; N uni2709 ; G 2803 +U 9996 ; WX 602 ; N uni270C ; G 2804 +U 9997 ; WX 602 ; N uni270D ; G 2805 +U 9998 ; WX 602 ; N uni270E ; G 2806 +U 9999 ; WX 602 ; N uni270F ; G 2807 +U 10000 ; WX 602 ; N uni2710 ; G 2808 +U 10001 ; WX 602 ; N uni2711 ; G 2809 +U 10002 ; WX 602 ; N uni2712 ; G 2810 +U 10003 ; WX 602 ; N uni2713 ; G 2811 +U 10004 ; WX 602 ; N uni2714 ; G 2812 +U 10005 ; WX 602 ; N uni2715 ; G 2813 +U 10006 ; WX 602 ; N uni2716 ; G 2814 +U 10007 ; WX 602 ; N uni2717 ; G 2815 +U 10008 ; WX 602 ; N uni2718 ; G 2816 +U 10009 ; WX 602 ; N uni2719 ; G 2817 +U 10010 ; WX 602 ; N uni271A ; G 2818 +U 10011 ; WX 602 ; N uni271B ; G 2819 +U 10012 ; WX 602 ; N uni271C ; G 2820 +U 10013 ; WX 602 ; N uni271D ; G 2821 +U 10014 ; WX 602 ; N uni271E ; G 2822 +U 10015 ; WX 602 ; N uni271F ; G 2823 +U 10016 ; WX 602 ; N uni2720 ; G 2824 +U 10017 ; WX 602 ; N uni2721 ; G 2825 +U 10018 ; WX 602 ; N uni2722 ; G 2826 +U 10019 ; WX 602 ; N uni2723 ; G 2827 +U 10020 ; WX 602 ; N uni2724 ; G 2828 +U 10021 ; WX 602 ; N uni2725 ; G 2829 +U 10022 ; WX 602 ; N uni2726 ; G 2830 +U 10023 ; WX 602 ; N uni2727 ; G 2831 +U 10025 ; WX 602 ; N uni2729 ; G 2832 +U 10026 ; WX 602 ; N uni272A ; G 2833 +U 10027 ; WX 602 ; N uni272B ; G 2834 +U 10028 ; WX 602 ; N uni272C ; G 2835 +U 10029 ; WX 602 ; N uni272D ; G 2836 +U 10030 ; WX 602 ; N uni272E ; G 2837 +U 10031 ; WX 602 ; N uni272F ; G 2838 +U 10032 ; WX 602 ; N uni2730 ; G 2839 +U 10033 ; WX 602 ; N uni2731 ; G 2840 +U 10034 ; WX 602 ; N uni2732 ; G 2841 +U 10035 ; WX 602 ; N uni2733 ; G 2842 +U 10036 ; WX 602 ; N uni2734 ; G 2843 +U 10037 ; WX 602 ; N uni2735 ; G 2844 +U 10038 ; WX 602 ; N uni2736 ; G 2845 +U 10039 ; WX 602 ; N uni2737 ; G 2846 +U 10040 ; WX 602 ; N uni2738 ; G 2847 +U 10041 ; WX 602 ; N uni2739 ; G 2848 +U 10042 ; WX 602 ; N uni273A ; G 2849 +U 10043 ; WX 602 ; N uni273B ; G 2850 +U 10044 ; WX 602 ; N uni273C ; G 2851 +U 10045 ; WX 602 ; N uni273D ; G 2852 +U 10046 ; WX 602 ; N uni273E ; G 2853 +U 10047 ; WX 602 ; N uni273F ; G 2854 +U 10048 ; WX 602 ; N uni2740 ; G 2855 +U 10049 ; WX 602 ; N uni2741 ; G 2856 +U 10050 ; WX 602 ; N uni2742 ; G 2857 +U 10051 ; WX 602 ; N uni2743 ; G 2858 +U 10052 ; WX 602 ; N uni2744 ; G 2859 +U 10053 ; WX 602 ; N uni2745 ; G 2860 +U 10054 ; WX 602 ; N uni2746 ; G 2861 +U 10055 ; WX 602 ; N uni2747 ; G 2862 +U 10056 ; WX 602 ; N uni2748 ; G 2863 +U 10057 ; WX 602 ; N uni2749 ; G 2864 +U 10058 ; WX 602 ; N uni274A ; G 2865 +U 10059 ; WX 602 ; N uni274B ; G 2866 +U 10061 ; WX 602 ; N uni274D ; G 2867 +U 10063 ; WX 602 ; N uni274F ; G 2868 +U 10064 ; WX 602 ; N uni2750 ; G 2869 +U 10065 ; WX 602 ; N uni2751 ; G 2870 +U 10066 ; WX 602 ; N uni2752 ; G 2871 +U 10070 ; WX 602 ; N uni2756 ; G 2872 +U 10072 ; WX 602 ; N uni2758 ; G 2873 +U 10073 ; WX 602 ; N uni2759 ; G 2874 +U 10074 ; WX 602 ; N uni275A ; G 2875 +U 10075 ; WX 602 ; N uni275B ; G 2876 +U 10076 ; WX 602 ; N uni275C ; G 2877 +U 10077 ; WX 602 ; N uni275D ; G 2878 +U 10078 ; WX 602 ; N uni275E ; G 2879 +U 10081 ; WX 602 ; N uni2761 ; G 2880 +U 10082 ; WX 602 ; N uni2762 ; G 2881 +U 10083 ; WX 602 ; N uni2763 ; G 2882 +U 10084 ; WX 602 ; N uni2764 ; G 2883 +U 10085 ; WX 602 ; N uni2765 ; G 2884 +U 10086 ; WX 602 ; N uni2766 ; G 2885 +U 10087 ; WX 602 ; N uni2767 ; G 2886 +U 10088 ; WX 602 ; N uni2768 ; G 2887 +U 10089 ; WX 602 ; N uni2769 ; G 2888 +U 10090 ; WX 602 ; N uni276A ; G 2889 +U 10091 ; WX 602 ; N uni276B ; G 2890 +U 10092 ; WX 602 ; N uni276C ; G 2891 +U 10093 ; WX 602 ; N uni276D ; G 2892 +U 10094 ; WX 602 ; N uni276E ; G 2893 +U 10095 ; WX 602 ; N uni276F ; G 2894 +U 10096 ; WX 602 ; N uni2770 ; G 2895 +U 10097 ; WX 602 ; N uni2771 ; G 2896 +U 10098 ; WX 602 ; N uni2772 ; G 2897 +U 10099 ; WX 602 ; N uni2773 ; G 2898 +U 10100 ; WX 602 ; N uni2774 ; G 2899 +U 10101 ; WX 602 ; N uni2775 ; G 2900 +U 10132 ; WX 602 ; N uni2794 ; G 2901 +U 10136 ; WX 602 ; N uni2798 ; G 2902 +U 10137 ; WX 602 ; N uni2799 ; G 2903 +U 10138 ; WX 602 ; N uni279A ; G 2904 +U 10139 ; WX 602 ; N uni279B ; G 2905 +U 10140 ; WX 602 ; N uni279C ; G 2906 +U 10141 ; WX 602 ; N uni279D ; G 2907 +U 10142 ; WX 602 ; N uni279E ; G 2908 +U 10143 ; WX 602 ; N uni279F ; G 2909 +U 10144 ; WX 602 ; N uni27A0 ; G 2910 +U 10145 ; WX 602 ; N uni27A1 ; G 2911 +U 10146 ; WX 602 ; N uni27A2 ; G 2912 +U 10147 ; WX 602 ; N uni27A3 ; G 2913 +U 10148 ; WX 602 ; N uni27A4 ; G 2914 +U 10149 ; WX 602 ; N uni27A5 ; G 2915 +U 10150 ; WX 602 ; N uni27A6 ; G 2916 +U 10151 ; WX 602 ; N uni27A7 ; G 2917 +U 10152 ; WX 602 ; N uni27A8 ; G 2918 +U 10153 ; WX 602 ; N uni27A9 ; G 2919 +U 10154 ; WX 602 ; N uni27AA ; G 2920 +U 10155 ; WX 602 ; N uni27AB ; G 2921 +U 10156 ; WX 602 ; N uni27AC ; G 2922 +U 10157 ; WX 602 ; N uni27AD ; G 2923 +U 10158 ; WX 602 ; N uni27AE ; G 2924 +U 10159 ; WX 602 ; N uni27AF ; G 2925 +U 10161 ; WX 602 ; N uni27B1 ; G 2926 +U 10162 ; WX 602 ; N uni27B2 ; G 2927 +U 10163 ; WX 602 ; N uni27B3 ; G 2928 +U 10164 ; WX 602 ; N uni27B4 ; G 2929 +U 10165 ; WX 602 ; N uni27B5 ; G 2930 +U 10166 ; WX 602 ; N uni27B6 ; G 2931 +U 10167 ; WX 602 ; N uni27B7 ; G 2932 +U 10168 ; WX 602 ; N uni27B8 ; G 2933 +U 10169 ; WX 602 ; N uni27B9 ; G 2934 +U 10170 ; WX 602 ; N uni27BA ; G 2935 +U 10171 ; WX 602 ; N uni27BB ; G 2936 +U 10172 ; WX 602 ; N uni27BC ; G 2937 +U 10173 ; WX 602 ; N uni27BD ; G 2938 +U 10174 ; WX 602 ; N uni27BE ; G 2939 +U 10175 ; WX 602 ; N uni27BF ; G 2940 +U 10178 ; WX 602 ; N uni27C2 ; G 2941 +U 10181 ; WX 602 ; N uni27C5 ; G 2942 +U 10182 ; WX 602 ; N uni27C6 ; G 2943 +U 10204 ; WX 602 ; N uni27DC ; G 2944 +U 10208 ; WX 602 ; N uni27E0 ; G 2945 +U 10214 ; WX 602 ; N uni27E6 ; G 2946 +U 10215 ; WX 602 ; N uni27E7 ; G 2947 +U 10216 ; WX 602 ; N uni27E8 ; G 2948 +U 10217 ; WX 602 ; N uni27E9 ; G 2949 +U 10218 ; WX 602 ; N uni27EA ; G 2950 +U 10219 ; WX 602 ; N uni27EB ; G 2951 +U 10229 ; WX 602 ; N uni27F5 ; G 2952 +U 10230 ; WX 602 ; N uni27F6 ; G 2953 +U 10231 ; WX 602 ; N uni27F7 ; G 2954 +U 10631 ; WX 602 ; N uni2987 ; G 2955 +U 10632 ; WX 602 ; N uni2988 ; G 2956 +U 10647 ; WX 602 ; N uni2997 ; G 2957 +U 10648 ; WX 602 ; N uni2998 ; G 2958 +U 10731 ; WX 602 ; N uni29EB ; G 2959 +U 10746 ; WX 602 ; N uni29FA ; G 2960 +U 10747 ; WX 602 ; N uni29FB ; G 2961 +U 10752 ; WX 602 ; N uni2A00 ; G 2962 +U 10799 ; WX 602 ; N uni2A2F ; G 2963 +U 10858 ; WX 602 ; N uni2A6A ; G 2964 +U 10859 ; WX 602 ; N uni2A6B ; G 2965 +U 11013 ; WX 602 ; N uni2B05 ; G 2966 +U 11014 ; WX 602 ; N uni2B06 ; G 2967 +U 11015 ; WX 602 ; N uni2B07 ; G 2968 +U 11016 ; WX 602 ; N uni2B08 ; G 2969 +U 11017 ; WX 602 ; N uni2B09 ; G 2970 +U 11018 ; WX 602 ; N uni2B0A ; G 2971 +U 11019 ; WX 602 ; N uni2B0B ; G 2972 +U 11020 ; WX 602 ; N uni2B0C ; G 2973 +U 11021 ; WX 602 ; N uni2B0D ; G 2974 +U 11026 ; WX 602 ; N uni2B12 ; G 2975 +U 11027 ; WX 602 ; N uni2B13 ; G 2976 +U 11028 ; WX 602 ; N uni2B14 ; G 2977 +U 11029 ; WX 602 ; N uni2B15 ; G 2978 +U 11030 ; WX 602 ; N uni2B16 ; G 2979 +U 11031 ; WX 602 ; N uni2B17 ; G 2980 +U 11032 ; WX 602 ; N uni2B18 ; G 2981 +U 11033 ; WX 602 ; N uni2B19 ; G 2982 +U 11034 ; WX 602 ; N uni2B1A ; G 2983 +U 11364 ; WX 602 ; N uni2C64 ; G 2984 +U 11373 ; WX 602 ; N uni2C6D ; G 2985 +U 11374 ; WX 602 ; N uni2C6E ; G 2986 +U 11375 ; WX 602 ; N uni2C6F ; G 2987 +U 11376 ; WX 602 ; N uni2C70 ; G 2988 +U 11381 ; WX 602 ; N uni2C75 ; G 2989 +U 11382 ; WX 602 ; N uni2C76 ; G 2990 +U 11383 ; WX 602 ; N uni2C77 ; G 2991 +U 11385 ; WX 602 ; N uni2C79 ; G 2992 +U 11386 ; WX 602 ; N uni2C7A ; G 2993 +U 11388 ; WX 602 ; N uni2C7C ; G 2994 +U 11389 ; WX 602 ; N uni2C7D ; G 2995 +U 11390 ; WX 602 ; N uni2C7E ; G 2996 +U 11391 ; WX 602 ; N uni2C7F ; G 2997 +U 11800 ; WX 602 ; N uni2E18 ; G 2998 +U 11807 ; WX 602 ; N uni2E1F ; G 2999 +U 11810 ; WX 602 ; N uni2E22 ; G 3000 +U 11811 ; WX 602 ; N uni2E23 ; G 3001 +U 11812 ; WX 602 ; N uni2E24 ; G 3002 +U 11813 ; WX 602 ; N uni2E25 ; G 3003 +U 11822 ; WX 602 ; N uni2E2E ; G 3004 +U 42760 ; WX 602 ; N uniA708 ; G 3005 +U 42761 ; WX 602 ; N uniA709 ; G 3006 +U 42762 ; WX 602 ; N uniA70A ; G 3007 +U 42763 ; WX 602 ; N uniA70B ; G 3008 +U 42764 ; WX 602 ; N uniA70C ; G 3009 +U 42765 ; WX 602 ; N uniA70D ; G 3010 +U 42766 ; WX 602 ; N uniA70E ; G 3011 +U 42767 ; WX 602 ; N uniA70F ; G 3012 +U 42768 ; WX 602 ; N uniA710 ; G 3013 +U 42769 ; WX 602 ; N uniA711 ; G 3014 +U 42770 ; WX 602 ; N uniA712 ; G 3015 +U 42771 ; WX 602 ; N uniA713 ; G 3016 +U 42772 ; WX 602 ; N uniA714 ; G 3017 +U 42773 ; WX 602 ; N uniA715 ; G 3018 +U 42774 ; WX 602 ; N uniA716 ; G 3019 +U 42779 ; WX 602 ; N uniA71B ; G 3020 +U 42780 ; WX 602 ; N uniA71C ; G 3021 +U 42781 ; WX 602 ; N uniA71D ; G 3022 +U 42782 ; WX 602 ; N uniA71E ; G 3023 +U 42783 ; WX 602 ; N uniA71F ; G 3024 +U 42786 ; WX 602 ; N uniA722 ; G 3025 +U 42787 ; WX 602 ; N uniA723 ; G 3026 +U 42788 ; WX 602 ; N uniA724 ; G 3027 +U 42789 ; WX 602 ; N uniA725 ; G 3028 +U 42790 ; WX 602 ; N uniA726 ; G 3029 +U 42791 ; WX 602 ; N uniA727 ; G 3030 +U 42889 ; WX 602 ; N uniA789 ; G 3031 +U 42890 ; WX 602 ; N uniA78A ; G 3032 +U 42891 ; WX 602 ; N uniA78B ; G 3033 +U 42892 ; WX 602 ; N uniA78C ; G 3034 +U 42893 ; WX 602 ; N uniA78D ; G 3035 +U 42894 ; WX 602 ; N uniA78E ; G 3036 +U 42896 ; WX 602 ; N uniA790 ; G 3037 +U 42897 ; WX 602 ; N uniA791 ; G 3038 +U 42922 ; WX 602 ; N uniA7AA ; G 3039 +U 43000 ; WX 602 ; N uniA7F8 ; G 3040 +U 43001 ; WX 602 ; N uniA7F9 ; G 3041 +U 63173 ; WX 602 ; N uniF6C5 ; G 3042 +U 64257 ; WX 602 ; N fi ; G 3043 +U 64258 ; WX 602 ; N fl ; G 3044 +U 64338 ; WX 602 ; N uniFB52 ; G 3045 +U 64339 ; WX 602 ; N uniFB53 ; G 3046 +U 64340 ; WX 602 ; N uniFB54 ; G 3047 +U 64341 ; WX 602 ; N uniFB55 ; G 3048 +U 64342 ; WX 602 ; N uniFB56 ; G 3049 +U 64343 ; WX 602 ; N uniFB57 ; G 3050 +U 64344 ; WX 602 ; N uniFB58 ; G 3051 +U 64345 ; WX 602 ; N uniFB59 ; G 3052 +U 64346 ; WX 602 ; N uniFB5A ; G 3053 +U 64347 ; WX 602 ; N uniFB5B ; G 3054 +U 64348 ; WX 602 ; N uniFB5C ; G 3055 +U 64349 ; WX 602 ; N uniFB5D ; G 3056 +U 64350 ; WX 602 ; N uniFB5E ; G 3057 +U 64351 ; WX 602 ; N uniFB5F ; G 3058 +U 64352 ; WX 602 ; N uniFB60 ; G 3059 +U 64353 ; WX 602 ; N uniFB61 ; G 3060 +U 64354 ; WX 602 ; N uniFB62 ; G 3061 +U 64355 ; WX 602 ; N uniFB63 ; G 3062 +U 64356 ; WX 602 ; N uniFB64 ; G 3063 +U 64357 ; WX 602 ; N uniFB65 ; G 3064 +U 64358 ; WX 602 ; N uniFB66 ; G 3065 +U 64359 ; WX 602 ; N uniFB67 ; G 3066 +U 64360 ; WX 602 ; N uniFB68 ; G 3067 +U 64361 ; WX 602 ; N uniFB69 ; G 3068 +U 64362 ; WX 602 ; N uniFB6A ; G 3069 +U 64363 ; WX 602 ; N uniFB6B ; G 3070 +U 64364 ; WX 602 ; N uniFB6C ; G 3071 +U 64365 ; WX 602 ; N uniFB6D ; G 3072 +U 64366 ; WX 602 ; N uniFB6E ; G 3073 +U 64367 ; WX 602 ; N uniFB6F ; G 3074 +U 64368 ; WX 602 ; N uniFB70 ; G 3075 +U 64369 ; WX 602 ; N uniFB71 ; G 3076 +U 64370 ; WX 602 ; N uniFB72 ; G 3077 +U 64371 ; WX 602 ; N uniFB73 ; G 3078 +U 64372 ; WX 602 ; N uniFB74 ; G 3079 +U 64373 ; WX 602 ; N uniFB75 ; G 3080 +U 64374 ; WX 602 ; N uniFB76 ; G 3081 +U 64375 ; WX 602 ; N uniFB77 ; G 3082 +U 64376 ; WX 602 ; N uniFB78 ; G 3083 +U 64377 ; WX 602 ; N uniFB79 ; G 3084 +U 64378 ; WX 602 ; N uniFB7A ; G 3085 +U 64379 ; WX 602 ; N uniFB7B ; G 3086 +U 64380 ; WX 602 ; N uniFB7C ; G 3087 +U 64381 ; WX 602 ; N uniFB7D ; G 3088 +U 64382 ; WX 602 ; N uniFB7E ; G 3089 +U 64383 ; WX 602 ; N uniFB7F ; G 3090 +U 64384 ; WX 602 ; N uniFB80 ; G 3091 +U 64385 ; WX 602 ; N uniFB81 ; G 3092 +U 64394 ; WX 602 ; N uniFB8A ; G 3093 +U 64395 ; WX 602 ; N uniFB8B ; G 3094 +U 64396 ; WX 602 ; N uniFB8C ; G 3095 +U 64397 ; WX 602 ; N uniFB8D ; G 3096 +U 64398 ; WX 602 ; N uniFB8E ; G 3097 +U 64399 ; WX 602 ; N uniFB8F ; G 3098 +U 64400 ; WX 602 ; N uniFB90 ; G 3099 +U 64401 ; WX 602 ; N uniFB91 ; G 3100 +U 64402 ; WX 602 ; N uniFB92 ; G 3101 +U 64403 ; WX 602 ; N uniFB93 ; G 3102 +U 64404 ; WX 602 ; N uniFB94 ; G 3103 +U 64405 ; WX 602 ; N uniFB95 ; G 3104 +U 64414 ; WX 602 ; N uniFB9E ; G 3105 +U 64415 ; WX 602 ; N uniFB9F ; G 3106 +U 64426 ; WX 602 ; N uniFBAA ; G 3107 +U 64427 ; WX 602 ; N uniFBAB ; G 3108 +U 64428 ; WX 602 ; N uniFBAC ; G 3109 +U 64429 ; WX 602 ; N uniFBAD ; G 3110 +U 64488 ; WX 602 ; N uniFBE8 ; G 3111 +U 64489 ; WX 602 ; N uniFBE9 ; G 3112 +U 64508 ; WX 602 ; N uniFBFC ; G 3113 +U 64509 ; WX 602 ; N uniFBFD ; G 3114 +U 64510 ; WX 602 ; N uniFBFE ; G 3115 +U 64511 ; WX 602 ; N uniFBFF ; G 3116 +U 65136 ; WX 602 ; N uniFE70 ; G 3117 +U 65137 ; WX 602 ; N uniFE71 ; G 3118 +U 65138 ; WX 602 ; N uniFE72 ; G 3119 +U 65139 ; WX 602 ; N uniFE73 ; G 3120 +U 65140 ; WX 602 ; N uniFE74 ; G 3121 +U 65142 ; WX 602 ; N uniFE76 ; G 3122 +U 65143 ; WX 602 ; N uniFE77 ; G 3123 +U 65144 ; WX 602 ; N uniFE78 ; G 3124 +U 65145 ; WX 602 ; N uniFE79 ; G 3125 +U 65146 ; WX 602 ; N uniFE7A ; G 3126 +U 65147 ; WX 602 ; N uniFE7B ; G 3127 +U 65148 ; WX 602 ; N uniFE7C ; G 3128 +U 65149 ; WX 602 ; N uniFE7D ; G 3129 +U 65150 ; WX 602 ; N uniFE7E ; G 3130 +U 65151 ; WX 602 ; N uniFE7F ; G 3131 +U 65152 ; WX 602 ; N uniFE80 ; G 3132 +U 65153 ; WX 602 ; N uniFE81 ; G 3133 +U 65154 ; WX 602 ; N uniFE82 ; G 3134 +U 65155 ; WX 602 ; N uniFE83 ; G 3135 +U 65156 ; WX 602 ; N uniFE84 ; G 3136 +U 65157 ; WX 602 ; N uniFE85 ; G 3137 +U 65158 ; WX 602 ; N uniFE86 ; G 3138 +U 65159 ; WX 602 ; N uniFE87 ; G 3139 +U 65160 ; WX 602 ; N uniFE88 ; G 3140 +U 65161 ; WX 602 ; N uniFE89 ; G 3141 +U 65162 ; WX 602 ; N uniFE8A ; G 3142 +U 65163 ; WX 602 ; N uniFE8B ; G 3143 +U 65164 ; WX 602 ; N uniFE8C ; G 3144 +U 65165 ; WX 602 ; N uniFE8D ; G 3145 +U 65166 ; WX 602 ; N uniFE8E ; G 3146 +U 65167 ; WX 602 ; N uniFE8F ; G 3147 +U 65168 ; WX 602 ; N uniFE90 ; G 3148 +U 65169 ; WX 602 ; N uniFE91 ; G 3149 +U 65170 ; WX 602 ; N uniFE92 ; G 3150 +U 65171 ; WX 602 ; N uniFE93 ; G 3151 +U 65172 ; WX 602 ; N uniFE94 ; G 3152 +U 65173 ; WX 602 ; N uniFE95 ; G 3153 +U 65174 ; WX 602 ; N uniFE96 ; G 3154 +U 65175 ; WX 602 ; N uniFE97 ; G 3155 +U 65176 ; WX 602 ; N uniFE98 ; G 3156 +U 65177 ; WX 602 ; N uniFE99 ; G 3157 +U 65178 ; WX 602 ; N uniFE9A ; G 3158 +U 65179 ; WX 602 ; N uniFE9B ; G 3159 +U 65180 ; WX 602 ; N uniFE9C ; G 3160 +U 65181 ; WX 602 ; N uniFE9D ; G 3161 +U 65182 ; WX 602 ; N uniFE9E ; G 3162 +U 65183 ; WX 602 ; N uniFE9F ; G 3163 +U 65184 ; WX 602 ; N uniFEA0 ; G 3164 +U 65185 ; WX 602 ; N uniFEA1 ; G 3165 +U 65186 ; WX 602 ; N uniFEA2 ; G 3166 +U 65187 ; WX 602 ; N uniFEA3 ; G 3167 +U 65188 ; WX 602 ; N uniFEA4 ; G 3168 +U 65189 ; WX 602 ; N uniFEA5 ; G 3169 +U 65190 ; WX 602 ; N uniFEA6 ; G 3170 +U 65191 ; WX 602 ; N uniFEA7 ; G 3171 +U 65192 ; WX 602 ; N uniFEA8 ; G 3172 +U 65193 ; WX 602 ; N uniFEA9 ; G 3173 +U 65194 ; WX 602 ; N uniFEAA ; G 3174 +U 65195 ; WX 602 ; N uniFEAB ; G 3175 +U 65196 ; WX 602 ; N uniFEAC ; G 3176 +U 65197 ; WX 602 ; N uniFEAD ; G 3177 +U 65198 ; WX 602 ; N uniFEAE ; G 3178 +U 65199 ; WX 602 ; N uniFEAF ; G 3179 +U 65200 ; WX 602 ; N uniFEB0 ; G 3180 +U 65201 ; WX 602 ; N uniFEB1 ; G 3181 +U 65202 ; WX 602 ; N uniFEB2 ; G 3182 +U 65203 ; WX 602 ; N uniFEB3 ; G 3183 +U 65204 ; WX 602 ; N uniFEB4 ; G 3184 +U 65205 ; WX 602 ; N uniFEB5 ; G 3185 +U 65206 ; WX 602 ; N uniFEB6 ; G 3186 +U 65207 ; WX 602 ; N uniFEB7 ; G 3187 +U 65208 ; WX 602 ; N uniFEB8 ; G 3188 +U 65209 ; WX 602 ; N uniFEB9 ; G 3189 +U 65210 ; WX 602 ; N uniFEBA ; G 3190 +U 65211 ; WX 602 ; N uniFEBB ; G 3191 +U 65212 ; WX 602 ; N uniFEBC ; G 3192 +U 65213 ; WX 602 ; N uniFEBD ; G 3193 +U 65214 ; WX 602 ; N uniFEBE ; G 3194 +U 65215 ; WX 602 ; N uniFEBF ; G 3195 +U 65216 ; WX 602 ; N uniFEC0 ; G 3196 +U 65217 ; WX 602 ; N uniFEC1 ; G 3197 +U 65218 ; WX 602 ; N uniFEC2 ; G 3198 +U 65219 ; WX 602 ; N uniFEC3 ; G 3199 +U 65220 ; WX 602 ; N uniFEC4 ; G 3200 +U 65221 ; WX 602 ; N uniFEC5 ; G 3201 +U 65222 ; WX 602 ; N uniFEC6 ; G 3202 +U 65223 ; WX 602 ; N uniFEC7 ; G 3203 +U 65224 ; WX 602 ; N uniFEC8 ; G 3204 +U 65225 ; WX 602 ; N uniFEC9 ; G 3205 +U 65226 ; WX 602 ; N uniFECA ; G 3206 +U 65227 ; WX 602 ; N uniFECB ; G 3207 +U 65228 ; WX 602 ; N uniFECC ; G 3208 +U 65229 ; WX 602 ; N uniFECD ; G 3209 +U 65230 ; WX 602 ; N uniFECE ; G 3210 +U 65231 ; WX 602 ; N uniFECF ; G 3211 +U 65232 ; WX 602 ; N uniFED0 ; G 3212 +U 65233 ; WX 602 ; N uniFED1 ; G 3213 +U 65234 ; WX 602 ; N uniFED2 ; G 3214 +U 65235 ; WX 602 ; N uniFED3 ; G 3215 +U 65236 ; WX 602 ; N uniFED4 ; G 3216 +U 65237 ; WX 602 ; N uniFED5 ; G 3217 +U 65238 ; WX 602 ; N uniFED6 ; G 3218 +U 65239 ; WX 602 ; N uniFED7 ; G 3219 +U 65240 ; WX 602 ; N uniFED8 ; G 3220 +U 65241 ; WX 602 ; N uniFED9 ; G 3221 +U 65242 ; WX 602 ; N uniFEDA ; G 3222 +U 65243 ; WX 602 ; N uniFEDB ; G 3223 +U 65244 ; WX 602 ; N uniFEDC ; G 3224 +U 65245 ; WX 602 ; N uniFEDD ; G 3225 +U 65246 ; WX 602 ; N uniFEDE ; G 3226 +U 65247 ; WX 602 ; N uniFEDF ; G 3227 +U 65248 ; WX 602 ; N uniFEE0 ; G 3228 +U 65249 ; WX 602 ; N uniFEE1 ; G 3229 +U 65250 ; WX 602 ; N uniFEE2 ; G 3230 +U 65251 ; WX 602 ; N uniFEE3 ; G 3231 +U 65252 ; WX 602 ; N uniFEE4 ; G 3232 +U 65253 ; WX 602 ; N uniFEE5 ; G 3233 +U 65254 ; WX 602 ; N uniFEE6 ; G 3234 +U 65255 ; WX 602 ; N uniFEE7 ; G 3235 +U 65256 ; WX 602 ; N uniFEE8 ; G 3236 +U 65257 ; WX 602 ; N uniFEE9 ; G 3237 +U 65258 ; WX 602 ; N uniFEEA ; G 3238 +U 65259 ; WX 602 ; N uniFEEB ; G 3239 +U 65260 ; WX 602 ; N uniFEEC ; G 3240 +U 65261 ; WX 602 ; N uniFEED ; G 3241 +U 65262 ; WX 602 ; N uniFEEE ; G 3242 +U 65263 ; WX 602 ; N uniFEEF ; G 3243 +U 65264 ; WX 602 ; N uniFEF0 ; G 3244 +U 65265 ; WX 602 ; N uniFEF1 ; G 3245 +U 65266 ; WX 602 ; N uniFEF2 ; G 3246 +U 65267 ; WX 602 ; N uniFEF3 ; G 3247 +U 65268 ; WX 602 ; N uniFEF4 ; G 3248 +U 65269 ; WX 602 ; N uniFEF5 ; G 3249 +U 65270 ; WX 602 ; N uniFEF6 ; G 3250 +U 65271 ; WX 602 ; N uniFEF7 ; G 3251 +U 65272 ; WX 602 ; N uniFEF8 ; G 3252 +U 65273 ; WX 602 ; N uniFEF9 ; G 3253 +U 65274 ; WX 602 ; N uniFEFA ; G 3254 +U 65275 ; WX 602 ; N uniFEFB ; G 3255 +U 65276 ; WX 602 ; N uniFEFC ; G 3256 +U 65279 ; WX 602 ; N uniFEFF ; G 3257 +U 65529 ; WX 602 ; N uniFFF9 ; G 3258 +U 65530 ; WX 602 ; N uniFFFA ; G 3259 +U 65531 ; WX 602 ; N uniFFFB ; G 3260 +U 65532 ; WX 602 ; N uniFFFC ; G 3261 +U 65533 ; WX 602 ; N uniFFFD ; G 3262 +EndCharMetrics +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-BoldOblique.ttf b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-BoldOblique.ttf new file mode 100644 index 0000000..754dca7 Binary files /dev/null and b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-BoldOblique.ttf differ diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-BoldOblique.ufm b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-BoldOblique.ufm new file mode 100644 index 0000000..3ae612a --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-BoldOblique.ufm @@ -0,0 +1,2707 @@ +StartFontMetrics 4.1 +Notice Converted by PHP-font-lib +Comment https://github.com/PhenX/php-font-lib +EncodingScheme FontSpecific +FontName DejaVu Sans Mono +FontSubfamily Bold Oblique +UniqueID DejaVu Sans Mono Bold Oblique +FullName DejaVu Sans Mono Bold Oblique +Version Version 2.37 +PostScriptName DejaVuSansMono-BoldOblique +Manufacturer DejaVu fonts team +FontVendorURL http://dejavu.sourceforge.net +LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License +Weight Bold +ItalicAngle -11 +IsFixedPitch true +UnderlineThickness 44 +UnderlinePosition -63 +FontHeightOffset 0 +Ascender 928 +Descender -236 +FontBBox -425 -394 808 1008 +StartCharMetrics 2711 +U 32 ; WX 602 ; N space ; G 3 +U 33 ; WX 602 ; N exclam ; G 4 +U 34 ; WX 602 ; N quotedbl ; G 5 +U 35 ; WX 602 ; N numbersign ; G 6 +U 36 ; WX 602 ; N dollar ; G 7 +U 37 ; WX 602 ; N percent ; G 8 +U 38 ; WX 602 ; N ampersand ; G 9 +U 39 ; WX 602 ; N quotesingle ; G 10 +U 40 ; WX 602 ; N parenleft ; G 11 +U 41 ; WX 602 ; N parenright ; G 12 +U 42 ; WX 602 ; N asterisk ; G 13 +U 43 ; WX 602 ; N plus ; G 14 +U 44 ; WX 602 ; N comma ; G 15 +U 45 ; WX 602 ; N hyphen ; G 16 +U 46 ; WX 602 ; N period ; G 17 +U 47 ; WX 602 ; N slash ; G 18 +U 48 ; WX 602 ; N zero ; G 19 +U 49 ; WX 602 ; N one ; G 20 +U 50 ; WX 602 ; N two ; G 21 +U 51 ; WX 602 ; N three ; G 22 +U 52 ; WX 602 ; N four ; G 23 +U 53 ; WX 602 ; N five ; G 24 +U 54 ; WX 602 ; N six ; G 25 +U 55 ; WX 602 ; N seven ; G 26 +U 56 ; WX 602 ; N eight ; G 27 +U 57 ; WX 602 ; N nine ; G 28 +U 58 ; WX 602 ; N colon ; G 29 +U 59 ; WX 602 ; N semicolon ; G 30 +U 60 ; WX 602 ; N less ; G 31 +U 61 ; WX 602 ; N equal ; G 32 +U 62 ; WX 602 ; N greater ; G 33 +U 63 ; WX 602 ; N question ; G 34 +U 64 ; WX 602 ; N at ; G 35 +U 65 ; WX 602 ; N A ; G 36 +U 66 ; WX 602 ; N B ; G 37 +U 67 ; WX 602 ; N C ; G 38 +U 68 ; WX 602 ; N D ; G 39 +U 69 ; WX 602 ; N E ; G 40 +U 70 ; WX 602 ; N F ; G 41 +U 71 ; WX 602 ; N G ; G 42 +U 72 ; WX 602 ; N H ; G 43 +U 73 ; WX 602 ; N I ; G 44 +U 74 ; WX 602 ; N J ; G 45 +U 75 ; WX 602 ; N K ; G 46 +U 76 ; WX 602 ; N L ; G 47 +U 77 ; WX 602 ; N M ; G 48 +U 78 ; WX 602 ; N N ; G 49 +U 79 ; WX 602 ; N O ; G 50 +U 80 ; WX 602 ; N P ; G 51 +U 81 ; WX 602 ; N Q ; G 52 +U 82 ; WX 602 ; N R ; G 53 +U 83 ; WX 602 ; N S ; G 54 +U 84 ; WX 602 ; N T ; G 55 +U 85 ; WX 602 ; N U ; G 56 +U 86 ; WX 602 ; N V ; G 57 +U 87 ; WX 602 ; N W ; G 58 +U 88 ; WX 602 ; N X ; G 59 +U 89 ; WX 602 ; N Y ; G 60 +U 90 ; WX 602 ; N Z ; G 61 +U 91 ; WX 602 ; N bracketleft ; G 62 +U 92 ; WX 602 ; N backslash ; G 63 +U 93 ; WX 602 ; N bracketright ; G 64 +U 94 ; WX 602 ; N asciicircum ; G 65 +U 95 ; WX 602 ; N underscore ; G 66 +U 96 ; WX 602 ; N grave ; G 67 +U 97 ; WX 602 ; N a ; G 68 +U 98 ; WX 602 ; N b ; G 69 +U 99 ; WX 602 ; N c ; G 70 +U 100 ; WX 602 ; N d ; G 71 +U 101 ; WX 602 ; N e ; G 72 +U 102 ; WX 602 ; N f ; G 73 +U 103 ; WX 602 ; N g ; G 74 +U 104 ; WX 602 ; N h ; G 75 +U 105 ; WX 602 ; N i ; G 76 +U 106 ; WX 602 ; N j ; G 77 +U 107 ; WX 602 ; N k ; G 78 +U 108 ; WX 602 ; N l ; G 79 +U 109 ; WX 602 ; N m ; G 80 +U 110 ; WX 602 ; N n ; G 81 +U 111 ; WX 602 ; N o ; G 82 +U 112 ; WX 602 ; N p ; G 83 +U 113 ; WX 602 ; N q ; G 84 +U 114 ; WX 602 ; N r ; G 85 +U 115 ; WX 602 ; N s ; G 86 +U 116 ; WX 602 ; N t ; G 87 +U 117 ; WX 602 ; N u ; G 88 +U 118 ; WX 602 ; N v ; G 89 +U 119 ; WX 602 ; N w ; G 90 +U 120 ; WX 602 ; N x ; G 91 +U 121 ; WX 602 ; N y ; G 92 +U 122 ; WX 602 ; N z ; G 93 +U 123 ; WX 602 ; N braceleft ; G 94 +U 124 ; WX 602 ; N bar ; G 95 +U 125 ; WX 602 ; N braceright ; G 96 +U 126 ; WX 602 ; N asciitilde ; G 97 +U 160 ; WX 602 ; N nbspace ; G 98 +U 161 ; WX 602 ; N exclamdown ; G 99 +U 162 ; WX 602 ; N cent ; G 100 +U 163 ; WX 602 ; N sterling ; G 101 +U 164 ; WX 602 ; N currency ; G 102 +U 165 ; WX 602 ; N yen ; G 103 +U 166 ; WX 602 ; N brokenbar ; G 104 +U 167 ; WX 602 ; N section ; G 105 +U 168 ; WX 602 ; N dieresis ; G 106 +U 169 ; WX 602 ; N copyright ; G 107 +U 170 ; WX 602 ; N ordfeminine ; G 108 +U 171 ; WX 602 ; N guillemotleft ; G 109 +U 172 ; WX 602 ; N logicalnot ; G 110 +U 173 ; WX 602 ; N sfthyphen ; G 111 +U 174 ; WX 602 ; N registered ; G 112 +U 175 ; WX 602 ; N macron ; G 113 +U 176 ; WX 602 ; N degree ; G 114 +U 177 ; WX 602 ; N plusminus ; G 115 +U 178 ; WX 602 ; N twosuperior ; G 116 +U 179 ; WX 602 ; N threesuperior ; G 117 +U 180 ; WX 602 ; N acute ; G 118 +U 181 ; WX 602 ; N mu ; G 119 +U 182 ; WX 602 ; N paragraph ; G 120 +U 183 ; WX 602 ; N periodcentered ; G 121 +U 184 ; WX 602 ; N cedilla ; G 122 +U 185 ; WX 602 ; N onesuperior ; G 123 +U 186 ; WX 602 ; N ordmasculine ; G 124 +U 187 ; WX 602 ; N guillemotright ; G 125 +U 188 ; WX 602 ; N onequarter ; G 126 +U 189 ; WX 602 ; N onehalf ; G 127 +U 190 ; WX 602 ; N threequarters ; G 128 +U 191 ; WX 602 ; N questiondown ; G 129 +U 192 ; WX 602 ; N Agrave ; G 130 +U 193 ; WX 602 ; N Aacute ; G 131 +U 194 ; WX 602 ; N Acircumflex ; G 132 +U 195 ; WX 602 ; N Atilde ; G 133 +U 196 ; WX 602 ; N Adieresis ; G 134 +U 197 ; WX 602 ; N Aring ; G 135 +U 198 ; WX 602 ; N AE ; G 136 +U 199 ; WX 602 ; N Ccedilla ; G 137 +U 200 ; WX 602 ; N Egrave ; G 138 +U 201 ; WX 602 ; N Eacute ; G 139 +U 202 ; WX 602 ; N Ecircumflex ; G 140 +U 203 ; WX 602 ; N Edieresis ; G 141 +U 204 ; WX 602 ; N Igrave ; G 142 +U 205 ; WX 602 ; N Iacute ; G 143 +U 206 ; WX 602 ; N Icircumflex ; G 144 +U 207 ; WX 602 ; N Idieresis ; G 145 +U 208 ; WX 602 ; N Eth ; G 146 +U 209 ; WX 602 ; N Ntilde ; G 147 +U 210 ; WX 602 ; N Ograve ; G 148 +U 211 ; WX 602 ; N Oacute ; G 149 +U 212 ; WX 602 ; N Ocircumflex ; G 150 +U 213 ; WX 602 ; N Otilde ; G 151 +U 214 ; WX 602 ; N Odieresis ; G 152 +U 215 ; WX 602 ; N multiply ; G 153 +U 216 ; WX 602 ; N Oslash ; G 154 +U 217 ; WX 602 ; N Ugrave ; G 155 +U 218 ; WX 602 ; N Uacute ; G 156 +U 219 ; WX 602 ; N Ucircumflex ; G 157 +U 220 ; WX 602 ; N Udieresis ; G 158 +U 221 ; WX 602 ; N Yacute ; G 159 +U 222 ; WX 602 ; N Thorn ; G 160 +U 223 ; WX 602 ; N germandbls ; G 161 +U 224 ; WX 602 ; N agrave ; G 162 +U 225 ; WX 602 ; N aacute ; G 163 +U 226 ; WX 602 ; N acircumflex ; G 164 +U 227 ; WX 602 ; N atilde ; G 165 +U 228 ; WX 602 ; N adieresis ; G 166 +U 229 ; WX 602 ; N aring ; G 167 +U 230 ; WX 602 ; N ae ; G 168 +U 231 ; WX 602 ; N ccedilla ; G 169 +U 232 ; WX 602 ; N egrave ; G 170 +U 233 ; WX 602 ; N eacute ; G 171 +U 234 ; WX 602 ; N ecircumflex ; G 172 +U 235 ; WX 602 ; N edieresis ; G 173 +U 236 ; WX 602 ; N igrave ; G 174 +U 237 ; WX 602 ; N iacute ; G 175 +U 238 ; WX 602 ; N icircumflex ; G 176 +U 239 ; WX 602 ; N idieresis ; G 177 +U 240 ; WX 602 ; N eth ; G 178 +U 241 ; WX 602 ; N ntilde ; G 179 +U 242 ; WX 602 ; N ograve ; G 180 +U 243 ; WX 602 ; N oacute ; G 181 +U 244 ; WX 602 ; N ocircumflex ; G 182 +U 245 ; WX 602 ; N otilde ; G 183 +U 246 ; WX 602 ; N odieresis ; G 184 +U 247 ; WX 602 ; N divide ; G 185 +U 248 ; WX 602 ; N oslash ; G 186 +U 249 ; WX 602 ; N ugrave ; G 187 +U 250 ; WX 602 ; N uacute ; G 188 +U 251 ; WX 602 ; N ucircumflex ; G 189 +U 252 ; WX 602 ; N udieresis ; G 190 +U 253 ; WX 602 ; N yacute ; G 191 +U 254 ; WX 602 ; N thorn ; G 192 +U 255 ; WX 602 ; N ydieresis ; G 193 +U 256 ; WX 602 ; N Amacron ; G 194 +U 257 ; WX 602 ; N amacron ; G 195 +U 258 ; WX 602 ; N Abreve ; G 196 +U 259 ; WX 602 ; N abreve ; G 197 +U 260 ; WX 602 ; N Aogonek ; G 198 +U 261 ; WX 602 ; N aogonek ; G 199 +U 262 ; WX 602 ; N Cacute ; G 200 +U 263 ; WX 602 ; N cacute ; G 201 +U 264 ; WX 602 ; N Ccircumflex ; G 202 +U 265 ; WX 602 ; N ccircumflex ; G 203 +U 266 ; WX 602 ; N Cdotaccent ; G 204 +U 267 ; WX 602 ; N cdotaccent ; G 205 +U 268 ; WX 602 ; N Ccaron ; G 206 +U 269 ; WX 602 ; N ccaron ; G 207 +U 270 ; WX 602 ; N Dcaron ; G 208 +U 271 ; WX 602 ; N dcaron ; G 209 +U 272 ; WX 602 ; N Dcroat ; G 210 +U 273 ; WX 602 ; N dmacron ; G 211 +U 274 ; WX 602 ; N Emacron ; G 212 +U 275 ; WX 602 ; N emacron ; G 213 +U 276 ; WX 602 ; N Ebreve ; G 214 +U 277 ; WX 602 ; N ebreve ; G 215 +U 278 ; WX 602 ; N Edotaccent ; G 216 +U 279 ; WX 602 ; N edotaccent ; G 217 +U 280 ; WX 602 ; N Eogonek ; G 218 +U 281 ; WX 602 ; N eogonek ; G 219 +U 282 ; WX 602 ; N Ecaron ; G 220 +U 283 ; WX 602 ; N ecaron ; G 221 +U 284 ; WX 602 ; N Gcircumflex ; G 222 +U 285 ; WX 602 ; N gcircumflex ; G 223 +U 286 ; WX 602 ; N Gbreve ; G 224 +U 287 ; WX 602 ; N gbreve ; G 225 +U 288 ; WX 602 ; N Gdotaccent ; G 226 +U 289 ; WX 602 ; N gdotaccent ; G 227 +U 290 ; WX 602 ; N Gcommaaccent ; G 228 +U 291 ; WX 602 ; N gcommaaccent ; G 229 +U 292 ; WX 602 ; N Hcircumflex ; G 230 +U 293 ; WX 602 ; N hcircumflex ; G 231 +U 294 ; WX 602 ; N Hbar ; G 232 +U 295 ; WX 602 ; N hbar ; G 233 +U 296 ; WX 602 ; N Itilde ; G 234 +U 297 ; WX 602 ; N itilde ; G 235 +U 298 ; WX 602 ; N Imacron ; G 236 +U 299 ; WX 602 ; N imacron ; G 237 +U 300 ; WX 602 ; N Ibreve ; G 238 +U 301 ; WX 602 ; N ibreve ; G 239 +U 302 ; WX 602 ; N Iogonek ; G 240 +U 303 ; WX 602 ; N iogonek ; G 241 +U 304 ; WX 602 ; N Idot ; G 242 +U 305 ; WX 602 ; N dotlessi ; G 243 +U 306 ; WX 602 ; N IJ ; G 244 +U 307 ; WX 602 ; N ij ; G 245 +U 308 ; WX 602 ; N Jcircumflex ; G 246 +U 309 ; WX 602 ; N jcircumflex ; G 247 +U 310 ; WX 602 ; N Kcommaaccent ; G 248 +U 311 ; WX 602 ; N kcommaaccent ; G 249 +U 312 ; WX 602 ; N kgreenlandic ; G 250 +U 313 ; WX 602 ; N Lacute ; G 251 +U 314 ; WX 602 ; N lacute ; G 252 +U 315 ; WX 602 ; N Lcommaaccent ; G 253 +U 316 ; WX 602 ; N lcommaaccent ; G 254 +U 317 ; WX 602 ; N Lcaron ; G 255 +U 318 ; WX 602 ; N lcaron ; G 256 +U 319 ; WX 602 ; N Ldot ; G 257 +U 320 ; WX 602 ; N ldot ; G 258 +U 321 ; WX 602 ; N Lslash ; G 259 +U 322 ; WX 602 ; N lslash ; G 260 +U 323 ; WX 602 ; N Nacute ; G 261 +U 324 ; WX 602 ; N nacute ; G 262 +U 325 ; WX 602 ; N Ncommaaccent ; G 263 +U 326 ; WX 602 ; N ncommaaccent ; G 264 +U 327 ; WX 602 ; N Ncaron ; G 265 +U 328 ; WX 602 ; N ncaron ; G 266 +U 329 ; WX 602 ; N napostrophe ; G 267 +U 330 ; WX 602 ; N Eng ; G 268 +U 331 ; WX 602 ; N eng ; G 269 +U 332 ; WX 602 ; N Omacron ; G 270 +U 333 ; WX 602 ; N omacron ; G 271 +U 334 ; WX 602 ; N Obreve ; G 272 +U 335 ; WX 602 ; N obreve ; G 273 +U 336 ; WX 602 ; N Ohungarumlaut ; G 274 +U 337 ; WX 602 ; N ohungarumlaut ; G 275 +U 338 ; WX 602 ; N OE ; G 276 +U 339 ; WX 602 ; N oe ; G 277 +U 340 ; WX 602 ; N Racute ; G 278 +U 341 ; WX 602 ; N racute ; G 279 +U 342 ; WX 602 ; N Rcommaaccent ; G 280 +U 343 ; WX 602 ; N rcommaaccent ; G 281 +U 344 ; WX 602 ; N Rcaron ; G 282 +U 345 ; WX 602 ; N rcaron ; G 283 +U 346 ; WX 602 ; N Sacute ; G 284 +U 347 ; WX 602 ; N sacute ; G 285 +U 348 ; WX 602 ; N Scircumflex ; G 286 +U 349 ; WX 602 ; N scircumflex ; G 287 +U 350 ; WX 602 ; N Scedilla ; G 288 +U 351 ; WX 602 ; N scedilla ; G 289 +U 352 ; WX 602 ; N Scaron ; G 290 +U 353 ; WX 602 ; N scaron ; G 291 +U 354 ; WX 602 ; N Tcommaaccent ; G 292 +U 355 ; WX 602 ; N tcommaaccent ; G 293 +U 356 ; WX 602 ; N Tcaron ; G 294 +U 357 ; WX 602 ; N tcaron ; G 295 +U 358 ; WX 602 ; N Tbar ; G 296 +U 359 ; WX 602 ; N tbar ; G 297 +U 360 ; WX 602 ; N Utilde ; G 298 +U 361 ; WX 602 ; N utilde ; G 299 +U 362 ; WX 602 ; N Umacron ; G 300 +U 363 ; WX 602 ; N umacron ; G 301 +U 364 ; WX 602 ; N Ubreve ; G 302 +U 365 ; WX 602 ; N ubreve ; G 303 +U 366 ; WX 602 ; N Uring ; G 304 +U 367 ; WX 602 ; N uring ; G 305 +U 368 ; WX 602 ; N Uhungarumlaut ; G 306 +U 369 ; WX 602 ; N uhungarumlaut ; G 307 +U 370 ; WX 602 ; N Uogonek ; G 308 +U 371 ; WX 602 ; N uogonek ; G 309 +U 372 ; WX 602 ; N Wcircumflex ; G 310 +U 373 ; WX 602 ; N wcircumflex ; G 311 +U 374 ; WX 602 ; N Ycircumflex ; G 312 +U 375 ; WX 602 ; N ycircumflex ; G 313 +U 376 ; WX 602 ; N Ydieresis ; G 314 +U 377 ; WX 602 ; N Zacute ; G 315 +U 378 ; WX 602 ; N zacute ; G 316 +U 379 ; WX 602 ; N Zdotaccent ; G 317 +U 380 ; WX 602 ; N zdotaccent ; G 318 +U 381 ; WX 602 ; N Zcaron ; G 319 +U 382 ; WX 602 ; N zcaron ; G 320 +U 383 ; WX 602 ; N longs ; G 321 +U 384 ; WX 602 ; N uni0180 ; G 322 +U 385 ; WX 602 ; N uni0181 ; G 323 +U 386 ; WX 602 ; N uni0182 ; G 324 +U 387 ; WX 602 ; N uni0183 ; G 325 +U 388 ; WX 602 ; N uni0184 ; G 326 +U 389 ; WX 602 ; N uni0185 ; G 327 +U 390 ; WX 602 ; N uni0186 ; G 328 +U 391 ; WX 602 ; N uni0187 ; G 329 +U 392 ; WX 602 ; N uni0188 ; G 330 +U 393 ; WX 602 ; N uni0189 ; G 331 +U 394 ; WX 602 ; N uni018A ; G 332 +U 395 ; WX 602 ; N uni018B ; G 333 +U 396 ; WX 602 ; N uni018C ; G 334 +U 397 ; WX 602 ; N uni018D ; G 335 +U 398 ; WX 602 ; N uni018E ; G 336 +U 399 ; WX 602 ; N uni018F ; G 337 +U 400 ; WX 602 ; N uni0190 ; G 338 +U 401 ; WX 602 ; N uni0191 ; G 339 +U 402 ; WX 602 ; N florin ; G 340 +U 403 ; WX 602 ; N uni0193 ; G 341 +U 404 ; WX 602 ; N uni0194 ; G 342 +U 405 ; WX 602 ; N uni0195 ; G 343 +U 406 ; WX 602 ; N uni0196 ; G 344 +U 407 ; WX 602 ; N uni0197 ; G 345 +U 408 ; WX 602 ; N uni0198 ; G 346 +U 409 ; WX 602 ; N uni0199 ; G 347 +U 410 ; WX 602 ; N uni019A ; G 348 +U 411 ; WX 602 ; N uni019B ; G 349 +U 412 ; WX 602 ; N uni019C ; G 350 +U 413 ; WX 602 ; N uni019D ; G 351 +U 414 ; WX 602 ; N uni019E ; G 352 +U 415 ; WX 602 ; N uni019F ; G 353 +U 416 ; WX 602 ; N Ohorn ; G 354 +U 417 ; WX 602 ; N ohorn ; G 355 +U 418 ; WX 602 ; N uni01A2 ; G 356 +U 419 ; WX 602 ; N uni01A3 ; G 357 +U 420 ; WX 602 ; N uni01A4 ; G 358 +U 421 ; WX 602 ; N uni01A5 ; G 359 +U 422 ; WX 602 ; N uni01A6 ; G 360 +U 423 ; WX 602 ; N uni01A7 ; G 361 +U 424 ; WX 602 ; N uni01A8 ; G 362 +U 425 ; WX 602 ; N uni01A9 ; G 363 +U 426 ; WX 602 ; N uni01AA ; G 364 +U 427 ; WX 602 ; N uni01AB ; G 365 +U 428 ; WX 602 ; N uni01AC ; G 366 +U 429 ; WX 602 ; N uni01AD ; G 367 +U 430 ; WX 602 ; N uni01AE ; G 368 +U 431 ; WX 602 ; N Uhorn ; G 369 +U 432 ; WX 602 ; N uhorn ; G 370 +U 433 ; WX 602 ; N uni01B1 ; G 371 +U 434 ; WX 602 ; N uni01B2 ; G 372 +U 435 ; WX 602 ; N uni01B3 ; G 373 +U 436 ; WX 602 ; N uni01B4 ; G 374 +U 437 ; WX 602 ; N uni01B5 ; G 375 +U 438 ; WX 602 ; N uni01B6 ; G 376 +U 439 ; WX 602 ; N uni01B7 ; G 377 +U 440 ; WX 602 ; N uni01B8 ; G 378 +U 441 ; WX 602 ; N uni01B9 ; G 379 +U 442 ; WX 602 ; N uni01BA ; G 380 +U 443 ; WX 602 ; N uni01BB ; G 381 +U 444 ; WX 602 ; N uni01BC ; G 382 +U 445 ; WX 602 ; N uni01BD ; G 383 +U 446 ; WX 602 ; N uni01BE ; G 384 +U 447 ; WX 602 ; N uni01BF ; G 385 +U 448 ; WX 602 ; N uni01C0 ; G 386 +U 449 ; WX 602 ; N uni01C1 ; G 387 +U 450 ; WX 602 ; N uni01C2 ; G 388 +U 451 ; WX 602 ; N uni01C3 ; G 389 +U 461 ; WX 602 ; N uni01CD ; G 390 +U 462 ; WX 602 ; N uni01CE ; G 391 +U 463 ; WX 602 ; N uni01CF ; G 392 +U 464 ; WX 602 ; N uni01D0 ; G 393 +U 465 ; WX 602 ; N uni01D1 ; G 394 +U 466 ; WX 602 ; N uni01D2 ; G 395 +U 467 ; WX 602 ; N uni01D3 ; G 396 +U 468 ; WX 602 ; N uni01D4 ; G 397 +U 469 ; WX 602 ; N uni01D5 ; G 398 +U 470 ; WX 602 ; N uni01D6 ; G 399 +U 471 ; WX 602 ; N uni01D7 ; G 400 +U 472 ; WX 602 ; N uni01D8 ; G 401 +U 473 ; WX 602 ; N uni01D9 ; G 402 +U 474 ; WX 602 ; N uni01DA ; G 403 +U 475 ; WX 602 ; N uni01DB ; G 404 +U 476 ; WX 602 ; N uni01DC ; G 405 +U 477 ; WX 602 ; N uni01DD ; G 406 +U 478 ; WX 602 ; N uni01DE ; G 407 +U 479 ; WX 602 ; N uni01DF ; G 408 +U 480 ; WX 602 ; N uni01E0 ; G 409 +U 481 ; WX 602 ; N uni01E1 ; G 410 +U 482 ; WX 602 ; N uni01E2 ; G 411 +U 483 ; WX 602 ; N uni01E3 ; G 412 +U 486 ; WX 602 ; N Gcaron ; G 413 +U 487 ; WX 602 ; N gcaron ; G 414 +U 488 ; WX 602 ; N uni01E8 ; G 415 +U 489 ; WX 602 ; N uni01E9 ; G 416 +U 490 ; WX 602 ; N uni01EA ; G 417 +U 491 ; WX 602 ; N uni01EB ; G 418 +U 492 ; WX 602 ; N uni01EC ; G 419 +U 493 ; WX 602 ; N uni01ED ; G 420 +U 494 ; WX 602 ; N uni01EE ; G 421 +U 495 ; WX 602 ; N uni01EF ; G 422 +U 500 ; WX 602 ; N uni01F4 ; G 423 +U 501 ; WX 602 ; N uni01F5 ; G 424 +U 502 ; WX 602 ; N uni01F6 ; G 425 +U 504 ; WX 602 ; N uni01F8 ; G 426 +U 505 ; WX 602 ; N uni01F9 ; G 427 +U 508 ; WX 602 ; N AEacute ; G 428 +U 509 ; WX 602 ; N aeacute ; G 429 +U 510 ; WX 602 ; N Oslashacute ; G 430 +U 511 ; WX 602 ; N oslashacute ; G 431 +U 512 ; WX 602 ; N uni0200 ; G 432 +U 513 ; WX 602 ; N uni0201 ; G 433 +U 514 ; WX 602 ; N uni0202 ; G 434 +U 515 ; WX 602 ; N uni0203 ; G 435 +U 516 ; WX 602 ; N uni0204 ; G 436 +U 517 ; WX 602 ; N uni0205 ; G 437 +U 518 ; WX 602 ; N uni0206 ; G 438 +U 519 ; WX 602 ; N uni0207 ; G 439 +U 520 ; WX 602 ; N uni0208 ; G 440 +U 521 ; WX 602 ; N uni0209 ; G 441 +U 522 ; WX 602 ; N uni020A ; G 442 +U 523 ; WX 602 ; N uni020B ; G 443 +U 524 ; WX 602 ; N uni020C ; G 444 +U 525 ; WX 602 ; N uni020D ; G 445 +U 526 ; WX 602 ; N uni020E ; G 446 +U 527 ; WX 602 ; N uni020F ; G 447 +U 528 ; WX 602 ; N uni0210 ; G 448 +U 529 ; WX 602 ; N uni0211 ; G 449 +U 530 ; WX 602 ; N uni0212 ; G 450 +U 531 ; WX 602 ; N uni0213 ; G 451 +U 532 ; WX 602 ; N uni0214 ; G 452 +U 533 ; WX 602 ; N uni0215 ; G 453 +U 534 ; WX 602 ; N uni0216 ; G 454 +U 535 ; WX 602 ; N uni0217 ; G 455 +U 536 ; WX 602 ; N Scommaaccent ; G 456 +U 537 ; WX 602 ; N scommaaccent ; G 457 +U 538 ; WX 602 ; N uni021A ; G 458 +U 539 ; WX 602 ; N uni021B ; G 459 +U 540 ; WX 602 ; N uni021C ; G 460 +U 541 ; WX 602 ; N uni021D ; G 461 +U 542 ; WX 602 ; N uni021E ; G 462 +U 543 ; WX 602 ; N uni021F ; G 463 +U 545 ; WX 602 ; N uni0221 ; G 464 +U 548 ; WX 602 ; N uni0224 ; G 465 +U 549 ; WX 602 ; N uni0225 ; G 466 +U 550 ; WX 602 ; N uni0226 ; G 467 +U 551 ; WX 602 ; N uni0227 ; G 468 +U 552 ; WX 602 ; N uni0228 ; G 469 +U 553 ; WX 602 ; N uni0229 ; G 470 +U 554 ; WX 602 ; N uni022A ; G 471 +U 555 ; WX 602 ; N uni022B ; G 472 +U 556 ; WX 602 ; N uni022C ; G 473 +U 557 ; WX 602 ; N uni022D ; G 474 +U 558 ; WX 602 ; N uni022E ; G 475 +U 559 ; WX 602 ; N uni022F ; G 476 +U 560 ; WX 602 ; N uni0230 ; G 477 +U 561 ; WX 602 ; N uni0231 ; G 478 +U 562 ; WX 602 ; N uni0232 ; G 479 +U 563 ; WX 602 ; N uni0233 ; G 480 +U 564 ; WX 602 ; N uni0234 ; G 481 +U 565 ; WX 602 ; N uni0235 ; G 482 +U 566 ; WX 602 ; N uni0236 ; G 483 +U 567 ; WX 602 ; N dotlessj ; G 484 +U 568 ; WX 602 ; N uni0238 ; G 485 +U 569 ; WX 602 ; N uni0239 ; G 486 +U 570 ; WX 602 ; N uni023A ; G 487 +U 571 ; WX 602 ; N uni023B ; G 488 +U 572 ; WX 602 ; N uni023C ; G 489 +U 573 ; WX 602 ; N uni023D ; G 490 +U 574 ; WX 602 ; N uni023E ; G 491 +U 575 ; WX 602 ; N uni023F ; G 492 +U 576 ; WX 602 ; N uni0240 ; G 493 +U 577 ; WX 602 ; N uni0241 ; G 494 +U 579 ; WX 602 ; N uni0243 ; G 495 +U 580 ; WX 602 ; N uni0244 ; G 496 +U 581 ; WX 602 ; N uni0245 ; G 497 +U 588 ; WX 602 ; N uni024C ; G 498 +U 589 ; WX 602 ; N uni024D ; G 499 +U 592 ; WX 602 ; N uni0250 ; G 500 +U 593 ; WX 602 ; N uni0251 ; G 501 +U 594 ; WX 602 ; N uni0252 ; G 502 +U 595 ; WX 602 ; N uni0253 ; G 503 +U 596 ; WX 602 ; N uni0254 ; G 504 +U 597 ; WX 602 ; N uni0255 ; G 505 +U 598 ; WX 602 ; N uni0256 ; G 506 +U 599 ; WX 602 ; N uni0257 ; G 507 +U 600 ; WX 602 ; N uni0258 ; G 508 +U 601 ; WX 602 ; N uni0259 ; G 509 +U 602 ; WX 602 ; N uni025A ; G 510 +U 603 ; WX 602 ; N uni025B ; G 511 +U 604 ; WX 602 ; N uni025C ; G 512 +U 605 ; WX 602 ; N uni025D ; G 513 +U 606 ; WX 602 ; N uni025E ; G 514 +U 607 ; WX 602 ; N uni025F ; G 515 +U 608 ; WX 602 ; N uni0260 ; G 516 +U 609 ; WX 602 ; N uni0261 ; G 517 +U 610 ; WX 602 ; N uni0262 ; G 518 +U 611 ; WX 602 ; N uni0263 ; G 519 +U 612 ; WX 602 ; N uni0264 ; G 520 +U 613 ; WX 602 ; N uni0265 ; G 521 +U 614 ; WX 602 ; N uni0266 ; G 522 +U 615 ; WX 602 ; N uni0267 ; G 523 +U 616 ; WX 602 ; N uni0268 ; G 524 +U 617 ; WX 602 ; N uni0269 ; G 525 +U 618 ; WX 602 ; N uni026A ; G 526 +U 619 ; WX 602 ; N uni026B ; G 527 +U 620 ; WX 602 ; N uni026C ; G 528 +U 621 ; WX 602 ; N uni026D ; G 529 +U 622 ; WX 602 ; N uni026E ; G 530 +U 623 ; WX 602 ; N uni026F ; G 531 +U 624 ; WX 602 ; N uni0270 ; G 532 +U 625 ; WX 602 ; N uni0271 ; G 533 +U 626 ; WX 602 ; N uni0272 ; G 534 +U 627 ; WX 602 ; N uni0273 ; G 535 +U 628 ; WX 602 ; N uni0274 ; G 536 +U 629 ; WX 602 ; N uni0275 ; G 537 +U 630 ; WX 602 ; N uni0276 ; G 538 +U 631 ; WX 602 ; N uni0277 ; G 539 +U 632 ; WX 602 ; N uni0278 ; G 540 +U 633 ; WX 602 ; N uni0279 ; G 541 +U 634 ; WX 602 ; N uni027A ; G 542 +U 635 ; WX 602 ; N uni027B ; G 543 +U 636 ; WX 602 ; N uni027C ; G 544 +U 637 ; WX 602 ; N uni027D ; G 545 +U 638 ; WX 602 ; N uni027E ; G 546 +U 639 ; WX 602 ; N uni027F ; G 547 +U 640 ; WX 602 ; N uni0280 ; G 548 +U 641 ; WX 602 ; N uni0281 ; G 549 +U 642 ; WX 602 ; N uni0282 ; G 550 +U 643 ; WX 602 ; N uni0283 ; G 551 +U 644 ; WX 602 ; N uni0284 ; G 552 +U 645 ; WX 602 ; N uni0285 ; G 553 +U 646 ; WX 602 ; N uni0286 ; G 554 +U 647 ; WX 602 ; N uni0287 ; G 555 +U 648 ; WX 602 ; N uni0288 ; G 556 +U 649 ; WX 602 ; N uni0289 ; G 557 +U 650 ; WX 602 ; N uni028A ; G 558 +U 651 ; WX 602 ; N uni028B ; G 559 +U 652 ; WX 602 ; N uni028C ; G 560 +U 653 ; WX 602 ; N uni028D ; G 561 +U 654 ; WX 602 ; N uni028E ; G 562 +U 655 ; WX 602 ; N uni028F ; G 563 +U 656 ; WX 602 ; N uni0290 ; G 564 +U 657 ; WX 602 ; N uni0291 ; G 565 +U 658 ; WX 602 ; N uni0292 ; G 566 +U 659 ; WX 602 ; N uni0293 ; G 567 +U 660 ; WX 602 ; N uni0294 ; G 568 +U 661 ; WX 602 ; N uni0295 ; G 569 +U 662 ; WX 602 ; N uni0296 ; G 570 +U 663 ; WX 602 ; N uni0297 ; G 571 +U 664 ; WX 602 ; N uni0298 ; G 572 +U 665 ; WX 602 ; N uni0299 ; G 573 +U 666 ; WX 602 ; N uni029A ; G 574 +U 667 ; WX 602 ; N uni029B ; G 575 +U 668 ; WX 602 ; N uni029C ; G 576 +U 669 ; WX 602 ; N uni029D ; G 577 +U 670 ; WX 602 ; N uni029E ; G 578 +U 671 ; WX 602 ; N uni029F ; G 579 +U 672 ; WX 602 ; N uni02A0 ; G 580 +U 673 ; WX 602 ; N uni02A1 ; G 581 +U 674 ; WX 602 ; N uni02A2 ; G 582 +U 675 ; WX 602 ; N uni02A3 ; G 583 +U 676 ; WX 602 ; N uni02A4 ; G 584 +U 677 ; WX 602 ; N uni02A5 ; G 585 +U 678 ; WX 602 ; N uni02A6 ; G 586 +U 679 ; WX 602 ; N uni02A7 ; G 587 +U 680 ; WX 602 ; N uni02A8 ; G 588 +U 681 ; WX 602 ; N uni02A9 ; G 589 +U 682 ; WX 602 ; N uni02AA ; G 590 +U 683 ; WX 602 ; N uni02AB ; G 591 +U 684 ; WX 602 ; N uni02AC ; G 592 +U 685 ; WX 602 ; N uni02AD ; G 593 +U 686 ; WX 602 ; N uni02AE ; G 594 +U 687 ; WX 602 ; N uni02AF ; G 595 +U 688 ; WX 602 ; N uni02B0 ; G 596 +U 689 ; WX 602 ; N uni02B1 ; G 597 +U 690 ; WX 602 ; N uni02B2 ; G 598 +U 691 ; WX 602 ; N uni02B3 ; G 599 +U 692 ; WX 602 ; N uni02B4 ; G 600 +U 693 ; WX 602 ; N uni02B5 ; G 601 +U 694 ; WX 602 ; N uni02B6 ; G 602 +U 695 ; WX 602 ; N uni02B7 ; G 603 +U 696 ; WX 602 ; N uni02B8 ; G 604 +U 697 ; WX 602 ; N uni02B9 ; G 605 +U 699 ; WX 602 ; N uni02BB ; G 606 +U 700 ; WX 602 ; N uni02BC ; G 607 +U 701 ; WX 602 ; N uni02BD ; G 608 +U 702 ; WX 602 ; N uni02BE ; G 609 +U 703 ; WX 602 ; N uni02BF ; G 610 +U 704 ; WX 602 ; N uni02C0 ; G 611 +U 705 ; WX 602 ; N uni02C1 ; G 612 +U 710 ; WX 602 ; N circumflex ; G 613 +U 711 ; WX 602 ; N caron ; G 614 +U 712 ; WX 602 ; N uni02C8 ; G 615 +U 713 ; WX 602 ; N uni02C9 ; G 616 +U 716 ; WX 602 ; N uni02CC ; G 617 +U 717 ; WX 602 ; N uni02CD ; G 618 +U 718 ; WX 602 ; N uni02CE ; G 619 +U 719 ; WX 602 ; N uni02CF ; G 620 +U 720 ; WX 602 ; N uni02D0 ; G 621 +U 721 ; WX 602 ; N uni02D1 ; G 622 +U 722 ; WX 602 ; N uni02D2 ; G 623 +U 723 ; WX 602 ; N uni02D3 ; G 624 +U 726 ; WX 602 ; N uni02D6 ; G 625 +U 727 ; WX 602 ; N uni02D7 ; G 626 +U 728 ; WX 602 ; N breve ; G 627 +U 729 ; WX 602 ; N dotaccent ; G 628 +U 730 ; WX 602 ; N ring ; G 629 +U 731 ; WX 602 ; N ogonek ; G 630 +U 732 ; WX 602 ; N tilde ; G 631 +U 733 ; WX 602 ; N hungarumlaut ; G 632 +U 734 ; WX 602 ; N uni02DE ; G 633 +U 736 ; WX 602 ; N uni02E0 ; G 634 +U 737 ; WX 602 ; N uni02E1 ; G 635 +U 738 ; WX 602 ; N uni02E2 ; G 636 +U 739 ; WX 602 ; N uni02E3 ; G 637 +U 740 ; WX 602 ; N uni02E4 ; G 638 +U 741 ; WX 602 ; N uni02E5 ; G 639 +U 742 ; WX 602 ; N uni02E6 ; G 640 +U 743 ; WX 602 ; N uni02E7 ; G 641 +U 744 ; WX 602 ; N uni02E8 ; G 642 +U 745 ; WX 602 ; N uni02E9 ; G 643 +U 750 ; WX 602 ; N uni02EE ; G 644 +U 755 ; WX 602 ; N uni02F3 ; G 645 +U 768 ; WX 602 ; N gravecomb ; G 646 +U 769 ; WX 602 ; N acutecomb ; G 647 +U 770 ; WX 602 ; N uni0302 ; G 648 +U 771 ; WX 602 ; N tildecomb ; G 649 +U 772 ; WX 602 ; N uni0304 ; G 650 +U 773 ; WX 602 ; N uni0305 ; G 651 +U 774 ; WX 602 ; N uni0306 ; G 652 +U 775 ; WX 602 ; N uni0307 ; G 653 +U 776 ; WX 602 ; N uni0308 ; G 654 +U 777 ; WX 602 ; N hookabovecomb ; G 655 +U 778 ; WX 602 ; N uni030A ; G 656 +U 779 ; WX 602 ; N uni030B ; G 657 +U 780 ; WX 602 ; N uni030C ; G 658 +U 781 ; WX 602 ; N uni030D ; G 659 +U 782 ; WX 602 ; N uni030E ; G 660 +U 783 ; WX 602 ; N uni030F ; G 661 +U 784 ; WX 602 ; N uni0310 ; G 662 +U 785 ; WX 602 ; N uni0311 ; G 663 +U 786 ; WX 602 ; N uni0312 ; G 664 +U 787 ; WX 602 ; N uni0313 ; G 665 +U 788 ; WX 602 ; N uni0314 ; G 666 +U 789 ; WX 602 ; N uni0315 ; G 667 +U 790 ; WX 602 ; N uni0316 ; G 668 +U 791 ; WX 602 ; N uni0317 ; G 669 +U 792 ; WX 602 ; N uni0318 ; G 670 +U 793 ; WX 602 ; N uni0319 ; G 671 +U 794 ; WX 602 ; N uni031A ; G 672 +U 795 ; WX 602 ; N uni031B ; G 673 +U 796 ; WX 602 ; N uni031C ; G 674 +U 797 ; WX 602 ; N uni031D ; G 675 +U 798 ; WX 602 ; N uni031E ; G 676 +U 799 ; WX 602 ; N uni031F ; G 677 +U 800 ; WX 602 ; N uni0320 ; G 678 +U 801 ; WX 602 ; N uni0321 ; G 679 +U 802 ; WX 602 ; N uni0322 ; G 680 +U 803 ; WX 602 ; N dotbelowcomb ; G 681 +U 804 ; WX 602 ; N uni0324 ; G 682 +U 805 ; WX 602 ; N uni0325 ; G 683 +U 806 ; WX 602 ; N uni0326 ; G 684 +U 807 ; WX 602 ; N uni0327 ; G 685 +U 808 ; WX 602 ; N uni0328 ; G 686 +U 809 ; WX 602 ; N uni0329 ; G 687 +U 810 ; WX 602 ; N uni032A ; G 688 +U 811 ; WX 602 ; N uni032B ; G 689 +U 812 ; WX 602 ; N uni032C ; G 690 +U 813 ; WX 602 ; N uni032D ; G 691 +U 814 ; WX 602 ; N uni032E ; G 692 +U 815 ; WX 602 ; N uni032F ; G 693 +U 816 ; WX 602 ; N uni0330 ; G 694 +U 817 ; WX 602 ; N uni0331 ; G 695 +U 818 ; WX 602 ; N uni0332 ; G 696 +U 819 ; WX 602 ; N uni0333 ; G 697 +U 820 ; WX 602 ; N uni0334 ; G 698 +U 821 ; WX 602 ; N uni0335 ; G 699 +U 822 ; WX 602 ; N uni0336 ; G 700 +U 823 ; WX 602 ; N uni0337 ; G 701 +U 824 ; WX 602 ; N uni0338 ; G 702 +U 825 ; WX 602 ; N uni0339 ; G 703 +U 826 ; WX 602 ; N uni033A ; G 704 +U 827 ; WX 602 ; N uni033B ; G 705 +U 828 ; WX 602 ; N uni033C ; G 706 +U 829 ; WX 602 ; N uni033D ; G 707 +U 830 ; WX 602 ; N uni033E ; G 708 +U 831 ; WX 602 ; N uni033F ; G 709 +U 835 ; WX 602 ; N uni0343 ; G 710 +U 856 ; WX 602 ; N uni0358 ; G 711 +U 865 ; WX 602 ; N uni0361 ; G 712 +U 884 ; WX 602 ; N uni0374 ; G 713 +U 885 ; WX 602 ; N uni0375 ; G 714 +U 886 ; WX 602 ; N uni0376 ; G 715 +U 887 ; WX 602 ; N uni0377 ; G 716 +U 890 ; WX 602 ; N uni037A ; G 717 +U 891 ; WX 602 ; N uni037B ; G 718 +U 892 ; WX 602 ; N uni037C ; G 719 +U 893 ; WX 602 ; N uni037D ; G 720 +U 894 ; WX 602 ; N uni037E ; G 721 +U 895 ; WX 602 ; N uni037F ; G 722 +U 900 ; WX 602 ; N tonos ; G 723 +U 901 ; WX 602 ; N dieresistonos ; G 724 +U 902 ; WX 602 ; N Alphatonos ; G 725 +U 903 ; WX 602 ; N anoteleia ; G 726 +U 904 ; WX 602 ; N Epsilontonos ; G 727 +U 905 ; WX 602 ; N Etatonos ; G 728 +U 906 ; WX 602 ; N Iotatonos ; G 729 +U 908 ; WX 602 ; N Omicrontonos ; G 730 +U 910 ; WX 602 ; N Upsilontonos ; G 731 +U 911 ; WX 602 ; N Omegatonos ; G 732 +U 912 ; WX 602 ; N iotadieresistonos ; G 733 +U 913 ; WX 602 ; N Alpha ; G 734 +U 914 ; WX 602 ; N Beta ; G 735 +U 915 ; WX 602 ; N Gamma ; G 736 +U 916 ; WX 602 ; N uni0394 ; G 737 +U 917 ; WX 602 ; N Epsilon ; G 738 +U 918 ; WX 602 ; N Zeta ; G 739 +U 919 ; WX 602 ; N Eta ; G 740 +U 920 ; WX 602 ; N Theta ; G 741 +U 921 ; WX 602 ; N Iota ; G 742 +U 922 ; WX 602 ; N Kappa ; G 743 +U 923 ; WX 602 ; N Lambda ; G 744 +U 924 ; WX 602 ; N Mu ; G 745 +U 925 ; WX 602 ; N Nu ; G 746 +U 926 ; WX 602 ; N Xi ; G 747 +U 927 ; WX 602 ; N Omicron ; G 748 +U 928 ; WX 602 ; N Pi ; G 749 +U 929 ; WX 602 ; N Rho ; G 750 +U 931 ; WX 602 ; N Sigma ; G 751 +U 932 ; WX 602 ; N Tau ; G 752 +U 933 ; WX 602 ; N Upsilon ; G 753 +U 934 ; WX 602 ; N Phi ; G 754 +U 935 ; WX 602 ; N Chi ; G 755 +U 936 ; WX 602 ; N Psi ; G 756 +U 937 ; WX 602 ; N Omega ; G 757 +U 938 ; WX 602 ; N Iotadieresis ; G 758 +U 939 ; WX 602 ; N Upsilondieresis ; G 759 +U 940 ; WX 602 ; N alphatonos ; G 760 +U 941 ; WX 602 ; N epsilontonos ; G 761 +U 942 ; WX 602 ; N etatonos ; G 762 +U 943 ; WX 602 ; N iotatonos ; G 763 +U 944 ; WX 602 ; N upsilondieresistonos ; G 764 +U 945 ; WX 602 ; N alpha ; G 765 +U 946 ; WX 602 ; N beta ; G 766 +U 947 ; WX 602 ; N gamma ; G 767 +U 948 ; WX 602 ; N delta ; G 768 +U 949 ; WX 602 ; N epsilon ; G 769 +U 950 ; WX 602 ; N zeta ; G 770 +U 951 ; WX 602 ; N eta ; G 771 +U 952 ; WX 602 ; N theta ; G 772 +U 953 ; WX 602 ; N iota ; G 773 +U 954 ; WX 602 ; N kappa ; G 774 +U 955 ; WX 602 ; N lambda ; G 775 +U 956 ; WX 602 ; N uni03BC ; G 776 +U 957 ; WX 602 ; N nu ; G 777 +U 958 ; WX 602 ; N xi ; G 778 +U 959 ; WX 602 ; N omicron ; G 779 +U 960 ; WX 602 ; N pi ; G 780 +U 961 ; WX 602 ; N rho ; G 781 +U 962 ; WX 602 ; N sigma1 ; G 782 +U 963 ; WX 602 ; N sigma ; G 783 +U 964 ; WX 602 ; N tau ; G 784 +U 965 ; WX 602 ; N upsilon ; G 785 +U 966 ; WX 602 ; N phi ; G 786 +U 967 ; WX 602 ; N chi ; G 787 +U 968 ; WX 602 ; N psi ; G 788 +U 969 ; WX 602 ; N omega ; G 789 +U 970 ; WX 602 ; N iotadieresis ; G 790 +U 971 ; WX 602 ; N upsilondieresis ; G 791 +U 972 ; WX 602 ; N omicrontonos ; G 792 +U 973 ; WX 602 ; N upsilontonos ; G 793 +U 974 ; WX 602 ; N omegatonos ; G 794 +U 976 ; WX 602 ; N uni03D0 ; G 795 +U 977 ; WX 602 ; N theta1 ; G 796 +U 978 ; WX 602 ; N Upsilon1 ; G 797 +U 979 ; WX 602 ; N uni03D3 ; G 798 +U 980 ; WX 602 ; N uni03D4 ; G 799 +U 981 ; WX 602 ; N phi1 ; G 800 +U 982 ; WX 602 ; N omega1 ; G 801 +U 983 ; WX 602 ; N uni03D7 ; G 802 +U 984 ; WX 602 ; N uni03D8 ; G 803 +U 985 ; WX 602 ; N uni03D9 ; G 804 +U 986 ; WX 602 ; N uni03DA ; G 805 +U 987 ; WX 602 ; N uni03DB ; G 806 +U 988 ; WX 602 ; N uni03DC ; G 807 +U 989 ; WX 602 ; N uni03DD ; G 808 +U 990 ; WX 602 ; N uni03DE ; G 809 +U 991 ; WX 602 ; N uni03DF ; G 810 +U 992 ; WX 602 ; N uni03E0 ; G 811 +U 993 ; WX 602 ; N uni03E1 ; G 812 +U 1008 ; WX 602 ; N uni03F0 ; G 813 +U 1009 ; WX 602 ; N uni03F1 ; G 814 +U 1010 ; WX 602 ; N uni03F2 ; G 815 +U 1011 ; WX 602 ; N uni03F3 ; G 816 +U 1012 ; WX 602 ; N uni03F4 ; G 817 +U 1013 ; WX 602 ; N uni03F5 ; G 818 +U 1014 ; WX 602 ; N uni03F6 ; G 819 +U 1015 ; WX 602 ; N uni03F7 ; G 820 +U 1016 ; WX 602 ; N uni03F8 ; G 821 +U 1017 ; WX 602 ; N uni03F9 ; G 822 +U 1018 ; WX 602 ; N uni03FA ; G 823 +U 1019 ; WX 602 ; N uni03FB ; G 824 +U 1020 ; WX 602 ; N uni03FC ; G 825 +U 1021 ; WX 602 ; N uni03FD ; G 826 +U 1022 ; WX 602 ; N uni03FE ; G 827 +U 1023 ; WX 602 ; N uni03FF ; G 828 +U 1024 ; WX 602 ; N uni0400 ; G 829 +U 1025 ; WX 602 ; N uni0401 ; G 830 +U 1026 ; WX 602 ; N uni0402 ; G 831 +U 1027 ; WX 602 ; N uni0403 ; G 832 +U 1028 ; WX 602 ; N uni0404 ; G 833 +U 1029 ; WX 602 ; N uni0405 ; G 834 +U 1030 ; WX 602 ; N uni0406 ; G 835 +U 1031 ; WX 602 ; N uni0407 ; G 836 +U 1032 ; WX 602 ; N uni0408 ; G 837 +U 1033 ; WX 602 ; N uni0409 ; G 838 +U 1034 ; WX 602 ; N uni040A ; G 839 +U 1035 ; WX 602 ; N uni040B ; G 840 +U 1036 ; WX 602 ; N uni040C ; G 841 +U 1037 ; WX 602 ; N uni040D ; G 842 +U 1038 ; WX 602 ; N uni040E ; G 843 +U 1039 ; WX 602 ; N uni040F ; G 844 +U 1040 ; WX 602 ; N uni0410 ; G 845 +U 1041 ; WX 602 ; N uni0411 ; G 846 +U 1042 ; WX 602 ; N uni0412 ; G 847 +U 1043 ; WX 602 ; N uni0413 ; G 848 +U 1044 ; WX 602 ; N uni0414 ; G 849 +U 1045 ; WX 602 ; N uni0415 ; G 850 +U 1046 ; WX 602 ; N uni0416 ; G 851 +U 1047 ; WX 602 ; N uni0417 ; G 852 +U 1048 ; WX 602 ; N uni0418 ; G 853 +U 1049 ; WX 602 ; N uni0419 ; G 854 +U 1050 ; WX 602 ; N uni041A ; G 855 +U 1051 ; WX 602 ; N uni041B ; G 856 +U 1052 ; WX 602 ; N uni041C ; G 857 +U 1053 ; WX 602 ; N uni041D ; G 858 +U 1054 ; WX 602 ; N uni041E ; G 859 +U 1055 ; WX 602 ; N uni041F ; G 860 +U 1056 ; WX 602 ; N uni0420 ; G 861 +U 1057 ; WX 602 ; N uni0421 ; G 862 +U 1058 ; WX 602 ; N uni0422 ; G 863 +U 1059 ; WX 602 ; N uni0423 ; G 864 +U 1060 ; WX 602 ; N uni0424 ; G 865 +U 1061 ; WX 602 ; N uni0425 ; G 866 +U 1062 ; WX 602 ; N uni0426 ; G 867 +U 1063 ; WX 602 ; N uni0427 ; G 868 +U 1064 ; WX 602 ; N uni0428 ; G 869 +U 1065 ; WX 602 ; N uni0429 ; G 870 +U 1066 ; WX 602 ; N uni042A ; G 871 +U 1067 ; WX 602 ; N uni042B ; G 872 +U 1068 ; WX 602 ; N uni042C ; G 873 +U 1069 ; WX 602 ; N uni042D ; G 874 +U 1070 ; WX 602 ; N uni042E ; G 875 +U 1071 ; WX 602 ; N uni042F ; G 876 +U 1072 ; WX 602 ; N uni0430 ; G 877 +U 1073 ; WX 602 ; N uni0431 ; G 878 +U 1074 ; WX 602 ; N uni0432 ; G 879 +U 1075 ; WX 602 ; N uni0433 ; G 880 +U 1076 ; WX 602 ; N uni0434 ; G 881 +U 1077 ; WX 602 ; N uni0435 ; G 882 +U 1078 ; WX 602 ; N uni0436 ; G 883 +U 1079 ; WX 602 ; N uni0437 ; G 884 +U 1080 ; WX 602 ; N uni0438 ; G 885 +U 1081 ; WX 602 ; N uni0439 ; G 886 +U 1082 ; WX 602 ; N uni043A ; G 887 +U 1083 ; WX 602 ; N uni043B ; G 888 +U 1084 ; WX 602 ; N uni043C ; G 889 +U 1085 ; WX 602 ; N uni043D ; G 890 +U 1086 ; WX 602 ; N uni043E ; G 891 +U 1087 ; WX 602 ; N uni043F ; G 892 +U 1088 ; WX 602 ; N uni0440 ; G 893 +U 1089 ; WX 602 ; N uni0441 ; G 894 +U 1090 ; WX 602 ; N uni0442 ; G 895 +U 1091 ; WX 602 ; N uni0443 ; G 896 +U 1092 ; WX 602 ; N uni0444 ; G 897 +U 1093 ; WX 602 ; N uni0445 ; G 898 +U 1094 ; WX 602 ; N uni0446 ; G 899 +U 1095 ; WX 602 ; N uni0447 ; G 900 +U 1096 ; WX 602 ; N uni0448 ; G 901 +U 1097 ; WX 602 ; N uni0449 ; G 902 +U 1098 ; WX 602 ; N uni044A ; G 903 +U 1099 ; WX 602 ; N uni044B ; G 904 +U 1100 ; WX 602 ; N uni044C ; G 905 +U 1101 ; WX 602 ; N uni044D ; G 906 +U 1102 ; WX 602 ; N uni044E ; G 907 +U 1103 ; WX 602 ; N uni044F ; G 908 +U 1104 ; WX 602 ; N uni0450 ; G 909 +U 1105 ; WX 602 ; N uni0451 ; G 910 +U 1106 ; WX 602 ; N uni0452 ; G 911 +U 1107 ; WX 602 ; N uni0453 ; G 912 +U 1108 ; WX 602 ; N uni0454 ; G 913 +U 1109 ; WX 602 ; N uni0455 ; G 914 +U 1110 ; WX 602 ; N uni0456 ; G 915 +U 1111 ; WX 602 ; N uni0457 ; G 916 +U 1112 ; WX 602 ; N uni0458 ; G 917 +U 1113 ; WX 602 ; N uni0459 ; G 918 +U 1114 ; WX 602 ; N uni045A ; G 919 +U 1115 ; WX 602 ; N uni045B ; G 920 +U 1116 ; WX 602 ; N uni045C ; G 921 +U 1117 ; WX 602 ; N uni045D ; G 922 +U 1118 ; WX 602 ; N uni045E ; G 923 +U 1119 ; WX 602 ; N uni045F ; G 924 +U 1122 ; WX 602 ; N uni0462 ; G 925 +U 1123 ; WX 602 ; N uni0463 ; G 926 +U 1138 ; WX 602 ; N uni0472 ; G 927 +U 1139 ; WX 602 ; N uni0473 ; G 928 +U 1168 ; WX 602 ; N uni0490 ; G 929 +U 1169 ; WX 602 ; N uni0491 ; G 930 +U 1170 ; WX 602 ; N uni0492 ; G 931 +U 1171 ; WX 602 ; N uni0493 ; G 932 +U 1172 ; WX 602 ; N uni0494 ; G 933 +U 1173 ; WX 602 ; N uni0495 ; G 934 +U 1174 ; WX 602 ; N uni0496 ; G 935 +U 1175 ; WX 602 ; N uni0497 ; G 936 +U 1176 ; WX 602 ; N uni0498 ; G 937 +U 1177 ; WX 602 ; N uni0499 ; G 938 +U 1178 ; WX 602 ; N uni049A ; G 939 +U 1179 ; WX 602 ; N uni049B ; G 940 +U 1186 ; WX 602 ; N uni04A2 ; G 941 +U 1187 ; WX 602 ; N uni04A3 ; G 942 +U 1188 ; WX 602 ; N uni04A4 ; G 943 +U 1189 ; WX 602 ; N uni04A5 ; G 944 +U 1194 ; WX 602 ; N uni04AA ; G 945 +U 1195 ; WX 602 ; N uni04AB ; G 946 +U 1196 ; WX 602 ; N uni04AC ; G 947 +U 1197 ; WX 602 ; N uni04AD ; G 948 +U 1198 ; WX 602 ; N uni04AE ; G 949 +U 1199 ; WX 602 ; N uni04AF ; G 950 +U 1200 ; WX 602 ; N uni04B0 ; G 951 +U 1201 ; WX 602 ; N uni04B1 ; G 952 +U 1202 ; WX 602 ; N uni04B2 ; G 953 +U 1203 ; WX 602 ; N uni04B3 ; G 954 +U 1210 ; WX 602 ; N uni04BA ; G 955 +U 1211 ; WX 602 ; N uni04BB ; G 956 +U 1216 ; WX 602 ; N uni04C0 ; G 957 +U 1217 ; WX 602 ; N uni04C1 ; G 958 +U 1218 ; WX 602 ; N uni04C2 ; G 959 +U 1219 ; WX 602 ; N uni04C3 ; G 960 +U 1220 ; WX 602 ; N uni04C4 ; G 961 +U 1223 ; WX 602 ; N uni04C7 ; G 962 +U 1224 ; WX 602 ; N uni04C8 ; G 963 +U 1227 ; WX 602 ; N uni04CB ; G 964 +U 1228 ; WX 602 ; N uni04CC ; G 965 +U 1231 ; WX 602 ; N uni04CF ; G 966 +U 1232 ; WX 602 ; N uni04D0 ; G 967 +U 1233 ; WX 602 ; N uni04D1 ; G 968 +U 1234 ; WX 602 ; N uni04D2 ; G 969 +U 1235 ; WX 602 ; N uni04D3 ; G 970 +U 1236 ; WX 602 ; N uni04D4 ; G 971 +U 1237 ; WX 602 ; N uni04D5 ; G 972 +U 1238 ; WX 602 ; N uni04D6 ; G 973 +U 1239 ; WX 602 ; N uni04D7 ; G 974 +U 1240 ; WX 602 ; N uni04D8 ; G 975 +U 1241 ; WX 602 ; N uni04D9 ; G 976 +U 1242 ; WX 602 ; N uni04DA ; G 977 +U 1243 ; WX 602 ; N uni04DB ; G 978 +U 1244 ; WX 602 ; N uni04DC ; G 979 +U 1245 ; WX 602 ; N uni04DD ; G 980 +U 1246 ; WX 602 ; N uni04DE ; G 981 +U 1247 ; WX 602 ; N uni04DF ; G 982 +U 1248 ; WX 602 ; N uni04E0 ; G 983 +U 1249 ; WX 602 ; N uni04E1 ; G 984 +U 1250 ; WX 602 ; N uni04E2 ; G 985 +U 1251 ; WX 602 ; N uni04E3 ; G 986 +U 1252 ; WX 602 ; N uni04E4 ; G 987 +U 1253 ; WX 602 ; N uni04E5 ; G 988 +U 1254 ; WX 602 ; N uni04E6 ; G 989 +U 1255 ; WX 602 ; N uni04E7 ; G 990 +U 1256 ; WX 602 ; N uni04E8 ; G 991 +U 1257 ; WX 602 ; N uni04E9 ; G 992 +U 1258 ; WX 602 ; N uni04EA ; G 993 +U 1259 ; WX 602 ; N uni04EB ; G 994 +U 1260 ; WX 602 ; N uni04EC ; G 995 +U 1261 ; WX 602 ; N uni04ED ; G 996 +U 1262 ; WX 602 ; N uni04EE ; G 997 +U 1263 ; WX 602 ; N uni04EF ; G 998 +U 1264 ; WX 602 ; N uni04F0 ; G 999 +U 1265 ; WX 602 ; N uni04F1 ; G 1000 +U 1266 ; WX 602 ; N uni04F2 ; G 1001 +U 1267 ; WX 602 ; N uni04F3 ; G 1002 +U 1268 ; WX 602 ; N uni04F4 ; G 1003 +U 1269 ; WX 602 ; N uni04F5 ; G 1004 +U 1270 ; WX 602 ; N uni04F6 ; G 1005 +U 1271 ; WX 602 ; N uni04F7 ; G 1006 +U 1272 ; WX 602 ; N uni04F8 ; G 1007 +U 1273 ; WX 602 ; N uni04F9 ; G 1008 +U 1296 ; WX 602 ; N uni0510 ; G 1009 +U 1297 ; WX 602 ; N uni0511 ; G 1010 +U 1306 ; WX 602 ; N uni051A ; G 1011 +U 1307 ; WX 602 ; N uni051B ; G 1012 +U 1308 ; WX 602 ; N uni051C ; G 1013 +U 1309 ; WX 602 ; N uni051D ; G 1014 +U 1329 ; WX 602 ; N uni0531 ; G 1015 +U 1330 ; WX 602 ; N uni0532 ; G 1016 +U 1331 ; WX 602 ; N uni0533 ; G 1017 +U 1332 ; WX 602 ; N uni0534 ; G 1018 +U 1333 ; WX 602 ; N uni0535 ; G 1019 +U 1334 ; WX 602 ; N uni0536 ; G 1020 +U 1335 ; WX 602 ; N uni0537 ; G 1021 +U 1336 ; WX 602 ; N uni0538 ; G 1022 +U 1337 ; WX 602 ; N uni0539 ; G 1023 +U 1338 ; WX 602 ; N uni053A ; G 1024 +U 1339 ; WX 602 ; N uni053B ; G 1025 +U 1340 ; WX 602 ; N uni053C ; G 1026 +U 1341 ; WX 602 ; N uni053D ; G 1027 +U 1342 ; WX 602 ; N uni053E ; G 1028 +U 1343 ; WX 602 ; N uni053F ; G 1029 +U 1344 ; WX 602 ; N uni0540 ; G 1030 +U 1345 ; WX 602 ; N uni0541 ; G 1031 +U 1346 ; WX 602 ; N uni0542 ; G 1032 +U 1347 ; WX 602 ; N uni0543 ; G 1033 +U 1348 ; WX 602 ; N uni0544 ; G 1034 +U 1349 ; WX 602 ; N uni0545 ; G 1035 +U 1350 ; WX 602 ; N uni0546 ; G 1036 +U 1351 ; WX 602 ; N uni0547 ; G 1037 +U 1352 ; WX 602 ; N uni0548 ; G 1038 +U 1353 ; WX 602 ; N uni0549 ; G 1039 +U 1354 ; WX 602 ; N uni054A ; G 1040 +U 1355 ; WX 602 ; N uni054B ; G 1041 +U 1356 ; WX 602 ; N uni054C ; G 1042 +U 1357 ; WX 602 ; N uni054D ; G 1043 +U 1358 ; WX 602 ; N uni054E ; G 1044 +U 1359 ; WX 602 ; N uni054F ; G 1045 +U 1360 ; WX 602 ; N uni0550 ; G 1046 +U 1361 ; WX 602 ; N uni0551 ; G 1047 +U 1362 ; WX 602 ; N uni0552 ; G 1048 +U 1363 ; WX 602 ; N uni0553 ; G 1049 +U 1364 ; WX 602 ; N uni0554 ; G 1050 +U 1365 ; WX 602 ; N uni0555 ; G 1051 +U 1366 ; WX 602 ; N uni0556 ; G 1052 +U 1369 ; WX 602 ; N uni0559 ; G 1053 +U 1370 ; WX 602 ; N uni055A ; G 1054 +U 1371 ; WX 602 ; N uni055B ; G 1055 +U 1372 ; WX 602 ; N uni055C ; G 1056 +U 1373 ; WX 602 ; N uni055D ; G 1057 +U 1374 ; WX 602 ; N uni055E ; G 1058 +U 1375 ; WX 602 ; N uni055F ; G 1059 +U 1377 ; WX 602 ; N uni0561 ; G 1060 +U 1378 ; WX 602 ; N uni0562 ; G 1061 +U 1379 ; WX 602 ; N uni0563 ; G 1062 +U 1380 ; WX 602 ; N uni0564 ; G 1063 +U 1381 ; WX 602 ; N uni0565 ; G 1064 +U 1382 ; WX 602 ; N uni0566 ; G 1065 +U 1383 ; WX 602 ; N uni0567 ; G 1066 +U 1384 ; WX 602 ; N uni0568 ; G 1067 +U 1385 ; WX 602 ; N uni0569 ; G 1068 +U 1386 ; WX 602 ; N uni056A ; G 1069 +U 1387 ; WX 602 ; N uni056B ; G 1070 +U 1388 ; WX 602 ; N uni056C ; G 1071 +U 1389 ; WX 602 ; N uni056D ; G 1072 +U 1390 ; WX 602 ; N uni056E ; G 1073 +U 1391 ; WX 602 ; N uni056F ; G 1074 +U 1392 ; WX 602 ; N uni0570 ; G 1075 +U 1393 ; WX 602 ; N uni0571 ; G 1076 +U 1394 ; WX 602 ; N uni0572 ; G 1077 +U 1395 ; WX 602 ; N uni0573 ; G 1078 +U 1396 ; WX 602 ; N uni0574 ; G 1079 +U 1397 ; WX 602 ; N uni0575 ; G 1080 +U 1398 ; WX 602 ; N uni0576 ; G 1081 +U 1399 ; WX 602 ; N uni0577 ; G 1082 +U 1400 ; WX 602 ; N uni0578 ; G 1083 +U 1401 ; WX 602 ; N uni0579 ; G 1084 +U 1402 ; WX 602 ; N uni057A ; G 1085 +U 1403 ; WX 602 ; N uni057B ; G 1086 +U 1404 ; WX 602 ; N uni057C ; G 1087 +U 1405 ; WX 602 ; N uni057D ; G 1088 +U 1406 ; WX 602 ; N uni057E ; G 1089 +U 1407 ; WX 602 ; N uni057F ; G 1090 +U 1408 ; WX 602 ; N uni0580 ; G 1091 +U 1409 ; WX 602 ; N uni0581 ; G 1092 +U 1410 ; WX 602 ; N uni0582 ; G 1093 +U 1411 ; WX 602 ; N uni0583 ; G 1094 +U 1412 ; WX 602 ; N uni0584 ; G 1095 +U 1413 ; WX 602 ; N uni0585 ; G 1096 +U 1414 ; WX 602 ; N uni0586 ; G 1097 +U 1415 ; WX 602 ; N uni0587 ; G 1098 +U 1417 ; WX 602 ; N uni0589 ; G 1099 +U 1418 ; WX 602 ; N uni058A ; G 1100 +U 3647 ; WX 602 ; N uni0E3F ; G 1101 +U 3713 ; WX 602 ; N uni0E81 ; G 1102 +U 3714 ; WX 602 ; N uni0E82 ; G 1103 +U 3716 ; WX 602 ; N uni0E84 ; G 1104 +U 3719 ; WX 602 ; N uni0E87 ; G 1105 +U 3720 ; WX 602 ; N uni0E88 ; G 1106 +U 3722 ; WX 602 ; N uni0E8A ; G 1107 +U 3725 ; WX 602 ; N uni0E8D ; G 1108 +U 3732 ; WX 602 ; N uni0E94 ; G 1109 +U 3733 ; WX 602 ; N uni0E95 ; G 1110 +U 3734 ; WX 602 ; N uni0E96 ; G 1111 +U 3735 ; WX 602 ; N uni0E97 ; G 1112 +U 3737 ; WX 602 ; N uni0E99 ; G 1113 +U 3738 ; WX 602 ; N uni0E9A ; G 1114 +U 3739 ; WX 602 ; N uni0E9B ; G 1115 +U 3740 ; WX 602 ; N uni0E9C ; G 1116 +U 3741 ; WX 602 ; N uni0E9D ; G 1117 +U 3742 ; WX 602 ; N uni0E9E ; G 1118 +U 3743 ; WX 602 ; N uni0E9F ; G 1119 +U 3745 ; WX 602 ; N uni0EA1 ; G 1120 +U 3746 ; WX 602 ; N uni0EA2 ; G 1121 +U 3747 ; WX 602 ; N uni0EA3 ; G 1122 +U 3749 ; WX 602 ; N uni0EA5 ; G 1123 +U 3751 ; WX 602 ; N uni0EA7 ; G 1124 +U 3754 ; WX 602 ; N uni0EAA ; G 1125 +U 3755 ; WX 602 ; N uni0EAB ; G 1126 +U 3757 ; WX 602 ; N uni0EAD ; G 1127 +U 3758 ; WX 602 ; N uni0EAE ; G 1128 +U 3759 ; WX 602 ; N uni0EAF ; G 1129 +U 3760 ; WX 602 ; N uni0EB0 ; G 1130 +U 3761 ; WX 602 ; N uni0EB1 ; G 1131 +U 3762 ; WX 602 ; N uni0EB2 ; G 1132 +U 3763 ; WX 602 ; N uni0EB3 ; G 1133 +U 3764 ; WX 602 ; N uni0EB4 ; G 1134 +U 3765 ; WX 602 ; N uni0EB5 ; G 1135 +U 3766 ; WX 602 ; N uni0EB6 ; G 1136 +U 3767 ; WX 602 ; N uni0EB7 ; G 1137 +U 3768 ; WX 602 ; N uni0EB8 ; G 1138 +U 3769 ; WX 602 ; N uni0EB9 ; G 1139 +U 3771 ; WX 602 ; N uni0EBB ; G 1140 +U 3772 ; WX 602 ; N uni0EBC ; G 1141 +U 3784 ; WX 602 ; N uni0EC8 ; G 1142 +U 3785 ; WX 602 ; N uni0EC9 ; G 1143 +U 3786 ; WX 602 ; N uni0ECA ; G 1144 +U 3787 ; WX 602 ; N uni0ECB ; G 1145 +U 3788 ; WX 602 ; N uni0ECC ; G 1146 +U 3789 ; WX 602 ; N uni0ECD ; G 1147 +U 4304 ; WX 602 ; N uni10D0 ; G 1148 +U 4305 ; WX 602 ; N uni10D1 ; G 1149 +U 4306 ; WX 602 ; N uni10D2 ; G 1150 +U 4307 ; WX 602 ; N uni10D3 ; G 1151 +U 4308 ; WX 602 ; N uni10D4 ; G 1152 +U 4309 ; WX 602 ; N uni10D5 ; G 1153 +U 4310 ; WX 602 ; N uni10D6 ; G 1154 +U 4311 ; WX 602 ; N uni10D7 ; G 1155 +U 4312 ; WX 602 ; N uni10D8 ; G 1156 +U 4313 ; WX 602 ; N uni10D9 ; G 1157 +U 4314 ; WX 602 ; N uni10DA ; G 1158 +U 4315 ; WX 602 ; N uni10DB ; G 1159 +U 4316 ; WX 602 ; N uni10DC ; G 1160 +U 4317 ; WX 602 ; N uni10DD ; G 1161 +U 4318 ; WX 602 ; N uni10DE ; G 1162 +U 4319 ; WX 602 ; N uni10DF ; G 1163 +U 4320 ; WX 602 ; N uni10E0 ; G 1164 +U 4321 ; WX 602 ; N uni10E1 ; G 1165 +U 4322 ; WX 602 ; N uni10E2 ; G 1166 +U 4323 ; WX 602 ; N uni10E3 ; G 1167 +U 4324 ; WX 602 ; N uni10E4 ; G 1168 +U 4325 ; WX 602 ; N uni10E5 ; G 1169 +U 4326 ; WX 602 ; N uni10E6 ; G 1170 +U 4327 ; WX 602 ; N uni10E7 ; G 1171 +U 4328 ; WX 602 ; N uni10E8 ; G 1172 +U 4329 ; WX 602 ; N uni10E9 ; G 1173 +U 4330 ; WX 602 ; N uni10EA ; G 1174 +U 4331 ; WX 602 ; N uni10EB ; G 1175 +U 4332 ; WX 602 ; N uni10EC ; G 1176 +U 4333 ; WX 602 ; N uni10ED ; G 1177 +U 4334 ; WX 602 ; N uni10EE ; G 1178 +U 4335 ; WX 602 ; N uni10EF ; G 1179 +U 4336 ; WX 602 ; N uni10F0 ; G 1180 +U 4337 ; WX 602 ; N uni10F1 ; G 1181 +U 4338 ; WX 602 ; N uni10F2 ; G 1182 +U 4339 ; WX 602 ; N uni10F3 ; G 1183 +U 4340 ; WX 602 ; N uni10F4 ; G 1184 +U 4341 ; WX 602 ; N uni10F5 ; G 1185 +U 4342 ; WX 602 ; N uni10F6 ; G 1186 +U 4343 ; WX 602 ; N uni10F7 ; G 1187 +U 4344 ; WX 602 ; N uni10F8 ; G 1188 +U 4345 ; WX 602 ; N uni10F9 ; G 1189 +U 4346 ; WX 602 ; N uni10FA ; G 1190 +U 4347 ; WX 602 ; N uni10FB ; G 1191 +U 4348 ; WX 602 ; N uni10FC ; G 1192 +U 7426 ; WX 602 ; N uni1D02 ; G 1193 +U 7432 ; WX 602 ; N uni1D08 ; G 1194 +U 7433 ; WX 602 ; N uni1D09 ; G 1195 +U 7444 ; WX 602 ; N uni1D14 ; G 1196 +U 7446 ; WX 602 ; N uni1D16 ; G 1197 +U 7447 ; WX 602 ; N uni1D17 ; G 1198 +U 7453 ; WX 602 ; N uni1D1D ; G 1199 +U 7454 ; WX 602 ; N uni1D1E ; G 1200 +U 7455 ; WX 602 ; N uni1D1F ; G 1201 +U 7468 ; WX 602 ; N uni1D2C ; G 1202 +U 7469 ; WX 602 ; N uni1D2D ; G 1203 +U 7470 ; WX 602 ; N uni1D2E ; G 1204 +U 7472 ; WX 602 ; N uni1D30 ; G 1205 +U 7473 ; WX 602 ; N uni1D31 ; G 1206 +U 7474 ; WX 602 ; N uni1D32 ; G 1207 +U 7475 ; WX 602 ; N uni1D33 ; G 1208 +U 7476 ; WX 602 ; N uni1D34 ; G 1209 +U 7477 ; WX 602 ; N uni1D35 ; G 1210 +U 7478 ; WX 602 ; N uni1D36 ; G 1211 +U 7479 ; WX 602 ; N uni1D37 ; G 1212 +U 7480 ; WX 602 ; N uni1D38 ; G 1213 +U 7481 ; WX 602 ; N uni1D39 ; G 1214 +U 7482 ; WX 602 ; N uni1D3A ; G 1215 +U 7483 ; WX 602 ; N uni1D3B ; G 1216 +U 7484 ; WX 602 ; N uni1D3C ; G 1217 +U 7486 ; WX 602 ; N uni1D3E ; G 1218 +U 7487 ; WX 602 ; N uni1D3F ; G 1219 +U 7488 ; WX 602 ; N uni1D40 ; G 1220 +U 7489 ; WX 602 ; N uni1D41 ; G 1221 +U 7490 ; WX 602 ; N uni1D42 ; G 1222 +U 7491 ; WX 602 ; N uni1D43 ; G 1223 +U 7492 ; WX 602 ; N uni1D44 ; G 1224 +U 7493 ; WX 602 ; N uni1D45 ; G 1225 +U 7494 ; WX 602 ; N uni1D46 ; G 1226 +U 7495 ; WX 602 ; N uni1D47 ; G 1227 +U 7496 ; WX 602 ; N uni1D48 ; G 1228 +U 7497 ; WX 602 ; N uni1D49 ; G 1229 +U 7498 ; WX 602 ; N uni1D4A ; G 1230 +U 7499 ; WX 602 ; N uni1D4B ; G 1231 +U 7500 ; WX 602 ; N uni1D4C ; G 1232 +U 7501 ; WX 602 ; N uni1D4D ; G 1233 +U 7502 ; WX 602 ; N uni1D4E ; G 1234 +U 7503 ; WX 602 ; N uni1D4F ; G 1235 +U 7504 ; WX 602 ; N uni1D50 ; G 1236 +U 7505 ; WX 602 ; N uni1D51 ; G 1237 +U 7506 ; WX 602 ; N uni1D52 ; G 1238 +U 7507 ; WX 602 ; N uni1D53 ; G 1239 +U 7508 ; WX 602 ; N uni1D54 ; G 1240 +U 7509 ; WX 602 ; N uni1D55 ; G 1241 +U 7510 ; WX 602 ; N uni1D56 ; G 1242 +U 7511 ; WX 602 ; N uni1D57 ; G 1243 +U 7512 ; WX 602 ; N uni1D58 ; G 1244 +U 7513 ; WX 602 ; N uni1D59 ; G 1245 +U 7514 ; WX 602 ; N uni1D5A ; G 1246 +U 7515 ; WX 602 ; N uni1D5B ; G 1247 +U 7522 ; WX 602 ; N uni1D62 ; G 1248 +U 7523 ; WX 602 ; N uni1D63 ; G 1249 +U 7524 ; WX 602 ; N uni1D64 ; G 1250 +U 7525 ; WX 602 ; N uni1D65 ; G 1251 +U 7543 ; WX 602 ; N uni1D77 ; G 1252 +U 7544 ; WX 602 ; N uni1D78 ; G 1253 +U 7547 ; WX 602 ; N uni1D7B ; G 1254 +U 7557 ; WX 602 ; N uni1D85 ; G 1255 +U 7579 ; WX 602 ; N uni1D9B ; G 1256 +U 7580 ; WX 602 ; N uni1D9C ; G 1257 +U 7581 ; WX 602 ; N uni1D9D ; G 1258 +U 7582 ; WX 602 ; N uni1D9E ; G 1259 +U 7583 ; WX 602 ; N uni1D9F ; G 1260 +U 7584 ; WX 602 ; N uni1DA0 ; G 1261 +U 7585 ; WX 602 ; N uni1DA1 ; G 1262 +U 7586 ; WX 602 ; N uni1DA2 ; G 1263 +U 7587 ; WX 602 ; N uni1DA3 ; G 1264 +U 7588 ; WX 602 ; N uni1DA4 ; G 1265 +U 7589 ; WX 602 ; N uni1DA5 ; G 1266 +U 7590 ; WX 602 ; N uni1DA6 ; G 1267 +U 7591 ; WX 602 ; N uni1DA7 ; G 1268 +U 7592 ; WX 602 ; N uni1DA8 ; G 1269 +U 7593 ; WX 602 ; N uni1DA9 ; G 1270 +U 7594 ; WX 602 ; N uni1DAA ; G 1271 +U 7595 ; WX 602 ; N uni1DAB ; G 1272 +U 7596 ; WX 602 ; N uni1DAC ; G 1273 +U 7597 ; WX 602 ; N uni1DAD ; G 1274 +U 7598 ; WX 602 ; N uni1DAE ; G 1275 +U 7599 ; WX 602 ; N uni1DAF ; G 1276 +U 7600 ; WX 602 ; N uni1DB0 ; G 1277 +U 7601 ; WX 602 ; N uni1DB1 ; G 1278 +U 7602 ; WX 602 ; N uni1DB2 ; G 1279 +U 7603 ; WX 602 ; N uni1DB3 ; G 1280 +U 7604 ; WX 602 ; N uni1DB4 ; G 1281 +U 7605 ; WX 602 ; N uni1DB5 ; G 1282 +U 7606 ; WX 602 ; N uni1DB6 ; G 1283 +U 7607 ; WX 602 ; N uni1DB7 ; G 1284 +U 7609 ; WX 602 ; N uni1DB9 ; G 1285 +U 7610 ; WX 602 ; N uni1DBA ; G 1286 +U 7611 ; WX 602 ; N uni1DBB ; G 1287 +U 7612 ; WX 602 ; N uni1DBC ; G 1288 +U 7613 ; WX 602 ; N uni1DBD ; G 1289 +U 7614 ; WX 602 ; N uni1DBE ; G 1290 +U 7615 ; WX 602 ; N uni1DBF ; G 1291 +U 7680 ; WX 602 ; N uni1E00 ; G 1292 +U 7681 ; WX 602 ; N uni1E01 ; G 1293 +U 7682 ; WX 602 ; N uni1E02 ; G 1294 +U 7683 ; WX 602 ; N uni1E03 ; G 1295 +U 7684 ; WX 602 ; N uni1E04 ; G 1296 +U 7685 ; WX 602 ; N uni1E05 ; G 1297 +U 7686 ; WX 602 ; N uni1E06 ; G 1298 +U 7687 ; WX 602 ; N uni1E07 ; G 1299 +U 7688 ; WX 602 ; N uni1E08 ; G 1300 +U 7689 ; WX 602 ; N uni1E09 ; G 1301 +U 7690 ; WX 602 ; N uni1E0A ; G 1302 +U 7691 ; WX 602 ; N uni1E0B ; G 1303 +U 7692 ; WX 602 ; N uni1E0C ; G 1304 +U 7693 ; WX 602 ; N uni1E0D ; G 1305 +U 7694 ; WX 602 ; N uni1E0E ; G 1306 +U 7695 ; WX 602 ; N uni1E0F ; G 1307 +U 7696 ; WX 602 ; N uni1E10 ; G 1308 +U 7697 ; WX 602 ; N uni1E11 ; G 1309 +U 7698 ; WX 602 ; N uni1E12 ; G 1310 +U 7699 ; WX 602 ; N uni1E13 ; G 1311 +U 7704 ; WX 602 ; N uni1E18 ; G 1312 +U 7705 ; WX 602 ; N uni1E19 ; G 1313 +U 7706 ; WX 602 ; N uni1E1A ; G 1314 +U 7707 ; WX 602 ; N uni1E1B ; G 1315 +U 7708 ; WX 602 ; N uni1E1C ; G 1316 +U 7709 ; WX 602 ; N uni1E1D ; G 1317 +U 7710 ; WX 602 ; N uni1E1E ; G 1318 +U 7711 ; WX 602 ; N uni1E1F ; G 1319 +U 7712 ; WX 602 ; N uni1E20 ; G 1320 +U 7713 ; WX 602 ; N uni1E21 ; G 1321 +U 7714 ; WX 602 ; N uni1E22 ; G 1322 +U 7715 ; WX 602 ; N uni1E23 ; G 1323 +U 7716 ; WX 602 ; N uni1E24 ; G 1324 +U 7717 ; WX 602 ; N uni1E25 ; G 1325 +U 7718 ; WX 602 ; N uni1E26 ; G 1326 +U 7719 ; WX 602 ; N uni1E27 ; G 1327 +U 7720 ; WX 602 ; N uni1E28 ; G 1328 +U 7721 ; WX 602 ; N uni1E29 ; G 1329 +U 7722 ; WX 602 ; N uni1E2A ; G 1330 +U 7723 ; WX 602 ; N uni1E2B ; G 1331 +U 7724 ; WX 602 ; N uni1E2C ; G 1332 +U 7725 ; WX 602 ; N uni1E2D ; G 1333 +U 7728 ; WX 602 ; N uni1E30 ; G 1334 +U 7729 ; WX 602 ; N uni1E31 ; G 1335 +U 7730 ; WX 602 ; N uni1E32 ; G 1336 +U 7731 ; WX 602 ; N uni1E33 ; G 1337 +U 7732 ; WX 602 ; N uni1E34 ; G 1338 +U 7733 ; WX 602 ; N uni1E35 ; G 1339 +U 7734 ; WX 602 ; N uni1E36 ; G 1340 +U 7735 ; WX 602 ; N uni1E37 ; G 1341 +U 7736 ; WX 602 ; N uni1E38 ; G 1342 +U 7737 ; WX 602 ; N uni1E39 ; G 1343 +U 7738 ; WX 602 ; N uni1E3A ; G 1344 +U 7739 ; WX 602 ; N uni1E3B ; G 1345 +U 7740 ; WX 602 ; N uni1E3C ; G 1346 +U 7741 ; WX 602 ; N uni1E3D ; G 1347 +U 7742 ; WX 602 ; N uni1E3E ; G 1348 +U 7743 ; WX 602 ; N uni1E3F ; G 1349 +U 7744 ; WX 602 ; N uni1E40 ; G 1350 +U 7745 ; WX 602 ; N uni1E41 ; G 1351 +U 7746 ; WX 602 ; N uni1E42 ; G 1352 +U 7747 ; WX 602 ; N uni1E43 ; G 1353 +U 7748 ; WX 602 ; N uni1E44 ; G 1354 +U 7749 ; WX 602 ; N uni1E45 ; G 1355 +U 7750 ; WX 602 ; N uni1E46 ; G 1356 +U 7751 ; WX 602 ; N uni1E47 ; G 1357 +U 7752 ; WX 602 ; N uni1E48 ; G 1358 +U 7753 ; WX 602 ; N uni1E49 ; G 1359 +U 7754 ; WX 602 ; N uni1E4A ; G 1360 +U 7755 ; WX 602 ; N uni1E4B ; G 1361 +U 7756 ; WX 602 ; N uni1E4C ; G 1362 +U 7757 ; WX 602 ; N uni1E4D ; G 1363 +U 7764 ; WX 602 ; N uni1E54 ; G 1364 +U 7765 ; WX 602 ; N uni1E55 ; G 1365 +U 7766 ; WX 602 ; N uni1E56 ; G 1366 +U 7767 ; WX 602 ; N uni1E57 ; G 1367 +U 7768 ; WX 602 ; N uni1E58 ; G 1368 +U 7769 ; WX 602 ; N uni1E59 ; G 1369 +U 7770 ; WX 602 ; N uni1E5A ; G 1370 +U 7771 ; WX 602 ; N uni1E5B ; G 1371 +U 7772 ; WX 602 ; N uni1E5C ; G 1372 +U 7773 ; WX 602 ; N uni1E5D ; G 1373 +U 7774 ; WX 602 ; N uni1E5E ; G 1374 +U 7775 ; WX 602 ; N uni1E5F ; G 1375 +U 7776 ; WX 602 ; N uni1E60 ; G 1376 +U 7777 ; WX 602 ; N uni1E61 ; G 1377 +U 7778 ; WX 602 ; N uni1E62 ; G 1378 +U 7779 ; WX 602 ; N uni1E63 ; G 1379 +U 7784 ; WX 602 ; N uni1E68 ; G 1380 +U 7785 ; WX 602 ; N uni1E69 ; G 1381 +U 7786 ; WX 602 ; N uni1E6A ; G 1382 +U 7787 ; WX 602 ; N uni1E6B ; G 1383 +U 7788 ; WX 602 ; N uni1E6C ; G 1384 +U 7789 ; WX 602 ; N uni1E6D ; G 1385 +U 7790 ; WX 602 ; N uni1E6E ; G 1386 +U 7791 ; WX 602 ; N uni1E6F ; G 1387 +U 7792 ; WX 602 ; N uni1E70 ; G 1388 +U 7793 ; WX 602 ; N uni1E71 ; G 1389 +U 7794 ; WX 602 ; N uni1E72 ; G 1390 +U 7795 ; WX 602 ; N uni1E73 ; G 1391 +U 7796 ; WX 602 ; N uni1E74 ; G 1392 +U 7797 ; WX 602 ; N uni1E75 ; G 1393 +U 7798 ; WX 602 ; N uni1E76 ; G 1394 +U 7799 ; WX 602 ; N uni1E77 ; G 1395 +U 7800 ; WX 602 ; N uni1E78 ; G 1396 +U 7801 ; WX 602 ; N uni1E79 ; G 1397 +U 7804 ; WX 602 ; N uni1E7C ; G 1398 +U 7805 ; WX 602 ; N uni1E7D ; G 1399 +U 7806 ; WX 602 ; N uni1E7E ; G 1400 +U 7807 ; WX 602 ; N uni1E7F ; G 1401 +U 7808 ; WX 602 ; N Wgrave ; G 1402 +U 7809 ; WX 602 ; N wgrave ; G 1403 +U 7810 ; WX 602 ; N Wacute ; G 1404 +U 7811 ; WX 602 ; N wacute ; G 1405 +U 7812 ; WX 602 ; N Wdieresis ; G 1406 +U 7813 ; WX 602 ; N wdieresis ; G 1407 +U 7814 ; WX 602 ; N uni1E86 ; G 1408 +U 7815 ; WX 602 ; N uni1E87 ; G 1409 +U 7816 ; WX 602 ; N uni1E88 ; G 1410 +U 7817 ; WX 602 ; N uni1E89 ; G 1411 +U 7818 ; WX 602 ; N uni1E8A ; G 1412 +U 7819 ; WX 602 ; N uni1E8B ; G 1413 +U 7820 ; WX 602 ; N uni1E8C ; G 1414 +U 7821 ; WX 602 ; N uni1E8D ; G 1415 +U 7822 ; WX 602 ; N uni1E8E ; G 1416 +U 7823 ; WX 602 ; N uni1E8F ; G 1417 +U 7824 ; WX 602 ; N uni1E90 ; G 1418 +U 7825 ; WX 602 ; N uni1E91 ; G 1419 +U 7826 ; WX 602 ; N uni1E92 ; G 1420 +U 7827 ; WX 602 ; N uni1E93 ; G 1421 +U 7828 ; WX 602 ; N uni1E94 ; G 1422 +U 7829 ; WX 602 ; N uni1E95 ; G 1423 +U 7830 ; WX 602 ; N uni1E96 ; G 1424 +U 7831 ; WX 602 ; N uni1E97 ; G 1425 +U 7832 ; WX 602 ; N uni1E98 ; G 1426 +U 7833 ; WX 602 ; N uni1E99 ; G 1427 +U 7835 ; WX 602 ; N uni1E9B ; G 1428 +U 7839 ; WX 602 ; N uni1E9F ; G 1429 +U 7840 ; WX 602 ; N uni1EA0 ; G 1430 +U 7841 ; WX 602 ; N uni1EA1 ; G 1431 +U 7852 ; WX 602 ; N uni1EAC ; G 1432 +U 7853 ; WX 602 ; N uni1EAD ; G 1433 +U 7856 ; WX 602 ; N uni1EB0 ; G 1434 +U 7857 ; WX 602 ; N uni1EB1 ; G 1435 +U 7862 ; WX 602 ; N uni1EB6 ; G 1436 +U 7863 ; WX 602 ; N uni1EB7 ; G 1437 +U 7864 ; WX 602 ; N uni1EB8 ; G 1438 +U 7865 ; WX 602 ; N uni1EB9 ; G 1439 +U 7868 ; WX 602 ; N uni1EBC ; G 1440 +U 7869 ; WX 602 ; N uni1EBD ; G 1441 +U 7878 ; WX 602 ; N uni1EC6 ; G 1442 +U 7879 ; WX 602 ; N uni1EC7 ; G 1443 +U 7882 ; WX 602 ; N uni1ECA ; G 1444 +U 7883 ; WX 602 ; N uni1ECB ; G 1445 +U 7884 ; WX 602 ; N uni1ECC ; G 1446 +U 7885 ; WX 602 ; N uni1ECD ; G 1447 +U 7896 ; WX 602 ; N uni1ED8 ; G 1448 +U 7897 ; WX 602 ; N uni1ED9 ; G 1449 +U 7898 ; WX 602 ; N uni1EDA ; G 1450 +U 7899 ; WX 602 ; N uni1EDB ; G 1451 +U 7900 ; WX 602 ; N uni1EDC ; G 1452 +U 7901 ; WX 602 ; N uni1EDD ; G 1453 +U 7904 ; WX 602 ; N uni1EE0 ; G 1454 +U 7905 ; WX 602 ; N uni1EE1 ; G 1455 +U 7906 ; WX 602 ; N uni1EE2 ; G 1456 +U 7907 ; WX 602 ; N uni1EE3 ; G 1457 +U 7908 ; WX 602 ; N uni1EE4 ; G 1458 +U 7909 ; WX 602 ; N uni1EE5 ; G 1459 +U 7912 ; WX 602 ; N uni1EE8 ; G 1460 +U 7913 ; WX 602 ; N uni1EE9 ; G 1461 +U 7914 ; WX 602 ; N uni1EEA ; G 1462 +U 7915 ; WX 602 ; N uni1EEB ; G 1463 +U 7918 ; WX 602 ; N uni1EEE ; G 1464 +U 7919 ; WX 602 ; N uni1EEF ; G 1465 +U 7920 ; WX 602 ; N uni1EF0 ; G 1466 +U 7921 ; WX 602 ; N uni1EF1 ; G 1467 +U 7922 ; WX 602 ; N Ygrave ; G 1468 +U 7923 ; WX 602 ; N ygrave ; G 1469 +U 7924 ; WX 602 ; N uni1EF4 ; G 1470 +U 7925 ; WX 602 ; N uni1EF5 ; G 1471 +U 7928 ; WX 602 ; N uni1EF8 ; G 1472 +U 7929 ; WX 602 ; N uni1EF9 ; G 1473 +U 7936 ; WX 602 ; N uni1F00 ; G 1474 +U 7937 ; WX 602 ; N uni1F01 ; G 1475 +U 7938 ; WX 602 ; N uni1F02 ; G 1476 +U 7939 ; WX 602 ; N uni1F03 ; G 1477 +U 7940 ; WX 602 ; N uni1F04 ; G 1478 +U 7941 ; WX 602 ; N uni1F05 ; G 1479 +U 7942 ; WX 602 ; N uni1F06 ; G 1480 +U 7943 ; WX 602 ; N uni1F07 ; G 1481 +U 7944 ; WX 602 ; N uni1F08 ; G 1482 +U 7945 ; WX 602 ; N uni1F09 ; G 1483 +U 7946 ; WX 602 ; N uni1F0A ; G 1484 +U 7947 ; WX 602 ; N uni1F0B ; G 1485 +U 7948 ; WX 602 ; N uni1F0C ; G 1486 +U 7949 ; WX 602 ; N uni1F0D ; G 1487 +U 7950 ; WX 602 ; N uni1F0E ; G 1488 +U 7951 ; WX 602 ; N uni1F0F ; G 1489 +U 7952 ; WX 602 ; N uni1F10 ; G 1490 +U 7953 ; WX 602 ; N uni1F11 ; G 1491 +U 7954 ; WX 602 ; N uni1F12 ; G 1492 +U 7955 ; WX 602 ; N uni1F13 ; G 1493 +U 7956 ; WX 602 ; N uni1F14 ; G 1494 +U 7957 ; WX 602 ; N uni1F15 ; G 1495 +U 7960 ; WX 602 ; N uni1F18 ; G 1496 +U 7961 ; WX 602 ; N uni1F19 ; G 1497 +U 7962 ; WX 602 ; N uni1F1A ; G 1498 +U 7963 ; WX 602 ; N uni1F1B ; G 1499 +U 7964 ; WX 602 ; N uni1F1C ; G 1500 +U 7965 ; WX 602 ; N uni1F1D ; G 1501 +U 7968 ; WX 602 ; N uni1F20 ; G 1502 +U 7969 ; WX 602 ; N uni1F21 ; G 1503 +U 7970 ; WX 602 ; N uni1F22 ; G 1504 +U 7971 ; WX 602 ; N uni1F23 ; G 1505 +U 7972 ; WX 602 ; N uni1F24 ; G 1506 +U 7973 ; WX 602 ; N uni1F25 ; G 1507 +U 7974 ; WX 602 ; N uni1F26 ; G 1508 +U 7975 ; WX 602 ; N uni1F27 ; G 1509 +U 7976 ; WX 602 ; N uni1F28 ; G 1510 +U 7977 ; WX 602 ; N uni1F29 ; G 1511 +U 7978 ; WX 602 ; N uni1F2A ; G 1512 +U 7979 ; WX 602 ; N uni1F2B ; G 1513 +U 7980 ; WX 602 ; N uni1F2C ; G 1514 +U 7981 ; WX 602 ; N uni1F2D ; G 1515 +U 7982 ; WX 602 ; N uni1F2E ; G 1516 +U 7983 ; WX 602 ; N uni1F2F ; G 1517 +U 7984 ; WX 602 ; N uni1F30 ; G 1518 +U 7985 ; WX 602 ; N uni1F31 ; G 1519 +U 7986 ; WX 602 ; N uni1F32 ; G 1520 +U 7987 ; WX 602 ; N uni1F33 ; G 1521 +U 7988 ; WX 602 ; N uni1F34 ; G 1522 +U 7989 ; WX 602 ; N uni1F35 ; G 1523 +U 7990 ; WX 602 ; N uni1F36 ; G 1524 +U 7991 ; WX 602 ; N uni1F37 ; G 1525 +U 7992 ; WX 602 ; N uni1F38 ; G 1526 +U 7993 ; WX 602 ; N uni1F39 ; G 1527 +U 7994 ; WX 602 ; N uni1F3A ; G 1528 +U 7995 ; WX 602 ; N uni1F3B ; G 1529 +U 7996 ; WX 602 ; N uni1F3C ; G 1530 +U 7997 ; WX 602 ; N uni1F3D ; G 1531 +U 7998 ; WX 602 ; N uni1F3E ; G 1532 +U 7999 ; WX 602 ; N uni1F3F ; G 1533 +U 8000 ; WX 602 ; N uni1F40 ; G 1534 +U 8001 ; WX 602 ; N uni1F41 ; G 1535 +U 8002 ; WX 602 ; N uni1F42 ; G 1536 +U 8003 ; WX 602 ; N uni1F43 ; G 1537 +U 8004 ; WX 602 ; N uni1F44 ; G 1538 +U 8005 ; WX 602 ; N uni1F45 ; G 1539 +U 8008 ; WX 602 ; N uni1F48 ; G 1540 +U 8009 ; WX 602 ; N uni1F49 ; G 1541 +U 8010 ; WX 602 ; N uni1F4A ; G 1542 +U 8011 ; WX 602 ; N uni1F4B ; G 1543 +U 8012 ; WX 602 ; N uni1F4C ; G 1544 +U 8013 ; WX 602 ; N uni1F4D ; G 1545 +U 8016 ; WX 602 ; N uni1F50 ; G 1546 +U 8017 ; WX 602 ; N uni1F51 ; G 1547 +U 8018 ; WX 602 ; N uni1F52 ; G 1548 +U 8019 ; WX 602 ; N uni1F53 ; G 1549 +U 8020 ; WX 602 ; N uni1F54 ; G 1550 +U 8021 ; WX 602 ; N uni1F55 ; G 1551 +U 8022 ; WX 602 ; N uni1F56 ; G 1552 +U 8023 ; WX 602 ; N uni1F57 ; G 1553 +U 8025 ; WX 602 ; N uni1F59 ; G 1554 +U 8027 ; WX 602 ; N uni1F5B ; G 1555 +U 8029 ; WX 602 ; N uni1F5D ; G 1556 +U 8031 ; WX 602 ; N uni1F5F ; G 1557 +U 8032 ; WX 602 ; N uni1F60 ; G 1558 +U 8033 ; WX 602 ; N uni1F61 ; G 1559 +U 8034 ; WX 602 ; N uni1F62 ; G 1560 +U 8035 ; WX 602 ; N uni1F63 ; G 1561 +U 8036 ; WX 602 ; N uni1F64 ; G 1562 +U 8037 ; WX 602 ; N uni1F65 ; G 1563 +U 8038 ; WX 602 ; N uni1F66 ; G 1564 +U 8039 ; WX 602 ; N uni1F67 ; G 1565 +U 8040 ; WX 602 ; N uni1F68 ; G 1566 +U 8041 ; WX 602 ; N uni1F69 ; G 1567 +U 8042 ; WX 602 ; N uni1F6A ; G 1568 +U 8043 ; WX 602 ; N uni1F6B ; G 1569 +U 8044 ; WX 602 ; N uni1F6C ; G 1570 +U 8045 ; WX 602 ; N uni1F6D ; G 1571 +U 8046 ; WX 602 ; N uni1F6E ; G 1572 +U 8047 ; WX 602 ; N uni1F6F ; G 1573 +U 8048 ; WX 602 ; N uni1F70 ; G 1574 +U 8049 ; WX 602 ; N uni1F71 ; G 1575 +U 8050 ; WX 602 ; N uni1F72 ; G 1576 +U 8051 ; WX 602 ; N uni1F73 ; G 1577 +U 8052 ; WX 602 ; N uni1F74 ; G 1578 +U 8053 ; WX 602 ; N uni1F75 ; G 1579 +U 8054 ; WX 602 ; N uni1F76 ; G 1580 +U 8055 ; WX 602 ; N uni1F77 ; G 1581 +U 8056 ; WX 602 ; N uni1F78 ; G 1582 +U 8057 ; WX 602 ; N uni1F79 ; G 1583 +U 8058 ; WX 602 ; N uni1F7A ; G 1584 +U 8059 ; WX 602 ; N uni1F7B ; G 1585 +U 8060 ; WX 602 ; N uni1F7C ; G 1586 +U 8061 ; WX 602 ; N uni1F7D ; G 1587 +U 8064 ; WX 602 ; N uni1F80 ; G 1588 +U 8065 ; WX 602 ; N uni1F81 ; G 1589 +U 8066 ; WX 602 ; N uni1F82 ; G 1590 +U 8067 ; WX 602 ; N uni1F83 ; G 1591 +U 8068 ; WX 602 ; N uni1F84 ; G 1592 +U 8069 ; WX 602 ; N uni1F85 ; G 1593 +U 8070 ; WX 602 ; N uni1F86 ; G 1594 +U 8071 ; WX 602 ; N uni1F87 ; G 1595 +U 8072 ; WX 602 ; N uni1F88 ; G 1596 +U 8073 ; WX 602 ; N uni1F89 ; G 1597 +U 8074 ; WX 602 ; N uni1F8A ; G 1598 +U 8075 ; WX 602 ; N uni1F8B ; G 1599 +U 8076 ; WX 602 ; N uni1F8C ; G 1600 +U 8077 ; WX 602 ; N uni1F8D ; G 1601 +U 8078 ; WX 602 ; N uni1F8E ; G 1602 +U 8079 ; WX 602 ; N uni1F8F ; G 1603 +U 8080 ; WX 602 ; N uni1F90 ; G 1604 +U 8081 ; WX 602 ; N uni1F91 ; G 1605 +U 8082 ; WX 602 ; N uni1F92 ; G 1606 +U 8083 ; WX 602 ; N uni1F93 ; G 1607 +U 8084 ; WX 602 ; N uni1F94 ; G 1608 +U 8085 ; WX 602 ; N uni1F95 ; G 1609 +U 8086 ; WX 602 ; N uni1F96 ; G 1610 +U 8087 ; WX 602 ; N uni1F97 ; G 1611 +U 8088 ; WX 602 ; N uni1F98 ; G 1612 +U 8089 ; WX 602 ; N uni1F99 ; G 1613 +U 8090 ; WX 602 ; N uni1F9A ; G 1614 +U 8091 ; WX 602 ; N uni1F9B ; G 1615 +U 8092 ; WX 602 ; N uni1F9C ; G 1616 +U 8093 ; WX 602 ; N uni1F9D ; G 1617 +U 8094 ; WX 602 ; N uni1F9E ; G 1618 +U 8095 ; WX 602 ; N uni1F9F ; G 1619 +U 8096 ; WX 602 ; N uni1FA0 ; G 1620 +U 8097 ; WX 602 ; N uni1FA1 ; G 1621 +U 8098 ; WX 602 ; N uni1FA2 ; G 1622 +U 8099 ; WX 602 ; N uni1FA3 ; G 1623 +U 8100 ; WX 602 ; N uni1FA4 ; G 1624 +U 8101 ; WX 602 ; N uni1FA5 ; G 1625 +U 8102 ; WX 602 ; N uni1FA6 ; G 1626 +U 8103 ; WX 602 ; N uni1FA7 ; G 1627 +U 8104 ; WX 602 ; N uni1FA8 ; G 1628 +U 8105 ; WX 602 ; N uni1FA9 ; G 1629 +U 8106 ; WX 602 ; N uni1FAA ; G 1630 +U 8107 ; WX 602 ; N uni1FAB ; G 1631 +U 8108 ; WX 602 ; N uni1FAC ; G 1632 +U 8109 ; WX 602 ; N uni1FAD ; G 1633 +U 8110 ; WX 602 ; N uni1FAE ; G 1634 +U 8111 ; WX 602 ; N uni1FAF ; G 1635 +U 8112 ; WX 602 ; N uni1FB0 ; G 1636 +U 8113 ; WX 602 ; N uni1FB1 ; G 1637 +U 8114 ; WX 602 ; N uni1FB2 ; G 1638 +U 8115 ; WX 602 ; N uni1FB3 ; G 1639 +U 8116 ; WX 602 ; N uni1FB4 ; G 1640 +U 8118 ; WX 602 ; N uni1FB6 ; G 1641 +U 8119 ; WX 602 ; N uni1FB7 ; G 1642 +U 8120 ; WX 602 ; N uni1FB8 ; G 1643 +U 8121 ; WX 602 ; N uni1FB9 ; G 1644 +U 8122 ; WX 602 ; N uni1FBA ; G 1645 +U 8123 ; WX 602 ; N uni1FBB ; G 1646 +U 8124 ; WX 602 ; N uni1FBC ; G 1647 +U 8125 ; WX 602 ; N uni1FBD ; G 1648 +U 8126 ; WX 602 ; N uni1FBE ; G 1649 +U 8127 ; WX 602 ; N uni1FBF ; G 1650 +U 8128 ; WX 602 ; N uni1FC0 ; G 1651 +U 8129 ; WX 602 ; N uni1FC1 ; G 1652 +U 8130 ; WX 602 ; N uni1FC2 ; G 1653 +U 8131 ; WX 602 ; N uni1FC3 ; G 1654 +U 8132 ; WX 602 ; N uni1FC4 ; G 1655 +U 8134 ; WX 602 ; N uni1FC6 ; G 1656 +U 8135 ; WX 602 ; N uni1FC7 ; G 1657 +U 8136 ; WX 602 ; N uni1FC8 ; G 1658 +U 8137 ; WX 602 ; N uni1FC9 ; G 1659 +U 8138 ; WX 602 ; N uni1FCA ; G 1660 +U 8139 ; WX 602 ; N uni1FCB ; G 1661 +U 8140 ; WX 602 ; N uni1FCC ; G 1662 +U 8141 ; WX 602 ; N uni1FCD ; G 1663 +U 8142 ; WX 602 ; N uni1FCE ; G 1664 +U 8143 ; WX 602 ; N uni1FCF ; G 1665 +U 8144 ; WX 602 ; N uni1FD0 ; G 1666 +U 8145 ; WX 602 ; N uni1FD1 ; G 1667 +U 8146 ; WX 602 ; N uni1FD2 ; G 1668 +U 8147 ; WX 602 ; N uni1FD3 ; G 1669 +U 8150 ; WX 602 ; N uni1FD6 ; G 1670 +U 8151 ; WX 602 ; N uni1FD7 ; G 1671 +U 8152 ; WX 602 ; N uni1FD8 ; G 1672 +U 8153 ; WX 602 ; N uni1FD9 ; G 1673 +U 8154 ; WX 602 ; N uni1FDA ; G 1674 +U 8155 ; WX 602 ; N uni1FDB ; G 1675 +U 8157 ; WX 602 ; N uni1FDD ; G 1676 +U 8158 ; WX 602 ; N uni1FDE ; G 1677 +U 8159 ; WX 602 ; N uni1FDF ; G 1678 +U 8160 ; WX 602 ; N uni1FE0 ; G 1679 +U 8161 ; WX 602 ; N uni1FE1 ; G 1680 +U 8162 ; WX 602 ; N uni1FE2 ; G 1681 +U 8163 ; WX 602 ; N uni1FE3 ; G 1682 +U 8164 ; WX 602 ; N uni1FE4 ; G 1683 +U 8165 ; WX 602 ; N uni1FE5 ; G 1684 +U 8166 ; WX 602 ; N uni1FE6 ; G 1685 +U 8167 ; WX 602 ; N uni1FE7 ; G 1686 +U 8168 ; WX 602 ; N uni1FE8 ; G 1687 +U 8169 ; WX 602 ; N uni1FE9 ; G 1688 +U 8170 ; WX 602 ; N uni1FEA ; G 1689 +U 8171 ; WX 602 ; N uni1FEB ; G 1690 +U 8172 ; WX 602 ; N uni1FEC ; G 1691 +U 8173 ; WX 602 ; N uni1FED ; G 1692 +U 8174 ; WX 602 ; N uni1FEE ; G 1693 +U 8175 ; WX 602 ; N uni1FEF ; G 1694 +U 8178 ; WX 602 ; N uni1FF2 ; G 1695 +U 8179 ; WX 602 ; N uni1FF3 ; G 1696 +U 8180 ; WX 602 ; N uni1FF4 ; G 1697 +U 8182 ; WX 602 ; N uni1FF6 ; G 1698 +U 8183 ; WX 602 ; N uni1FF7 ; G 1699 +U 8184 ; WX 602 ; N uni1FF8 ; G 1700 +U 8185 ; WX 602 ; N uni1FF9 ; G 1701 +U 8186 ; WX 602 ; N uni1FFA ; G 1702 +U 8187 ; WX 602 ; N uni1FFB ; G 1703 +U 8188 ; WX 602 ; N uni1FFC ; G 1704 +U 8189 ; WX 602 ; N uni1FFD ; G 1705 +U 8190 ; WX 602 ; N uni1FFE ; G 1706 +U 8192 ; WX 602 ; N uni2000 ; G 1707 +U 8193 ; WX 602 ; N uni2001 ; G 1708 +U 8194 ; WX 602 ; N uni2002 ; G 1709 +U 8195 ; WX 602 ; N uni2003 ; G 1710 +U 8196 ; WX 602 ; N uni2004 ; G 1711 +U 8197 ; WX 602 ; N uni2005 ; G 1712 +U 8198 ; WX 602 ; N uni2006 ; G 1713 +U 8199 ; WX 602 ; N uni2007 ; G 1714 +U 8200 ; WX 602 ; N uni2008 ; G 1715 +U 8201 ; WX 602 ; N uni2009 ; G 1716 +U 8202 ; WX 602 ; N uni200A ; G 1717 +U 8208 ; WX 602 ; N uni2010 ; G 1718 +U 8209 ; WX 602 ; N uni2011 ; G 1719 +U 8210 ; WX 602 ; N figuredash ; G 1720 +U 8211 ; WX 602 ; N endash ; G 1721 +U 8212 ; WX 602 ; N emdash ; G 1722 +U 8213 ; WX 602 ; N uni2015 ; G 1723 +U 8214 ; WX 602 ; N uni2016 ; G 1724 +U 8215 ; WX 602 ; N underscoredbl ; G 1725 +U 8216 ; WX 602 ; N quoteleft ; G 1726 +U 8217 ; WX 602 ; N quoteright ; G 1727 +U 8218 ; WX 602 ; N quotesinglbase ; G 1728 +U 8219 ; WX 602 ; N quotereversed ; G 1729 +U 8220 ; WX 602 ; N quotedblleft ; G 1730 +U 8221 ; WX 602 ; N quotedblright ; G 1731 +U 8222 ; WX 602 ; N quotedblbase ; G 1732 +U 8223 ; WX 602 ; N uni201F ; G 1733 +U 8224 ; WX 602 ; N dagger ; G 1734 +U 8225 ; WX 602 ; N daggerdbl ; G 1735 +U 8226 ; WX 602 ; N bullet ; G 1736 +U 8227 ; WX 602 ; N uni2023 ; G 1737 +U 8230 ; WX 602 ; N ellipsis ; G 1738 +U 8239 ; WX 602 ; N uni202F ; G 1739 +U 8240 ; WX 602 ; N perthousand ; G 1740 +U 8241 ; WX 602 ; N uni2031 ; G 1741 +U 8242 ; WX 602 ; N minute ; G 1742 +U 8243 ; WX 602 ; N second ; G 1743 +U 8244 ; WX 602 ; N uni2034 ; G 1744 +U 8245 ; WX 602 ; N uni2035 ; G 1745 +U 8246 ; WX 602 ; N uni2036 ; G 1746 +U 8247 ; WX 602 ; N uni2037 ; G 1747 +U 8249 ; WX 602 ; N guilsinglleft ; G 1748 +U 8250 ; WX 602 ; N guilsinglright ; G 1749 +U 8252 ; WX 602 ; N exclamdbl ; G 1750 +U 8253 ; WX 602 ; N uni203D ; G 1751 +U 8254 ; WX 602 ; N uni203E ; G 1752 +U 8255 ; WX 602 ; N uni203F ; G 1753 +U 8261 ; WX 602 ; N uni2045 ; G 1754 +U 8262 ; WX 602 ; N uni2046 ; G 1755 +U 8263 ; WX 602 ; N uni2047 ; G 1756 +U 8264 ; WX 602 ; N uni2048 ; G 1757 +U 8265 ; WX 602 ; N uni2049 ; G 1758 +U 8267 ; WX 602 ; N uni204B ; G 1759 +U 8287 ; WX 602 ; N uni205F ; G 1760 +U 8304 ; WX 602 ; N uni2070 ; G 1761 +U 8305 ; WX 602 ; N uni2071 ; G 1762 +U 8308 ; WX 602 ; N uni2074 ; G 1763 +U 8309 ; WX 602 ; N uni2075 ; G 1764 +U 8310 ; WX 602 ; N uni2076 ; G 1765 +U 8311 ; WX 602 ; N uni2077 ; G 1766 +U 8312 ; WX 602 ; N uni2078 ; G 1767 +U 8313 ; WX 602 ; N uni2079 ; G 1768 +U 8314 ; WX 602 ; N uni207A ; G 1769 +U 8315 ; WX 602 ; N uni207B ; G 1770 +U 8316 ; WX 602 ; N uni207C ; G 1771 +U 8317 ; WX 602 ; N uni207D ; G 1772 +U 8318 ; WX 602 ; N uni207E ; G 1773 +U 8319 ; WX 602 ; N uni207F ; G 1774 +U 8320 ; WX 602 ; N uni2080 ; G 1775 +U 8321 ; WX 602 ; N uni2081 ; G 1776 +U 8322 ; WX 602 ; N uni2082 ; G 1777 +U 8323 ; WX 602 ; N uni2083 ; G 1778 +U 8324 ; WX 602 ; N uni2084 ; G 1779 +U 8325 ; WX 602 ; N uni2085 ; G 1780 +U 8326 ; WX 602 ; N uni2086 ; G 1781 +U 8327 ; WX 602 ; N uni2087 ; G 1782 +U 8328 ; WX 602 ; N uni2088 ; G 1783 +U 8329 ; WX 602 ; N uni2089 ; G 1784 +U 8330 ; WX 602 ; N uni208A ; G 1785 +U 8331 ; WX 602 ; N uni208B ; G 1786 +U 8332 ; WX 602 ; N uni208C ; G 1787 +U 8333 ; WX 602 ; N uni208D ; G 1788 +U 8334 ; WX 602 ; N uni208E ; G 1789 +U 8336 ; WX 602 ; N uni2090 ; G 1790 +U 8337 ; WX 602 ; N uni2091 ; G 1791 +U 8338 ; WX 602 ; N uni2092 ; G 1792 +U 8339 ; WX 602 ; N uni2093 ; G 1793 +U 8340 ; WX 602 ; N uni2094 ; G 1794 +U 8341 ; WX 602 ; N uni2095 ; G 1795 +U 8342 ; WX 602 ; N uni2096 ; G 1796 +U 8343 ; WX 602 ; N uni2097 ; G 1797 +U 8344 ; WX 602 ; N uni2098 ; G 1798 +U 8345 ; WX 602 ; N uni2099 ; G 1799 +U 8346 ; WX 602 ; N uni209A ; G 1800 +U 8347 ; WX 602 ; N uni209B ; G 1801 +U 8348 ; WX 602 ; N uni209C ; G 1802 +U 8352 ; WX 602 ; N uni20A0 ; G 1803 +U 8353 ; WX 602 ; N colonmonetary ; G 1804 +U 8354 ; WX 602 ; N uni20A2 ; G 1805 +U 8355 ; WX 602 ; N franc ; G 1806 +U 8356 ; WX 602 ; N lira ; G 1807 +U 8357 ; WX 602 ; N uni20A5 ; G 1808 +U 8358 ; WX 602 ; N uni20A6 ; G 1809 +U 8359 ; WX 602 ; N peseta ; G 1810 +U 8360 ; WX 602 ; N uni20A8 ; G 1811 +U 8361 ; WX 602 ; N uni20A9 ; G 1812 +U 8362 ; WX 602 ; N uni20AA ; G 1813 +U 8363 ; WX 602 ; N dong ; G 1814 +U 8364 ; WX 602 ; N Euro ; G 1815 +U 8365 ; WX 602 ; N uni20AD ; G 1816 +U 8366 ; WX 602 ; N uni20AE ; G 1817 +U 8367 ; WX 602 ; N uni20AF ; G 1818 +U 8368 ; WX 602 ; N uni20B0 ; G 1819 +U 8369 ; WX 602 ; N uni20B1 ; G 1820 +U 8370 ; WX 602 ; N uni20B2 ; G 1821 +U 8371 ; WX 602 ; N uni20B3 ; G 1822 +U 8372 ; WX 602 ; N uni20B4 ; G 1823 +U 8373 ; WX 602 ; N uni20B5 ; G 1824 +U 8376 ; WX 602 ; N uni20B8 ; G 1825 +U 8377 ; WX 602 ; N uni20B9 ; G 1826 +U 8378 ; WX 602 ; N uni20BA ; G 1827 +U 8381 ; WX 602 ; N uni20BD ; G 1828 +U 8450 ; WX 602 ; N uni2102 ; G 1829 +U 8453 ; WX 602 ; N uni2105 ; G 1830 +U 8461 ; WX 602 ; N uni210D ; G 1831 +U 8462 ; WX 602 ; N uni210E ; G 1832 +U 8463 ; WX 602 ; N uni210F ; G 1833 +U 8469 ; WX 602 ; N uni2115 ; G 1834 +U 8470 ; WX 602 ; N uni2116 ; G 1835 +U 8471 ; WX 602 ; N uni2117 ; G 1836 +U 8473 ; WX 602 ; N uni2119 ; G 1837 +U 8474 ; WX 602 ; N uni211A ; G 1838 +U 8477 ; WX 602 ; N uni211D ; G 1839 +U 8482 ; WX 602 ; N trademark ; G 1840 +U 8484 ; WX 602 ; N uni2124 ; G 1841 +U 8486 ; WX 602 ; N uni2126 ; G 1842 +U 8490 ; WX 602 ; N uni212A ; G 1843 +U 8491 ; WX 602 ; N uni212B ; G 1844 +U 8494 ; WX 602 ; N estimated ; G 1845 +U 8520 ; WX 602 ; N uni2148 ; G 1846 +U 8528 ; WX 602 ; N uni2150 ; G 1847 +U 8529 ; WX 602 ; N uni2151 ; G 1848 +U 8531 ; WX 602 ; N onethird ; G 1849 +U 8532 ; WX 602 ; N twothirds ; G 1850 +U 8533 ; WX 602 ; N uni2155 ; G 1851 +U 8534 ; WX 602 ; N uni2156 ; G 1852 +U 8535 ; WX 602 ; N uni2157 ; G 1853 +U 8536 ; WX 602 ; N uni2158 ; G 1854 +U 8537 ; WX 602 ; N uni2159 ; G 1855 +U 8538 ; WX 602 ; N uni215A ; G 1856 +U 8539 ; WX 602 ; N oneeighth ; G 1857 +U 8540 ; WX 602 ; N threeeighths ; G 1858 +U 8541 ; WX 602 ; N fiveeighths ; G 1859 +U 8542 ; WX 602 ; N seveneighths ; G 1860 +U 8543 ; WX 602 ; N uni215F ; G 1861 +U 8585 ; WX 602 ; N uni2189 ; G 1862 +U 8592 ; WX 602 ; N arrowleft ; G 1863 +U 8593 ; WX 602 ; N arrowup ; G 1864 +U 8594 ; WX 602 ; N arrowright ; G 1865 +U 8595 ; WX 602 ; N arrowdown ; G 1866 +U 8596 ; WX 602 ; N arrowboth ; G 1867 +U 8597 ; WX 602 ; N arrowupdn ; G 1868 +U 8598 ; WX 602 ; N uni2196 ; G 1869 +U 8599 ; WX 602 ; N uni2197 ; G 1870 +U 8600 ; WX 602 ; N uni2198 ; G 1871 +U 8601 ; WX 602 ; N uni2199 ; G 1872 +U 8602 ; WX 602 ; N uni219A ; G 1873 +U 8603 ; WX 602 ; N uni219B ; G 1874 +U 8604 ; WX 602 ; N uni219C ; G 1875 +U 8605 ; WX 602 ; N uni219D ; G 1876 +U 8606 ; WX 602 ; N uni219E ; G 1877 +U 8607 ; WX 602 ; N uni219F ; G 1878 +U 8608 ; WX 602 ; N uni21A0 ; G 1879 +U 8609 ; WX 602 ; N uni21A1 ; G 1880 +U 8610 ; WX 602 ; N uni21A2 ; G 1881 +U 8611 ; WX 602 ; N uni21A3 ; G 1882 +U 8612 ; WX 602 ; N uni21A4 ; G 1883 +U 8613 ; WX 602 ; N uni21A5 ; G 1884 +U 8614 ; WX 602 ; N uni21A6 ; G 1885 +U 8615 ; WX 602 ; N uni21A7 ; G 1886 +U 8616 ; WX 602 ; N arrowupdnbse ; G 1887 +U 8617 ; WX 602 ; N uni21A9 ; G 1888 +U 8618 ; WX 602 ; N uni21AA ; G 1889 +U 8619 ; WX 602 ; N uni21AB ; G 1890 +U 8620 ; WX 602 ; N uni21AC ; G 1891 +U 8621 ; WX 602 ; N uni21AD ; G 1892 +U 8622 ; WX 602 ; N uni21AE ; G 1893 +U 8623 ; WX 602 ; N uni21AF ; G 1894 +U 8624 ; WX 602 ; N uni21B0 ; G 1895 +U 8625 ; WX 602 ; N uni21B1 ; G 1896 +U 8626 ; WX 602 ; N uni21B2 ; G 1897 +U 8627 ; WX 602 ; N uni21B3 ; G 1898 +U 8628 ; WX 602 ; N uni21B4 ; G 1899 +U 8629 ; WX 602 ; N carriagereturn ; G 1900 +U 8630 ; WX 602 ; N uni21B6 ; G 1901 +U 8631 ; WX 602 ; N uni21B7 ; G 1902 +U 8632 ; WX 602 ; N uni21B8 ; G 1903 +U 8633 ; WX 602 ; N uni21B9 ; G 1904 +U 8634 ; WX 602 ; N uni21BA ; G 1905 +U 8635 ; WX 602 ; N uni21BB ; G 1906 +U 8636 ; WX 602 ; N uni21BC ; G 1907 +U 8637 ; WX 602 ; N uni21BD ; G 1908 +U 8638 ; WX 602 ; N uni21BE ; G 1909 +U 8639 ; WX 602 ; N uni21BF ; G 1910 +U 8640 ; WX 602 ; N uni21C0 ; G 1911 +U 8641 ; WX 602 ; N uni21C1 ; G 1912 +U 8642 ; WX 602 ; N uni21C2 ; G 1913 +U 8643 ; WX 602 ; N uni21C3 ; G 1914 +U 8644 ; WX 602 ; N uni21C4 ; G 1915 +U 8645 ; WX 602 ; N uni21C5 ; G 1916 +U 8646 ; WX 602 ; N uni21C6 ; G 1917 +U 8647 ; WX 602 ; N uni21C7 ; G 1918 +U 8648 ; WX 602 ; N uni21C8 ; G 1919 +U 8649 ; WX 602 ; N uni21C9 ; G 1920 +U 8650 ; WX 602 ; N uni21CA ; G 1921 +U 8651 ; WX 602 ; N uni21CB ; G 1922 +U 8652 ; WX 602 ; N uni21CC ; G 1923 +U 8653 ; WX 602 ; N uni21CD ; G 1924 +U 8654 ; WX 602 ; N uni21CE ; G 1925 +U 8655 ; WX 602 ; N uni21CF ; G 1926 +U 8656 ; WX 602 ; N arrowdblleft ; G 1927 +U 8657 ; WX 602 ; N arrowdblup ; G 1928 +U 8658 ; WX 602 ; N arrowdblright ; G 1929 +U 8659 ; WX 602 ; N arrowdbldown ; G 1930 +U 8660 ; WX 602 ; N arrowdblboth ; G 1931 +U 8661 ; WX 602 ; N uni21D5 ; G 1932 +U 8662 ; WX 602 ; N uni21D6 ; G 1933 +U 8663 ; WX 602 ; N uni21D7 ; G 1934 +U 8664 ; WX 602 ; N uni21D8 ; G 1935 +U 8665 ; WX 602 ; N uni21D9 ; G 1936 +U 8666 ; WX 602 ; N uni21DA ; G 1937 +U 8667 ; WX 602 ; N uni21DB ; G 1938 +U 8668 ; WX 602 ; N uni21DC ; G 1939 +U 8669 ; WX 602 ; N uni21DD ; G 1940 +U 8670 ; WX 602 ; N uni21DE ; G 1941 +U 8671 ; WX 602 ; N uni21DF ; G 1942 +U 8672 ; WX 602 ; N uni21E0 ; G 1943 +U 8673 ; WX 602 ; N uni21E1 ; G 1944 +U 8674 ; WX 602 ; N uni21E2 ; G 1945 +U 8675 ; WX 602 ; N uni21E3 ; G 1946 +U 8676 ; WX 602 ; N uni21E4 ; G 1947 +U 8677 ; WX 602 ; N uni21E5 ; G 1948 +U 8678 ; WX 602 ; N uni21E6 ; G 1949 +U 8679 ; WX 602 ; N uni21E7 ; G 1950 +U 8680 ; WX 602 ; N uni21E8 ; G 1951 +U 8681 ; WX 602 ; N uni21E9 ; G 1952 +U 8682 ; WX 602 ; N uni21EA ; G 1953 +U 8683 ; WX 602 ; N uni21EB ; G 1954 +U 8684 ; WX 602 ; N uni21EC ; G 1955 +U 8685 ; WX 602 ; N uni21ED ; G 1956 +U 8686 ; WX 602 ; N uni21EE ; G 1957 +U 8687 ; WX 602 ; N uni21EF ; G 1958 +U 8688 ; WX 602 ; N uni21F0 ; G 1959 +U 8689 ; WX 602 ; N uni21F1 ; G 1960 +U 8690 ; WX 602 ; N uni21F2 ; G 1961 +U 8691 ; WX 602 ; N uni21F3 ; G 1962 +U 8692 ; WX 602 ; N uni21F4 ; G 1963 +U 8693 ; WX 602 ; N uni21F5 ; G 1964 +U 8694 ; WX 602 ; N uni21F6 ; G 1965 +U 8695 ; WX 602 ; N uni21F7 ; G 1966 +U 8696 ; WX 602 ; N uni21F8 ; G 1967 +U 8697 ; WX 602 ; N uni21F9 ; G 1968 +U 8698 ; WX 602 ; N uni21FA ; G 1969 +U 8699 ; WX 602 ; N uni21FB ; G 1970 +U 8700 ; WX 602 ; N uni21FC ; G 1971 +U 8701 ; WX 602 ; N uni21FD ; G 1972 +U 8702 ; WX 602 ; N uni21FE ; G 1973 +U 8703 ; WX 602 ; N uni21FF ; G 1974 +U 8704 ; WX 602 ; N universal ; G 1975 +U 8705 ; WX 602 ; N uni2201 ; G 1976 +U 8706 ; WX 602 ; N partialdiff ; G 1977 +U 8707 ; WX 602 ; N existential ; G 1978 +U 8708 ; WX 602 ; N uni2204 ; G 1979 +U 8709 ; WX 602 ; N emptyset ; G 1980 +U 8710 ; WX 602 ; N increment ; G 1981 +U 8711 ; WX 602 ; N gradient ; G 1982 +U 8712 ; WX 602 ; N element ; G 1983 +U 8713 ; WX 602 ; N notelement ; G 1984 +U 8714 ; WX 602 ; N uni220A ; G 1985 +U 8715 ; WX 602 ; N suchthat ; G 1986 +U 8716 ; WX 602 ; N uni220C ; G 1987 +U 8717 ; WX 602 ; N uni220D ; G 1988 +U 8718 ; WX 602 ; N uni220E ; G 1989 +U 8719 ; WX 602 ; N product ; G 1990 +U 8720 ; WX 602 ; N uni2210 ; G 1991 +U 8721 ; WX 602 ; N summation ; G 1992 +U 8722 ; WX 602 ; N minus ; G 1993 +U 8723 ; WX 602 ; N uni2213 ; G 1994 +U 8725 ; WX 602 ; N uni2215 ; G 1995 +U 8727 ; WX 602 ; N asteriskmath ; G 1996 +U 8728 ; WX 602 ; N uni2218 ; G 1997 +U 8729 ; WX 602 ; N uni2219 ; G 1998 +U 8730 ; WX 602 ; N radical ; G 1999 +U 8731 ; WX 602 ; N uni221B ; G 2000 +U 8732 ; WX 602 ; N uni221C ; G 2001 +U 8733 ; WX 602 ; N proportional ; G 2002 +U 8734 ; WX 602 ; N infinity ; G 2003 +U 8735 ; WX 602 ; N orthogonal ; G 2004 +U 8736 ; WX 602 ; N angle ; G 2005 +U 8739 ; WX 602 ; N uni2223 ; G 2006 +U 8743 ; WX 602 ; N logicaland ; G 2007 +U 8744 ; WX 602 ; N logicalor ; G 2008 +U 8745 ; WX 602 ; N intersection ; G 2009 +U 8746 ; WX 602 ; N union ; G 2010 +U 8747 ; WX 602 ; N integral ; G 2011 +U 8748 ; WX 602 ; N uni222C ; G 2012 +U 8749 ; WX 602 ; N uni222D ; G 2013 +U 8756 ; WX 602 ; N therefore ; G 2014 +U 8757 ; WX 602 ; N uni2235 ; G 2015 +U 8758 ; WX 602 ; N uni2236 ; G 2016 +U 8759 ; WX 602 ; N uni2237 ; G 2017 +U 8760 ; WX 602 ; N uni2238 ; G 2018 +U 8761 ; WX 602 ; N uni2239 ; G 2019 +U 8762 ; WX 602 ; N uni223A ; G 2020 +U 8763 ; WX 602 ; N uni223B ; G 2021 +U 8764 ; WX 602 ; N similar ; G 2022 +U 8765 ; WX 602 ; N uni223D ; G 2023 +U 8769 ; WX 602 ; N uni2241 ; G 2024 +U 8770 ; WX 602 ; N uni2242 ; G 2025 +U 8771 ; WX 602 ; N uni2243 ; G 2026 +U 8772 ; WX 602 ; N uni2244 ; G 2027 +U 8773 ; WX 602 ; N congruent ; G 2028 +U 8774 ; WX 602 ; N uni2246 ; G 2029 +U 8775 ; WX 602 ; N uni2247 ; G 2030 +U 8776 ; WX 602 ; N approxequal ; G 2031 +U 8777 ; WX 602 ; N uni2249 ; G 2032 +U 8778 ; WX 602 ; N uni224A ; G 2033 +U 8779 ; WX 602 ; N uni224B ; G 2034 +U 8780 ; WX 602 ; N uni224C ; G 2035 +U 8781 ; WX 602 ; N uni224D ; G 2036 +U 8782 ; WX 602 ; N uni224E ; G 2037 +U 8783 ; WX 602 ; N uni224F ; G 2038 +U 8784 ; WX 602 ; N uni2250 ; G 2039 +U 8785 ; WX 602 ; N uni2251 ; G 2040 +U 8786 ; WX 602 ; N uni2252 ; G 2041 +U 8787 ; WX 602 ; N uni2253 ; G 2042 +U 8788 ; WX 602 ; N uni2254 ; G 2043 +U 8789 ; WX 602 ; N uni2255 ; G 2044 +U 8790 ; WX 602 ; N uni2256 ; G 2045 +U 8791 ; WX 602 ; N uni2257 ; G 2046 +U 8792 ; WX 602 ; N uni2258 ; G 2047 +U 8793 ; WX 602 ; N uni2259 ; G 2048 +U 8794 ; WX 602 ; N uni225A ; G 2049 +U 8795 ; WX 602 ; N uni225B ; G 2050 +U 8796 ; WX 602 ; N uni225C ; G 2051 +U 8797 ; WX 602 ; N uni225D ; G 2052 +U 8798 ; WX 602 ; N uni225E ; G 2053 +U 8799 ; WX 602 ; N uni225F ; G 2054 +U 8800 ; WX 602 ; N notequal ; G 2055 +U 8801 ; WX 602 ; N equivalence ; G 2056 +U 8802 ; WX 602 ; N uni2262 ; G 2057 +U 8803 ; WX 602 ; N uni2263 ; G 2058 +U 8804 ; WX 602 ; N lessequal ; G 2059 +U 8805 ; WX 602 ; N greaterequal ; G 2060 +U 8806 ; WX 602 ; N uni2266 ; G 2061 +U 8807 ; WX 602 ; N uni2267 ; G 2062 +U 8808 ; WX 602 ; N uni2268 ; G 2063 +U 8809 ; WX 602 ; N uni2269 ; G 2064 +U 8813 ; WX 602 ; N uni226D ; G 2065 +U 8814 ; WX 602 ; N uni226E ; G 2066 +U 8815 ; WX 602 ; N uni226F ; G 2067 +U 8816 ; WX 602 ; N uni2270 ; G 2068 +U 8817 ; WX 602 ; N uni2271 ; G 2069 +U 8818 ; WX 602 ; N uni2272 ; G 2070 +U 8819 ; WX 602 ; N uni2273 ; G 2071 +U 8820 ; WX 602 ; N uni2274 ; G 2072 +U 8821 ; WX 602 ; N uni2275 ; G 2073 +U 8822 ; WX 602 ; N uni2276 ; G 2074 +U 8823 ; WX 602 ; N uni2277 ; G 2075 +U 8824 ; WX 602 ; N uni2278 ; G 2076 +U 8825 ; WX 602 ; N uni2279 ; G 2077 +U 8826 ; WX 602 ; N uni227A ; G 2078 +U 8827 ; WX 602 ; N uni227B ; G 2079 +U 8828 ; WX 602 ; N uni227C ; G 2080 +U 8829 ; WX 602 ; N uni227D ; G 2081 +U 8830 ; WX 602 ; N uni227E ; G 2082 +U 8831 ; WX 602 ; N uni227F ; G 2083 +U 8832 ; WX 602 ; N uni2280 ; G 2084 +U 8833 ; WX 602 ; N uni2281 ; G 2085 +U 8834 ; WX 602 ; N propersubset ; G 2086 +U 8835 ; WX 602 ; N propersuperset ; G 2087 +U 8836 ; WX 602 ; N notsubset ; G 2088 +U 8837 ; WX 602 ; N uni2285 ; G 2089 +U 8838 ; WX 602 ; N reflexsubset ; G 2090 +U 8839 ; WX 602 ; N reflexsuperset ; G 2091 +U 8840 ; WX 602 ; N uni2288 ; G 2092 +U 8841 ; WX 602 ; N uni2289 ; G 2093 +U 8842 ; WX 602 ; N uni228A ; G 2094 +U 8843 ; WX 602 ; N uni228B ; G 2095 +U 8845 ; WX 602 ; N uni228D ; G 2096 +U 8846 ; WX 602 ; N uni228E ; G 2097 +U 8847 ; WX 602 ; N uni228F ; G 2098 +U 8848 ; WX 602 ; N uni2290 ; G 2099 +U 8849 ; WX 602 ; N uni2291 ; G 2100 +U 8850 ; WX 602 ; N uni2292 ; G 2101 +U 8851 ; WX 602 ; N uni2293 ; G 2102 +U 8852 ; WX 602 ; N uni2294 ; G 2103 +U 8853 ; WX 602 ; N circleplus ; G 2104 +U 8854 ; WX 602 ; N uni2296 ; G 2105 +U 8855 ; WX 602 ; N circlemultiply ; G 2106 +U 8856 ; WX 602 ; N uni2298 ; G 2107 +U 8857 ; WX 602 ; N uni2299 ; G 2108 +U 8858 ; WX 602 ; N uni229A ; G 2109 +U 8859 ; WX 602 ; N uni229B ; G 2110 +U 8860 ; WX 602 ; N uni229C ; G 2111 +U 8861 ; WX 602 ; N uni229D ; G 2112 +U 8862 ; WX 602 ; N uni229E ; G 2113 +U 8863 ; WX 602 ; N uni229F ; G 2114 +U 8864 ; WX 602 ; N uni22A0 ; G 2115 +U 8865 ; WX 602 ; N uni22A1 ; G 2116 +U 8866 ; WX 602 ; N uni22A2 ; G 2117 +U 8867 ; WX 602 ; N uni22A3 ; G 2118 +U 8868 ; WX 602 ; N uni22A4 ; G 2119 +U 8869 ; WX 602 ; N perpendicular ; G 2120 +U 8882 ; WX 602 ; N uni22B2 ; G 2121 +U 8883 ; WX 602 ; N uni22B3 ; G 2122 +U 8884 ; WX 602 ; N uni22B4 ; G 2123 +U 8885 ; WX 602 ; N uni22B5 ; G 2124 +U 8888 ; WX 602 ; N uni22B8 ; G 2125 +U 8898 ; WX 602 ; N uni22C2 ; G 2126 +U 8899 ; WX 602 ; N uni22C3 ; G 2127 +U 8900 ; WX 602 ; N uni22C4 ; G 2128 +U 8901 ; WX 602 ; N dotmath ; G 2129 +U 8902 ; WX 602 ; N uni22C6 ; G 2130 +U 8909 ; WX 602 ; N uni22CD ; G 2131 +U 8910 ; WX 602 ; N uni22CE ; G 2132 +U 8911 ; WX 602 ; N uni22CF ; G 2133 +U 8912 ; WX 602 ; N uni22D0 ; G 2134 +U 8913 ; WX 602 ; N uni22D1 ; G 2135 +U 8922 ; WX 602 ; N uni22DA ; G 2136 +U 8923 ; WX 602 ; N uni22DB ; G 2137 +U 8924 ; WX 602 ; N uni22DC ; G 2138 +U 8925 ; WX 602 ; N uni22DD ; G 2139 +U 8926 ; WX 602 ; N uni22DE ; G 2140 +U 8927 ; WX 602 ; N uni22DF ; G 2141 +U 8928 ; WX 602 ; N uni22E0 ; G 2142 +U 8929 ; WX 602 ; N uni22E1 ; G 2143 +U 8930 ; WX 602 ; N uni22E2 ; G 2144 +U 8931 ; WX 602 ; N uni22E3 ; G 2145 +U 8932 ; WX 602 ; N uni22E4 ; G 2146 +U 8933 ; WX 602 ; N uni22E5 ; G 2147 +U 8934 ; WX 602 ; N uni22E6 ; G 2148 +U 8935 ; WX 602 ; N uni22E7 ; G 2149 +U 8936 ; WX 602 ; N uni22E8 ; G 2150 +U 8937 ; WX 602 ; N uni22E9 ; G 2151 +U 8943 ; WX 602 ; N uni22EF ; G 2152 +U 8960 ; WX 602 ; N uni2300 ; G 2153 +U 8961 ; WX 602 ; N uni2301 ; G 2154 +U 8962 ; WX 602 ; N house ; G 2155 +U 8963 ; WX 602 ; N uni2303 ; G 2156 +U 8964 ; WX 602 ; N uni2304 ; G 2157 +U 8965 ; WX 602 ; N uni2305 ; G 2158 +U 8966 ; WX 602 ; N uni2306 ; G 2159 +U 8968 ; WX 602 ; N uni2308 ; G 2160 +U 8969 ; WX 602 ; N uni2309 ; G 2161 +U 8970 ; WX 602 ; N uni230A ; G 2162 +U 8971 ; WX 602 ; N uni230B ; G 2163 +U 8972 ; WX 602 ; N uni230C ; G 2164 +U 8973 ; WX 602 ; N uni230D ; G 2165 +U 8974 ; WX 602 ; N uni230E ; G 2166 +U 8975 ; WX 602 ; N uni230F ; G 2167 +U 8976 ; WX 602 ; N revlogicalnot ; G 2168 +U 8977 ; WX 602 ; N uni2311 ; G 2169 +U 8978 ; WX 602 ; N uni2312 ; G 2170 +U 8979 ; WX 602 ; N uni2313 ; G 2171 +U 8980 ; WX 602 ; N uni2314 ; G 2172 +U 8981 ; WX 602 ; N uni2315 ; G 2173 +U 8984 ; WX 602 ; N uni2318 ; G 2174 +U 8985 ; WX 602 ; N uni2319 ; G 2175 +U 8988 ; WX 602 ; N uni231C ; G 2176 +U 8989 ; WX 602 ; N uni231D ; G 2177 +U 8990 ; WX 602 ; N uni231E ; G 2178 +U 8991 ; WX 602 ; N uni231F ; G 2179 +U 8992 ; WX 602 ; N integraltp ; G 2180 +U 8993 ; WX 602 ; N integralbt ; G 2181 +U 8997 ; WX 602 ; N uni2325 ; G 2182 +U 8998 ; WX 602 ; N uni2326 ; G 2183 +U 8999 ; WX 602 ; N uni2327 ; G 2184 +U 9000 ; WX 602 ; N uni2328 ; G 2185 +U 9003 ; WX 602 ; N uni232B ; G 2186 +U 9013 ; WX 602 ; N uni2335 ; G 2187 +U 9014 ; WX 602 ; N uni2336 ; G 2188 +U 9015 ; WX 602 ; N uni2337 ; G 2189 +U 9016 ; WX 602 ; N uni2338 ; G 2190 +U 9017 ; WX 602 ; N uni2339 ; G 2191 +U 9018 ; WX 602 ; N uni233A ; G 2192 +U 9019 ; WX 602 ; N uni233B ; G 2193 +U 9020 ; WX 602 ; N uni233C ; G 2194 +U 9021 ; WX 602 ; N uni233D ; G 2195 +U 9022 ; WX 602 ; N uni233E ; G 2196 +U 9023 ; WX 602 ; N uni233F ; G 2197 +U 9024 ; WX 602 ; N uni2340 ; G 2198 +U 9025 ; WX 602 ; N uni2341 ; G 2199 +U 9026 ; WX 602 ; N uni2342 ; G 2200 +U 9027 ; WX 602 ; N uni2343 ; G 2201 +U 9028 ; WX 602 ; N uni2344 ; G 2202 +U 9029 ; WX 602 ; N uni2345 ; G 2203 +U 9030 ; WX 602 ; N uni2346 ; G 2204 +U 9031 ; WX 602 ; N uni2347 ; G 2205 +U 9032 ; WX 602 ; N uni2348 ; G 2206 +U 9033 ; WX 602 ; N uni2349 ; G 2207 +U 9034 ; WX 602 ; N uni234A ; G 2208 +U 9035 ; WX 602 ; N uni234B ; G 2209 +U 9036 ; WX 602 ; N uni234C ; G 2210 +U 9037 ; WX 602 ; N uni234D ; G 2211 +U 9038 ; WX 602 ; N uni234E ; G 2212 +U 9039 ; WX 602 ; N uni234F ; G 2213 +U 9040 ; WX 602 ; N uni2350 ; G 2214 +U 9041 ; WX 602 ; N uni2351 ; G 2215 +U 9042 ; WX 602 ; N uni2352 ; G 2216 +U 9043 ; WX 602 ; N uni2353 ; G 2217 +U 9044 ; WX 602 ; N uni2354 ; G 2218 +U 9045 ; WX 602 ; N uni2355 ; G 2219 +U 9046 ; WX 602 ; N uni2356 ; G 2220 +U 9047 ; WX 602 ; N uni2357 ; G 2221 +U 9048 ; WX 602 ; N uni2358 ; G 2222 +U 9049 ; WX 602 ; N uni2359 ; G 2223 +U 9050 ; WX 602 ; N uni235A ; G 2224 +U 9051 ; WX 602 ; N uni235B ; G 2225 +U 9052 ; WX 602 ; N uni235C ; G 2226 +U 9053 ; WX 602 ; N uni235D ; G 2227 +U 9054 ; WX 602 ; N uni235E ; G 2228 +U 9055 ; WX 602 ; N uni235F ; G 2229 +U 9056 ; WX 602 ; N uni2360 ; G 2230 +U 9057 ; WX 602 ; N uni2361 ; G 2231 +U 9058 ; WX 602 ; N uni2362 ; G 2232 +U 9059 ; WX 602 ; N uni2363 ; G 2233 +U 9060 ; WX 602 ; N uni2364 ; G 2234 +U 9061 ; WX 602 ; N uni2365 ; G 2235 +U 9062 ; WX 602 ; N uni2366 ; G 2236 +U 9063 ; WX 602 ; N uni2367 ; G 2237 +U 9064 ; WX 602 ; N uni2368 ; G 2238 +U 9065 ; WX 602 ; N uni2369 ; G 2239 +U 9066 ; WX 602 ; N uni236A ; G 2240 +U 9067 ; WX 602 ; N uni236B ; G 2241 +U 9068 ; WX 602 ; N uni236C ; G 2242 +U 9069 ; WX 602 ; N uni236D ; G 2243 +U 9070 ; WX 602 ; N uni236E ; G 2244 +U 9071 ; WX 602 ; N uni236F ; G 2245 +U 9072 ; WX 602 ; N uni2370 ; G 2246 +U 9073 ; WX 602 ; N uni2371 ; G 2247 +U 9074 ; WX 602 ; N uni2372 ; G 2248 +U 9075 ; WX 602 ; N uni2373 ; G 2249 +U 9076 ; WX 602 ; N uni2374 ; G 2250 +U 9077 ; WX 602 ; N uni2375 ; G 2251 +U 9078 ; WX 602 ; N uni2376 ; G 2252 +U 9079 ; WX 602 ; N uni2377 ; G 2253 +U 9080 ; WX 602 ; N uni2378 ; G 2254 +U 9081 ; WX 602 ; N uni2379 ; G 2255 +U 9082 ; WX 602 ; N uni237A ; G 2256 +U 9085 ; WX 602 ; N uni237D ; G 2257 +U 9088 ; WX 602 ; N uni2380 ; G 2258 +U 9089 ; WX 602 ; N uni2381 ; G 2259 +U 9090 ; WX 602 ; N uni2382 ; G 2260 +U 9091 ; WX 602 ; N uni2383 ; G 2261 +U 9096 ; WX 602 ; N uni2388 ; G 2262 +U 9097 ; WX 602 ; N uni2389 ; G 2263 +U 9098 ; WX 602 ; N uni238A ; G 2264 +U 9099 ; WX 602 ; N uni238B ; G 2265 +U 9109 ; WX 602 ; N uni2395 ; G 2266 +U 9115 ; WX 602 ; N uni239B ; G 2267 +U 9116 ; WX 602 ; N uni239C ; G 2268 +U 9117 ; WX 602 ; N uni239D ; G 2269 +U 9118 ; WX 602 ; N uni239E ; G 2270 +U 9119 ; WX 602 ; N uni239F ; G 2271 +U 9120 ; WX 602 ; N uni23A0 ; G 2272 +U 9121 ; WX 602 ; N uni23A1 ; G 2273 +U 9122 ; WX 602 ; N uni23A2 ; G 2274 +U 9123 ; WX 602 ; N uni23A3 ; G 2275 +U 9124 ; WX 602 ; N uni23A4 ; G 2276 +U 9125 ; WX 602 ; N uni23A5 ; G 2277 +U 9126 ; WX 602 ; N uni23A6 ; G 2278 +U 9127 ; WX 602 ; N uni23A7 ; G 2279 +U 9128 ; WX 602 ; N uni23A8 ; G 2280 +U 9129 ; WX 602 ; N uni23A9 ; G 2281 +U 9130 ; WX 602 ; N uni23AA ; G 2282 +U 9131 ; WX 602 ; N uni23AB ; G 2283 +U 9132 ; WX 602 ; N uni23AC ; G 2284 +U 9133 ; WX 602 ; N uni23AD ; G 2285 +U 9134 ; WX 602 ; N uni23AE ; G 2286 +U 9166 ; WX 602 ; N uni23CE ; G 2287 +U 9167 ; WX 602 ; N uni23CF ; G 2288 +U 9251 ; WX 602 ; N uni2423 ; G 2289 +U 9472 ; WX 602 ; N SF100000 ; G 2290 +U 9473 ; WX 602 ; N uni2501 ; G 2291 +U 9474 ; WX 602 ; N SF110000 ; G 2292 +U 9475 ; WX 602 ; N uni2503 ; G 2293 +U 9476 ; WX 602 ; N uni2504 ; G 2294 +U 9477 ; WX 602 ; N uni2505 ; G 2295 +U 9478 ; WX 602 ; N uni2506 ; G 2296 +U 9479 ; WX 602 ; N uni2507 ; G 2297 +U 9480 ; WX 602 ; N uni2508 ; G 2298 +U 9481 ; WX 602 ; N uni2509 ; G 2299 +U 9482 ; WX 602 ; N uni250A ; G 2300 +U 9483 ; WX 602 ; N uni250B ; G 2301 +U 9484 ; WX 602 ; N SF010000 ; G 2302 +U 9485 ; WX 602 ; N uni250D ; G 2303 +U 9486 ; WX 602 ; N uni250E ; G 2304 +U 9487 ; WX 602 ; N uni250F ; G 2305 +U 9488 ; WX 602 ; N SF030000 ; G 2306 +U 9489 ; WX 602 ; N uni2511 ; G 2307 +U 9490 ; WX 602 ; N uni2512 ; G 2308 +U 9491 ; WX 602 ; N uni2513 ; G 2309 +U 9492 ; WX 602 ; N SF020000 ; G 2310 +U 9493 ; WX 602 ; N uni2515 ; G 2311 +U 9494 ; WX 602 ; N uni2516 ; G 2312 +U 9495 ; WX 602 ; N uni2517 ; G 2313 +U 9496 ; WX 602 ; N SF040000 ; G 2314 +U 9497 ; WX 602 ; N uni2519 ; G 2315 +U 9498 ; WX 602 ; N uni251A ; G 2316 +U 9499 ; WX 602 ; N uni251B ; G 2317 +U 9500 ; WX 602 ; N SF080000 ; G 2318 +U 9501 ; WX 602 ; N uni251D ; G 2319 +U 9502 ; WX 602 ; N uni251E ; G 2320 +U 9503 ; WX 602 ; N uni251F ; G 2321 +U 9504 ; WX 602 ; N uni2520 ; G 2322 +U 9505 ; WX 602 ; N uni2521 ; G 2323 +U 9506 ; WX 602 ; N uni2522 ; G 2324 +U 9507 ; WX 602 ; N uni2523 ; G 2325 +U 9508 ; WX 602 ; N SF090000 ; G 2326 +U 9509 ; WX 602 ; N uni2525 ; G 2327 +U 9510 ; WX 602 ; N uni2526 ; G 2328 +U 9511 ; WX 602 ; N uni2527 ; G 2329 +U 9512 ; WX 602 ; N uni2528 ; G 2330 +U 9513 ; WX 602 ; N uni2529 ; G 2331 +U 9514 ; WX 602 ; N uni252A ; G 2332 +U 9515 ; WX 602 ; N uni252B ; G 2333 +U 9516 ; WX 602 ; N SF060000 ; G 2334 +U 9517 ; WX 602 ; N uni252D ; G 2335 +U 9518 ; WX 602 ; N uni252E ; G 2336 +U 9519 ; WX 602 ; N uni252F ; G 2337 +U 9520 ; WX 602 ; N uni2530 ; G 2338 +U 9521 ; WX 602 ; N uni2531 ; G 2339 +U 9522 ; WX 602 ; N uni2532 ; G 2340 +U 9523 ; WX 602 ; N uni2533 ; G 2341 +U 9524 ; WX 602 ; N SF070000 ; G 2342 +U 9525 ; WX 602 ; N uni2535 ; G 2343 +U 9526 ; WX 602 ; N uni2536 ; G 2344 +U 9527 ; WX 602 ; N uni2537 ; G 2345 +U 9528 ; WX 602 ; N uni2538 ; G 2346 +U 9529 ; WX 602 ; N uni2539 ; G 2347 +U 9530 ; WX 602 ; N uni253A ; G 2348 +U 9531 ; WX 602 ; N uni253B ; G 2349 +U 9532 ; WX 602 ; N SF050000 ; G 2350 +U 9533 ; WX 602 ; N uni253D ; G 2351 +U 9534 ; WX 602 ; N uni253E ; G 2352 +U 9535 ; WX 602 ; N uni253F ; G 2353 +U 9536 ; WX 602 ; N uni2540 ; G 2354 +U 9537 ; WX 602 ; N uni2541 ; G 2355 +U 9538 ; WX 602 ; N uni2542 ; G 2356 +U 9539 ; WX 602 ; N uni2543 ; G 2357 +U 9540 ; WX 602 ; N uni2544 ; G 2358 +U 9541 ; WX 602 ; N uni2545 ; G 2359 +U 9542 ; WX 602 ; N uni2546 ; G 2360 +U 9543 ; WX 602 ; N uni2547 ; G 2361 +U 9544 ; WX 602 ; N uni2548 ; G 2362 +U 9545 ; WX 602 ; N uni2549 ; G 2363 +U 9546 ; WX 602 ; N uni254A ; G 2364 +U 9547 ; WX 602 ; N uni254B ; G 2365 +U 9548 ; WX 602 ; N uni254C ; G 2366 +U 9549 ; WX 602 ; N uni254D ; G 2367 +U 9550 ; WX 602 ; N uni254E ; G 2368 +U 9551 ; WX 602 ; N uni254F ; G 2369 +U 9552 ; WX 602 ; N SF430000 ; G 2370 +U 9553 ; WX 602 ; N SF240000 ; G 2371 +U 9554 ; WX 602 ; N SF510000 ; G 2372 +U 9555 ; WX 602 ; N SF520000 ; G 2373 +U 9556 ; WX 602 ; N SF390000 ; G 2374 +U 9557 ; WX 602 ; N SF220000 ; G 2375 +U 9558 ; WX 602 ; N SF210000 ; G 2376 +U 9559 ; WX 602 ; N SF250000 ; G 2377 +U 9560 ; WX 602 ; N SF500000 ; G 2378 +U 9561 ; WX 602 ; N SF490000 ; G 2379 +U 9562 ; WX 602 ; N SF380000 ; G 2380 +U 9563 ; WX 602 ; N SF280000 ; G 2381 +U 9564 ; WX 602 ; N SF270000 ; G 2382 +U 9565 ; WX 602 ; N SF260000 ; G 2383 +U 9566 ; WX 602 ; N SF360000 ; G 2384 +U 9567 ; WX 602 ; N SF370000 ; G 2385 +U 9568 ; WX 602 ; N SF420000 ; G 2386 +U 9569 ; WX 602 ; N SF190000 ; G 2387 +U 9570 ; WX 602 ; N SF200000 ; G 2388 +U 9571 ; WX 602 ; N SF230000 ; G 2389 +U 9572 ; WX 602 ; N SF470000 ; G 2390 +U 9573 ; WX 602 ; N SF480000 ; G 2391 +U 9574 ; WX 602 ; N SF410000 ; G 2392 +U 9575 ; WX 602 ; N SF450000 ; G 2393 +U 9576 ; WX 602 ; N SF460000 ; G 2394 +U 9577 ; WX 602 ; N SF400000 ; G 2395 +U 9578 ; WX 602 ; N SF540000 ; G 2396 +U 9579 ; WX 602 ; N SF530000 ; G 2397 +U 9580 ; WX 602 ; N SF440000 ; G 2398 +U 9581 ; WX 602 ; N uni256D ; G 2399 +U 9582 ; WX 602 ; N uni256E ; G 2400 +U 9583 ; WX 602 ; N uni256F ; G 2401 +U 9584 ; WX 602 ; N uni2570 ; G 2402 +U 9585 ; WX 602 ; N uni2571 ; G 2403 +U 9586 ; WX 602 ; N uni2572 ; G 2404 +U 9587 ; WX 602 ; N uni2573 ; G 2405 +U 9588 ; WX 602 ; N uni2574 ; G 2406 +U 9589 ; WX 602 ; N uni2575 ; G 2407 +U 9590 ; WX 602 ; N uni2576 ; G 2408 +U 9591 ; WX 602 ; N uni2577 ; G 2409 +U 9592 ; WX 602 ; N uni2578 ; G 2410 +U 9593 ; WX 602 ; N uni2579 ; G 2411 +U 9594 ; WX 602 ; N uni257A ; G 2412 +U 9595 ; WX 602 ; N uni257B ; G 2413 +U 9596 ; WX 602 ; N uni257C ; G 2414 +U 9597 ; WX 602 ; N uni257D ; G 2415 +U 9598 ; WX 602 ; N uni257E ; G 2416 +U 9599 ; WX 602 ; N uni257F ; G 2417 +U 9600 ; WX 602 ; N upblock ; G 2418 +U 9601 ; WX 602 ; N uni2581 ; G 2419 +U 9602 ; WX 602 ; N uni2582 ; G 2420 +U 9603 ; WX 602 ; N uni2583 ; G 2421 +U 9604 ; WX 602 ; N dnblock ; G 2422 +U 9605 ; WX 602 ; N uni2585 ; G 2423 +U 9606 ; WX 602 ; N uni2586 ; G 2424 +U 9607 ; WX 602 ; N uni2587 ; G 2425 +U 9608 ; WX 602 ; N block ; G 2426 +U 9609 ; WX 602 ; N uni2589 ; G 2427 +U 9610 ; WX 602 ; N uni258A ; G 2428 +U 9611 ; WX 602 ; N uni258B ; G 2429 +U 9612 ; WX 602 ; N lfblock ; G 2430 +U 9613 ; WX 602 ; N uni258D ; G 2431 +U 9614 ; WX 602 ; N uni258E ; G 2432 +U 9615 ; WX 602 ; N uni258F ; G 2433 +U 9616 ; WX 602 ; N rtblock ; G 2434 +U 9617 ; WX 602 ; N ltshade ; G 2435 +U 9618 ; WX 602 ; N shade ; G 2436 +U 9619 ; WX 602 ; N dkshade ; G 2437 +U 9620 ; WX 602 ; N uni2594 ; G 2438 +U 9621 ; WX 602 ; N uni2595 ; G 2439 +U 9622 ; WX 602 ; N uni2596 ; G 2440 +U 9623 ; WX 602 ; N uni2597 ; G 2441 +U 9624 ; WX 602 ; N uni2598 ; G 2442 +U 9625 ; WX 602 ; N uni2599 ; G 2443 +U 9626 ; WX 602 ; N uni259A ; G 2444 +U 9627 ; WX 602 ; N uni259B ; G 2445 +U 9628 ; WX 602 ; N uni259C ; G 2446 +U 9629 ; WX 602 ; N uni259D ; G 2447 +U 9630 ; WX 602 ; N uni259E ; G 2448 +U 9631 ; WX 602 ; N uni259F ; G 2449 +U 9632 ; WX 602 ; N filledbox ; G 2450 +U 9633 ; WX 602 ; N H22073 ; G 2451 +U 9634 ; WX 602 ; N uni25A2 ; G 2452 +U 9635 ; WX 602 ; N uni25A3 ; G 2453 +U 9636 ; WX 602 ; N uni25A4 ; G 2454 +U 9637 ; WX 602 ; N uni25A5 ; G 2455 +U 9638 ; WX 602 ; N uni25A6 ; G 2456 +U 9639 ; WX 602 ; N uni25A7 ; G 2457 +U 9640 ; WX 602 ; N uni25A8 ; G 2458 +U 9641 ; WX 602 ; N uni25A9 ; G 2459 +U 9642 ; WX 602 ; N H18543 ; G 2460 +U 9643 ; WX 602 ; N H18551 ; G 2461 +U 9644 ; WX 602 ; N filledrect ; G 2462 +U 9645 ; WX 602 ; N uni25AD ; G 2463 +U 9646 ; WX 602 ; N uni25AE ; G 2464 +U 9647 ; WX 602 ; N uni25AF ; G 2465 +U 9648 ; WX 602 ; N uni25B0 ; G 2466 +U 9649 ; WX 602 ; N uni25B1 ; G 2467 +U 9650 ; WX 602 ; N triagup ; G 2468 +U 9651 ; WX 602 ; N uni25B3 ; G 2469 +U 9652 ; WX 602 ; N uni25B4 ; G 2470 +U 9653 ; WX 602 ; N uni25B5 ; G 2471 +U 9654 ; WX 602 ; N uni25B6 ; G 2472 +U 9655 ; WX 602 ; N uni25B7 ; G 2473 +U 9656 ; WX 602 ; N uni25B8 ; G 2474 +U 9657 ; WX 602 ; N uni25B9 ; G 2475 +U 9658 ; WX 602 ; N triagrt ; G 2476 +U 9659 ; WX 602 ; N uni25BB ; G 2477 +U 9660 ; WX 602 ; N triagdn ; G 2478 +U 9661 ; WX 602 ; N uni25BD ; G 2479 +U 9662 ; WX 602 ; N uni25BE ; G 2480 +U 9663 ; WX 602 ; N uni25BF ; G 2481 +U 9664 ; WX 602 ; N uni25C0 ; G 2482 +U 9665 ; WX 602 ; N uni25C1 ; G 2483 +U 9666 ; WX 602 ; N uni25C2 ; G 2484 +U 9667 ; WX 602 ; N uni25C3 ; G 2485 +U 9668 ; WX 602 ; N triaglf ; G 2486 +U 9669 ; WX 602 ; N uni25C5 ; G 2487 +U 9670 ; WX 602 ; N uni25C6 ; G 2488 +U 9671 ; WX 602 ; N uni25C7 ; G 2489 +U 9672 ; WX 602 ; N uni25C8 ; G 2490 +U 9673 ; WX 602 ; N uni25C9 ; G 2491 +U 9674 ; WX 602 ; N lozenge ; G 2492 +U 9675 ; WX 602 ; N circle ; G 2493 +U 9676 ; WX 602 ; N uni25CC ; G 2494 +U 9677 ; WX 602 ; N uni25CD ; G 2495 +U 9678 ; WX 602 ; N uni25CE ; G 2496 +U 9679 ; WX 602 ; N H18533 ; G 2497 +U 9680 ; WX 602 ; N uni25D0 ; G 2498 +U 9681 ; WX 602 ; N uni25D1 ; G 2499 +U 9682 ; WX 602 ; N uni25D2 ; G 2500 +U 9683 ; WX 602 ; N uni25D3 ; G 2501 +U 9684 ; WX 602 ; N uni25D4 ; G 2502 +U 9685 ; WX 602 ; N uni25D5 ; G 2503 +U 9686 ; WX 602 ; N uni25D6 ; G 2504 +U 9687 ; WX 602 ; N uni25D7 ; G 2505 +U 9688 ; WX 602 ; N invbullet ; G 2506 +U 9689 ; WX 602 ; N invcircle ; G 2507 +U 9690 ; WX 602 ; N uni25DA ; G 2508 +U 9691 ; WX 602 ; N uni25DB ; G 2509 +U 9692 ; WX 602 ; N uni25DC ; G 2510 +U 9693 ; WX 602 ; N uni25DD ; G 2511 +U 9694 ; WX 602 ; N uni25DE ; G 2512 +U 9695 ; WX 602 ; N uni25DF ; G 2513 +U 9696 ; WX 602 ; N uni25E0 ; G 2514 +U 9697 ; WX 602 ; N uni25E1 ; G 2515 +U 9698 ; WX 602 ; N uni25E2 ; G 2516 +U 9699 ; WX 602 ; N uni25E3 ; G 2517 +U 9700 ; WX 602 ; N uni25E4 ; G 2518 +U 9701 ; WX 602 ; N uni25E5 ; G 2519 +U 9702 ; WX 602 ; N openbullet ; G 2520 +U 9703 ; WX 602 ; N uni25E7 ; G 2521 +U 9704 ; WX 602 ; N uni25E8 ; G 2522 +U 9705 ; WX 602 ; N uni25E9 ; G 2523 +U 9706 ; WX 602 ; N uni25EA ; G 2524 +U 9707 ; WX 602 ; N uni25EB ; G 2525 +U 9708 ; WX 602 ; N uni25EC ; G 2526 +U 9709 ; WX 602 ; N uni25ED ; G 2527 +U 9710 ; WX 602 ; N uni25EE ; G 2528 +U 9711 ; WX 602 ; N uni25EF ; G 2529 +U 9712 ; WX 602 ; N uni25F0 ; G 2530 +U 9713 ; WX 602 ; N uni25F1 ; G 2531 +U 9714 ; WX 602 ; N uni25F2 ; G 2532 +U 9715 ; WX 602 ; N uni25F3 ; G 2533 +U 9716 ; WX 602 ; N uni25F4 ; G 2534 +U 9717 ; WX 602 ; N uni25F5 ; G 2535 +U 9718 ; WX 602 ; N uni25F6 ; G 2536 +U 9719 ; WX 602 ; N uni25F7 ; G 2537 +U 9720 ; WX 602 ; N uni25F8 ; G 2538 +U 9721 ; WX 602 ; N uni25F9 ; G 2539 +U 9722 ; WX 602 ; N uni25FA ; G 2540 +U 9723 ; WX 602 ; N uni25FB ; G 2541 +U 9724 ; WX 602 ; N uni25FC ; G 2542 +U 9725 ; WX 602 ; N uni25FD ; G 2543 +U 9726 ; WX 602 ; N uni25FE ; G 2544 +U 9727 ; WX 602 ; N uni25FF ; G 2545 +U 9728 ; WX 602 ; N uni2600 ; G 2546 +U 9784 ; WX 602 ; N uni2638 ; G 2547 +U 9785 ; WX 602 ; N uni2639 ; G 2548 +U 9786 ; WX 602 ; N smileface ; G 2549 +U 9787 ; WX 602 ; N invsmileface ; G 2550 +U 9788 ; WX 602 ; N sun ; G 2551 +U 9791 ; WX 602 ; N uni263F ; G 2552 +U 9792 ; WX 602 ; N female ; G 2553 +U 9793 ; WX 602 ; N uni2641 ; G 2554 +U 9794 ; WX 602 ; N male ; G 2555 +U 9795 ; WX 602 ; N uni2643 ; G 2556 +U 9796 ; WX 602 ; N uni2644 ; G 2557 +U 9797 ; WX 602 ; N uni2645 ; G 2558 +U 9798 ; WX 602 ; N uni2646 ; G 2559 +U 9799 ; WX 602 ; N uni2647 ; G 2560 +U 9824 ; WX 602 ; N spade ; G 2561 +U 9825 ; WX 602 ; N uni2661 ; G 2562 +U 9826 ; WX 602 ; N uni2662 ; G 2563 +U 9827 ; WX 602 ; N club ; G 2564 +U 9828 ; WX 602 ; N uni2664 ; G 2565 +U 9829 ; WX 602 ; N heart ; G 2566 +U 9830 ; WX 602 ; N diamond ; G 2567 +U 9831 ; WX 602 ; N uni2667 ; G 2568 +U 9833 ; WX 602 ; N uni2669 ; G 2569 +U 9834 ; WX 602 ; N musicalnote ; G 2570 +U 9835 ; WX 602 ; N musicalnotedbl ; G 2571 +U 9836 ; WX 602 ; N uni266C ; G 2572 +U 9837 ; WX 602 ; N uni266D ; G 2573 +U 9838 ; WX 602 ; N uni266E ; G 2574 +U 9839 ; WX 602 ; N uni266F ; G 2575 +U 10178 ; WX 602 ; N uni27C2 ; G 2576 +U 10181 ; WX 602 ; N uni27C5 ; G 2577 +U 10182 ; WX 602 ; N uni27C6 ; G 2578 +U 10204 ; WX 602 ; N uni27DC ; G 2579 +U 10208 ; WX 602 ; N uni27E0 ; G 2580 +U 10214 ; WX 602 ; N uni27E6 ; G 2581 +U 10215 ; WX 602 ; N uni27E7 ; G 2582 +U 10216 ; WX 602 ; N uni27E8 ; G 2583 +U 10217 ; WX 602 ; N uni27E9 ; G 2584 +U 10218 ; WX 602 ; N uni27EA ; G 2585 +U 10219 ; WX 602 ; N uni27EB ; G 2586 +U 10229 ; WX 602 ; N uni27F5 ; G 2587 +U 10230 ; WX 602 ; N uni27F6 ; G 2588 +U 10231 ; WX 602 ; N uni27F7 ; G 2589 +U 10631 ; WX 602 ; N uni2987 ; G 2590 +U 10632 ; WX 602 ; N uni2988 ; G 2591 +U 10647 ; WX 602 ; N uni2997 ; G 2592 +U 10648 ; WX 602 ; N uni2998 ; G 2593 +U 10731 ; WX 602 ; N uni29EB ; G 2594 +U 10746 ; WX 602 ; N uni29FA ; G 2595 +U 10747 ; WX 602 ; N uni29FB ; G 2596 +U 10752 ; WX 602 ; N uni2A00 ; G 2597 +U 10799 ; WX 602 ; N uni2A2F ; G 2598 +U 10858 ; WX 602 ; N uni2A6A ; G 2599 +U 10859 ; WX 602 ; N uni2A6B ; G 2600 +U 11013 ; WX 602 ; N uni2B05 ; G 2601 +U 11014 ; WX 602 ; N uni2B06 ; G 2602 +U 11015 ; WX 602 ; N uni2B07 ; G 2603 +U 11016 ; WX 602 ; N uni2B08 ; G 2604 +U 11017 ; WX 602 ; N uni2B09 ; G 2605 +U 11018 ; WX 602 ; N uni2B0A ; G 2606 +U 11019 ; WX 602 ; N uni2B0B ; G 2607 +U 11020 ; WX 602 ; N uni2B0C ; G 2608 +U 11021 ; WX 602 ; N uni2B0D ; G 2609 +U 11026 ; WX 602 ; N uni2B12 ; G 2610 +U 11027 ; WX 602 ; N uni2B13 ; G 2611 +U 11028 ; WX 602 ; N uni2B14 ; G 2612 +U 11029 ; WX 602 ; N uni2B15 ; G 2613 +U 11030 ; WX 602 ; N uni2B16 ; G 2614 +U 11031 ; WX 602 ; N uni2B17 ; G 2615 +U 11032 ; WX 602 ; N uni2B18 ; G 2616 +U 11033 ; WX 602 ; N uni2B19 ; G 2617 +U 11034 ; WX 602 ; N uni2B1A ; G 2618 +U 11364 ; WX 602 ; N uni2C64 ; G 2619 +U 11373 ; WX 602 ; N uni2C6D ; G 2620 +U 11374 ; WX 602 ; N uni2C6E ; G 2621 +U 11375 ; WX 602 ; N uni2C6F ; G 2622 +U 11376 ; WX 602 ; N uni2C70 ; G 2623 +U 11381 ; WX 602 ; N uni2C75 ; G 2624 +U 11382 ; WX 602 ; N uni2C76 ; G 2625 +U 11383 ; WX 602 ; N uni2C77 ; G 2626 +U 11385 ; WX 602 ; N uni2C79 ; G 2627 +U 11386 ; WX 602 ; N uni2C7A ; G 2628 +U 11388 ; WX 602 ; N uni2C7C ; G 2629 +U 11389 ; WX 602 ; N uni2C7D ; G 2630 +U 11390 ; WX 602 ; N uni2C7E ; G 2631 +U 11391 ; WX 602 ; N uni2C7F ; G 2632 +U 11800 ; WX 602 ; N uni2E18 ; G 2633 +U 11807 ; WX 602 ; N uni2E1F ; G 2634 +U 11810 ; WX 602 ; N uni2E22 ; G 2635 +U 11811 ; WX 602 ; N uni2E23 ; G 2636 +U 11812 ; WX 602 ; N uni2E24 ; G 2637 +U 11813 ; WX 602 ; N uni2E25 ; G 2638 +U 11822 ; WX 602 ; N uni2E2E ; G 2639 +U 42760 ; WX 602 ; N uniA708 ; G 2640 +U 42761 ; WX 602 ; N uniA709 ; G 2641 +U 42762 ; WX 602 ; N uniA70A ; G 2642 +U 42763 ; WX 602 ; N uniA70B ; G 2643 +U 42764 ; WX 602 ; N uniA70C ; G 2644 +U 42765 ; WX 602 ; N uniA70D ; G 2645 +U 42766 ; WX 602 ; N uniA70E ; G 2646 +U 42767 ; WX 602 ; N uniA70F ; G 2647 +U 42768 ; WX 602 ; N uniA710 ; G 2648 +U 42769 ; WX 602 ; N uniA711 ; G 2649 +U 42770 ; WX 602 ; N uniA712 ; G 2650 +U 42771 ; WX 602 ; N uniA713 ; G 2651 +U 42772 ; WX 602 ; N uniA714 ; G 2652 +U 42773 ; WX 602 ; N uniA715 ; G 2653 +U 42774 ; WX 602 ; N uniA716 ; G 2654 +U 42779 ; WX 602 ; N uniA71B ; G 2655 +U 42780 ; WX 602 ; N uniA71C ; G 2656 +U 42781 ; WX 602 ; N uniA71D ; G 2657 +U 42782 ; WX 602 ; N uniA71E ; G 2658 +U 42783 ; WX 602 ; N uniA71F ; G 2659 +U 42786 ; WX 602 ; N uniA722 ; G 2660 +U 42787 ; WX 602 ; N uniA723 ; G 2661 +U 42788 ; WX 602 ; N uniA724 ; G 2662 +U 42789 ; WX 602 ; N uniA725 ; G 2663 +U 42790 ; WX 602 ; N uniA726 ; G 2664 +U 42791 ; WX 602 ; N uniA727 ; G 2665 +U 42889 ; WX 602 ; N uniA789 ; G 2666 +U 42890 ; WX 602 ; N uniA78A ; G 2667 +U 42891 ; WX 602 ; N uniA78B ; G 2668 +U 42892 ; WX 602 ; N uniA78C ; G 2669 +U 42893 ; WX 602 ; N uniA78D ; G 2670 +U 42894 ; WX 602 ; N uniA78E ; G 2671 +U 42896 ; WX 602 ; N uniA790 ; G 2672 +U 42897 ; WX 602 ; N uniA791 ; G 2673 +U 42922 ; WX 602 ; N uniA7AA ; G 2674 +U 43000 ; WX 602 ; N uniA7F8 ; G 2675 +U 43001 ; WX 602 ; N uniA7F9 ; G 2676 +U 63173 ; WX 602 ; N uniF6C5 ; G 2677 +U 64257 ; WX 602 ; N fi ; G 2678 +U 64258 ; WX 602 ; N fl ; G 2679 +U 65529 ; WX 602 ; N uniFFF9 ; G 2680 +U 65530 ; WX 602 ; N uniFFFA ; G 2681 +U 65531 ; WX 602 ; N uniFFFB ; G 2682 +U 65532 ; WX 602 ; N uniFFFC ; G 2683 +U 65533 ; WX 602 ; N uniFFFD ; G 2684 +EndCharMetrics +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Oblique.ttf b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Oblique.ttf new file mode 100644 index 0000000..4c858d4 Binary files /dev/null and b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Oblique.ttf differ diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Oblique.ufm b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Oblique.ufm new file mode 100644 index 0000000..4cd3d2a --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono-Oblique.ufm @@ -0,0 +1,2707 @@ +StartFontMetrics 4.1 +Notice Converted by PHP-font-lib +Comment https://github.com/PhenX/php-font-lib +EncodingScheme FontSpecific +FontName DejaVu Sans Mono +FontSubfamily Oblique +UniqueID DejaVu Sans Mono Oblique +FullName DejaVu Sans Mono Oblique +Version Version 2.37 +PostScriptName DejaVuSansMono-Oblique +Manufacturer DejaVu fonts team +FontVendorURL http://dejavu.sourceforge.net +LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License +Weight Medium +ItalicAngle -11 +IsFixedPitch true +UnderlineThickness 44 +UnderlinePosition -63 +FontHeightOffset 0 +Ascender 928 +Descender -236 +FontBBox -403 -375 746 998 +StartCharMetrics 2710 +U 32 ; WX 602 ; N space ; G 3 +U 33 ; WX 602 ; N exclam ; G 4 +U 34 ; WX 602 ; N quotedbl ; G 5 +U 35 ; WX 602 ; N numbersign ; G 6 +U 36 ; WX 602 ; N dollar ; G 7 +U 37 ; WX 602 ; N percent ; G 8 +U 38 ; WX 602 ; N ampersand ; G 9 +U 39 ; WX 602 ; N quotesingle ; G 10 +U 40 ; WX 602 ; N parenleft ; G 11 +U 41 ; WX 602 ; N parenright ; G 12 +U 42 ; WX 602 ; N asterisk ; G 13 +U 43 ; WX 602 ; N plus ; G 14 +U 44 ; WX 602 ; N comma ; G 15 +U 45 ; WX 602 ; N hyphen ; G 16 +U 46 ; WX 602 ; N period ; G 17 +U 47 ; WX 602 ; N slash ; G 18 +U 48 ; WX 602 ; N zero ; G 19 +U 49 ; WX 602 ; N one ; G 20 +U 50 ; WX 602 ; N two ; G 21 +U 51 ; WX 602 ; N three ; G 22 +U 52 ; WX 602 ; N four ; G 23 +U 53 ; WX 602 ; N five ; G 24 +U 54 ; WX 602 ; N six ; G 25 +U 55 ; WX 602 ; N seven ; G 26 +U 56 ; WX 602 ; N eight ; G 27 +U 57 ; WX 602 ; N nine ; G 28 +U 58 ; WX 602 ; N colon ; G 29 +U 59 ; WX 602 ; N semicolon ; G 30 +U 60 ; WX 602 ; N less ; G 31 +U 61 ; WX 602 ; N equal ; G 32 +U 62 ; WX 602 ; N greater ; G 33 +U 63 ; WX 602 ; N question ; G 34 +U 64 ; WX 602 ; N at ; G 35 +U 65 ; WX 602 ; N A ; G 36 +U 66 ; WX 602 ; N B ; G 37 +U 67 ; WX 602 ; N C ; G 38 +U 68 ; WX 602 ; N D ; G 39 +U 69 ; WX 602 ; N E ; G 40 +U 70 ; WX 602 ; N F ; G 41 +U 71 ; WX 602 ; N G ; G 42 +U 72 ; WX 602 ; N H ; G 43 +U 73 ; WX 602 ; N I ; G 44 +U 74 ; WX 602 ; N J ; G 45 +U 75 ; WX 602 ; N K ; G 46 +U 76 ; WX 602 ; N L ; G 47 +U 77 ; WX 602 ; N M ; G 48 +U 78 ; WX 602 ; N N ; G 49 +U 79 ; WX 602 ; N O ; G 50 +U 80 ; WX 602 ; N P ; G 51 +U 81 ; WX 602 ; N Q ; G 52 +U 82 ; WX 602 ; N R ; G 53 +U 83 ; WX 602 ; N S ; G 54 +U 84 ; WX 602 ; N T ; G 55 +U 85 ; WX 602 ; N U ; G 56 +U 86 ; WX 602 ; N V ; G 57 +U 87 ; WX 602 ; N W ; G 58 +U 88 ; WX 602 ; N X ; G 59 +U 89 ; WX 602 ; N Y ; G 60 +U 90 ; WX 602 ; N Z ; G 61 +U 91 ; WX 602 ; N bracketleft ; G 62 +U 92 ; WX 602 ; N backslash ; G 63 +U 93 ; WX 602 ; N bracketright ; G 64 +U 94 ; WX 602 ; N asciicircum ; G 65 +U 95 ; WX 602 ; N underscore ; G 66 +U 96 ; WX 602 ; N grave ; G 67 +U 97 ; WX 602 ; N a ; G 68 +U 98 ; WX 602 ; N b ; G 69 +U 99 ; WX 602 ; N c ; G 70 +U 100 ; WX 602 ; N d ; G 71 +U 101 ; WX 602 ; N e ; G 72 +U 102 ; WX 602 ; N f ; G 73 +U 103 ; WX 602 ; N g ; G 74 +U 104 ; WX 602 ; N h ; G 75 +U 105 ; WX 602 ; N i ; G 76 +U 106 ; WX 602 ; N j ; G 77 +U 107 ; WX 602 ; N k ; G 78 +U 108 ; WX 602 ; N l ; G 79 +U 109 ; WX 602 ; N m ; G 80 +U 110 ; WX 602 ; N n ; G 81 +U 111 ; WX 602 ; N o ; G 82 +U 112 ; WX 602 ; N p ; G 83 +U 113 ; WX 602 ; N q ; G 84 +U 114 ; WX 602 ; N r ; G 85 +U 115 ; WX 602 ; N s ; G 86 +U 116 ; WX 602 ; N t ; G 87 +U 117 ; WX 602 ; N u ; G 88 +U 118 ; WX 602 ; N v ; G 89 +U 119 ; WX 602 ; N w ; G 90 +U 120 ; WX 602 ; N x ; G 91 +U 121 ; WX 602 ; N y ; G 92 +U 122 ; WX 602 ; N z ; G 93 +U 123 ; WX 602 ; N braceleft ; G 94 +U 124 ; WX 602 ; N bar ; G 95 +U 125 ; WX 602 ; N braceright ; G 96 +U 126 ; WX 602 ; N asciitilde ; G 97 +U 160 ; WX 602 ; N nbspace ; G 98 +U 161 ; WX 602 ; N exclamdown ; G 99 +U 162 ; WX 602 ; N cent ; G 100 +U 163 ; WX 602 ; N sterling ; G 101 +U 164 ; WX 602 ; N currency ; G 102 +U 165 ; WX 602 ; N yen ; G 103 +U 166 ; WX 602 ; N brokenbar ; G 104 +U 167 ; WX 602 ; N section ; G 105 +U 168 ; WX 602 ; N dieresis ; G 106 +U 169 ; WX 602 ; N copyright ; G 107 +U 170 ; WX 602 ; N ordfeminine ; G 108 +U 171 ; WX 602 ; N guillemotleft ; G 109 +U 172 ; WX 602 ; N logicalnot ; G 110 +U 173 ; WX 602 ; N sfthyphen ; G 111 +U 174 ; WX 602 ; N registered ; G 112 +U 175 ; WX 602 ; N macron ; G 113 +U 176 ; WX 602 ; N degree ; G 114 +U 177 ; WX 602 ; N plusminus ; G 115 +U 178 ; WX 602 ; N twosuperior ; G 116 +U 179 ; WX 602 ; N threesuperior ; G 117 +U 180 ; WX 602 ; N acute ; G 118 +U 181 ; WX 602 ; N mu ; G 119 +U 182 ; WX 602 ; N paragraph ; G 120 +U 183 ; WX 602 ; N periodcentered ; G 121 +U 184 ; WX 602 ; N cedilla ; G 122 +U 185 ; WX 602 ; N onesuperior ; G 123 +U 186 ; WX 602 ; N ordmasculine ; G 124 +U 187 ; WX 602 ; N guillemotright ; G 125 +U 188 ; WX 602 ; N onequarter ; G 126 +U 189 ; WX 602 ; N onehalf ; G 127 +U 190 ; WX 602 ; N threequarters ; G 128 +U 191 ; WX 602 ; N questiondown ; G 129 +U 192 ; WX 602 ; N Agrave ; G 130 +U 193 ; WX 602 ; N Aacute ; G 131 +U 194 ; WX 602 ; N Acircumflex ; G 132 +U 195 ; WX 602 ; N Atilde ; G 133 +U 196 ; WX 602 ; N Adieresis ; G 134 +U 197 ; WX 602 ; N Aring ; G 135 +U 198 ; WX 602 ; N AE ; G 136 +U 199 ; WX 602 ; N Ccedilla ; G 137 +U 200 ; WX 602 ; N Egrave ; G 138 +U 201 ; WX 602 ; N Eacute ; G 139 +U 202 ; WX 602 ; N Ecircumflex ; G 140 +U 203 ; WX 602 ; N Edieresis ; G 141 +U 204 ; WX 602 ; N Igrave ; G 142 +U 205 ; WX 602 ; N Iacute ; G 143 +U 206 ; WX 602 ; N Icircumflex ; G 144 +U 207 ; WX 602 ; N Idieresis ; G 145 +U 208 ; WX 602 ; N Eth ; G 146 +U 209 ; WX 602 ; N Ntilde ; G 147 +U 210 ; WX 602 ; N Ograve ; G 148 +U 211 ; WX 602 ; N Oacute ; G 149 +U 212 ; WX 602 ; N Ocircumflex ; G 150 +U 213 ; WX 602 ; N Otilde ; G 151 +U 214 ; WX 602 ; N Odieresis ; G 152 +U 215 ; WX 602 ; N multiply ; G 153 +U 216 ; WX 602 ; N Oslash ; G 154 +U 217 ; WX 602 ; N Ugrave ; G 155 +U 218 ; WX 602 ; N Uacute ; G 156 +U 219 ; WX 602 ; N Ucircumflex ; G 157 +U 220 ; WX 602 ; N Udieresis ; G 158 +U 221 ; WX 602 ; N Yacute ; G 159 +U 222 ; WX 602 ; N Thorn ; G 160 +U 223 ; WX 602 ; N germandbls ; G 161 +U 224 ; WX 602 ; N agrave ; G 162 +U 225 ; WX 602 ; N aacute ; G 163 +U 226 ; WX 602 ; N acircumflex ; G 164 +U 227 ; WX 602 ; N atilde ; G 165 +U 228 ; WX 602 ; N adieresis ; G 166 +U 229 ; WX 602 ; N aring ; G 167 +U 230 ; WX 602 ; N ae ; G 168 +U 231 ; WX 602 ; N ccedilla ; G 169 +U 232 ; WX 602 ; N egrave ; G 170 +U 233 ; WX 602 ; N eacute ; G 171 +U 234 ; WX 602 ; N ecircumflex ; G 172 +U 235 ; WX 602 ; N edieresis ; G 173 +U 236 ; WX 602 ; N igrave ; G 174 +U 237 ; WX 602 ; N iacute ; G 175 +U 238 ; WX 602 ; N icircumflex ; G 176 +U 239 ; WX 602 ; N idieresis ; G 177 +U 240 ; WX 602 ; N eth ; G 178 +U 241 ; WX 602 ; N ntilde ; G 179 +U 242 ; WX 602 ; N ograve ; G 180 +U 243 ; WX 602 ; N oacute ; G 181 +U 244 ; WX 602 ; N ocircumflex ; G 182 +U 245 ; WX 602 ; N otilde ; G 183 +U 246 ; WX 602 ; N odieresis ; G 184 +U 247 ; WX 602 ; N divide ; G 185 +U 248 ; WX 602 ; N oslash ; G 186 +U 249 ; WX 602 ; N ugrave ; G 187 +U 250 ; WX 602 ; N uacute ; G 188 +U 251 ; WX 602 ; N ucircumflex ; G 189 +U 252 ; WX 602 ; N udieresis ; G 190 +U 253 ; WX 602 ; N yacute ; G 191 +U 254 ; WX 602 ; N thorn ; G 192 +U 255 ; WX 602 ; N ydieresis ; G 193 +U 256 ; WX 602 ; N Amacron ; G 194 +U 257 ; WX 602 ; N amacron ; G 195 +U 258 ; WX 602 ; N Abreve ; G 196 +U 259 ; WX 602 ; N abreve ; G 197 +U 260 ; WX 602 ; N Aogonek ; G 198 +U 261 ; WX 602 ; N aogonek ; G 199 +U 262 ; WX 602 ; N Cacute ; G 200 +U 263 ; WX 602 ; N cacute ; G 201 +U 264 ; WX 602 ; N Ccircumflex ; G 202 +U 265 ; WX 602 ; N ccircumflex ; G 203 +U 266 ; WX 602 ; N Cdotaccent ; G 204 +U 267 ; WX 602 ; N cdotaccent ; G 205 +U 268 ; WX 602 ; N Ccaron ; G 206 +U 269 ; WX 602 ; N ccaron ; G 207 +U 270 ; WX 602 ; N Dcaron ; G 208 +U 271 ; WX 602 ; N dcaron ; G 209 +U 272 ; WX 602 ; N Dcroat ; G 210 +U 273 ; WX 602 ; N dmacron ; G 211 +U 274 ; WX 602 ; N Emacron ; G 212 +U 275 ; WX 602 ; N emacron ; G 213 +U 276 ; WX 602 ; N Ebreve ; G 214 +U 277 ; WX 602 ; N ebreve ; G 215 +U 278 ; WX 602 ; N Edotaccent ; G 216 +U 279 ; WX 602 ; N edotaccent ; G 217 +U 280 ; WX 602 ; N Eogonek ; G 218 +U 281 ; WX 602 ; N eogonek ; G 219 +U 282 ; WX 602 ; N Ecaron ; G 220 +U 283 ; WX 602 ; N ecaron ; G 221 +U 284 ; WX 602 ; N Gcircumflex ; G 222 +U 285 ; WX 602 ; N gcircumflex ; G 223 +U 286 ; WX 602 ; N Gbreve ; G 224 +U 287 ; WX 602 ; N gbreve ; G 225 +U 288 ; WX 602 ; N Gdotaccent ; G 226 +U 289 ; WX 602 ; N gdotaccent ; G 227 +U 290 ; WX 602 ; N Gcommaaccent ; G 228 +U 291 ; WX 602 ; N gcommaaccent ; G 229 +U 292 ; WX 602 ; N Hcircumflex ; G 230 +U 293 ; WX 602 ; N hcircumflex ; G 231 +U 294 ; WX 602 ; N Hbar ; G 232 +U 295 ; WX 602 ; N hbar ; G 233 +U 296 ; WX 602 ; N Itilde ; G 234 +U 297 ; WX 602 ; N itilde ; G 235 +U 298 ; WX 602 ; N Imacron ; G 236 +U 299 ; WX 602 ; N imacron ; G 237 +U 300 ; WX 602 ; N Ibreve ; G 238 +U 301 ; WX 602 ; N ibreve ; G 239 +U 302 ; WX 602 ; N Iogonek ; G 240 +U 303 ; WX 602 ; N iogonek ; G 241 +U 304 ; WX 602 ; N Idot ; G 242 +U 305 ; WX 602 ; N dotlessi ; G 243 +U 306 ; WX 602 ; N IJ ; G 244 +U 307 ; WX 602 ; N ij ; G 245 +U 308 ; WX 602 ; N Jcircumflex ; G 246 +U 309 ; WX 602 ; N jcircumflex ; G 247 +U 310 ; WX 602 ; N Kcommaaccent ; G 248 +U 311 ; WX 602 ; N kcommaaccent ; G 249 +U 312 ; WX 602 ; N kgreenlandic ; G 250 +U 313 ; WX 602 ; N Lacute ; G 251 +U 314 ; WX 602 ; N lacute ; G 252 +U 315 ; WX 602 ; N Lcommaaccent ; G 253 +U 316 ; WX 602 ; N lcommaaccent ; G 254 +U 317 ; WX 602 ; N Lcaron ; G 255 +U 318 ; WX 602 ; N lcaron ; G 256 +U 319 ; WX 602 ; N Ldot ; G 257 +U 320 ; WX 602 ; N ldot ; G 258 +U 321 ; WX 602 ; N Lslash ; G 259 +U 322 ; WX 602 ; N lslash ; G 260 +U 323 ; WX 602 ; N Nacute ; G 261 +U 324 ; WX 602 ; N nacute ; G 262 +U 325 ; WX 602 ; N Ncommaaccent ; G 263 +U 326 ; WX 602 ; N ncommaaccent ; G 264 +U 327 ; WX 602 ; N Ncaron ; G 265 +U 328 ; WX 602 ; N ncaron ; G 266 +U 329 ; WX 602 ; N napostrophe ; G 267 +U 330 ; WX 602 ; N Eng ; G 268 +U 331 ; WX 602 ; N eng ; G 269 +U 332 ; WX 602 ; N Omacron ; G 270 +U 333 ; WX 602 ; N omacron ; G 271 +U 334 ; WX 602 ; N Obreve ; G 272 +U 335 ; WX 602 ; N obreve ; G 273 +U 336 ; WX 602 ; N Ohungarumlaut ; G 274 +U 337 ; WX 602 ; N ohungarumlaut ; G 275 +U 338 ; WX 602 ; N OE ; G 276 +U 339 ; WX 602 ; N oe ; G 277 +U 340 ; WX 602 ; N Racute ; G 278 +U 341 ; WX 602 ; N racute ; G 279 +U 342 ; WX 602 ; N Rcommaaccent ; G 280 +U 343 ; WX 602 ; N rcommaaccent ; G 281 +U 344 ; WX 602 ; N Rcaron ; G 282 +U 345 ; WX 602 ; N rcaron ; G 283 +U 346 ; WX 602 ; N Sacute ; G 284 +U 347 ; WX 602 ; N sacute ; G 285 +U 348 ; WX 602 ; N Scircumflex ; G 286 +U 349 ; WX 602 ; N scircumflex ; G 287 +U 350 ; WX 602 ; N Scedilla ; G 288 +U 351 ; WX 602 ; N scedilla ; G 289 +U 352 ; WX 602 ; N Scaron ; G 290 +U 353 ; WX 602 ; N scaron ; G 291 +U 354 ; WX 602 ; N Tcommaaccent ; G 292 +U 355 ; WX 602 ; N tcommaaccent ; G 293 +U 356 ; WX 602 ; N Tcaron ; G 294 +U 357 ; WX 602 ; N tcaron ; G 295 +U 358 ; WX 602 ; N Tbar ; G 296 +U 359 ; WX 602 ; N tbar ; G 297 +U 360 ; WX 602 ; N Utilde ; G 298 +U 361 ; WX 602 ; N utilde ; G 299 +U 362 ; WX 602 ; N Umacron ; G 300 +U 363 ; WX 602 ; N umacron ; G 301 +U 364 ; WX 602 ; N Ubreve ; G 302 +U 365 ; WX 602 ; N ubreve ; G 303 +U 366 ; WX 602 ; N Uring ; G 304 +U 367 ; WX 602 ; N uring ; G 305 +U 368 ; WX 602 ; N Uhungarumlaut ; G 306 +U 369 ; WX 602 ; N uhungarumlaut ; G 307 +U 370 ; WX 602 ; N Uogonek ; G 308 +U 371 ; WX 602 ; N uogonek ; G 309 +U 372 ; WX 602 ; N Wcircumflex ; G 310 +U 373 ; WX 602 ; N wcircumflex ; G 311 +U 374 ; WX 602 ; N Ycircumflex ; G 312 +U 375 ; WX 602 ; N ycircumflex ; G 313 +U 376 ; WX 602 ; N Ydieresis ; G 314 +U 377 ; WX 602 ; N Zacute ; G 315 +U 378 ; WX 602 ; N zacute ; G 316 +U 379 ; WX 602 ; N Zdotaccent ; G 317 +U 380 ; WX 602 ; N zdotaccent ; G 318 +U 381 ; WX 602 ; N Zcaron ; G 319 +U 382 ; WX 602 ; N zcaron ; G 320 +U 383 ; WX 602 ; N longs ; G 321 +U 384 ; WX 602 ; N uni0180 ; G 322 +U 385 ; WX 602 ; N uni0181 ; G 323 +U 386 ; WX 602 ; N uni0182 ; G 324 +U 387 ; WX 602 ; N uni0183 ; G 325 +U 388 ; WX 602 ; N uni0184 ; G 326 +U 389 ; WX 602 ; N uni0185 ; G 327 +U 390 ; WX 602 ; N uni0186 ; G 328 +U 391 ; WX 602 ; N uni0187 ; G 329 +U 392 ; WX 602 ; N uni0188 ; G 330 +U 393 ; WX 602 ; N uni0189 ; G 331 +U 394 ; WX 602 ; N uni018A ; G 332 +U 395 ; WX 602 ; N uni018B ; G 333 +U 396 ; WX 602 ; N uni018C ; G 334 +U 397 ; WX 602 ; N uni018D ; G 335 +U 398 ; WX 602 ; N uni018E ; G 336 +U 399 ; WX 602 ; N uni018F ; G 337 +U 400 ; WX 602 ; N uni0190 ; G 338 +U 401 ; WX 602 ; N uni0191 ; G 339 +U 402 ; WX 602 ; N florin ; G 340 +U 403 ; WX 602 ; N uni0193 ; G 341 +U 404 ; WX 602 ; N uni0194 ; G 342 +U 405 ; WX 602 ; N uni0195 ; G 343 +U 406 ; WX 602 ; N uni0196 ; G 344 +U 407 ; WX 602 ; N uni0197 ; G 345 +U 408 ; WX 602 ; N uni0198 ; G 346 +U 409 ; WX 602 ; N uni0199 ; G 347 +U 410 ; WX 602 ; N uni019A ; G 348 +U 411 ; WX 602 ; N uni019B ; G 349 +U 412 ; WX 602 ; N uni019C ; G 350 +U 413 ; WX 602 ; N uni019D ; G 351 +U 414 ; WX 602 ; N uni019E ; G 352 +U 415 ; WX 602 ; N uni019F ; G 353 +U 416 ; WX 602 ; N Ohorn ; G 354 +U 417 ; WX 602 ; N ohorn ; G 355 +U 418 ; WX 602 ; N uni01A2 ; G 356 +U 419 ; WX 602 ; N uni01A3 ; G 357 +U 420 ; WX 602 ; N uni01A4 ; G 358 +U 421 ; WX 602 ; N uni01A5 ; G 359 +U 422 ; WX 602 ; N uni01A6 ; G 360 +U 423 ; WX 602 ; N uni01A7 ; G 361 +U 424 ; WX 602 ; N uni01A8 ; G 362 +U 425 ; WX 602 ; N uni01A9 ; G 363 +U 426 ; WX 602 ; N uni01AA ; G 364 +U 427 ; WX 602 ; N uni01AB ; G 365 +U 428 ; WX 602 ; N uni01AC ; G 366 +U 429 ; WX 602 ; N uni01AD ; G 367 +U 430 ; WX 602 ; N uni01AE ; G 368 +U 431 ; WX 602 ; N Uhorn ; G 369 +U 432 ; WX 602 ; N uhorn ; G 370 +U 433 ; WX 602 ; N uni01B1 ; G 371 +U 434 ; WX 602 ; N uni01B2 ; G 372 +U 435 ; WX 602 ; N uni01B3 ; G 373 +U 436 ; WX 602 ; N uni01B4 ; G 374 +U 437 ; WX 602 ; N uni01B5 ; G 375 +U 438 ; WX 602 ; N uni01B6 ; G 376 +U 439 ; WX 602 ; N uni01B7 ; G 377 +U 440 ; WX 602 ; N uni01B8 ; G 378 +U 441 ; WX 602 ; N uni01B9 ; G 379 +U 442 ; WX 602 ; N uni01BA ; G 380 +U 443 ; WX 602 ; N uni01BB ; G 381 +U 444 ; WX 602 ; N uni01BC ; G 382 +U 445 ; WX 602 ; N uni01BD ; G 383 +U 446 ; WX 602 ; N uni01BE ; G 384 +U 447 ; WX 602 ; N uni01BF ; G 385 +U 448 ; WX 602 ; N uni01C0 ; G 386 +U 449 ; WX 602 ; N uni01C1 ; G 387 +U 450 ; WX 602 ; N uni01C2 ; G 388 +U 451 ; WX 602 ; N uni01C3 ; G 389 +U 461 ; WX 602 ; N uni01CD ; G 390 +U 462 ; WX 602 ; N uni01CE ; G 391 +U 463 ; WX 602 ; N uni01CF ; G 392 +U 464 ; WX 602 ; N uni01D0 ; G 393 +U 465 ; WX 602 ; N uni01D1 ; G 394 +U 466 ; WX 602 ; N uni01D2 ; G 395 +U 467 ; WX 602 ; N uni01D3 ; G 396 +U 468 ; WX 602 ; N uni01D4 ; G 397 +U 469 ; WX 602 ; N uni01D5 ; G 398 +U 470 ; WX 602 ; N uni01D6 ; G 399 +U 471 ; WX 602 ; N uni01D7 ; G 400 +U 472 ; WX 602 ; N uni01D8 ; G 401 +U 473 ; WX 602 ; N uni01D9 ; G 402 +U 474 ; WX 602 ; N uni01DA ; G 403 +U 475 ; WX 602 ; N uni01DB ; G 404 +U 476 ; WX 602 ; N uni01DC ; G 405 +U 477 ; WX 602 ; N uni01DD ; G 406 +U 479 ; WX 602 ; N uni01DF ; G 407 +U 480 ; WX 602 ; N uni01E0 ; G 408 +U 481 ; WX 602 ; N uni01E1 ; G 409 +U 482 ; WX 602 ; N uni01E2 ; G 410 +U 483 ; WX 602 ; N uni01E3 ; G 411 +U 486 ; WX 602 ; N Gcaron ; G 412 +U 487 ; WX 602 ; N gcaron ; G 413 +U 488 ; WX 602 ; N uni01E8 ; G 414 +U 489 ; WX 602 ; N uni01E9 ; G 415 +U 490 ; WX 602 ; N uni01EA ; G 416 +U 491 ; WX 602 ; N uni01EB ; G 417 +U 492 ; WX 602 ; N uni01EC ; G 418 +U 493 ; WX 602 ; N uni01ED ; G 419 +U 494 ; WX 602 ; N uni01EE ; G 420 +U 495 ; WX 602 ; N uni01EF ; G 421 +U 500 ; WX 602 ; N uni01F4 ; G 422 +U 501 ; WX 602 ; N uni01F5 ; G 423 +U 502 ; WX 602 ; N uni01F6 ; G 424 +U 504 ; WX 602 ; N uni01F8 ; G 425 +U 505 ; WX 602 ; N uni01F9 ; G 426 +U 508 ; WX 602 ; N AEacute ; G 427 +U 509 ; WX 602 ; N aeacute ; G 428 +U 510 ; WX 602 ; N Oslashacute ; G 429 +U 511 ; WX 602 ; N oslashacute ; G 430 +U 512 ; WX 602 ; N uni0200 ; G 431 +U 513 ; WX 602 ; N uni0201 ; G 432 +U 514 ; WX 602 ; N uni0202 ; G 433 +U 515 ; WX 602 ; N uni0203 ; G 434 +U 516 ; WX 602 ; N uni0204 ; G 435 +U 517 ; WX 602 ; N uni0205 ; G 436 +U 518 ; WX 602 ; N uni0206 ; G 437 +U 519 ; WX 602 ; N uni0207 ; G 438 +U 520 ; WX 602 ; N uni0208 ; G 439 +U 521 ; WX 602 ; N uni0209 ; G 440 +U 522 ; WX 602 ; N uni020A ; G 441 +U 523 ; WX 602 ; N uni020B ; G 442 +U 524 ; WX 602 ; N uni020C ; G 443 +U 525 ; WX 602 ; N uni020D ; G 444 +U 526 ; WX 602 ; N uni020E ; G 445 +U 527 ; WX 602 ; N uni020F ; G 446 +U 528 ; WX 602 ; N uni0210 ; G 447 +U 529 ; WX 602 ; N uni0211 ; G 448 +U 530 ; WX 602 ; N uni0212 ; G 449 +U 531 ; WX 602 ; N uni0213 ; G 450 +U 532 ; WX 602 ; N uni0214 ; G 451 +U 533 ; WX 602 ; N uni0215 ; G 452 +U 534 ; WX 602 ; N uni0216 ; G 453 +U 535 ; WX 602 ; N uni0217 ; G 454 +U 536 ; WX 602 ; N Scommaaccent ; G 455 +U 537 ; WX 602 ; N scommaaccent ; G 456 +U 538 ; WX 602 ; N uni021A ; G 457 +U 539 ; WX 602 ; N uni021B ; G 458 +U 540 ; WX 602 ; N uni021C ; G 459 +U 541 ; WX 602 ; N uni021D ; G 460 +U 542 ; WX 602 ; N uni021E ; G 461 +U 543 ; WX 602 ; N uni021F ; G 462 +U 545 ; WX 602 ; N uni0221 ; G 463 +U 548 ; WX 602 ; N uni0224 ; G 464 +U 549 ; WX 602 ; N uni0225 ; G 465 +U 550 ; WX 602 ; N uni0226 ; G 466 +U 551 ; WX 602 ; N uni0227 ; G 467 +U 552 ; WX 602 ; N uni0228 ; G 468 +U 553 ; WX 602 ; N uni0229 ; G 469 +U 554 ; WX 602 ; N uni022A ; G 470 +U 555 ; WX 602 ; N uni022B ; G 471 +U 556 ; WX 602 ; N uni022C ; G 472 +U 557 ; WX 602 ; N uni022D ; G 473 +U 558 ; WX 602 ; N uni022E ; G 474 +U 559 ; WX 602 ; N uni022F ; G 475 +U 560 ; WX 602 ; N uni0230 ; G 476 +U 561 ; WX 602 ; N uni0231 ; G 477 +U 562 ; WX 602 ; N uni0232 ; G 478 +U 563 ; WX 602 ; N uni0233 ; G 479 +U 564 ; WX 602 ; N uni0234 ; G 480 +U 565 ; WX 602 ; N uni0235 ; G 481 +U 566 ; WX 602 ; N uni0236 ; G 482 +U 567 ; WX 602 ; N dotlessj ; G 483 +U 568 ; WX 602 ; N uni0238 ; G 484 +U 569 ; WX 602 ; N uni0239 ; G 485 +U 570 ; WX 602 ; N uni023A ; G 486 +U 571 ; WX 602 ; N uni023B ; G 487 +U 572 ; WX 602 ; N uni023C ; G 488 +U 573 ; WX 602 ; N uni023D ; G 489 +U 574 ; WX 602 ; N uni023E ; G 490 +U 575 ; WX 602 ; N uni023F ; G 491 +U 576 ; WX 602 ; N uni0240 ; G 492 +U 577 ; WX 602 ; N uni0241 ; G 493 +U 579 ; WX 602 ; N uni0243 ; G 494 +U 580 ; WX 602 ; N uni0244 ; G 495 +U 581 ; WX 602 ; N uni0245 ; G 496 +U 588 ; WX 602 ; N uni024C ; G 497 +U 589 ; WX 602 ; N uni024D ; G 498 +U 592 ; WX 602 ; N uni0250 ; G 499 +U 593 ; WX 602 ; N uni0251 ; G 500 +U 594 ; WX 602 ; N uni0252 ; G 501 +U 595 ; WX 602 ; N uni0253 ; G 502 +U 596 ; WX 602 ; N uni0254 ; G 503 +U 597 ; WX 602 ; N uni0255 ; G 504 +U 598 ; WX 602 ; N uni0256 ; G 505 +U 599 ; WX 602 ; N uni0257 ; G 506 +U 600 ; WX 602 ; N uni0258 ; G 507 +U 601 ; WX 602 ; N uni0259 ; G 508 +U 602 ; WX 602 ; N uni025A ; G 509 +U 603 ; WX 602 ; N uni025B ; G 510 +U 604 ; WX 602 ; N uni025C ; G 511 +U 605 ; WX 602 ; N uni025D ; G 512 +U 606 ; WX 602 ; N uni025E ; G 513 +U 607 ; WX 602 ; N uni025F ; G 514 +U 608 ; WX 602 ; N uni0260 ; G 515 +U 609 ; WX 602 ; N uni0261 ; G 516 +U 610 ; WX 602 ; N uni0262 ; G 517 +U 611 ; WX 602 ; N uni0263 ; G 518 +U 612 ; WX 602 ; N uni0264 ; G 519 +U 613 ; WX 602 ; N uni0265 ; G 520 +U 614 ; WX 602 ; N uni0266 ; G 521 +U 615 ; WX 602 ; N uni0267 ; G 522 +U 616 ; WX 602 ; N uni0268 ; G 523 +U 617 ; WX 602 ; N uni0269 ; G 524 +U 618 ; WX 602 ; N uni026A ; G 525 +U 619 ; WX 602 ; N uni026B ; G 526 +U 620 ; WX 602 ; N uni026C ; G 527 +U 621 ; WX 602 ; N uni026D ; G 528 +U 622 ; WX 602 ; N uni026E ; G 529 +U 623 ; WX 602 ; N uni026F ; G 530 +U 624 ; WX 602 ; N uni0270 ; G 531 +U 625 ; WX 602 ; N uni0271 ; G 532 +U 626 ; WX 602 ; N uni0272 ; G 533 +U 627 ; WX 602 ; N uni0273 ; G 534 +U 628 ; WX 602 ; N uni0274 ; G 535 +U 629 ; WX 602 ; N uni0275 ; G 536 +U 630 ; WX 602 ; N uni0276 ; G 537 +U 631 ; WX 602 ; N uni0277 ; G 538 +U 632 ; WX 602 ; N uni0278 ; G 539 +U 633 ; WX 602 ; N uni0279 ; G 540 +U 634 ; WX 602 ; N uni027A ; G 541 +U 635 ; WX 602 ; N uni027B ; G 542 +U 636 ; WX 602 ; N uni027C ; G 543 +U 637 ; WX 602 ; N uni027D ; G 544 +U 638 ; WX 602 ; N uni027E ; G 545 +U 639 ; WX 602 ; N uni027F ; G 546 +U 640 ; WX 602 ; N uni0280 ; G 547 +U 641 ; WX 602 ; N uni0281 ; G 548 +U 642 ; WX 602 ; N uni0282 ; G 549 +U 643 ; WX 602 ; N uni0283 ; G 550 +U 644 ; WX 602 ; N uni0284 ; G 551 +U 645 ; WX 602 ; N uni0285 ; G 552 +U 646 ; WX 602 ; N uni0286 ; G 553 +U 647 ; WX 602 ; N uni0287 ; G 554 +U 648 ; WX 602 ; N uni0288 ; G 555 +U 649 ; WX 602 ; N uni0289 ; G 556 +U 650 ; WX 602 ; N uni028A ; G 557 +U 651 ; WX 602 ; N uni028B ; G 558 +U 652 ; WX 602 ; N uni028C ; G 559 +U 653 ; WX 602 ; N uni028D ; G 560 +U 654 ; WX 602 ; N uni028E ; G 561 +U 655 ; WX 602 ; N uni028F ; G 562 +U 656 ; WX 602 ; N uni0290 ; G 563 +U 657 ; WX 602 ; N uni0291 ; G 564 +U 658 ; WX 602 ; N uni0292 ; G 565 +U 659 ; WX 602 ; N uni0293 ; G 566 +U 660 ; WX 602 ; N uni0294 ; G 567 +U 661 ; WX 602 ; N uni0295 ; G 568 +U 662 ; WX 602 ; N uni0296 ; G 569 +U 663 ; WX 602 ; N uni0297 ; G 570 +U 664 ; WX 602 ; N uni0298 ; G 571 +U 665 ; WX 602 ; N uni0299 ; G 572 +U 666 ; WX 602 ; N uni029A ; G 573 +U 667 ; WX 602 ; N uni029B ; G 574 +U 668 ; WX 602 ; N uni029C ; G 575 +U 669 ; WX 602 ; N uni029D ; G 576 +U 670 ; WX 602 ; N uni029E ; G 577 +U 671 ; WX 602 ; N uni029F ; G 578 +U 672 ; WX 602 ; N uni02A0 ; G 579 +U 673 ; WX 602 ; N uni02A1 ; G 580 +U 674 ; WX 602 ; N uni02A2 ; G 581 +U 675 ; WX 602 ; N uni02A3 ; G 582 +U 676 ; WX 602 ; N uni02A4 ; G 583 +U 677 ; WX 602 ; N uni02A5 ; G 584 +U 678 ; WX 602 ; N uni02A6 ; G 585 +U 679 ; WX 602 ; N uni02A7 ; G 586 +U 680 ; WX 602 ; N uni02A8 ; G 587 +U 681 ; WX 602 ; N uni02A9 ; G 588 +U 682 ; WX 602 ; N uni02AA ; G 589 +U 683 ; WX 602 ; N uni02AB ; G 590 +U 684 ; WX 602 ; N uni02AC ; G 591 +U 685 ; WX 602 ; N uni02AD ; G 592 +U 686 ; WX 602 ; N uni02AE ; G 593 +U 687 ; WX 602 ; N uni02AF ; G 594 +U 688 ; WX 602 ; N uni02B0 ; G 595 +U 689 ; WX 602 ; N uni02B1 ; G 596 +U 690 ; WX 602 ; N uni02B2 ; G 597 +U 691 ; WX 602 ; N uni02B3 ; G 598 +U 692 ; WX 602 ; N uni02B4 ; G 599 +U 693 ; WX 602 ; N uni02B5 ; G 600 +U 694 ; WX 602 ; N uni02B6 ; G 601 +U 695 ; WX 602 ; N uni02B7 ; G 602 +U 696 ; WX 602 ; N uni02B8 ; G 603 +U 697 ; WX 602 ; N uni02B9 ; G 604 +U 699 ; WX 602 ; N uni02BB ; G 605 +U 700 ; WX 602 ; N uni02BC ; G 606 +U 701 ; WX 602 ; N uni02BD ; G 607 +U 702 ; WX 602 ; N uni02BE ; G 608 +U 703 ; WX 602 ; N uni02BF ; G 609 +U 704 ; WX 602 ; N uni02C0 ; G 610 +U 705 ; WX 602 ; N uni02C1 ; G 611 +U 710 ; WX 602 ; N circumflex ; G 612 +U 711 ; WX 602 ; N caron ; G 613 +U 712 ; WX 602 ; N uni02C8 ; G 614 +U 713 ; WX 602 ; N uni02C9 ; G 615 +U 716 ; WX 602 ; N uni02CC ; G 616 +U 717 ; WX 602 ; N uni02CD ; G 617 +U 718 ; WX 602 ; N uni02CE ; G 618 +U 719 ; WX 602 ; N uni02CF ; G 619 +U 720 ; WX 602 ; N uni02D0 ; G 620 +U 721 ; WX 602 ; N uni02D1 ; G 621 +U 722 ; WX 602 ; N uni02D2 ; G 622 +U 723 ; WX 602 ; N uni02D3 ; G 623 +U 726 ; WX 602 ; N uni02D6 ; G 624 +U 727 ; WX 602 ; N uni02D7 ; G 625 +U 728 ; WX 602 ; N breve ; G 626 +U 729 ; WX 602 ; N dotaccent ; G 627 +U 730 ; WX 602 ; N ring ; G 628 +U 731 ; WX 602 ; N ogonek ; G 629 +U 732 ; WX 602 ; N tilde ; G 630 +U 733 ; WX 602 ; N hungarumlaut ; G 631 +U 734 ; WX 602 ; N uni02DE ; G 632 +U 736 ; WX 602 ; N uni02E0 ; G 633 +U 737 ; WX 602 ; N uni02E1 ; G 634 +U 738 ; WX 602 ; N uni02E2 ; G 635 +U 739 ; WX 602 ; N uni02E3 ; G 636 +U 740 ; WX 602 ; N uni02E4 ; G 637 +U 741 ; WX 602 ; N uni02E5 ; G 638 +U 742 ; WX 602 ; N uni02E6 ; G 639 +U 743 ; WX 602 ; N uni02E7 ; G 640 +U 744 ; WX 602 ; N uni02E8 ; G 641 +U 745 ; WX 602 ; N uni02E9 ; G 642 +U 750 ; WX 602 ; N uni02EE ; G 643 +U 755 ; WX 602 ; N uni02F3 ; G 644 +U 768 ; WX 602 ; N gravecomb ; G 645 +U 769 ; WX 602 ; N acutecomb ; G 646 +U 770 ; WX 602 ; N uni0302 ; G 647 +U 771 ; WX 602 ; N tildecomb ; G 648 +U 772 ; WX 602 ; N uni0304 ; G 649 +U 773 ; WX 602 ; N uni0305 ; G 650 +U 774 ; WX 602 ; N uni0306 ; G 651 +U 775 ; WX 602 ; N uni0307 ; G 652 +U 776 ; WX 602 ; N uni0308 ; G 653 +U 777 ; WX 602 ; N hookabovecomb ; G 654 +U 778 ; WX 602 ; N uni030A ; G 655 +U 779 ; WX 602 ; N uni030B ; G 656 +U 780 ; WX 602 ; N uni030C ; G 657 +U 781 ; WX 602 ; N uni030D ; G 658 +U 782 ; WX 602 ; N uni030E ; G 659 +U 783 ; WX 602 ; N uni030F ; G 660 +U 784 ; WX 602 ; N uni0310 ; G 661 +U 785 ; WX 602 ; N uni0311 ; G 662 +U 786 ; WX 602 ; N uni0312 ; G 663 +U 787 ; WX 602 ; N uni0313 ; G 664 +U 788 ; WX 602 ; N uni0314 ; G 665 +U 789 ; WX 602 ; N uni0315 ; G 666 +U 790 ; WX 602 ; N uni0316 ; G 667 +U 791 ; WX 602 ; N uni0317 ; G 668 +U 792 ; WX 602 ; N uni0318 ; G 669 +U 793 ; WX 602 ; N uni0319 ; G 670 +U 794 ; WX 602 ; N uni031A ; G 671 +U 795 ; WX 602 ; N uni031B ; G 672 +U 796 ; WX 602 ; N uni031C ; G 673 +U 797 ; WX 602 ; N uni031D ; G 674 +U 798 ; WX 602 ; N uni031E ; G 675 +U 799 ; WX 602 ; N uni031F ; G 676 +U 800 ; WX 602 ; N uni0320 ; G 677 +U 801 ; WX 602 ; N uni0321 ; G 678 +U 802 ; WX 602 ; N uni0322 ; G 679 +U 803 ; WX 602 ; N dotbelowcomb ; G 680 +U 804 ; WX 602 ; N uni0324 ; G 681 +U 805 ; WX 602 ; N uni0325 ; G 682 +U 806 ; WX 602 ; N uni0326 ; G 683 +U 807 ; WX 602 ; N uni0327 ; G 684 +U 808 ; WX 602 ; N uni0328 ; G 685 +U 809 ; WX 602 ; N uni0329 ; G 686 +U 810 ; WX 602 ; N uni032A ; G 687 +U 811 ; WX 602 ; N uni032B ; G 688 +U 812 ; WX 602 ; N uni032C ; G 689 +U 813 ; WX 602 ; N uni032D ; G 690 +U 814 ; WX 602 ; N uni032E ; G 691 +U 815 ; WX 602 ; N uni032F ; G 692 +U 816 ; WX 602 ; N uni0330 ; G 693 +U 817 ; WX 602 ; N uni0331 ; G 694 +U 818 ; WX 602 ; N uni0332 ; G 695 +U 819 ; WX 602 ; N uni0333 ; G 696 +U 820 ; WX 602 ; N uni0334 ; G 697 +U 821 ; WX 602 ; N uni0335 ; G 698 +U 822 ; WX 602 ; N uni0336 ; G 699 +U 823 ; WX 602 ; N uni0337 ; G 700 +U 824 ; WX 602 ; N uni0338 ; G 701 +U 825 ; WX 602 ; N uni0339 ; G 702 +U 826 ; WX 602 ; N uni033A ; G 703 +U 827 ; WX 602 ; N uni033B ; G 704 +U 828 ; WX 602 ; N uni033C ; G 705 +U 829 ; WX 602 ; N uni033D ; G 706 +U 830 ; WX 602 ; N uni033E ; G 707 +U 831 ; WX 602 ; N uni033F ; G 708 +U 835 ; WX 602 ; N uni0343 ; G 709 +U 856 ; WX 602 ; N uni0358 ; G 710 +U 865 ; WX 602 ; N uni0361 ; G 711 +U 884 ; WX 602 ; N uni0374 ; G 712 +U 885 ; WX 602 ; N uni0375 ; G 713 +U 886 ; WX 602 ; N uni0376 ; G 714 +U 887 ; WX 602 ; N uni0377 ; G 715 +U 890 ; WX 602 ; N uni037A ; G 716 +U 891 ; WX 602 ; N uni037B ; G 717 +U 892 ; WX 602 ; N uni037C ; G 718 +U 893 ; WX 602 ; N uni037D ; G 719 +U 894 ; WX 602 ; N uni037E ; G 720 +U 895 ; WX 602 ; N uni037F ; G 721 +U 900 ; WX 602 ; N tonos ; G 722 +U 901 ; WX 602 ; N dieresistonos ; G 723 +U 902 ; WX 602 ; N Alphatonos ; G 724 +U 903 ; WX 602 ; N anoteleia ; G 725 +U 904 ; WX 602 ; N Epsilontonos ; G 726 +U 905 ; WX 602 ; N Etatonos ; G 727 +U 906 ; WX 602 ; N Iotatonos ; G 728 +U 908 ; WX 602 ; N Omicrontonos ; G 729 +U 910 ; WX 602 ; N Upsilontonos ; G 730 +U 911 ; WX 602 ; N Omegatonos ; G 731 +U 912 ; WX 602 ; N iotadieresistonos ; G 732 +U 913 ; WX 602 ; N Alpha ; G 733 +U 914 ; WX 602 ; N Beta ; G 734 +U 915 ; WX 602 ; N Gamma ; G 735 +U 916 ; WX 602 ; N uni0394 ; G 736 +U 917 ; WX 602 ; N Epsilon ; G 737 +U 918 ; WX 602 ; N Zeta ; G 738 +U 919 ; WX 602 ; N Eta ; G 739 +U 920 ; WX 602 ; N Theta ; G 740 +U 921 ; WX 602 ; N Iota ; G 741 +U 922 ; WX 602 ; N Kappa ; G 742 +U 923 ; WX 602 ; N Lambda ; G 743 +U 924 ; WX 602 ; N Mu ; G 744 +U 925 ; WX 602 ; N Nu ; G 745 +U 926 ; WX 602 ; N Xi ; G 746 +U 927 ; WX 602 ; N Omicron ; G 747 +U 928 ; WX 602 ; N Pi ; G 748 +U 929 ; WX 602 ; N Rho ; G 749 +U 931 ; WX 602 ; N Sigma ; G 750 +U 932 ; WX 602 ; N Tau ; G 751 +U 933 ; WX 602 ; N Upsilon ; G 752 +U 934 ; WX 602 ; N Phi ; G 753 +U 935 ; WX 602 ; N Chi ; G 754 +U 936 ; WX 602 ; N Psi ; G 755 +U 937 ; WX 602 ; N Omega ; G 756 +U 938 ; WX 602 ; N Iotadieresis ; G 757 +U 939 ; WX 602 ; N Upsilondieresis ; G 758 +U 940 ; WX 602 ; N alphatonos ; G 759 +U 941 ; WX 602 ; N epsilontonos ; G 760 +U 942 ; WX 602 ; N etatonos ; G 761 +U 943 ; WX 602 ; N iotatonos ; G 762 +U 944 ; WX 602 ; N upsilondieresistonos ; G 763 +U 945 ; WX 602 ; N alpha ; G 764 +U 946 ; WX 602 ; N beta ; G 765 +U 947 ; WX 602 ; N gamma ; G 766 +U 948 ; WX 602 ; N delta ; G 767 +U 949 ; WX 602 ; N epsilon ; G 768 +U 950 ; WX 602 ; N zeta ; G 769 +U 951 ; WX 602 ; N eta ; G 770 +U 952 ; WX 602 ; N theta ; G 771 +U 953 ; WX 602 ; N iota ; G 772 +U 954 ; WX 602 ; N kappa ; G 773 +U 955 ; WX 602 ; N lambda ; G 774 +U 956 ; WX 602 ; N uni03BC ; G 775 +U 957 ; WX 602 ; N nu ; G 776 +U 958 ; WX 602 ; N xi ; G 777 +U 959 ; WX 602 ; N omicron ; G 778 +U 960 ; WX 602 ; N pi ; G 779 +U 961 ; WX 602 ; N rho ; G 780 +U 962 ; WX 602 ; N sigma1 ; G 781 +U 963 ; WX 602 ; N sigma ; G 782 +U 964 ; WX 602 ; N tau ; G 783 +U 965 ; WX 602 ; N upsilon ; G 784 +U 966 ; WX 602 ; N phi ; G 785 +U 967 ; WX 602 ; N chi ; G 786 +U 968 ; WX 602 ; N psi ; G 787 +U 969 ; WX 602 ; N omega ; G 788 +U 970 ; WX 602 ; N iotadieresis ; G 789 +U 971 ; WX 602 ; N upsilondieresis ; G 790 +U 972 ; WX 602 ; N omicrontonos ; G 791 +U 973 ; WX 602 ; N upsilontonos ; G 792 +U 974 ; WX 602 ; N omegatonos ; G 793 +U 976 ; WX 602 ; N uni03D0 ; G 794 +U 977 ; WX 602 ; N theta1 ; G 795 +U 978 ; WX 602 ; N Upsilon1 ; G 796 +U 979 ; WX 602 ; N uni03D3 ; G 797 +U 980 ; WX 602 ; N uni03D4 ; G 798 +U 981 ; WX 602 ; N phi1 ; G 799 +U 982 ; WX 602 ; N omega1 ; G 800 +U 983 ; WX 602 ; N uni03D7 ; G 801 +U 984 ; WX 602 ; N uni03D8 ; G 802 +U 985 ; WX 602 ; N uni03D9 ; G 803 +U 986 ; WX 602 ; N uni03DA ; G 804 +U 987 ; WX 602 ; N uni03DB ; G 805 +U 988 ; WX 602 ; N uni03DC ; G 806 +U 989 ; WX 602 ; N uni03DD ; G 807 +U 990 ; WX 602 ; N uni03DE ; G 808 +U 991 ; WX 602 ; N uni03DF ; G 809 +U 992 ; WX 602 ; N uni03E0 ; G 810 +U 993 ; WX 602 ; N uni03E1 ; G 811 +U 1008 ; WX 602 ; N uni03F0 ; G 812 +U 1009 ; WX 602 ; N uni03F1 ; G 813 +U 1010 ; WX 602 ; N uni03F2 ; G 814 +U 1011 ; WX 602 ; N uni03F3 ; G 815 +U 1012 ; WX 602 ; N uni03F4 ; G 816 +U 1013 ; WX 602 ; N uni03F5 ; G 817 +U 1014 ; WX 602 ; N uni03F6 ; G 818 +U 1015 ; WX 602 ; N uni03F7 ; G 819 +U 1016 ; WX 602 ; N uni03F8 ; G 820 +U 1017 ; WX 602 ; N uni03F9 ; G 821 +U 1018 ; WX 602 ; N uni03FA ; G 822 +U 1019 ; WX 602 ; N uni03FB ; G 823 +U 1020 ; WX 602 ; N uni03FC ; G 824 +U 1021 ; WX 602 ; N uni03FD ; G 825 +U 1022 ; WX 602 ; N uni03FE ; G 826 +U 1023 ; WX 602 ; N uni03FF ; G 827 +U 1024 ; WX 602 ; N uni0400 ; G 828 +U 1025 ; WX 602 ; N uni0401 ; G 829 +U 1026 ; WX 602 ; N uni0402 ; G 830 +U 1027 ; WX 602 ; N uni0403 ; G 831 +U 1028 ; WX 602 ; N uni0404 ; G 832 +U 1029 ; WX 602 ; N uni0405 ; G 833 +U 1030 ; WX 602 ; N uni0406 ; G 834 +U 1031 ; WX 602 ; N uni0407 ; G 835 +U 1032 ; WX 602 ; N uni0408 ; G 836 +U 1033 ; WX 602 ; N uni0409 ; G 837 +U 1034 ; WX 602 ; N uni040A ; G 838 +U 1035 ; WX 602 ; N uni040B ; G 839 +U 1036 ; WX 602 ; N uni040C ; G 840 +U 1037 ; WX 602 ; N uni040D ; G 841 +U 1038 ; WX 602 ; N uni040E ; G 842 +U 1039 ; WX 602 ; N uni040F ; G 843 +U 1040 ; WX 602 ; N uni0410 ; G 844 +U 1041 ; WX 602 ; N uni0411 ; G 845 +U 1042 ; WX 602 ; N uni0412 ; G 846 +U 1043 ; WX 602 ; N uni0413 ; G 847 +U 1044 ; WX 602 ; N uni0414 ; G 848 +U 1045 ; WX 602 ; N uni0415 ; G 849 +U 1046 ; WX 602 ; N uni0416 ; G 850 +U 1047 ; WX 602 ; N uni0417 ; G 851 +U 1048 ; WX 602 ; N uni0418 ; G 852 +U 1049 ; WX 602 ; N uni0419 ; G 853 +U 1050 ; WX 602 ; N uni041A ; G 854 +U 1051 ; WX 602 ; N uni041B ; G 855 +U 1052 ; WX 602 ; N uni041C ; G 856 +U 1053 ; WX 602 ; N uni041D ; G 857 +U 1054 ; WX 602 ; N uni041E ; G 858 +U 1055 ; WX 602 ; N uni041F ; G 859 +U 1056 ; WX 602 ; N uni0420 ; G 860 +U 1057 ; WX 602 ; N uni0421 ; G 861 +U 1058 ; WX 602 ; N uni0422 ; G 862 +U 1059 ; WX 602 ; N uni0423 ; G 863 +U 1060 ; WX 602 ; N uni0424 ; G 864 +U 1061 ; WX 602 ; N uni0425 ; G 865 +U 1062 ; WX 602 ; N uni0426 ; G 866 +U 1063 ; WX 602 ; N uni0427 ; G 867 +U 1064 ; WX 602 ; N uni0428 ; G 868 +U 1065 ; WX 602 ; N uni0429 ; G 869 +U 1066 ; WX 602 ; N uni042A ; G 870 +U 1067 ; WX 602 ; N uni042B ; G 871 +U 1068 ; WX 602 ; N uni042C ; G 872 +U 1069 ; WX 602 ; N uni042D ; G 873 +U 1070 ; WX 602 ; N uni042E ; G 874 +U 1071 ; WX 602 ; N uni042F ; G 875 +U 1072 ; WX 602 ; N uni0430 ; G 876 +U 1073 ; WX 602 ; N uni0431 ; G 877 +U 1074 ; WX 602 ; N uni0432 ; G 878 +U 1075 ; WX 602 ; N uni0433 ; G 879 +U 1076 ; WX 602 ; N uni0434 ; G 880 +U 1077 ; WX 602 ; N uni0435 ; G 881 +U 1078 ; WX 602 ; N uni0436 ; G 882 +U 1079 ; WX 602 ; N uni0437 ; G 883 +U 1080 ; WX 602 ; N uni0438 ; G 884 +U 1081 ; WX 602 ; N uni0439 ; G 885 +U 1082 ; WX 602 ; N uni043A ; G 886 +U 1083 ; WX 602 ; N uni043B ; G 887 +U 1084 ; WX 602 ; N uni043C ; G 888 +U 1085 ; WX 602 ; N uni043D ; G 889 +U 1086 ; WX 602 ; N uni043E ; G 890 +U 1087 ; WX 602 ; N uni043F ; G 891 +U 1088 ; WX 602 ; N uni0440 ; G 892 +U 1089 ; WX 602 ; N uni0441 ; G 893 +U 1090 ; WX 602 ; N uni0442 ; G 894 +U 1091 ; WX 602 ; N uni0443 ; G 895 +U 1092 ; WX 602 ; N uni0444 ; G 896 +U 1093 ; WX 602 ; N uni0445 ; G 897 +U 1094 ; WX 602 ; N uni0446 ; G 898 +U 1095 ; WX 602 ; N uni0447 ; G 899 +U 1096 ; WX 602 ; N uni0448 ; G 900 +U 1097 ; WX 602 ; N uni0449 ; G 901 +U 1098 ; WX 602 ; N uni044A ; G 902 +U 1099 ; WX 602 ; N uni044B ; G 903 +U 1100 ; WX 602 ; N uni044C ; G 904 +U 1101 ; WX 602 ; N uni044D ; G 905 +U 1102 ; WX 602 ; N uni044E ; G 906 +U 1103 ; WX 602 ; N uni044F ; G 907 +U 1104 ; WX 602 ; N uni0450 ; G 908 +U 1105 ; WX 602 ; N uni0451 ; G 909 +U 1106 ; WX 602 ; N uni0452 ; G 910 +U 1107 ; WX 602 ; N uni0453 ; G 911 +U 1108 ; WX 602 ; N uni0454 ; G 912 +U 1109 ; WX 602 ; N uni0455 ; G 913 +U 1110 ; WX 602 ; N uni0456 ; G 914 +U 1111 ; WX 602 ; N uni0457 ; G 915 +U 1112 ; WX 602 ; N uni0458 ; G 916 +U 1113 ; WX 602 ; N uni0459 ; G 917 +U 1114 ; WX 602 ; N uni045A ; G 918 +U 1115 ; WX 602 ; N uni045B ; G 919 +U 1116 ; WX 602 ; N uni045C ; G 920 +U 1117 ; WX 602 ; N uni045D ; G 921 +U 1118 ; WX 602 ; N uni045E ; G 922 +U 1119 ; WX 602 ; N uni045F ; G 923 +U 1122 ; WX 602 ; N uni0462 ; G 924 +U 1123 ; WX 602 ; N uni0463 ; G 925 +U 1138 ; WX 602 ; N uni0472 ; G 926 +U 1139 ; WX 602 ; N uni0473 ; G 927 +U 1168 ; WX 602 ; N uni0490 ; G 928 +U 1169 ; WX 602 ; N uni0491 ; G 929 +U 1170 ; WX 602 ; N uni0492 ; G 930 +U 1171 ; WX 602 ; N uni0493 ; G 931 +U 1172 ; WX 602 ; N uni0494 ; G 932 +U 1173 ; WX 602 ; N uni0495 ; G 933 +U 1174 ; WX 602 ; N uni0496 ; G 934 +U 1175 ; WX 602 ; N uni0497 ; G 935 +U 1176 ; WX 602 ; N uni0498 ; G 936 +U 1177 ; WX 602 ; N uni0499 ; G 937 +U 1178 ; WX 602 ; N uni049A ; G 938 +U 1179 ; WX 602 ; N uni049B ; G 939 +U 1186 ; WX 602 ; N uni04A2 ; G 940 +U 1187 ; WX 602 ; N uni04A3 ; G 941 +U 1188 ; WX 602 ; N uni04A4 ; G 942 +U 1189 ; WX 602 ; N uni04A5 ; G 943 +U 1194 ; WX 602 ; N uni04AA ; G 944 +U 1195 ; WX 602 ; N uni04AB ; G 945 +U 1196 ; WX 602 ; N uni04AC ; G 946 +U 1197 ; WX 602 ; N uni04AD ; G 947 +U 1198 ; WX 602 ; N uni04AE ; G 948 +U 1199 ; WX 602 ; N uni04AF ; G 949 +U 1200 ; WX 602 ; N uni04B0 ; G 950 +U 1201 ; WX 602 ; N uni04B1 ; G 951 +U 1202 ; WX 602 ; N uni04B2 ; G 952 +U 1203 ; WX 602 ; N uni04B3 ; G 953 +U 1210 ; WX 602 ; N uni04BA ; G 954 +U 1211 ; WX 602 ; N uni04BB ; G 955 +U 1216 ; WX 602 ; N uni04C0 ; G 956 +U 1217 ; WX 602 ; N uni04C1 ; G 957 +U 1218 ; WX 602 ; N uni04C2 ; G 958 +U 1219 ; WX 602 ; N uni04C3 ; G 959 +U 1220 ; WX 602 ; N uni04C4 ; G 960 +U 1223 ; WX 602 ; N uni04C7 ; G 961 +U 1224 ; WX 602 ; N uni04C8 ; G 962 +U 1227 ; WX 602 ; N uni04CB ; G 963 +U 1228 ; WX 602 ; N uni04CC ; G 964 +U 1231 ; WX 602 ; N uni04CF ; G 965 +U 1232 ; WX 602 ; N uni04D0 ; G 966 +U 1233 ; WX 602 ; N uni04D1 ; G 967 +U 1234 ; WX 602 ; N uni04D2 ; G 968 +U 1235 ; WX 602 ; N uni04D3 ; G 969 +U 1236 ; WX 602 ; N uni04D4 ; G 970 +U 1237 ; WX 602 ; N uni04D5 ; G 971 +U 1238 ; WX 602 ; N uni04D6 ; G 972 +U 1239 ; WX 602 ; N uni04D7 ; G 973 +U 1240 ; WX 602 ; N uni04D8 ; G 974 +U 1241 ; WX 602 ; N uni04D9 ; G 975 +U 1242 ; WX 602 ; N uni04DA ; G 976 +U 1243 ; WX 602 ; N uni04DB ; G 977 +U 1244 ; WX 602 ; N uni04DC ; G 978 +U 1245 ; WX 602 ; N uni04DD ; G 979 +U 1246 ; WX 602 ; N uni04DE ; G 980 +U 1247 ; WX 602 ; N uni04DF ; G 981 +U 1248 ; WX 602 ; N uni04E0 ; G 982 +U 1249 ; WX 602 ; N uni04E1 ; G 983 +U 1250 ; WX 602 ; N uni04E2 ; G 984 +U 1251 ; WX 602 ; N uni04E3 ; G 985 +U 1252 ; WX 602 ; N uni04E4 ; G 986 +U 1253 ; WX 602 ; N uni04E5 ; G 987 +U 1254 ; WX 602 ; N uni04E6 ; G 988 +U 1255 ; WX 602 ; N uni04E7 ; G 989 +U 1256 ; WX 602 ; N uni04E8 ; G 990 +U 1257 ; WX 602 ; N uni04E9 ; G 991 +U 1258 ; WX 602 ; N uni04EA ; G 992 +U 1259 ; WX 602 ; N uni04EB ; G 993 +U 1260 ; WX 602 ; N uni04EC ; G 994 +U 1261 ; WX 602 ; N uni04ED ; G 995 +U 1262 ; WX 602 ; N uni04EE ; G 996 +U 1263 ; WX 602 ; N uni04EF ; G 997 +U 1264 ; WX 602 ; N uni04F0 ; G 998 +U 1265 ; WX 602 ; N uni04F1 ; G 999 +U 1266 ; WX 602 ; N uni04F2 ; G 1000 +U 1267 ; WX 602 ; N uni04F3 ; G 1001 +U 1268 ; WX 602 ; N uni04F4 ; G 1002 +U 1269 ; WX 602 ; N uni04F5 ; G 1003 +U 1270 ; WX 602 ; N uni04F6 ; G 1004 +U 1271 ; WX 602 ; N uni04F7 ; G 1005 +U 1272 ; WX 602 ; N uni04F8 ; G 1006 +U 1273 ; WX 602 ; N uni04F9 ; G 1007 +U 1296 ; WX 602 ; N uni0510 ; G 1008 +U 1297 ; WX 602 ; N uni0511 ; G 1009 +U 1306 ; WX 602 ; N uni051A ; G 1010 +U 1307 ; WX 602 ; N uni051B ; G 1011 +U 1308 ; WX 602 ; N uni051C ; G 1012 +U 1309 ; WX 602 ; N uni051D ; G 1013 +U 1329 ; WX 602 ; N uni0531 ; G 1014 +U 1330 ; WX 602 ; N uni0532 ; G 1015 +U 1331 ; WX 602 ; N uni0533 ; G 1016 +U 1332 ; WX 602 ; N uni0534 ; G 1017 +U 1333 ; WX 602 ; N uni0535 ; G 1018 +U 1334 ; WX 602 ; N uni0536 ; G 1019 +U 1335 ; WX 602 ; N uni0537 ; G 1020 +U 1336 ; WX 602 ; N uni0538 ; G 1021 +U 1337 ; WX 602 ; N uni0539 ; G 1022 +U 1338 ; WX 602 ; N uni053A ; G 1023 +U 1339 ; WX 602 ; N uni053B ; G 1024 +U 1340 ; WX 602 ; N uni053C ; G 1025 +U 1341 ; WX 602 ; N uni053D ; G 1026 +U 1342 ; WX 602 ; N uni053E ; G 1027 +U 1343 ; WX 602 ; N uni053F ; G 1028 +U 1344 ; WX 602 ; N uni0540 ; G 1029 +U 1345 ; WX 602 ; N uni0541 ; G 1030 +U 1346 ; WX 602 ; N uni0542 ; G 1031 +U 1347 ; WX 602 ; N uni0543 ; G 1032 +U 1348 ; WX 602 ; N uni0544 ; G 1033 +U 1349 ; WX 602 ; N uni0545 ; G 1034 +U 1350 ; WX 602 ; N uni0546 ; G 1035 +U 1351 ; WX 602 ; N uni0547 ; G 1036 +U 1352 ; WX 602 ; N uni0548 ; G 1037 +U 1353 ; WX 602 ; N uni0549 ; G 1038 +U 1354 ; WX 602 ; N uni054A ; G 1039 +U 1355 ; WX 602 ; N uni054B ; G 1040 +U 1356 ; WX 602 ; N uni054C ; G 1041 +U 1357 ; WX 602 ; N uni054D ; G 1042 +U 1358 ; WX 602 ; N uni054E ; G 1043 +U 1359 ; WX 602 ; N uni054F ; G 1044 +U 1360 ; WX 602 ; N uni0550 ; G 1045 +U 1361 ; WX 602 ; N uni0551 ; G 1046 +U 1362 ; WX 602 ; N uni0552 ; G 1047 +U 1363 ; WX 602 ; N uni0553 ; G 1048 +U 1364 ; WX 602 ; N uni0554 ; G 1049 +U 1365 ; WX 602 ; N uni0555 ; G 1050 +U 1366 ; WX 602 ; N uni0556 ; G 1051 +U 1369 ; WX 602 ; N uni0559 ; G 1052 +U 1370 ; WX 602 ; N uni055A ; G 1053 +U 1371 ; WX 602 ; N uni055B ; G 1054 +U 1372 ; WX 602 ; N uni055C ; G 1055 +U 1373 ; WX 602 ; N uni055D ; G 1056 +U 1374 ; WX 602 ; N uni055E ; G 1057 +U 1375 ; WX 602 ; N uni055F ; G 1058 +U 1377 ; WX 602 ; N uni0561 ; G 1059 +U 1378 ; WX 602 ; N uni0562 ; G 1060 +U 1379 ; WX 602 ; N uni0563 ; G 1061 +U 1380 ; WX 602 ; N uni0564 ; G 1062 +U 1381 ; WX 602 ; N uni0565 ; G 1063 +U 1382 ; WX 602 ; N uni0566 ; G 1064 +U 1383 ; WX 602 ; N uni0567 ; G 1065 +U 1384 ; WX 602 ; N uni0568 ; G 1066 +U 1385 ; WX 602 ; N uni0569 ; G 1067 +U 1386 ; WX 602 ; N uni056A ; G 1068 +U 1387 ; WX 602 ; N uni056B ; G 1069 +U 1388 ; WX 602 ; N uni056C ; G 1070 +U 1389 ; WX 602 ; N uni056D ; G 1071 +U 1390 ; WX 602 ; N uni056E ; G 1072 +U 1391 ; WX 602 ; N uni056F ; G 1073 +U 1392 ; WX 602 ; N uni0570 ; G 1074 +U 1393 ; WX 602 ; N uni0571 ; G 1075 +U 1394 ; WX 602 ; N uni0572 ; G 1076 +U 1395 ; WX 602 ; N uni0573 ; G 1077 +U 1396 ; WX 602 ; N uni0574 ; G 1078 +U 1397 ; WX 602 ; N uni0575 ; G 1079 +U 1398 ; WX 602 ; N uni0576 ; G 1080 +U 1399 ; WX 602 ; N uni0577 ; G 1081 +U 1400 ; WX 602 ; N uni0578 ; G 1082 +U 1401 ; WX 602 ; N uni0579 ; G 1083 +U 1402 ; WX 602 ; N uni057A ; G 1084 +U 1403 ; WX 602 ; N uni057B ; G 1085 +U 1404 ; WX 602 ; N uni057C ; G 1086 +U 1405 ; WX 602 ; N uni057D ; G 1087 +U 1406 ; WX 602 ; N uni057E ; G 1088 +U 1407 ; WX 602 ; N uni057F ; G 1089 +U 1408 ; WX 602 ; N uni0580 ; G 1090 +U 1409 ; WX 602 ; N uni0581 ; G 1091 +U 1410 ; WX 602 ; N uni0582 ; G 1092 +U 1411 ; WX 602 ; N uni0583 ; G 1093 +U 1412 ; WX 602 ; N uni0584 ; G 1094 +U 1413 ; WX 602 ; N uni0585 ; G 1095 +U 1414 ; WX 602 ; N uni0586 ; G 1096 +U 1415 ; WX 602 ; N uni0587 ; G 1097 +U 1417 ; WX 602 ; N uni0589 ; G 1098 +U 1418 ; WX 602 ; N uni058A ; G 1099 +U 3647 ; WX 602 ; N uni0E3F ; G 1100 +U 3713 ; WX 602 ; N uni0E81 ; G 1101 +U 3714 ; WX 602 ; N uni0E82 ; G 1102 +U 3716 ; WX 602 ; N uni0E84 ; G 1103 +U 3719 ; WX 602 ; N uni0E87 ; G 1104 +U 3720 ; WX 602 ; N uni0E88 ; G 1105 +U 3722 ; WX 602 ; N uni0E8A ; G 1106 +U 3725 ; WX 602 ; N uni0E8D ; G 1107 +U 3732 ; WX 602 ; N uni0E94 ; G 1108 +U 3733 ; WX 602 ; N uni0E95 ; G 1109 +U 3734 ; WX 602 ; N uni0E96 ; G 1110 +U 3735 ; WX 602 ; N uni0E97 ; G 1111 +U 3737 ; WX 602 ; N uni0E99 ; G 1112 +U 3738 ; WX 602 ; N uni0E9A ; G 1113 +U 3739 ; WX 602 ; N uni0E9B ; G 1114 +U 3740 ; WX 602 ; N uni0E9C ; G 1115 +U 3741 ; WX 602 ; N uni0E9D ; G 1116 +U 3742 ; WX 602 ; N uni0E9E ; G 1117 +U 3743 ; WX 602 ; N uni0E9F ; G 1118 +U 3745 ; WX 602 ; N uni0EA1 ; G 1119 +U 3746 ; WX 602 ; N uni0EA2 ; G 1120 +U 3747 ; WX 602 ; N uni0EA3 ; G 1121 +U 3749 ; WX 602 ; N uni0EA5 ; G 1122 +U 3751 ; WX 602 ; N uni0EA7 ; G 1123 +U 3754 ; WX 602 ; N uni0EAA ; G 1124 +U 3755 ; WX 602 ; N uni0EAB ; G 1125 +U 3757 ; WX 602 ; N uni0EAD ; G 1126 +U 3758 ; WX 602 ; N uni0EAE ; G 1127 +U 3759 ; WX 602 ; N uni0EAF ; G 1128 +U 3760 ; WX 602 ; N uni0EB0 ; G 1129 +U 3761 ; WX 602 ; N uni0EB1 ; G 1130 +U 3762 ; WX 602 ; N uni0EB2 ; G 1131 +U 3763 ; WX 602 ; N uni0EB3 ; G 1132 +U 3764 ; WX 602 ; N uni0EB4 ; G 1133 +U 3765 ; WX 602 ; N uni0EB5 ; G 1134 +U 3766 ; WX 602 ; N uni0EB6 ; G 1135 +U 3767 ; WX 602 ; N uni0EB7 ; G 1136 +U 3768 ; WX 602 ; N uni0EB8 ; G 1137 +U 3769 ; WX 602 ; N uni0EB9 ; G 1138 +U 3771 ; WX 602 ; N uni0EBB ; G 1139 +U 3772 ; WX 602 ; N uni0EBC ; G 1140 +U 3784 ; WX 602 ; N uni0EC8 ; G 1141 +U 3785 ; WX 602 ; N uni0EC9 ; G 1142 +U 3786 ; WX 602 ; N uni0ECA ; G 1143 +U 3787 ; WX 602 ; N uni0ECB ; G 1144 +U 3788 ; WX 602 ; N uni0ECC ; G 1145 +U 3789 ; WX 602 ; N uni0ECD ; G 1146 +U 4304 ; WX 602 ; N uni10D0 ; G 1147 +U 4305 ; WX 602 ; N uni10D1 ; G 1148 +U 4306 ; WX 602 ; N uni10D2 ; G 1149 +U 4307 ; WX 602 ; N uni10D3 ; G 1150 +U 4308 ; WX 602 ; N uni10D4 ; G 1151 +U 4309 ; WX 602 ; N uni10D5 ; G 1152 +U 4310 ; WX 602 ; N uni10D6 ; G 1153 +U 4311 ; WX 602 ; N uni10D7 ; G 1154 +U 4312 ; WX 602 ; N uni10D8 ; G 1155 +U 4313 ; WX 602 ; N uni10D9 ; G 1156 +U 4314 ; WX 602 ; N uni10DA ; G 1157 +U 4315 ; WX 602 ; N uni10DB ; G 1158 +U 4316 ; WX 602 ; N uni10DC ; G 1159 +U 4317 ; WX 602 ; N uni10DD ; G 1160 +U 4318 ; WX 602 ; N uni10DE ; G 1161 +U 4319 ; WX 602 ; N uni10DF ; G 1162 +U 4320 ; WX 602 ; N uni10E0 ; G 1163 +U 4321 ; WX 602 ; N uni10E1 ; G 1164 +U 4322 ; WX 602 ; N uni10E2 ; G 1165 +U 4323 ; WX 602 ; N uni10E3 ; G 1166 +U 4324 ; WX 602 ; N uni10E4 ; G 1167 +U 4325 ; WX 602 ; N uni10E5 ; G 1168 +U 4326 ; WX 602 ; N uni10E6 ; G 1169 +U 4327 ; WX 602 ; N uni10E7 ; G 1170 +U 4328 ; WX 602 ; N uni10E8 ; G 1171 +U 4329 ; WX 602 ; N uni10E9 ; G 1172 +U 4330 ; WX 602 ; N uni10EA ; G 1173 +U 4331 ; WX 602 ; N uni10EB ; G 1174 +U 4332 ; WX 602 ; N uni10EC ; G 1175 +U 4333 ; WX 602 ; N uni10ED ; G 1176 +U 4334 ; WX 602 ; N uni10EE ; G 1177 +U 4335 ; WX 602 ; N uni10EF ; G 1178 +U 4336 ; WX 602 ; N uni10F0 ; G 1179 +U 4337 ; WX 602 ; N uni10F1 ; G 1180 +U 4338 ; WX 602 ; N uni10F2 ; G 1181 +U 4339 ; WX 602 ; N uni10F3 ; G 1182 +U 4340 ; WX 602 ; N uni10F4 ; G 1183 +U 4341 ; WX 602 ; N uni10F5 ; G 1184 +U 4342 ; WX 602 ; N uni10F6 ; G 1185 +U 4343 ; WX 602 ; N uni10F7 ; G 1186 +U 4344 ; WX 602 ; N uni10F8 ; G 1187 +U 4345 ; WX 602 ; N uni10F9 ; G 1188 +U 4346 ; WX 602 ; N uni10FA ; G 1189 +U 4347 ; WX 602 ; N uni10FB ; G 1190 +U 4348 ; WX 602 ; N uni10FC ; G 1191 +U 7426 ; WX 602 ; N uni1D02 ; G 1192 +U 7432 ; WX 602 ; N uni1D08 ; G 1193 +U 7433 ; WX 602 ; N uni1D09 ; G 1194 +U 7444 ; WX 602 ; N uni1D14 ; G 1195 +U 7446 ; WX 602 ; N uni1D16 ; G 1196 +U 7447 ; WX 602 ; N uni1D17 ; G 1197 +U 7453 ; WX 602 ; N uni1D1D ; G 1198 +U 7454 ; WX 602 ; N uni1D1E ; G 1199 +U 7455 ; WX 602 ; N uni1D1F ; G 1200 +U 7468 ; WX 602 ; N uni1D2C ; G 1201 +U 7469 ; WX 602 ; N uni1D2D ; G 1202 +U 7470 ; WX 602 ; N uni1D2E ; G 1203 +U 7472 ; WX 602 ; N uni1D30 ; G 1204 +U 7473 ; WX 602 ; N uni1D31 ; G 1205 +U 7474 ; WX 602 ; N uni1D32 ; G 1206 +U 7475 ; WX 602 ; N uni1D33 ; G 1207 +U 7476 ; WX 602 ; N uni1D34 ; G 1208 +U 7477 ; WX 602 ; N uni1D35 ; G 1209 +U 7478 ; WX 602 ; N uni1D36 ; G 1210 +U 7479 ; WX 602 ; N uni1D37 ; G 1211 +U 7480 ; WX 602 ; N uni1D38 ; G 1212 +U 7481 ; WX 602 ; N uni1D39 ; G 1213 +U 7482 ; WX 602 ; N uni1D3A ; G 1214 +U 7483 ; WX 602 ; N uni1D3B ; G 1215 +U 7484 ; WX 602 ; N uni1D3C ; G 1216 +U 7485 ; WX 602 ; N uni1D3D ; G 1217 +U 7486 ; WX 602 ; N uni1D3E ; G 1218 +U 7487 ; WX 602 ; N uni1D3F ; G 1219 +U 7488 ; WX 602 ; N uni1D40 ; G 1220 +U 7489 ; WX 602 ; N uni1D41 ; G 1221 +U 7490 ; WX 602 ; N uni1D42 ; G 1222 +U 7491 ; WX 602 ; N uni1D43 ; G 1223 +U 7492 ; WX 602 ; N uni1D44 ; G 1224 +U 7493 ; WX 602 ; N uni1D45 ; G 1225 +U 7494 ; WX 602 ; N uni1D46 ; G 1226 +U 7495 ; WX 602 ; N uni1D47 ; G 1227 +U 7496 ; WX 602 ; N uni1D48 ; G 1228 +U 7497 ; WX 602 ; N uni1D49 ; G 1229 +U 7498 ; WX 602 ; N uni1D4A ; G 1230 +U 7499 ; WX 602 ; N uni1D4B ; G 1231 +U 7500 ; WX 602 ; N uni1D4C ; G 1232 +U 7501 ; WX 602 ; N uni1D4D ; G 1233 +U 7502 ; WX 602 ; N uni1D4E ; G 1234 +U 7503 ; WX 602 ; N uni1D4F ; G 1235 +U 7504 ; WX 602 ; N uni1D50 ; G 1236 +U 7505 ; WX 602 ; N uni1D51 ; G 1237 +U 7506 ; WX 602 ; N uni1D52 ; G 1238 +U 7507 ; WX 602 ; N uni1D53 ; G 1239 +U 7508 ; WX 602 ; N uni1D54 ; G 1240 +U 7509 ; WX 602 ; N uni1D55 ; G 1241 +U 7510 ; WX 602 ; N uni1D56 ; G 1242 +U 7511 ; WX 602 ; N uni1D57 ; G 1243 +U 7512 ; WX 602 ; N uni1D58 ; G 1244 +U 7513 ; WX 602 ; N uni1D59 ; G 1245 +U 7514 ; WX 602 ; N uni1D5A ; G 1246 +U 7515 ; WX 602 ; N uni1D5B ; G 1247 +U 7522 ; WX 602 ; N uni1D62 ; G 1248 +U 7523 ; WX 602 ; N uni1D63 ; G 1249 +U 7524 ; WX 602 ; N uni1D64 ; G 1250 +U 7525 ; WX 602 ; N uni1D65 ; G 1251 +U 7543 ; WX 602 ; N uni1D77 ; G 1252 +U 7544 ; WX 602 ; N uni1D78 ; G 1253 +U 7547 ; WX 602 ; N uni1D7B ; G 1254 +U 7557 ; WX 602 ; N uni1D85 ; G 1255 +U 7579 ; WX 602 ; N uni1D9B ; G 1256 +U 7580 ; WX 602 ; N uni1D9C ; G 1257 +U 7581 ; WX 602 ; N uni1D9D ; G 1258 +U 7582 ; WX 602 ; N uni1D9E ; G 1259 +U 7583 ; WX 602 ; N uni1D9F ; G 1260 +U 7584 ; WX 602 ; N uni1DA0 ; G 1261 +U 7585 ; WX 602 ; N uni1DA1 ; G 1262 +U 7586 ; WX 602 ; N uni1DA2 ; G 1263 +U 7587 ; WX 602 ; N uni1DA3 ; G 1264 +U 7588 ; WX 602 ; N uni1DA4 ; G 1265 +U 7589 ; WX 602 ; N uni1DA5 ; G 1266 +U 7590 ; WX 602 ; N uni1DA6 ; G 1267 +U 7591 ; WX 602 ; N uni1DA7 ; G 1268 +U 7592 ; WX 602 ; N uni1DA8 ; G 1269 +U 7593 ; WX 602 ; N uni1DA9 ; G 1270 +U 7594 ; WX 602 ; N uni1DAA ; G 1271 +U 7595 ; WX 602 ; N uni1DAB ; G 1272 +U 7596 ; WX 602 ; N uni1DAC ; G 1273 +U 7597 ; WX 602 ; N uni1DAD ; G 1274 +U 7598 ; WX 602 ; N uni1DAE ; G 1275 +U 7599 ; WX 602 ; N uni1DAF ; G 1276 +U 7600 ; WX 602 ; N uni1DB0 ; G 1277 +U 7601 ; WX 602 ; N uni1DB1 ; G 1278 +U 7602 ; WX 602 ; N uni1DB2 ; G 1279 +U 7603 ; WX 602 ; N uni1DB3 ; G 1280 +U 7604 ; WX 602 ; N uni1DB4 ; G 1281 +U 7605 ; WX 602 ; N uni1DB5 ; G 1282 +U 7606 ; WX 602 ; N uni1DB6 ; G 1283 +U 7607 ; WX 602 ; N uni1DB7 ; G 1284 +U 7609 ; WX 602 ; N uni1DB9 ; G 1285 +U 7610 ; WX 602 ; N uni1DBA ; G 1286 +U 7611 ; WX 602 ; N uni1DBB ; G 1287 +U 7612 ; WX 602 ; N uni1DBC ; G 1288 +U 7613 ; WX 602 ; N uni1DBD ; G 1289 +U 7614 ; WX 602 ; N uni1DBE ; G 1290 +U 7615 ; WX 602 ; N uni1DBF ; G 1291 +U 7680 ; WX 602 ; N uni1E00 ; G 1292 +U 7681 ; WX 602 ; N uni1E01 ; G 1293 +U 7682 ; WX 602 ; N uni1E02 ; G 1294 +U 7683 ; WX 602 ; N uni1E03 ; G 1295 +U 7684 ; WX 602 ; N uni1E04 ; G 1296 +U 7685 ; WX 602 ; N uni1E05 ; G 1297 +U 7686 ; WX 602 ; N uni1E06 ; G 1298 +U 7687 ; WX 602 ; N uni1E07 ; G 1299 +U 7688 ; WX 602 ; N uni1E08 ; G 1300 +U 7689 ; WX 602 ; N uni1E09 ; G 1301 +U 7690 ; WX 602 ; N uni1E0A ; G 1302 +U 7691 ; WX 602 ; N uni1E0B ; G 1303 +U 7692 ; WX 602 ; N uni1E0C ; G 1304 +U 7693 ; WX 602 ; N uni1E0D ; G 1305 +U 7694 ; WX 602 ; N uni1E0E ; G 1306 +U 7695 ; WX 602 ; N uni1E0F ; G 1307 +U 7696 ; WX 602 ; N uni1E10 ; G 1308 +U 7697 ; WX 602 ; N uni1E11 ; G 1309 +U 7698 ; WX 602 ; N uni1E12 ; G 1310 +U 7699 ; WX 602 ; N uni1E13 ; G 1311 +U 7704 ; WX 602 ; N uni1E18 ; G 1312 +U 7705 ; WX 602 ; N uni1E19 ; G 1313 +U 7706 ; WX 602 ; N uni1E1A ; G 1314 +U 7707 ; WX 602 ; N uni1E1B ; G 1315 +U 7708 ; WX 602 ; N uni1E1C ; G 1316 +U 7709 ; WX 602 ; N uni1E1D ; G 1317 +U 7710 ; WX 602 ; N uni1E1E ; G 1318 +U 7711 ; WX 602 ; N uni1E1F ; G 1319 +U 7712 ; WX 602 ; N uni1E20 ; G 1320 +U 7713 ; WX 602 ; N uni1E21 ; G 1321 +U 7714 ; WX 602 ; N uni1E22 ; G 1322 +U 7715 ; WX 602 ; N uni1E23 ; G 1323 +U 7716 ; WX 602 ; N uni1E24 ; G 1324 +U 7717 ; WX 602 ; N uni1E25 ; G 1325 +U 7718 ; WX 602 ; N uni1E26 ; G 1326 +U 7719 ; WX 602 ; N uni1E27 ; G 1327 +U 7720 ; WX 602 ; N uni1E28 ; G 1328 +U 7721 ; WX 602 ; N uni1E29 ; G 1329 +U 7722 ; WX 602 ; N uni1E2A ; G 1330 +U 7723 ; WX 602 ; N uni1E2B ; G 1331 +U 7724 ; WX 602 ; N uni1E2C ; G 1332 +U 7725 ; WX 602 ; N uni1E2D ; G 1333 +U 7728 ; WX 602 ; N uni1E30 ; G 1334 +U 7729 ; WX 602 ; N uni1E31 ; G 1335 +U 7730 ; WX 602 ; N uni1E32 ; G 1336 +U 7731 ; WX 602 ; N uni1E33 ; G 1337 +U 7732 ; WX 602 ; N uni1E34 ; G 1338 +U 7733 ; WX 602 ; N uni1E35 ; G 1339 +U 7734 ; WX 602 ; N uni1E36 ; G 1340 +U 7735 ; WX 602 ; N uni1E37 ; G 1341 +U 7736 ; WX 602 ; N uni1E38 ; G 1342 +U 7737 ; WX 602 ; N uni1E39 ; G 1343 +U 7738 ; WX 602 ; N uni1E3A ; G 1344 +U 7739 ; WX 602 ; N uni1E3B ; G 1345 +U 7740 ; WX 602 ; N uni1E3C ; G 1346 +U 7741 ; WX 602 ; N uni1E3D ; G 1347 +U 7742 ; WX 602 ; N uni1E3E ; G 1348 +U 7743 ; WX 602 ; N uni1E3F ; G 1349 +U 7744 ; WX 602 ; N uni1E40 ; G 1350 +U 7745 ; WX 602 ; N uni1E41 ; G 1351 +U 7746 ; WX 602 ; N uni1E42 ; G 1352 +U 7747 ; WX 602 ; N uni1E43 ; G 1353 +U 7748 ; WX 602 ; N uni1E44 ; G 1354 +U 7749 ; WX 602 ; N uni1E45 ; G 1355 +U 7750 ; WX 602 ; N uni1E46 ; G 1356 +U 7751 ; WX 602 ; N uni1E47 ; G 1357 +U 7752 ; WX 602 ; N uni1E48 ; G 1358 +U 7753 ; WX 602 ; N uni1E49 ; G 1359 +U 7754 ; WX 602 ; N uni1E4A ; G 1360 +U 7755 ; WX 602 ; N uni1E4B ; G 1361 +U 7756 ; WX 602 ; N uni1E4C ; G 1362 +U 7757 ; WX 602 ; N uni1E4D ; G 1363 +U 7764 ; WX 602 ; N uni1E54 ; G 1364 +U 7765 ; WX 602 ; N uni1E55 ; G 1365 +U 7766 ; WX 602 ; N uni1E56 ; G 1366 +U 7767 ; WX 602 ; N uni1E57 ; G 1367 +U 7768 ; WX 602 ; N uni1E58 ; G 1368 +U 7769 ; WX 602 ; N uni1E59 ; G 1369 +U 7770 ; WX 602 ; N uni1E5A ; G 1370 +U 7771 ; WX 602 ; N uni1E5B ; G 1371 +U 7772 ; WX 602 ; N uni1E5C ; G 1372 +U 7773 ; WX 602 ; N uni1E5D ; G 1373 +U 7774 ; WX 602 ; N uni1E5E ; G 1374 +U 7775 ; WX 602 ; N uni1E5F ; G 1375 +U 7776 ; WX 602 ; N uni1E60 ; G 1376 +U 7777 ; WX 602 ; N uni1E61 ; G 1377 +U 7778 ; WX 602 ; N uni1E62 ; G 1378 +U 7779 ; WX 602 ; N uni1E63 ; G 1379 +U 7784 ; WX 602 ; N uni1E68 ; G 1380 +U 7785 ; WX 602 ; N uni1E69 ; G 1381 +U 7786 ; WX 602 ; N uni1E6A ; G 1382 +U 7787 ; WX 602 ; N uni1E6B ; G 1383 +U 7788 ; WX 602 ; N uni1E6C ; G 1384 +U 7789 ; WX 602 ; N uni1E6D ; G 1385 +U 7790 ; WX 602 ; N uni1E6E ; G 1386 +U 7791 ; WX 602 ; N uni1E6F ; G 1387 +U 7792 ; WX 602 ; N uni1E70 ; G 1388 +U 7793 ; WX 602 ; N uni1E71 ; G 1389 +U 7794 ; WX 602 ; N uni1E72 ; G 1390 +U 7795 ; WX 602 ; N uni1E73 ; G 1391 +U 7796 ; WX 602 ; N uni1E74 ; G 1392 +U 7797 ; WX 602 ; N uni1E75 ; G 1393 +U 7798 ; WX 602 ; N uni1E76 ; G 1394 +U 7799 ; WX 602 ; N uni1E77 ; G 1395 +U 7800 ; WX 602 ; N uni1E78 ; G 1396 +U 7801 ; WX 602 ; N uni1E79 ; G 1397 +U 7804 ; WX 602 ; N uni1E7C ; G 1398 +U 7805 ; WX 602 ; N uni1E7D ; G 1399 +U 7806 ; WX 602 ; N uni1E7E ; G 1400 +U 7807 ; WX 602 ; N uni1E7F ; G 1401 +U 7808 ; WX 602 ; N Wgrave ; G 1402 +U 7809 ; WX 602 ; N wgrave ; G 1403 +U 7810 ; WX 602 ; N Wacute ; G 1404 +U 7811 ; WX 602 ; N wacute ; G 1405 +U 7812 ; WX 602 ; N Wdieresis ; G 1406 +U 7813 ; WX 602 ; N wdieresis ; G 1407 +U 7814 ; WX 602 ; N uni1E86 ; G 1408 +U 7815 ; WX 602 ; N uni1E87 ; G 1409 +U 7816 ; WX 602 ; N uni1E88 ; G 1410 +U 7817 ; WX 602 ; N uni1E89 ; G 1411 +U 7818 ; WX 602 ; N uni1E8A ; G 1412 +U 7819 ; WX 602 ; N uni1E8B ; G 1413 +U 7820 ; WX 602 ; N uni1E8C ; G 1414 +U 7821 ; WX 602 ; N uni1E8D ; G 1415 +U 7822 ; WX 602 ; N uni1E8E ; G 1416 +U 7823 ; WX 602 ; N uni1E8F ; G 1417 +U 7824 ; WX 602 ; N uni1E90 ; G 1418 +U 7825 ; WX 602 ; N uni1E91 ; G 1419 +U 7826 ; WX 602 ; N uni1E92 ; G 1420 +U 7827 ; WX 602 ; N uni1E93 ; G 1421 +U 7828 ; WX 602 ; N uni1E94 ; G 1422 +U 7829 ; WX 602 ; N uni1E95 ; G 1423 +U 7830 ; WX 602 ; N uni1E96 ; G 1424 +U 7831 ; WX 602 ; N uni1E97 ; G 1425 +U 7832 ; WX 602 ; N uni1E98 ; G 1426 +U 7833 ; WX 602 ; N uni1E99 ; G 1427 +U 7835 ; WX 602 ; N uni1E9B ; G 1428 +U 7839 ; WX 602 ; N uni1E9F ; G 1429 +U 7840 ; WX 602 ; N uni1EA0 ; G 1430 +U 7841 ; WX 602 ; N uni1EA1 ; G 1431 +U 7852 ; WX 602 ; N uni1EAC ; G 1432 +U 7853 ; WX 602 ; N uni1EAD ; G 1433 +U 7856 ; WX 602 ; N uni1EB0 ; G 1434 +U 7857 ; WX 602 ; N uni1EB1 ; G 1435 +U 7862 ; WX 602 ; N uni1EB6 ; G 1436 +U 7863 ; WX 602 ; N uni1EB7 ; G 1437 +U 7864 ; WX 602 ; N uni1EB8 ; G 1438 +U 7865 ; WX 602 ; N uni1EB9 ; G 1439 +U 7868 ; WX 602 ; N uni1EBC ; G 1440 +U 7869 ; WX 602 ; N uni1EBD ; G 1441 +U 7878 ; WX 602 ; N uni1EC6 ; G 1442 +U 7879 ; WX 602 ; N uni1EC7 ; G 1443 +U 7882 ; WX 602 ; N uni1ECA ; G 1444 +U 7883 ; WX 602 ; N uni1ECB ; G 1445 +U 7884 ; WX 602 ; N uni1ECC ; G 1446 +U 7885 ; WX 602 ; N uni1ECD ; G 1447 +U 7896 ; WX 602 ; N uni1ED8 ; G 1448 +U 7897 ; WX 602 ; N uni1ED9 ; G 1449 +U 7898 ; WX 602 ; N uni1EDA ; G 1450 +U 7899 ; WX 602 ; N uni1EDB ; G 1451 +U 7900 ; WX 602 ; N uni1EDC ; G 1452 +U 7901 ; WX 602 ; N uni1EDD ; G 1453 +U 7904 ; WX 602 ; N uni1EE0 ; G 1454 +U 7905 ; WX 602 ; N uni1EE1 ; G 1455 +U 7906 ; WX 602 ; N uni1EE2 ; G 1456 +U 7907 ; WX 602 ; N uni1EE3 ; G 1457 +U 7908 ; WX 602 ; N uni1EE4 ; G 1458 +U 7909 ; WX 602 ; N uni1EE5 ; G 1459 +U 7912 ; WX 602 ; N uni1EE8 ; G 1460 +U 7913 ; WX 602 ; N uni1EE9 ; G 1461 +U 7914 ; WX 602 ; N uni1EEA ; G 1462 +U 7915 ; WX 602 ; N uni1EEB ; G 1463 +U 7918 ; WX 602 ; N uni1EEE ; G 1464 +U 7919 ; WX 602 ; N uni1EEF ; G 1465 +U 7920 ; WX 602 ; N uni1EF0 ; G 1466 +U 7921 ; WX 602 ; N uni1EF1 ; G 1467 +U 7922 ; WX 602 ; N Ygrave ; G 1468 +U 7923 ; WX 602 ; N ygrave ; G 1469 +U 7924 ; WX 602 ; N uni1EF4 ; G 1470 +U 7925 ; WX 602 ; N uni1EF5 ; G 1471 +U 7928 ; WX 602 ; N uni1EF8 ; G 1472 +U 7929 ; WX 602 ; N uni1EF9 ; G 1473 +U 7936 ; WX 602 ; N uni1F00 ; G 1474 +U 7937 ; WX 602 ; N uni1F01 ; G 1475 +U 7938 ; WX 602 ; N uni1F02 ; G 1476 +U 7939 ; WX 602 ; N uni1F03 ; G 1477 +U 7940 ; WX 602 ; N uni1F04 ; G 1478 +U 7941 ; WX 602 ; N uni1F05 ; G 1479 +U 7942 ; WX 602 ; N uni1F06 ; G 1480 +U 7943 ; WX 602 ; N uni1F07 ; G 1481 +U 7944 ; WX 602 ; N uni1F08 ; G 1482 +U 7945 ; WX 602 ; N uni1F09 ; G 1483 +U 7946 ; WX 602 ; N uni1F0A ; G 1484 +U 7947 ; WX 602 ; N uni1F0B ; G 1485 +U 7948 ; WX 602 ; N uni1F0C ; G 1486 +U 7949 ; WX 602 ; N uni1F0D ; G 1487 +U 7950 ; WX 602 ; N uni1F0E ; G 1488 +U 7951 ; WX 602 ; N uni1F0F ; G 1489 +U 7952 ; WX 602 ; N uni1F10 ; G 1490 +U 7953 ; WX 602 ; N uni1F11 ; G 1491 +U 7954 ; WX 602 ; N uni1F12 ; G 1492 +U 7955 ; WX 602 ; N uni1F13 ; G 1493 +U 7956 ; WX 602 ; N uni1F14 ; G 1494 +U 7957 ; WX 602 ; N uni1F15 ; G 1495 +U 7960 ; WX 602 ; N uni1F18 ; G 1496 +U 7961 ; WX 602 ; N uni1F19 ; G 1497 +U 7962 ; WX 602 ; N uni1F1A ; G 1498 +U 7963 ; WX 602 ; N uni1F1B ; G 1499 +U 7964 ; WX 602 ; N uni1F1C ; G 1500 +U 7965 ; WX 602 ; N uni1F1D ; G 1501 +U 7968 ; WX 602 ; N uni1F20 ; G 1502 +U 7969 ; WX 602 ; N uni1F21 ; G 1503 +U 7970 ; WX 602 ; N uni1F22 ; G 1504 +U 7971 ; WX 602 ; N uni1F23 ; G 1505 +U 7972 ; WX 602 ; N uni1F24 ; G 1506 +U 7973 ; WX 602 ; N uni1F25 ; G 1507 +U 7974 ; WX 602 ; N uni1F26 ; G 1508 +U 7975 ; WX 602 ; N uni1F27 ; G 1509 +U 7976 ; WX 602 ; N uni1F28 ; G 1510 +U 7977 ; WX 602 ; N uni1F29 ; G 1511 +U 7978 ; WX 602 ; N uni1F2A ; G 1512 +U 7979 ; WX 602 ; N uni1F2B ; G 1513 +U 7980 ; WX 602 ; N uni1F2C ; G 1514 +U 7981 ; WX 602 ; N uni1F2D ; G 1515 +U 7982 ; WX 602 ; N uni1F2E ; G 1516 +U 7983 ; WX 602 ; N uni1F2F ; G 1517 +U 7984 ; WX 602 ; N uni1F30 ; G 1518 +U 7985 ; WX 602 ; N uni1F31 ; G 1519 +U 7986 ; WX 602 ; N uni1F32 ; G 1520 +U 7987 ; WX 602 ; N uni1F33 ; G 1521 +U 7988 ; WX 602 ; N uni1F34 ; G 1522 +U 7989 ; WX 602 ; N uni1F35 ; G 1523 +U 7990 ; WX 602 ; N uni1F36 ; G 1524 +U 7991 ; WX 602 ; N uni1F37 ; G 1525 +U 7992 ; WX 602 ; N uni1F38 ; G 1526 +U 7993 ; WX 602 ; N uni1F39 ; G 1527 +U 7994 ; WX 602 ; N uni1F3A ; G 1528 +U 7995 ; WX 602 ; N uni1F3B ; G 1529 +U 7996 ; WX 602 ; N uni1F3C ; G 1530 +U 7997 ; WX 602 ; N uni1F3D ; G 1531 +U 7998 ; WX 602 ; N uni1F3E ; G 1532 +U 7999 ; WX 602 ; N uni1F3F ; G 1533 +U 8000 ; WX 602 ; N uni1F40 ; G 1534 +U 8001 ; WX 602 ; N uni1F41 ; G 1535 +U 8002 ; WX 602 ; N uni1F42 ; G 1536 +U 8003 ; WX 602 ; N uni1F43 ; G 1537 +U 8004 ; WX 602 ; N uni1F44 ; G 1538 +U 8005 ; WX 602 ; N uni1F45 ; G 1539 +U 8008 ; WX 602 ; N uni1F48 ; G 1540 +U 8009 ; WX 602 ; N uni1F49 ; G 1541 +U 8010 ; WX 602 ; N uni1F4A ; G 1542 +U 8011 ; WX 602 ; N uni1F4B ; G 1543 +U 8012 ; WX 602 ; N uni1F4C ; G 1544 +U 8013 ; WX 602 ; N uni1F4D ; G 1545 +U 8016 ; WX 602 ; N uni1F50 ; G 1546 +U 8017 ; WX 602 ; N uni1F51 ; G 1547 +U 8018 ; WX 602 ; N uni1F52 ; G 1548 +U 8019 ; WX 602 ; N uni1F53 ; G 1549 +U 8020 ; WX 602 ; N uni1F54 ; G 1550 +U 8021 ; WX 602 ; N uni1F55 ; G 1551 +U 8022 ; WX 602 ; N uni1F56 ; G 1552 +U 8023 ; WX 602 ; N uni1F57 ; G 1553 +U 8025 ; WX 602 ; N uni1F59 ; G 1554 +U 8027 ; WX 602 ; N uni1F5B ; G 1555 +U 8029 ; WX 602 ; N uni1F5D ; G 1556 +U 8031 ; WX 602 ; N uni1F5F ; G 1557 +U 8032 ; WX 602 ; N uni1F60 ; G 1558 +U 8033 ; WX 602 ; N uni1F61 ; G 1559 +U 8034 ; WX 602 ; N uni1F62 ; G 1560 +U 8035 ; WX 602 ; N uni1F63 ; G 1561 +U 8036 ; WX 602 ; N uni1F64 ; G 1562 +U 8037 ; WX 602 ; N uni1F65 ; G 1563 +U 8038 ; WX 602 ; N uni1F66 ; G 1564 +U 8039 ; WX 602 ; N uni1F67 ; G 1565 +U 8040 ; WX 602 ; N uni1F68 ; G 1566 +U 8041 ; WX 602 ; N uni1F69 ; G 1567 +U 8042 ; WX 602 ; N uni1F6A ; G 1568 +U 8043 ; WX 602 ; N uni1F6B ; G 1569 +U 8044 ; WX 602 ; N uni1F6C ; G 1570 +U 8045 ; WX 602 ; N uni1F6D ; G 1571 +U 8046 ; WX 602 ; N uni1F6E ; G 1572 +U 8047 ; WX 602 ; N uni1F6F ; G 1573 +U 8048 ; WX 602 ; N uni1F70 ; G 1574 +U 8049 ; WX 602 ; N uni1F71 ; G 1575 +U 8050 ; WX 602 ; N uni1F72 ; G 1576 +U 8051 ; WX 602 ; N uni1F73 ; G 1577 +U 8052 ; WX 602 ; N uni1F74 ; G 1578 +U 8053 ; WX 602 ; N uni1F75 ; G 1579 +U 8054 ; WX 602 ; N uni1F76 ; G 1580 +U 8055 ; WX 602 ; N uni1F77 ; G 1581 +U 8056 ; WX 602 ; N uni1F78 ; G 1582 +U 8057 ; WX 602 ; N uni1F79 ; G 1583 +U 8058 ; WX 602 ; N uni1F7A ; G 1584 +U 8059 ; WX 602 ; N uni1F7B ; G 1585 +U 8060 ; WX 602 ; N uni1F7C ; G 1586 +U 8061 ; WX 602 ; N uni1F7D ; G 1587 +U 8064 ; WX 602 ; N uni1F80 ; G 1588 +U 8065 ; WX 602 ; N uni1F81 ; G 1589 +U 8066 ; WX 602 ; N uni1F82 ; G 1590 +U 8067 ; WX 602 ; N uni1F83 ; G 1591 +U 8068 ; WX 602 ; N uni1F84 ; G 1592 +U 8069 ; WX 602 ; N uni1F85 ; G 1593 +U 8070 ; WX 602 ; N uni1F86 ; G 1594 +U 8071 ; WX 602 ; N uni1F87 ; G 1595 +U 8072 ; WX 602 ; N uni1F88 ; G 1596 +U 8073 ; WX 602 ; N uni1F89 ; G 1597 +U 8074 ; WX 602 ; N uni1F8A ; G 1598 +U 8075 ; WX 602 ; N uni1F8B ; G 1599 +U 8076 ; WX 602 ; N uni1F8C ; G 1600 +U 8077 ; WX 602 ; N uni1F8D ; G 1601 +U 8078 ; WX 602 ; N uni1F8E ; G 1602 +U 8079 ; WX 602 ; N uni1F8F ; G 1603 +U 8080 ; WX 602 ; N uni1F90 ; G 1604 +U 8081 ; WX 602 ; N uni1F91 ; G 1605 +U 8082 ; WX 602 ; N uni1F92 ; G 1606 +U 8083 ; WX 602 ; N uni1F93 ; G 1607 +U 8084 ; WX 602 ; N uni1F94 ; G 1608 +U 8085 ; WX 602 ; N uni1F95 ; G 1609 +U 8086 ; WX 602 ; N uni1F96 ; G 1610 +U 8087 ; WX 602 ; N uni1F97 ; G 1611 +U 8088 ; WX 602 ; N uni1F98 ; G 1612 +U 8089 ; WX 602 ; N uni1F99 ; G 1613 +U 8090 ; WX 602 ; N uni1F9A ; G 1614 +U 8091 ; WX 602 ; N uni1F9B ; G 1615 +U 8092 ; WX 602 ; N uni1F9C ; G 1616 +U 8093 ; WX 602 ; N uni1F9D ; G 1617 +U 8094 ; WX 602 ; N uni1F9E ; G 1618 +U 8095 ; WX 602 ; N uni1F9F ; G 1619 +U 8096 ; WX 602 ; N uni1FA0 ; G 1620 +U 8097 ; WX 602 ; N uni1FA1 ; G 1621 +U 8098 ; WX 602 ; N uni1FA2 ; G 1622 +U 8099 ; WX 602 ; N uni1FA3 ; G 1623 +U 8100 ; WX 602 ; N uni1FA4 ; G 1624 +U 8101 ; WX 602 ; N uni1FA5 ; G 1625 +U 8102 ; WX 602 ; N uni1FA6 ; G 1626 +U 8103 ; WX 602 ; N uni1FA7 ; G 1627 +U 8104 ; WX 602 ; N uni1FA8 ; G 1628 +U 8105 ; WX 602 ; N uni1FA9 ; G 1629 +U 8106 ; WX 602 ; N uni1FAA ; G 1630 +U 8107 ; WX 602 ; N uni1FAB ; G 1631 +U 8108 ; WX 602 ; N uni1FAC ; G 1632 +U 8109 ; WX 602 ; N uni1FAD ; G 1633 +U 8110 ; WX 602 ; N uni1FAE ; G 1634 +U 8111 ; WX 602 ; N uni1FAF ; G 1635 +U 8112 ; WX 602 ; N uni1FB0 ; G 1636 +U 8113 ; WX 602 ; N uni1FB1 ; G 1637 +U 8114 ; WX 602 ; N uni1FB2 ; G 1638 +U 8115 ; WX 602 ; N uni1FB3 ; G 1639 +U 8116 ; WX 602 ; N uni1FB4 ; G 1640 +U 8118 ; WX 602 ; N uni1FB6 ; G 1641 +U 8119 ; WX 602 ; N uni1FB7 ; G 1642 +U 8120 ; WX 602 ; N uni1FB8 ; G 1643 +U 8121 ; WX 602 ; N uni1FB9 ; G 1644 +U 8122 ; WX 602 ; N uni1FBA ; G 1645 +U 8123 ; WX 602 ; N uni1FBB ; G 1646 +U 8124 ; WX 602 ; N uni1FBC ; G 1647 +U 8125 ; WX 602 ; N uni1FBD ; G 1648 +U 8126 ; WX 602 ; N uni1FBE ; G 1649 +U 8127 ; WX 602 ; N uni1FBF ; G 1650 +U 8128 ; WX 602 ; N uni1FC0 ; G 1651 +U 8129 ; WX 602 ; N uni1FC1 ; G 1652 +U 8130 ; WX 602 ; N uni1FC2 ; G 1653 +U 8131 ; WX 602 ; N uni1FC3 ; G 1654 +U 8132 ; WX 602 ; N uni1FC4 ; G 1655 +U 8134 ; WX 602 ; N uni1FC6 ; G 1656 +U 8135 ; WX 602 ; N uni1FC7 ; G 1657 +U 8136 ; WX 602 ; N uni1FC8 ; G 1658 +U 8137 ; WX 602 ; N uni1FC9 ; G 1659 +U 8138 ; WX 602 ; N uni1FCA ; G 1660 +U 8139 ; WX 602 ; N uni1FCB ; G 1661 +U 8140 ; WX 602 ; N uni1FCC ; G 1662 +U 8141 ; WX 602 ; N uni1FCD ; G 1663 +U 8142 ; WX 602 ; N uni1FCE ; G 1664 +U 8143 ; WX 602 ; N uni1FCF ; G 1665 +U 8144 ; WX 602 ; N uni1FD0 ; G 1666 +U 8145 ; WX 602 ; N uni1FD1 ; G 1667 +U 8146 ; WX 602 ; N uni1FD2 ; G 1668 +U 8147 ; WX 602 ; N uni1FD3 ; G 1669 +U 8150 ; WX 602 ; N uni1FD6 ; G 1670 +U 8151 ; WX 602 ; N uni1FD7 ; G 1671 +U 8152 ; WX 602 ; N uni1FD8 ; G 1672 +U 8153 ; WX 602 ; N uni1FD9 ; G 1673 +U 8154 ; WX 602 ; N uni1FDA ; G 1674 +U 8155 ; WX 602 ; N uni1FDB ; G 1675 +U 8157 ; WX 602 ; N uni1FDD ; G 1676 +U 8158 ; WX 602 ; N uni1FDE ; G 1677 +U 8159 ; WX 602 ; N uni1FDF ; G 1678 +U 8160 ; WX 602 ; N uni1FE0 ; G 1679 +U 8161 ; WX 602 ; N uni1FE1 ; G 1680 +U 8162 ; WX 602 ; N uni1FE2 ; G 1681 +U 8163 ; WX 602 ; N uni1FE3 ; G 1682 +U 8164 ; WX 602 ; N uni1FE4 ; G 1683 +U 8165 ; WX 602 ; N uni1FE5 ; G 1684 +U 8166 ; WX 602 ; N uni1FE6 ; G 1685 +U 8167 ; WX 602 ; N uni1FE7 ; G 1686 +U 8168 ; WX 602 ; N uni1FE8 ; G 1687 +U 8169 ; WX 602 ; N uni1FE9 ; G 1688 +U 8170 ; WX 602 ; N uni1FEA ; G 1689 +U 8171 ; WX 602 ; N uni1FEB ; G 1690 +U 8172 ; WX 602 ; N uni1FEC ; G 1691 +U 8173 ; WX 602 ; N uni1FED ; G 1692 +U 8174 ; WX 602 ; N uni1FEE ; G 1693 +U 8175 ; WX 602 ; N uni1FEF ; G 1694 +U 8178 ; WX 602 ; N uni1FF2 ; G 1695 +U 8179 ; WX 602 ; N uni1FF3 ; G 1696 +U 8180 ; WX 602 ; N uni1FF4 ; G 1697 +U 8182 ; WX 602 ; N uni1FF6 ; G 1698 +U 8183 ; WX 602 ; N uni1FF7 ; G 1699 +U 8184 ; WX 602 ; N uni1FF8 ; G 1700 +U 8185 ; WX 602 ; N uni1FF9 ; G 1701 +U 8186 ; WX 602 ; N uni1FFA ; G 1702 +U 8187 ; WX 602 ; N uni1FFB ; G 1703 +U 8188 ; WX 602 ; N uni1FFC ; G 1704 +U 8189 ; WX 602 ; N uni1FFD ; G 1705 +U 8190 ; WX 602 ; N uni1FFE ; G 1706 +U 8192 ; WX 602 ; N uni2000 ; G 1707 +U 8193 ; WX 602 ; N uni2001 ; G 1708 +U 8194 ; WX 602 ; N uni2002 ; G 1709 +U 8195 ; WX 602 ; N uni2003 ; G 1710 +U 8196 ; WX 602 ; N uni2004 ; G 1711 +U 8197 ; WX 602 ; N uni2005 ; G 1712 +U 8198 ; WX 602 ; N uni2006 ; G 1713 +U 8199 ; WX 602 ; N uni2007 ; G 1714 +U 8200 ; WX 602 ; N uni2008 ; G 1715 +U 8201 ; WX 602 ; N uni2009 ; G 1716 +U 8202 ; WX 602 ; N uni200A ; G 1717 +U 8208 ; WX 602 ; N uni2010 ; G 1718 +U 8209 ; WX 602 ; N uni2011 ; G 1719 +U 8210 ; WX 602 ; N figuredash ; G 1720 +U 8211 ; WX 602 ; N endash ; G 1721 +U 8212 ; WX 602 ; N emdash ; G 1722 +U 8213 ; WX 602 ; N uni2015 ; G 1723 +U 8214 ; WX 602 ; N uni2016 ; G 1724 +U 8215 ; WX 602 ; N underscoredbl ; G 1725 +U 8216 ; WX 602 ; N quoteleft ; G 1726 +U 8217 ; WX 602 ; N quoteright ; G 1727 +U 8218 ; WX 602 ; N quotesinglbase ; G 1728 +U 8219 ; WX 602 ; N quotereversed ; G 1729 +U 8220 ; WX 602 ; N quotedblleft ; G 1730 +U 8221 ; WX 602 ; N quotedblright ; G 1731 +U 8222 ; WX 602 ; N quotedblbase ; G 1732 +U 8223 ; WX 602 ; N uni201F ; G 1733 +U 8224 ; WX 602 ; N dagger ; G 1734 +U 8225 ; WX 602 ; N daggerdbl ; G 1735 +U 8226 ; WX 602 ; N bullet ; G 1736 +U 8227 ; WX 602 ; N uni2023 ; G 1737 +U 8230 ; WX 602 ; N ellipsis ; G 1738 +U 8239 ; WX 602 ; N uni202F ; G 1739 +U 8240 ; WX 602 ; N perthousand ; G 1740 +U 8241 ; WX 602 ; N uni2031 ; G 1741 +U 8242 ; WX 602 ; N minute ; G 1742 +U 8243 ; WX 602 ; N second ; G 1743 +U 8244 ; WX 602 ; N uni2034 ; G 1744 +U 8245 ; WX 602 ; N uni2035 ; G 1745 +U 8246 ; WX 602 ; N uni2036 ; G 1746 +U 8247 ; WX 602 ; N uni2037 ; G 1747 +U 8249 ; WX 602 ; N guilsinglleft ; G 1748 +U 8250 ; WX 602 ; N guilsinglright ; G 1749 +U 8252 ; WX 602 ; N exclamdbl ; G 1750 +U 8253 ; WX 602 ; N uni203D ; G 1751 +U 8254 ; WX 602 ; N uni203E ; G 1752 +U 8255 ; WX 602 ; N uni203F ; G 1753 +U 8261 ; WX 602 ; N uni2045 ; G 1754 +U 8262 ; WX 602 ; N uni2046 ; G 1755 +U 8263 ; WX 602 ; N uni2047 ; G 1756 +U 8264 ; WX 602 ; N uni2048 ; G 1757 +U 8265 ; WX 602 ; N uni2049 ; G 1758 +U 8267 ; WX 602 ; N uni204B ; G 1759 +U 8287 ; WX 602 ; N uni205F ; G 1760 +U 8304 ; WX 602 ; N uni2070 ; G 1761 +U 8305 ; WX 602 ; N uni2071 ; G 1762 +U 8308 ; WX 602 ; N uni2074 ; G 1763 +U 8309 ; WX 602 ; N uni2075 ; G 1764 +U 8310 ; WX 602 ; N uni2076 ; G 1765 +U 8311 ; WX 602 ; N uni2077 ; G 1766 +U 8312 ; WX 602 ; N uni2078 ; G 1767 +U 8313 ; WX 602 ; N uni2079 ; G 1768 +U 8314 ; WX 602 ; N uni207A ; G 1769 +U 8315 ; WX 602 ; N uni207B ; G 1770 +U 8316 ; WX 602 ; N uni207C ; G 1771 +U 8317 ; WX 602 ; N uni207D ; G 1772 +U 8318 ; WX 602 ; N uni207E ; G 1773 +U 8319 ; WX 602 ; N uni207F ; G 1774 +U 8320 ; WX 602 ; N uni2080 ; G 1775 +U 8321 ; WX 602 ; N uni2081 ; G 1776 +U 8322 ; WX 602 ; N uni2082 ; G 1777 +U 8323 ; WX 602 ; N uni2083 ; G 1778 +U 8324 ; WX 602 ; N uni2084 ; G 1779 +U 8325 ; WX 602 ; N uni2085 ; G 1780 +U 8326 ; WX 602 ; N uni2086 ; G 1781 +U 8327 ; WX 602 ; N uni2087 ; G 1782 +U 8328 ; WX 602 ; N uni2088 ; G 1783 +U 8329 ; WX 602 ; N uni2089 ; G 1784 +U 8330 ; WX 602 ; N uni208A ; G 1785 +U 8331 ; WX 602 ; N uni208B ; G 1786 +U 8332 ; WX 602 ; N uni208C ; G 1787 +U 8333 ; WX 602 ; N uni208D ; G 1788 +U 8334 ; WX 602 ; N uni208E ; G 1789 +U 8336 ; WX 602 ; N uni2090 ; G 1790 +U 8337 ; WX 602 ; N uni2091 ; G 1791 +U 8338 ; WX 602 ; N uni2092 ; G 1792 +U 8339 ; WX 602 ; N uni2093 ; G 1793 +U 8340 ; WX 602 ; N uni2094 ; G 1794 +U 8341 ; WX 602 ; N uni2095 ; G 1795 +U 8342 ; WX 602 ; N uni2096 ; G 1796 +U 8343 ; WX 602 ; N uni2097 ; G 1797 +U 8344 ; WX 602 ; N uni2098 ; G 1798 +U 8345 ; WX 602 ; N uni2099 ; G 1799 +U 8346 ; WX 602 ; N uni209A ; G 1800 +U 8347 ; WX 602 ; N uni209B ; G 1801 +U 8348 ; WX 602 ; N uni209C ; G 1802 +U 8352 ; WX 602 ; N uni20A0 ; G 1803 +U 8353 ; WX 602 ; N colonmonetary ; G 1804 +U 8354 ; WX 602 ; N uni20A2 ; G 1805 +U 8355 ; WX 602 ; N franc ; G 1806 +U 8356 ; WX 602 ; N lira ; G 1807 +U 8357 ; WX 602 ; N uni20A5 ; G 1808 +U 8358 ; WX 602 ; N uni20A6 ; G 1809 +U 8359 ; WX 602 ; N peseta ; G 1810 +U 8360 ; WX 602 ; N uni20A8 ; G 1811 +U 8361 ; WX 602 ; N uni20A9 ; G 1812 +U 8362 ; WX 602 ; N uni20AA ; G 1813 +U 8363 ; WX 602 ; N dong ; G 1814 +U 8364 ; WX 602 ; N Euro ; G 1815 +U 8365 ; WX 602 ; N uni20AD ; G 1816 +U 8366 ; WX 602 ; N uni20AE ; G 1817 +U 8367 ; WX 602 ; N uni20AF ; G 1818 +U 8368 ; WX 602 ; N uni20B0 ; G 1819 +U 8369 ; WX 602 ; N uni20B1 ; G 1820 +U 8370 ; WX 602 ; N uni20B2 ; G 1821 +U 8371 ; WX 602 ; N uni20B3 ; G 1822 +U 8372 ; WX 602 ; N uni20B4 ; G 1823 +U 8373 ; WX 602 ; N uni20B5 ; G 1824 +U 8376 ; WX 602 ; N uni20B8 ; G 1825 +U 8377 ; WX 602 ; N uni20B9 ; G 1826 +U 8378 ; WX 602 ; N uni20BA ; G 1827 +U 8381 ; WX 602 ; N uni20BD ; G 1828 +U 8450 ; WX 602 ; N uni2102 ; G 1829 +U 8453 ; WX 602 ; N uni2105 ; G 1830 +U 8461 ; WX 602 ; N uni210D ; G 1831 +U 8462 ; WX 602 ; N uni210E ; G 1832 +U 8463 ; WX 602 ; N uni210F ; G 1833 +U 8469 ; WX 602 ; N uni2115 ; G 1834 +U 8470 ; WX 602 ; N uni2116 ; G 1835 +U 8471 ; WX 602 ; N uni2117 ; G 1836 +U 8473 ; WX 602 ; N uni2119 ; G 1837 +U 8474 ; WX 602 ; N uni211A ; G 1838 +U 8477 ; WX 602 ; N uni211D ; G 1839 +U 8482 ; WX 602 ; N trademark ; G 1840 +U 8484 ; WX 602 ; N uni2124 ; G 1841 +U 8486 ; WX 602 ; N uni2126 ; G 1842 +U 8490 ; WX 602 ; N uni212A ; G 1843 +U 8491 ; WX 602 ; N uni212B ; G 1844 +U 8494 ; WX 602 ; N estimated ; G 1845 +U 8520 ; WX 602 ; N uni2148 ; G 1846 +U 8528 ; WX 602 ; N uni2150 ; G 1847 +U 8529 ; WX 602 ; N uni2151 ; G 1848 +U 8531 ; WX 602 ; N onethird ; G 1849 +U 8532 ; WX 602 ; N twothirds ; G 1850 +U 8533 ; WX 602 ; N uni2155 ; G 1851 +U 8534 ; WX 602 ; N uni2156 ; G 1852 +U 8535 ; WX 602 ; N uni2157 ; G 1853 +U 8536 ; WX 602 ; N uni2158 ; G 1854 +U 8537 ; WX 602 ; N uni2159 ; G 1855 +U 8538 ; WX 602 ; N uni215A ; G 1856 +U 8539 ; WX 602 ; N oneeighth ; G 1857 +U 8540 ; WX 602 ; N threeeighths ; G 1858 +U 8541 ; WX 602 ; N fiveeighths ; G 1859 +U 8542 ; WX 602 ; N seveneighths ; G 1860 +U 8543 ; WX 602 ; N uni215F ; G 1861 +U 8585 ; WX 602 ; N uni2189 ; G 1862 +U 8592 ; WX 602 ; N arrowleft ; G 1863 +U 8593 ; WX 602 ; N arrowup ; G 1864 +U 8594 ; WX 602 ; N arrowright ; G 1865 +U 8595 ; WX 602 ; N arrowdown ; G 1866 +U 8596 ; WX 602 ; N arrowboth ; G 1867 +U 8597 ; WX 602 ; N arrowupdn ; G 1868 +U 8598 ; WX 602 ; N uni2196 ; G 1869 +U 8599 ; WX 602 ; N uni2197 ; G 1870 +U 8600 ; WX 602 ; N uni2198 ; G 1871 +U 8601 ; WX 602 ; N uni2199 ; G 1872 +U 8602 ; WX 602 ; N uni219A ; G 1873 +U 8603 ; WX 602 ; N uni219B ; G 1874 +U 8604 ; WX 602 ; N uni219C ; G 1875 +U 8605 ; WX 602 ; N uni219D ; G 1876 +U 8606 ; WX 602 ; N uni219E ; G 1877 +U 8607 ; WX 602 ; N uni219F ; G 1878 +U 8608 ; WX 602 ; N uni21A0 ; G 1879 +U 8609 ; WX 602 ; N uni21A1 ; G 1880 +U 8610 ; WX 602 ; N uni21A2 ; G 1881 +U 8611 ; WX 602 ; N uni21A3 ; G 1882 +U 8612 ; WX 602 ; N uni21A4 ; G 1883 +U 8613 ; WX 602 ; N uni21A5 ; G 1884 +U 8614 ; WX 602 ; N uni21A6 ; G 1885 +U 8615 ; WX 602 ; N uni21A7 ; G 1886 +U 8616 ; WX 602 ; N arrowupdnbse ; G 1887 +U 8617 ; WX 602 ; N uni21A9 ; G 1888 +U 8618 ; WX 602 ; N uni21AA ; G 1889 +U 8619 ; WX 602 ; N uni21AB ; G 1890 +U 8620 ; WX 602 ; N uni21AC ; G 1891 +U 8621 ; WX 602 ; N uni21AD ; G 1892 +U 8622 ; WX 602 ; N uni21AE ; G 1893 +U 8623 ; WX 602 ; N uni21AF ; G 1894 +U 8624 ; WX 602 ; N uni21B0 ; G 1895 +U 8625 ; WX 602 ; N uni21B1 ; G 1896 +U 8626 ; WX 602 ; N uni21B2 ; G 1897 +U 8627 ; WX 602 ; N uni21B3 ; G 1898 +U 8628 ; WX 602 ; N uni21B4 ; G 1899 +U 8629 ; WX 602 ; N carriagereturn ; G 1900 +U 8630 ; WX 602 ; N uni21B6 ; G 1901 +U 8631 ; WX 602 ; N uni21B7 ; G 1902 +U 8632 ; WX 602 ; N uni21B8 ; G 1903 +U 8633 ; WX 602 ; N uni21B9 ; G 1904 +U 8634 ; WX 602 ; N uni21BA ; G 1905 +U 8635 ; WX 602 ; N uni21BB ; G 1906 +U 8636 ; WX 602 ; N uni21BC ; G 1907 +U 8637 ; WX 602 ; N uni21BD ; G 1908 +U 8638 ; WX 602 ; N uni21BE ; G 1909 +U 8639 ; WX 602 ; N uni21BF ; G 1910 +U 8640 ; WX 602 ; N uni21C0 ; G 1911 +U 8641 ; WX 602 ; N uni21C1 ; G 1912 +U 8642 ; WX 602 ; N uni21C2 ; G 1913 +U 8643 ; WX 602 ; N uni21C3 ; G 1914 +U 8644 ; WX 602 ; N uni21C4 ; G 1915 +U 8645 ; WX 602 ; N uni21C5 ; G 1916 +U 8646 ; WX 602 ; N uni21C6 ; G 1917 +U 8647 ; WX 602 ; N uni21C7 ; G 1918 +U 8648 ; WX 602 ; N uni21C8 ; G 1919 +U 8649 ; WX 602 ; N uni21C9 ; G 1920 +U 8650 ; WX 602 ; N uni21CA ; G 1921 +U 8651 ; WX 602 ; N uni21CB ; G 1922 +U 8652 ; WX 602 ; N uni21CC ; G 1923 +U 8653 ; WX 602 ; N uni21CD ; G 1924 +U 8654 ; WX 602 ; N uni21CE ; G 1925 +U 8655 ; WX 602 ; N uni21CF ; G 1926 +U 8656 ; WX 602 ; N arrowdblleft ; G 1927 +U 8657 ; WX 602 ; N arrowdblup ; G 1928 +U 8658 ; WX 602 ; N arrowdblright ; G 1929 +U 8659 ; WX 602 ; N arrowdbldown ; G 1930 +U 8660 ; WX 602 ; N arrowdblboth ; G 1931 +U 8661 ; WX 602 ; N uni21D5 ; G 1932 +U 8662 ; WX 602 ; N uni21D6 ; G 1933 +U 8663 ; WX 602 ; N uni21D7 ; G 1934 +U 8664 ; WX 602 ; N uni21D8 ; G 1935 +U 8665 ; WX 602 ; N uni21D9 ; G 1936 +U 8666 ; WX 602 ; N uni21DA ; G 1937 +U 8667 ; WX 602 ; N uni21DB ; G 1938 +U 8668 ; WX 602 ; N uni21DC ; G 1939 +U 8669 ; WX 602 ; N uni21DD ; G 1940 +U 8670 ; WX 602 ; N uni21DE ; G 1941 +U 8671 ; WX 602 ; N uni21DF ; G 1942 +U 8672 ; WX 602 ; N uni21E0 ; G 1943 +U 8673 ; WX 602 ; N uni21E1 ; G 1944 +U 8674 ; WX 602 ; N uni21E2 ; G 1945 +U 8675 ; WX 602 ; N uni21E3 ; G 1946 +U 8676 ; WX 602 ; N uni21E4 ; G 1947 +U 8677 ; WX 602 ; N uni21E5 ; G 1948 +U 8678 ; WX 602 ; N uni21E6 ; G 1949 +U 8679 ; WX 602 ; N uni21E7 ; G 1950 +U 8680 ; WX 602 ; N uni21E8 ; G 1951 +U 8681 ; WX 602 ; N uni21E9 ; G 1952 +U 8682 ; WX 602 ; N uni21EA ; G 1953 +U 8683 ; WX 602 ; N uni21EB ; G 1954 +U 8684 ; WX 602 ; N uni21EC ; G 1955 +U 8685 ; WX 602 ; N uni21ED ; G 1956 +U 8686 ; WX 602 ; N uni21EE ; G 1957 +U 8687 ; WX 602 ; N uni21EF ; G 1958 +U 8688 ; WX 602 ; N uni21F0 ; G 1959 +U 8689 ; WX 602 ; N uni21F1 ; G 1960 +U 8690 ; WX 602 ; N uni21F2 ; G 1961 +U 8691 ; WX 602 ; N uni21F3 ; G 1962 +U 8692 ; WX 602 ; N uni21F4 ; G 1963 +U 8693 ; WX 602 ; N uni21F5 ; G 1964 +U 8694 ; WX 602 ; N uni21F6 ; G 1965 +U 8695 ; WX 602 ; N uni21F7 ; G 1966 +U 8696 ; WX 602 ; N uni21F8 ; G 1967 +U 8697 ; WX 602 ; N uni21F9 ; G 1968 +U 8698 ; WX 602 ; N uni21FA ; G 1969 +U 8699 ; WX 602 ; N uni21FB ; G 1970 +U 8700 ; WX 602 ; N uni21FC ; G 1971 +U 8701 ; WX 602 ; N uni21FD ; G 1972 +U 8702 ; WX 602 ; N uni21FE ; G 1973 +U 8703 ; WX 602 ; N uni21FF ; G 1974 +U 8704 ; WX 602 ; N universal ; G 1975 +U 8705 ; WX 602 ; N uni2201 ; G 1976 +U 8706 ; WX 602 ; N partialdiff ; G 1977 +U 8707 ; WX 602 ; N existential ; G 1978 +U 8708 ; WX 602 ; N uni2204 ; G 1979 +U 8709 ; WX 602 ; N emptyset ; G 1980 +U 8710 ; WX 602 ; N increment ; G 1981 +U 8711 ; WX 602 ; N gradient ; G 1982 +U 8712 ; WX 602 ; N element ; G 1983 +U 8713 ; WX 602 ; N notelement ; G 1984 +U 8714 ; WX 602 ; N uni220A ; G 1985 +U 8715 ; WX 602 ; N suchthat ; G 1986 +U 8716 ; WX 602 ; N uni220C ; G 1987 +U 8717 ; WX 602 ; N uni220D ; G 1988 +U 8718 ; WX 602 ; N uni220E ; G 1989 +U 8719 ; WX 602 ; N product ; G 1990 +U 8720 ; WX 602 ; N uni2210 ; G 1991 +U 8721 ; WX 602 ; N summation ; G 1992 +U 8722 ; WX 602 ; N minus ; G 1993 +U 8723 ; WX 602 ; N uni2213 ; G 1994 +U 8725 ; WX 602 ; N uni2215 ; G 1995 +U 8727 ; WX 602 ; N asteriskmath ; G 1996 +U 8728 ; WX 602 ; N uni2218 ; G 1997 +U 8729 ; WX 602 ; N uni2219 ; G 1998 +U 8730 ; WX 602 ; N radical ; G 1999 +U 8731 ; WX 602 ; N uni221B ; G 2000 +U 8732 ; WX 602 ; N uni221C ; G 2001 +U 8733 ; WX 602 ; N proportional ; G 2002 +U 8734 ; WX 602 ; N infinity ; G 2003 +U 8735 ; WX 602 ; N orthogonal ; G 2004 +U 8736 ; WX 602 ; N angle ; G 2005 +U 8739 ; WX 602 ; N uni2223 ; G 2006 +U 8743 ; WX 602 ; N logicaland ; G 2007 +U 8744 ; WX 602 ; N logicalor ; G 2008 +U 8745 ; WX 602 ; N intersection ; G 2009 +U 8746 ; WX 602 ; N union ; G 2010 +U 8747 ; WX 602 ; N integral ; G 2011 +U 8748 ; WX 602 ; N uni222C ; G 2012 +U 8749 ; WX 602 ; N uni222D ; G 2013 +U 8756 ; WX 602 ; N therefore ; G 2014 +U 8757 ; WX 602 ; N uni2235 ; G 2015 +U 8758 ; WX 602 ; N uni2236 ; G 2016 +U 8759 ; WX 602 ; N uni2237 ; G 2017 +U 8760 ; WX 602 ; N uni2238 ; G 2018 +U 8761 ; WX 602 ; N uni2239 ; G 2019 +U 8762 ; WX 602 ; N uni223A ; G 2020 +U 8763 ; WX 602 ; N uni223B ; G 2021 +U 8764 ; WX 602 ; N similar ; G 2022 +U 8765 ; WX 602 ; N uni223D ; G 2023 +U 8769 ; WX 602 ; N uni2241 ; G 2024 +U 8770 ; WX 602 ; N uni2242 ; G 2025 +U 8771 ; WX 602 ; N uni2243 ; G 2026 +U 8772 ; WX 602 ; N uni2244 ; G 2027 +U 8773 ; WX 602 ; N congruent ; G 2028 +U 8774 ; WX 602 ; N uni2246 ; G 2029 +U 8775 ; WX 602 ; N uni2247 ; G 2030 +U 8776 ; WX 602 ; N approxequal ; G 2031 +U 8777 ; WX 602 ; N uni2249 ; G 2032 +U 8778 ; WX 602 ; N uni224A ; G 2033 +U 8779 ; WX 602 ; N uni224B ; G 2034 +U 8780 ; WX 602 ; N uni224C ; G 2035 +U 8781 ; WX 602 ; N uni224D ; G 2036 +U 8782 ; WX 602 ; N uni224E ; G 2037 +U 8783 ; WX 602 ; N uni224F ; G 2038 +U 8784 ; WX 602 ; N uni2250 ; G 2039 +U 8785 ; WX 602 ; N uni2251 ; G 2040 +U 8786 ; WX 602 ; N uni2252 ; G 2041 +U 8787 ; WX 602 ; N uni2253 ; G 2042 +U 8788 ; WX 602 ; N uni2254 ; G 2043 +U 8789 ; WX 602 ; N uni2255 ; G 2044 +U 8790 ; WX 602 ; N uni2256 ; G 2045 +U 8791 ; WX 602 ; N uni2257 ; G 2046 +U 8792 ; WX 602 ; N uni2258 ; G 2047 +U 8793 ; WX 602 ; N uni2259 ; G 2048 +U 8794 ; WX 602 ; N uni225A ; G 2049 +U 8795 ; WX 602 ; N uni225B ; G 2050 +U 8796 ; WX 602 ; N uni225C ; G 2051 +U 8797 ; WX 602 ; N uni225D ; G 2052 +U 8798 ; WX 602 ; N uni225E ; G 2053 +U 8799 ; WX 602 ; N uni225F ; G 2054 +U 8800 ; WX 602 ; N notequal ; G 2055 +U 8801 ; WX 602 ; N equivalence ; G 2056 +U 8802 ; WX 602 ; N uni2262 ; G 2057 +U 8803 ; WX 602 ; N uni2263 ; G 2058 +U 8804 ; WX 602 ; N lessequal ; G 2059 +U 8805 ; WX 602 ; N greaterequal ; G 2060 +U 8806 ; WX 602 ; N uni2266 ; G 2061 +U 8807 ; WX 602 ; N uni2267 ; G 2062 +U 8808 ; WX 602 ; N uni2268 ; G 2063 +U 8809 ; WX 602 ; N uni2269 ; G 2064 +U 8813 ; WX 602 ; N uni226D ; G 2065 +U 8814 ; WX 602 ; N uni226E ; G 2066 +U 8815 ; WX 602 ; N uni226F ; G 2067 +U 8816 ; WX 602 ; N uni2270 ; G 2068 +U 8817 ; WX 602 ; N uni2271 ; G 2069 +U 8818 ; WX 602 ; N uni2272 ; G 2070 +U 8819 ; WX 602 ; N uni2273 ; G 2071 +U 8820 ; WX 602 ; N uni2274 ; G 2072 +U 8821 ; WX 602 ; N uni2275 ; G 2073 +U 8822 ; WX 602 ; N uni2276 ; G 2074 +U 8823 ; WX 602 ; N uni2277 ; G 2075 +U 8824 ; WX 602 ; N uni2278 ; G 2076 +U 8825 ; WX 602 ; N uni2279 ; G 2077 +U 8826 ; WX 602 ; N uni227A ; G 2078 +U 8827 ; WX 602 ; N uni227B ; G 2079 +U 8828 ; WX 602 ; N uni227C ; G 2080 +U 8829 ; WX 602 ; N uni227D ; G 2081 +U 8830 ; WX 602 ; N uni227E ; G 2082 +U 8831 ; WX 602 ; N uni227F ; G 2083 +U 8832 ; WX 602 ; N uni2280 ; G 2084 +U 8833 ; WX 602 ; N uni2281 ; G 2085 +U 8834 ; WX 602 ; N propersubset ; G 2086 +U 8835 ; WX 602 ; N propersuperset ; G 2087 +U 8836 ; WX 602 ; N notsubset ; G 2088 +U 8837 ; WX 602 ; N uni2285 ; G 2089 +U 8838 ; WX 602 ; N reflexsubset ; G 2090 +U 8839 ; WX 602 ; N reflexsuperset ; G 2091 +U 8840 ; WX 602 ; N uni2288 ; G 2092 +U 8841 ; WX 602 ; N uni2289 ; G 2093 +U 8842 ; WX 602 ; N uni228A ; G 2094 +U 8843 ; WX 602 ; N uni228B ; G 2095 +U 8845 ; WX 602 ; N uni228D ; G 2096 +U 8846 ; WX 602 ; N uni228E ; G 2097 +U 8847 ; WX 602 ; N uni228F ; G 2098 +U 8848 ; WX 602 ; N uni2290 ; G 2099 +U 8849 ; WX 602 ; N uni2291 ; G 2100 +U 8850 ; WX 602 ; N uni2292 ; G 2101 +U 8851 ; WX 602 ; N uni2293 ; G 2102 +U 8852 ; WX 602 ; N uni2294 ; G 2103 +U 8853 ; WX 602 ; N circleplus ; G 2104 +U 8854 ; WX 602 ; N uni2296 ; G 2105 +U 8855 ; WX 602 ; N circlemultiply ; G 2106 +U 8856 ; WX 602 ; N uni2298 ; G 2107 +U 8857 ; WX 602 ; N uni2299 ; G 2108 +U 8858 ; WX 602 ; N uni229A ; G 2109 +U 8859 ; WX 602 ; N uni229B ; G 2110 +U 8860 ; WX 602 ; N uni229C ; G 2111 +U 8861 ; WX 602 ; N uni229D ; G 2112 +U 8862 ; WX 602 ; N uni229E ; G 2113 +U 8863 ; WX 602 ; N uni229F ; G 2114 +U 8864 ; WX 602 ; N uni22A0 ; G 2115 +U 8865 ; WX 602 ; N uni22A1 ; G 2116 +U 8866 ; WX 602 ; N uni22A2 ; G 2117 +U 8867 ; WX 602 ; N uni22A3 ; G 2118 +U 8868 ; WX 602 ; N uni22A4 ; G 2119 +U 8869 ; WX 602 ; N perpendicular ; G 2120 +U 8882 ; WX 602 ; N uni22B2 ; G 2121 +U 8883 ; WX 602 ; N uni22B3 ; G 2122 +U 8884 ; WX 602 ; N uni22B4 ; G 2123 +U 8885 ; WX 602 ; N uni22B5 ; G 2124 +U 8888 ; WX 602 ; N uni22B8 ; G 2125 +U 8898 ; WX 602 ; N uni22C2 ; G 2126 +U 8899 ; WX 602 ; N uni22C3 ; G 2127 +U 8900 ; WX 602 ; N uni22C4 ; G 2128 +U 8901 ; WX 602 ; N dotmath ; G 2129 +U 8902 ; WX 602 ; N uni22C6 ; G 2130 +U 8909 ; WX 602 ; N uni22CD ; G 2131 +U 8910 ; WX 602 ; N uni22CE ; G 2132 +U 8911 ; WX 602 ; N uni22CF ; G 2133 +U 8912 ; WX 602 ; N uni22D0 ; G 2134 +U 8913 ; WX 602 ; N uni22D1 ; G 2135 +U 8922 ; WX 602 ; N uni22DA ; G 2136 +U 8923 ; WX 602 ; N uni22DB ; G 2137 +U 8924 ; WX 602 ; N uni22DC ; G 2138 +U 8925 ; WX 602 ; N uni22DD ; G 2139 +U 8926 ; WX 602 ; N uni22DE ; G 2140 +U 8927 ; WX 602 ; N uni22DF ; G 2141 +U 8928 ; WX 602 ; N uni22E0 ; G 2142 +U 8929 ; WX 602 ; N uni22E1 ; G 2143 +U 8930 ; WX 602 ; N uni22E2 ; G 2144 +U 8931 ; WX 602 ; N uni22E3 ; G 2145 +U 8932 ; WX 602 ; N uni22E4 ; G 2146 +U 8933 ; WX 602 ; N uni22E5 ; G 2147 +U 8934 ; WX 602 ; N uni22E6 ; G 2148 +U 8935 ; WX 602 ; N uni22E7 ; G 2149 +U 8936 ; WX 602 ; N uni22E8 ; G 2150 +U 8937 ; WX 602 ; N uni22E9 ; G 2151 +U 8943 ; WX 602 ; N uni22EF ; G 2152 +U 8960 ; WX 602 ; N uni2300 ; G 2153 +U 8961 ; WX 602 ; N uni2301 ; G 2154 +U 8962 ; WX 602 ; N house ; G 2155 +U 8963 ; WX 602 ; N uni2303 ; G 2156 +U 8964 ; WX 602 ; N uni2304 ; G 2157 +U 8965 ; WX 602 ; N uni2305 ; G 2158 +U 8966 ; WX 602 ; N uni2306 ; G 2159 +U 8968 ; WX 602 ; N uni2308 ; G 2160 +U 8969 ; WX 602 ; N uni2309 ; G 2161 +U 8970 ; WX 602 ; N uni230A ; G 2162 +U 8971 ; WX 602 ; N uni230B ; G 2163 +U 8972 ; WX 602 ; N uni230C ; G 2164 +U 8973 ; WX 602 ; N uni230D ; G 2165 +U 8974 ; WX 602 ; N uni230E ; G 2166 +U 8975 ; WX 602 ; N uni230F ; G 2167 +U 8976 ; WX 602 ; N revlogicalnot ; G 2168 +U 8977 ; WX 602 ; N uni2311 ; G 2169 +U 8978 ; WX 602 ; N uni2312 ; G 2170 +U 8979 ; WX 602 ; N uni2313 ; G 2171 +U 8980 ; WX 602 ; N uni2314 ; G 2172 +U 8981 ; WX 602 ; N uni2315 ; G 2173 +U 8984 ; WX 602 ; N uni2318 ; G 2174 +U 8985 ; WX 602 ; N uni2319 ; G 2175 +U 8988 ; WX 602 ; N uni231C ; G 2176 +U 8989 ; WX 602 ; N uni231D ; G 2177 +U 8990 ; WX 602 ; N uni231E ; G 2178 +U 8991 ; WX 602 ; N uni231F ; G 2179 +U 8992 ; WX 602 ; N integraltp ; G 2180 +U 8993 ; WX 602 ; N integralbt ; G 2181 +U 8997 ; WX 602 ; N uni2325 ; G 2182 +U 8998 ; WX 602 ; N uni2326 ; G 2183 +U 8999 ; WX 602 ; N uni2327 ; G 2184 +U 9000 ; WX 602 ; N uni2328 ; G 2185 +U 9003 ; WX 602 ; N uni232B ; G 2186 +U 9013 ; WX 602 ; N uni2335 ; G 2187 +U 9014 ; WX 602 ; N uni2336 ; G 2188 +U 9015 ; WX 602 ; N uni2337 ; G 2189 +U 9016 ; WX 602 ; N uni2338 ; G 2190 +U 9017 ; WX 602 ; N uni2339 ; G 2191 +U 9018 ; WX 602 ; N uni233A ; G 2192 +U 9019 ; WX 602 ; N uni233B ; G 2193 +U 9020 ; WX 602 ; N uni233C ; G 2194 +U 9021 ; WX 602 ; N uni233D ; G 2195 +U 9022 ; WX 602 ; N uni233E ; G 2196 +U 9023 ; WX 602 ; N uni233F ; G 2197 +U 9024 ; WX 602 ; N uni2340 ; G 2198 +U 9025 ; WX 602 ; N uni2341 ; G 2199 +U 9026 ; WX 602 ; N uni2342 ; G 2200 +U 9027 ; WX 602 ; N uni2343 ; G 2201 +U 9028 ; WX 602 ; N uni2344 ; G 2202 +U 9029 ; WX 602 ; N uni2345 ; G 2203 +U 9030 ; WX 602 ; N uni2346 ; G 2204 +U 9031 ; WX 602 ; N uni2347 ; G 2205 +U 9032 ; WX 602 ; N uni2348 ; G 2206 +U 9033 ; WX 602 ; N uni2349 ; G 2207 +U 9034 ; WX 602 ; N uni234A ; G 2208 +U 9035 ; WX 602 ; N uni234B ; G 2209 +U 9036 ; WX 602 ; N uni234C ; G 2210 +U 9037 ; WX 602 ; N uni234D ; G 2211 +U 9038 ; WX 602 ; N uni234E ; G 2212 +U 9039 ; WX 602 ; N uni234F ; G 2213 +U 9040 ; WX 602 ; N uni2350 ; G 2214 +U 9041 ; WX 602 ; N uni2351 ; G 2215 +U 9042 ; WX 602 ; N uni2352 ; G 2216 +U 9043 ; WX 602 ; N uni2353 ; G 2217 +U 9044 ; WX 602 ; N uni2354 ; G 2218 +U 9045 ; WX 602 ; N uni2355 ; G 2219 +U 9046 ; WX 602 ; N uni2356 ; G 2220 +U 9047 ; WX 602 ; N uni2357 ; G 2221 +U 9048 ; WX 602 ; N uni2358 ; G 2222 +U 9049 ; WX 602 ; N uni2359 ; G 2223 +U 9050 ; WX 602 ; N uni235A ; G 2224 +U 9051 ; WX 602 ; N uni235B ; G 2225 +U 9052 ; WX 602 ; N uni235C ; G 2226 +U 9053 ; WX 602 ; N uni235D ; G 2227 +U 9054 ; WX 602 ; N uni235E ; G 2228 +U 9055 ; WX 602 ; N uni235F ; G 2229 +U 9056 ; WX 602 ; N uni2360 ; G 2230 +U 9057 ; WX 602 ; N uni2361 ; G 2231 +U 9058 ; WX 602 ; N uni2362 ; G 2232 +U 9059 ; WX 602 ; N uni2363 ; G 2233 +U 9060 ; WX 602 ; N uni2364 ; G 2234 +U 9061 ; WX 602 ; N uni2365 ; G 2235 +U 9062 ; WX 602 ; N uni2366 ; G 2236 +U 9063 ; WX 602 ; N uni2367 ; G 2237 +U 9064 ; WX 602 ; N uni2368 ; G 2238 +U 9065 ; WX 602 ; N uni2369 ; G 2239 +U 9066 ; WX 602 ; N uni236A ; G 2240 +U 9067 ; WX 602 ; N uni236B ; G 2241 +U 9068 ; WX 602 ; N uni236C ; G 2242 +U 9069 ; WX 602 ; N uni236D ; G 2243 +U 9070 ; WX 602 ; N uni236E ; G 2244 +U 9071 ; WX 602 ; N uni236F ; G 2245 +U 9072 ; WX 602 ; N uni2370 ; G 2246 +U 9073 ; WX 602 ; N uni2371 ; G 2247 +U 9074 ; WX 602 ; N uni2372 ; G 2248 +U 9075 ; WX 602 ; N uni2373 ; G 2249 +U 9076 ; WX 602 ; N uni2374 ; G 2250 +U 9077 ; WX 602 ; N uni2375 ; G 2251 +U 9078 ; WX 602 ; N uni2376 ; G 2252 +U 9079 ; WX 602 ; N uni2377 ; G 2253 +U 9080 ; WX 602 ; N uni2378 ; G 2254 +U 9081 ; WX 602 ; N uni2379 ; G 2255 +U 9082 ; WX 602 ; N uni237A ; G 2256 +U 9085 ; WX 602 ; N uni237D ; G 2257 +U 9088 ; WX 602 ; N uni2380 ; G 2258 +U 9089 ; WX 602 ; N uni2381 ; G 2259 +U 9090 ; WX 602 ; N uni2382 ; G 2260 +U 9091 ; WX 602 ; N uni2383 ; G 2261 +U 9096 ; WX 602 ; N uni2388 ; G 2262 +U 9097 ; WX 602 ; N uni2389 ; G 2263 +U 9098 ; WX 602 ; N uni238A ; G 2264 +U 9099 ; WX 602 ; N uni238B ; G 2265 +U 9109 ; WX 602 ; N uni2395 ; G 2266 +U 9115 ; WX 602 ; N uni239B ; G 2267 +U 9116 ; WX 602 ; N uni239C ; G 2268 +U 9117 ; WX 602 ; N uni239D ; G 2269 +U 9118 ; WX 602 ; N uni239E ; G 2270 +U 9119 ; WX 602 ; N uni239F ; G 2271 +U 9120 ; WX 602 ; N uni23A0 ; G 2272 +U 9121 ; WX 602 ; N uni23A1 ; G 2273 +U 9122 ; WX 602 ; N uni23A2 ; G 2274 +U 9123 ; WX 602 ; N uni23A3 ; G 2275 +U 9124 ; WX 602 ; N uni23A4 ; G 2276 +U 9125 ; WX 602 ; N uni23A5 ; G 2277 +U 9126 ; WX 602 ; N uni23A6 ; G 2278 +U 9127 ; WX 602 ; N uni23A7 ; G 2279 +U 9128 ; WX 602 ; N uni23A8 ; G 2280 +U 9129 ; WX 602 ; N uni23A9 ; G 2281 +U 9130 ; WX 602 ; N uni23AA ; G 2282 +U 9131 ; WX 602 ; N uni23AB ; G 2283 +U 9132 ; WX 602 ; N uni23AC ; G 2284 +U 9133 ; WX 602 ; N uni23AD ; G 2285 +U 9134 ; WX 602 ; N uni23AE ; G 2286 +U 9166 ; WX 602 ; N uni23CE ; G 2287 +U 9167 ; WX 602 ; N uni23CF ; G 2288 +U 9251 ; WX 602 ; N uni2423 ; G 2289 +U 9472 ; WX 602 ; N SF100000 ; G 2290 +U 9473 ; WX 602 ; N uni2501 ; G 2291 +U 9474 ; WX 602 ; N SF110000 ; G 2292 +U 9475 ; WX 602 ; N uni2503 ; G 2293 +U 9476 ; WX 602 ; N uni2504 ; G 2294 +U 9477 ; WX 602 ; N uni2505 ; G 2295 +U 9478 ; WX 602 ; N uni2506 ; G 2296 +U 9479 ; WX 602 ; N uni2507 ; G 2297 +U 9480 ; WX 602 ; N uni2508 ; G 2298 +U 9481 ; WX 602 ; N uni2509 ; G 2299 +U 9482 ; WX 602 ; N uni250A ; G 2300 +U 9483 ; WX 602 ; N uni250B ; G 2301 +U 9484 ; WX 602 ; N SF010000 ; G 2302 +U 9485 ; WX 602 ; N uni250D ; G 2303 +U 9486 ; WX 602 ; N uni250E ; G 2304 +U 9487 ; WX 602 ; N uni250F ; G 2305 +U 9488 ; WX 602 ; N SF030000 ; G 2306 +U 9489 ; WX 602 ; N uni2511 ; G 2307 +U 9490 ; WX 602 ; N uni2512 ; G 2308 +U 9491 ; WX 602 ; N uni2513 ; G 2309 +U 9492 ; WX 602 ; N SF020000 ; G 2310 +U 9493 ; WX 602 ; N uni2515 ; G 2311 +U 9494 ; WX 602 ; N uni2516 ; G 2312 +U 9495 ; WX 602 ; N uni2517 ; G 2313 +U 9496 ; WX 602 ; N SF040000 ; G 2314 +U 9497 ; WX 602 ; N uni2519 ; G 2315 +U 9498 ; WX 602 ; N uni251A ; G 2316 +U 9499 ; WX 602 ; N uni251B ; G 2317 +U 9500 ; WX 602 ; N SF080000 ; G 2318 +U 9501 ; WX 602 ; N uni251D ; G 2319 +U 9502 ; WX 602 ; N uni251E ; G 2320 +U 9503 ; WX 602 ; N uni251F ; G 2321 +U 9504 ; WX 602 ; N uni2520 ; G 2322 +U 9505 ; WX 602 ; N uni2521 ; G 2323 +U 9506 ; WX 602 ; N uni2522 ; G 2324 +U 9507 ; WX 602 ; N uni2523 ; G 2325 +U 9508 ; WX 602 ; N SF090000 ; G 2326 +U 9509 ; WX 602 ; N uni2525 ; G 2327 +U 9510 ; WX 602 ; N uni2526 ; G 2328 +U 9511 ; WX 602 ; N uni2527 ; G 2329 +U 9512 ; WX 602 ; N uni2528 ; G 2330 +U 9513 ; WX 602 ; N uni2529 ; G 2331 +U 9514 ; WX 602 ; N uni252A ; G 2332 +U 9515 ; WX 602 ; N uni252B ; G 2333 +U 9516 ; WX 602 ; N SF060000 ; G 2334 +U 9517 ; WX 602 ; N uni252D ; G 2335 +U 9518 ; WX 602 ; N uni252E ; G 2336 +U 9519 ; WX 602 ; N uni252F ; G 2337 +U 9520 ; WX 602 ; N uni2530 ; G 2338 +U 9521 ; WX 602 ; N uni2531 ; G 2339 +U 9522 ; WX 602 ; N uni2532 ; G 2340 +U 9523 ; WX 602 ; N uni2533 ; G 2341 +U 9524 ; WX 602 ; N SF070000 ; G 2342 +U 9525 ; WX 602 ; N uni2535 ; G 2343 +U 9526 ; WX 602 ; N uni2536 ; G 2344 +U 9527 ; WX 602 ; N uni2537 ; G 2345 +U 9528 ; WX 602 ; N uni2538 ; G 2346 +U 9529 ; WX 602 ; N uni2539 ; G 2347 +U 9530 ; WX 602 ; N uni253A ; G 2348 +U 9531 ; WX 602 ; N uni253B ; G 2349 +U 9532 ; WX 602 ; N SF050000 ; G 2350 +U 9533 ; WX 602 ; N uni253D ; G 2351 +U 9534 ; WX 602 ; N uni253E ; G 2352 +U 9535 ; WX 602 ; N uni253F ; G 2353 +U 9536 ; WX 602 ; N uni2540 ; G 2354 +U 9537 ; WX 602 ; N uni2541 ; G 2355 +U 9538 ; WX 602 ; N uni2542 ; G 2356 +U 9539 ; WX 602 ; N uni2543 ; G 2357 +U 9540 ; WX 602 ; N uni2544 ; G 2358 +U 9541 ; WX 602 ; N uni2545 ; G 2359 +U 9542 ; WX 602 ; N uni2546 ; G 2360 +U 9543 ; WX 602 ; N uni2547 ; G 2361 +U 9544 ; WX 602 ; N uni2548 ; G 2362 +U 9545 ; WX 602 ; N uni2549 ; G 2363 +U 9546 ; WX 602 ; N uni254A ; G 2364 +U 9547 ; WX 602 ; N uni254B ; G 2365 +U 9548 ; WX 602 ; N uni254C ; G 2366 +U 9549 ; WX 602 ; N uni254D ; G 2367 +U 9550 ; WX 602 ; N uni254E ; G 2368 +U 9551 ; WX 602 ; N uni254F ; G 2369 +U 9552 ; WX 602 ; N SF430000 ; G 2370 +U 9553 ; WX 602 ; N SF240000 ; G 2371 +U 9554 ; WX 602 ; N SF510000 ; G 2372 +U 9555 ; WX 602 ; N SF520000 ; G 2373 +U 9556 ; WX 602 ; N SF390000 ; G 2374 +U 9557 ; WX 602 ; N SF220000 ; G 2375 +U 9558 ; WX 602 ; N SF210000 ; G 2376 +U 9559 ; WX 602 ; N SF250000 ; G 2377 +U 9560 ; WX 602 ; N SF500000 ; G 2378 +U 9561 ; WX 602 ; N SF490000 ; G 2379 +U 9562 ; WX 602 ; N SF380000 ; G 2380 +U 9563 ; WX 602 ; N SF280000 ; G 2381 +U 9564 ; WX 602 ; N SF270000 ; G 2382 +U 9565 ; WX 602 ; N SF260000 ; G 2383 +U 9566 ; WX 602 ; N SF360000 ; G 2384 +U 9567 ; WX 602 ; N SF370000 ; G 2385 +U 9568 ; WX 602 ; N SF420000 ; G 2386 +U 9569 ; WX 602 ; N SF190000 ; G 2387 +U 9570 ; WX 602 ; N SF200000 ; G 2388 +U 9571 ; WX 602 ; N SF230000 ; G 2389 +U 9572 ; WX 602 ; N SF470000 ; G 2390 +U 9573 ; WX 602 ; N SF480000 ; G 2391 +U 9574 ; WX 602 ; N SF410000 ; G 2392 +U 9575 ; WX 602 ; N SF450000 ; G 2393 +U 9576 ; WX 602 ; N SF460000 ; G 2394 +U 9577 ; WX 602 ; N SF400000 ; G 2395 +U 9578 ; WX 602 ; N SF540000 ; G 2396 +U 9579 ; WX 602 ; N SF530000 ; G 2397 +U 9580 ; WX 602 ; N SF440000 ; G 2398 +U 9581 ; WX 602 ; N uni256D ; G 2399 +U 9582 ; WX 602 ; N uni256E ; G 2400 +U 9583 ; WX 602 ; N uni256F ; G 2401 +U 9584 ; WX 602 ; N uni2570 ; G 2402 +U 9585 ; WX 602 ; N uni2571 ; G 2403 +U 9586 ; WX 602 ; N uni2572 ; G 2404 +U 9587 ; WX 602 ; N uni2573 ; G 2405 +U 9588 ; WX 602 ; N uni2574 ; G 2406 +U 9589 ; WX 602 ; N uni2575 ; G 2407 +U 9590 ; WX 602 ; N uni2576 ; G 2408 +U 9591 ; WX 602 ; N uni2577 ; G 2409 +U 9592 ; WX 602 ; N uni2578 ; G 2410 +U 9593 ; WX 602 ; N uni2579 ; G 2411 +U 9594 ; WX 602 ; N uni257A ; G 2412 +U 9595 ; WX 602 ; N uni257B ; G 2413 +U 9596 ; WX 602 ; N uni257C ; G 2414 +U 9597 ; WX 602 ; N uni257D ; G 2415 +U 9598 ; WX 602 ; N uni257E ; G 2416 +U 9599 ; WX 602 ; N uni257F ; G 2417 +U 9600 ; WX 602 ; N upblock ; G 2418 +U 9601 ; WX 602 ; N uni2581 ; G 2419 +U 9602 ; WX 602 ; N uni2582 ; G 2420 +U 9603 ; WX 602 ; N uni2583 ; G 2421 +U 9604 ; WX 602 ; N dnblock ; G 2422 +U 9605 ; WX 602 ; N uni2585 ; G 2423 +U 9606 ; WX 602 ; N uni2586 ; G 2424 +U 9607 ; WX 602 ; N uni2587 ; G 2425 +U 9608 ; WX 602 ; N block ; G 2426 +U 9609 ; WX 602 ; N uni2589 ; G 2427 +U 9610 ; WX 602 ; N uni258A ; G 2428 +U 9611 ; WX 602 ; N uni258B ; G 2429 +U 9612 ; WX 602 ; N lfblock ; G 2430 +U 9613 ; WX 602 ; N uni258D ; G 2431 +U 9614 ; WX 602 ; N uni258E ; G 2432 +U 9615 ; WX 602 ; N uni258F ; G 2433 +U 9616 ; WX 602 ; N rtblock ; G 2434 +U 9617 ; WX 602 ; N ltshade ; G 2435 +U 9618 ; WX 602 ; N shade ; G 2436 +U 9619 ; WX 602 ; N dkshade ; G 2437 +U 9620 ; WX 602 ; N uni2594 ; G 2438 +U 9621 ; WX 602 ; N uni2595 ; G 2439 +U 9622 ; WX 602 ; N uni2596 ; G 2440 +U 9623 ; WX 602 ; N uni2597 ; G 2441 +U 9624 ; WX 602 ; N uni2598 ; G 2442 +U 9625 ; WX 602 ; N uni2599 ; G 2443 +U 9626 ; WX 602 ; N uni259A ; G 2444 +U 9627 ; WX 602 ; N uni259B ; G 2445 +U 9628 ; WX 602 ; N uni259C ; G 2446 +U 9629 ; WX 602 ; N uni259D ; G 2447 +U 9630 ; WX 602 ; N uni259E ; G 2448 +U 9631 ; WX 602 ; N uni259F ; G 2449 +U 9632 ; WX 602 ; N filledbox ; G 2450 +U 9633 ; WX 602 ; N H22073 ; G 2451 +U 9634 ; WX 602 ; N uni25A2 ; G 2452 +U 9635 ; WX 602 ; N uni25A3 ; G 2453 +U 9636 ; WX 602 ; N uni25A4 ; G 2454 +U 9637 ; WX 602 ; N uni25A5 ; G 2455 +U 9638 ; WX 602 ; N uni25A6 ; G 2456 +U 9639 ; WX 602 ; N uni25A7 ; G 2457 +U 9640 ; WX 602 ; N uni25A8 ; G 2458 +U 9641 ; WX 602 ; N uni25A9 ; G 2459 +U 9642 ; WX 602 ; N H18543 ; G 2460 +U 9643 ; WX 602 ; N H18551 ; G 2461 +U 9644 ; WX 602 ; N filledrect ; G 2462 +U 9645 ; WX 602 ; N uni25AD ; G 2463 +U 9646 ; WX 602 ; N uni25AE ; G 2464 +U 9647 ; WX 602 ; N uni25AF ; G 2465 +U 9648 ; WX 602 ; N uni25B0 ; G 2466 +U 9649 ; WX 602 ; N uni25B1 ; G 2467 +U 9650 ; WX 602 ; N triagup ; G 2468 +U 9651 ; WX 602 ; N uni25B3 ; G 2469 +U 9652 ; WX 602 ; N uni25B4 ; G 2470 +U 9653 ; WX 602 ; N uni25B5 ; G 2471 +U 9654 ; WX 602 ; N uni25B6 ; G 2472 +U 9655 ; WX 602 ; N uni25B7 ; G 2473 +U 9656 ; WX 602 ; N uni25B8 ; G 2474 +U 9657 ; WX 602 ; N uni25B9 ; G 2475 +U 9658 ; WX 602 ; N triagrt ; G 2476 +U 9659 ; WX 602 ; N uni25BB ; G 2477 +U 9660 ; WX 602 ; N triagdn ; G 2478 +U 9661 ; WX 602 ; N uni25BD ; G 2479 +U 9662 ; WX 602 ; N uni25BE ; G 2480 +U 9663 ; WX 602 ; N uni25BF ; G 2481 +U 9664 ; WX 602 ; N uni25C0 ; G 2482 +U 9665 ; WX 602 ; N uni25C1 ; G 2483 +U 9666 ; WX 602 ; N uni25C2 ; G 2484 +U 9667 ; WX 602 ; N uni25C3 ; G 2485 +U 9668 ; WX 602 ; N triaglf ; G 2486 +U 9669 ; WX 602 ; N uni25C5 ; G 2487 +U 9670 ; WX 602 ; N uni25C6 ; G 2488 +U 9671 ; WX 602 ; N uni25C7 ; G 2489 +U 9672 ; WX 602 ; N uni25C8 ; G 2490 +U 9673 ; WX 602 ; N uni25C9 ; G 2491 +U 9674 ; WX 602 ; N lozenge ; G 2492 +U 9675 ; WX 602 ; N circle ; G 2493 +U 9676 ; WX 602 ; N uni25CC ; G 2494 +U 9677 ; WX 602 ; N uni25CD ; G 2495 +U 9678 ; WX 602 ; N uni25CE ; G 2496 +U 9679 ; WX 602 ; N H18533 ; G 2497 +U 9680 ; WX 602 ; N uni25D0 ; G 2498 +U 9681 ; WX 602 ; N uni25D1 ; G 2499 +U 9682 ; WX 602 ; N uni25D2 ; G 2500 +U 9683 ; WX 602 ; N uni25D3 ; G 2501 +U 9684 ; WX 602 ; N uni25D4 ; G 2502 +U 9685 ; WX 602 ; N uni25D5 ; G 2503 +U 9686 ; WX 602 ; N uni25D6 ; G 2504 +U 9687 ; WX 602 ; N uni25D7 ; G 2505 +U 9688 ; WX 602 ; N invbullet ; G 2506 +U 9689 ; WX 602 ; N invcircle ; G 2507 +U 9690 ; WX 602 ; N uni25DA ; G 2508 +U 9691 ; WX 602 ; N uni25DB ; G 2509 +U 9692 ; WX 602 ; N uni25DC ; G 2510 +U 9693 ; WX 602 ; N uni25DD ; G 2511 +U 9694 ; WX 602 ; N uni25DE ; G 2512 +U 9695 ; WX 602 ; N uni25DF ; G 2513 +U 9696 ; WX 602 ; N uni25E0 ; G 2514 +U 9697 ; WX 602 ; N uni25E1 ; G 2515 +U 9698 ; WX 602 ; N uni25E2 ; G 2516 +U 9699 ; WX 602 ; N uni25E3 ; G 2517 +U 9700 ; WX 602 ; N uni25E4 ; G 2518 +U 9701 ; WX 602 ; N uni25E5 ; G 2519 +U 9702 ; WX 602 ; N openbullet ; G 2520 +U 9703 ; WX 602 ; N uni25E7 ; G 2521 +U 9704 ; WX 602 ; N uni25E8 ; G 2522 +U 9705 ; WX 602 ; N uni25E9 ; G 2523 +U 9706 ; WX 602 ; N uni25EA ; G 2524 +U 9707 ; WX 602 ; N uni25EB ; G 2525 +U 9708 ; WX 602 ; N uni25EC ; G 2526 +U 9709 ; WX 602 ; N uni25ED ; G 2527 +U 9710 ; WX 602 ; N uni25EE ; G 2528 +U 9711 ; WX 602 ; N uni25EF ; G 2529 +U 9712 ; WX 602 ; N uni25F0 ; G 2530 +U 9713 ; WX 602 ; N uni25F1 ; G 2531 +U 9714 ; WX 602 ; N uni25F2 ; G 2532 +U 9715 ; WX 602 ; N uni25F3 ; G 2533 +U 9716 ; WX 602 ; N uni25F4 ; G 2534 +U 9717 ; WX 602 ; N uni25F5 ; G 2535 +U 9718 ; WX 602 ; N uni25F6 ; G 2536 +U 9719 ; WX 602 ; N uni25F7 ; G 2537 +U 9720 ; WX 602 ; N uni25F8 ; G 2538 +U 9721 ; WX 602 ; N uni25F9 ; G 2539 +U 9722 ; WX 602 ; N uni25FA ; G 2540 +U 9723 ; WX 602 ; N uni25FB ; G 2541 +U 9724 ; WX 602 ; N uni25FC ; G 2542 +U 9725 ; WX 602 ; N uni25FD ; G 2543 +U 9726 ; WX 602 ; N uni25FE ; G 2544 +U 9727 ; WX 602 ; N uni25FF ; G 2545 +U 9728 ; WX 602 ; N uni2600 ; G 2546 +U 9784 ; WX 602 ; N uni2638 ; G 2547 +U 9785 ; WX 602 ; N uni2639 ; G 2548 +U 9786 ; WX 602 ; N smileface ; G 2549 +U 9787 ; WX 602 ; N invsmileface ; G 2550 +U 9788 ; WX 602 ; N sun ; G 2551 +U 9791 ; WX 602 ; N uni263F ; G 2552 +U 9792 ; WX 602 ; N female ; G 2553 +U 9793 ; WX 602 ; N uni2641 ; G 2554 +U 9794 ; WX 602 ; N male ; G 2555 +U 9795 ; WX 602 ; N uni2643 ; G 2556 +U 9796 ; WX 602 ; N uni2644 ; G 2557 +U 9797 ; WX 602 ; N uni2645 ; G 2558 +U 9798 ; WX 602 ; N uni2646 ; G 2559 +U 9799 ; WX 602 ; N uni2647 ; G 2560 +U 9824 ; WX 602 ; N spade ; G 2561 +U 9825 ; WX 602 ; N uni2661 ; G 2562 +U 9826 ; WX 602 ; N uni2662 ; G 2563 +U 9827 ; WX 602 ; N club ; G 2564 +U 9828 ; WX 602 ; N uni2664 ; G 2565 +U 9829 ; WX 602 ; N heart ; G 2566 +U 9830 ; WX 602 ; N diamond ; G 2567 +U 9831 ; WX 602 ; N uni2667 ; G 2568 +U 9833 ; WX 602 ; N uni2669 ; G 2569 +U 9834 ; WX 602 ; N musicalnote ; G 2570 +U 9835 ; WX 602 ; N musicalnotedbl ; G 2571 +U 9836 ; WX 602 ; N uni266C ; G 2572 +U 9837 ; WX 602 ; N uni266D ; G 2573 +U 9838 ; WX 602 ; N uni266E ; G 2574 +U 9839 ; WX 602 ; N uni266F ; G 2575 +U 10178 ; WX 602 ; N uni27C2 ; G 2576 +U 10181 ; WX 602 ; N uni27C5 ; G 2577 +U 10182 ; WX 602 ; N uni27C6 ; G 2578 +U 10204 ; WX 602 ; N uni27DC ; G 2579 +U 10208 ; WX 602 ; N uni27E0 ; G 2580 +U 10214 ; WX 602 ; N uni27E6 ; G 2581 +U 10215 ; WX 602 ; N uni27E7 ; G 2582 +U 10216 ; WX 602 ; N uni27E8 ; G 2583 +U 10217 ; WX 602 ; N uni27E9 ; G 2584 +U 10218 ; WX 602 ; N uni27EA ; G 2585 +U 10219 ; WX 602 ; N uni27EB ; G 2586 +U 10229 ; WX 602 ; N uni27F5 ; G 2587 +U 10230 ; WX 602 ; N uni27F6 ; G 2588 +U 10231 ; WX 602 ; N uni27F7 ; G 2589 +U 10631 ; WX 602 ; N uni2987 ; G 2590 +U 10632 ; WX 602 ; N uni2988 ; G 2591 +U 10647 ; WX 602 ; N uni2997 ; G 2592 +U 10648 ; WX 602 ; N uni2998 ; G 2593 +U 10731 ; WX 602 ; N uni29EB ; G 2594 +U 10746 ; WX 602 ; N uni29FA ; G 2595 +U 10747 ; WX 602 ; N uni29FB ; G 2596 +U 10752 ; WX 602 ; N uni2A00 ; G 2597 +U 10799 ; WX 602 ; N uni2A2F ; G 2598 +U 10858 ; WX 602 ; N uni2A6A ; G 2599 +U 10859 ; WX 602 ; N uni2A6B ; G 2600 +U 11013 ; WX 602 ; N uni2B05 ; G 2601 +U 11014 ; WX 602 ; N uni2B06 ; G 2602 +U 11015 ; WX 602 ; N uni2B07 ; G 2603 +U 11016 ; WX 602 ; N uni2B08 ; G 2604 +U 11017 ; WX 602 ; N uni2B09 ; G 2605 +U 11018 ; WX 602 ; N uni2B0A ; G 2606 +U 11019 ; WX 602 ; N uni2B0B ; G 2607 +U 11020 ; WX 602 ; N uni2B0C ; G 2608 +U 11021 ; WX 602 ; N uni2B0D ; G 2609 +U 11026 ; WX 602 ; N uni2B12 ; G 2610 +U 11027 ; WX 602 ; N uni2B13 ; G 2611 +U 11028 ; WX 602 ; N uni2B14 ; G 2612 +U 11029 ; WX 602 ; N uni2B15 ; G 2613 +U 11030 ; WX 602 ; N uni2B16 ; G 2614 +U 11031 ; WX 602 ; N uni2B17 ; G 2615 +U 11032 ; WX 602 ; N uni2B18 ; G 2616 +U 11033 ; WX 602 ; N uni2B19 ; G 2617 +U 11034 ; WX 602 ; N uni2B1A ; G 2618 +U 11364 ; WX 602 ; N uni2C64 ; G 2619 +U 11373 ; WX 602 ; N uni2C6D ; G 2620 +U 11374 ; WX 602 ; N uni2C6E ; G 2621 +U 11375 ; WX 602 ; N uni2C6F ; G 2622 +U 11376 ; WX 602 ; N uni2C70 ; G 2623 +U 11381 ; WX 602 ; N uni2C75 ; G 2624 +U 11382 ; WX 602 ; N uni2C76 ; G 2625 +U 11383 ; WX 602 ; N uni2C77 ; G 2626 +U 11385 ; WX 602 ; N uni2C79 ; G 2627 +U 11386 ; WX 602 ; N uni2C7A ; G 2628 +U 11388 ; WX 602 ; N uni2C7C ; G 2629 +U 11389 ; WX 602 ; N uni2C7D ; G 2630 +U 11390 ; WX 602 ; N uni2C7E ; G 2631 +U 11391 ; WX 602 ; N uni2C7F ; G 2632 +U 11800 ; WX 602 ; N uni2E18 ; G 2633 +U 11807 ; WX 602 ; N uni2E1F ; G 2634 +U 11810 ; WX 602 ; N uni2E22 ; G 2635 +U 11811 ; WX 602 ; N uni2E23 ; G 2636 +U 11812 ; WX 602 ; N uni2E24 ; G 2637 +U 11813 ; WX 602 ; N uni2E25 ; G 2638 +U 11822 ; WX 602 ; N uni2E2E ; G 2639 +U 42760 ; WX 602 ; N uniA708 ; G 2640 +U 42761 ; WX 602 ; N uniA709 ; G 2641 +U 42762 ; WX 602 ; N uniA70A ; G 2642 +U 42763 ; WX 602 ; N uniA70B ; G 2643 +U 42764 ; WX 602 ; N uniA70C ; G 2644 +U 42765 ; WX 602 ; N uniA70D ; G 2645 +U 42766 ; WX 602 ; N uniA70E ; G 2646 +U 42767 ; WX 602 ; N uniA70F ; G 2647 +U 42768 ; WX 602 ; N uniA710 ; G 2648 +U 42769 ; WX 602 ; N uniA711 ; G 2649 +U 42770 ; WX 602 ; N uniA712 ; G 2650 +U 42771 ; WX 602 ; N uniA713 ; G 2651 +U 42772 ; WX 602 ; N uniA714 ; G 2652 +U 42773 ; WX 602 ; N uniA715 ; G 2653 +U 42774 ; WX 602 ; N uniA716 ; G 2654 +U 42779 ; WX 602 ; N uniA71B ; G 2655 +U 42780 ; WX 602 ; N uniA71C ; G 2656 +U 42781 ; WX 602 ; N uniA71D ; G 2657 +U 42782 ; WX 602 ; N uniA71E ; G 2658 +U 42783 ; WX 602 ; N uniA71F ; G 2659 +U 42786 ; WX 602 ; N uniA722 ; G 2660 +U 42787 ; WX 602 ; N uniA723 ; G 2661 +U 42788 ; WX 602 ; N uniA724 ; G 2662 +U 42789 ; WX 602 ; N uniA725 ; G 2663 +U 42790 ; WX 602 ; N uniA726 ; G 2664 +U 42791 ; WX 602 ; N uniA727 ; G 2665 +U 42889 ; WX 602 ; N uniA789 ; G 2666 +U 42890 ; WX 602 ; N uniA78A ; G 2667 +U 42891 ; WX 602 ; N uniA78B ; G 2668 +U 42892 ; WX 602 ; N uniA78C ; G 2669 +U 42893 ; WX 602 ; N uniA78D ; G 2670 +U 42894 ; WX 602 ; N uniA78E ; G 2671 +U 42896 ; WX 602 ; N uniA790 ; G 2672 +U 42897 ; WX 602 ; N uniA791 ; G 2673 +U 42922 ; WX 602 ; N uniA7AA ; G 2674 +U 43000 ; WX 602 ; N uniA7F8 ; G 2675 +U 43001 ; WX 602 ; N uniA7F9 ; G 2676 +U 63173 ; WX 602 ; N uniF6C5 ; G 2677 +U 64257 ; WX 602 ; N fi ; G 2678 +U 64258 ; WX 602 ; N fl ; G 2679 +U 65529 ; WX 602 ; N uniFFF9 ; G 2680 +U 65530 ; WX 602 ; N uniFFFA ; G 2681 +U 65531 ; WX 602 ; N uniFFFB ; G 2682 +U 65532 ; WX 602 ; N uniFFFC ; G 2683 +U 65533 ; WX 602 ; N uniFFFD ; G 2684 +EndCharMetrics +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono.ttf b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono.ttf new file mode 100644 index 0000000..f578602 Binary files /dev/null and b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono.ttf differ diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono.ufm b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono.ufm new file mode 100644 index 0000000..6b2d4ac --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSansMono.ufm @@ -0,0 +1,3284 @@ +StartFontMetrics 4.1 +Notice Converted by PHP-font-lib +Comment https://github.com/PhenX/php-font-lib +EncodingScheme FontSpecific +FontName DejaVu Sans Mono +FontSubfamily Book +UniqueID DejaVu Sans Mono +FullName DejaVu Sans Mono +Version Version 2.37 +PostScriptName DejaVuSansMono +Manufacturer DejaVu fonts team +FontVendorURL http://dejavu.sourceforge.net +LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License +Weight Medium +ItalicAngle 0 +IsFixedPitch true +UnderlineThickness 44 +UnderlinePosition -63 +FontHeightOffset 0 +Ascender 928 +Descender -236 +FontBBox -558 -375 718 1028 +StartCharMetrics 3377 +U 32 ; WX 602 ; N space ; G 3 +U 33 ; WX 602 ; N exclam ; G 4 +U 34 ; WX 602 ; N quotedbl ; G 5 +U 35 ; WX 602 ; N numbersign ; G 6 +U 36 ; WX 602 ; N dollar ; G 7 +U 37 ; WX 602 ; N percent ; G 8 +U 38 ; WX 602 ; N ampersand ; G 9 +U 39 ; WX 602 ; N quotesingle ; G 10 +U 40 ; WX 602 ; N parenleft ; G 11 +U 41 ; WX 602 ; N parenright ; G 12 +U 42 ; WX 602 ; N asterisk ; G 13 +U 43 ; WX 602 ; N plus ; G 14 +U 44 ; WX 602 ; N comma ; G 15 +U 45 ; WX 602 ; N hyphen ; G 16 +U 46 ; WX 602 ; N period ; G 17 +U 47 ; WX 602 ; N slash ; G 18 +U 48 ; WX 602 ; N zero ; G 19 +U 49 ; WX 602 ; N one ; G 20 +U 50 ; WX 602 ; N two ; G 21 +U 51 ; WX 602 ; N three ; G 22 +U 52 ; WX 602 ; N four ; G 23 +U 53 ; WX 602 ; N five ; G 24 +U 54 ; WX 602 ; N six ; G 25 +U 55 ; WX 602 ; N seven ; G 26 +U 56 ; WX 602 ; N eight ; G 27 +U 57 ; WX 602 ; N nine ; G 28 +U 58 ; WX 602 ; N colon ; G 29 +U 59 ; WX 602 ; N semicolon ; G 30 +U 60 ; WX 602 ; N less ; G 31 +U 61 ; WX 602 ; N equal ; G 32 +U 62 ; WX 602 ; N greater ; G 33 +U 63 ; WX 602 ; N question ; G 34 +U 64 ; WX 602 ; N at ; G 35 +U 65 ; WX 602 ; N A ; G 36 +U 66 ; WX 602 ; N B ; G 37 +U 67 ; WX 602 ; N C ; G 38 +U 68 ; WX 602 ; N D ; G 39 +U 69 ; WX 602 ; N E ; G 40 +U 70 ; WX 602 ; N F ; G 41 +U 71 ; WX 602 ; N G ; G 42 +U 72 ; WX 602 ; N H ; G 43 +U 73 ; WX 602 ; N I ; G 44 +U 74 ; WX 602 ; N J ; G 45 +U 75 ; WX 602 ; N K ; G 46 +U 76 ; WX 602 ; N L ; G 47 +U 77 ; WX 602 ; N M ; G 48 +U 78 ; WX 602 ; N N ; G 49 +U 79 ; WX 602 ; N O ; G 50 +U 80 ; WX 602 ; N P ; G 51 +U 81 ; WX 602 ; N Q ; G 52 +U 82 ; WX 602 ; N R ; G 53 +U 83 ; WX 602 ; N S ; G 54 +U 84 ; WX 602 ; N T ; G 55 +U 85 ; WX 602 ; N U ; G 56 +U 86 ; WX 602 ; N V ; G 57 +U 87 ; WX 602 ; N W ; G 58 +U 88 ; WX 602 ; N X ; G 59 +U 89 ; WX 602 ; N Y ; G 60 +U 90 ; WX 602 ; N Z ; G 61 +U 91 ; WX 602 ; N bracketleft ; G 62 +U 92 ; WX 602 ; N backslash ; G 63 +U 93 ; WX 602 ; N bracketright ; G 64 +U 94 ; WX 602 ; N asciicircum ; G 65 +U 95 ; WX 602 ; N underscore ; G 66 +U 96 ; WX 602 ; N grave ; G 67 +U 97 ; WX 602 ; N a ; G 68 +U 98 ; WX 602 ; N b ; G 69 +U 99 ; WX 602 ; N c ; G 70 +U 100 ; WX 602 ; N d ; G 71 +U 101 ; WX 602 ; N e ; G 72 +U 102 ; WX 602 ; N f ; G 73 +U 103 ; WX 602 ; N g ; G 74 +U 104 ; WX 602 ; N h ; G 75 +U 105 ; WX 602 ; N i ; G 76 +U 106 ; WX 602 ; N j ; G 77 +U 107 ; WX 602 ; N k ; G 78 +U 108 ; WX 602 ; N l ; G 79 +U 109 ; WX 602 ; N m ; G 80 +U 110 ; WX 602 ; N n ; G 81 +U 111 ; WX 602 ; N o ; G 82 +U 112 ; WX 602 ; N p ; G 83 +U 113 ; WX 602 ; N q ; G 84 +U 114 ; WX 602 ; N r ; G 85 +U 115 ; WX 602 ; N s ; G 86 +U 116 ; WX 602 ; N t ; G 87 +U 117 ; WX 602 ; N u ; G 88 +U 118 ; WX 602 ; N v ; G 89 +U 119 ; WX 602 ; N w ; G 90 +U 120 ; WX 602 ; N x ; G 91 +U 121 ; WX 602 ; N y ; G 92 +U 122 ; WX 602 ; N z ; G 93 +U 123 ; WX 602 ; N braceleft ; G 94 +U 124 ; WX 602 ; N bar ; G 95 +U 125 ; WX 602 ; N braceright ; G 96 +U 126 ; WX 602 ; N asciitilde ; G 97 +U 160 ; WX 602 ; N nbspace ; G 98 +U 161 ; WX 602 ; N exclamdown ; G 99 +U 162 ; WX 602 ; N cent ; G 100 +U 163 ; WX 602 ; N sterling ; G 101 +U 164 ; WX 602 ; N currency ; G 102 +U 165 ; WX 602 ; N yen ; G 103 +U 166 ; WX 602 ; N brokenbar ; G 104 +U 167 ; WX 602 ; N section ; G 105 +U 168 ; WX 602 ; N dieresis ; G 106 +U 169 ; WX 602 ; N copyright ; G 107 +U 170 ; WX 602 ; N ordfeminine ; G 108 +U 171 ; WX 602 ; N guillemotleft ; G 109 +U 172 ; WX 602 ; N logicalnot ; G 110 +U 173 ; WX 602 ; N sfthyphen ; G 111 +U 174 ; WX 602 ; N registered ; G 112 +U 175 ; WX 602 ; N macron ; G 113 +U 176 ; WX 602 ; N degree ; G 114 +U 177 ; WX 602 ; N plusminus ; G 115 +U 178 ; WX 602 ; N twosuperior ; G 116 +U 179 ; WX 602 ; N threesuperior ; G 117 +U 180 ; WX 602 ; N acute ; G 118 +U 181 ; WX 602 ; N mu ; G 119 +U 182 ; WX 602 ; N paragraph ; G 120 +U 183 ; WX 602 ; N periodcentered ; G 121 +U 184 ; WX 602 ; N cedilla ; G 122 +U 185 ; WX 602 ; N onesuperior ; G 123 +U 186 ; WX 602 ; N ordmasculine ; G 124 +U 187 ; WX 602 ; N guillemotright ; G 125 +U 188 ; WX 602 ; N onequarter ; G 126 +U 189 ; WX 602 ; N onehalf ; G 127 +U 190 ; WX 602 ; N threequarters ; G 128 +U 191 ; WX 602 ; N questiondown ; G 129 +U 192 ; WX 602 ; N Agrave ; G 130 +U 193 ; WX 602 ; N Aacute ; G 131 +U 194 ; WX 602 ; N Acircumflex ; G 132 +U 195 ; WX 602 ; N Atilde ; G 133 +U 196 ; WX 602 ; N Adieresis ; G 134 +U 197 ; WX 602 ; N Aring ; G 135 +U 198 ; WX 602 ; N AE ; G 136 +U 199 ; WX 602 ; N Ccedilla ; G 137 +U 200 ; WX 602 ; N Egrave ; G 138 +U 201 ; WX 602 ; N Eacute ; G 139 +U 202 ; WX 602 ; N Ecircumflex ; G 140 +U 203 ; WX 602 ; N Edieresis ; G 141 +U 204 ; WX 602 ; N Igrave ; G 142 +U 205 ; WX 602 ; N Iacute ; G 143 +U 206 ; WX 602 ; N Icircumflex ; G 144 +U 207 ; WX 602 ; N Idieresis ; G 145 +U 208 ; WX 602 ; N Eth ; G 146 +U 209 ; WX 602 ; N Ntilde ; G 147 +U 210 ; WX 602 ; N Ograve ; G 148 +U 211 ; WX 602 ; N Oacute ; G 149 +U 212 ; WX 602 ; N Ocircumflex ; G 150 +U 213 ; WX 602 ; N Otilde ; G 151 +U 214 ; WX 602 ; N Odieresis ; G 152 +U 215 ; WX 602 ; N multiply ; G 153 +U 216 ; WX 602 ; N Oslash ; G 154 +U 217 ; WX 602 ; N Ugrave ; G 155 +U 218 ; WX 602 ; N Uacute ; G 156 +U 219 ; WX 602 ; N Ucircumflex ; G 157 +U 220 ; WX 602 ; N Udieresis ; G 158 +U 221 ; WX 602 ; N Yacute ; G 159 +U 222 ; WX 602 ; N Thorn ; G 160 +U 223 ; WX 602 ; N germandbls ; G 161 +U 224 ; WX 602 ; N agrave ; G 162 +U 225 ; WX 602 ; N aacute ; G 163 +U 226 ; WX 602 ; N acircumflex ; G 164 +U 227 ; WX 602 ; N atilde ; G 165 +U 228 ; WX 602 ; N adieresis ; G 166 +U 229 ; WX 602 ; N aring ; G 167 +U 230 ; WX 602 ; N ae ; G 168 +U 231 ; WX 602 ; N ccedilla ; G 169 +U 232 ; WX 602 ; N egrave ; G 170 +U 233 ; WX 602 ; N eacute ; G 171 +U 234 ; WX 602 ; N ecircumflex ; G 172 +U 235 ; WX 602 ; N edieresis ; G 173 +U 236 ; WX 602 ; N igrave ; G 174 +U 237 ; WX 602 ; N iacute ; G 175 +U 238 ; WX 602 ; N icircumflex ; G 176 +U 239 ; WX 602 ; N idieresis ; G 177 +U 240 ; WX 602 ; N eth ; G 178 +U 241 ; WX 602 ; N ntilde ; G 179 +U 242 ; WX 602 ; N ograve ; G 180 +U 243 ; WX 602 ; N oacute ; G 181 +U 244 ; WX 602 ; N ocircumflex ; G 182 +U 245 ; WX 602 ; N otilde ; G 183 +U 246 ; WX 602 ; N odieresis ; G 184 +U 247 ; WX 602 ; N divide ; G 185 +U 248 ; WX 602 ; N oslash ; G 186 +U 249 ; WX 602 ; N ugrave ; G 187 +U 250 ; WX 602 ; N uacute ; G 188 +U 251 ; WX 602 ; N ucircumflex ; G 189 +U 252 ; WX 602 ; N udieresis ; G 190 +U 253 ; WX 602 ; N yacute ; G 191 +U 254 ; WX 602 ; N thorn ; G 192 +U 255 ; WX 602 ; N ydieresis ; G 193 +U 256 ; WX 602 ; N Amacron ; G 194 +U 257 ; WX 602 ; N amacron ; G 195 +U 258 ; WX 602 ; N Abreve ; G 196 +U 259 ; WX 602 ; N abreve ; G 197 +U 260 ; WX 602 ; N Aogonek ; G 198 +U 261 ; WX 602 ; N aogonek ; G 199 +U 262 ; WX 602 ; N Cacute ; G 200 +U 263 ; WX 602 ; N cacute ; G 201 +U 264 ; WX 602 ; N Ccircumflex ; G 202 +U 265 ; WX 602 ; N ccircumflex ; G 203 +U 266 ; WX 602 ; N Cdotaccent ; G 204 +U 267 ; WX 602 ; N cdotaccent ; G 205 +U 268 ; WX 602 ; N Ccaron ; G 206 +U 269 ; WX 602 ; N ccaron ; G 207 +U 270 ; WX 602 ; N Dcaron ; G 208 +U 271 ; WX 602 ; N dcaron ; G 209 +U 272 ; WX 602 ; N Dcroat ; G 210 +U 273 ; WX 602 ; N dmacron ; G 211 +U 274 ; WX 602 ; N Emacron ; G 212 +U 275 ; WX 602 ; N emacron ; G 213 +U 276 ; WX 602 ; N Ebreve ; G 214 +U 277 ; WX 602 ; N ebreve ; G 215 +U 278 ; WX 602 ; N Edotaccent ; G 216 +U 279 ; WX 602 ; N edotaccent ; G 217 +U 280 ; WX 602 ; N Eogonek ; G 218 +U 281 ; WX 602 ; N eogonek ; G 219 +U 282 ; WX 602 ; N Ecaron ; G 220 +U 283 ; WX 602 ; N ecaron ; G 221 +U 284 ; WX 602 ; N Gcircumflex ; G 222 +U 285 ; WX 602 ; N gcircumflex ; G 223 +U 286 ; WX 602 ; N Gbreve ; G 224 +U 287 ; WX 602 ; N gbreve ; G 225 +U 288 ; WX 602 ; N Gdotaccent ; G 226 +U 289 ; WX 602 ; N gdotaccent ; G 227 +U 290 ; WX 602 ; N Gcommaaccent ; G 228 +U 291 ; WX 602 ; N gcommaaccent ; G 229 +U 292 ; WX 602 ; N Hcircumflex ; G 230 +U 293 ; WX 602 ; N hcircumflex ; G 231 +U 294 ; WX 602 ; N Hbar ; G 232 +U 295 ; WX 602 ; N hbar ; G 233 +U 296 ; WX 602 ; N Itilde ; G 234 +U 297 ; WX 602 ; N itilde ; G 235 +U 298 ; WX 602 ; N Imacron ; G 236 +U 299 ; WX 602 ; N imacron ; G 237 +U 300 ; WX 602 ; N Ibreve ; G 238 +U 301 ; WX 602 ; N ibreve ; G 239 +U 302 ; WX 602 ; N Iogonek ; G 240 +U 303 ; WX 602 ; N iogonek ; G 241 +U 304 ; WX 602 ; N Idot ; G 242 +U 305 ; WX 602 ; N dotlessi ; G 243 +U 306 ; WX 602 ; N IJ ; G 244 +U 307 ; WX 602 ; N ij ; G 245 +U 308 ; WX 602 ; N Jcircumflex ; G 246 +U 309 ; WX 602 ; N jcircumflex ; G 247 +U 310 ; WX 602 ; N Kcommaaccent ; G 248 +U 311 ; WX 602 ; N kcommaaccent ; G 249 +U 312 ; WX 602 ; N kgreenlandic ; G 250 +U 313 ; WX 602 ; N Lacute ; G 251 +U 314 ; WX 602 ; N lacute ; G 252 +U 315 ; WX 602 ; N Lcommaaccent ; G 253 +U 316 ; WX 602 ; N lcommaaccent ; G 254 +U 317 ; WX 602 ; N Lcaron ; G 255 +U 318 ; WX 602 ; N lcaron ; G 256 +U 319 ; WX 602 ; N Ldot ; G 257 +U 320 ; WX 602 ; N ldot ; G 258 +U 321 ; WX 602 ; N Lslash ; G 259 +U 322 ; WX 602 ; N lslash ; G 260 +U 323 ; WX 602 ; N Nacute ; G 261 +U 324 ; WX 602 ; N nacute ; G 262 +U 325 ; WX 602 ; N Ncommaaccent ; G 263 +U 326 ; WX 602 ; N ncommaaccent ; G 264 +U 327 ; WX 602 ; N Ncaron ; G 265 +U 328 ; WX 602 ; N ncaron ; G 266 +U 329 ; WX 602 ; N napostrophe ; G 267 +U 330 ; WX 602 ; N Eng ; G 268 +U 331 ; WX 602 ; N eng ; G 269 +U 332 ; WX 602 ; N Omacron ; G 270 +U 333 ; WX 602 ; N omacron ; G 271 +U 334 ; WX 602 ; N Obreve ; G 272 +U 335 ; WX 602 ; N obreve ; G 273 +U 336 ; WX 602 ; N Ohungarumlaut ; G 274 +U 337 ; WX 602 ; N ohungarumlaut ; G 275 +U 338 ; WX 602 ; N OE ; G 276 +U 339 ; WX 602 ; N oe ; G 277 +U 340 ; WX 602 ; N Racute ; G 278 +U 341 ; WX 602 ; N racute ; G 279 +U 342 ; WX 602 ; N Rcommaaccent ; G 280 +U 343 ; WX 602 ; N rcommaaccent ; G 281 +U 344 ; WX 602 ; N Rcaron ; G 282 +U 345 ; WX 602 ; N rcaron ; G 283 +U 346 ; WX 602 ; N Sacute ; G 284 +U 347 ; WX 602 ; N sacute ; G 285 +U 348 ; WX 602 ; N Scircumflex ; G 286 +U 349 ; WX 602 ; N scircumflex ; G 287 +U 350 ; WX 602 ; N Scedilla ; G 288 +U 351 ; WX 602 ; N scedilla ; G 289 +U 352 ; WX 602 ; N Scaron ; G 290 +U 353 ; WX 602 ; N scaron ; G 291 +U 354 ; WX 602 ; N Tcommaaccent ; G 292 +U 355 ; WX 602 ; N tcommaaccent ; G 293 +U 356 ; WX 602 ; N Tcaron ; G 294 +U 357 ; WX 602 ; N tcaron ; G 295 +U 358 ; WX 602 ; N Tbar ; G 296 +U 359 ; WX 602 ; N tbar ; G 297 +U 360 ; WX 602 ; N Utilde ; G 298 +U 361 ; WX 602 ; N utilde ; G 299 +U 362 ; WX 602 ; N Umacron ; G 300 +U 363 ; WX 602 ; N umacron ; G 301 +U 364 ; WX 602 ; N Ubreve ; G 302 +U 365 ; WX 602 ; N ubreve ; G 303 +U 366 ; WX 602 ; N Uring ; G 304 +U 367 ; WX 602 ; N uring ; G 305 +U 368 ; WX 602 ; N Uhungarumlaut ; G 306 +U 369 ; WX 602 ; N uhungarumlaut ; G 307 +U 370 ; WX 602 ; N Uogonek ; G 308 +U 371 ; WX 602 ; N uogonek ; G 309 +U 372 ; WX 602 ; N Wcircumflex ; G 310 +U 373 ; WX 602 ; N wcircumflex ; G 311 +U 374 ; WX 602 ; N Ycircumflex ; G 312 +U 375 ; WX 602 ; N ycircumflex ; G 313 +U 376 ; WX 602 ; N Ydieresis ; G 314 +U 377 ; WX 602 ; N Zacute ; G 315 +U 378 ; WX 602 ; N zacute ; G 316 +U 379 ; WX 602 ; N Zdotaccent ; G 317 +U 380 ; WX 602 ; N zdotaccent ; G 318 +U 381 ; WX 602 ; N Zcaron ; G 319 +U 382 ; WX 602 ; N zcaron ; G 320 +U 383 ; WX 602 ; N longs ; G 321 +U 384 ; WX 602 ; N uni0180 ; G 322 +U 385 ; WX 602 ; N uni0181 ; G 323 +U 386 ; WX 602 ; N uni0182 ; G 324 +U 387 ; WX 602 ; N uni0183 ; G 325 +U 388 ; WX 602 ; N uni0184 ; G 326 +U 389 ; WX 602 ; N uni0185 ; G 327 +U 390 ; WX 602 ; N uni0186 ; G 328 +U 391 ; WX 602 ; N uni0187 ; G 329 +U 392 ; WX 602 ; N uni0188 ; G 330 +U 393 ; WX 602 ; N uni0189 ; G 331 +U 394 ; WX 602 ; N uni018A ; G 332 +U 395 ; WX 602 ; N uni018B ; G 333 +U 396 ; WX 602 ; N uni018C ; G 334 +U 397 ; WX 602 ; N uni018D ; G 335 +U 398 ; WX 602 ; N uni018E ; G 336 +U 399 ; WX 602 ; N uni018F ; G 337 +U 400 ; WX 602 ; N uni0190 ; G 338 +U 401 ; WX 602 ; N uni0191 ; G 339 +U 402 ; WX 602 ; N florin ; G 340 +U 403 ; WX 602 ; N uni0193 ; G 341 +U 404 ; WX 602 ; N uni0194 ; G 342 +U 405 ; WX 602 ; N uni0195 ; G 343 +U 406 ; WX 602 ; N uni0196 ; G 344 +U 407 ; WX 602 ; N uni0197 ; G 345 +U 408 ; WX 602 ; N uni0198 ; G 346 +U 409 ; WX 602 ; N uni0199 ; G 347 +U 410 ; WX 602 ; N uni019A ; G 348 +U 411 ; WX 602 ; N uni019B ; G 349 +U 412 ; WX 602 ; N uni019C ; G 350 +U 413 ; WX 602 ; N uni019D ; G 351 +U 414 ; WX 602 ; N uni019E ; G 352 +U 415 ; WX 602 ; N uni019F ; G 353 +U 416 ; WX 602 ; N Ohorn ; G 354 +U 417 ; WX 602 ; N ohorn ; G 355 +U 418 ; WX 602 ; N uni01A2 ; G 356 +U 419 ; WX 602 ; N uni01A3 ; G 357 +U 420 ; WX 602 ; N uni01A4 ; G 358 +U 421 ; WX 602 ; N uni01A5 ; G 359 +U 422 ; WX 602 ; N uni01A6 ; G 360 +U 423 ; WX 602 ; N uni01A7 ; G 361 +U 424 ; WX 602 ; N uni01A8 ; G 362 +U 425 ; WX 602 ; N uni01A9 ; G 363 +U 426 ; WX 602 ; N uni01AA ; G 364 +U 427 ; WX 602 ; N uni01AB ; G 365 +U 428 ; WX 602 ; N uni01AC ; G 366 +U 429 ; WX 602 ; N uni01AD ; G 367 +U 430 ; WX 602 ; N uni01AE ; G 368 +U 431 ; WX 602 ; N Uhorn ; G 369 +U 432 ; WX 602 ; N uhorn ; G 370 +U 433 ; WX 602 ; N uni01B1 ; G 371 +U 434 ; WX 602 ; N uni01B2 ; G 372 +U 435 ; WX 602 ; N uni01B3 ; G 373 +U 436 ; WX 602 ; N uni01B4 ; G 374 +U 437 ; WX 602 ; N uni01B5 ; G 375 +U 438 ; WX 602 ; N uni01B6 ; G 376 +U 439 ; WX 602 ; N uni01B7 ; G 377 +U 440 ; WX 602 ; N uni01B8 ; G 378 +U 441 ; WX 602 ; N uni01B9 ; G 379 +U 442 ; WX 602 ; N uni01BA ; G 380 +U 443 ; WX 602 ; N uni01BB ; G 381 +U 444 ; WX 602 ; N uni01BC ; G 382 +U 445 ; WX 602 ; N uni01BD ; G 383 +U 446 ; WX 602 ; N uni01BE ; G 384 +U 447 ; WX 602 ; N uni01BF ; G 385 +U 448 ; WX 602 ; N uni01C0 ; G 386 +U 449 ; WX 602 ; N uni01C1 ; G 387 +U 450 ; WX 602 ; N uni01C2 ; G 388 +U 451 ; WX 602 ; N uni01C3 ; G 389 +U 461 ; WX 602 ; N uni01CD ; G 390 +U 462 ; WX 602 ; N uni01CE ; G 391 +U 463 ; WX 602 ; N uni01CF ; G 392 +U 464 ; WX 602 ; N uni01D0 ; G 393 +U 465 ; WX 602 ; N uni01D1 ; G 394 +U 466 ; WX 602 ; N uni01D2 ; G 395 +U 467 ; WX 602 ; N uni01D3 ; G 396 +U 468 ; WX 602 ; N uni01D4 ; G 397 +U 469 ; WX 602 ; N uni01D5 ; G 398 +U 470 ; WX 602 ; N uni01D6 ; G 399 +U 471 ; WX 602 ; N uni01D7 ; G 400 +U 472 ; WX 602 ; N uni01D8 ; G 401 +U 473 ; WX 602 ; N uni01D9 ; G 402 +U 474 ; WX 602 ; N uni01DA ; G 403 +U 475 ; WX 602 ; N uni01DB ; G 404 +U 476 ; WX 602 ; N uni01DC ; G 405 +U 477 ; WX 602 ; N uni01DD ; G 406 +U 478 ; WX 602 ; N uni01DE ; G 407 +U 479 ; WX 602 ; N uni01DF ; G 408 +U 480 ; WX 602 ; N uni01E0 ; G 409 +U 481 ; WX 602 ; N uni01E1 ; G 410 +U 482 ; WX 602 ; N uni01E2 ; G 411 +U 483 ; WX 602 ; N uni01E3 ; G 412 +U 486 ; WX 602 ; N Gcaron ; G 413 +U 487 ; WX 602 ; N gcaron ; G 414 +U 488 ; WX 602 ; N uni01E8 ; G 415 +U 489 ; WX 602 ; N uni01E9 ; G 416 +U 490 ; WX 602 ; N uni01EA ; G 417 +U 491 ; WX 602 ; N uni01EB ; G 418 +U 492 ; WX 602 ; N uni01EC ; G 419 +U 493 ; WX 602 ; N uni01ED ; G 420 +U 494 ; WX 602 ; N uni01EE ; G 421 +U 495 ; WX 602 ; N uni01EF ; G 422 +U 496 ; WX 602 ; N uni01F0 ; G 423 +U 500 ; WX 602 ; N uni01F4 ; G 424 +U 501 ; WX 602 ; N uni01F5 ; G 425 +U 502 ; WX 602 ; N uni01F6 ; G 426 +U 504 ; WX 602 ; N uni01F8 ; G 427 +U 505 ; WX 602 ; N uni01F9 ; G 428 +U 508 ; WX 602 ; N AEacute ; G 429 +U 509 ; WX 602 ; N aeacute ; G 430 +U 510 ; WX 602 ; N Oslashacute ; G 431 +U 511 ; WX 602 ; N oslashacute ; G 432 +U 512 ; WX 602 ; N uni0200 ; G 433 +U 513 ; WX 602 ; N uni0201 ; G 434 +U 514 ; WX 602 ; N uni0202 ; G 435 +U 515 ; WX 602 ; N uni0203 ; G 436 +U 516 ; WX 602 ; N uni0204 ; G 437 +U 517 ; WX 602 ; N uni0205 ; G 438 +U 518 ; WX 602 ; N uni0206 ; G 439 +U 519 ; WX 602 ; N uni0207 ; G 440 +U 520 ; WX 602 ; N uni0208 ; G 441 +U 521 ; WX 602 ; N uni0209 ; G 442 +U 522 ; WX 602 ; N uni020A ; G 443 +U 523 ; WX 602 ; N uni020B ; G 444 +U 524 ; WX 602 ; N uni020C ; G 445 +U 525 ; WX 602 ; N uni020D ; G 446 +U 526 ; WX 602 ; N uni020E ; G 447 +U 527 ; WX 602 ; N uni020F ; G 448 +U 528 ; WX 602 ; N uni0210 ; G 449 +U 529 ; WX 602 ; N uni0211 ; G 450 +U 530 ; WX 602 ; N uni0212 ; G 451 +U 531 ; WX 602 ; N uni0213 ; G 452 +U 532 ; WX 602 ; N uni0214 ; G 453 +U 533 ; WX 602 ; N uni0215 ; G 454 +U 534 ; WX 602 ; N uni0216 ; G 455 +U 535 ; WX 602 ; N uni0217 ; G 456 +U 536 ; WX 602 ; N Scommaaccent ; G 457 +U 537 ; WX 602 ; N scommaaccent ; G 458 +U 538 ; WX 602 ; N uni021A ; G 459 +U 539 ; WX 602 ; N uni021B ; G 460 +U 540 ; WX 602 ; N uni021C ; G 461 +U 541 ; WX 602 ; N uni021D ; G 462 +U 542 ; WX 602 ; N uni021E ; G 463 +U 543 ; WX 602 ; N uni021F ; G 464 +U 544 ; WX 602 ; N uni0220 ; G 465 +U 545 ; WX 602 ; N uni0221 ; G 466 +U 548 ; WX 602 ; N uni0224 ; G 467 +U 549 ; WX 602 ; N uni0225 ; G 468 +U 550 ; WX 602 ; N uni0226 ; G 469 +U 551 ; WX 602 ; N uni0227 ; G 470 +U 552 ; WX 602 ; N uni0228 ; G 471 +U 553 ; WX 602 ; N uni0229 ; G 472 +U 554 ; WX 602 ; N uni022A ; G 473 +U 555 ; WX 602 ; N uni022B ; G 474 +U 556 ; WX 602 ; N uni022C ; G 475 +U 557 ; WX 602 ; N uni022D ; G 476 +U 558 ; WX 602 ; N uni022E ; G 477 +U 559 ; WX 602 ; N uni022F ; G 478 +U 560 ; WX 602 ; N uni0230 ; G 479 +U 561 ; WX 602 ; N uni0231 ; G 480 +U 562 ; WX 602 ; N uni0232 ; G 481 +U 563 ; WX 602 ; N uni0233 ; G 482 +U 564 ; WX 602 ; N uni0234 ; G 483 +U 565 ; WX 602 ; N uni0235 ; G 484 +U 566 ; WX 602 ; N uni0236 ; G 485 +U 567 ; WX 602 ; N dotlessj ; G 486 +U 568 ; WX 602 ; N uni0238 ; G 487 +U 569 ; WX 602 ; N uni0239 ; G 488 +U 570 ; WX 602 ; N uni023A ; G 489 +U 571 ; WX 602 ; N uni023B ; G 490 +U 572 ; WX 602 ; N uni023C ; G 491 +U 573 ; WX 602 ; N uni023D ; G 492 +U 574 ; WX 602 ; N uni023E ; G 493 +U 575 ; WX 602 ; N uni023F ; G 494 +U 576 ; WX 602 ; N uni0240 ; G 495 +U 577 ; WX 602 ; N uni0241 ; G 496 +U 579 ; WX 602 ; N uni0243 ; G 497 +U 580 ; WX 602 ; N uni0244 ; G 498 +U 581 ; WX 602 ; N uni0245 ; G 499 +U 588 ; WX 602 ; N uni024C ; G 500 +U 589 ; WX 602 ; N uni024D ; G 501 +U 592 ; WX 602 ; N uni0250 ; G 502 +U 593 ; WX 602 ; N uni0251 ; G 503 +U 594 ; WX 602 ; N uni0252 ; G 504 +U 595 ; WX 602 ; N uni0253 ; G 505 +U 596 ; WX 602 ; N uni0254 ; G 506 +U 597 ; WX 602 ; N uni0255 ; G 507 +U 598 ; WX 602 ; N uni0256 ; G 508 +U 599 ; WX 602 ; N uni0257 ; G 509 +U 600 ; WX 602 ; N uni0258 ; G 510 +U 601 ; WX 602 ; N uni0259 ; G 511 +U 602 ; WX 602 ; N uni025A ; G 512 +U 603 ; WX 602 ; N uni025B ; G 513 +U 604 ; WX 602 ; N uni025C ; G 514 +U 605 ; WX 602 ; N uni025D ; G 515 +U 606 ; WX 602 ; N uni025E ; G 516 +U 607 ; WX 602 ; N uni025F ; G 517 +U 608 ; WX 602 ; N uni0260 ; G 518 +U 609 ; WX 602 ; N uni0261 ; G 519 +U 610 ; WX 602 ; N uni0262 ; G 520 +U 611 ; WX 602 ; N uni0263 ; G 521 +U 612 ; WX 602 ; N uni0264 ; G 522 +U 613 ; WX 602 ; N uni0265 ; G 523 +U 614 ; WX 602 ; N uni0266 ; G 524 +U 615 ; WX 602 ; N uni0267 ; G 525 +U 616 ; WX 602 ; N uni0268 ; G 526 +U 617 ; WX 602 ; N uni0269 ; G 527 +U 618 ; WX 602 ; N uni026A ; G 528 +U 619 ; WX 602 ; N uni026B ; G 529 +U 620 ; WX 602 ; N uni026C ; G 530 +U 621 ; WX 602 ; N uni026D ; G 531 +U 622 ; WX 602 ; N uni026E ; G 532 +U 623 ; WX 602 ; N uni026F ; G 533 +U 624 ; WX 602 ; N uni0270 ; G 534 +U 625 ; WX 602 ; N uni0271 ; G 535 +U 626 ; WX 602 ; N uni0272 ; G 536 +U 627 ; WX 602 ; N uni0273 ; G 537 +U 628 ; WX 602 ; N uni0274 ; G 538 +U 629 ; WX 602 ; N uni0275 ; G 539 +U 630 ; WX 602 ; N uni0276 ; G 540 +U 631 ; WX 602 ; N uni0277 ; G 541 +U 632 ; WX 602 ; N uni0278 ; G 542 +U 633 ; WX 602 ; N uni0279 ; G 543 +U 634 ; WX 602 ; N uni027A ; G 544 +U 635 ; WX 602 ; N uni027B ; G 545 +U 636 ; WX 602 ; N uni027C ; G 546 +U 637 ; WX 602 ; N uni027D ; G 547 +U 638 ; WX 602 ; N uni027E ; G 548 +U 639 ; WX 602 ; N uni027F ; G 549 +U 640 ; WX 602 ; N uni0280 ; G 550 +U 641 ; WX 602 ; N uni0281 ; G 551 +U 642 ; WX 602 ; N uni0282 ; G 552 +U 643 ; WX 602 ; N uni0283 ; G 553 +U 644 ; WX 602 ; N uni0284 ; G 554 +U 645 ; WX 602 ; N uni0285 ; G 555 +U 646 ; WX 602 ; N uni0286 ; G 556 +U 647 ; WX 602 ; N uni0287 ; G 557 +U 648 ; WX 602 ; N uni0288 ; G 558 +U 649 ; WX 602 ; N uni0289 ; G 559 +U 650 ; WX 602 ; N uni028A ; G 560 +U 651 ; WX 602 ; N uni028B ; G 561 +U 652 ; WX 602 ; N uni028C ; G 562 +U 653 ; WX 602 ; N uni028D ; G 563 +U 654 ; WX 602 ; N uni028E ; G 564 +U 655 ; WX 602 ; N uni028F ; G 565 +U 656 ; WX 602 ; N uni0290 ; G 566 +U 657 ; WX 602 ; N uni0291 ; G 567 +U 658 ; WX 602 ; N uni0292 ; G 568 +U 659 ; WX 602 ; N uni0293 ; G 569 +U 660 ; WX 602 ; N uni0294 ; G 570 +U 661 ; WX 602 ; N uni0295 ; G 571 +U 662 ; WX 602 ; N uni0296 ; G 572 +U 663 ; WX 602 ; N uni0297 ; G 573 +U 664 ; WX 602 ; N uni0298 ; G 574 +U 665 ; WX 602 ; N uni0299 ; G 575 +U 666 ; WX 602 ; N uni029A ; G 576 +U 667 ; WX 602 ; N uni029B ; G 577 +U 668 ; WX 602 ; N uni029C ; G 578 +U 669 ; WX 602 ; N uni029D ; G 579 +U 670 ; WX 602 ; N uni029E ; G 580 +U 671 ; WX 602 ; N uni029F ; G 581 +U 672 ; WX 602 ; N uni02A0 ; G 582 +U 673 ; WX 602 ; N uni02A1 ; G 583 +U 674 ; WX 602 ; N uni02A2 ; G 584 +U 675 ; WX 602 ; N uni02A3 ; G 585 +U 676 ; WX 602 ; N uni02A4 ; G 586 +U 677 ; WX 602 ; N uni02A5 ; G 587 +U 678 ; WX 602 ; N uni02A6 ; G 588 +U 679 ; WX 602 ; N uni02A7 ; G 589 +U 680 ; WX 602 ; N uni02A8 ; G 590 +U 681 ; WX 602 ; N uni02A9 ; G 591 +U 682 ; WX 602 ; N uni02AA ; G 592 +U 683 ; WX 602 ; N uni02AB ; G 593 +U 684 ; WX 602 ; N uni02AC ; G 594 +U 685 ; WX 602 ; N uni02AD ; G 595 +U 686 ; WX 602 ; N uni02AE ; G 596 +U 687 ; WX 602 ; N uni02AF ; G 597 +U 688 ; WX 602 ; N uni02B0 ; G 598 +U 689 ; WX 602 ; N uni02B1 ; G 599 +U 690 ; WX 602 ; N uni02B2 ; G 600 +U 691 ; WX 602 ; N uni02B3 ; G 601 +U 692 ; WX 602 ; N uni02B4 ; G 602 +U 693 ; WX 602 ; N uni02B5 ; G 603 +U 694 ; WX 602 ; N uni02B6 ; G 604 +U 695 ; WX 602 ; N uni02B7 ; G 605 +U 696 ; WX 602 ; N uni02B8 ; G 606 +U 697 ; WX 602 ; N uni02B9 ; G 607 +U 699 ; WX 602 ; N uni02BB ; G 608 +U 700 ; WX 602 ; N uni02BC ; G 609 +U 701 ; WX 602 ; N uni02BD ; G 610 +U 702 ; WX 602 ; N uni02BE ; G 611 +U 703 ; WX 602 ; N uni02BF ; G 612 +U 704 ; WX 602 ; N uni02C0 ; G 613 +U 705 ; WX 602 ; N uni02C1 ; G 614 +U 710 ; WX 602 ; N circumflex ; G 615 +U 711 ; WX 602 ; N caron ; G 616 +U 712 ; WX 602 ; N uni02C8 ; G 617 +U 713 ; WX 602 ; N uni02C9 ; G 618 +U 716 ; WX 602 ; N uni02CC ; G 619 +U 717 ; WX 602 ; N uni02CD ; G 620 +U 718 ; WX 602 ; N uni02CE ; G 621 +U 719 ; WX 602 ; N uni02CF ; G 622 +U 720 ; WX 602 ; N uni02D0 ; G 623 +U 721 ; WX 602 ; N uni02D1 ; G 624 +U 722 ; WX 602 ; N uni02D2 ; G 625 +U 723 ; WX 602 ; N uni02D3 ; G 626 +U 726 ; WX 602 ; N uni02D6 ; G 627 +U 727 ; WX 602 ; N uni02D7 ; G 628 +U 728 ; WX 602 ; N breve ; G 629 +U 729 ; WX 602 ; N dotaccent ; G 630 +U 730 ; WX 602 ; N ring ; G 631 +U 731 ; WX 602 ; N ogonek ; G 632 +U 732 ; WX 602 ; N tilde ; G 633 +U 733 ; WX 602 ; N hungarumlaut ; G 634 +U 734 ; WX 602 ; N uni02DE ; G 635 +U 736 ; WX 602 ; N uni02E0 ; G 636 +U 737 ; WX 602 ; N uni02E1 ; G 637 +U 738 ; WX 602 ; N uni02E2 ; G 638 +U 739 ; WX 602 ; N uni02E3 ; G 639 +U 740 ; WX 602 ; N uni02E4 ; G 640 +U 741 ; WX 602 ; N uni02E5 ; G 641 +U 742 ; WX 602 ; N uni02E6 ; G 642 +U 743 ; WX 602 ; N uni02E7 ; G 643 +U 744 ; WX 602 ; N uni02E8 ; G 644 +U 745 ; WX 602 ; N uni02E9 ; G 645 +U 750 ; WX 602 ; N uni02EE ; G 646 +U 755 ; WX 602 ; N uni02F3 ; G 647 +U 768 ; WX 602 ; N gravecomb ; G 648 +U 769 ; WX 602 ; N acutecomb ; G 649 +U 770 ; WX 602 ; N uni0302 ; G 650 +U 771 ; WX 602 ; N tildecomb ; G 651 +U 772 ; WX 602 ; N uni0304 ; G 652 +U 773 ; WX 602 ; N uni0305 ; G 653 +U 774 ; WX 602 ; N uni0306 ; G 654 +U 775 ; WX 602 ; N uni0307 ; G 655 +U 776 ; WX 602 ; N uni0308 ; G 656 +U 777 ; WX 602 ; N hookabovecomb ; G 657 +U 778 ; WX 602 ; N uni030A ; G 658 +U 779 ; WX 602 ; N uni030B ; G 659 +U 780 ; WX 602 ; N uni030C ; G 660 +U 781 ; WX 602 ; N uni030D ; G 661 +U 782 ; WX 602 ; N uni030E ; G 662 +U 783 ; WX 602 ; N uni030F ; G 663 +U 784 ; WX 602 ; N uni0310 ; G 664 +U 785 ; WX 602 ; N uni0311 ; G 665 +U 786 ; WX 602 ; N uni0312 ; G 666 +U 787 ; WX 602 ; N uni0313 ; G 667 +U 788 ; WX 602 ; N uni0314 ; G 668 +U 789 ; WX 602 ; N uni0315 ; G 669 +U 790 ; WX 602 ; N uni0316 ; G 670 +U 791 ; WX 602 ; N uni0317 ; G 671 +U 792 ; WX 602 ; N uni0318 ; G 672 +U 793 ; WX 602 ; N uni0319 ; G 673 +U 794 ; WX 602 ; N uni031A ; G 674 +U 795 ; WX 602 ; N uni031B ; G 675 +U 796 ; WX 602 ; N uni031C ; G 676 +U 797 ; WX 602 ; N uni031D ; G 677 +U 798 ; WX 602 ; N uni031E ; G 678 +U 799 ; WX 602 ; N uni031F ; G 679 +U 800 ; WX 602 ; N uni0320 ; G 680 +U 801 ; WX 602 ; N uni0321 ; G 681 +U 802 ; WX 602 ; N uni0322 ; G 682 +U 803 ; WX 602 ; N dotbelowcomb ; G 683 +U 804 ; WX 602 ; N uni0324 ; G 684 +U 805 ; WX 602 ; N uni0325 ; G 685 +U 806 ; WX 602 ; N uni0326 ; G 686 +U 807 ; WX 602 ; N uni0327 ; G 687 +U 808 ; WX 602 ; N uni0328 ; G 688 +U 809 ; WX 602 ; N uni0329 ; G 689 +U 810 ; WX 602 ; N uni032A ; G 690 +U 811 ; WX 602 ; N uni032B ; G 691 +U 812 ; WX 602 ; N uni032C ; G 692 +U 813 ; WX 602 ; N uni032D ; G 693 +U 814 ; WX 602 ; N uni032E ; G 694 +U 815 ; WX 602 ; N uni032F ; G 695 +U 816 ; WX 602 ; N uni0330 ; G 696 +U 817 ; WX 602 ; N uni0331 ; G 697 +U 818 ; WX 602 ; N uni0332 ; G 698 +U 819 ; WX 602 ; N uni0333 ; G 699 +U 820 ; WX 602 ; N uni0334 ; G 700 +U 821 ; WX 602 ; N uni0335 ; G 701 +U 822 ; WX 602 ; N uni0336 ; G 702 +U 823 ; WX 602 ; N uni0337 ; G 703 +U 824 ; WX 602 ; N uni0338 ; G 704 +U 825 ; WX 602 ; N uni0339 ; G 705 +U 826 ; WX 602 ; N uni033A ; G 706 +U 827 ; WX 602 ; N uni033B ; G 707 +U 828 ; WX 602 ; N uni033C ; G 708 +U 829 ; WX 602 ; N uni033D ; G 709 +U 830 ; WX 602 ; N uni033E ; G 710 +U 831 ; WX 602 ; N uni033F ; G 711 +U 835 ; WX 602 ; N uni0343 ; G 712 +U 856 ; WX 602 ; N uni0358 ; G 713 +U 865 ; WX 602 ; N uni0361 ; G 714 +U 884 ; WX 602 ; N uni0374 ; G 715 +U 885 ; WX 602 ; N uni0375 ; G 716 +U 886 ; WX 602 ; N uni0376 ; G 717 +U 887 ; WX 602 ; N uni0377 ; G 718 +U 890 ; WX 602 ; N uni037A ; G 719 +U 891 ; WX 602 ; N uni037B ; G 720 +U 892 ; WX 602 ; N uni037C ; G 721 +U 893 ; WX 602 ; N uni037D ; G 722 +U 894 ; WX 602 ; N uni037E ; G 723 +U 895 ; WX 602 ; N uni037F ; G 724 +U 900 ; WX 602 ; N tonos ; G 725 +U 901 ; WX 602 ; N dieresistonos ; G 726 +U 902 ; WX 602 ; N Alphatonos ; G 727 +U 903 ; WX 602 ; N anoteleia ; G 728 +U 904 ; WX 602 ; N Epsilontonos ; G 729 +U 905 ; WX 602 ; N Etatonos ; G 730 +U 906 ; WX 602 ; N Iotatonos ; G 731 +U 908 ; WX 602 ; N Omicrontonos ; G 732 +U 910 ; WX 602 ; N Upsilontonos ; G 733 +U 911 ; WX 602 ; N Omegatonos ; G 734 +U 912 ; WX 602 ; N iotadieresistonos ; G 735 +U 913 ; WX 602 ; N Alpha ; G 736 +U 914 ; WX 602 ; N Beta ; G 737 +U 915 ; WX 602 ; N Gamma ; G 738 +U 916 ; WX 602 ; N uni0394 ; G 739 +U 917 ; WX 602 ; N Epsilon ; G 740 +U 918 ; WX 602 ; N Zeta ; G 741 +U 919 ; WX 602 ; N Eta ; G 742 +U 920 ; WX 602 ; N Theta ; G 743 +U 921 ; WX 602 ; N Iota ; G 744 +U 922 ; WX 602 ; N Kappa ; G 745 +U 923 ; WX 602 ; N Lambda ; G 746 +U 924 ; WX 602 ; N Mu ; G 747 +U 925 ; WX 602 ; N Nu ; G 748 +U 926 ; WX 602 ; N Xi ; G 749 +U 927 ; WX 602 ; N Omicron ; G 750 +U 928 ; WX 602 ; N Pi ; G 751 +U 929 ; WX 602 ; N Rho ; G 752 +U 931 ; WX 602 ; N Sigma ; G 753 +U 932 ; WX 602 ; N Tau ; G 754 +U 933 ; WX 602 ; N Upsilon ; G 755 +U 934 ; WX 602 ; N Phi ; G 756 +U 935 ; WX 602 ; N Chi ; G 757 +U 936 ; WX 602 ; N Psi ; G 758 +U 937 ; WX 602 ; N Omega ; G 759 +U 938 ; WX 602 ; N Iotadieresis ; G 760 +U 939 ; WX 602 ; N Upsilondieresis ; G 761 +U 940 ; WX 602 ; N alphatonos ; G 762 +U 941 ; WX 602 ; N epsilontonos ; G 763 +U 942 ; WX 602 ; N etatonos ; G 764 +U 943 ; WX 602 ; N iotatonos ; G 765 +U 944 ; WX 602 ; N upsilondieresistonos ; G 766 +U 945 ; WX 602 ; N alpha ; G 767 +U 946 ; WX 602 ; N beta ; G 768 +U 947 ; WX 602 ; N gamma ; G 769 +U 948 ; WX 602 ; N delta ; G 770 +U 949 ; WX 602 ; N epsilon ; G 771 +U 950 ; WX 602 ; N zeta ; G 772 +U 951 ; WX 602 ; N eta ; G 773 +U 952 ; WX 602 ; N theta ; G 774 +U 953 ; WX 602 ; N iota ; G 775 +U 954 ; WX 602 ; N kappa ; G 776 +U 955 ; WX 602 ; N lambda ; G 777 +U 956 ; WX 602 ; N uni03BC ; G 778 +U 957 ; WX 602 ; N nu ; G 779 +U 958 ; WX 602 ; N xi ; G 780 +U 959 ; WX 602 ; N omicron ; G 781 +U 960 ; WX 602 ; N pi ; G 782 +U 961 ; WX 602 ; N rho ; G 783 +U 962 ; WX 602 ; N sigma1 ; G 784 +U 963 ; WX 602 ; N sigma ; G 785 +U 964 ; WX 602 ; N tau ; G 786 +U 965 ; WX 602 ; N upsilon ; G 787 +U 966 ; WX 602 ; N phi ; G 788 +U 967 ; WX 602 ; N chi ; G 789 +U 968 ; WX 602 ; N psi ; G 790 +U 969 ; WX 602 ; N omega ; G 791 +U 970 ; WX 602 ; N iotadieresis ; G 792 +U 971 ; WX 602 ; N upsilondieresis ; G 793 +U 972 ; WX 602 ; N omicrontonos ; G 794 +U 973 ; WX 602 ; N upsilontonos ; G 795 +U 974 ; WX 602 ; N omegatonos ; G 796 +U 976 ; WX 602 ; N uni03D0 ; G 797 +U 977 ; WX 602 ; N theta1 ; G 798 +U 978 ; WX 602 ; N Upsilon1 ; G 799 +U 979 ; WX 602 ; N uni03D3 ; G 800 +U 980 ; WX 602 ; N uni03D4 ; G 801 +U 981 ; WX 602 ; N phi1 ; G 802 +U 982 ; WX 602 ; N omega1 ; G 803 +U 983 ; WX 602 ; N uni03D7 ; G 804 +U 984 ; WX 602 ; N uni03D8 ; G 805 +U 985 ; WX 602 ; N uni03D9 ; G 806 +U 986 ; WX 602 ; N uni03DA ; G 807 +U 987 ; WX 602 ; N uni03DB ; G 808 +U 988 ; WX 602 ; N uni03DC ; G 809 +U 989 ; WX 602 ; N uni03DD ; G 810 +U 990 ; WX 602 ; N uni03DE ; G 811 +U 991 ; WX 602 ; N uni03DF ; G 812 +U 992 ; WX 602 ; N uni03E0 ; G 813 +U 993 ; WX 602 ; N uni03E1 ; G 814 +U 1008 ; WX 602 ; N uni03F0 ; G 815 +U 1009 ; WX 602 ; N uni03F1 ; G 816 +U 1010 ; WX 602 ; N uni03F2 ; G 817 +U 1011 ; WX 602 ; N uni03F3 ; G 818 +U 1012 ; WX 602 ; N uni03F4 ; G 819 +U 1013 ; WX 602 ; N uni03F5 ; G 820 +U 1014 ; WX 602 ; N uni03F6 ; G 821 +U 1015 ; WX 602 ; N uni03F7 ; G 822 +U 1016 ; WX 602 ; N uni03F8 ; G 823 +U 1017 ; WX 602 ; N uni03F9 ; G 824 +U 1018 ; WX 602 ; N uni03FA ; G 825 +U 1019 ; WX 602 ; N uni03FB ; G 826 +U 1020 ; WX 602 ; N uni03FC ; G 827 +U 1021 ; WX 602 ; N uni03FD ; G 828 +U 1022 ; WX 602 ; N uni03FE ; G 829 +U 1023 ; WX 602 ; N uni03FF ; G 830 +U 1024 ; WX 602 ; N uni0400 ; G 831 +U 1025 ; WX 602 ; N uni0401 ; G 832 +U 1026 ; WX 602 ; N uni0402 ; G 833 +U 1027 ; WX 602 ; N uni0403 ; G 834 +U 1028 ; WX 602 ; N uni0404 ; G 835 +U 1029 ; WX 602 ; N uni0405 ; G 836 +U 1030 ; WX 602 ; N uni0406 ; G 837 +U 1031 ; WX 602 ; N uni0407 ; G 838 +U 1032 ; WX 602 ; N uni0408 ; G 839 +U 1033 ; WX 602 ; N uni0409 ; G 840 +U 1034 ; WX 602 ; N uni040A ; G 841 +U 1035 ; WX 602 ; N uni040B ; G 842 +U 1036 ; WX 602 ; N uni040C ; G 843 +U 1037 ; WX 602 ; N uni040D ; G 844 +U 1038 ; WX 602 ; N uni040E ; G 845 +U 1039 ; WX 602 ; N uni040F ; G 846 +U 1040 ; WX 602 ; N uni0410 ; G 847 +U 1041 ; WX 602 ; N uni0411 ; G 848 +U 1042 ; WX 602 ; N uni0412 ; G 849 +U 1043 ; WX 602 ; N uni0413 ; G 850 +U 1044 ; WX 602 ; N uni0414 ; G 851 +U 1045 ; WX 602 ; N uni0415 ; G 852 +U 1046 ; WX 602 ; N uni0416 ; G 853 +U 1047 ; WX 602 ; N uni0417 ; G 854 +U 1048 ; WX 602 ; N uni0418 ; G 855 +U 1049 ; WX 602 ; N uni0419 ; G 856 +U 1050 ; WX 602 ; N uni041A ; G 857 +U 1051 ; WX 602 ; N uni041B ; G 858 +U 1052 ; WX 602 ; N uni041C ; G 859 +U 1053 ; WX 602 ; N uni041D ; G 860 +U 1054 ; WX 602 ; N uni041E ; G 861 +U 1055 ; WX 602 ; N uni041F ; G 862 +U 1056 ; WX 602 ; N uni0420 ; G 863 +U 1057 ; WX 602 ; N uni0421 ; G 864 +U 1058 ; WX 602 ; N uni0422 ; G 865 +U 1059 ; WX 602 ; N uni0423 ; G 866 +U 1060 ; WX 602 ; N uni0424 ; G 867 +U 1061 ; WX 602 ; N uni0425 ; G 868 +U 1062 ; WX 602 ; N uni0426 ; G 869 +U 1063 ; WX 602 ; N uni0427 ; G 870 +U 1064 ; WX 602 ; N uni0428 ; G 871 +U 1065 ; WX 602 ; N uni0429 ; G 872 +U 1066 ; WX 602 ; N uni042A ; G 873 +U 1067 ; WX 602 ; N uni042B ; G 874 +U 1068 ; WX 602 ; N uni042C ; G 875 +U 1069 ; WX 602 ; N uni042D ; G 876 +U 1070 ; WX 602 ; N uni042E ; G 877 +U 1071 ; WX 602 ; N uni042F ; G 878 +U 1072 ; WX 602 ; N uni0430 ; G 879 +U 1073 ; WX 602 ; N uni0431 ; G 880 +U 1074 ; WX 602 ; N uni0432 ; G 881 +U 1075 ; WX 602 ; N uni0433 ; G 882 +U 1076 ; WX 602 ; N uni0434 ; G 883 +U 1077 ; WX 602 ; N uni0435 ; G 884 +U 1078 ; WX 602 ; N uni0436 ; G 885 +U 1079 ; WX 602 ; N uni0437 ; G 886 +U 1080 ; WX 602 ; N uni0438 ; G 887 +U 1081 ; WX 602 ; N uni0439 ; G 888 +U 1082 ; WX 602 ; N uni043A ; G 889 +U 1083 ; WX 602 ; N uni043B ; G 890 +U 1084 ; WX 602 ; N uni043C ; G 891 +U 1085 ; WX 602 ; N uni043D ; G 892 +U 1086 ; WX 602 ; N uni043E ; G 893 +U 1087 ; WX 602 ; N uni043F ; G 894 +U 1088 ; WX 602 ; N uni0440 ; G 895 +U 1089 ; WX 602 ; N uni0441 ; G 896 +U 1090 ; WX 602 ; N uni0442 ; G 897 +U 1091 ; WX 602 ; N uni0443 ; G 898 +U 1092 ; WX 602 ; N uni0444 ; G 899 +U 1093 ; WX 602 ; N uni0445 ; G 900 +U 1094 ; WX 602 ; N uni0446 ; G 901 +U 1095 ; WX 602 ; N uni0447 ; G 902 +U 1096 ; WX 602 ; N uni0448 ; G 903 +U 1097 ; WX 602 ; N uni0449 ; G 904 +U 1098 ; WX 602 ; N uni044A ; G 905 +U 1099 ; WX 602 ; N uni044B ; G 906 +U 1100 ; WX 602 ; N uni044C ; G 907 +U 1101 ; WX 602 ; N uni044D ; G 908 +U 1102 ; WX 602 ; N uni044E ; G 909 +U 1103 ; WX 602 ; N uni044F ; G 910 +U 1104 ; WX 602 ; N uni0450 ; G 911 +U 1105 ; WX 602 ; N uni0451 ; G 912 +U 1106 ; WX 602 ; N uni0452 ; G 913 +U 1107 ; WX 602 ; N uni0453 ; G 914 +U 1108 ; WX 602 ; N uni0454 ; G 915 +U 1109 ; WX 602 ; N uni0455 ; G 916 +U 1110 ; WX 602 ; N uni0456 ; G 917 +U 1111 ; WX 602 ; N uni0457 ; G 918 +U 1112 ; WX 602 ; N uni0458 ; G 919 +U 1113 ; WX 602 ; N uni0459 ; G 920 +U 1114 ; WX 602 ; N uni045A ; G 921 +U 1115 ; WX 602 ; N uni045B ; G 922 +U 1116 ; WX 602 ; N uni045C ; G 923 +U 1117 ; WX 602 ; N uni045D ; G 924 +U 1118 ; WX 602 ; N uni045E ; G 925 +U 1119 ; WX 602 ; N uni045F ; G 926 +U 1122 ; WX 602 ; N uni0462 ; G 927 +U 1123 ; WX 602 ; N uni0463 ; G 928 +U 1138 ; WX 602 ; N uni0472 ; G 929 +U 1139 ; WX 602 ; N uni0473 ; G 930 +U 1168 ; WX 602 ; N uni0490 ; G 931 +U 1169 ; WX 602 ; N uni0491 ; G 932 +U 1170 ; WX 602 ; N uni0492 ; G 933 +U 1171 ; WX 602 ; N uni0493 ; G 934 +U 1172 ; WX 602 ; N uni0494 ; G 935 +U 1173 ; WX 602 ; N uni0495 ; G 936 +U 1174 ; WX 602 ; N uni0496 ; G 937 +U 1175 ; WX 602 ; N uni0497 ; G 938 +U 1176 ; WX 602 ; N uni0498 ; G 939 +U 1177 ; WX 602 ; N uni0499 ; G 940 +U 1178 ; WX 602 ; N uni049A ; G 941 +U 1179 ; WX 602 ; N uni049B ; G 942 +U 1186 ; WX 602 ; N uni04A2 ; G 943 +U 1187 ; WX 602 ; N uni04A3 ; G 944 +U 1188 ; WX 602 ; N uni04A4 ; G 945 +U 1189 ; WX 602 ; N uni04A5 ; G 946 +U 1194 ; WX 602 ; N uni04AA ; G 947 +U 1195 ; WX 602 ; N uni04AB ; G 948 +U 1196 ; WX 602 ; N uni04AC ; G 949 +U 1197 ; WX 602 ; N uni04AD ; G 950 +U 1198 ; WX 602 ; N uni04AE ; G 951 +U 1199 ; WX 602 ; N uni04AF ; G 952 +U 1200 ; WX 602 ; N uni04B0 ; G 953 +U 1201 ; WX 602 ; N uni04B1 ; G 954 +U 1202 ; WX 602 ; N uni04B2 ; G 955 +U 1203 ; WX 602 ; N uni04B3 ; G 956 +U 1210 ; WX 602 ; N uni04BA ; G 957 +U 1211 ; WX 602 ; N uni04BB ; G 958 +U 1216 ; WX 602 ; N uni04C0 ; G 959 +U 1217 ; WX 602 ; N uni04C1 ; G 960 +U 1218 ; WX 602 ; N uni04C2 ; G 961 +U 1219 ; WX 602 ; N uni04C3 ; G 962 +U 1220 ; WX 602 ; N uni04C4 ; G 963 +U 1223 ; WX 602 ; N uni04C7 ; G 964 +U 1224 ; WX 602 ; N uni04C8 ; G 965 +U 1227 ; WX 602 ; N uni04CB ; G 966 +U 1228 ; WX 602 ; N uni04CC ; G 967 +U 1231 ; WX 602 ; N uni04CF ; G 968 +U 1232 ; WX 602 ; N uni04D0 ; G 969 +U 1233 ; WX 602 ; N uni04D1 ; G 970 +U 1234 ; WX 602 ; N uni04D2 ; G 971 +U 1235 ; WX 602 ; N uni04D3 ; G 972 +U 1236 ; WX 602 ; N uni04D4 ; G 973 +U 1237 ; WX 602 ; N uni04D5 ; G 974 +U 1238 ; WX 602 ; N uni04D6 ; G 975 +U 1239 ; WX 602 ; N uni04D7 ; G 976 +U 1240 ; WX 602 ; N uni04D8 ; G 977 +U 1241 ; WX 602 ; N uni04D9 ; G 978 +U 1242 ; WX 602 ; N uni04DA ; G 979 +U 1243 ; WX 602 ; N uni04DB ; G 980 +U 1244 ; WX 602 ; N uni04DC ; G 981 +U 1245 ; WX 602 ; N uni04DD ; G 982 +U 1246 ; WX 602 ; N uni04DE ; G 983 +U 1247 ; WX 602 ; N uni04DF ; G 984 +U 1248 ; WX 602 ; N uni04E0 ; G 985 +U 1249 ; WX 602 ; N uni04E1 ; G 986 +U 1250 ; WX 602 ; N uni04E2 ; G 987 +U 1251 ; WX 602 ; N uni04E3 ; G 988 +U 1252 ; WX 602 ; N uni04E4 ; G 989 +U 1253 ; WX 602 ; N uni04E5 ; G 990 +U 1254 ; WX 602 ; N uni04E6 ; G 991 +U 1255 ; WX 602 ; N uni04E7 ; G 992 +U 1256 ; WX 602 ; N uni04E8 ; G 993 +U 1257 ; WX 602 ; N uni04E9 ; G 994 +U 1258 ; WX 602 ; N uni04EA ; G 995 +U 1259 ; WX 602 ; N uni04EB ; G 996 +U 1260 ; WX 602 ; N uni04EC ; G 997 +U 1261 ; WX 602 ; N uni04ED ; G 998 +U 1262 ; WX 602 ; N uni04EE ; G 999 +U 1263 ; WX 602 ; N uni04EF ; G 1000 +U 1264 ; WX 602 ; N uni04F0 ; G 1001 +U 1265 ; WX 602 ; N uni04F1 ; G 1002 +U 1266 ; WX 602 ; N uni04F2 ; G 1003 +U 1267 ; WX 602 ; N uni04F3 ; G 1004 +U 1268 ; WX 602 ; N uni04F4 ; G 1005 +U 1269 ; WX 602 ; N uni04F5 ; G 1006 +U 1270 ; WX 602 ; N uni04F6 ; G 1007 +U 1271 ; WX 602 ; N uni04F7 ; G 1008 +U 1272 ; WX 602 ; N uni04F8 ; G 1009 +U 1273 ; WX 602 ; N uni04F9 ; G 1010 +U 1296 ; WX 602 ; N uni0510 ; G 1011 +U 1297 ; WX 602 ; N uni0511 ; G 1012 +U 1306 ; WX 602 ; N uni051A ; G 1013 +U 1307 ; WX 602 ; N uni051B ; G 1014 +U 1308 ; WX 602 ; N uni051C ; G 1015 +U 1309 ; WX 602 ; N uni051D ; G 1016 +U 1329 ; WX 602 ; N uni0531 ; G 1017 +U 1330 ; WX 602 ; N uni0532 ; G 1018 +U 1331 ; WX 602 ; N uni0533 ; G 1019 +U 1332 ; WX 602 ; N uni0534 ; G 1020 +U 1333 ; WX 602 ; N uni0535 ; G 1021 +U 1334 ; WX 602 ; N uni0536 ; G 1022 +U 1335 ; WX 602 ; N uni0537 ; G 1023 +U 1336 ; WX 602 ; N uni0538 ; G 1024 +U 1337 ; WX 602 ; N uni0539 ; G 1025 +U 1338 ; WX 602 ; N uni053A ; G 1026 +U 1339 ; WX 602 ; N uni053B ; G 1027 +U 1340 ; WX 602 ; N uni053C ; G 1028 +U 1341 ; WX 602 ; N uni053D ; G 1029 +U 1342 ; WX 602 ; N uni053E ; G 1030 +U 1343 ; WX 602 ; N uni053F ; G 1031 +U 1344 ; WX 602 ; N uni0540 ; G 1032 +U 1345 ; WX 602 ; N uni0541 ; G 1033 +U 1346 ; WX 602 ; N uni0542 ; G 1034 +U 1347 ; WX 602 ; N uni0543 ; G 1035 +U 1348 ; WX 602 ; N uni0544 ; G 1036 +U 1349 ; WX 602 ; N uni0545 ; G 1037 +U 1350 ; WX 602 ; N uni0546 ; G 1038 +U 1351 ; WX 602 ; N uni0547 ; G 1039 +U 1352 ; WX 602 ; N uni0548 ; G 1040 +U 1353 ; WX 602 ; N uni0549 ; G 1041 +U 1354 ; WX 602 ; N uni054A ; G 1042 +U 1355 ; WX 602 ; N uni054B ; G 1043 +U 1356 ; WX 602 ; N uni054C ; G 1044 +U 1357 ; WX 602 ; N uni054D ; G 1045 +U 1358 ; WX 602 ; N uni054E ; G 1046 +U 1359 ; WX 602 ; N uni054F ; G 1047 +U 1360 ; WX 602 ; N uni0550 ; G 1048 +U 1361 ; WX 602 ; N uni0551 ; G 1049 +U 1362 ; WX 602 ; N uni0552 ; G 1050 +U 1363 ; WX 602 ; N uni0553 ; G 1051 +U 1364 ; WX 602 ; N uni0554 ; G 1052 +U 1365 ; WX 602 ; N uni0555 ; G 1053 +U 1366 ; WX 602 ; N uni0556 ; G 1054 +U 1369 ; WX 602 ; N uni0559 ; G 1055 +U 1370 ; WX 602 ; N uni055A ; G 1056 +U 1371 ; WX 602 ; N uni055B ; G 1057 +U 1372 ; WX 602 ; N uni055C ; G 1058 +U 1373 ; WX 602 ; N uni055D ; G 1059 +U 1374 ; WX 602 ; N uni055E ; G 1060 +U 1375 ; WX 602 ; N uni055F ; G 1061 +U 1377 ; WX 602 ; N uni0561 ; G 1062 +U 1378 ; WX 602 ; N uni0562 ; G 1063 +U 1379 ; WX 602 ; N uni0563 ; G 1064 +U 1380 ; WX 602 ; N uni0564 ; G 1065 +U 1381 ; WX 602 ; N uni0565 ; G 1066 +U 1382 ; WX 602 ; N uni0566 ; G 1067 +U 1383 ; WX 602 ; N uni0567 ; G 1068 +U 1384 ; WX 602 ; N uni0568 ; G 1069 +U 1385 ; WX 602 ; N uni0569 ; G 1070 +U 1386 ; WX 602 ; N uni056A ; G 1071 +U 1387 ; WX 602 ; N uni056B ; G 1072 +U 1388 ; WX 602 ; N uni056C ; G 1073 +U 1389 ; WX 602 ; N uni056D ; G 1074 +U 1390 ; WX 602 ; N uni056E ; G 1075 +U 1391 ; WX 602 ; N uni056F ; G 1076 +U 1392 ; WX 602 ; N uni0570 ; G 1077 +U 1393 ; WX 602 ; N uni0571 ; G 1078 +U 1394 ; WX 602 ; N uni0572 ; G 1079 +U 1395 ; WX 602 ; N uni0573 ; G 1080 +U 1396 ; WX 602 ; N uni0574 ; G 1081 +U 1397 ; WX 602 ; N uni0575 ; G 1082 +U 1398 ; WX 602 ; N uni0576 ; G 1083 +U 1399 ; WX 602 ; N uni0577 ; G 1084 +U 1400 ; WX 602 ; N uni0578 ; G 1085 +U 1401 ; WX 602 ; N uni0579 ; G 1086 +U 1402 ; WX 602 ; N uni057A ; G 1087 +U 1403 ; WX 602 ; N uni057B ; G 1088 +U 1404 ; WX 602 ; N uni057C ; G 1089 +U 1405 ; WX 602 ; N uni057D ; G 1090 +U 1406 ; WX 602 ; N uni057E ; G 1091 +U 1407 ; WX 602 ; N uni057F ; G 1092 +U 1408 ; WX 602 ; N uni0580 ; G 1093 +U 1409 ; WX 602 ; N uni0581 ; G 1094 +U 1410 ; WX 602 ; N uni0582 ; G 1095 +U 1411 ; WX 602 ; N uni0583 ; G 1096 +U 1412 ; WX 602 ; N uni0584 ; G 1097 +U 1413 ; WX 602 ; N uni0585 ; G 1098 +U 1414 ; WX 602 ; N uni0586 ; G 1099 +U 1415 ; WX 602 ; N uni0587 ; G 1100 +U 1417 ; WX 602 ; N uni0589 ; G 1101 +U 1418 ; WX 602 ; N uni058A ; G 1102 +U 1542 ; WX 602 ; N uni0606 ; G 1103 +U 1543 ; WX 602 ; N uni0607 ; G 1104 +U 1545 ; WX 602 ; N uni0609 ; G 1105 +U 1546 ; WX 602 ; N uni060A ; G 1106 +U 1548 ; WX 602 ; N uni060C ; G 1107 +U 1557 ; WX 602 ; N uni0615 ; G 1108 +U 1563 ; WX 602 ; N uni061B ; G 1109 +U 1567 ; WX 602 ; N uni061F ; G 1110 +U 1569 ; WX 602 ; N uni0621 ; G 1111 +U 1570 ; WX 602 ; N uni0622 ; G 1112 +U 1571 ; WX 602 ; N uni0623 ; G 1113 +U 1572 ; WX 602 ; N uni0624 ; G 1114 +U 1573 ; WX 602 ; N uni0625 ; G 1115 +U 1574 ; WX 602 ; N uni0626 ; G 1116 +U 1575 ; WX 602 ; N uni0627 ; G 1117 +U 1576 ; WX 602 ; N uni0628 ; G 1118 +U 1577 ; WX 602 ; N uni0629 ; G 1119 +U 1578 ; WX 602 ; N uni062A ; G 1120 +U 1579 ; WX 602 ; N uni062B ; G 1121 +U 1580 ; WX 602 ; N uni062C ; G 1122 +U 1581 ; WX 602 ; N uni062D ; G 1123 +U 1582 ; WX 602 ; N uni062E ; G 1124 +U 1583 ; WX 602 ; N uni062F ; G 1125 +U 1584 ; WX 602 ; N uni0630 ; G 1126 +U 1585 ; WX 602 ; N uni0631 ; G 1127 +U 1586 ; WX 602 ; N uni0632 ; G 1128 +U 1587 ; WX 602 ; N uni0633 ; G 1129 +U 1588 ; WX 602 ; N uni0634 ; G 1130 +U 1589 ; WX 602 ; N uni0635 ; G 1131 +U 1590 ; WX 602 ; N uni0636 ; G 1132 +U 1591 ; WX 602 ; N uni0637 ; G 1133 +U 1592 ; WX 602 ; N uni0638 ; G 1134 +U 1593 ; WX 602 ; N uni0639 ; G 1135 +U 1594 ; WX 602 ; N uni063A ; G 1136 +U 1600 ; WX 602 ; N uni0640 ; G 1137 +U 1601 ; WX 602 ; N uni0641 ; G 1138 +U 1602 ; WX 602 ; N uni0642 ; G 1139 +U 1603 ; WX 602 ; N uni0643 ; G 1140 +U 1604 ; WX 602 ; N uni0644 ; G 1141 +U 1605 ; WX 602 ; N uni0645 ; G 1142 +U 1606 ; WX 602 ; N uni0646 ; G 1143 +U 1607 ; WX 602 ; N uni0647 ; G 1144 +U 1608 ; WX 602 ; N uni0648 ; G 1145 +U 1609 ; WX 602 ; N uni0649 ; G 1146 +U 1610 ; WX 602 ; N uni064A ; G 1147 +U 1611 ; WX 602 ; N uni064B ; G 1148 +U 1612 ; WX 602 ; N uni064C ; G 1149 +U 1613 ; WX 602 ; N uni064D ; G 1150 +U 1614 ; WX 602 ; N uni064E ; G 1151 +U 1615 ; WX 602 ; N uni064F ; G 1152 +U 1616 ; WX 602 ; N uni0650 ; G 1153 +U 1617 ; WX 602 ; N uni0651 ; G 1154 +U 1618 ; WX 602 ; N uni0652 ; G 1155 +U 1619 ; WX 602 ; N uni0653 ; G 1156 +U 1620 ; WX 602 ; N uni0654 ; G 1157 +U 1621 ; WX 602 ; N uni0655 ; G 1158 +U 1626 ; WX 602 ; N uni065A ; G 1159 +U 1632 ; WX 602 ; N uni0660 ; G 1160 +U 1633 ; WX 602 ; N uni0661 ; G 1161 +U 1634 ; WX 602 ; N uni0662 ; G 1162 +U 1635 ; WX 602 ; N uni0663 ; G 1163 +U 1636 ; WX 602 ; N uni0664 ; G 1164 +U 1637 ; WX 602 ; N uni0665 ; G 1165 +U 1638 ; WX 602 ; N uni0666 ; G 1166 +U 1639 ; WX 602 ; N uni0667 ; G 1167 +U 1640 ; WX 602 ; N uni0668 ; G 1168 +U 1641 ; WX 602 ; N uni0669 ; G 1169 +U 1642 ; WX 602 ; N uni066A ; G 1170 +U 1643 ; WX 602 ; N uni066B ; G 1171 +U 1644 ; WX 602 ; N uni066C ; G 1172 +U 1645 ; WX 602 ; N uni066D ; G 1173 +U 1652 ; WX 602 ; N uni0674 ; G 1174 +U 1657 ; WX 602 ; N uni0679 ; G 1175 +U 1658 ; WX 602 ; N uni067A ; G 1176 +U 1659 ; WX 602 ; N uni067B ; G 1177 +U 1662 ; WX 602 ; N uni067E ; G 1178 +U 1663 ; WX 602 ; N uni067F ; G 1179 +U 1664 ; WX 602 ; N uni0680 ; G 1180 +U 1667 ; WX 602 ; N uni0683 ; G 1181 +U 1668 ; WX 602 ; N uni0684 ; G 1182 +U 1670 ; WX 602 ; N uni0686 ; G 1183 +U 1671 ; WX 602 ; N uni0687 ; G 1184 +U 1681 ; WX 602 ; N uni0691 ; G 1185 +U 1688 ; WX 602 ; N uni0698 ; G 1186 +U 1700 ; WX 602 ; N uni06A4 ; G 1187 +U 1705 ; WX 602 ; N uni06A9 ; G 1188 +U 1711 ; WX 602 ; N uni06AF ; G 1189 +U 1726 ; WX 602 ; N uni06BE ; G 1190 +U 1740 ; WX 602 ; N uni06CC ; G 1191 +U 1776 ; WX 602 ; N uni06F0 ; G 1192 +U 1777 ; WX 602 ; N uni06F1 ; G 1193 +U 1778 ; WX 602 ; N uni06F2 ; G 1194 +U 1779 ; WX 602 ; N uni06F3 ; G 1195 +U 1780 ; WX 602 ; N uni06F4 ; G 1196 +U 1781 ; WX 602 ; N uni06F5 ; G 1197 +U 1782 ; WX 602 ; N uni06F6 ; G 1198 +U 1783 ; WX 602 ; N uni06F7 ; G 1199 +U 1784 ; WX 602 ; N uni06F8 ; G 1200 +U 1785 ; WX 602 ; N uni06F9 ; G 1201 +U 3647 ; WX 602 ; N uni0E3F ; G 1202 +U 3713 ; WX 602 ; N uni0E81 ; G 1203 +U 3714 ; WX 602 ; N uni0E82 ; G 1204 +U 3716 ; WX 602 ; N uni0E84 ; G 1205 +U 3719 ; WX 602 ; N uni0E87 ; G 1206 +U 3720 ; WX 602 ; N uni0E88 ; G 1207 +U 3722 ; WX 602 ; N uni0E8A ; G 1208 +U 3725 ; WX 602 ; N uni0E8D ; G 1209 +U 3732 ; WX 602 ; N uni0E94 ; G 1210 +U 3733 ; WX 602 ; N uni0E95 ; G 1211 +U 3734 ; WX 602 ; N uni0E96 ; G 1212 +U 3735 ; WX 602 ; N uni0E97 ; G 1213 +U 3737 ; WX 602 ; N uni0E99 ; G 1214 +U 3738 ; WX 602 ; N uni0E9A ; G 1215 +U 3739 ; WX 602 ; N uni0E9B ; G 1216 +U 3740 ; WX 602 ; N uni0E9C ; G 1217 +U 3741 ; WX 602 ; N uni0E9D ; G 1218 +U 3742 ; WX 602 ; N uni0E9E ; G 1219 +U 3743 ; WX 602 ; N uni0E9F ; G 1220 +U 3745 ; WX 602 ; N uni0EA1 ; G 1221 +U 3746 ; WX 602 ; N uni0EA2 ; G 1222 +U 3747 ; WX 602 ; N uni0EA3 ; G 1223 +U 3749 ; WX 602 ; N uni0EA5 ; G 1224 +U 3751 ; WX 602 ; N uni0EA7 ; G 1225 +U 3754 ; WX 602 ; N uni0EAA ; G 1226 +U 3755 ; WX 602 ; N uni0EAB ; G 1227 +U 3757 ; WX 602 ; N uni0EAD ; G 1228 +U 3758 ; WX 602 ; N uni0EAE ; G 1229 +U 3759 ; WX 602 ; N uni0EAF ; G 1230 +U 3760 ; WX 602 ; N uni0EB0 ; G 1231 +U 3761 ; WX 602 ; N uni0EB1 ; G 1232 +U 3762 ; WX 602 ; N uni0EB2 ; G 1233 +U 3763 ; WX 602 ; N uni0EB3 ; G 1234 +U 3764 ; WX 602 ; N uni0EB4 ; G 1235 +U 3765 ; WX 602 ; N uni0EB5 ; G 1236 +U 3766 ; WX 602 ; N uni0EB6 ; G 1237 +U 3767 ; WX 602 ; N uni0EB7 ; G 1238 +U 3768 ; WX 602 ; N uni0EB8 ; G 1239 +U 3769 ; WX 602 ; N uni0EB9 ; G 1240 +U 3771 ; WX 602 ; N uni0EBB ; G 1241 +U 3772 ; WX 602 ; N uni0EBC ; G 1242 +U 3784 ; WX 602 ; N uni0EC8 ; G 1243 +U 3785 ; WX 602 ; N uni0EC9 ; G 1244 +U 3786 ; WX 602 ; N uni0ECA ; G 1245 +U 3787 ; WX 602 ; N uni0ECB ; G 1246 +U 3788 ; WX 602 ; N uni0ECC ; G 1247 +U 3789 ; WX 602 ; N uni0ECD ; G 1248 +U 4304 ; WX 602 ; N uni10D0 ; G 1249 +U 4305 ; WX 602 ; N uni10D1 ; G 1250 +U 4306 ; WX 602 ; N uni10D2 ; G 1251 +U 4307 ; WX 602 ; N uni10D3 ; G 1252 +U 4308 ; WX 602 ; N uni10D4 ; G 1253 +U 4309 ; WX 602 ; N uni10D5 ; G 1254 +U 4310 ; WX 602 ; N uni10D6 ; G 1255 +U 4311 ; WX 602 ; N uni10D7 ; G 1256 +U 4312 ; WX 602 ; N uni10D8 ; G 1257 +U 4313 ; WX 602 ; N uni10D9 ; G 1258 +U 4314 ; WX 602 ; N uni10DA ; G 1259 +U 4315 ; WX 602 ; N uni10DB ; G 1260 +U 4316 ; WX 602 ; N uni10DC ; G 1261 +U 4317 ; WX 602 ; N uni10DD ; G 1262 +U 4318 ; WX 602 ; N uni10DE ; G 1263 +U 4319 ; WX 602 ; N uni10DF ; G 1264 +U 4320 ; WX 602 ; N uni10E0 ; G 1265 +U 4321 ; WX 602 ; N uni10E1 ; G 1266 +U 4322 ; WX 602 ; N uni10E2 ; G 1267 +U 4323 ; WX 602 ; N uni10E3 ; G 1268 +U 4324 ; WX 602 ; N uni10E4 ; G 1269 +U 4325 ; WX 602 ; N uni10E5 ; G 1270 +U 4326 ; WX 602 ; N uni10E6 ; G 1271 +U 4327 ; WX 602 ; N uni10E7 ; G 1272 +U 4328 ; WX 602 ; N uni10E8 ; G 1273 +U 4329 ; WX 602 ; N uni10E9 ; G 1274 +U 4330 ; WX 602 ; N uni10EA ; G 1275 +U 4331 ; WX 602 ; N uni10EB ; G 1276 +U 4332 ; WX 602 ; N uni10EC ; G 1277 +U 4333 ; WX 602 ; N uni10ED ; G 1278 +U 4334 ; WX 602 ; N uni10EE ; G 1279 +U 4335 ; WX 602 ; N uni10EF ; G 1280 +U 4336 ; WX 602 ; N uni10F0 ; G 1281 +U 4337 ; WX 602 ; N uni10F1 ; G 1282 +U 4338 ; WX 602 ; N uni10F2 ; G 1283 +U 4339 ; WX 602 ; N uni10F3 ; G 1284 +U 4340 ; WX 602 ; N uni10F4 ; G 1285 +U 4341 ; WX 602 ; N uni10F5 ; G 1286 +U 4342 ; WX 602 ; N uni10F6 ; G 1287 +U 4343 ; WX 602 ; N uni10F7 ; G 1288 +U 4344 ; WX 602 ; N uni10F8 ; G 1289 +U 4345 ; WX 602 ; N uni10F9 ; G 1290 +U 4346 ; WX 602 ; N uni10FA ; G 1291 +U 4347 ; WX 602 ; N uni10FB ; G 1292 +U 4348 ; WX 602 ; N uni10FC ; G 1293 +U 7426 ; WX 602 ; N uni1D02 ; G 1294 +U 7432 ; WX 602 ; N uni1D08 ; G 1295 +U 7433 ; WX 602 ; N uni1D09 ; G 1296 +U 7444 ; WX 602 ; N uni1D14 ; G 1297 +U 7446 ; WX 602 ; N uni1D16 ; G 1298 +U 7447 ; WX 602 ; N uni1D17 ; G 1299 +U 7453 ; WX 602 ; N uni1D1D ; G 1300 +U 7454 ; WX 602 ; N uni1D1E ; G 1301 +U 7455 ; WX 602 ; N uni1D1F ; G 1302 +U 7468 ; WX 602 ; N uni1D2C ; G 1303 +U 7469 ; WX 602 ; N uni1D2D ; G 1304 +U 7470 ; WX 602 ; N uni1D2E ; G 1305 +U 7472 ; WX 602 ; N uni1D30 ; G 1306 +U 7473 ; WX 602 ; N uni1D31 ; G 1307 +U 7474 ; WX 602 ; N uni1D32 ; G 1308 +U 7475 ; WX 602 ; N uni1D33 ; G 1309 +U 7476 ; WX 602 ; N uni1D34 ; G 1310 +U 7477 ; WX 602 ; N uni1D35 ; G 1311 +U 7478 ; WX 602 ; N uni1D36 ; G 1312 +U 7479 ; WX 602 ; N uni1D37 ; G 1313 +U 7480 ; WX 602 ; N uni1D38 ; G 1314 +U 7481 ; WX 602 ; N uni1D39 ; G 1315 +U 7482 ; WX 602 ; N uni1D3A ; G 1316 +U 7483 ; WX 602 ; N uni1D3B ; G 1317 +U 7484 ; WX 602 ; N uni1D3C ; G 1318 +U 7486 ; WX 602 ; N uni1D3E ; G 1319 +U 7487 ; WX 602 ; N uni1D3F ; G 1320 +U 7488 ; WX 602 ; N uni1D40 ; G 1321 +U 7489 ; WX 602 ; N uni1D41 ; G 1322 +U 7490 ; WX 602 ; N uni1D42 ; G 1323 +U 7491 ; WX 602 ; N uni1D43 ; G 1324 +U 7492 ; WX 602 ; N uni1D44 ; G 1325 +U 7493 ; WX 602 ; N uni1D45 ; G 1326 +U 7494 ; WX 602 ; N uni1D46 ; G 1327 +U 7495 ; WX 602 ; N uni1D47 ; G 1328 +U 7496 ; WX 602 ; N uni1D48 ; G 1329 +U 7497 ; WX 602 ; N uni1D49 ; G 1330 +U 7498 ; WX 602 ; N uni1D4A ; G 1331 +U 7499 ; WX 602 ; N uni1D4B ; G 1332 +U 7500 ; WX 602 ; N uni1D4C ; G 1333 +U 7501 ; WX 602 ; N uni1D4D ; G 1334 +U 7502 ; WX 602 ; N uni1D4E ; G 1335 +U 7503 ; WX 602 ; N uni1D4F ; G 1336 +U 7504 ; WX 602 ; N uni1D50 ; G 1337 +U 7505 ; WX 602 ; N uni1D51 ; G 1338 +U 7506 ; WX 602 ; N uni1D52 ; G 1339 +U 7507 ; WX 602 ; N uni1D53 ; G 1340 +U 7508 ; WX 602 ; N uni1D54 ; G 1341 +U 7509 ; WX 602 ; N uni1D55 ; G 1342 +U 7510 ; WX 602 ; N uni1D56 ; G 1343 +U 7511 ; WX 602 ; N uni1D57 ; G 1344 +U 7512 ; WX 602 ; N uni1D58 ; G 1345 +U 7513 ; WX 602 ; N uni1D59 ; G 1346 +U 7514 ; WX 602 ; N uni1D5A ; G 1347 +U 7515 ; WX 602 ; N uni1D5B ; G 1348 +U 7522 ; WX 602 ; N uni1D62 ; G 1349 +U 7523 ; WX 602 ; N uni1D63 ; G 1350 +U 7524 ; WX 602 ; N uni1D64 ; G 1351 +U 7525 ; WX 602 ; N uni1D65 ; G 1352 +U 7543 ; WX 602 ; N uni1D77 ; G 1353 +U 7544 ; WX 602 ; N uni1D78 ; G 1354 +U 7547 ; WX 602 ; N uni1D7B ; G 1355 +U 7557 ; WX 602 ; N uni1D85 ; G 1356 +U 7579 ; WX 602 ; N uni1D9B ; G 1357 +U 7580 ; WX 602 ; N uni1D9C ; G 1358 +U 7581 ; WX 602 ; N uni1D9D ; G 1359 +U 7582 ; WX 602 ; N uni1D9E ; G 1360 +U 7583 ; WX 602 ; N uni1D9F ; G 1361 +U 7584 ; WX 602 ; N uni1DA0 ; G 1362 +U 7585 ; WX 602 ; N uni1DA1 ; G 1363 +U 7586 ; WX 602 ; N uni1DA2 ; G 1364 +U 7587 ; WX 602 ; N uni1DA3 ; G 1365 +U 7588 ; WX 602 ; N uni1DA4 ; G 1366 +U 7589 ; WX 602 ; N uni1DA5 ; G 1367 +U 7590 ; WX 602 ; N uni1DA6 ; G 1368 +U 7591 ; WX 602 ; N uni1DA7 ; G 1369 +U 7592 ; WX 602 ; N uni1DA8 ; G 1370 +U 7593 ; WX 602 ; N uni1DA9 ; G 1371 +U 7594 ; WX 602 ; N uni1DAA ; G 1372 +U 7595 ; WX 602 ; N uni1DAB ; G 1373 +U 7596 ; WX 602 ; N uni1DAC ; G 1374 +U 7597 ; WX 602 ; N uni1DAD ; G 1375 +U 7598 ; WX 602 ; N uni1DAE ; G 1376 +U 7599 ; WX 602 ; N uni1DAF ; G 1377 +U 7600 ; WX 602 ; N uni1DB0 ; G 1378 +U 7601 ; WX 602 ; N uni1DB1 ; G 1379 +U 7602 ; WX 602 ; N uni1DB2 ; G 1380 +U 7603 ; WX 602 ; N uni1DB3 ; G 1381 +U 7604 ; WX 602 ; N uni1DB4 ; G 1382 +U 7605 ; WX 602 ; N uni1DB5 ; G 1383 +U 7606 ; WX 602 ; N uni1DB6 ; G 1384 +U 7607 ; WX 602 ; N uni1DB7 ; G 1385 +U 7609 ; WX 602 ; N uni1DB9 ; G 1386 +U 7610 ; WX 602 ; N uni1DBA ; G 1387 +U 7611 ; WX 602 ; N uni1DBB ; G 1388 +U 7612 ; WX 602 ; N uni1DBC ; G 1389 +U 7613 ; WX 602 ; N uni1DBD ; G 1390 +U 7614 ; WX 602 ; N uni1DBE ; G 1391 +U 7615 ; WX 602 ; N uni1DBF ; G 1392 +U 7680 ; WX 602 ; N uni1E00 ; G 1393 +U 7681 ; WX 602 ; N uni1E01 ; G 1394 +U 7682 ; WX 602 ; N uni1E02 ; G 1395 +U 7683 ; WX 602 ; N uni1E03 ; G 1396 +U 7684 ; WX 602 ; N uni1E04 ; G 1397 +U 7685 ; WX 602 ; N uni1E05 ; G 1398 +U 7686 ; WX 602 ; N uni1E06 ; G 1399 +U 7687 ; WX 602 ; N uni1E07 ; G 1400 +U 7688 ; WX 602 ; N uni1E08 ; G 1401 +U 7689 ; WX 602 ; N uni1E09 ; G 1402 +U 7690 ; WX 602 ; N uni1E0A ; G 1403 +U 7691 ; WX 602 ; N uni1E0B ; G 1404 +U 7692 ; WX 602 ; N uni1E0C ; G 1405 +U 7693 ; WX 602 ; N uni1E0D ; G 1406 +U 7694 ; WX 602 ; N uni1E0E ; G 1407 +U 7695 ; WX 602 ; N uni1E0F ; G 1408 +U 7696 ; WX 602 ; N uni1E10 ; G 1409 +U 7697 ; WX 602 ; N uni1E11 ; G 1410 +U 7698 ; WX 602 ; N uni1E12 ; G 1411 +U 7699 ; WX 602 ; N uni1E13 ; G 1412 +U 7704 ; WX 602 ; N uni1E18 ; G 1413 +U 7705 ; WX 602 ; N uni1E19 ; G 1414 +U 7706 ; WX 602 ; N uni1E1A ; G 1415 +U 7707 ; WX 602 ; N uni1E1B ; G 1416 +U 7708 ; WX 602 ; N uni1E1C ; G 1417 +U 7709 ; WX 602 ; N uni1E1D ; G 1418 +U 7710 ; WX 602 ; N uni1E1E ; G 1419 +U 7711 ; WX 602 ; N uni1E1F ; G 1420 +U 7712 ; WX 602 ; N uni1E20 ; G 1421 +U 7713 ; WX 602 ; N uni1E21 ; G 1422 +U 7714 ; WX 602 ; N uni1E22 ; G 1423 +U 7715 ; WX 602 ; N uni1E23 ; G 1424 +U 7716 ; WX 602 ; N uni1E24 ; G 1425 +U 7717 ; WX 602 ; N uni1E25 ; G 1426 +U 7718 ; WX 602 ; N uni1E26 ; G 1427 +U 7719 ; WX 602 ; N uni1E27 ; G 1428 +U 7720 ; WX 602 ; N uni1E28 ; G 1429 +U 7721 ; WX 602 ; N uni1E29 ; G 1430 +U 7722 ; WX 602 ; N uni1E2A ; G 1431 +U 7723 ; WX 602 ; N uni1E2B ; G 1432 +U 7724 ; WX 602 ; N uni1E2C ; G 1433 +U 7725 ; WX 602 ; N uni1E2D ; G 1434 +U 7728 ; WX 602 ; N uni1E30 ; G 1435 +U 7729 ; WX 602 ; N uni1E31 ; G 1436 +U 7730 ; WX 602 ; N uni1E32 ; G 1437 +U 7731 ; WX 602 ; N uni1E33 ; G 1438 +U 7732 ; WX 602 ; N uni1E34 ; G 1439 +U 7733 ; WX 602 ; N uni1E35 ; G 1440 +U 7734 ; WX 602 ; N uni1E36 ; G 1441 +U 7735 ; WX 602 ; N uni1E37 ; G 1442 +U 7736 ; WX 602 ; N uni1E38 ; G 1443 +U 7737 ; WX 602 ; N uni1E39 ; G 1444 +U 7738 ; WX 602 ; N uni1E3A ; G 1445 +U 7739 ; WX 602 ; N uni1E3B ; G 1446 +U 7740 ; WX 602 ; N uni1E3C ; G 1447 +U 7741 ; WX 602 ; N uni1E3D ; G 1448 +U 7742 ; WX 602 ; N uni1E3E ; G 1449 +U 7743 ; WX 602 ; N uni1E3F ; G 1450 +U 7744 ; WX 602 ; N uni1E40 ; G 1451 +U 7745 ; WX 602 ; N uni1E41 ; G 1452 +U 7746 ; WX 602 ; N uni1E42 ; G 1453 +U 7747 ; WX 602 ; N uni1E43 ; G 1454 +U 7748 ; WX 602 ; N uni1E44 ; G 1455 +U 7749 ; WX 602 ; N uni1E45 ; G 1456 +U 7750 ; WX 602 ; N uni1E46 ; G 1457 +U 7751 ; WX 602 ; N uni1E47 ; G 1458 +U 7752 ; WX 602 ; N uni1E48 ; G 1459 +U 7753 ; WX 602 ; N uni1E49 ; G 1460 +U 7754 ; WX 602 ; N uni1E4A ; G 1461 +U 7755 ; WX 602 ; N uni1E4B ; G 1462 +U 7756 ; WX 602 ; N uni1E4C ; G 1463 +U 7757 ; WX 602 ; N uni1E4D ; G 1464 +U 7764 ; WX 602 ; N uni1E54 ; G 1465 +U 7765 ; WX 602 ; N uni1E55 ; G 1466 +U 7766 ; WX 602 ; N uni1E56 ; G 1467 +U 7767 ; WX 602 ; N uni1E57 ; G 1468 +U 7768 ; WX 602 ; N uni1E58 ; G 1469 +U 7769 ; WX 602 ; N uni1E59 ; G 1470 +U 7770 ; WX 602 ; N uni1E5A ; G 1471 +U 7771 ; WX 602 ; N uni1E5B ; G 1472 +U 7772 ; WX 602 ; N uni1E5C ; G 1473 +U 7773 ; WX 602 ; N uni1E5D ; G 1474 +U 7774 ; WX 602 ; N uni1E5E ; G 1475 +U 7775 ; WX 602 ; N uni1E5F ; G 1476 +U 7776 ; WX 602 ; N uni1E60 ; G 1477 +U 7777 ; WX 602 ; N uni1E61 ; G 1478 +U 7778 ; WX 602 ; N uni1E62 ; G 1479 +U 7779 ; WX 602 ; N uni1E63 ; G 1480 +U 7784 ; WX 602 ; N uni1E68 ; G 1481 +U 7785 ; WX 602 ; N uni1E69 ; G 1482 +U 7786 ; WX 602 ; N uni1E6A ; G 1483 +U 7787 ; WX 602 ; N uni1E6B ; G 1484 +U 7788 ; WX 602 ; N uni1E6C ; G 1485 +U 7789 ; WX 602 ; N uni1E6D ; G 1486 +U 7790 ; WX 602 ; N uni1E6E ; G 1487 +U 7791 ; WX 602 ; N uni1E6F ; G 1488 +U 7792 ; WX 602 ; N uni1E70 ; G 1489 +U 7793 ; WX 602 ; N uni1E71 ; G 1490 +U 7794 ; WX 602 ; N uni1E72 ; G 1491 +U 7795 ; WX 602 ; N uni1E73 ; G 1492 +U 7796 ; WX 602 ; N uni1E74 ; G 1493 +U 7797 ; WX 602 ; N uni1E75 ; G 1494 +U 7798 ; WX 602 ; N uni1E76 ; G 1495 +U 7799 ; WX 602 ; N uni1E77 ; G 1496 +U 7800 ; WX 602 ; N uni1E78 ; G 1497 +U 7801 ; WX 602 ; N uni1E79 ; G 1498 +U 7804 ; WX 602 ; N uni1E7C ; G 1499 +U 7805 ; WX 602 ; N uni1E7D ; G 1500 +U 7806 ; WX 602 ; N uni1E7E ; G 1501 +U 7807 ; WX 602 ; N uni1E7F ; G 1502 +U 7808 ; WX 602 ; N Wgrave ; G 1503 +U 7809 ; WX 602 ; N wgrave ; G 1504 +U 7810 ; WX 602 ; N Wacute ; G 1505 +U 7811 ; WX 602 ; N wacute ; G 1506 +U 7812 ; WX 602 ; N Wdieresis ; G 1507 +U 7813 ; WX 602 ; N wdieresis ; G 1508 +U 7814 ; WX 602 ; N uni1E86 ; G 1509 +U 7815 ; WX 602 ; N uni1E87 ; G 1510 +U 7816 ; WX 602 ; N uni1E88 ; G 1511 +U 7817 ; WX 602 ; N uni1E89 ; G 1512 +U 7818 ; WX 602 ; N uni1E8A ; G 1513 +U 7819 ; WX 602 ; N uni1E8B ; G 1514 +U 7820 ; WX 602 ; N uni1E8C ; G 1515 +U 7821 ; WX 602 ; N uni1E8D ; G 1516 +U 7822 ; WX 602 ; N uni1E8E ; G 1517 +U 7823 ; WX 602 ; N uni1E8F ; G 1518 +U 7824 ; WX 602 ; N uni1E90 ; G 1519 +U 7825 ; WX 602 ; N uni1E91 ; G 1520 +U 7826 ; WX 602 ; N uni1E92 ; G 1521 +U 7827 ; WX 602 ; N uni1E93 ; G 1522 +U 7828 ; WX 602 ; N uni1E94 ; G 1523 +U 7829 ; WX 602 ; N uni1E95 ; G 1524 +U 7830 ; WX 602 ; N uni1E96 ; G 1525 +U 7831 ; WX 602 ; N uni1E97 ; G 1526 +U 7832 ; WX 602 ; N uni1E98 ; G 1527 +U 7833 ; WX 602 ; N uni1E99 ; G 1528 +U 7835 ; WX 602 ; N uni1E9B ; G 1529 +U 7839 ; WX 602 ; N uni1E9F ; G 1530 +U 7840 ; WX 602 ; N uni1EA0 ; G 1531 +U 7841 ; WX 602 ; N uni1EA1 ; G 1532 +U 7852 ; WX 602 ; N uni1EAC ; G 1533 +U 7853 ; WX 602 ; N uni1EAD ; G 1534 +U 7856 ; WX 602 ; N uni1EB0 ; G 1535 +U 7857 ; WX 602 ; N uni1EB1 ; G 1536 +U 7862 ; WX 602 ; N uni1EB6 ; G 1537 +U 7863 ; WX 602 ; N uni1EB7 ; G 1538 +U 7864 ; WX 602 ; N uni1EB8 ; G 1539 +U 7865 ; WX 602 ; N uni1EB9 ; G 1540 +U 7868 ; WX 602 ; N uni1EBC ; G 1541 +U 7869 ; WX 602 ; N uni1EBD ; G 1542 +U 7878 ; WX 602 ; N uni1EC6 ; G 1543 +U 7879 ; WX 602 ; N uni1EC7 ; G 1544 +U 7882 ; WX 602 ; N uni1ECA ; G 1545 +U 7883 ; WX 602 ; N uni1ECB ; G 1546 +U 7884 ; WX 602 ; N uni1ECC ; G 1547 +U 7885 ; WX 602 ; N uni1ECD ; G 1548 +U 7896 ; WX 602 ; N uni1ED8 ; G 1549 +U 7897 ; WX 602 ; N uni1ED9 ; G 1550 +U 7898 ; WX 602 ; N uni1EDA ; G 1551 +U 7899 ; WX 602 ; N uni1EDB ; G 1552 +U 7900 ; WX 602 ; N uni1EDC ; G 1553 +U 7901 ; WX 602 ; N uni1EDD ; G 1554 +U 7904 ; WX 602 ; N uni1EE0 ; G 1555 +U 7905 ; WX 602 ; N uni1EE1 ; G 1556 +U 7906 ; WX 602 ; N uni1EE2 ; G 1557 +U 7907 ; WX 602 ; N uni1EE3 ; G 1558 +U 7908 ; WX 602 ; N uni1EE4 ; G 1559 +U 7909 ; WX 602 ; N uni1EE5 ; G 1560 +U 7912 ; WX 602 ; N uni1EE8 ; G 1561 +U 7913 ; WX 602 ; N uni1EE9 ; G 1562 +U 7914 ; WX 602 ; N uni1EEA ; G 1563 +U 7915 ; WX 602 ; N uni1EEB ; G 1564 +U 7918 ; WX 602 ; N uni1EEE ; G 1565 +U 7919 ; WX 602 ; N uni1EEF ; G 1566 +U 7920 ; WX 602 ; N uni1EF0 ; G 1567 +U 7921 ; WX 602 ; N uni1EF1 ; G 1568 +U 7922 ; WX 602 ; N Ygrave ; G 1569 +U 7923 ; WX 602 ; N ygrave ; G 1570 +U 7924 ; WX 602 ; N uni1EF4 ; G 1571 +U 7925 ; WX 602 ; N uni1EF5 ; G 1572 +U 7928 ; WX 602 ; N uni1EF8 ; G 1573 +U 7929 ; WX 602 ; N uni1EF9 ; G 1574 +U 7936 ; WX 602 ; N uni1F00 ; G 1575 +U 7937 ; WX 602 ; N uni1F01 ; G 1576 +U 7938 ; WX 602 ; N uni1F02 ; G 1577 +U 7939 ; WX 602 ; N uni1F03 ; G 1578 +U 7940 ; WX 602 ; N uni1F04 ; G 1579 +U 7941 ; WX 602 ; N uni1F05 ; G 1580 +U 7942 ; WX 602 ; N uni1F06 ; G 1581 +U 7943 ; WX 602 ; N uni1F07 ; G 1582 +U 7944 ; WX 602 ; N uni1F08 ; G 1583 +U 7945 ; WX 602 ; N uni1F09 ; G 1584 +U 7946 ; WX 602 ; N uni1F0A ; G 1585 +U 7947 ; WX 602 ; N uni1F0B ; G 1586 +U 7948 ; WX 602 ; N uni1F0C ; G 1587 +U 7949 ; WX 602 ; N uni1F0D ; G 1588 +U 7950 ; WX 602 ; N uni1F0E ; G 1589 +U 7951 ; WX 602 ; N uni1F0F ; G 1590 +U 7952 ; WX 602 ; N uni1F10 ; G 1591 +U 7953 ; WX 602 ; N uni1F11 ; G 1592 +U 7954 ; WX 602 ; N uni1F12 ; G 1593 +U 7955 ; WX 602 ; N uni1F13 ; G 1594 +U 7956 ; WX 602 ; N uni1F14 ; G 1595 +U 7957 ; WX 602 ; N uni1F15 ; G 1596 +U 7960 ; WX 602 ; N uni1F18 ; G 1597 +U 7961 ; WX 602 ; N uni1F19 ; G 1598 +U 7962 ; WX 602 ; N uni1F1A ; G 1599 +U 7963 ; WX 602 ; N uni1F1B ; G 1600 +U 7964 ; WX 602 ; N uni1F1C ; G 1601 +U 7965 ; WX 602 ; N uni1F1D ; G 1602 +U 7968 ; WX 602 ; N uni1F20 ; G 1603 +U 7969 ; WX 602 ; N uni1F21 ; G 1604 +U 7970 ; WX 602 ; N uni1F22 ; G 1605 +U 7971 ; WX 602 ; N uni1F23 ; G 1606 +U 7972 ; WX 602 ; N uni1F24 ; G 1607 +U 7973 ; WX 602 ; N uni1F25 ; G 1608 +U 7974 ; WX 602 ; N uni1F26 ; G 1609 +U 7975 ; WX 602 ; N uni1F27 ; G 1610 +U 7976 ; WX 602 ; N uni1F28 ; G 1611 +U 7977 ; WX 602 ; N uni1F29 ; G 1612 +U 7978 ; WX 602 ; N uni1F2A ; G 1613 +U 7979 ; WX 602 ; N uni1F2B ; G 1614 +U 7980 ; WX 602 ; N uni1F2C ; G 1615 +U 7981 ; WX 602 ; N uni1F2D ; G 1616 +U 7982 ; WX 602 ; N uni1F2E ; G 1617 +U 7983 ; WX 602 ; N uni1F2F ; G 1618 +U 7984 ; WX 602 ; N uni1F30 ; G 1619 +U 7985 ; WX 602 ; N uni1F31 ; G 1620 +U 7986 ; WX 602 ; N uni1F32 ; G 1621 +U 7987 ; WX 602 ; N uni1F33 ; G 1622 +U 7988 ; WX 602 ; N uni1F34 ; G 1623 +U 7989 ; WX 602 ; N uni1F35 ; G 1624 +U 7990 ; WX 602 ; N uni1F36 ; G 1625 +U 7991 ; WX 602 ; N uni1F37 ; G 1626 +U 7992 ; WX 602 ; N uni1F38 ; G 1627 +U 7993 ; WX 602 ; N uni1F39 ; G 1628 +U 7994 ; WX 602 ; N uni1F3A ; G 1629 +U 7995 ; WX 602 ; N uni1F3B ; G 1630 +U 7996 ; WX 602 ; N uni1F3C ; G 1631 +U 7997 ; WX 602 ; N uni1F3D ; G 1632 +U 7998 ; WX 602 ; N uni1F3E ; G 1633 +U 7999 ; WX 602 ; N uni1F3F ; G 1634 +U 8000 ; WX 602 ; N uni1F40 ; G 1635 +U 8001 ; WX 602 ; N uni1F41 ; G 1636 +U 8002 ; WX 602 ; N uni1F42 ; G 1637 +U 8003 ; WX 602 ; N uni1F43 ; G 1638 +U 8004 ; WX 602 ; N uni1F44 ; G 1639 +U 8005 ; WX 602 ; N uni1F45 ; G 1640 +U 8008 ; WX 602 ; N uni1F48 ; G 1641 +U 8009 ; WX 602 ; N uni1F49 ; G 1642 +U 8010 ; WX 602 ; N uni1F4A ; G 1643 +U 8011 ; WX 602 ; N uni1F4B ; G 1644 +U 8012 ; WX 602 ; N uni1F4C ; G 1645 +U 8013 ; WX 602 ; N uni1F4D ; G 1646 +U 8016 ; WX 602 ; N uni1F50 ; G 1647 +U 8017 ; WX 602 ; N uni1F51 ; G 1648 +U 8018 ; WX 602 ; N uni1F52 ; G 1649 +U 8019 ; WX 602 ; N uni1F53 ; G 1650 +U 8020 ; WX 602 ; N uni1F54 ; G 1651 +U 8021 ; WX 602 ; N uni1F55 ; G 1652 +U 8022 ; WX 602 ; N uni1F56 ; G 1653 +U 8023 ; WX 602 ; N uni1F57 ; G 1654 +U 8025 ; WX 602 ; N uni1F59 ; G 1655 +U 8027 ; WX 602 ; N uni1F5B ; G 1656 +U 8029 ; WX 602 ; N uni1F5D ; G 1657 +U 8031 ; WX 602 ; N uni1F5F ; G 1658 +U 8032 ; WX 602 ; N uni1F60 ; G 1659 +U 8033 ; WX 602 ; N uni1F61 ; G 1660 +U 8034 ; WX 602 ; N uni1F62 ; G 1661 +U 8035 ; WX 602 ; N uni1F63 ; G 1662 +U 8036 ; WX 602 ; N uni1F64 ; G 1663 +U 8037 ; WX 602 ; N uni1F65 ; G 1664 +U 8038 ; WX 602 ; N uni1F66 ; G 1665 +U 8039 ; WX 602 ; N uni1F67 ; G 1666 +U 8040 ; WX 602 ; N uni1F68 ; G 1667 +U 8041 ; WX 602 ; N uni1F69 ; G 1668 +U 8042 ; WX 602 ; N uni1F6A ; G 1669 +U 8043 ; WX 602 ; N uni1F6B ; G 1670 +U 8044 ; WX 602 ; N uni1F6C ; G 1671 +U 8045 ; WX 602 ; N uni1F6D ; G 1672 +U 8046 ; WX 602 ; N uni1F6E ; G 1673 +U 8047 ; WX 602 ; N uni1F6F ; G 1674 +U 8048 ; WX 602 ; N uni1F70 ; G 1675 +U 8049 ; WX 602 ; N uni1F71 ; G 1676 +U 8050 ; WX 602 ; N uni1F72 ; G 1677 +U 8051 ; WX 602 ; N uni1F73 ; G 1678 +U 8052 ; WX 602 ; N uni1F74 ; G 1679 +U 8053 ; WX 602 ; N uni1F75 ; G 1680 +U 8054 ; WX 602 ; N uni1F76 ; G 1681 +U 8055 ; WX 602 ; N uni1F77 ; G 1682 +U 8056 ; WX 602 ; N uni1F78 ; G 1683 +U 8057 ; WX 602 ; N uni1F79 ; G 1684 +U 8058 ; WX 602 ; N uni1F7A ; G 1685 +U 8059 ; WX 602 ; N uni1F7B ; G 1686 +U 8060 ; WX 602 ; N uni1F7C ; G 1687 +U 8061 ; WX 602 ; N uni1F7D ; G 1688 +U 8064 ; WX 602 ; N uni1F80 ; G 1689 +U 8065 ; WX 602 ; N uni1F81 ; G 1690 +U 8066 ; WX 602 ; N uni1F82 ; G 1691 +U 8067 ; WX 602 ; N uni1F83 ; G 1692 +U 8068 ; WX 602 ; N uni1F84 ; G 1693 +U 8069 ; WX 602 ; N uni1F85 ; G 1694 +U 8070 ; WX 602 ; N uni1F86 ; G 1695 +U 8071 ; WX 602 ; N uni1F87 ; G 1696 +U 8072 ; WX 602 ; N uni1F88 ; G 1697 +U 8073 ; WX 602 ; N uni1F89 ; G 1698 +U 8074 ; WX 602 ; N uni1F8A ; G 1699 +U 8075 ; WX 602 ; N uni1F8B ; G 1700 +U 8076 ; WX 602 ; N uni1F8C ; G 1701 +U 8077 ; WX 602 ; N uni1F8D ; G 1702 +U 8078 ; WX 602 ; N uni1F8E ; G 1703 +U 8079 ; WX 602 ; N uni1F8F ; G 1704 +U 8080 ; WX 602 ; N uni1F90 ; G 1705 +U 8081 ; WX 602 ; N uni1F91 ; G 1706 +U 8082 ; WX 602 ; N uni1F92 ; G 1707 +U 8083 ; WX 602 ; N uni1F93 ; G 1708 +U 8084 ; WX 602 ; N uni1F94 ; G 1709 +U 8085 ; WX 602 ; N uni1F95 ; G 1710 +U 8086 ; WX 602 ; N uni1F96 ; G 1711 +U 8087 ; WX 602 ; N uni1F97 ; G 1712 +U 8088 ; WX 602 ; N uni1F98 ; G 1713 +U 8089 ; WX 602 ; N uni1F99 ; G 1714 +U 8090 ; WX 602 ; N uni1F9A ; G 1715 +U 8091 ; WX 602 ; N uni1F9B ; G 1716 +U 8092 ; WX 602 ; N uni1F9C ; G 1717 +U 8093 ; WX 602 ; N uni1F9D ; G 1718 +U 8094 ; WX 602 ; N uni1F9E ; G 1719 +U 8095 ; WX 602 ; N uni1F9F ; G 1720 +U 8096 ; WX 602 ; N uni1FA0 ; G 1721 +U 8097 ; WX 602 ; N uni1FA1 ; G 1722 +U 8098 ; WX 602 ; N uni1FA2 ; G 1723 +U 8099 ; WX 602 ; N uni1FA3 ; G 1724 +U 8100 ; WX 602 ; N uni1FA4 ; G 1725 +U 8101 ; WX 602 ; N uni1FA5 ; G 1726 +U 8102 ; WX 602 ; N uni1FA6 ; G 1727 +U 8103 ; WX 602 ; N uni1FA7 ; G 1728 +U 8104 ; WX 602 ; N uni1FA8 ; G 1729 +U 8105 ; WX 602 ; N uni1FA9 ; G 1730 +U 8106 ; WX 602 ; N uni1FAA ; G 1731 +U 8107 ; WX 602 ; N uni1FAB ; G 1732 +U 8108 ; WX 602 ; N uni1FAC ; G 1733 +U 8109 ; WX 602 ; N uni1FAD ; G 1734 +U 8110 ; WX 602 ; N uni1FAE ; G 1735 +U 8111 ; WX 602 ; N uni1FAF ; G 1736 +U 8112 ; WX 602 ; N uni1FB0 ; G 1737 +U 8113 ; WX 602 ; N uni1FB1 ; G 1738 +U 8114 ; WX 602 ; N uni1FB2 ; G 1739 +U 8115 ; WX 602 ; N uni1FB3 ; G 1740 +U 8116 ; WX 602 ; N uni1FB4 ; G 1741 +U 8118 ; WX 602 ; N uni1FB6 ; G 1742 +U 8119 ; WX 602 ; N uni1FB7 ; G 1743 +U 8120 ; WX 602 ; N uni1FB8 ; G 1744 +U 8121 ; WX 602 ; N uni1FB9 ; G 1745 +U 8122 ; WX 602 ; N uni1FBA ; G 1746 +U 8123 ; WX 602 ; N uni1FBB ; G 1747 +U 8124 ; WX 602 ; N uni1FBC ; G 1748 +U 8125 ; WX 602 ; N uni1FBD ; G 1749 +U 8126 ; WX 602 ; N uni1FBE ; G 1750 +U 8127 ; WX 602 ; N uni1FBF ; G 1751 +U 8128 ; WX 602 ; N uni1FC0 ; G 1752 +U 8129 ; WX 602 ; N uni1FC1 ; G 1753 +U 8130 ; WX 602 ; N uni1FC2 ; G 1754 +U 8131 ; WX 602 ; N uni1FC3 ; G 1755 +U 8132 ; WX 602 ; N uni1FC4 ; G 1756 +U 8134 ; WX 602 ; N uni1FC6 ; G 1757 +U 8135 ; WX 602 ; N uni1FC7 ; G 1758 +U 8136 ; WX 602 ; N uni1FC8 ; G 1759 +U 8137 ; WX 602 ; N uni1FC9 ; G 1760 +U 8138 ; WX 602 ; N uni1FCA ; G 1761 +U 8139 ; WX 602 ; N uni1FCB ; G 1762 +U 8140 ; WX 602 ; N uni1FCC ; G 1763 +U 8141 ; WX 602 ; N uni1FCD ; G 1764 +U 8142 ; WX 602 ; N uni1FCE ; G 1765 +U 8143 ; WX 602 ; N uni1FCF ; G 1766 +U 8144 ; WX 602 ; N uni1FD0 ; G 1767 +U 8145 ; WX 602 ; N uni1FD1 ; G 1768 +U 8146 ; WX 602 ; N uni1FD2 ; G 1769 +U 8147 ; WX 602 ; N uni1FD3 ; G 1770 +U 8150 ; WX 602 ; N uni1FD6 ; G 1771 +U 8151 ; WX 602 ; N uni1FD7 ; G 1772 +U 8152 ; WX 602 ; N uni1FD8 ; G 1773 +U 8153 ; WX 602 ; N uni1FD9 ; G 1774 +U 8154 ; WX 602 ; N uni1FDA ; G 1775 +U 8155 ; WX 602 ; N uni1FDB ; G 1776 +U 8157 ; WX 602 ; N uni1FDD ; G 1777 +U 8158 ; WX 602 ; N uni1FDE ; G 1778 +U 8159 ; WX 602 ; N uni1FDF ; G 1779 +U 8160 ; WX 602 ; N uni1FE0 ; G 1780 +U 8161 ; WX 602 ; N uni1FE1 ; G 1781 +U 8162 ; WX 602 ; N uni1FE2 ; G 1782 +U 8163 ; WX 602 ; N uni1FE3 ; G 1783 +U 8164 ; WX 602 ; N uni1FE4 ; G 1784 +U 8165 ; WX 602 ; N uni1FE5 ; G 1785 +U 8166 ; WX 602 ; N uni1FE6 ; G 1786 +U 8167 ; WX 602 ; N uni1FE7 ; G 1787 +U 8168 ; WX 602 ; N uni1FE8 ; G 1788 +U 8169 ; WX 602 ; N uni1FE9 ; G 1789 +U 8170 ; WX 602 ; N uni1FEA ; G 1790 +U 8171 ; WX 602 ; N uni1FEB ; G 1791 +U 8172 ; WX 602 ; N uni1FEC ; G 1792 +U 8173 ; WX 602 ; N uni1FED ; G 1793 +U 8174 ; WX 602 ; N uni1FEE ; G 1794 +U 8175 ; WX 602 ; N uni1FEF ; G 1795 +U 8178 ; WX 602 ; N uni1FF2 ; G 1796 +U 8179 ; WX 602 ; N uni1FF3 ; G 1797 +U 8180 ; WX 602 ; N uni1FF4 ; G 1798 +U 8182 ; WX 602 ; N uni1FF6 ; G 1799 +U 8183 ; WX 602 ; N uni1FF7 ; G 1800 +U 8184 ; WX 602 ; N uni1FF8 ; G 1801 +U 8185 ; WX 602 ; N uni1FF9 ; G 1802 +U 8186 ; WX 602 ; N uni1FFA ; G 1803 +U 8187 ; WX 602 ; N uni1FFB ; G 1804 +U 8188 ; WX 602 ; N uni1FFC ; G 1805 +U 8189 ; WX 602 ; N uni1FFD ; G 1806 +U 8190 ; WX 602 ; N uni1FFE ; G 1807 +U 8192 ; WX 602 ; N uni2000 ; G 1808 +U 8193 ; WX 602 ; N uni2001 ; G 1809 +U 8194 ; WX 602 ; N uni2002 ; G 1810 +U 8195 ; WX 602 ; N uni2003 ; G 1811 +U 8196 ; WX 602 ; N uni2004 ; G 1812 +U 8197 ; WX 602 ; N uni2005 ; G 1813 +U 8198 ; WX 602 ; N uni2006 ; G 1814 +U 8199 ; WX 602 ; N uni2007 ; G 1815 +U 8200 ; WX 602 ; N uni2008 ; G 1816 +U 8201 ; WX 602 ; N uni2009 ; G 1817 +U 8202 ; WX 602 ; N uni200A ; G 1818 +U 8208 ; WX 602 ; N uni2010 ; G 1819 +U 8209 ; WX 602 ; N uni2011 ; G 1820 +U 8210 ; WX 602 ; N figuredash ; G 1821 +U 8211 ; WX 602 ; N endash ; G 1822 +U 8212 ; WX 602 ; N emdash ; G 1823 +U 8213 ; WX 602 ; N uni2015 ; G 1824 +U 8214 ; WX 602 ; N uni2016 ; G 1825 +U 8215 ; WX 602 ; N underscoredbl ; G 1826 +U 8216 ; WX 602 ; N quoteleft ; G 1827 +U 8217 ; WX 602 ; N quoteright ; G 1828 +U 8218 ; WX 602 ; N quotesinglbase ; G 1829 +U 8219 ; WX 602 ; N quotereversed ; G 1830 +U 8220 ; WX 602 ; N quotedblleft ; G 1831 +U 8221 ; WX 602 ; N quotedblright ; G 1832 +U 8222 ; WX 602 ; N quotedblbase ; G 1833 +U 8223 ; WX 602 ; N uni201F ; G 1834 +U 8224 ; WX 602 ; N dagger ; G 1835 +U 8225 ; WX 602 ; N daggerdbl ; G 1836 +U 8226 ; WX 602 ; N bullet ; G 1837 +U 8227 ; WX 602 ; N uni2023 ; G 1838 +U 8230 ; WX 602 ; N ellipsis ; G 1839 +U 8239 ; WX 602 ; N uni202F ; G 1840 +U 8240 ; WX 602 ; N perthousand ; G 1841 +U 8241 ; WX 602 ; N uni2031 ; G 1842 +U 8242 ; WX 602 ; N minute ; G 1843 +U 8243 ; WX 602 ; N second ; G 1844 +U 8244 ; WX 602 ; N uni2034 ; G 1845 +U 8245 ; WX 602 ; N uni2035 ; G 1846 +U 8246 ; WX 602 ; N uni2036 ; G 1847 +U 8247 ; WX 602 ; N uni2037 ; G 1848 +U 8249 ; WX 602 ; N guilsinglleft ; G 1849 +U 8250 ; WX 602 ; N guilsinglright ; G 1850 +U 8252 ; WX 602 ; N exclamdbl ; G 1851 +U 8253 ; WX 602 ; N uni203D ; G 1852 +U 8254 ; WX 602 ; N uni203E ; G 1853 +U 8255 ; WX 602 ; N uni203F ; G 1854 +U 8261 ; WX 602 ; N uni2045 ; G 1855 +U 8262 ; WX 602 ; N uni2046 ; G 1856 +U 8263 ; WX 602 ; N uni2047 ; G 1857 +U 8264 ; WX 602 ; N uni2048 ; G 1858 +U 8265 ; WX 602 ; N uni2049 ; G 1859 +U 8267 ; WX 602 ; N uni204B ; G 1860 +U 8287 ; WX 602 ; N uni205F ; G 1861 +U 8304 ; WX 602 ; N uni2070 ; G 1862 +U 8305 ; WX 602 ; N uni2071 ; G 1863 +U 8308 ; WX 602 ; N uni2074 ; G 1864 +U 8309 ; WX 602 ; N uni2075 ; G 1865 +U 8310 ; WX 602 ; N uni2076 ; G 1866 +U 8311 ; WX 602 ; N uni2077 ; G 1867 +U 8312 ; WX 602 ; N uni2078 ; G 1868 +U 8313 ; WX 602 ; N uni2079 ; G 1869 +U 8314 ; WX 602 ; N uni207A ; G 1870 +U 8315 ; WX 602 ; N uni207B ; G 1871 +U 8316 ; WX 602 ; N uni207C ; G 1872 +U 8317 ; WX 602 ; N uni207D ; G 1873 +U 8318 ; WX 602 ; N uni207E ; G 1874 +U 8319 ; WX 602 ; N uni207F ; G 1875 +U 8320 ; WX 602 ; N uni2080 ; G 1876 +U 8321 ; WX 602 ; N uni2081 ; G 1877 +U 8322 ; WX 602 ; N uni2082 ; G 1878 +U 8323 ; WX 602 ; N uni2083 ; G 1879 +U 8324 ; WX 602 ; N uni2084 ; G 1880 +U 8325 ; WX 602 ; N uni2085 ; G 1881 +U 8326 ; WX 602 ; N uni2086 ; G 1882 +U 8327 ; WX 602 ; N uni2087 ; G 1883 +U 8328 ; WX 602 ; N uni2088 ; G 1884 +U 8329 ; WX 602 ; N uni2089 ; G 1885 +U 8330 ; WX 602 ; N uni208A ; G 1886 +U 8331 ; WX 602 ; N uni208B ; G 1887 +U 8332 ; WX 602 ; N uni208C ; G 1888 +U 8333 ; WX 602 ; N uni208D ; G 1889 +U 8334 ; WX 602 ; N uni208E ; G 1890 +U 8336 ; WX 602 ; N uni2090 ; G 1891 +U 8337 ; WX 602 ; N uni2091 ; G 1892 +U 8338 ; WX 602 ; N uni2092 ; G 1893 +U 8339 ; WX 602 ; N uni2093 ; G 1894 +U 8340 ; WX 602 ; N uni2094 ; G 1895 +U 8341 ; WX 602 ; N uni2095 ; G 1896 +U 8342 ; WX 602 ; N uni2096 ; G 1897 +U 8343 ; WX 602 ; N uni2097 ; G 1898 +U 8344 ; WX 602 ; N uni2098 ; G 1899 +U 8345 ; WX 602 ; N uni2099 ; G 1900 +U 8346 ; WX 602 ; N uni209A ; G 1901 +U 8347 ; WX 602 ; N uni209B ; G 1902 +U 8348 ; WX 602 ; N uni209C ; G 1903 +U 8352 ; WX 602 ; N uni20A0 ; G 1904 +U 8353 ; WX 602 ; N colonmonetary ; G 1905 +U 8354 ; WX 602 ; N uni20A2 ; G 1906 +U 8355 ; WX 602 ; N franc ; G 1907 +U 8356 ; WX 602 ; N lira ; G 1908 +U 8357 ; WX 602 ; N uni20A5 ; G 1909 +U 8358 ; WX 602 ; N uni20A6 ; G 1910 +U 8359 ; WX 602 ; N peseta ; G 1911 +U 8360 ; WX 602 ; N uni20A8 ; G 1912 +U 8361 ; WX 602 ; N uni20A9 ; G 1913 +U 8362 ; WX 602 ; N uni20AA ; G 1914 +U 8363 ; WX 602 ; N dong ; G 1915 +U 8364 ; WX 602 ; N Euro ; G 1916 +U 8365 ; WX 602 ; N uni20AD ; G 1917 +U 8366 ; WX 602 ; N uni20AE ; G 1918 +U 8367 ; WX 602 ; N uni20AF ; G 1919 +U 8368 ; WX 602 ; N uni20B0 ; G 1920 +U 8369 ; WX 602 ; N uni20B1 ; G 1921 +U 8370 ; WX 602 ; N uni20B2 ; G 1922 +U 8371 ; WX 602 ; N uni20B3 ; G 1923 +U 8372 ; WX 602 ; N uni20B4 ; G 1924 +U 8373 ; WX 602 ; N uni20B5 ; G 1925 +U 8376 ; WX 602 ; N uni20B8 ; G 1926 +U 8377 ; WX 602 ; N uni20B9 ; G 1927 +U 8378 ; WX 602 ; N uni20BA ; G 1928 +U 8381 ; WX 602 ; N uni20BD ; G 1929 +U 8450 ; WX 602 ; N uni2102 ; G 1930 +U 8453 ; WX 602 ; N uni2105 ; G 1931 +U 8461 ; WX 602 ; N uni210D ; G 1932 +U 8462 ; WX 602 ; N uni210E ; G 1933 +U 8463 ; WX 602 ; N uni210F ; G 1934 +U 8469 ; WX 602 ; N uni2115 ; G 1935 +U 8470 ; WX 602 ; N uni2116 ; G 1936 +U 8471 ; WX 602 ; N uni2117 ; G 1937 +U 8473 ; WX 602 ; N uni2119 ; G 1938 +U 8474 ; WX 602 ; N uni211A ; G 1939 +U 8477 ; WX 602 ; N uni211D ; G 1940 +U 8482 ; WX 602 ; N trademark ; G 1941 +U 8484 ; WX 602 ; N uni2124 ; G 1942 +U 8486 ; WX 602 ; N uni2126 ; G 1943 +U 8490 ; WX 602 ; N uni212A ; G 1944 +U 8491 ; WX 602 ; N uni212B ; G 1945 +U 8494 ; WX 602 ; N estimated ; G 1946 +U 8520 ; WX 602 ; N uni2148 ; G 1947 +U 8528 ; WX 602 ; N uni2150 ; G 1948 +U 8529 ; WX 602 ; N uni2151 ; G 1949 +U 8531 ; WX 602 ; N onethird ; G 1950 +U 8532 ; WX 602 ; N twothirds ; G 1951 +U 8533 ; WX 602 ; N uni2155 ; G 1952 +U 8534 ; WX 602 ; N uni2156 ; G 1953 +U 8535 ; WX 602 ; N uni2157 ; G 1954 +U 8536 ; WX 602 ; N uni2158 ; G 1955 +U 8537 ; WX 602 ; N uni2159 ; G 1956 +U 8538 ; WX 602 ; N uni215A ; G 1957 +U 8539 ; WX 602 ; N oneeighth ; G 1958 +U 8540 ; WX 602 ; N threeeighths ; G 1959 +U 8541 ; WX 602 ; N fiveeighths ; G 1960 +U 8542 ; WX 602 ; N seveneighths ; G 1961 +U 8543 ; WX 602 ; N uni215F ; G 1962 +U 8585 ; WX 602 ; N uni2189 ; G 1963 +U 8592 ; WX 602 ; N arrowleft ; G 1964 +U 8593 ; WX 602 ; N arrowup ; G 1965 +U 8594 ; WX 602 ; N arrowright ; G 1966 +U 8595 ; WX 602 ; N arrowdown ; G 1967 +U 8596 ; WX 602 ; N arrowboth ; G 1968 +U 8597 ; WX 602 ; N arrowupdn ; G 1969 +U 8598 ; WX 602 ; N uni2196 ; G 1970 +U 8599 ; WX 602 ; N uni2197 ; G 1971 +U 8600 ; WX 602 ; N uni2198 ; G 1972 +U 8601 ; WX 602 ; N uni2199 ; G 1973 +U 8602 ; WX 602 ; N uni219A ; G 1974 +U 8603 ; WX 602 ; N uni219B ; G 1975 +U 8604 ; WX 602 ; N uni219C ; G 1976 +U 8605 ; WX 602 ; N uni219D ; G 1977 +U 8606 ; WX 602 ; N uni219E ; G 1978 +U 8607 ; WX 602 ; N uni219F ; G 1979 +U 8608 ; WX 602 ; N uni21A0 ; G 1980 +U 8609 ; WX 602 ; N uni21A1 ; G 1981 +U 8610 ; WX 602 ; N uni21A2 ; G 1982 +U 8611 ; WX 602 ; N uni21A3 ; G 1983 +U 8612 ; WX 602 ; N uni21A4 ; G 1984 +U 8613 ; WX 602 ; N uni21A5 ; G 1985 +U 8614 ; WX 602 ; N uni21A6 ; G 1986 +U 8615 ; WX 602 ; N uni21A7 ; G 1987 +U 8616 ; WX 602 ; N arrowupdnbse ; G 1988 +U 8617 ; WX 602 ; N uni21A9 ; G 1989 +U 8618 ; WX 602 ; N uni21AA ; G 1990 +U 8619 ; WX 602 ; N uni21AB ; G 1991 +U 8620 ; WX 602 ; N uni21AC ; G 1992 +U 8621 ; WX 602 ; N uni21AD ; G 1993 +U 8622 ; WX 602 ; N uni21AE ; G 1994 +U 8623 ; WX 602 ; N uni21AF ; G 1995 +U 8624 ; WX 602 ; N uni21B0 ; G 1996 +U 8625 ; WX 602 ; N uni21B1 ; G 1997 +U 8626 ; WX 602 ; N uni21B2 ; G 1998 +U 8627 ; WX 602 ; N uni21B3 ; G 1999 +U 8628 ; WX 602 ; N uni21B4 ; G 2000 +U 8629 ; WX 602 ; N carriagereturn ; G 2001 +U 8630 ; WX 602 ; N uni21B6 ; G 2002 +U 8631 ; WX 602 ; N uni21B7 ; G 2003 +U 8632 ; WX 602 ; N uni21B8 ; G 2004 +U 8633 ; WX 602 ; N uni21B9 ; G 2005 +U 8634 ; WX 602 ; N uni21BA ; G 2006 +U 8635 ; WX 602 ; N uni21BB ; G 2007 +U 8636 ; WX 602 ; N uni21BC ; G 2008 +U 8637 ; WX 602 ; N uni21BD ; G 2009 +U 8638 ; WX 602 ; N uni21BE ; G 2010 +U 8639 ; WX 602 ; N uni21BF ; G 2011 +U 8640 ; WX 602 ; N uni21C0 ; G 2012 +U 8641 ; WX 602 ; N uni21C1 ; G 2013 +U 8642 ; WX 602 ; N uni21C2 ; G 2014 +U 8643 ; WX 602 ; N uni21C3 ; G 2015 +U 8644 ; WX 602 ; N uni21C4 ; G 2016 +U 8645 ; WX 602 ; N uni21C5 ; G 2017 +U 8646 ; WX 602 ; N uni21C6 ; G 2018 +U 8647 ; WX 602 ; N uni21C7 ; G 2019 +U 8648 ; WX 602 ; N uni21C8 ; G 2020 +U 8649 ; WX 602 ; N uni21C9 ; G 2021 +U 8650 ; WX 602 ; N uni21CA ; G 2022 +U 8651 ; WX 602 ; N uni21CB ; G 2023 +U 8652 ; WX 602 ; N uni21CC ; G 2024 +U 8653 ; WX 602 ; N uni21CD ; G 2025 +U 8654 ; WX 602 ; N uni21CE ; G 2026 +U 8655 ; WX 602 ; N uni21CF ; G 2027 +U 8656 ; WX 602 ; N arrowdblleft ; G 2028 +U 8657 ; WX 602 ; N arrowdblup ; G 2029 +U 8658 ; WX 602 ; N arrowdblright ; G 2030 +U 8659 ; WX 602 ; N arrowdbldown ; G 2031 +U 8660 ; WX 602 ; N arrowdblboth ; G 2032 +U 8661 ; WX 602 ; N uni21D5 ; G 2033 +U 8662 ; WX 602 ; N uni21D6 ; G 2034 +U 8663 ; WX 602 ; N uni21D7 ; G 2035 +U 8664 ; WX 602 ; N uni21D8 ; G 2036 +U 8665 ; WX 602 ; N uni21D9 ; G 2037 +U 8666 ; WX 602 ; N uni21DA ; G 2038 +U 8667 ; WX 602 ; N uni21DB ; G 2039 +U 8668 ; WX 602 ; N uni21DC ; G 2040 +U 8669 ; WX 602 ; N uni21DD ; G 2041 +U 8670 ; WX 602 ; N uni21DE ; G 2042 +U 8671 ; WX 602 ; N uni21DF ; G 2043 +U 8672 ; WX 602 ; N uni21E0 ; G 2044 +U 8673 ; WX 602 ; N uni21E1 ; G 2045 +U 8674 ; WX 602 ; N uni21E2 ; G 2046 +U 8675 ; WX 602 ; N uni21E3 ; G 2047 +U 8676 ; WX 602 ; N uni21E4 ; G 2048 +U 8677 ; WX 602 ; N uni21E5 ; G 2049 +U 8678 ; WX 602 ; N uni21E6 ; G 2050 +U 8679 ; WX 602 ; N uni21E7 ; G 2051 +U 8680 ; WX 602 ; N uni21E8 ; G 2052 +U 8681 ; WX 602 ; N uni21E9 ; G 2053 +U 8682 ; WX 602 ; N uni21EA ; G 2054 +U 8683 ; WX 602 ; N uni21EB ; G 2055 +U 8684 ; WX 602 ; N uni21EC ; G 2056 +U 8685 ; WX 602 ; N uni21ED ; G 2057 +U 8686 ; WX 602 ; N uni21EE ; G 2058 +U 8687 ; WX 602 ; N uni21EF ; G 2059 +U 8688 ; WX 602 ; N uni21F0 ; G 2060 +U 8689 ; WX 602 ; N uni21F1 ; G 2061 +U 8690 ; WX 602 ; N uni21F2 ; G 2062 +U 8691 ; WX 602 ; N uni21F3 ; G 2063 +U 8692 ; WX 602 ; N uni21F4 ; G 2064 +U 8693 ; WX 602 ; N uni21F5 ; G 2065 +U 8694 ; WX 602 ; N uni21F6 ; G 2066 +U 8695 ; WX 602 ; N uni21F7 ; G 2067 +U 8696 ; WX 602 ; N uni21F8 ; G 2068 +U 8697 ; WX 602 ; N uni21F9 ; G 2069 +U 8698 ; WX 602 ; N uni21FA ; G 2070 +U 8699 ; WX 602 ; N uni21FB ; G 2071 +U 8700 ; WX 602 ; N uni21FC ; G 2072 +U 8701 ; WX 602 ; N uni21FD ; G 2073 +U 8702 ; WX 602 ; N uni21FE ; G 2074 +U 8703 ; WX 602 ; N uni21FF ; G 2075 +U 8704 ; WX 602 ; N universal ; G 2076 +U 8705 ; WX 602 ; N uni2201 ; G 2077 +U 8706 ; WX 602 ; N partialdiff ; G 2078 +U 8707 ; WX 602 ; N existential ; G 2079 +U 8708 ; WX 602 ; N uni2204 ; G 2080 +U 8709 ; WX 602 ; N emptyset ; G 2081 +U 8710 ; WX 602 ; N increment ; G 2082 +U 8711 ; WX 602 ; N gradient ; G 2083 +U 8712 ; WX 602 ; N element ; G 2084 +U 8713 ; WX 602 ; N notelement ; G 2085 +U 8714 ; WX 602 ; N uni220A ; G 2086 +U 8715 ; WX 602 ; N suchthat ; G 2087 +U 8716 ; WX 602 ; N uni220C ; G 2088 +U 8717 ; WX 602 ; N uni220D ; G 2089 +U 8718 ; WX 602 ; N uni220E ; G 2090 +U 8719 ; WX 602 ; N product ; G 2091 +U 8720 ; WX 602 ; N uni2210 ; G 2092 +U 8721 ; WX 602 ; N summation ; G 2093 +U 8722 ; WX 602 ; N minus ; G 2094 +U 8723 ; WX 602 ; N uni2213 ; G 2095 +U 8725 ; WX 602 ; N uni2215 ; G 2096 +U 8727 ; WX 602 ; N asteriskmath ; G 2097 +U 8728 ; WX 602 ; N uni2218 ; G 2098 +U 8729 ; WX 602 ; N uni2219 ; G 2099 +U 8730 ; WX 602 ; N radical ; G 2100 +U 8731 ; WX 602 ; N uni221B ; G 2101 +U 8732 ; WX 602 ; N uni221C ; G 2102 +U 8733 ; WX 602 ; N proportional ; G 2103 +U 8734 ; WX 602 ; N infinity ; G 2104 +U 8735 ; WX 602 ; N orthogonal ; G 2105 +U 8736 ; WX 602 ; N angle ; G 2106 +U 8739 ; WX 602 ; N uni2223 ; G 2107 +U 8743 ; WX 602 ; N logicaland ; G 2108 +U 8744 ; WX 602 ; N logicalor ; G 2109 +U 8745 ; WX 602 ; N intersection ; G 2110 +U 8746 ; WX 602 ; N union ; G 2111 +U 8747 ; WX 602 ; N integral ; G 2112 +U 8748 ; WX 602 ; N uni222C ; G 2113 +U 8749 ; WX 602 ; N uni222D ; G 2114 +U 8756 ; WX 602 ; N therefore ; G 2115 +U 8757 ; WX 602 ; N uni2235 ; G 2116 +U 8758 ; WX 602 ; N uni2236 ; G 2117 +U 8759 ; WX 602 ; N uni2237 ; G 2118 +U 8760 ; WX 602 ; N uni2238 ; G 2119 +U 8761 ; WX 602 ; N uni2239 ; G 2120 +U 8762 ; WX 602 ; N uni223A ; G 2121 +U 8763 ; WX 602 ; N uni223B ; G 2122 +U 8764 ; WX 602 ; N similar ; G 2123 +U 8765 ; WX 602 ; N uni223D ; G 2124 +U 8769 ; WX 602 ; N uni2241 ; G 2125 +U 8770 ; WX 602 ; N uni2242 ; G 2126 +U 8771 ; WX 602 ; N uni2243 ; G 2127 +U 8772 ; WX 602 ; N uni2244 ; G 2128 +U 8773 ; WX 602 ; N congruent ; G 2129 +U 8774 ; WX 602 ; N uni2246 ; G 2130 +U 8775 ; WX 602 ; N uni2247 ; G 2131 +U 8776 ; WX 602 ; N approxequal ; G 2132 +U 8777 ; WX 602 ; N uni2249 ; G 2133 +U 8778 ; WX 602 ; N uni224A ; G 2134 +U 8779 ; WX 602 ; N uni224B ; G 2135 +U 8780 ; WX 602 ; N uni224C ; G 2136 +U 8781 ; WX 602 ; N uni224D ; G 2137 +U 8782 ; WX 602 ; N uni224E ; G 2138 +U 8783 ; WX 602 ; N uni224F ; G 2139 +U 8784 ; WX 602 ; N uni2250 ; G 2140 +U 8785 ; WX 602 ; N uni2251 ; G 2141 +U 8786 ; WX 602 ; N uni2252 ; G 2142 +U 8787 ; WX 602 ; N uni2253 ; G 2143 +U 8788 ; WX 602 ; N uni2254 ; G 2144 +U 8789 ; WX 602 ; N uni2255 ; G 2145 +U 8790 ; WX 602 ; N uni2256 ; G 2146 +U 8791 ; WX 602 ; N uni2257 ; G 2147 +U 8792 ; WX 602 ; N uni2258 ; G 2148 +U 8793 ; WX 602 ; N uni2259 ; G 2149 +U 8794 ; WX 602 ; N uni225A ; G 2150 +U 8795 ; WX 602 ; N uni225B ; G 2151 +U 8796 ; WX 602 ; N uni225C ; G 2152 +U 8797 ; WX 602 ; N uni225D ; G 2153 +U 8798 ; WX 602 ; N uni225E ; G 2154 +U 8799 ; WX 602 ; N uni225F ; G 2155 +U 8800 ; WX 602 ; N notequal ; G 2156 +U 8801 ; WX 602 ; N equivalence ; G 2157 +U 8802 ; WX 602 ; N uni2262 ; G 2158 +U 8803 ; WX 602 ; N uni2263 ; G 2159 +U 8804 ; WX 602 ; N lessequal ; G 2160 +U 8805 ; WX 602 ; N greaterequal ; G 2161 +U 8806 ; WX 602 ; N uni2266 ; G 2162 +U 8807 ; WX 602 ; N uni2267 ; G 2163 +U 8808 ; WX 602 ; N uni2268 ; G 2164 +U 8809 ; WX 602 ; N uni2269 ; G 2165 +U 8813 ; WX 602 ; N uni226D ; G 2166 +U 8814 ; WX 602 ; N uni226E ; G 2167 +U 8815 ; WX 602 ; N uni226F ; G 2168 +U 8816 ; WX 602 ; N uni2270 ; G 2169 +U 8817 ; WX 602 ; N uni2271 ; G 2170 +U 8818 ; WX 602 ; N uni2272 ; G 2171 +U 8819 ; WX 602 ; N uni2273 ; G 2172 +U 8820 ; WX 602 ; N uni2274 ; G 2173 +U 8821 ; WX 602 ; N uni2275 ; G 2174 +U 8822 ; WX 602 ; N uni2276 ; G 2175 +U 8823 ; WX 602 ; N uni2277 ; G 2176 +U 8824 ; WX 602 ; N uni2278 ; G 2177 +U 8825 ; WX 602 ; N uni2279 ; G 2178 +U 8826 ; WX 602 ; N uni227A ; G 2179 +U 8827 ; WX 602 ; N uni227B ; G 2180 +U 8828 ; WX 602 ; N uni227C ; G 2181 +U 8829 ; WX 602 ; N uni227D ; G 2182 +U 8830 ; WX 602 ; N uni227E ; G 2183 +U 8831 ; WX 602 ; N uni227F ; G 2184 +U 8832 ; WX 602 ; N uni2280 ; G 2185 +U 8833 ; WX 602 ; N uni2281 ; G 2186 +U 8834 ; WX 602 ; N propersubset ; G 2187 +U 8835 ; WX 602 ; N propersuperset ; G 2188 +U 8836 ; WX 602 ; N notsubset ; G 2189 +U 8837 ; WX 602 ; N uni2285 ; G 2190 +U 8838 ; WX 602 ; N reflexsubset ; G 2191 +U 8839 ; WX 602 ; N reflexsuperset ; G 2192 +U 8840 ; WX 602 ; N uni2288 ; G 2193 +U 8841 ; WX 602 ; N uni2289 ; G 2194 +U 8842 ; WX 602 ; N uni228A ; G 2195 +U 8843 ; WX 602 ; N uni228B ; G 2196 +U 8845 ; WX 602 ; N uni228D ; G 2197 +U 8846 ; WX 602 ; N uni228E ; G 2198 +U 8847 ; WX 602 ; N uni228F ; G 2199 +U 8848 ; WX 602 ; N uni2290 ; G 2200 +U 8849 ; WX 602 ; N uni2291 ; G 2201 +U 8850 ; WX 602 ; N uni2292 ; G 2202 +U 8851 ; WX 602 ; N uni2293 ; G 2203 +U 8852 ; WX 602 ; N uni2294 ; G 2204 +U 8853 ; WX 602 ; N circleplus ; G 2205 +U 8854 ; WX 602 ; N uni2296 ; G 2206 +U 8855 ; WX 602 ; N circlemultiply ; G 2207 +U 8856 ; WX 602 ; N uni2298 ; G 2208 +U 8857 ; WX 602 ; N uni2299 ; G 2209 +U 8858 ; WX 602 ; N uni229A ; G 2210 +U 8859 ; WX 602 ; N uni229B ; G 2211 +U 8860 ; WX 602 ; N uni229C ; G 2212 +U 8861 ; WX 602 ; N uni229D ; G 2213 +U 8862 ; WX 602 ; N uni229E ; G 2214 +U 8863 ; WX 602 ; N uni229F ; G 2215 +U 8864 ; WX 602 ; N uni22A0 ; G 2216 +U 8865 ; WX 602 ; N uni22A1 ; G 2217 +U 8866 ; WX 602 ; N uni22A2 ; G 2218 +U 8867 ; WX 602 ; N uni22A3 ; G 2219 +U 8868 ; WX 602 ; N uni22A4 ; G 2220 +U 8869 ; WX 602 ; N perpendicular ; G 2221 +U 8882 ; WX 602 ; N uni22B2 ; G 2222 +U 8883 ; WX 602 ; N uni22B3 ; G 2223 +U 8884 ; WX 602 ; N uni22B4 ; G 2224 +U 8885 ; WX 602 ; N uni22B5 ; G 2225 +U 8888 ; WX 602 ; N uni22B8 ; G 2226 +U 8898 ; WX 602 ; N uni22C2 ; G 2227 +U 8899 ; WX 602 ; N uni22C3 ; G 2228 +U 8900 ; WX 602 ; N uni22C4 ; G 2229 +U 8901 ; WX 602 ; N dotmath ; G 2230 +U 8902 ; WX 602 ; N uni22C6 ; G 2231 +U 8909 ; WX 602 ; N uni22CD ; G 2232 +U 8910 ; WX 602 ; N uni22CE ; G 2233 +U 8911 ; WX 602 ; N uni22CF ; G 2234 +U 8912 ; WX 602 ; N uni22D0 ; G 2235 +U 8913 ; WX 602 ; N uni22D1 ; G 2236 +U 8922 ; WX 602 ; N uni22DA ; G 2237 +U 8923 ; WX 602 ; N uni22DB ; G 2238 +U 8924 ; WX 602 ; N uni22DC ; G 2239 +U 8925 ; WX 602 ; N uni22DD ; G 2240 +U 8926 ; WX 602 ; N uni22DE ; G 2241 +U 8927 ; WX 602 ; N uni22DF ; G 2242 +U 8928 ; WX 602 ; N uni22E0 ; G 2243 +U 8929 ; WX 602 ; N uni22E1 ; G 2244 +U 8930 ; WX 602 ; N uni22E2 ; G 2245 +U 8931 ; WX 602 ; N uni22E3 ; G 2246 +U 8932 ; WX 602 ; N uni22E4 ; G 2247 +U 8933 ; WX 602 ; N uni22E5 ; G 2248 +U 8934 ; WX 602 ; N uni22E6 ; G 2249 +U 8935 ; WX 602 ; N uni22E7 ; G 2250 +U 8936 ; WX 602 ; N uni22E8 ; G 2251 +U 8937 ; WX 602 ; N uni22E9 ; G 2252 +U 8943 ; WX 602 ; N uni22EF ; G 2253 +U 8960 ; WX 602 ; N uni2300 ; G 2254 +U 8961 ; WX 602 ; N uni2301 ; G 2255 +U 8962 ; WX 602 ; N house ; G 2256 +U 8963 ; WX 602 ; N uni2303 ; G 2257 +U 8964 ; WX 602 ; N uni2304 ; G 2258 +U 8965 ; WX 602 ; N uni2305 ; G 2259 +U 8966 ; WX 602 ; N uni2306 ; G 2260 +U 8968 ; WX 602 ; N uni2308 ; G 2261 +U 8969 ; WX 602 ; N uni2309 ; G 2262 +U 8970 ; WX 602 ; N uni230A ; G 2263 +U 8971 ; WX 602 ; N uni230B ; G 2264 +U 8972 ; WX 602 ; N uni230C ; G 2265 +U 8973 ; WX 602 ; N uni230D ; G 2266 +U 8974 ; WX 602 ; N uni230E ; G 2267 +U 8975 ; WX 602 ; N uni230F ; G 2268 +U 8976 ; WX 602 ; N revlogicalnot ; G 2269 +U 8977 ; WX 602 ; N uni2311 ; G 2270 +U 8978 ; WX 602 ; N uni2312 ; G 2271 +U 8979 ; WX 602 ; N uni2313 ; G 2272 +U 8980 ; WX 602 ; N uni2314 ; G 2273 +U 8981 ; WX 602 ; N uni2315 ; G 2274 +U 8984 ; WX 602 ; N uni2318 ; G 2275 +U 8985 ; WX 602 ; N uni2319 ; G 2276 +U 8988 ; WX 602 ; N uni231C ; G 2277 +U 8989 ; WX 602 ; N uni231D ; G 2278 +U 8990 ; WX 602 ; N uni231E ; G 2279 +U 8991 ; WX 602 ; N uni231F ; G 2280 +U 8992 ; WX 602 ; N integraltp ; G 2281 +U 8993 ; WX 602 ; N integralbt ; G 2282 +U 8997 ; WX 602 ; N uni2325 ; G 2283 +U 8998 ; WX 602 ; N uni2326 ; G 2284 +U 8999 ; WX 602 ; N uni2327 ; G 2285 +U 9000 ; WX 602 ; N uni2328 ; G 2286 +U 9003 ; WX 602 ; N uni232B ; G 2287 +U 9013 ; WX 602 ; N uni2335 ; G 2288 +U 9014 ; WX 602 ; N uni2336 ; G 2289 +U 9015 ; WX 602 ; N uni2337 ; G 2290 +U 9016 ; WX 602 ; N uni2338 ; G 2291 +U 9017 ; WX 602 ; N uni2339 ; G 2292 +U 9018 ; WX 602 ; N uni233A ; G 2293 +U 9019 ; WX 602 ; N uni233B ; G 2294 +U 9020 ; WX 602 ; N uni233C ; G 2295 +U 9021 ; WX 602 ; N uni233D ; G 2296 +U 9022 ; WX 602 ; N uni233E ; G 2297 +U 9023 ; WX 602 ; N uni233F ; G 2298 +U 9024 ; WX 602 ; N uni2340 ; G 2299 +U 9025 ; WX 602 ; N uni2341 ; G 2300 +U 9026 ; WX 602 ; N uni2342 ; G 2301 +U 9027 ; WX 602 ; N uni2343 ; G 2302 +U 9028 ; WX 602 ; N uni2344 ; G 2303 +U 9029 ; WX 602 ; N uni2345 ; G 2304 +U 9030 ; WX 602 ; N uni2346 ; G 2305 +U 9031 ; WX 602 ; N uni2347 ; G 2306 +U 9032 ; WX 602 ; N uni2348 ; G 2307 +U 9033 ; WX 602 ; N uni2349 ; G 2308 +U 9034 ; WX 602 ; N uni234A ; G 2309 +U 9035 ; WX 602 ; N uni234B ; G 2310 +U 9036 ; WX 602 ; N uni234C ; G 2311 +U 9037 ; WX 602 ; N uni234D ; G 2312 +U 9038 ; WX 602 ; N uni234E ; G 2313 +U 9039 ; WX 602 ; N uni234F ; G 2314 +U 9040 ; WX 602 ; N uni2350 ; G 2315 +U 9041 ; WX 602 ; N uni2351 ; G 2316 +U 9042 ; WX 602 ; N uni2352 ; G 2317 +U 9043 ; WX 602 ; N uni2353 ; G 2318 +U 9044 ; WX 602 ; N uni2354 ; G 2319 +U 9045 ; WX 602 ; N uni2355 ; G 2320 +U 9046 ; WX 602 ; N uni2356 ; G 2321 +U 9047 ; WX 602 ; N uni2357 ; G 2322 +U 9048 ; WX 602 ; N uni2358 ; G 2323 +U 9049 ; WX 602 ; N uni2359 ; G 2324 +U 9050 ; WX 602 ; N uni235A ; G 2325 +U 9051 ; WX 602 ; N uni235B ; G 2326 +U 9052 ; WX 602 ; N uni235C ; G 2327 +U 9053 ; WX 602 ; N uni235D ; G 2328 +U 9054 ; WX 602 ; N uni235E ; G 2329 +U 9055 ; WX 602 ; N uni235F ; G 2330 +U 9056 ; WX 602 ; N uni2360 ; G 2331 +U 9057 ; WX 602 ; N uni2361 ; G 2332 +U 9058 ; WX 602 ; N uni2362 ; G 2333 +U 9059 ; WX 602 ; N uni2363 ; G 2334 +U 9060 ; WX 602 ; N uni2364 ; G 2335 +U 9061 ; WX 602 ; N uni2365 ; G 2336 +U 9062 ; WX 602 ; N uni2366 ; G 2337 +U 9063 ; WX 602 ; N uni2367 ; G 2338 +U 9064 ; WX 602 ; N uni2368 ; G 2339 +U 9065 ; WX 602 ; N uni2369 ; G 2340 +U 9066 ; WX 602 ; N uni236A ; G 2341 +U 9067 ; WX 602 ; N uni236B ; G 2342 +U 9068 ; WX 602 ; N uni236C ; G 2343 +U 9069 ; WX 602 ; N uni236D ; G 2344 +U 9070 ; WX 602 ; N uni236E ; G 2345 +U 9071 ; WX 602 ; N uni236F ; G 2346 +U 9072 ; WX 602 ; N uni2370 ; G 2347 +U 9073 ; WX 602 ; N uni2371 ; G 2348 +U 9074 ; WX 602 ; N uni2372 ; G 2349 +U 9075 ; WX 602 ; N uni2373 ; G 2350 +U 9076 ; WX 602 ; N uni2374 ; G 2351 +U 9077 ; WX 602 ; N uni2375 ; G 2352 +U 9078 ; WX 602 ; N uni2376 ; G 2353 +U 9079 ; WX 602 ; N uni2377 ; G 2354 +U 9080 ; WX 602 ; N uni2378 ; G 2355 +U 9081 ; WX 602 ; N uni2379 ; G 2356 +U 9082 ; WX 602 ; N uni237A ; G 2357 +U 9085 ; WX 602 ; N uni237D ; G 2358 +U 9088 ; WX 602 ; N uni2380 ; G 2359 +U 9089 ; WX 602 ; N uni2381 ; G 2360 +U 9090 ; WX 602 ; N uni2382 ; G 2361 +U 9091 ; WX 602 ; N uni2383 ; G 2362 +U 9096 ; WX 602 ; N uni2388 ; G 2363 +U 9097 ; WX 602 ; N uni2389 ; G 2364 +U 9098 ; WX 602 ; N uni238A ; G 2365 +U 9099 ; WX 602 ; N uni238B ; G 2366 +U 9109 ; WX 602 ; N uni2395 ; G 2367 +U 9115 ; WX 602 ; N uni239B ; G 2368 +U 9116 ; WX 602 ; N uni239C ; G 2369 +U 9117 ; WX 602 ; N uni239D ; G 2370 +U 9118 ; WX 602 ; N uni239E ; G 2371 +U 9119 ; WX 602 ; N uni239F ; G 2372 +U 9120 ; WX 602 ; N uni23A0 ; G 2373 +U 9121 ; WX 602 ; N uni23A1 ; G 2374 +U 9122 ; WX 602 ; N uni23A2 ; G 2375 +U 9123 ; WX 602 ; N uni23A3 ; G 2376 +U 9124 ; WX 602 ; N uni23A4 ; G 2377 +U 9125 ; WX 602 ; N uni23A5 ; G 2378 +U 9126 ; WX 602 ; N uni23A6 ; G 2379 +U 9127 ; WX 602 ; N uni23A7 ; G 2380 +U 9128 ; WX 602 ; N uni23A8 ; G 2381 +U 9129 ; WX 602 ; N uni23A9 ; G 2382 +U 9130 ; WX 602 ; N uni23AA ; G 2383 +U 9131 ; WX 602 ; N uni23AB ; G 2384 +U 9132 ; WX 602 ; N uni23AC ; G 2385 +U 9133 ; WX 602 ; N uni23AD ; G 2386 +U 9134 ; WX 602 ; N uni23AE ; G 2387 +U 9166 ; WX 602 ; N uni23CE ; G 2388 +U 9167 ; WX 602 ; N uni23CF ; G 2389 +U 9251 ; WX 602 ; N uni2423 ; G 2390 +U 9472 ; WX 602 ; N SF100000 ; G 2391 +U 9473 ; WX 602 ; N uni2501 ; G 2392 +U 9474 ; WX 602 ; N SF110000 ; G 2393 +U 9475 ; WX 602 ; N uni2503 ; G 2394 +U 9476 ; WX 602 ; N uni2504 ; G 2395 +U 9477 ; WX 602 ; N uni2505 ; G 2396 +U 9478 ; WX 602 ; N uni2506 ; G 2397 +U 9479 ; WX 602 ; N uni2507 ; G 2398 +U 9480 ; WX 602 ; N uni2508 ; G 2399 +U 9481 ; WX 602 ; N uni2509 ; G 2400 +U 9482 ; WX 602 ; N uni250A ; G 2401 +U 9483 ; WX 602 ; N uni250B ; G 2402 +U 9484 ; WX 602 ; N SF010000 ; G 2403 +U 9485 ; WX 602 ; N uni250D ; G 2404 +U 9486 ; WX 602 ; N uni250E ; G 2405 +U 9487 ; WX 602 ; N uni250F ; G 2406 +U 9488 ; WX 602 ; N SF030000 ; G 2407 +U 9489 ; WX 602 ; N uni2511 ; G 2408 +U 9490 ; WX 602 ; N uni2512 ; G 2409 +U 9491 ; WX 602 ; N uni2513 ; G 2410 +U 9492 ; WX 602 ; N SF020000 ; G 2411 +U 9493 ; WX 602 ; N uni2515 ; G 2412 +U 9494 ; WX 602 ; N uni2516 ; G 2413 +U 9495 ; WX 602 ; N uni2517 ; G 2414 +U 9496 ; WX 602 ; N SF040000 ; G 2415 +U 9497 ; WX 602 ; N uni2519 ; G 2416 +U 9498 ; WX 602 ; N uni251A ; G 2417 +U 9499 ; WX 602 ; N uni251B ; G 2418 +U 9500 ; WX 602 ; N SF080000 ; G 2419 +U 9501 ; WX 602 ; N uni251D ; G 2420 +U 9502 ; WX 602 ; N uni251E ; G 2421 +U 9503 ; WX 602 ; N uni251F ; G 2422 +U 9504 ; WX 602 ; N uni2520 ; G 2423 +U 9505 ; WX 602 ; N uni2521 ; G 2424 +U 9506 ; WX 602 ; N uni2522 ; G 2425 +U 9507 ; WX 602 ; N uni2523 ; G 2426 +U 9508 ; WX 602 ; N SF090000 ; G 2427 +U 9509 ; WX 602 ; N uni2525 ; G 2428 +U 9510 ; WX 602 ; N uni2526 ; G 2429 +U 9511 ; WX 602 ; N uni2527 ; G 2430 +U 9512 ; WX 602 ; N uni2528 ; G 2431 +U 9513 ; WX 602 ; N uni2529 ; G 2432 +U 9514 ; WX 602 ; N uni252A ; G 2433 +U 9515 ; WX 602 ; N uni252B ; G 2434 +U 9516 ; WX 602 ; N SF060000 ; G 2435 +U 9517 ; WX 602 ; N uni252D ; G 2436 +U 9518 ; WX 602 ; N uni252E ; G 2437 +U 9519 ; WX 602 ; N uni252F ; G 2438 +U 9520 ; WX 602 ; N uni2530 ; G 2439 +U 9521 ; WX 602 ; N uni2531 ; G 2440 +U 9522 ; WX 602 ; N uni2532 ; G 2441 +U 9523 ; WX 602 ; N uni2533 ; G 2442 +U 9524 ; WX 602 ; N SF070000 ; G 2443 +U 9525 ; WX 602 ; N uni2535 ; G 2444 +U 9526 ; WX 602 ; N uni2536 ; G 2445 +U 9527 ; WX 602 ; N uni2537 ; G 2446 +U 9528 ; WX 602 ; N uni2538 ; G 2447 +U 9529 ; WX 602 ; N uni2539 ; G 2448 +U 9530 ; WX 602 ; N uni253A ; G 2449 +U 9531 ; WX 602 ; N uni253B ; G 2450 +U 9532 ; WX 602 ; N SF050000 ; G 2451 +U 9533 ; WX 602 ; N uni253D ; G 2452 +U 9534 ; WX 602 ; N uni253E ; G 2453 +U 9535 ; WX 602 ; N uni253F ; G 2454 +U 9536 ; WX 602 ; N uni2540 ; G 2455 +U 9537 ; WX 602 ; N uni2541 ; G 2456 +U 9538 ; WX 602 ; N uni2542 ; G 2457 +U 9539 ; WX 602 ; N uni2543 ; G 2458 +U 9540 ; WX 602 ; N uni2544 ; G 2459 +U 9541 ; WX 602 ; N uni2545 ; G 2460 +U 9542 ; WX 602 ; N uni2546 ; G 2461 +U 9543 ; WX 602 ; N uni2547 ; G 2462 +U 9544 ; WX 602 ; N uni2548 ; G 2463 +U 9545 ; WX 602 ; N uni2549 ; G 2464 +U 9546 ; WX 602 ; N uni254A ; G 2465 +U 9547 ; WX 602 ; N uni254B ; G 2466 +U 9548 ; WX 602 ; N uni254C ; G 2467 +U 9549 ; WX 602 ; N uni254D ; G 2468 +U 9550 ; WX 602 ; N uni254E ; G 2469 +U 9551 ; WX 602 ; N uni254F ; G 2470 +U 9552 ; WX 602 ; N SF430000 ; G 2471 +U 9553 ; WX 602 ; N SF240000 ; G 2472 +U 9554 ; WX 602 ; N SF510000 ; G 2473 +U 9555 ; WX 602 ; N SF520000 ; G 2474 +U 9556 ; WX 602 ; N SF390000 ; G 2475 +U 9557 ; WX 602 ; N SF220000 ; G 2476 +U 9558 ; WX 602 ; N SF210000 ; G 2477 +U 9559 ; WX 602 ; N SF250000 ; G 2478 +U 9560 ; WX 602 ; N SF500000 ; G 2479 +U 9561 ; WX 602 ; N SF490000 ; G 2480 +U 9562 ; WX 602 ; N SF380000 ; G 2481 +U 9563 ; WX 602 ; N SF280000 ; G 2482 +U 9564 ; WX 602 ; N SF270000 ; G 2483 +U 9565 ; WX 602 ; N SF260000 ; G 2484 +U 9566 ; WX 602 ; N SF360000 ; G 2485 +U 9567 ; WX 602 ; N SF370000 ; G 2486 +U 9568 ; WX 602 ; N SF420000 ; G 2487 +U 9569 ; WX 602 ; N SF190000 ; G 2488 +U 9570 ; WX 602 ; N SF200000 ; G 2489 +U 9571 ; WX 602 ; N SF230000 ; G 2490 +U 9572 ; WX 602 ; N SF470000 ; G 2491 +U 9573 ; WX 602 ; N SF480000 ; G 2492 +U 9574 ; WX 602 ; N SF410000 ; G 2493 +U 9575 ; WX 602 ; N SF450000 ; G 2494 +U 9576 ; WX 602 ; N SF460000 ; G 2495 +U 9577 ; WX 602 ; N SF400000 ; G 2496 +U 9578 ; WX 602 ; N SF540000 ; G 2497 +U 9579 ; WX 602 ; N SF530000 ; G 2498 +U 9580 ; WX 602 ; N SF440000 ; G 2499 +U 9581 ; WX 602 ; N uni256D ; G 2500 +U 9582 ; WX 602 ; N uni256E ; G 2501 +U 9583 ; WX 602 ; N uni256F ; G 2502 +U 9584 ; WX 602 ; N uni2570 ; G 2503 +U 9585 ; WX 602 ; N uni2571 ; G 2504 +U 9586 ; WX 602 ; N uni2572 ; G 2505 +U 9587 ; WX 602 ; N uni2573 ; G 2506 +U 9588 ; WX 602 ; N uni2574 ; G 2507 +U 9589 ; WX 602 ; N uni2575 ; G 2508 +U 9590 ; WX 602 ; N uni2576 ; G 2509 +U 9591 ; WX 602 ; N uni2577 ; G 2510 +U 9592 ; WX 602 ; N uni2578 ; G 2511 +U 9593 ; WX 602 ; N uni2579 ; G 2512 +U 9594 ; WX 602 ; N uni257A ; G 2513 +U 9595 ; WX 602 ; N uni257B ; G 2514 +U 9596 ; WX 602 ; N uni257C ; G 2515 +U 9597 ; WX 602 ; N uni257D ; G 2516 +U 9598 ; WX 602 ; N uni257E ; G 2517 +U 9599 ; WX 602 ; N uni257F ; G 2518 +U 9600 ; WX 602 ; N upblock ; G 2519 +U 9601 ; WX 602 ; N uni2581 ; G 2520 +U 9602 ; WX 602 ; N uni2582 ; G 2521 +U 9603 ; WX 602 ; N uni2583 ; G 2522 +U 9604 ; WX 602 ; N dnblock ; G 2523 +U 9605 ; WX 602 ; N uni2585 ; G 2524 +U 9606 ; WX 602 ; N uni2586 ; G 2525 +U 9607 ; WX 602 ; N uni2587 ; G 2526 +U 9608 ; WX 602 ; N block ; G 2527 +U 9609 ; WX 602 ; N uni2589 ; G 2528 +U 9610 ; WX 602 ; N uni258A ; G 2529 +U 9611 ; WX 602 ; N uni258B ; G 2530 +U 9612 ; WX 602 ; N lfblock ; G 2531 +U 9613 ; WX 602 ; N uni258D ; G 2532 +U 9614 ; WX 602 ; N uni258E ; G 2533 +U 9615 ; WX 602 ; N uni258F ; G 2534 +U 9616 ; WX 602 ; N rtblock ; G 2535 +U 9617 ; WX 602 ; N ltshade ; G 2536 +U 9618 ; WX 602 ; N shade ; G 2537 +U 9619 ; WX 602 ; N dkshade ; G 2538 +U 9620 ; WX 602 ; N uni2594 ; G 2539 +U 9621 ; WX 602 ; N uni2595 ; G 2540 +U 9622 ; WX 602 ; N uni2596 ; G 2541 +U 9623 ; WX 602 ; N uni2597 ; G 2542 +U 9624 ; WX 602 ; N uni2598 ; G 2543 +U 9625 ; WX 602 ; N uni2599 ; G 2544 +U 9626 ; WX 602 ; N uni259A ; G 2545 +U 9627 ; WX 602 ; N uni259B ; G 2546 +U 9628 ; WX 602 ; N uni259C ; G 2547 +U 9629 ; WX 602 ; N uni259D ; G 2548 +U 9630 ; WX 602 ; N uni259E ; G 2549 +U 9631 ; WX 602 ; N uni259F ; G 2550 +U 9632 ; WX 602 ; N filledbox ; G 2551 +U 9633 ; WX 602 ; N H22073 ; G 2552 +U 9634 ; WX 602 ; N uni25A2 ; G 2553 +U 9635 ; WX 602 ; N uni25A3 ; G 2554 +U 9636 ; WX 602 ; N uni25A4 ; G 2555 +U 9637 ; WX 602 ; N uni25A5 ; G 2556 +U 9638 ; WX 602 ; N uni25A6 ; G 2557 +U 9639 ; WX 602 ; N uni25A7 ; G 2558 +U 9640 ; WX 602 ; N uni25A8 ; G 2559 +U 9641 ; WX 602 ; N uni25A9 ; G 2560 +U 9642 ; WX 602 ; N H18543 ; G 2561 +U 9643 ; WX 602 ; N H18551 ; G 2562 +U 9644 ; WX 602 ; N filledrect ; G 2563 +U 9645 ; WX 602 ; N uni25AD ; G 2564 +U 9646 ; WX 602 ; N uni25AE ; G 2565 +U 9647 ; WX 602 ; N uni25AF ; G 2566 +U 9648 ; WX 602 ; N uni25B0 ; G 2567 +U 9649 ; WX 602 ; N uni25B1 ; G 2568 +U 9650 ; WX 602 ; N triagup ; G 2569 +U 9651 ; WX 602 ; N uni25B3 ; G 2570 +U 9652 ; WX 602 ; N uni25B4 ; G 2571 +U 9653 ; WX 602 ; N uni25B5 ; G 2572 +U 9654 ; WX 602 ; N uni25B6 ; G 2573 +U 9655 ; WX 602 ; N uni25B7 ; G 2574 +U 9656 ; WX 602 ; N uni25B8 ; G 2575 +U 9657 ; WX 602 ; N uni25B9 ; G 2576 +U 9658 ; WX 602 ; N triagrt ; G 2577 +U 9659 ; WX 602 ; N uni25BB ; G 2578 +U 9660 ; WX 602 ; N triagdn ; G 2579 +U 9661 ; WX 602 ; N uni25BD ; G 2580 +U 9662 ; WX 602 ; N uni25BE ; G 2581 +U 9663 ; WX 602 ; N uni25BF ; G 2582 +U 9664 ; WX 602 ; N uni25C0 ; G 2583 +U 9665 ; WX 602 ; N uni25C1 ; G 2584 +U 9666 ; WX 602 ; N uni25C2 ; G 2585 +U 9667 ; WX 602 ; N uni25C3 ; G 2586 +U 9668 ; WX 602 ; N triaglf ; G 2587 +U 9669 ; WX 602 ; N uni25C5 ; G 2588 +U 9670 ; WX 602 ; N uni25C6 ; G 2589 +U 9671 ; WX 602 ; N uni25C7 ; G 2590 +U 9672 ; WX 602 ; N uni25C8 ; G 2591 +U 9673 ; WX 602 ; N uni25C9 ; G 2592 +U 9674 ; WX 602 ; N lozenge ; G 2593 +U 9675 ; WX 602 ; N circle ; G 2594 +U 9676 ; WX 602 ; N uni25CC ; G 2595 +U 9677 ; WX 602 ; N uni25CD ; G 2596 +U 9678 ; WX 602 ; N uni25CE ; G 2597 +U 9679 ; WX 602 ; N H18533 ; G 2598 +U 9680 ; WX 602 ; N uni25D0 ; G 2599 +U 9681 ; WX 602 ; N uni25D1 ; G 2600 +U 9682 ; WX 602 ; N uni25D2 ; G 2601 +U 9683 ; WX 602 ; N uni25D3 ; G 2602 +U 9684 ; WX 602 ; N uni25D4 ; G 2603 +U 9685 ; WX 602 ; N uni25D5 ; G 2604 +U 9686 ; WX 602 ; N uni25D6 ; G 2605 +U 9687 ; WX 602 ; N uni25D7 ; G 2606 +U 9688 ; WX 602 ; N invbullet ; G 2607 +U 9689 ; WX 602 ; N invcircle ; G 2608 +U 9690 ; WX 602 ; N uni25DA ; G 2609 +U 9691 ; WX 602 ; N uni25DB ; G 2610 +U 9692 ; WX 602 ; N uni25DC ; G 2611 +U 9693 ; WX 602 ; N uni25DD ; G 2612 +U 9694 ; WX 602 ; N uni25DE ; G 2613 +U 9695 ; WX 602 ; N uni25DF ; G 2614 +U 9696 ; WX 602 ; N uni25E0 ; G 2615 +U 9697 ; WX 602 ; N uni25E1 ; G 2616 +U 9698 ; WX 602 ; N uni25E2 ; G 2617 +U 9699 ; WX 602 ; N uni25E3 ; G 2618 +U 9700 ; WX 602 ; N uni25E4 ; G 2619 +U 9701 ; WX 602 ; N uni25E5 ; G 2620 +U 9702 ; WX 602 ; N openbullet ; G 2621 +U 9703 ; WX 602 ; N uni25E7 ; G 2622 +U 9704 ; WX 602 ; N uni25E8 ; G 2623 +U 9705 ; WX 602 ; N uni25E9 ; G 2624 +U 9706 ; WX 602 ; N uni25EA ; G 2625 +U 9707 ; WX 602 ; N uni25EB ; G 2626 +U 9708 ; WX 602 ; N uni25EC ; G 2627 +U 9709 ; WX 602 ; N uni25ED ; G 2628 +U 9710 ; WX 602 ; N uni25EE ; G 2629 +U 9711 ; WX 602 ; N uni25EF ; G 2630 +U 9712 ; WX 602 ; N uni25F0 ; G 2631 +U 9713 ; WX 602 ; N uni25F1 ; G 2632 +U 9714 ; WX 602 ; N uni25F2 ; G 2633 +U 9715 ; WX 602 ; N uni25F3 ; G 2634 +U 9716 ; WX 602 ; N uni25F4 ; G 2635 +U 9717 ; WX 602 ; N uni25F5 ; G 2636 +U 9718 ; WX 602 ; N uni25F6 ; G 2637 +U 9719 ; WX 602 ; N uni25F7 ; G 2638 +U 9720 ; WX 602 ; N uni25F8 ; G 2639 +U 9721 ; WX 602 ; N uni25F9 ; G 2640 +U 9722 ; WX 602 ; N uni25FA ; G 2641 +U 9723 ; WX 602 ; N uni25FB ; G 2642 +U 9724 ; WX 602 ; N uni25FC ; G 2643 +U 9725 ; WX 602 ; N uni25FD ; G 2644 +U 9726 ; WX 602 ; N uni25FE ; G 2645 +U 9727 ; WX 602 ; N uni25FF ; G 2646 +U 9728 ; WX 602 ; N uni2600 ; G 2647 +U 9729 ; WX 602 ; N uni2601 ; G 2648 +U 9730 ; WX 602 ; N uni2602 ; G 2649 +U 9731 ; WX 602 ; N uni2603 ; G 2650 +U 9732 ; WX 602 ; N uni2604 ; G 2651 +U 9733 ; WX 602 ; N uni2605 ; G 2652 +U 9734 ; WX 602 ; N uni2606 ; G 2653 +U 9735 ; WX 602 ; N uni2607 ; G 2654 +U 9736 ; WX 602 ; N uni2608 ; G 2655 +U 9737 ; WX 602 ; N uni2609 ; G 2656 +U 9738 ; WX 602 ; N uni260A ; G 2657 +U 9739 ; WX 602 ; N uni260B ; G 2658 +U 9740 ; WX 602 ; N uni260C ; G 2659 +U 9741 ; WX 602 ; N uni260D ; G 2660 +U 9742 ; WX 602 ; N uni260E ; G 2661 +U 9743 ; WX 602 ; N uni260F ; G 2662 +U 9744 ; WX 602 ; N uni2610 ; G 2663 +U 9745 ; WX 602 ; N uni2611 ; G 2664 +U 9746 ; WX 602 ; N uni2612 ; G 2665 +U 9747 ; WX 602 ; N uni2613 ; G 2666 +U 9748 ; WX 602 ; N uni2614 ; G 2667 +U 9749 ; WX 602 ; N uni2615 ; G 2668 +U 9750 ; WX 602 ; N uni2616 ; G 2669 +U 9751 ; WX 602 ; N uni2617 ; G 2670 +U 9752 ; WX 602 ; N uni2618 ; G 2671 +U 9753 ; WX 602 ; N uni2619 ; G 2672 +U 9754 ; WX 602 ; N uni261A ; G 2673 +U 9755 ; WX 602 ; N uni261B ; G 2674 +U 9756 ; WX 602 ; N uni261C ; G 2675 +U 9757 ; WX 602 ; N uni261D ; G 2676 +U 9758 ; WX 602 ; N uni261E ; G 2677 +U 9759 ; WX 602 ; N uni261F ; G 2678 +U 9760 ; WX 602 ; N uni2620 ; G 2679 +U 9761 ; WX 602 ; N uni2621 ; G 2680 +U 9762 ; WX 602 ; N uni2622 ; G 2681 +U 9763 ; WX 602 ; N uni2623 ; G 2682 +U 9764 ; WX 602 ; N uni2624 ; G 2683 +U 9765 ; WX 602 ; N uni2625 ; G 2684 +U 9766 ; WX 602 ; N uni2626 ; G 2685 +U 9767 ; WX 602 ; N uni2627 ; G 2686 +U 9768 ; WX 602 ; N uni2628 ; G 2687 +U 9769 ; WX 602 ; N uni2629 ; G 2688 +U 9770 ; WX 602 ; N uni262A ; G 2689 +U 9771 ; WX 602 ; N uni262B ; G 2690 +U 9772 ; WX 602 ; N uni262C ; G 2691 +U 9773 ; WX 602 ; N uni262D ; G 2692 +U 9774 ; WX 602 ; N uni262E ; G 2693 +U 9775 ; WX 602 ; N uni262F ; G 2694 +U 9784 ; WX 602 ; N uni2638 ; G 2695 +U 9785 ; WX 602 ; N uni2639 ; G 2696 +U 9786 ; WX 602 ; N smileface ; G 2697 +U 9787 ; WX 602 ; N invsmileface ; G 2698 +U 9788 ; WX 602 ; N sun ; G 2699 +U 9789 ; WX 602 ; N uni263D ; G 2700 +U 9790 ; WX 602 ; N uni263E ; G 2701 +U 9791 ; WX 602 ; N uni263F ; G 2702 +U 9792 ; WX 602 ; N female ; G 2703 +U 9793 ; WX 602 ; N uni2641 ; G 2704 +U 9794 ; WX 602 ; N male ; G 2705 +U 9795 ; WX 602 ; N uni2643 ; G 2706 +U 9796 ; WX 602 ; N uni2644 ; G 2707 +U 9797 ; WX 602 ; N uni2645 ; G 2708 +U 9798 ; WX 602 ; N uni2646 ; G 2709 +U 9799 ; WX 602 ; N uni2647 ; G 2710 +U 9800 ; WX 602 ; N uni2648 ; G 2711 +U 9801 ; WX 602 ; N uni2649 ; G 2712 +U 9802 ; WX 602 ; N uni264A ; G 2713 +U 9803 ; WX 602 ; N uni264B ; G 2714 +U 9804 ; WX 602 ; N uni264C ; G 2715 +U 9805 ; WX 602 ; N uni264D ; G 2716 +U 9806 ; WX 602 ; N uni264E ; G 2717 +U 9807 ; WX 602 ; N uni264F ; G 2718 +U 9808 ; WX 602 ; N uni2650 ; G 2719 +U 9809 ; WX 602 ; N uni2651 ; G 2720 +U 9810 ; WX 602 ; N uni2652 ; G 2721 +U 9811 ; WX 602 ; N uni2653 ; G 2722 +U 9812 ; WX 602 ; N uni2654 ; G 2723 +U 9813 ; WX 602 ; N uni2655 ; G 2724 +U 9814 ; WX 602 ; N uni2656 ; G 2725 +U 9815 ; WX 602 ; N uni2657 ; G 2726 +U 9816 ; WX 602 ; N uni2658 ; G 2727 +U 9817 ; WX 602 ; N uni2659 ; G 2728 +U 9818 ; WX 602 ; N uni265A ; G 2729 +U 9819 ; WX 602 ; N uni265B ; G 2730 +U 9820 ; WX 602 ; N uni265C ; G 2731 +U 9821 ; WX 602 ; N uni265D ; G 2732 +U 9822 ; WX 602 ; N uni265E ; G 2733 +U 9823 ; WX 602 ; N uni265F ; G 2734 +U 9824 ; WX 602 ; N spade ; G 2735 +U 9825 ; WX 602 ; N uni2661 ; G 2736 +U 9826 ; WX 602 ; N uni2662 ; G 2737 +U 9827 ; WX 602 ; N club ; G 2738 +U 9828 ; WX 602 ; N uni2664 ; G 2739 +U 9829 ; WX 602 ; N heart ; G 2740 +U 9830 ; WX 602 ; N diamond ; G 2741 +U 9831 ; WX 602 ; N uni2667 ; G 2742 +U 9832 ; WX 602 ; N uni2668 ; G 2743 +U 9833 ; WX 602 ; N uni2669 ; G 2744 +U 9834 ; WX 602 ; N musicalnote ; G 2745 +U 9835 ; WX 602 ; N musicalnotedbl ; G 2746 +U 9836 ; WX 602 ; N uni266C ; G 2747 +U 9837 ; WX 602 ; N uni266D ; G 2748 +U 9838 ; WX 602 ; N uni266E ; G 2749 +U 9839 ; WX 602 ; N uni266F ; G 2750 +U 9840 ; WX 602 ; N uni2670 ; G 2751 +U 9841 ; WX 602 ; N uni2671 ; G 2752 +U 9842 ; WX 602 ; N uni2672 ; G 2753 +U 9843 ; WX 602 ; N uni2673 ; G 2754 +U 9844 ; WX 602 ; N uni2674 ; G 2755 +U 9845 ; WX 602 ; N uni2675 ; G 2756 +U 9846 ; WX 602 ; N uni2676 ; G 2757 +U 9847 ; WX 602 ; N uni2677 ; G 2758 +U 9848 ; WX 602 ; N uni2678 ; G 2759 +U 9849 ; WX 602 ; N uni2679 ; G 2760 +U 9850 ; WX 602 ; N uni267A ; G 2761 +U 9851 ; WX 602 ; N uni267B ; G 2762 +U 9852 ; WX 602 ; N uni267C ; G 2763 +U 9853 ; WX 602 ; N uni267D ; G 2764 +U 9854 ; WX 602 ; N uni267E ; G 2765 +U 9855 ; WX 602 ; N uni267F ; G 2766 +U 9856 ; WX 602 ; N uni2680 ; G 2767 +U 9857 ; WX 602 ; N uni2681 ; G 2768 +U 9858 ; WX 602 ; N uni2682 ; G 2769 +U 9859 ; WX 602 ; N uni2683 ; G 2770 +U 9860 ; WX 602 ; N uni2684 ; G 2771 +U 9861 ; WX 602 ; N uni2685 ; G 2772 +U 9862 ; WX 602 ; N uni2686 ; G 2773 +U 9863 ; WX 602 ; N uni2687 ; G 2774 +U 9864 ; WX 602 ; N uni2688 ; G 2775 +U 9865 ; WX 602 ; N uni2689 ; G 2776 +U 9866 ; WX 602 ; N uni268A ; G 2777 +U 9867 ; WX 602 ; N uni268B ; G 2778 +U 9872 ; WX 602 ; N uni2690 ; G 2779 +U 9873 ; WX 602 ; N uni2691 ; G 2780 +U 9874 ; WX 602 ; N uni2692 ; G 2781 +U 9875 ; WX 602 ; N uni2693 ; G 2782 +U 9876 ; WX 602 ; N uni2694 ; G 2783 +U 9877 ; WX 602 ; N uni2695 ; G 2784 +U 9878 ; WX 602 ; N uni2696 ; G 2785 +U 9879 ; WX 602 ; N uni2697 ; G 2786 +U 9880 ; WX 602 ; N uni2698 ; G 2787 +U 9881 ; WX 602 ; N uni2699 ; G 2788 +U 9882 ; WX 602 ; N uni269A ; G 2789 +U 9883 ; WX 602 ; N uni269B ; G 2790 +U 9884 ; WX 602 ; N uni269C ; G 2791 +U 9888 ; WX 602 ; N uni26A0 ; G 2792 +U 9889 ; WX 602 ; N uni26A1 ; G 2793 +U 9904 ; WX 602 ; N uni26B0 ; G 2794 +U 9905 ; WX 602 ; N uni26B1 ; G 2795 +U 9985 ; WX 602 ; N uni2701 ; G 2796 +U 9986 ; WX 602 ; N uni2702 ; G 2797 +U 9987 ; WX 602 ; N uni2703 ; G 2798 +U 9988 ; WX 602 ; N uni2704 ; G 2799 +U 9990 ; WX 602 ; N uni2706 ; G 2800 +U 9991 ; WX 602 ; N uni2707 ; G 2801 +U 9992 ; WX 602 ; N uni2708 ; G 2802 +U 9993 ; WX 602 ; N uni2709 ; G 2803 +U 9996 ; WX 602 ; N uni270C ; G 2804 +U 9997 ; WX 602 ; N uni270D ; G 2805 +U 9998 ; WX 602 ; N uni270E ; G 2806 +U 9999 ; WX 602 ; N uni270F ; G 2807 +U 10000 ; WX 602 ; N uni2710 ; G 2808 +U 10001 ; WX 602 ; N uni2711 ; G 2809 +U 10002 ; WX 602 ; N uni2712 ; G 2810 +U 10003 ; WX 602 ; N uni2713 ; G 2811 +U 10004 ; WX 602 ; N uni2714 ; G 2812 +U 10005 ; WX 602 ; N uni2715 ; G 2813 +U 10006 ; WX 602 ; N uni2716 ; G 2814 +U 10007 ; WX 602 ; N uni2717 ; G 2815 +U 10008 ; WX 602 ; N uni2718 ; G 2816 +U 10009 ; WX 602 ; N uni2719 ; G 2817 +U 10010 ; WX 602 ; N uni271A ; G 2818 +U 10011 ; WX 602 ; N uni271B ; G 2819 +U 10012 ; WX 602 ; N uni271C ; G 2820 +U 10013 ; WX 602 ; N uni271D ; G 2821 +U 10014 ; WX 602 ; N uni271E ; G 2822 +U 10015 ; WX 602 ; N uni271F ; G 2823 +U 10016 ; WX 602 ; N uni2720 ; G 2824 +U 10017 ; WX 602 ; N uni2721 ; G 2825 +U 10018 ; WX 602 ; N uni2722 ; G 2826 +U 10019 ; WX 602 ; N uni2723 ; G 2827 +U 10020 ; WX 602 ; N uni2724 ; G 2828 +U 10021 ; WX 602 ; N uni2725 ; G 2829 +U 10022 ; WX 602 ; N uni2726 ; G 2830 +U 10023 ; WX 602 ; N uni2727 ; G 2831 +U 10025 ; WX 602 ; N uni2729 ; G 2832 +U 10026 ; WX 602 ; N uni272A ; G 2833 +U 10027 ; WX 602 ; N uni272B ; G 2834 +U 10028 ; WX 602 ; N uni272C ; G 2835 +U 10029 ; WX 602 ; N uni272D ; G 2836 +U 10030 ; WX 602 ; N uni272E ; G 2837 +U 10031 ; WX 602 ; N uni272F ; G 2838 +U 10032 ; WX 602 ; N uni2730 ; G 2839 +U 10033 ; WX 602 ; N uni2731 ; G 2840 +U 10034 ; WX 602 ; N uni2732 ; G 2841 +U 10035 ; WX 602 ; N uni2733 ; G 2842 +U 10036 ; WX 602 ; N uni2734 ; G 2843 +U 10037 ; WX 602 ; N uni2735 ; G 2844 +U 10038 ; WX 602 ; N uni2736 ; G 2845 +U 10039 ; WX 602 ; N uni2737 ; G 2846 +U 10040 ; WX 602 ; N uni2738 ; G 2847 +U 10041 ; WX 602 ; N uni2739 ; G 2848 +U 10042 ; WX 602 ; N uni273A ; G 2849 +U 10043 ; WX 602 ; N uni273B ; G 2850 +U 10044 ; WX 602 ; N uni273C ; G 2851 +U 10045 ; WX 602 ; N uni273D ; G 2852 +U 10046 ; WX 602 ; N uni273E ; G 2853 +U 10047 ; WX 602 ; N uni273F ; G 2854 +U 10048 ; WX 602 ; N uni2740 ; G 2855 +U 10049 ; WX 602 ; N uni2741 ; G 2856 +U 10050 ; WX 602 ; N uni2742 ; G 2857 +U 10051 ; WX 602 ; N uni2743 ; G 2858 +U 10052 ; WX 602 ; N uni2744 ; G 2859 +U 10053 ; WX 602 ; N uni2745 ; G 2860 +U 10054 ; WX 602 ; N uni2746 ; G 2861 +U 10055 ; WX 602 ; N uni2747 ; G 2862 +U 10056 ; WX 602 ; N uni2748 ; G 2863 +U 10057 ; WX 602 ; N uni2749 ; G 2864 +U 10058 ; WX 602 ; N uni274A ; G 2865 +U 10059 ; WX 602 ; N uni274B ; G 2866 +U 10061 ; WX 602 ; N uni274D ; G 2867 +U 10063 ; WX 602 ; N uni274F ; G 2868 +U 10064 ; WX 602 ; N uni2750 ; G 2869 +U 10065 ; WX 602 ; N uni2751 ; G 2870 +U 10066 ; WX 602 ; N uni2752 ; G 2871 +U 10070 ; WX 602 ; N uni2756 ; G 2872 +U 10072 ; WX 602 ; N uni2758 ; G 2873 +U 10073 ; WX 602 ; N uni2759 ; G 2874 +U 10074 ; WX 602 ; N uni275A ; G 2875 +U 10075 ; WX 602 ; N uni275B ; G 2876 +U 10076 ; WX 602 ; N uni275C ; G 2877 +U 10077 ; WX 602 ; N uni275D ; G 2878 +U 10078 ; WX 602 ; N uni275E ; G 2879 +U 10081 ; WX 602 ; N uni2761 ; G 2880 +U 10082 ; WX 602 ; N uni2762 ; G 2881 +U 10083 ; WX 602 ; N uni2763 ; G 2882 +U 10084 ; WX 602 ; N uni2764 ; G 2883 +U 10085 ; WX 602 ; N uni2765 ; G 2884 +U 10086 ; WX 602 ; N uni2766 ; G 2885 +U 10087 ; WX 602 ; N uni2767 ; G 2886 +U 10088 ; WX 602 ; N uni2768 ; G 2887 +U 10089 ; WX 602 ; N uni2769 ; G 2888 +U 10090 ; WX 602 ; N uni276A ; G 2889 +U 10091 ; WX 602 ; N uni276B ; G 2890 +U 10092 ; WX 602 ; N uni276C ; G 2891 +U 10093 ; WX 602 ; N uni276D ; G 2892 +U 10094 ; WX 602 ; N uni276E ; G 2893 +U 10095 ; WX 602 ; N uni276F ; G 2894 +U 10096 ; WX 602 ; N uni2770 ; G 2895 +U 10097 ; WX 602 ; N uni2771 ; G 2896 +U 10098 ; WX 602 ; N uni2772 ; G 2897 +U 10099 ; WX 602 ; N uni2773 ; G 2898 +U 10100 ; WX 602 ; N uni2774 ; G 2899 +U 10101 ; WX 602 ; N uni2775 ; G 2900 +U 10132 ; WX 602 ; N uni2794 ; G 2901 +U 10136 ; WX 602 ; N uni2798 ; G 2902 +U 10137 ; WX 602 ; N uni2799 ; G 2903 +U 10138 ; WX 602 ; N uni279A ; G 2904 +U 10139 ; WX 602 ; N uni279B ; G 2905 +U 10140 ; WX 602 ; N uni279C ; G 2906 +U 10141 ; WX 602 ; N uni279D ; G 2907 +U 10142 ; WX 602 ; N uni279E ; G 2908 +U 10143 ; WX 602 ; N uni279F ; G 2909 +U 10144 ; WX 602 ; N uni27A0 ; G 2910 +U 10145 ; WX 602 ; N uni27A1 ; G 2911 +U 10146 ; WX 602 ; N uni27A2 ; G 2912 +U 10147 ; WX 602 ; N uni27A3 ; G 2913 +U 10148 ; WX 602 ; N uni27A4 ; G 2914 +U 10149 ; WX 602 ; N uni27A5 ; G 2915 +U 10150 ; WX 602 ; N uni27A6 ; G 2916 +U 10151 ; WX 602 ; N uni27A7 ; G 2917 +U 10152 ; WX 602 ; N uni27A8 ; G 2918 +U 10153 ; WX 602 ; N uni27A9 ; G 2919 +U 10154 ; WX 602 ; N uni27AA ; G 2920 +U 10155 ; WX 602 ; N uni27AB ; G 2921 +U 10156 ; WX 602 ; N uni27AC ; G 2922 +U 10157 ; WX 602 ; N uni27AD ; G 2923 +U 10158 ; WX 602 ; N uni27AE ; G 2924 +U 10159 ; WX 602 ; N uni27AF ; G 2925 +U 10161 ; WX 602 ; N uni27B1 ; G 2926 +U 10162 ; WX 602 ; N uni27B2 ; G 2927 +U 10163 ; WX 602 ; N uni27B3 ; G 2928 +U 10164 ; WX 602 ; N uni27B4 ; G 2929 +U 10165 ; WX 602 ; N uni27B5 ; G 2930 +U 10166 ; WX 602 ; N uni27B6 ; G 2931 +U 10167 ; WX 602 ; N uni27B7 ; G 2932 +U 10168 ; WX 602 ; N uni27B8 ; G 2933 +U 10169 ; WX 602 ; N uni27B9 ; G 2934 +U 10170 ; WX 602 ; N uni27BA ; G 2935 +U 10171 ; WX 602 ; N uni27BB ; G 2936 +U 10172 ; WX 602 ; N uni27BC ; G 2937 +U 10173 ; WX 602 ; N uni27BD ; G 2938 +U 10174 ; WX 602 ; N uni27BE ; G 2939 +U 10178 ; WX 602 ; N uni27C2 ; G 2940 +U 10181 ; WX 602 ; N uni27C5 ; G 2941 +U 10182 ; WX 602 ; N uni27C6 ; G 2942 +U 10204 ; WX 602 ; N uni27DC ; G 2943 +U 10208 ; WX 602 ; N uni27E0 ; G 2944 +U 10214 ; WX 602 ; N uni27E6 ; G 2945 +U 10215 ; WX 602 ; N uni27E7 ; G 2946 +U 10216 ; WX 602 ; N uni27E8 ; G 2947 +U 10217 ; WX 602 ; N uni27E9 ; G 2948 +U 10218 ; WX 602 ; N uni27EA ; G 2949 +U 10219 ; WX 602 ; N uni27EB ; G 2950 +U 10229 ; WX 602 ; N uni27F5 ; G 2951 +U 10230 ; WX 602 ; N uni27F6 ; G 2952 +U 10231 ; WX 602 ; N uni27F7 ; G 2953 +U 10631 ; WX 602 ; N uni2987 ; G 2954 +U 10632 ; WX 602 ; N uni2988 ; G 2955 +U 10647 ; WX 602 ; N uni2997 ; G 2956 +U 10648 ; WX 602 ; N uni2998 ; G 2957 +U 10731 ; WX 602 ; N uni29EB ; G 2958 +U 10746 ; WX 602 ; N uni29FA ; G 2959 +U 10747 ; WX 602 ; N uni29FB ; G 2960 +U 10752 ; WX 602 ; N uni2A00 ; G 2961 +U 10799 ; WX 602 ; N uni2A2F ; G 2962 +U 10858 ; WX 602 ; N uni2A6A ; G 2963 +U 10859 ; WX 602 ; N uni2A6B ; G 2964 +U 11013 ; WX 602 ; N uni2B05 ; G 2965 +U 11014 ; WX 602 ; N uni2B06 ; G 2966 +U 11015 ; WX 602 ; N uni2B07 ; G 2967 +U 11016 ; WX 602 ; N uni2B08 ; G 2968 +U 11017 ; WX 602 ; N uni2B09 ; G 2969 +U 11018 ; WX 602 ; N uni2B0A ; G 2970 +U 11019 ; WX 602 ; N uni2B0B ; G 2971 +U 11020 ; WX 602 ; N uni2B0C ; G 2972 +U 11021 ; WX 602 ; N uni2B0D ; G 2973 +U 11026 ; WX 602 ; N uni2B12 ; G 2974 +U 11027 ; WX 602 ; N uni2B13 ; G 2975 +U 11028 ; WX 602 ; N uni2B14 ; G 2976 +U 11029 ; WX 602 ; N uni2B15 ; G 2977 +U 11030 ; WX 602 ; N uni2B16 ; G 2978 +U 11031 ; WX 602 ; N uni2B17 ; G 2979 +U 11032 ; WX 602 ; N uni2B18 ; G 2980 +U 11033 ; WX 602 ; N uni2B19 ; G 2981 +U 11034 ; WX 602 ; N uni2B1A ; G 2982 +U 11364 ; WX 602 ; N uni2C64 ; G 2983 +U 11373 ; WX 602 ; N uni2C6D ; G 2984 +U 11374 ; WX 602 ; N uni2C6E ; G 2985 +U 11375 ; WX 602 ; N uni2C6F ; G 2986 +U 11376 ; WX 602 ; N uni2C70 ; G 2987 +U 11381 ; WX 602 ; N uni2C75 ; G 2988 +U 11382 ; WX 602 ; N uni2C76 ; G 2989 +U 11383 ; WX 602 ; N uni2C77 ; G 2990 +U 11385 ; WX 602 ; N uni2C79 ; G 2991 +U 11386 ; WX 602 ; N uni2C7A ; G 2992 +U 11388 ; WX 602 ; N uni2C7C ; G 2993 +U 11389 ; WX 602 ; N uni2C7D ; G 2994 +U 11390 ; WX 602 ; N uni2C7E ; G 2995 +U 11391 ; WX 602 ; N uni2C7F ; G 2996 +U 11800 ; WX 602 ; N uni2E18 ; G 2997 +U 11807 ; WX 602 ; N uni2E1F ; G 2998 +U 11810 ; WX 602 ; N uni2E22 ; G 2999 +U 11811 ; WX 602 ; N uni2E23 ; G 3000 +U 11812 ; WX 602 ; N uni2E24 ; G 3001 +U 11813 ; WX 602 ; N uni2E25 ; G 3002 +U 11822 ; WX 602 ; N uni2E2E ; G 3003 +U 42760 ; WX 602 ; N uniA708 ; G 3004 +U 42761 ; WX 602 ; N uniA709 ; G 3005 +U 42762 ; WX 602 ; N uniA70A ; G 3006 +U 42763 ; WX 602 ; N uniA70B ; G 3007 +U 42764 ; WX 602 ; N uniA70C ; G 3008 +U 42765 ; WX 602 ; N uniA70D ; G 3009 +U 42766 ; WX 602 ; N uniA70E ; G 3010 +U 42767 ; WX 602 ; N uniA70F ; G 3011 +U 42768 ; WX 602 ; N uniA710 ; G 3012 +U 42769 ; WX 602 ; N uniA711 ; G 3013 +U 42770 ; WX 602 ; N uniA712 ; G 3014 +U 42771 ; WX 602 ; N uniA713 ; G 3015 +U 42772 ; WX 602 ; N uniA714 ; G 3016 +U 42773 ; WX 602 ; N uniA715 ; G 3017 +U 42774 ; WX 602 ; N uniA716 ; G 3018 +U 42779 ; WX 602 ; N uniA71B ; G 3019 +U 42780 ; WX 602 ; N uniA71C ; G 3020 +U 42781 ; WX 602 ; N uniA71D ; G 3021 +U 42782 ; WX 602 ; N uniA71E ; G 3022 +U 42783 ; WX 602 ; N uniA71F ; G 3023 +U 42786 ; WX 602 ; N uniA722 ; G 3024 +U 42787 ; WX 602 ; N uniA723 ; G 3025 +U 42788 ; WX 602 ; N uniA724 ; G 3026 +U 42789 ; WX 602 ; N uniA725 ; G 3027 +U 42790 ; WX 602 ; N uniA726 ; G 3028 +U 42791 ; WX 602 ; N uniA727 ; G 3029 +U 42889 ; WX 602 ; N uniA789 ; G 3030 +U 42890 ; WX 602 ; N uniA78A ; G 3031 +U 42891 ; WX 602 ; N uniA78B ; G 3032 +U 42892 ; WX 602 ; N uniA78C ; G 3033 +U 42893 ; WX 602 ; N uniA78D ; G 3034 +U 42894 ; WX 602 ; N uniA78E ; G 3035 +U 42896 ; WX 602 ; N uniA790 ; G 3036 +U 42897 ; WX 602 ; N uniA791 ; G 3037 +U 42922 ; WX 602 ; N uniA7AA ; G 3038 +U 43000 ; WX 602 ; N uniA7F8 ; G 3039 +U 43001 ; WX 602 ; N uniA7F9 ; G 3040 +U 63173 ; WX 602 ; N uniF6C5 ; G 3041 +U 64257 ; WX 602 ; N fi ; G 3042 +U 64258 ; WX 602 ; N fl ; G 3043 +U 64338 ; WX 602 ; N uniFB52 ; G 3044 +U 64339 ; WX 602 ; N uniFB53 ; G 3045 +U 64340 ; WX 602 ; N uniFB54 ; G 3046 +U 64341 ; WX 602 ; N uniFB55 ; G 3047 +U 64342 ; WX 602 ; N uniFB56 ; G 3048 +U 64343 ; WX 602 ; N uniFB57 ; G 3049 +U 64344 ; WX 602 ; N uniFB58 ; G 3050 +U 64345 ; WX 602 ; N uniFB59 ; G 3051 +U 64346 ; WX 602 ; N uniFB5A ; G 3052 +U 64347 ; WX 602 ; N uniFB5B ; G 3053 +U 64348 ; WX 602 ; N uniFB5C ; G 3054 +U 64349 ; WX 602 ; N uniFB5D ; G 3055 +U 64350 ; WX 602 ; N uniFB5E ; G 3056 +U 64351 ; WX 602 ; N uniFB5F ; G 3057 +U 64352 ; WX 602 ; N uniFB60 ; G 3058 +U 64353 ; WX 602 ; N uniFB61 ; G 3059 +U 64354 ; WX 602 ; N uniFB62 ; G 3060 +U 64355 ; WX 602 ; N uniFB63 ; G 3061 +U 64356 ; WX 602 ; N uniFB64 ; G 3062 +U 64357 ; WX 602 ; N uniFB65 ; G 3063 +U 64358 ; WX 602 ; N uniFB66 ; G 3064 +U 64359 ; WX 602 ; N uniFB67 ; G 3065 +U 64360 ; WX 602 ; N uniFB68 ; G 3066 +U 64361 ; WX 602 ; N uniFB69 ; G 3067 +U 64362 ; WX 602 ; N uniFB6A ; G 3068 +U 64363 ; WX 602 ; N uniFB6B ; G 3069 +U 64364 ; WX 602 ; N uniFB6C ; G 3070 +U 64365 ; WX 602 ; N uniFB6D ; G 3071 +U 64366 ; WX 602 ; N uniFB6E ; G 3072 +U 64367 ; WX 602 ; N uniFB6F ; G 3073 +U 64368 ; WX 602 ; N uniFB70 ; G 3074 +U 64369 ; WX 602 ; N uniFB71 ; G 3075 +U 64370 ; WX 602 ; N uniFB72 ; G 3076 +U 64371 ; WX 602 ; N uniFB73 ; G 3077 +U 64372 ; WX 602 ; N uniFB74 ; G 3078 +U 64373 ; WX 602 ; N uniFB75 ; G 3079 +U 64374 ; WX 602 ; N uniFB76 ; G 3080 +U 64375 ; WX 602 ; N uniFB77 ; G 3081 +U 64376 ; WX 602 ; N uniFB78 ; G 3082 +U 64377 ; WX 602 ; N uniFB79 ; G 3083 +U 64378 ; WX 602 ; N uniFB7A ; G 3084 +U 64379 ; WX 602 ; N uniFB7B ; G 3085 +U 64380 ; WX 602 ; N uniFB7C ; G 3086 +U 64381 ; WX 602 ; N uniFB7D ; G 3087 +U 64382 ; WX 602 ; N uniFB7E ; G 3088 +U 64383 ; WX 602 ; N uniFB7F ; G 3089 +U 64384 ; WX 602 ; N uniFB80 ; G 3090 +U 64385 ; WX 602 ; N uniFB81 ; G 3091 +U 64394 ; WX 602 ; N uniFB8A ; G 3092 +U 64395 ; WX 602 ; N uniFB8B ; G 3093 +U 64396 ; WX 602 ; N uniFB8C ; G 3094 +U 64397 ; WX 602 ; N uniFB8D ; G 3095 +U 64398 ; WX 602 ; N uniFB8E ; G 3096 +U 64399 ; WX 602 ; N uniFB8F ; G 3097 +U 64400 ; WX 602 ; N uniFB90 ; G 3098 +U 64401 ; WX 602 ; N uniFB91 ; G 3099 +U 64402 ; WX 602 ; N uniFB92 ; G 3100 +U 64403 ; WX 602 ; N uniFB93 ; G 3101 +U 64404 ; WX 602 ; N uniFB94 ; G 3102 +U 64405 ; WX 602 ; N uniFB95 ; G 3103 +U 64414 ; WX 602 ; N uniFB9E ; G 3104 +U 64415 ; WX 602 ; N uniFB9F ; G 3105 +U 64426 ; WX 602 ; N uniFBAA ; G 3106 +U 64427 ; WX 602 ; N uniFBAB ; G 3107 +U 64428 ; WX 602 ; N uniFBAC ; G 3108 +U 64429 ; WX 602 ; N uniFBAD ; G 3109 +U 64488 ; WX 602 ; N uniFBE8 ; G 3110 +U 64489 ; WX 602 ; N uniFBE9 ; G 3111 +U 64508 ; WX 602 ; N uniFBFC ; G 3112 +U 64509 ; WX 602 ; N uniFBFD ; G 3113 +U 64510 ; WX 602 ; N uniFBFE ; G 3114 +U 64511 ; WX 602 ; N uniFBFF ; G 3115 +U 65136 ; WX 602 ; N uniFE70 ; G 3116 +U 65137 ; WX 602 ; N uniFE71 ; G 3117 +U 65138 ; WX 602 ; N uniFE72 ; G 3118 +U 65139 ; WX 602 ; N uniFE73 ; G 3119 +U 65140 ; WX 602 ; N uniFE74 ; G 3120 +U 65142 ; WX 602 ; N uniFE76 ; G 3121 +U 65143 ; WX 602 ; N uniFE77 ; G 3122 +U 65144 ; WX 602 ; N uniFE78 ; G 3123 +U 65145 ; WX 602 ; N uniFE79 ; G 3124 +U 65146 ; WX 602 ; N uniFE7A ; G 3125 +U 65147 ; WX 602 ; N uniFE7B ; G 3126 +U 65148 ; WX 602 ; N uniFE7C ; G 3127 +U 65149 ; WX 602 ; N uniFE7D ; G 3128 +U 65150 ; WX 602 ; N uniFE7E ; G 3129 +U 65151 ; WX 602 ; N uniFE7F ; G 3130 +U 65152 ; WX 602 ; N uniFE80 ; G 3131 +U 65153 ; WX 602 ; N uniFE81 ; G 3132 +U 65154 ; WX 602 ; N uniFE82 ; G 3133 +U 65155 ; WX 602 ; N uniFE83 ; G 3134 +U 65156 ; WX 602 ; N uniFE84 ; G 3135 +U 65157 ; WX 602 ; N uniFE85 ; G 3136 +U 65158 ; WX 602 ; N uniFE86 ; G 3137 +U 65159 ; WX 602 ; N uniFE87 ; G 3138 +U 65160 ; WX 602 ; N uniFE88 ; G 3139 +U 65161 ; WX 602 ; N uniFE89 ; G 3140 +U 65162 ; WX 602 ; N uniFE8A ; G 3141 +U 65163 ; WX 602 ; N uniFE8B ; G 3142 +U 65164 ; WX 602 ; N uniFE8C ; G 3143 +U 65165 ; WX 602 ; N uniFE8D ; G 3144 +U 65166 ; WX 602 ; N uniFE8E ; G 3145 +U 65167 ; WX 602 ; N uniFE8F ; G 3146 +U 65168 ; WX 602 ; N uniFE90 ; G 3147 +U 65169 ; WX 602 ; N uniFE91 ; G 3148 +U 65170 ; WX 602 ; N uniFE92 ; G 3149 +U 65171 ; WX 602 ; N uniFE93 ; G 3150 +U 65172 ; WX 602 ; N uniFE94 ; G 3151 +U 65173 ; WX 602 ; N uniFE95 ; G 3152 +U 65174 ; WX 602 ; N uniFE96 ; G 3153 +U 65175 ; WX 602 ; N uniFE97 ; G 3154 +U 65176 ; WX 602 ; N uniFE98 ; G 3155 +U 65177 ; WX 602 ; N uniFE99 ; G 3156 +U 65178 ; WX 602 ; N uniFE9A ; G 3157 +U 65179 ; WX 602 ; N uniFE9B ; G 3158 +U 65180 ; WX 602 ; N uniFE9C ; G 3159 +U 65181 ; WX 602 ; N uniFE9D ; G 3160 +U 65182 ; WX 602 ; N uniFE9E ; G 3161 +U 65183 ; WX 602 ; N uniFE9F ; G 3162 +U 65184 ; WX 602 ; N uniFEA0 ; G 3163 +U 65185 ; WX 602 ; N uniFEA1 ; G 3164 +U 65186 ; WX 602 ; N uniFEA2 ; G 3165 +U 65187 ; WX 602 ; N uniFEA3 ; G 3166 +U 65188 ; WX 602 ; N uniFEA4 ; G 3167 +U 65189 ; WX 602 ; N uniFEA5 ; G 3168 +U 65190 ; WX 602 ; N uniFEA6 ; G 3169 +U 65191 ; WX 602 ; N uniFEA7 ; G 3170 +U 65192 ; WX 602 ; N uniFEA8 ; G 3171 +U 65193 ; WX 602 ; N uniFEA9 ; G 3172 +U 65194 ; WX 602 ; N uniFEAA ; G 3173 +U 65195 ; WX 602 ; N uniFEAB ; G 3174 +U 65196 ; WX 602 ; N uniFEAC ; G 3175 +U 65197 ; WX 602 ; N uniFEAD ; G 3176 +U 65198 ; WX 602 ; N uniFEAE ; G 3177 +U 65199 ; WX 602 ; N uniFEAF ; G 3178 +U 65200 ; WX 602 ; N uniFEB0 ; G 3179 +U 65201 ; WX 602 ; N uniFEB1 ; G 3180 +U 65202 ; WX 602 ; N uniFEB2 ; G 3181 +U 65203 ; WX 602 ; N uniFEB3 ; G 3182 +U 65204 ; WX 602 ; N uniFEB4 ; G 3183 +U 65205 ; WX 602 ; N uniFEB5 ; G 3184 +U 65206 ; WX 602 ; N uniFEB6 ; G 3185 +U 65207 ; WX 602 ; N uniFEB7 ; G 3186 +U 65208 ; WX 602 ; N uniFEB8 ; G 3187 +U 65209 ; WX 602 ; N uniFEB9 ; G 3188 +U 65210 ; WX 602 ; N uniFEBA ; G 3189 +U 65211 ; WX 602 ; N uniFEBB ; G 3190 +U 65212 ; WX 602 ; N uniFEBC ; G 3191 +U 65213 ; WX 602 ; N uniFEBD ; G 3192 +U 65214 ; WX 602 ; N uniFEBE ; G 3193 +U 65215 ; WX 602 ; N uniFEBF ; G 3194 +U 65216 ; WX 602 ; N uniFEC0 ; G 3195 +U 65217 ; WX 602 ; N uniFEC1 ; G 3196 +U 65218 ; WX 602 ; N uniFEC2 ; G 3197 +U 65219 ; WX 602 ; N uniFEC3 ; G 3198 +U 65220 ; WX 602 ; N uniFEC4 ; G 3199 +U 65221 ; WX 602 ; N uniFEC5 ; G 3200 +U 65222 ; WX 602 ; N uniFEC6 ; G 3201 +U 65223 ; WX 602 ; N uniFEC7 ; G 3202 +U 65224 ; WX 602 ; N uniFEC8 ; G 3203 +U 65225 ; WX 602 ; N uniFEC9 ; G 3204 +U 65226 ; WX 602 ; N uniFECA ; G 3205 +U 65227 ; WX 602 ; N uniFECB ; G 3206 +U 65228 ; WX 602 ; N uniFECC ; G 3207 +U 65229 ; WX 602 ; N uniFECD ; G 3208 +U 65230 ; WX 602 ; N uniFECE ; G 3209 +U 65231 ; WX 602 ; N uniFECF ; G 3210 +U 65232 ; WX 602 ; N uniFED0 ; G 3211 +U 65233 ; WX 602 ; N uniFED1 ; G 3212 +U 65234 ; WX 602 ; N uniFED2 ; G 3213 +U 65235 ; WX 602 ; N uniFED3 ; G 3214 +U 65236 ; WX 602 ; N uniFED4 ; G 3215 +U 65237 ; WX 602 ; N uniFED5 ; G 3216 +U 65238 ; WX 602 ; N uniFED6 ; G 3217 +U 65239 ; WX 602 ; N uniFED7 ; G 3218 +U 65240 ; WX 602 ; N uniFED8 ; G 3219 +U 65241 ; WX 602 ; N uniFED9 ; G 3220 +U 65242 ; WX 602 ; N uniFEDA ; G 3221 +U 65243 ; WX 602 ; N uniFEDB ; G 3222 +U 65244 ; WX 602 ; N uniFEDC ; G 3223 +U 65245 ; WX 602 ; N uniFEDD ; G 3224 +U 65246 ; WX 602 ; N uniFEDE ; G 3225 +U 65247 ; WX 602 ; N uniFEDF ; G 3226 +U 65248 ; WX 602 ; N uniFEE0 ; G 3227 +U 65249 ; WX 602 ; N uniFEE1 ; G 3228 +U 65250 ; WX 602 ; N uniFEE2 ; G 3229 +U 65251 ; WX 602 ; N uniFEE3 ; G 3230 +U 65252 ; WX 602 ; N uniFEE4 ; G 3231 +U 65253 ; WX 602 ; N uniFEE5 ; G 3232 +U 65254 ; WX 602 ; N uniFEE6 ; G 3233 +U 65255 ; WX 602 ; N uniFEE7 ; G 3234 +U 65256 ; WX 602 ; N uniFEE8 ; G 3235 +U 65257 ; WX 602 ; N uniFEE9 ; G 3236 +U 65258 ; WX 602 ; N uniFEEA ; G 3237 +U 65259 ; WX 602 ; N uniFEEB ; G 3238 +U 65260 ; WX 602 ; N uniFEEC ; G 3239 +U 65261 ; WX 602 ; N uniFEED ; G 3240 +U 65262 ; WX 602 ; N uniFEEE ; G 3241 +U 65263 ; WX 602 ; N uniFEEF ; G 3242 +U 65264 ; WX 602 ; N uniFEF0 ; G 3243 +U 65265 ; WX 602 ; N uniFEF1 ; G 3244 +U 65266 ; WX 602 ; N uniFEF2 ; G 3245 +U 65267 ; WX 602 ; N uniFEF3 ; G 3246 +U 65268 ; WX 602 ; N uniFEF4 ; G 3247 +U 65269 ; WX 602 ; N uniFEF5 ; G 3248 +U 65270 ; WX 602 ; N uniFEF6 ; G 3249 +U 65271 ; WX 602 ; N uniFEF7 ; G 3250 +U 65272 ; WX 602 ; N uniFEF8 ; G 3251 +U 65273 ; WX 602 ; N uniFEF9 ; G 3252 +U 65274 ; WX 602 ; N uniFEFA ; G 3253 +U 65275 ; WX 602 ; N uniFEFB ; G 3254 +U 65276 ; WX 602 ; N uniFEFC ; G 3255 +U 65279 ; WX 602 ; N uniFEFF ; G 3256 +U 65529 ; WX 602 ; N uniFFF9 ; G 3257 +U 65530 ; WX 602 ; N uniFFFA ; G 3258 +U 65531 ; WX 602 ; N uniFFFB ; G 3259 +U 65532 ; WX 602 ; N uniFFFC ; G 3260 +U 65533 ; WX 602 ; N uniFFFD ; G 3261 +EndCharMetrics +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Bold.ttf b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Bold.ttf new file mode 100644 index 0000000..3bb755f Binary files /dev/null and b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Bold.ttf differ diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Bold.ufm b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Bold.ufm new file mode 100644 index 0000000..7420dab --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Bold.ufm @@ -0,0 +1,4013 @@ +StartFontMetrics 4.1 +Notice Converted by PHP-font-lib +Comment https://github.com/PhenX/php-font-lib +EncodingScheme FontSpecific +FontName DejaVu Serif +FontSubfamily Bold +UniqueID DejaVu Serif Bold +FullName DejaVu Serif Bold +Version Version 2.37 +PostScriptName DejaVuSerif-Bold +Manufacturer DejaVu fonts team +FontVendorURL http://dejavu.sourceforge.net +LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License +PreferredFamily DejaVu Serif +PreferredSubfamily Bold +Weight Bold +ItalicAngle 0 +IsFixedPitch false +UnderlineThickness 44 +UnderlinePosition -63 +FontHeightOffset 0 +Ascender 939 +Descender -236 +FontBBox -836 -389 1854 1145 +StartCharMetrics 3506 +U 32 ; WX 348 ; N space ; G 3 +U 33 ; WX 439 ; N exclam ; G 4 +U 34 ; WX 521 ; N quotedbl ; G 5 +U 35 ; WX 838 ; N numbersign ; G 6 +U 36 ; WX 696 ; N dollar ; G 7 +U 37 ; WX 950 ; N percent ; G 8 +U 38 ; WX 903 ; N ampersand ; G 9 +U 39 ; WX 306 ; N quotesingle ; G 10 +U 40 ; WX 473 ; N parenleft ; G 11 +U 41 ; WX 473 ; N parenright ; G 12 +U 42 ; WX 523 ; N asterisk ; G 13 +U 43 ; WX 838 ; N plus ; G 14 +U 44 ; WX 348 ; N comma ; G 15 +U 45 ; WX 415 ; N hyphen ; G 16 +U 46 ; WX 348 ; N period ; G 17 +U 47 ; WX 365 ; N slash ; G 18 +U 48 ; WX 696 ; N zero ; G 19 +U 49 ; WX 696 ; N one ; G 20 +U 50 ; WX 696 ; N two ; G 21 +U 51 ; WX 696 ; N three ; G 22 +U 52 ; WX 696 ; N four ; G 23 +U 53 ; WX 696 ; N five ; G 24 +U 54 ; WX 696 ; N six ; G 25 +U 55 ; WX 696 ; N seven ; G 26 +U 56 ; WX 696 ; N eight ; G 27 +U 57 ; WX 696 ; N nine ; G 28 +U 58 ; WX 369 ; N colon ; G 29 +U 59 ; WX 369 ; N semicolon ; G 30 +U 60 ; WX 838 ; N less ; G 31 +U 61 ; WX 838 ; N equal ; G 32 +U 62 ; WX 838 ; N greater ; G 33 +U 63 ; WX 586 ; N question ; G 34 +U 64 ; WX 1000 ; N at ; G 35 +U 65 ; WX 776 ; N A ; G 36 +U 66 ; WX 845 ; N B ; G 37 +U 67 ; WX 796 ; N C ; G 38 +U 68 ; WX 867 ; N D ; G 39 +U 69 ; WX 762 ; N E ; G 40 +U 70 ; WX 710 ; N F ; G 41 +U 71 ; WX 854 ; N G ; G 42 +U 72 ; WX 945 ; N H ; G 43 +U 73 ; WX 468 ; N I ; G 44 +U 74 ; WX 473 ; N J ; G 45 +U 75 ; WX 869 ; N K ; G 46 +U 76 ; WX 703 ; N L ; G 47 +U 77 ; WX 1107 ; N M ; G 48 +U 78 ; WX 914 ; N N ; G 49 +U 79 ; WX 871 ; N O ; G 50 +U 80 ; WX 752 ; N P ; G 51 +U 81 ; WX 871 ; N Q ; G 52 +U 82 ; WX 831 ; N R ; G 53 +U 83 ; WX 722 ; N S ; G 54 +U 84 ; WX 744 ; N T ; G 55 +U 85 ; WX 872 ; N U ; G 56 +U 86 ; WX 776 ; N V ; G 57 +U 87 ; WX 1123 ; N W ; G 58 +U 88 ; WX 776 ; N X ; G 59 +U 89 ; WX 714 ; N Y ; G 60 +U 90 ; WX 730 ; N Z ; G 61 +U 91 ; WX 473 ; N bracketleft ; G 62 +U 92 ; WX 365 ; N backslash ; G 63 +U 93 ; WX 473 ; N bracketright ; G 64 +U 94 ; WX 838 ; N asciicircum ; G 65 +U 95 ; WX 500 ; N underscore ; G 66 +U 96 ; WX 500 ; N grave ; G 67 +U 97 ; WX 648 ; N a ; G 68 +U 98 ; WX 699 ; N b ; G 69 +U 99 ; WX 609 ; N c ; G 70 +U 100 ; WX 699 ; N d ; G 71 +U 101 ; WX 636 ; N e ; G 72 +U 102 ; WX 430 ; N f ; G 73 +U 103 ; WX 699 ; N g ; G 74 +U 104 ; WX 727 ; N h ; G 75 +U 105 ; WX 380 ; N i ; G 76 +U 106 ; WX 362 ; N j ; G 77 +U 107 ; WX 693 ; N k ; G 78 +U 108 ; WX 380 ; N l ; G 79 +U 109 ; WX 1058 ; N m ; G 80 +U 110 ; WX 727 ; N n ; G 81 +U 111 ; WX 667 ; N o ; G 82 +U 112 ; WX 699 ; N p ; G 83 +U 113 ; WX 699 ; N q ; G 84 +U 114 ; WX 527 ; N r ; G 85 +U 115 ; WX 563 ; N s ; G 86 +U 116 ; WX 462 ; N t ; G 87 +U 117 ; WX 727 ; N u ; G 88 +U 118 ; WX 581 ; N v ; G 89 +U 119 ; WX 861 ; N w ; G 90 +U 120 ; WX 596 ; N x ; G 91 +U 121 ; WX 581 ; N y ; G 92 +U 122 ; WX 568 ; N z ; G 93 +U 123 ; WX 643 ; N braceleft ; G 94 +U 124 ; WX 364 ; N bar ; G 95 +U 125 ; WX 643 ; N braceright ; G 96 +U 126 ; WX 838 ; N asciitilde ; G 97 +U 160 ; WX 348 ; N nbspace ; G 98 +U 161 ; WX 439 ; N exclamdown ; G 99 +U 162 ; WX 696 ; N cent ; G 100 +U 163 ; WX 696 ; N sterling ; G 101 +U 164 ; WX 636 ; N currency ; G 102 +U 165 ; WX 696 ; N yen ; G 103 +U 166 ; WX 364 ; N brokenbar ; G 104 +U 167 ; WX 523 ; N section ; G 105 +U 168 ; WX 500 ; N dieresis ; G 106 +U 169 ; WX 1000 ; N copyright ; G 107 +U 170 ; WX 487 ; N ordfeminine ; G 108 +U 171 ; WX 625 ; N guillemotleft ; G 109 +U 172 ; WX 838 ; N logicalnot ; G 110 +U 173 ; WX 415 ; N sfthyphen ; G 111 +U 174 ; WX 1000 ; N registered ; G 112 +U 175 ; WX 500 ; N macron ; G 113 +U 176 ; WX 500 ; N degree ; G 114 +U 177 ; WX 838 ; N plusminus ; G 115 +U 178 ; WX 438 ; N twosuperior ; G 116 +U 179 ; WX 438 ; N threesuperior ; G 117 +U 180 ; WX 500 ; N acute ; G 118 +U 181 ; WX 732 ; N mu ; G 119 +U 182 ; WX 636 ; N paragraph ; G 120 +U 183 ; WX 348 ; N periodcentered ; G 121 +U 184 ; WX 500 ; N cedilla ; G 122 +U 185 ; WX 438 ; N onesuperior ; G 123 +U 186 ; WX 500 ; N ordmasculine ; G 124 +U 187 ; WX 625 ; N guillemotright ; G 125 +U 188 ; WX 1043 ; N onequarter ; G 126 +U 189 ; WX 1043 ; N onehalf ; G 127 +U 190 ; WX 1043 ; N threequarters ; G 128 +U 191 ; WX 586 ; N questiondown ; G 129 +U 192 ; WX 776 ; N Agrave ; G 130 +U 193 ; WX 776 ; N Aacute ; G 131 +U 194 ; WX 776 ; N Acircumflex ; G 132 +U 195 ; WX 776 ; N Atilde ; G 133 +U 196 ; WX 776 ; N Adieresis ; G 134 +U 197 ; WX 776 ; N Aring ; G 135 +U 198 ; WX 1034 ; N AE ; G 136 +U 199 ; WX 796 ; N Ccedilla ; G 137 +U 200 ; WX 762 ; N Egrave ; G 138 +U 201 ; WX 762 ; N Eacute ; G 139 +U 202 ; WX 762 ; N Ecircumflex ; G 140 +U 203 ; WX 762 ; N Edieresis ; G 141 +U 204 ; WX 468 ; N Igrave ; G 142 +U 205 ; WX 468 ; N Iacute ; G 143 +U 206 ; WX 468 ; N Icircumflex ; G 144 +U 207 ; WX 468 ; N Idieresis ; G 145 +U 208 ; WX 874 ; N Eth ; G 146 +U 209 ; WX 914 ; N Ntilde ; G 147 +U 210 ; WX 871 ; N Ograve ; G 148 +U 211 ; WX 871 ; N Oacute ; G 149 +U 212 ; WX 871 ; N Ocircumflex ; G 150 +U 213 ; WX 871 ; N Otilde ; G 151 +U 214 ; WX 871 ; N Odieresis ; G 152 +U 215 ; WX 838 ; N multiply ; G 153 +U 216 ; WX 871 ; N Oslash ; G 154 +U 217 ; WX 872 ; N Ugrave ; G 155 +U 218 ; WX 872 ; N Uacute ; G 156 +U 219 ; WX 872 ; N Ucircumflex ; G 157 +U 220 ; WX 872 ; N Udieresis ; G 158 +U 221 ; WX 714 ; N Yacute ; G 159 +U 222 ; WX 757 ; N Thorn ; G 160 +U 223 ; WX 760 ; N germandbls ; G 161 +U 224 ; WX 648 ; N agrave ; G 162 +U 225 ; WX 648 ; N aacute ; G 163 +U 226 ; WX 648 ; N acircumflex ; G 164 +U 227 ; WX 648 ; N atilde ; G 165 +U 228 ; WX 648 ; N adieresis ; G 166 +U 229 ; WX 648 ; N aring ; G 167 +U 230 ; WX 975 ; N ae ; G 168 +U 231 ; WX 609 ; N ccedilla ; G 169 +U 232 ; WX 636 ; N egrave ; G 170 +U 233 ; WX 636 ; N eacute ; G 171 +U 234 ; WX 636 ; N ecircumflex ; G 172 +U 235 ; WX 636 ; N edieresis ; G 173 +U 236 ; WX 380 ; N igrave ; G 174 +U 237 ; WX 380 ; N iacute ; G 175 +U 238 ; WX 380 ; N icircumflex ; G 176 +U 239 ; WX 380 ; N idieresis ; G 177 +U 240 ; WX 667 ; N eth ; G 178 +U 241 ; WX 727 ; N ntilde ; G 179 +U 242 ; WX 667 ; N ograve ; G 180 +U 243 ; WX 667 ; N oacute ; G 181 +U 244 ; WX 667 ; N ocircumflex ; G 182 +U 245 ; WX 667 ; N otilde ; G 183 +U 246 ; WX 667 ; N odieresis ; G 184 +U 247 ; WX 838 ; N divide ; G 185 +U 248 ; WX 667 ; N oslash ; G 186 +U 249 ; WX 727 ; N ugrave ; G 187 +U 250 ; WX 727 ; N uacute ; G 188 +U 251 ; WX 727 ; N ucircumflex ; G 189 +U 252 ; WX 727 ; N udieresis ; G 190 +U 253 ; WX 581 ; N yacute ; G 191 +U 254 ; WX 699 ; N thorn ; G 192 +U 255 ; WX 581 ; N ydieresis ; G 193 +U 256 ; WX 776 ; N Amacron ; G 194 +U 257 ; WX 648 ; N amacron ; G 195 +U 258 ; WX 776 ; N Abreve ; G 196 +U 259 ; WX 648 ; N abreve ; G 197 +U 260 ; WX 776 ; N Aogonek ; G 198 +U 261 ; WX 648 ; N aogonek ; G 199 +U 262 ; WX 796 ; N Cacute ; G 200 +U 263 ; WX 609 ; N cacute ; G 201 +U 264 ; WX 796 ; N Ccircumflex ; G 202 +U 265 ; WX 609 ; N ccircumflex ; G 203 +U 266 ; WX 796 ; N Cdotaccent ; G 204 +U 267 ; WX 609 ; N cdotaccent ; G 205 +U 268 ; WX 796 ; N Ccaron ; G 206 +U 269 ; WX 609 ; N ccaron ; G 207 +U 270 ; WX 867 ; N Dcaron ; G 208 +U 271 ; WX 699 ; N dcaron ; G 209 +U 272 ; WX 874 ; N Dcroat ; G 210 +U 273 ; WX 699 ; N dmacron ; G 211 +U 274 ; WX 762 ; N Emacron ; G 212 +U 275 ; WX 636 ; N emacron ; G 213 +U 276 ; WX 762 ; N Ebreve ; G 214 +U 277 ; WX 636 ; N ebreve ; G 215 +U 278 ; WX 762 ; N Edotaccent ; G 216 +U 279 ; WX 636 ; N edotaccent ; G 217 +U 280 ; WX 762 ; N Eogonek ; G 218 +U 281 ; WX 636 ; N eogonek ; G 219 +U 282 ; WX 762 ; N Ecaron ; G 220 +U 283 ; WX 636 ; N ecaron ; G 221 +U 284 ; WX 854 ; N Gcircumflex ; G 222 +U 285 ; WX 699 ; N gcircumflex ; G 223 +U 286 ; WX 854 ; N Gbreve ; G 224 +U 287 ; WX 699 ; N gbreve ; G 225 +U 288 ; WX 854 ; N Gdotaccent ; G 226 +U 289 ; WX 699 ; N gdotaccent ; G 227 +U 290 ; WX 854 ; N Gcommaaccent ; G 228 +U 291 ; WX 699 ; N gcommaaccent ; G 229 +U 292 ; WX 945 ; N Hcircumflex ; G 230 +U 293 ; WX 727 ; N hcircumflex ; G 231 +U 294 ; WX 945 ; N Hbar ; G 232 +U 295 ; WX 727 ; N hbar ; G 233 +U 296 ; WX 468 ; N Itilde ; G 234 +U 297 ; WX 380 ; N itilde ; G 235 +U 298 ; WX 468 ; N Imacron ; G 236 +U 299 ; WX 380 ; N imacron ; G 237 +U 300 ; WX 468 ; N Ibreve ; G 238 +U 301 ; WX 380 ; N ibreve ; G 239 +U 302 ; WX 468 ; N Iogonek ; G 240 +U 303 ; WX 380 ; N iogonek ; G 241 +U 304 ; WX 468 ; N Idot ; G 242 +U 305 ; WX 380 ; N dotlessi ; G 243 +U 306 ; WX 942 ; N IJ ; G 244 +U 307 ; WX 751 ; N ij ; G 245 +U 308 ; WX 473 ; N Jcircumflex ; G 246 +U 309 ; WX 362 ; N jcircumflex ; G 247 +U 310 ; WX 869 ; N Kcommaaccent ; G 248 +U 311 ; WX 693 ; N kcommaaccent ; G 249 +U 312 ; WX 693 ; N kgreenlandic ; G 250 +U 313 ; WX 703 ; N Lacute ; G 251 +U 314 ; WX 380 ; N lacute ; G 252 +U 315 ; WX 703 ; N Lcommaaccent ; G 253 +U 316 ; WX 380 ; N lcommaaccent ; G 254 +U 317 ; WX 703 ; N Lcaron ; G 255 +U 318 ; WX 380 ; N lcaron ; G 256 +U 319 ; WX 703 ; N Ldot ; G 257 +U 320 ; WX 380 ; N ldot ; G 258 +U 321 ; WX 710 ; N Lslash ; G 259 +U 322 ; WX 385 ; N lslash ; G 260 +U 323 ; WX 914 ; N Nacute ; G 261 +U 324 ; WX 727 ; N nacute ; G 262 +U 325 ; WX 914 ; N Ncommaaccent ; G 263 +U 326 ; WX 727 ; N ncommaaccent ; G 264 +U 327 ; WX 914 ; N Ncaron ; G 265 +U 328 ; WX 727 ; N ncaron ; G 266 +U 329 ; WX 1008 ; N napostrophe ; G 267 +U 330 ; WX 872 ; N Eng ; G 268 +U 331 ; WX 727 ; N eng ; G 269 +U 332 ; WX 871 ; N Omacron ; G 270 +U 333 ; WX 667 ; N omacron ; G 271 +U 334 ; WX 871 ; N Obreve ; G 272 +U 335 ; WX 667 ; N obreve ; G 273 +U 336 ; WX 871 ; N Ohungarumlaut ; G 274 +U 337 ; WX 667 ; N ohungarumlaut ; G 275 +U 338 ; WX 1180 ; N OE ; G 276 +U 339 ; WX 1028 ; N oe ; G 277 +U 340 ; WX 831 ; N Racute ; G 278 +U 341 ; WX 527 ; N racute ; G 279 +U 342 ; WX 831 ; N Rcommaaccent ; G 280 +U 343 ; WX 527 ; N rcommaaccent ; G 281 +U 344 ; WX 831 ; N Rcaron ; G 282 +U 345 ; WX 527 ; N rcaron ; G 283 +U 346 ; WX 722 ; N Sacute ; G 284 +U 347 ; WX 563 ; N sacute ; G 285 +U 348 ; WX 722 ; N Scircumflex ; G 286 +U 349 ; WX 563 ; N scircumflex ; G 287 +U 350 ; WX 722 ; N Scedilla ; G 288 +U 351 ; WX 563 ; N scedilla ; G 289 +U 352 ; WX 722 ; N Scaron ; G 290 +U 353 ; WX 563 ; N scaron ; G 291 +U 354 ; WX 744 ; N Tcommaaccent ; G 292 +U 355 ; WX 462 ; N tcommaaccent ; G 293 +U 356 ; WX 744 ; N Tcaron ; G 294 +U 357 ; WX 462 ; N tcaron ; G 295 +U 358 ; WX 744 ; N Tbar ; G 296 +U 359 ; WX 462 ; N tbar ; G 297 +U 360 ; WX 872 ; N Utilde ; G 298 +U 361 ; WX 727 ; N utilde ; G 299 +U 362 ; WX 872 ; N Umacron ; G 300 +U 363 ; WX 727 ; N umacron ; G 301 +U 364 ; WX 872 ; N Ubreve ; G 302 +U 365 ; WX 727 ; N ubreve ; G 303 +U 366 ; WX 872 ; N Uring ; G 304 +U 367 ; WX 727 ; N uring ; G 305 +U 368 ; WX 872 ; N Uhungarumlaut ; G 306 +U 369 ; WX 727 ; N uhungarumlaut ; G 307 +U 370 ; WX 872 ; N Uogonek ; G 308 +U 371 ; WX 727 ; N uogonek ; G 309 +U 372 ; WX 1123 ; N Wcircumflex ; G 310 +U 373 ; WX 861 ; N wcircumflex ; G 311 +U 374 ; WX 714 ; N Ycircumflex ; G 312 +U 375 ; WX 581 ; N ycircumflex ; G 313 +U 376 ; WX 714 ; N Ydieresis ; G 314 +U 377 ; WX 730 ; N Zacute ; G 315 +U 378 ; WX 568 ; N zacute ; G 316 +U 379 ; WX 730 ; N Zdotaccent ; G 317 +U 380 ; WX 568 ; N zdotaccent ; G 318 +U 381 ; WX 730 ; N Zcaron ; G 319 +U 382 ; WX 568 ; N zcaron ; G 320 +U 383 ; WX 430 ; N longs ; G 321 +U 384 ; WX 699 ; N uni0180 ; G 322 +U 385 ; WX 845 ; N uni0181 ; G 323 +U 386 ; WX 854 ; N uni0182 ; G 324 +U 387 ; WX 699 ; N uni0183 ; G 325 +U 388 ; WX 854 ; N uni0184 ; G 326 +U 389 ; WX 699 ; N uni0185 ; G 327 +U 390 ; WX 796 ; N uni0186 ; G 328 +U 391 ; WX 796 ; N uni0187 ; G 329 +U 392 ; WX 609 ; N uni0188 ; G 330 +U 393 ; WX 874 ; N uni0189 ; G 331 +U 394 ; WX 867 ; N uni018A ; G 332 +U 395 ; WX 854 ; N uni018B ; G 333 +U 396 ; WX 699 ; N uni018C ; G 334 +U 397 ; WX 667 ; N uni018D ; G 335 +U 398 ; WX 762 ; N uni018E ; G 336 +U 399 ; WX 871 ; N uni018F ; G 337 +U 400 ; WX 721 ; N uni0190 ; G 338 +U 401 ; WX 710 ; N uni0191 ; G 339 +U 402 ; WX 430 ; N florin ; G 340 +U 403 ; WX 854 ; N uni0193 ; G 341 +U 404 ; WX 771 ; N uni0194 ; G 342 +U 405 ; WX 1043 ; N uni0195 ; G 343 +U 406 ; WX 468 ; N uni0196 ; G 344 +U 407 ; WX 468 ; N uni0197 ; G 345 +U 408 ; WX 869 ; N uni0198 ; G 346 +U 409 ; WX 693 ; N uni0199 ; G 347 +U 410 ; WX 380 ; N uni019A ; G 348 +U 411 ; WX 701 ; N uni019B ; G 349 +U 412 ; WX 1058 ; N uni019C ; G 350 +U 413 ; WX 914 ; N uni019D ; G 351 +U 414 ; WX 727 ; N uni019E ; G 352 +U 415 ; WX 871 ; N uni019F ; G 353 +U 416 ; WX 871 ; N Ohorn ; G 354 +U 417 ; WX 667 ; N ohorn ; G 355 +U 418 ; WX 1200 ; N uni01A2 ; G 356 +U 419 ; WX 943 ; N uni01A3 ; G 357 +U 420 ; WX 752 ; N uni01A4 ; G 358 +U 421 ; WX 699 ; N uni01A5 ; G 359 +U 422 ; WX 831 ; N uni01A6 ; G 360 +U 423 ; WX 722 ; N uni01A7 ; G 361 +U 424 ; WX 563 ; N uni01A8 ; G 362 +U 425 ; WX 707 ; N uni01A9 ; G 363 +U 426 ; WX 331 ; N uni01AA ; G 364 +U 427 ; WX 462 ; N uni01AB ; G 365 +U 428 ; WX 744 ; N uni01AC ; G 366 +U 429 ; WX 462 ; N uni01AD ; G 367 +U 430 ; WX 744 ; N uni01AE ; G 368 +U 431 ; WX 872 ; N Uhorn ; G 369 +U 432 ; WX 727 ; N uhorn ; G 370 +U 433 ; WX 890 ; N uni01B1 ; G 371 +U 434 ; WX 890 ; N uni01B2 ; G 372 +U 435 ; WX 714 ; N uni01B3 ; G 373 +U 436 ; WX 708 ; N uni01B4 ; G 374 +U 437 ; WX 730 ; N uni01B5 ; G 375 +U 438 ; WX 568 ; N uni01B6 ; G 376 +U 439 ; WX 657 ; N uni01B7 ; G 377 +U 440 ; WX 657 ; N uni01B8 ; G 378 +U 441 ; WX 657 ; N uni01B9 ; G 379 +U 442 ; WX 657 ; N uni01BA ; G 380 +U 443 ; WX 696 ; N uni01BB ; G 381 +U 444 ; WX 754 ; N uni01BC ; G 382 +U 445 ; WX 568 ; N uni01BD ; G 383 +U 446 ; WX 536 ; N uni01BE ; G 384 +U 447 ; WX 716 ; N uni01BF ; G 385 +U 448 ; WX 295 ; N uni01C0 ; G 386 +U 449 ; WX 492 ; N uni01C1 ; G 387 +U 450 ; WX 459 ; N uni01C2 ; G 388 +U 451 ; WX 295 ; N uni01C3 ; G 389 +U 452 ; WX 1597 ; N uni01C4 ; G 390 +U 453 ; WX 1435 ; N uni01C5 ; G 391 +U 454 ; WX 1267 ; N uni01C6 ; G 392 +U 455 ; WX 1176 ; N uni01C7 ; G 393 +U 456 ; WX 1065 ; N uni01C8 ; G 394 +U 457 ; WX 742 ; N uni01C9 ; G 395 +U 458 ; WX 1387 ; N uni01CA ; G 396 +U 459 ; WX 1276 ; N uni01CB ; G 397 +U 460 ; WX 1089 ; N uni01CC ; G 398 +U 461 ; WX 776 ; N uni01CD ; G 399 +U 462 ; WX 648 ; N uni01CE ; G 400 +U 463 ; WX 468 ; N uni01CF ; G 401 +U 464 ; WX 380 ; N uni01D0 ; G 402 +U 465 ; WX 871 ; N uni01D1 ; G 403 +U 466 ; WX 667 ; N uni01D2 ; G 404 +U 467 ; WX 872 ; N uni01D3 ; G 405 +U 468 ; WX 727 ; N uni01D4 ; G 406 +U 469 ; WX 872 ; N uni01D5 ; G 407 +U 470 ; WX 727 ; N uni01D6 ; G 408 +U 471 ; WX 872 ; N uni01D7 ; G 409 +U 472 ; WX 727 ; N uni01D8 ; G 410 +U 473 ; WX 872 ; N uni01D9 ; G 411 +U 474 ; WX 727 ; N uni01DA ; G 412 +U 475 ; WX 872 ; N uni01DB ; G 413 +U 476 ; WX 727 ; N uni01DC ; G 414 +U 477 ; WX 636 ; N uni01DD ; G 415 +U 478 ; WX 776 ; N uni01DE ; G 416 +U 479 ; WX 648 ; N uni01DF ; G 417 +U 480 ; WX 776 ; N uni01E0 ; G 418 +U 481 ; WX 648 ; N uni01E1 ; G 419 +U 482 ; WX 1034 ; N uni01E2 ; G 420 +U 483 ; WX 975 ; N uni01E3 ; G 421 +U 484 ; WX 896 ; N uni01E4 ; G 422 +U 485 ; WX 699 ; N uni01E5 ; G 423 +U 486 ; WX 854 ; N Gcaron ; G 424 +U 487 ; WX 699 ; N gcaron ; G 425 +U 488 ; WX 869 ; N uni01E8 ; G 426 +U 489 ; WX 693 ; N uni01E9 ; G 427 +U 490 ; WX 871 ; N uni01EA ; G 428 +U 491 ; WX 667 ; N uni01EB ; G 429 +U 492 ; WX 871 ; N uni01EC ; G 430 +U 493 ; WX 667 ; N uni01ED ; G 431 +U 494 ; WX 657 ; N uni01EE ; G 432 +U 495 ; WX 568 ; N uni01EF ; G 433 +U 496 ; WX 380 ; N uni01F0 ; G 434 +U 497 ; WX 1597 ; N uni01F1 ; G 435 +U 498 ; WX 1435 ; N uni01F2 ; G 436 +U 499 ; WX 1267 ; N uni01F3 ; G 437 +U 500 ; WX 854 ; N uni01F4 ; G 438 +U 501 ; WX 699 ; N uni01F5 ; G 439 +U 502 ; WX 1221 ; N uni01F6 ; G 440 +U 503 ; WX 787 ; N uni01F7 ; G 441 +U 504 ; WX 914 ; N uni01F8 ; G 442 +U 505 ; WX 727 ; N uni01F9 ; G 443 +U 506 ; WX 776 ; N Aringacute ; G 444 +U 507 ; WX 648 ; N aringacute ; G 445 +U 508 ; WX 1034 ; N AEacute ; G 446 +U 509 ; WX 975 ; N aeacute ; G 447 +U 510 ; WX 871 ; N Oslashacute ; G 448 +U 511 ; WX 667 ; N oslashacute ; G 449 +U 512 ; WX 776 ; N uni0200 ; G 450 +U 513 ; WX 648 ; N uni0201 ; G 451 +U 514 ; WX 776 ; N uni0202 ; G 452 +U 515 ; WX 648 ; N uni0203 ; G 453 +U 516 ; WX 762 ; N uni0204 ; G 454 +U 517 ; WX 636 ; N uni0205 ; G 455 +U 518 ; WX 762 ; N uni0206 ; G 456 +U 519 ; WX 636 ; N uni0207 ; G 457 +U 520 ; WX 468 ; N uni0208 ; G 458 +U 521 ; WX 380 ; N uni0209 ; G 459 +U 522 ; WX 468 ; N uni020A ; G 460 +U 523 ; WX 380 ; N uni020B ; G 461 +U 524 ; WX 871 ; N uni020C ; G 462 +U 525 ; WX 667 ; N uni020D ; G 463 +U 526 ; WX 871 ; N uni020E ; G 464 +U 527 ; WX 667 ; N uni020F ; G 465 +U 528 ; WX 831 ; N uni0210 ; G 466 +U 529 ; WX 527 ; N uni0211 ; G 467 +U 530 ; WX 831 ; N uni0212 ; G 468 +U 531 ; WX 527 ; N uni0213 ; G 469 +U 532 ; WX 872 ; N uni0214 ; G 470 +U 533 ; WX 727 ; N uni0215 ; G 471 +U 534 ; WX 872 ; N uni0216 ; G 472 +U 535 ; WX 727 ; N uni0217 ; G 473 +U 536 ; WX 722 ; N Scommaaccent ; G 474 +U 537 ; WX 563 ; N scommaaccent ; G 475 +U 538 ; WX 744 ; N uni021A ; G 476 +U 539 ; WX 462 ; N uni021B ; G 477 +U 540 ; WX 690 ; N uni021C ; G 478 +U 541 ; WX 607 ; N uni021D ; G 479 +U 542 ; WX 945 ; N uni021E ; G 480 +U 543 ; WX 727 ; N uni021F ; G 481 +U 544 ; WX 872 ; N uni0220 ; G 482 +U 545 ; WX 791 ; N uni0221 ; G 483 +U 546 ; WX 703 ; N uni0222 ; G 484 +U 547 ; WX 616 ; N uni0223 ; G 485 +U 548 ; WX 730 ; N uni0224 ; G 486 +U 549 ; WX 568 ; N uni0225 ; G 487 +U 550 ; WX 776 ; N uni0226 ; G 488 +U 551 ; WX 648 ; N uni0227 ; G 489 +U 552 ; WX 762 ; N uni0228 ; G 490 +U 553 ; WX 636 ; N uni0229 ; G 491 +U 554 ; WX 871 ; N uni022A ; G 492 +U 555 ; WX 667 ; N uni022B ; G 493 +U 556 ; WX 871 ; N uni022C ; G 494 +U 557 ; WX 667 ; N uni022D ; G 495 +U 558 ; WX 871 ; N uni022E ; G 496 +U 559 ; WX 667 ; N uni022F ; G 497 +U 560 ; WX 871 ; N uni0230 ; G 498 +U 561 ; WX 667 ; N uni0231 ; G 499 +U 562 ; WX 714 ; N uni0232 ; G 500 +U 563 ; WX 581 ; N uni0233 ; G 501 +U 564 ; WX 573 ; N uni0234 ; G 502 +U 565 ; WX 922 ; N uni0235 ; G 503 +U 566 ; WX 564 ; N uni0236 ; G 504 +U 567 ; WX 362 ; N dotlessj ; G 505 +U 568 ; WX 1031 ; N uni0238 ; G 506 +U 569 ; WX 1031 ; N uni0239 ; G 507 +U 570 ; WX 776 ; N uni023A ; G 508 +U 571 ; WX 796 ; N uni023B ; G 509 +U 572 ; WX 609 ; N uni023C ; G 510 +U 573 ; WX 703 ; N uni023D ; G 511 +U 574 ; WX 744 ; N uni023E ; G 512 +U 575 ; WX 563 ; N uni023F ; G 513 +U 576 ; WX 568 ; N uni0240 ; G 514 +U 577 ; WX 660 ; N uni0241 ; G 515 +U 578 ; WX 547 ; N uni0242 ; G 516 +U 579 ; WX 845 ; N uni0243 ; G 517 +U 580 ; WX 872 ; N uni0244 ; G 518 +U 581 ; WX 776 ; N uni0245 ; G 519 +U 582 ; WX 762 ; N uni0246 ; G 520 +U 583 ; WX 636 ; N uni0247 ; G 521 +U 584 ; WX 473 ; N uni0248 ; G 522 +U 585 ; WX 387 ; N uni0249 ; G 523 +U 586 ; WX 848 ; N uni024A ; G 524 +U 587 ; WX 699 ; N uni024B ; G 525 +U 588 ; WX 831 ; N uni024C ; G 526 +U 589 ; WX 527 ; N uni024D ; G 527 +U 590 ; WX 714 ; N uni024E ; G 528 +U 591 ; WX 581 ; N uni024F ; G 529 +U 592 ; WX 648 ; N uni0250 ; G 530 +U 593 ; WX 699 ; N uni0251 ; G 531 +U 594 ; WX 699 ; N uni0252 ; G 532 +U 595 ; WX 699 ; N uni0253 ; G 533 +U 596 ; WX 609 ; N uni0254 ; G 534 +U 597 ; WX 609 ; N uni0255 ; G 535 +U 598 ; WX 699 ; N uni0256 ; G 536 +U 599 ; WX 730 ; N uni0257 ; G 537 +U 600 ; WX 636 ; N uni0258 ; G 538 +U 601 ; WX 636 ; N uni0259 ; G 539 +U 602 ; WX 907 ; N uni025A ; G 540 +U 603 ; WX 608 ; N uni025B ; G 541 +U 604 ; WX 562 ; N uni025C ; G 542 +U 605 ; WX 907 ; N uni025D ; G 543 +U 606 ; WX 714 ; N uni025E ; G 544 +U 607 ; WX 387 ; N uni025F ; G 545 +U 608 ; WX 699 ; N uni0260 ; G 546 +U 609 ; WX 699 ; N uni0261 ; G 547 +U 610 ; WX 638 ; N uni0262 ; G 548 +U 611 ; WX 601 ; N uni0263 ; G 549 +U 612 ; WX 627 ; N uni0264 ; G 550 +U 613 ; WX 727 ; N uni0265 ; G 551 +U 614 ; WX 727 ; N uni0266 ; G 552 +U 615 ; WX 727 ; N uni0267 ; G 553 +U 616 ; WX 380 ; N uni0268 ; G 554 +U 617 ; WX 380 ; N uni0269 ; G 555 +U 618 ; WX 380 ; N uni026A ; G 556 +U 619 ; WX 409 ; N uni026B ; G 557 +U 620 ; WX 514 ; N uni026C ; G 558 +U 621 ; WX 380 ; N uni026D ; G 559 +U 622 ; WX 795 ; N uni026E ; G 560 +U 623 ; WX 1058 ; N uni026F ; G 561 +U 624 ; WX 1058 ; N uni0270 ; G 562 +U 625 ; WX 1058 ; N uni0271 ; G 563 +U 626 ; WX 727 ; N uni0272 ; G 564 +U 627 ; WX 727 ; N uni0273 ; G 565 +U 628 ; WX 712 ; N uni0274 ; G 566 +U 629 ; WX 667 ; N uni0275 ; G 567 +U 630 ; WX 1061 ; N uni0276 ; G 568 +U 631 ; WX 944 ; N uni0277 ; G 569 +U 632 ; WX 797 ; N uni0278 ; G 570 +U 633 ; WX 571 ; N uni0279 ; G 571 +U 634 ; WX 571 ; N uni027A ; G 572 +U 635 ; WX 571 ; N uni027B ; G 573 +U 636 ; WX 527 ; N uni027C ; G 574 +U 637 ; WX 527 ; N uni027D ; G 575 +U 638 ; WX 452 ; N uni027E ; G 576 +U 639 ; WX 487 ; N uni027F ; G 577 +U 640 ; WX 694 ; N uni0280 ; G 578 +U 641 ; WX 694 ; N uni0281 ; G 579 +U 642 ; WX 563 ; N uni0282 ; G 580 +U 643 ; WX 331 ; N uni0283 ; G 581 +U 644 ; WX 430 ; N uni0284 ; G 582 +U 645 ; WX 540 ; N uni0285 ; G 583 +U 646 ; WX 331 ; N uni0286 ; G 584 +U 647 ; WX 492 ; N uni0287 ; G 585 +U 648 ; WX 462 ; N uni0288 ; G 586 +U 649 ; WX 727 ; N uni0289 ; G 587 +U 650 ; WX 679 ; N uni028A ; G 588 +U 651 ; WX 694 ; N uni028B ; G 589 +U 652 ; WX 641 ; N uni028C ; G 590 +U 653 ; WX 907 ; N uni028D ; G 591 +U 654 ; WX 635 ; N uni028E ; G 592 +U 655 ; WX 727 ; N uni028F ; G 593 +U 656 ; WX 568 ; N uni0290 ; G 594 +U 657 ; WX 568 ; N uni0291 ; G 595 +U 658 ; WX 568 ; N uni0292 ; G 596 +U 659 ; WX 568 ; N uni0293 ; G 597 +U 660 ; WX 551 ; N uni0294 ; G 598 +U 661 ; WX 551 ; N uni0295 ; G 599 +U 662 ; WX 551 ; N uni0296 ; G 600 +U 663 ; WX 545 ; N uni0297 ; G 601 +U 664 ; WX 871 ; N uni0298 ; G 602 +U 665 ; WX 695 ; N uni0299 ; G 603 +U 666 ; WX 714 ; N uni029A ; G 604 +U 667 ; WX 689 ; N uni029B ; G 605 +U 668 ; WX 732 ; N uni029C ; G 606 +U 669 ; WX 384 ; N uni029D ; G 607 +U 670 ; WX 740 ; N uni029E ; G 608 +U 671 ; WX 617 ; N uni029F ; G 609 +U 672 ; WX 699 ; N uni02A0 ; G 610 +U 673 ; WX 551 ; N uni02A1 ; G 611 +U 674 ; WX 551 ; N uni02A2 ; G 612 +U 675 ; WX 1117 ; N uni02A3 ; G 613 +U 676 ; WX 1179 ; N uni02A4 ; G 614 +U 677 ; WX 1117 ; N uni02A5 ; G 615 +U 678 ; WX 938 ; N uni02A6 ; G 616 +U 679 ; WX 715 ; N uni02A7 ; G 617 +U 680 ; WX 946 ; N uni02A8 ; G 618 +U 681 ; WX 1039 ; N uni02A9 ; G 619 +U 682 ; WX 870 ; N uni02AA ; G 620 +U 683 ; WX 795 ; N uni02AB ; G 621 +U 684 ; WX 662 ; N uni02AC ; G 622 +U 685 ; WX 443 ; N uni02AD ; G 623 +U 686 ; WX 613 ; N uni02AE ; G 624 +U 687 ; WX 717 ; N uni02AF ; G 625 +U 688 ; WX 521 ; N uni02B0 ; G 626 +U 689 ; WX 519 ; N uni02B1 ; G 627 +U 690 ; WX 313 ; N uni02B2 ; G 628 +U 691 ; WX 414 ; N uni02B3 ; G 629 +U 692 ; WX 414 ; N uni02B4 ; G 630 +U 693 ; WX 480 ; N uni02B5 ; G 631 +U 694 ; WX 527 ; N uni02B6 ; G 632 +U 695 ; WX 662 ; N uni02B7 ; G 633 +U 696 ; WX 485 ; N uni02B8 ; G 634 +U 697 ; WX 302 ; N uni02B9 ; G 635 +U 698 ; WX 521 ; N uni02BA ; G 636 +U 699 ; WX 348 ; N uni02BB ; G 637 +U 700 ; WX 348 ; N uni02BC ; G 638 +U 701 ; WX 348 ; N uni02BD ; G 639 +U 702 ; WX 366 ; N uni02BE ; G 640 +U 703 ; WX 366 ; N uni02BF ; G 641 +U 704 ; WX 313 ; N uni02C0 ; G 642 +U 705 ; WX 313 ; N uni02C1 ; G 643 +U 706 ; WX 500 ; N uni02C2 ; G 644 +U 707 ; WX 500 ; N uni02C3 ; G 645 +U 708 ; WX 500 ; N uni02C4 ; G 646 +U 709 ; WX 500 ; N uni02C5 ; G 647 +U 710 ; WX 500 ; N circumflex ; G 648 +U 711 ; WX 500 ; N caron ; G 649 +U 712 ; WX 282 ; N uni02C8 ; G 650 +U 713 ; WX 500 ; N uni02C9 ; G 651 +U 714 ; WX 500 ; N uni02CA ; G 652 +U 715 ; WX 500 ; N uni02CB ; G 653 +U 716 ; WX 282 ; N uni02CC ; G 654 +U 717 ; WX 500 ; N uni02CD ; G 655 +U 720 ; WX 369 ; N uni02D0 ; G 656 +U 721 ; WX 369 ; N uni02D1 ; G 657 +U 722 ; WX 366 ; N uni02D2 ; G 658 +U 723 ; WX 366 ; N uni02D3 ; G 659 +U 726 ; WX 392 ; N uni02D6 ; G 660 +U 727 ; WX 392 ; N uni02D7 ; G 661 +U 728 ; WX 500 ; N breve ; G 662 +U 729 ; WX 500 ; N dotaccent ; G 663 +U 730 ; WX 500 ; N ring ; G 664 +U 731 ; WX 500 ; N ogonek ; G 665 +U 732 ; WX 500 ; N tilde ; G 666 +U 733 ; WX 500 ; N hungarumlaut ; G 667 +U 734 ; WX 417 ; N uni02DE ; G 668 +U 736 ; WX 378 ; N uni02E0 ; G 669 +U 737 ; WX 292 ; N uni02E1 ; G 670 +U 738 ; WX 395 ; N uni02E2 ; G 671 +U 739 ; WX 475 ; N uni02E3 ; G 672 +U 740 ; WX 313 ; N uni02E4 ; G 673 +U 741 ; WX 500 ; N uni02E5 ; G 674 +U 742 ; WX 500 ; N uni02E6 ; G 675 +U 743 ; WX 500 ; N uni02E7 ; G 676 +U 744 ; WX 500 ; N uni02E8 ; G 677 +U 745 ; WX 500 ; N uni02E9 ; G 678 +U 748 ; WX 500 ; N uni02EC ; G 679 +U 750 ; WX 553 ; N uni02EE ; G 680 +U 751 ; WX 500 ; N uni02EF ; G 681 +U 752 ; WX 500 ; N uni02F0 ; G 682 +U 755 ; WX 500 ; N uni02F3 ; G 683 +U 759 ; WX 500 ; N uni02F7 ; G 684 +U 768 ; WX 0 ; N gravecomb ; G 685 +U 769 ; WX 0 ; N acutecomb ; G 686 +U 770 ; WX 0 ; N uni0302 ; G 687 +U 771 ; WX 0 ; N tildecomb ; G 688 +U 772 ; WX 0 ; N uni0304 ; G 689 +U 773 ; WX 0 ; N uni0305 ; G 690 +U 774 ; WX 0 ; N uni0306 ; G 691 +U 775 ; WX 0 ; N uni0307 ; G 692 +U 776 ; WX 0 ; N uni0308 ; G 693 +U 777 ; WX 0 ; N hookabovecomb ; G 694 +U 778 ; WX 0 ; N uni030A ; G 695 +U 779 ; WX 0 ; N uni030B ; G 696 +U 780 ; WX 0 ; N uni030C ; G 697 +U 781 ; WX 0 ; N uni030D ; G 698 +U 782 ; WX 0 ; N uni030E ; G 699 +U 783 ; WX 0 ; N uni030F ; G 700 +U 784 ; WX 0 ; N uni0310 ; G 701 +U 785 ; WX 0 ; N uni0311 ; G 702 +U 786 ; WX 0 ; N uni0312 ; G 703 +U 787 ; WX 0 ; N uni0313 ; G 704 +U 788 ; WX 0 ; N uni0314 ; G 705 +U 789 ; WX 0 ; N uni0315 ; G 706 +U 790 ; WX 0 ; N uni0316 ; G 707 +U 791 ; WX 0 ; N uni0317 ; G 708 +U 792 ; WX 0 ; N uni0318 ; G 709 +U 793 ; WX 0 ; N uni0319 ; G 710 +U 794 ; WX 0 ; N uni031A ; G 711 +U 795 ; WX 0 ; N uni031B ; G 712 +U 796 ; WX 0 ; N uni031C ; G 713 +U 797 ; WX 0 ; N uni031D ; G 714 +U 798 ; WX 0 ; N uni031E ; G 715 +U 799 ; WX 0 ; N uni031F ; G 716 +U 800 ; WX 0 ; N uni0320 ; G 717 +U 801 ; WX 0 ; N uni0321 ; G 718 +U 802 ; WX 0 ; N uni0322 ; G 719 +U 803 ; WX 0 ; N dotbelowcomb ; G 720 +U 804 ; WX 0 ; N uni0324 ; G 721 +U 805 ; WX 0 ; N uni0325 ; G 722 +U 806 ; WX 0 ; N uni0326 ; G 723 +U 807 ; WX 0 ; N uni0327 ; G 724 +U 808 ; WX 0 ; N uni0328 ; G 725 +U 809 ; WX 0 ; N uni0329 ; G 726 +U 810 ; WX 0 ; N uni032A ; G 727 +U 811 ; WX 0 ; N uni032B ; G 728 +U 812 ; WX 0 ; N uni032C ; G 729 +U 813 ; WX 0 ; N uni032D ; G 730 +U 814 ; WX 0 ; N uni032E ; G 731 +U 815 ; WX 0 ; N uni032F ; G 732 +U 816 ; WX 0 ; N uni0330 ; G 733 +U 817 ; WX 0 ; N uni0331 ; G 734 +U 818 ; WX 0 ; N uni0332 ; G 735 +U 819 ; WX 0 ; N uni0333 ; G 736 +U 820 ; WX 0 ; N uni0334 ; G 737 +U 821 ; WX 0 ; N uni0335 ; G 738 +U 822 ; WX 0 ; N uni0336 ; G 739 +U 823 ; WX 0 ; N uni0337 ; G 740 +U 824 ; WX 0 ; N uni0338 ; G 741 +U 825 ; WX 0 ; N uni0339 ; G 742 +U 826 ; WX 0 ; N uni033A ; G 743 +U 827 ; WX 0 ; N uni033B ; G 744 +U 828 ; WX 0 ; N uni033C ; G 745 +U 829 ; WX 0 ; N uni033D ; G 746 +U 830 ; WX 0 ; N uni033E ; G 747 +U 831 ; WX 0 ; N uni033F ; G 748 +U 835 ; WX 0 ; N uni0343 ; G 749 +U 847 ; WX 0 ; N uni034F ; G 750 +U 856 ; WX 0 ; N uni0358 ; G 751 +U 864 ; WX 0 ; N uni0360 ; G 752 +U 865 ; WX 0 ; N uni0361 ; G 753 +U 880 ; WX 779 ; N uni0370 ; G 754 +U 881 ; WX 576 ; N uni0371 ; G 755 +U 882 ; WX 803 ; N uni0372 ; G 756 +U 883 ; WX 777 ; N uni0373 ; G 757 +U 884 ; WX 302 ; N uni0374 ; G 758 +U 885 ; WX 302 ; N uni0375 ; G 759 +U 886 ; WX 963 ; N uni0376 ; G 760 +U 887 ; WX 737 ; N uni0377 ; G 761 +U 890 ; WX 500 ; N uni037A ; G 762 +U 891 ; WX 609 ; N uni037B ; G 763 +U 892 ; WX 609 ; N uni037C ; G 764 +U 893 ; WX 609 ; N uni037D ; G 765 +U 894 ; WX 369 ; N uni037E ; G 766 +U 895 ; WX 473 ; N uni037F ; G 767 +U 900 ; WX 500 ; N tonos ; G 768 +U 901 ; WX 500 ; N dieresistonos ; G 769 +U 902 ; WX 776 ; N Alphatonos ; G 770 +U 903 ; WX 348 ; N anoteleia ; G 771 +U 904 ; WX 947 ; N Epsilontonos ; G 772 +U 905 ; WX 1118 ; N Etatonos ; G 773 +U 906 ; WX 662 ; N Iotatonos ; G 774 +U 908 ; WX 887 ; N Omicrontonos ; G 775 +U 910 ; WX 953 ; N Upsilontonos ; G 776 +U 911 ; WX 911 ; N Omegatonos ; G 777 +U 912 ; WX 484 ; N iotadieresistonos ; G 778 +U 913 ; WX 776 ; N Alpha ; G 779 +U 914 ; WX 845 ; N Beta ; G 780 +U 915 ; WX 710 ; N Gamma ; G 781 +U 916 ; WX 776 ; N uni0394 ; G 782 +U 917 ; WX 762 ; N Epsilon ; G 783 +U 918 ; WX 730 ; N Zeta ; G 784 +U 919 ; WX 945 ; N Eta ; G 785 +U 920 ; WX 871 ; N Theta ; G 786 +U 921 ; WX 468 ; N Iota ; G 787 +U 922 ; WX 869 ; N Kappa ; G 788 +U 923 ; WX 776 ; N Lambda ; G 789 +U 924 ; WX 1107 ; N Mu ; G 790 +U 925 ; WX 914 ; N Nu ; G 791 +U 926 ; WX 704 ; N Xi ; G 792 +U 927 ; WX 871 ; N Omicron ; G 793 +U 928 ; WX 944 ; N Pi ; G 794 +U 929 ; WX 752 ; N Rho ; G 795 +U 931 ; WX 707 ; N Sigma ; G 796 +U 932 ; WX 744 ; N Tau ; G 797 +U 933 ; WX 714 ; N Upsilon ; G 798 +U 934 ; WX 871 ; N Phi ; G 799 +U 935 ; WX 776 ; N Chi ; G 800 +U 936 ; WX 913 ; N Psi ; G 801 +U 937 ; WX 890 ; N Omega ; G 802 +U 938 ; WX 468 ; N Iotadieresis ; G 803 +U 939 ; WX 714 ; N Upsilondieresis ; G 804 +U 940 ; WX 770 ; N alphatonos ; G 805 +U 941 ; WX 608 ; N epsilontonos ; G 806 +U 942 ; WX 727 ; N etatonos ; G 807 +U 943 ; WX 484 ; N iotatonos ; G 808 +U 944 ; WX 694 ; N upsilondieresistonos ; G 809 +U 945 ; WX 770 ; N alpha ; G 810 +U 946 ; WX 664 ; N beta ; G 811 +U 947 ; WX 660 ; N gamma ; G 812 +U 948 ; WX 667 ; N delta ; G 813 +U 949 ; WX 608 ; N epsilon ; G 814 +U 950 ; WX 592 ; N zeta ; G 815 +U 951 ; WX 727 ; N eta ; G 816 +U 952 ; WX 667 ; N theta ; G 817 +U 953 ; WX 484 ; N iota ; G 818 +U 954 ; WX 750 ; N kappa ; G 819 +U 955 ; WX 701 ; N lambda ; G 820 +U 956 ; WX 732 ; N uni03BC ; G 821 +U 957 ; WX 694 ; N nu ; G 822 +U 958 ; WX 592 ; N xi ; G 823 +U 959 ; WX 667 ; N omicron ; G 824 +U 960 ; WX 732 ; N pi ; G 825 +U 961 ; WX 665 ; N rho ; G 826 +U 962 ; WX 609 ; N sigma1 ; G 827 +U 963 ; WX 737 ; N sigma ; G 828 +U 964 ; WX 673 ; N tau ; G 829 +U 965 ; WX 694 ; N upsilon ; G 830 +U 966 ; WX 905 ; N phi ; G 831 +U 967 ; WX 658 ; N chi ; G 832 +U 968 ; WX 941 ; N psi ; G 833 +U 969 ; WX 952 ; N omega ; G 834 +U 970 ; WX 484 ; N iotadieresis ; G 835 +U 971 ; WX 694 ; N upsilondieresis ; G 836 +U 972 ; WX 667 ; N omicrontonos ; G 837 +U 973 ; WX 694 ; N upsilontonos ; G 838 +U 974 ; WX 952 ; N omegatonos ; G 839 +U 975 ; WX 869 ; N uni03CF ; G 840 +U 976 ; WX 667 ; N uni03D0 ; G 841 +U 977 ; WX 849 ; N theta1 ; G 842 +U 978 ; WX 764 ; N Upsilon1 ; G 843 +U 979 ; WX 969 ; N uni03D3 ; G 844 +U 980 ; WX 764 ; N uni03D4 ; G 845 +U 981 ; WX 941 ; N phi1 ; G 846 +U 982 ; WX 952 ; N omega1 ; G 847 +U 983 ; WX 655 ; N uni03D7 ; G 848 +U 984 ; WX 871 ; N uni03D8 ; G 849 +U 985 ; WX 667 ; N uni03D9 ; G 850 +U 986 ; WX 796 ; N uni03DA ; G 851 +U 987 ; WX 609 ; N uni03DB ; G 852 +U 988 ; WX 710 ; N uni03DC ; G 853 +U 989 ; WX 527 ; N uni03DD ; G 854 +U 990 ; WX 590 ; N uni03DE ; G 855 +U 991 ; WX 660 ; N uni03DF ; G 856 +U 992 ; WX 796 ; N uni03E0 ; G 857 +U 993 ; WX 667 ; N uni03E1 ; G 858 +U 1008 ; WX 655 ; N uni03F0 ; G 859 +U 1009 ; WX 665 ; N uni03F1 ; G 860 +U 1010 ; WX 609 ; N uni03F2 ; G 861 +U 1011 ; WX 362 ; N uni03F3 ; G 862 +U 1012 ; WX 871 ; N uni03F4 ; G 863 +U 1013 ; WX 609 ; N uni03F5 ; G 864 +U 1014 ; WX 609 ; N uni03F6 ; G 865 +U 1015 ; WX 757 ; N uni03F7 ; G 866 +U 1016 ; WX 699 ; N uni03F8 ; G 867 +U 1017 ; WX 796 ; N uni03F9 ; G 868 +U 1018 ; WX 1107 ; N uni03FA ; G 869 +U 1019 ; WX 860 ; N uni03FB ; G 870 +U 1020 ; WX 692 ; N uni03FC ; G 871 +U 1021 ; WX 796 ; N uni03FD ; G 872 +U 1022 ; WX 796 ; N uni03FE ; G 873 +U 1023 ; WX 796 ; N uni03FF ; G 874 +U 1024 ; WX 762 ; N uni0400 ; G 875 +U 1025 ; WX 762 ; N uni0401 ; G 876 +U 1026 ; WX 901 ; N uni0402 ; G 877 +U 1027 ; WX 690 ; N uni0403 ; G 878 +U 1028 ; WX 795 ; N uni0404 ; G 879 +U 1029 ; WX 722 ; N uni0405 ; G 880 +U 1030 ; WX 468 ; N uni0406 ; G 881 +U 1031 ; WX 468 ; N uni0407 ; G 882 +U 1032 ; WX 473 ; N uni0408 ; G 883 +U 1033 ; WX 1202 ; N uni0409 ; G 884 +U 1034 ; WX 1262 ; N uni040A ; G 885 +U 1035 ; WX 963 ; N uni040B ; G 886 +U 1036 ; WX 910 ; N uni040C ; G 887 +U 1037 ; WX 945 ; N uni040D ; G 888 +U 1038 ; WX 812 ; N uni040E ; G 889 +U 1039 ; WX 945 ; N uni040F ; G 890 +U 1040 ; WX 814 ; N uni0410 ; G 891 +U 1041 ; WX 854 ; N uni0411 ; G 892 +U 1042 ; WX 845 ; N uni0412 ; G 893 +U 1043 ; WX 690 ; N uni0413 ; G 894 +U 1044 ; WX 889 ; N uni0414 ; G 895 +U 1045 ; WX 762 ; N uni0415 ; G 896 +U 1046 ; WX 1312 ; N uni0416 ; G 897 +U 1047 ; WX 721 ; N uni0417 ; G 898 +U 1048 ; WX 945 ; N uni0418 ; G 899 +U 1049 ; WX 945 ; N uni0419 ; G 900 +U 1050 ; WX 910 ; N uni041A ; G 901 +U 1051 ; WX 884 ; N uni041B ; G 902 +U 1052 ; WX 1107 ; N uni041C ; G 903 +U 1053 ; WX 945 ; N uni041D ; G 904 +U 1054 ; WX 871 ; N uni041E ; G 905 +U 1055 ; WX 944 ; N uni041F ; G 906 +U 1056 ; WX 752 ; N uni0420 ; G 907 +U 1057 ; WX 796 ; N uni0421 ; G 908 +U 1058 ; WX 744 ; N uni0422 ; G 909 +U 1059 ; WX 812 ; N uni0423 ; G 910 +U 1060 ; WX 949 ; N uni0424 ; G 911 +U 1061 ; WX 776 ; N uni0425 ; G 912 +U 1062 ; WX 966 ; N uni0426 ; G 913 +U 1063 ; WX 913 ; N uni0427 ; G 914 +U 1064 ; WX 1268 ; N uni0428 ; G 915 +U 1065 ; WX 1293 ; N uni0429 ; G 916 +U 1066 ; WX 957 ; N uni042A ; G 917 +U 1067 ; WX 1202 ; N uni042B ; G 918 +U 1068 ; WX 825 ; N uni042C ; G 919 +U 1069 ; WX 795 ; N uni042D ; G 920 +U 1070 ; WX 1287 ; N uni042E ; G 921 +U 1071 ; WX 882 ; N uni042F ; G 922 +U 1072 ; WX 648 ; N uni0430 ; G 923 +U 1073 ; WX 667 ; N uni0431 ; G 924 +U 1074 ; WX 695 ; N uni0432 ; G 925 +U 1075 ; WX 613 ; N uni0433 ; G 926 +U 1076 ; WX 667 ; N uni0434 ; G 927 +U 1077 ; WX 636 ; N uni0435 ; G 928 +U 1078 ; WX 1010 ; N uni0436 ; G 929 +U 1079 ; WX 638 ; N uni0437 ; G 930 +U 1080 ; WX 742 ; N uni0438 ; G 931 +U 1081 ; WX 742 ; N uni0439 ; G 932 +U 1082 ; WX 722 ; N uni043A ; G 933 +U 1083 ; WX 705 ; N uni043B ; G 934 +U 1084 ; WX 869 ; N uni043C ; G 935 +U 1085 ; WX 732 ; N uni043D ; G 936 +U 1086 ; WX 667 ; N uni043E ; G 937 +U 1087 ; WX 732 ; N uni043F ; G 938 +U 1088 ; WX 699 ; N uni0440 ; G 939 +U 1089 ; WX 609 ; N uni0441 ; G 940 +U 1090 ; WX 620 ; N uni0442 ; G 941 +U 1091 ; WX 640 ; N uni0443 ; G 942 +U 1092 ; WX 902 ; N uni0444 ; G 943 +U 1093 ; WX 596 ; N uni0445 ; G 944 +U 1094 ; WX 739 ; N uni0446 ; G 945 +U 1095 ; WX 732 ; N uni0447 ; G 946 +U 1096 ; WX 1075 ; N uni0448 ; G 947 +U 1097 ; WX 1082 ; N uni0449 ; G 948 +U 1098 ; WX 767 ; N uni044A ; G 949 +U 1099 ; WX 1002 ; N uni044B ; G 950 +U 1100 ; WX 679 ; N uni044C ; G 951 +U 1101 ; WX 609 ; N uni044D ; G 952 +U 1102 ; WX 1025 ; N uni044E ; G 953 +U 1103 ; WX 739 ; N uni044F ; G 954 +U 1104 ; WX 636 ; N uni0450 ; G 955 +U 1105 ; WX 636 ; N uni0451 ; G 956 +U 1106 ; WX 719 ; N uni0452 ; G 957 +U 1107 ; WX 613 ; N uni0453 ; G 958 +U 1108 ; WX 609 ; N uni0454 ; G 959 +U 1109 ; WX 563 ; N uni0455 ; G 960 +U 1110 ; WX 380 ; N uni0456 ; G 961 +U 1111 ; WX 380 ; N uni0457 ; G 962 +U 1112 ; WX 362 ; N uni0458 ; G 963 +U 1113 ; WX 988 ; N uni0459 ; G 964 +U 1114 ; WX 1015 ; N uni045A ; G 965 +U 1115 ; WX 727 ; N uni045B ; G 966 +U 1116 ; WX 722 ; N uni045C ; G 967 +U 1117 ; WX 742 ; N uni045D ; G 968 +U 1118 ; WX 640 ; N uni045E ; G 969 +U 1119 ; WX 732 ; N uni045F ; G 970 +U 1122 ; WX 880 ; N uni0462 ; G 971 +U 1123 ; WX 703 ; N uni0463 ; G 972 +U 1124 ; WX 1195 ; N uni0464 ; G 973 +U 1125 ; WX 963 ; N uni0465 ; G 974 +U 1130 ; WX 1312 ; N uni046A ; G 975 +U 1131 ; WX 1010 ; N uni046B ; G 976 +U 1132 ; WX 1630 ; N uni046C ; G 977 +U 1133 ; WX 1297 ; N uni046D ; G 978 +U 1136 ; WX 1096 ; N uni0470 ; G 979 +U 1137 ; WX 1105 ; N uni0471 ; G 980 +U 1138 ; WX 871 ; N uni0472 ; G 981 +U 1139 ; WX 652 ; N uni0473 ; G 982 +U 1140 ; WX 916 ; N uni0474 ; G 983 +U 1141 ; WX 749 ; N uni0475 ; G 984 +U 1142 ; WX 916 ; N uni0476 ; G 985 +U 1143 ; WX 749 ; N uni0477 ; G 986 +U 1164 ; WX 846 ; N uni048C ; G 987 +U 1165 ; WX 673 ; N uni048D ; G 988 +U 1168 ; WX 700 ; N uni0490 ; G 989 +U 1169 ; WX 618 ; N uni0491 ; G 990 +U 1170 ; WX 690 ; N uni0492 ; G 991 +U 1171 ; WX 613 ; N uni0493 ; G 992 +U 1172 ; WX 868 ; N uni0494 ; G 993 +U 1173 ; WX 716 ; N uni0495 ; G 994 +U 1174 ; WX 1312 ; N uni0496 ; G 995 +U 1175 ; WX 1010 ; N uni0497 ; G 996 +U 1176 ; WX 721 ; N uni0498 ; G 997 +U 1177 ; WX 638 ; N uni0499 ; G 998 +U 1178 ; WX 947 ; N uni049A ; G 999 +U 1179 ; WX 744 ; N uni049B ; G 1000 +U 1182 ; WX 910 ; N uni049E ; G 1001 +U 1183 ; WX 722 ; N uni049F ; G 1002 +U 1184 ; WX 1041 ; N uni04A0 ; G 1003 +U 1185 ; WX 827 ; N uni04A1 ; G 1004 +U 1186 ; WX 966 ; N uni04A2 ; G 1005 +U 1187 ; WX 739 ; N uni04A3 ; G 1006 +U 1188 ; WX 1167 ; N uni04A4 ; G 1007 +U 1189 ; WX 956 ; N uni04A5 ; G 1008 +U 1190 ; WX 1345 ; N uni04A6 ; G 1009 +U 1191 ; WX 1059 ; N uni04A7 ; G 1010 +U 1194 ; WX 796 ; N uni04AA ; G 1011 +U 1195 ; WX 609 ; N uni04AB ; G 1012 +U 1196 ; WX 744 ; N uni04AC ; G 1013 +U 1197 ; WX 620 ; N uni04AD ; G 1014 +U 1198 ; WX 714 ; N uni04AE ; G 1015 +U 1199 ; WX 581 ; N uni04AF ; G 1016 +U 1200 ; WX 714 ; N uni04B0 ; G 1017 +U 1201 ; WX 581 ; N uni04B1 ; G 1018 +U 1202 ; WX 866 ; N uni04B2 ; G 1019 +U 1203 ; WX 649 ; N uni04B3 ; G 1020 +U 1204 ; WX 1022 ; N uni04B4 ; G 1021 +U 1205 ; WX 807 ; N uni04B5 ; G 1022 +U 1206 ; WX 928 ; N uni04B6 ; G 1023 +U 1207 ; WX 739 ; N uni04B7 ; G 1024 +U 1210 ; WX 910 ; N uni04BA ; G 1025 +U 1211 ; WX 727 ; N uni04BB ; G 1026 +U 1216 ; WX 468 ; N uni04C0 ; G 1027 +U 1217 ; WX 1312 ; N uni04C1 ; G 1028 +U 1218 ; WX 1010 ; N uni04C2 ; G 1029 +U 1219 ; WX 869 ; N uni04C3 ; G 1030 +U 1220 ; WX 693 ; N uni04C4 ; G 1031 +U 1223 ; WX 945 ; N uni04C7 ; G 1032 +U 1224 ; WX 732 ; N uni04C8 ; G 1033 +U 1227 ; WX 913 ; N uni04CB ; G 1034 +U 1228 ; WX 732 ; N uni04CC ; G 1035 +U 1231 ; WX 380 ; N uni04CF ; G 1036 +U 1232 ; WX 814 ; N uni04D0 ; G 1037 +U 1233 ; WX 648 ; N uni04D1 ; G 1038 +U 1234 ; WX 814 ; N uni04D2 ; G 1039 +U 1235 ; WX 648 ; N uni04D3 ; G 1040 +U 1236 ; WX 1034 ; N uni04D4 ; G 1041 +U 1237 ; WX 975 ; N uni04D5 ; G 1042 +U 1238 ; WX 762 ; N uni04D6 ; G 1043 +U 1239 ; WX 636 ; N uni04D7 ; G 1044 +U 1240 ; WX 871 ; N uni04D8 ; G 1045 +U 1241 ; WX 636 ; N uni04D9 ; G 1046 +U 1242 ; WX 871 ; N uni04DA ; G 1047 +U 1243 ; WX 636 ; N uni04DB ; G 1048 +U 1244 ; WX 1312 ; N uni04DC ; G 1049 +U 1245 ; WX 1010 ; N uni04DD ; G 1050 +U 1246 ; WX 721 ; N uni04DE ; G 1051 +U 1247 ; WX 638 ; N uni04DF ; G 1052 +U 1248 ; WX 657 ; N uni04E0 ; G 1053 +U 1249 ; WX 568 ; N uni04E1 ; G 1054 +U 1250 ; WX 945 ; N uni04E2 ; G 1055 +U 1251 ; WX 742 ; N uni04E3 ; G 1056 +U 1252 ; WX 945 ; N uni04E4 ; G 1057 +U 1253 ; WX 742 ; N uni04E5 ; G 1058 +U 1254 ; WX 871 ; N uni04E6 ; G 1059 +U 1255 ; WX 667 ; N uni04E7 ; G 1060 +U 1256 ; WX 871 ; N uni04E8 ; G 1061 +U 1257 ; WX 667 ; N uni04E9 ; G 1062 +U 1258 ; WX 871 ; N uni04EA ; G 1063 +U 1259 ; WX 667 ; N uni04EB ; G 1064 +U 1260 ; WX 795 ; N uni04EC ; G 1065 +U 1261 ; WX 609 ; N uni04ED ; G 1066 +U 1262 ; WX 812 ; N uni04EE ; G 1067 +U 1263 ; WX 640 ; N uni04EF ; G 1068 +U 1264 ; WX 812 ; N uni04F0 ; G 1069 +U 1265 ; WX 640 ; N uni04F1 ; G 1070 +U 1266 ; WX 812 ; N uni04F2 ; G 1071 +U 1267 ; WX 640 ; N uni04F3 ; G 1072 +U 1268 ; WX 913 ; N uni04F4 ; G 1073 +U 1269 ; WX 732 ; N uni04F5 ; G 1074 +U 1270 ; WX 690 ; N uni04F6 ; G 1075 +U 1271 ; WX 613 ; N uni04F7 ; G 1076 +U 1272 ; WX 1202 ; N uni04F8 ; G 1077 +U 1273 ; WX 1002 ; N uni04F9 ; G 1078 +U 1296 ; WX 721 ; N uni0510 ; G 1079 +U 1297 ; WX 638 ; N uni0511 ; G 1080 +U 1298 ; WX 884 ; N uni0512 ; G 1081 +U 1299 ; WX 705 ; N uni0513 ; G 1082 +U 1300 ; WX 1248 ; N uni0514 ; G 1083 +U 1301 ; WX 945 ; N uni0515 ; G 1084 +U 1306 ; WX 820 ; N uni051A ; G 1085 +U 1307 ; WX 640 ; N uni051B ; G 1086 +U 1308 ; WX 1028 ; N uni051C ; G 1087 +U 1309 ; WX 856 ; N uni051D ; G 1088 +U 1329 ; WX 942 ; N uni0531 ; G 1089 +U 1330 ; WX 832 ; N uni0532 ; G 1090 +U 1331 ; WX 894 ; N uni0533 ; G 1091 +U 1332 ; WX 909 ; N uni0534 ; G 1092 +U 1333 ; WX 822 ; N uni0535 ; G 1093 +U 1334 ; WX 821 ; N uni0536 ; G 1094 +U 1335 ; WX 747 ; N uni0537 ; G 1095 +U 1336 ; WX 832 ; N uni0538 ; G 1096 +U 1337 ; WX 1125 ; N uni0539 ; G 1097 +U 1338 ; WX 894 ; N uni053A ; G 1098 +U 1339 ; WX 803 ; N uni053B ; G 1099 +U 1340 ; WX 722 ; N uni053C ; G 1100 +U 1341 ; WX 1188 ; N uni053D ; G 1101 +U 1342 ; WX 887 ; N uni053E ; G 1102 +U 1343 ; WX 842 ; N uni053F ; G 1103 +U 1344 ; WX 737 ; N uni0540 ; G 1104 +U 1345 ; WX 863 ; N uni0541 ; G 1105 +U 1346 ; WX 918 ; N uni0542 ; G 1106 +U 1347 ; WX 851 ; N uni0543 ; G 1107 +U 1348 ; WX 977 ; N uni0544 ; G 1108 +U 1349 ; WX 833 ; N uni0545 ; G 1109 +U 1350 ; WX 914 ; N uni0546 ; G 1110 +U 1351 ; WX 843 ; N uni0547 ; G 1111 +U 1352 ; WX 871 ; N uni0548 ; G 1112 +U 1353 ; WX 818 ; N uni0549 ; G 1113 +U 1354 ; WX 1034 ; N uni054A ; G 1114 +U 1355 ; WX 846 ; N uni054B ; G 1115 +U 1356 ; WX 964 ; N uni054C ; G 1116 +U 1357 ; WX 871 ; N uni054D ; G 1117 +U 1358 ; WX 914 ; N uni054E ; G 1118 +U 1359 ; WX 808 ; N uni054F ; G 1119 +U 1360 ; WX 808 ; N uni0550 ; G 1120 +U 1361 ; WX 836 ; N uni0551 ; G 1121 +U 1362 ; WX 710 ; N uni0552 ; G 1122 +U 1363 ; WX 955 ; N uni0553 ; G 1123 +U 1364 ; WX 891 ; N uni0554 ; G 1124 +U 1365 ; WX 871 ; N uni0555 ; G 1125 +U 1366 ; WX 963 ; N uni0556 ; G 1126 +U 1369 ; WX 307 ; N uni0559 ; G 1127 +U 1370 ; WX 264 ; N uni055A ; G 1128 +U 1371 ; WX 293 ; N uni055B ; G 1129 +U 1372 ; WX 391 ; N uni055C ; G 1130 +U 1373 ; WX 323 ; N uni055D ; G 1131 +U 1374 ; WX 439 ; N uni055E ; G 1132 +U 1375 ; WX 500 ; N uni055F ; G 1133 +U 1377 ; WX 1055 ; N uni0561 ; G 1134 +U 1378 ; WX 695 ; N uni0562 ; G 1135 +U 1379 ; WX 776 ; N uni0563 ; G 1136 +U 1380 ; WX 801 ; N uni0564 ; G 1137 +U 1381 ; WX 729 ; N uni0565 ; G 1138 +U 1382 ; WX 742 ; N uni0566 ; G 1139 +U 1383 ; WX 599 ; N uni0567 ; G 1140 +U 1384 ; WX 733 ; N uni0568 ; G 1141 +U 1385 ; WX 909 ; N uni0569 ; G 1142 +U 1386 ; WX 768 ; N uni056A ; G 1143 +U 1387 ; WX 724 ; N uni056B ; G 1144 +U 1388 ; WX 398 ; N uni056C ; G 1145 +U 1389 ; WX 1087 ; N uni056D ; G 1146 +U 1390 ; WX 695 ; N uni056E ; G 1147 +U 1391 ; WX 719 ; N uni056F ; G 1148 +U 1392 ; WX 737 ; N uni0570 ; G 1149 +U 1393 ; WX 684 ; N uni0571 ; G 1150 +U 1394 ; WX 738 ; N uni0572 ; G 1151 +U 1395 ; WX 703 ; N uni0573 ; G 1152 +U 1396 ; WX 724 ; N uni0574 ; G 1153 +U 1397 ; WX 359 ; N uni0575 ; G 1154 +U 1398 ; WX 719 ; N uni0576 ; G 1155 +U 1399 ; WX 496 ; N uni0577 ; G 1156 +U 1400 ; WX 738 ; N uni0578 ; G 1157 +U 1401 ; WX 428 ; N uni0579 ; G 1158 +U 1402 ; WX 1059 ; N uni057A ; G 1159 +U 1403 ; WX 668 ; N uni057B ; G 1160 +U 1404 ; WX 744 ; N uni057C ; G 1161 +U 1405 ; WX 724 ; N uni057D ; G 1162 +U 1406 ; WX 724 ; N uni057E ; G 1163 +U 1407 ; WX 1040 ; N uni057F ; G 1164 +U 1408 ; WX 724 ; N uni0580 ; G 1165 +U 1409 ; WX 713 ; N uni0581 ; G 1166 +U 1410 ; WX 493 ; N uni0582 ; G 1167 +U 1411 ; WX 1040 ; N uni0583 ; G 1168 +U 1412 ; WX 734 ; N uni0584 ; G 1169 +U 1413 ; WX 693 ; N uni0585 ; G 1170 +U 1414 ; WX 956 ; N uni0586 ; G 1171 +U 1415 ; WX 833 ; N uni0587 ; G 1172 +U 1417 ; WX 340 ; N uni0589 ; G 1173 +U 1418 ; WX 388 ; N uni058A ; G 1174 +U 3647 ; WX 696 ; N uni0E3F ; G 1175 +U 4256 ; WX 755 ; N uni10A0 ; G 1176 +U 4257 ; WX 936 ; N uni10A1 ; G 1177 +U 4258 ; WX 866 ; N uni10A2 ; G 1178 +U 4259 ; WX 874 ; N uni10A3 ; G 1179 +U 4260 ; WX 781 ; N uni10A4 ; G 1180 +U 4261 ; WX 1078 ; N uni10A5 ; G 1181 +U 4262 ; WX 1014 ; N uni10A6 ; G 1182 +U 4263 ; WX 1213 ; N uni10A7 ; G 1183 +U 4264 ; WX 643 ; N uni10A8 ; G 1184 +U 4265 ; WX 818 ; N uni10A9 ; G 1185 +U 4266 ; WX 1051 ; N uni10AA ; G 1186 +U 4267 ; WX 1051 ; N uni10AB ; G 1187 +U 4268 ; WX 796 ; N uni10AC ; G 1188 +U 4269 ; WX 1135 ; N uni10AD ; G 1189 +U 4270 ; WX 969 ; N uni10AE ; G 1190 +U 4271 ; WX 902 ; N uni10AF ; G 1191 +U 4272 ; WX 1109 ; N uni10B0 ; G 1192 +U 4273 ; WX 792 ; N uni10B1 ; G 1193 +U 4274 ; WX 756 ; N uni10B2 ; G 1194 +U 4275 ; WX 1076 ; N uni10B3 ; G 1195 +U 4276 ; WX 976 ; N uni10B4 ; G 1196 +U 4277 ; WX 1066 ; N uni10B5 ; G 1197 +U 4278 ; WX 811 ; N uni10B6 ; G 1198 +U 4279 ; WX 833 ; N uni10B7 ; G 1199 +U 4280 ; WX 821 ; N uni10B8 ; G 1200 +U 4281 ; WX 833 ; N uni10B9 ; G 1201 +U 4282 ; WX 908 ; N uni10BA ; G 1202 +U 4283 ; WX 1077 ; N uni10BB ; G 1203 +U 4284 ; WX 769 ; N uni10BC ; G 1204 +U 4285 ; WX 822 ; N uni10BD ; G 1205 +U 4286 ; WX 813 ; N uni10BE ; G 1206 +U 4287 ; WX 1111 ; N uni10BF ; G 1207 +U 4288 ; WX 1123 ; N uni10C0 ; G 1208 +U 4289 ; WX 802 ; N uni10C1 ; G 1209 +U 4290 ; WX 892 ; N uni10C2 ; G 1210 +U 4291 ; WX 802 ; N uni10C3 ; G 1211 +U 4292 ; WX 880 ; N uni10C4 ; G 1212 +U 4293 ; WX 1063 ; N uni10C5 ; G 1213 +U 4304 ; WX 594 ; N uni10D0 ; G 1214 +U 4305 ; WX 625 ; N uni10D1 ; G 1215 +U 4306 ; WX 643 ; N uni10D2 ; G 1216 +U 4307 ; WX 887 ; N uni10D3 ; G 1217 +U 4308 ; WX 615 ; N uni10D4 ; G 1218 +U 4309 ; WX 611 ; N uni10D5 ; G 1219 +U 4310 ; WX 667 ; N uni10D6 ; G 1220 +U 4311 ; WX 915 ; N uni10D7 ; G 1221 +U 4312 ; WX 613 ; N uni10D8 ; G 1222 +U 4313 ; WX 600 ; N uni10D9 ; G 1223 +U 4314 ; WX 1120 ; N uni10DA ; G 1224 +U 4315 ; WX 640 ; N uni10DB ; G 1225 +U 4316 ; WX 640 ; N uni10DC ; G 1226 +U 4317 ; WX 879 ; N uni10DD ; G 1227 +U 4318 ; WX 624 ; N uni10DE ; G 1228 +U 4319 ; WX 634 ; N uni10DF ; G 1229 +U 4320 ; WX 877 ; N uni10E0 ; G 1230 +U 4321 ; WX 666 ; N uni10E1 ; G 1231 +U 4322 ; WX 780 ; N uni10E2 ; G 1232 +U 4323 ; WX 751 ; N uni10E3 ; G 1233 +U 4324 ; WX 869 ; N uni10E4 ; G 1234 +U 4325 ; WX 639 ; N uni10E5 ; G 1235 +U 4326 ; WX 912 ; N uni10E6 ; G 1236 +U 4327 ; WX 622 ; N uni10E7 ; G 1237 +U 4328 ; WX 647 ; N uni10E8 ; G 1238 +U 4329 ; WX 640 ; N uni10E9 ; G 1239 +U 4330 ; WX 729 ; N uni10EA ; G 1240 +U 4331 ; WX 641 ; N uni10EB ; G 1241 +U 4332 ; WX 630 ; N uni10EC ; G 1242 +U 4333 ; WX 629 ; N uni10ED ; G 1243 +U 4334 ; WX 670 ; N uni10EE ; G 1244 +U 4335 ; WX 753 ; N uni10EF ; G 1245 +U 4336 ; WX 625 ; N uni10F0 ; G 1246 +U 4337 ; WX 657 ; N uni10F1 ; G 1247 +U 4338 ; WX 625 ; N uni10F2 ; G 1248 +U 4339 ; WX 625 ; N uni10F3 ; G 1249 +U 4340 ; WX 624 ; N uni10F4 ; G 1250 +U 4341 ; WX 670 ; N uni10F5 ; G 1251 +U 4342 ; WX 940 ; N uni10F6 ; G 1252 +U 4343 ; WX 680 ; N uni10F7 ; G 1253 +U 4344 ; WX 636 ; N uni10F8 ; G 1254 +U 4345 ; WX 672 ; N uni10F9 ; G 1255 +U 4346 ; WX 625 ; N uni10FA ; G 1256 +U 4347 ; WX 588 ; N uni10FB ; G 1257 +U 4348 ; WX 354 ; N uni10FC ; G 1258 +U 7424 ; WX 641 ; N uni1D00 ; G 1259 +U 7425 ; WX 892 ; N uni1D01 ; G 1260 +U 7426 ; WX 940 ; N uni1D02 ; G 1261 +U 7427 ; WX 695 ; N uni1D03 ; G 1262 +U 7428 ; WX 609 ; N uni1D04 ; G 1263 +U 7429 ; WX 675 ; N uni1D05 ; G 1264 +U 7430 ; WX 675 ; N uni1D06 ; G 1265 +U 7431 ; WX 617 ; N uni1D07 ; G 1266 +U 7432 ; WX 509 ; N uni1D08 ; G 1267 +U 7433 ; WX 320 ; N uni1D09 ; G 1268 +U 7434 ; WX 561 ; N uni1D0A ; G 1269 +U 7435 ; WX 722 ; N uni1D0B ; G 1270 +U 7436 ; WX 617 ; N uni1D0C ; G 1271 +U 7437 ; WX 869 ; N uni1D0D ; G 1272 +U 7438 ; WX 737 ; N uni1D0E ; G 1273 +U 7439 ; WX 667 ; N uni1D0F ; G 1274 +U 7440 ; WX 609 ; N uni1D10 ; G 1275 +U 7441 ; WX 628 ; N uni1D11 ; G 1276 +U 7442 ; WX 628 ; N uni1D12 ; G 1277 +U 7443 ; WX 667 ; N uni1D13 ; G 1278 +U 7444 ; WX 989 ; N uni1D14 ; G 1279 +U 7445 ; WX 598 ; N uni1D15 ; G 1280 +U 7446 ; WX 667 ; N uni1D16 ; G 1281 +U 7447 ; WX 667 ; N uni1D17 ; G 1282 +U 7448 ; WX 586 ; N uni1D18 ; G 1283 +U 7449 ; WX 801 ; N uni1D19 ; G 1284 +U 7450 ; WX 801 ; N uni1D1A ; G 1285 +U 7451 ; WX 620 ; N uni1D1B ; G 1286 +U 7452 ; WX 647 ; N uni1D1C ; G 1287 +U 7453 ; WX 664 ; N uni1D1D ; G 1288 +U 7454 ; WX 923 ; N uni1D1E ; G 1289 +U 7455 ; WX 655 ; N uni1D1F ; G 1290 +U 7456 ; WX 581 ; N uni1D20 ; G 1291 +U 7457 ; WX 861 ; N uni1D21 ; G 1292 +U 7458 ; WX 568 ; N uni1D22 ; G 1293 +U 7459 ; WX 568 ; N uni1D23 ; G 1294 +U 7460 ; WX 588 ; N uni1D24 ; G 1295 +U 7461 ; WX 802 ; N uni1D25 ; G 1296 +U 7462 ; WX 586 ; N uni1D26 ; G 1297 +U 7463 ; WX 641 ; N uni1D27 ; G 1298 +U 7464 ; WX 732 ; N uni1D28 ; G 1299 +U 7465 ; WX 586 ; N uni1D29 ; G 1300 +U 7466 ; WX 854 ; N uni1D2A ; G 1301 +U 7467 ; WX 705 ; N uni1D2B ; G 1302 +U 7468 ; WX 489 ; N uni1D2C ; G 1303 +U 7469 ; WX 651 ; N uni1D2D ; G 1304 +U 7470 ; WX 532 ; N uni1D2E ; G 1305 +U 7471 ; WX 532 ; N uni1D2F ; G 1306 +U 7472 ; WX 546 ; N uni1D30 ; G 1307 +U 7473 ; WX 480 ; N uni1D31 ; G 1308 +U 7474 ; WX 480 ; N uni1D32 ; G 1309 +U 7475 ; WX 538 ; N uni1D33 ; G 1310 +U 7476 ; WX 595 ; N uni1D34 ; G 1311 +U 7477 ; WX 294 ; N uni1D35 ; G 1312 +U 7478 ; WX 298 ; N uni1D36 ; G 1313 +U 7479 ; WX 547 ; N uni1D37 ; G 1314 +U 7480 ; WX 443 ; N uni1D38 ; G 1315 +U 7481 ; WX 697 ; N uni1D39 ; G 1316 +U 7482 ; WX 576 ; N uni1D3A ; G 1317 +U 7483 ; WX 606 ; N uni1D3B ; G 1318 +U 7484 ; WX 548 ; N uni1D3C ; G 1319 +U 7485 ; WX 442 ; N uni1D3D ; G 1320 +U 7486 ; WX 474 ; N uni1D3E ; G 1321 +U 7487 ; WX 523 ; N uni1D3F ; G 1322 +U 7488 ; WX 455 ; N uni1D40 ; G 1323 +U 7489 ; WX 469 ; N uni1D41 ; G 1324 +U 7490 ; WX 549 ; N uni1D42 ; G 1325 +U 7491 ; WX 466 ; N uni1D43 ; G 1326 +U 7492 ; WX 466 ; N uni1D44 ; G 1327 +U 7493 ; WX 498 ; N uni1D45 ; G 1328 +U 7494 ; WX 657 ; N uni1D46 ; G 1329 +U 7495 ; WX 499 ; N uni1D47 ; G 1330 +U 7496 ; WX 498 ; N uni1D48 ; G 1331 +U 7497 ; WX 444 ; N uni1D49 ; G 1332 +U 7498 ; WX 444 ; N uni1D4A ; G 1333 +U 7499 ; WX 412 ; N uni1D4B ; G 1334 +U 7500 ; WX 412 ; N uni1D4C ; G 1335 +U 7501 ; WX 498 ; N uni1D4D ; G 1336 +U 7502 ; WX 300 ; N uni1D4E ; G 1337 +U 7503 ; WX 523 ; N uni1D4F ; G 1338 +U 7504 ; WX 729 ; N uni1D50 ; G 1339 +U 7505 ; WX 473 ; N uni1D51 ; G 1340 +U 7506 ; WX 467 ; N uni1D52 ; G 1341 +U 7507 ; WX 427 ; N uni1D53 ; G 1342 +U 7508 ; WX 467 ; N uni1D54 ; G 1343 +U 7509 ; WX 467 ; N uni1D55 ; G 1344 +U 7510 ; WX 499 ; N uni1D56 ; G 1345 +U 7511 ; WX 371 ; N uni1D57 ; G 1346 +U 7512 ; WX 520 ; N uni1D58 ; G 1347 +U 7513 ; WX 418 ; N uni1D59 ; G 1348 +U 7514 ; WX 729 ; N uni1D5A ; G 1349 +U 7515 ; WX 491 ; N uni1D5B ; G 1350 +U 7516 ; WX 505 ; N uni1D5C ; G 1351 +U 7517 ; WX 418 ; N uni1D5D ; G 1352 +U 7518 ; WX 416 ; N uni1D5E ; G 1353 +U 7519 ; WX 420 ; N uni1D5F ; G 1354 +U 7520 ; WX 570 ; N uni1D60 ; G 1355 +U 7521 ; WX 414 ; N uni1D61 ; G 1356 +U 7522 ; WX 239 ; N uni1D62 ; G 1357 +U 7523 ; WX 414 ; N uni1D63 ; G 1358 +U 7524 ; WX 520 ; N uni1D64 ; G 1359 +U 7525 ; WX 491 ; N uni1D65 ; G 1360 +U 7526 ; WX 418 ; N uni1D66 ; G 1361 +U 7527 ; WX 416 ; N uni1D67 ; G 1362 +U 7528 ; WX 419 ; N uni1D68 ; G 1363 +U 7529 ; WX 570 ; N uni1D69 ; G 1364 +U 7530 ; WX 414 ; N uni1D6A ; G 1365 +U 7531 ; WX 1041 ; N uni1D6B ; G 1366 +U 7543 ; WX 640 ; N uni1D77 ; G 1367 +U 7544 ; WX 595 ; N uni1D78 ; G 1368 +U 7547 ; WX 380 ; N uni1D7B ; G 1369 +U 7548 ; WX 380 ; N uni1D7C ; G 1370 +U 7549 ; WX 699 ; N uni1D7D ; G 1371 +U 7550 ; WX 647 ; N uni1D7E ; G 1372 +U 7551 ; WX 679 ; N uni1D7F ; G 1373 +U 7557 ; WX 380 ; N uni1D85 ; G 1374 +U 7579 ; WX 498 ; N uni1D9B ; G 1375 +U 7580 ; WX 427 ; N uni1D9C ; G 1376 +U 7581 ; WX 427 ; N uni1D9D ; G 1377 +U 7582 ; WX 467 ; N uni1D9E ; G 1378 +U 7583 ; WX 412 ; N uni1D9F ; G 1379 +U 7584 ; WX 383 ; N uni1DA0 ; G 1380 +U 7585 ; WX 373 ; N uni1DA1 ; G 1381 +U 7586 ; WX 498 ; N uni1DA2 ; G 1382 +U 7587 ; WX 522 ; N uni1DA3 ; G 1383 +U 7588 ; WX 300 ; N uni1DA4 ; G 1384 +U 7589 ; WX 307 ; N uni1DA5 ; G 1385 +U 7590 ; WX 300 ; N uni1DA6 ; G 1386 +U 7591 ; WX 300 ; N uni1DA7 ; G 1387 +U 7592 ; WX 370 ; N uni1DA8 ; G 1388 +U 7593 ; WX 368 ; N uni1DA9 ; G 1389 +U 7594 ; WX 321 ; N uni1DAA ; G 1390 +U 7595 ; WX 430 ; N uni1DAB ; G 1391 +U 7596 ; WX 682 ; N uni1DAC ; G 1392 +U 7597 ; WX 729 ; N uni1DAD ; G 1393 +U 7598 ; WX 588 ; N uni1DAE ; G 1394 +U 7599 ; WX 587 ; N uni1DAF ; G 1395 +U 7600 ; WX 472 ; N uni1DB0 ; G 1396 +U 7601 ; WX 467 ; N uni1DB1 ; G 1397 +U 7602 ; WX 522 ; N uni1DB2 ; G 1398 +U 7603 ; WX 400 ; N uni1DB3 ; G 1399 +U 7604 ; WX 387 ; N uni1DB4 ; G 1400 +U 7605 ; WX 371 ; N uni1DB5 ; G 1401 +U 7606 ; WX 520 ; N uni1DB6 ; G 1402 +U 7607 ; WX 475 ; N uni1DB7 ; G 1403 +U 7608 ; WX 408 ; N uni1DB8 ; G 1404 +U 7609 ; WX 489 ; N uni1DB9 ; G 1405 +U 7610 ; WX 491 ; N uni1DBA ; G 1406 +U 7611 ; WX 412 ; N uni1DBB ; G 1407 +U 7612 ; WX 527 ; N uni1DBC ; G 1408 +U 7613 ; WX 412 ; N uni1DBD ; G 1409 +U 7614 ; WX 452 ; N uni1DBE ; G 1410 +U 7615 ; WX 467 ; N uni1DBF ; G 1411 +U 7620 ; WX 0 ; N uni1DC4 ; G 1412 +U 7621 ; WX 0 ; N uni1DC5 ; G 1413 +U 7622 ; WX 0 ; N uni1DC6 ; G 1414 +U 7623 ; WX 0 ; N uni1DC7 ; G 1415 +U 7624 ; WX 0 ; N uni1DC8 ; G 1416 +U 7625 ; WX 0 ; N uni1DC9 ; G 1417 +U 7680 ; WX 776 ; N uni1E00 ; G 1418 +U 7681 ; WX 648 ; N uni1E01 ; G 1419 +U 7682 ; WX 845 ; N uni1E02 ; G 1420 +U 7683 ; WX 699 ; N uni1E03 ; G 1421 +U 7684 ; WX 845 ; N uni1E04 ; G 1422 +U 7685 ; WX 699 ; N uni1E05 ; G 1423 +U 7686 ; WX 845 ; N uni1E06 ; G 1424 +U 7687 ; WX 699 ; N uni1E07 ; G 1425 +U 7688 ; WX 796 ; N uni1E08 ; G 1426 +U 7689 ; WX 609 ; N uni1E09 ; G 1427 +U 7690 ; WX 867 ; N uni1E0A ; G 1428 +U 7691 ; WX 699 ; N uni1E0B ; G 1429 +U 7692 ; WX 867 ; N uni1E0C ; G 1430 +U 7693 ; WX 699 ; N uni1E0D ; G 1431 +U 7694 ; WX 867 ; N uni1E0E ; G 1432 +U 7695 ; WX 699 ; N uni1E0F ; G 1433 +U 7696 ; WX 867 ; N uni1E10 ; G 1434 +U 7697 ; WX 699 ; N uni1E11 ; G 1435 +U 7698 ; WX 867 ; N uni1E12 ; G 1436 +U 7699 ; WX 699 ; N uni1E13 ; G 1437 +U 7700 ; WX 762 ; N uni1E14 ; G 1438 +U 7701 ; WX 636 ; N uni1E15 ; G 1439 +U 7702 ; WX 762 ; N uni1E16 ; G 1440 +U 7703 ; WX 636 ; N uni1E17 ; G 1441 +U 7704 ; WX 762 ; N uni1E18 ; G 1442 +U 7705 ; WX 636 ; N uni1E19 ; G 1443 +U 7706 ; WX 762 ; N uni1E1A ; G 1444 +U 7707 ; WX 636 ; N uni1E1B ; G 1445 +U 7708 ; WX 762 ; N uni1E1C ; G 1446 +U 7709 ; WX 636 ; N uni1E1D ; G 1447 +U 7710 ; WX 710 ; N uni1E1E ; G 1448 +U 7711 ; WX 430 ; N uni1E1F ; G 1449 +U 7712 ; WX 854 ; N uni1E20 ; G 1450 +U 7713 ; WX 699 ; N uni1E21 ; G 1451 +U 7714 ; WX 945 ; N uni1E22 ; G 1452 +U 7715 ; WX 727 ; N uni1E23 ; G 1453 +U 7716 ; WX 945 ; N uni1E24 ; G 1454 +U 7717 ; WX 727 ; N uni1E25 ; G 1455 +U 7718 ; WX 945 ; N uni1E26 ; G 1456 +U 7719 ; WX 727 ; N uni1E27 ; G 1457 +U 7720 ; WX 945 ; N uni1E28 ; G 1458 +U 7721 ; WX 727 ; N uni1E29 ; G 1459 +U 7722 ; WX 945 ; N uni1E2A ; G 1460 +U 7723 ; WX 727 ; N uni1E2B ; G 1461 +U 7724 ; WX 468 ; N uni1E2C ; G 1462 +U 7725 ; WX 380 ; N uni1E2D ; G 1463 +U 7726 ; WX 468 ; N uni1E2E ; G 1464 +U 7727 ; WX 380 ; N uni1E2F ; G 1465 +U 7728 ; WX 869 ; N uni1E30 ; G 1466 +U 7729 ; WX 693 ; N uni1E31 ; G 1467 +U 7730 ; WX 869 ; N uni1E32 ; G 1468 +U 7731 ; WX 693 ; N uni1E33 ; G 1469 +U 7732 ; WX 869 ; N uni1E34 ; G 1470 +U 7733 ; WX 693 ; N uni1E35 ; G 1471 +U 7734 ; WX 703 ; N uni1E36 ; G 1472 +U 7735 ; WX 380 ; N uni1E37 ; G 1473 +U 7736 ; WX 703 ; N uni1E38 ; G 1474 +U 7737 ; WX 380 ; N uni1E39 ; G 1475 +U 7738 ; WX 703 ; N uni1E3A ; G 1476 +U 7739 ; WX 380 ; N uni1E3B ; G 1477 +U 7740 ; WX 703 ; N uni1E3C ; G 1478 +U 7741 ; WX 380 ; N uni1E3D ; G 1479 +U 7742 ; WX 1107 ; N uni1E3E ; G 1480 +U 7743 ; WX 1058 ; N uni1E3F ; G 1481 +U 7744 ; WX 1107 ; N uni1E40 ; G 1482 +U 7745 ; WX 1058 ; N uni1E41 ; G 1483 +U 7746 ; WX 1107 ; N uni1E42 ; G 1484 +U 7747 ; WX 1058 ; N uni1E43 ; G 1485 +U 7748 ; WX 914 ; N uni1E44 ; G 1486 +U 7749 ; WX 727 ; N uni1E45 ; G 1487 +U 7750 ; WX 914 ; N uni1E46 ; G 1488 +U 7751 ; WX 727 ; N uni1E47 ; G 1489 +U 7752 ; WX 914 ; N uni1E48 ; G 1490 +U 7753 ; WX 727 ; N uni1E49 ; G 1491 +U 7754 ; WX 914 ; N uni1E4A ; G 1492 +U 7755 ; WX 727 ; N uni1E4B ; G 1493 +U 7756 ; WX 871 ; N uni1E4C ; G 1494 +U 7757 ; WX 667 ; N uni1E4D ; G 1495 +U 7758 ; WX 871 ; N uni1E4E ; G 1496 +U 7759 ; WX 667 ; N uni1E4F ; G 1497 +U 7760 ; WX 871 ; N uni1E50 ; G 1498 +U 7761 ; WX 667 ; N uni1E51 ; G 1499 +U 7762 ; WX 871 ; N uni1E52 ; G 1500 +U 7763 ; WX 667 ; N uni1E53 ; G 1501 +U 7764 ; WX 752 ; N uni1E54 ; G 1502 +U 7765 ; WX 699 ; N uni1E55 ; G 1503 +U 7766 ; WX 752 ; N uni1E56 ; G 1504 +U 7767 ; WX 699 ; N uni1E57 ; G 1505 +U 7768 ; WX 831 ; N uni1E58 ; G 1506 +U 7769 ; WX 527 ; N uni1E59 ; G 1507 +U 7770 ; WX 831 ; N uni1E5A ; G 1508 +U 7771 ; WX 527 ; N uni1E5B ; G 1509 +U 7772 ; WX 831 ; N uni1E5C ; G 1510 +U 7773 ; WX 527 ; N uni1E5D ; G 1511 +U 7774 ; WX 831 ; N uni1E5E ; G 1512 +U 7775 ; WX 527 ; N uni1E5F ; G 1513 +U 7776 ; WX 722 ; N uni1E60 ; G 1514 +U 7777 ; WX 563 ; N uni1E61 ; G 1515 +U 7778 ; WX 722 ; N uni1E62 ; G 1516 +U 7779 ; WX 563 ; N uni1E63 ; G 1517 +U 7780 ; WX 722 ; N uni1E64 ; G 1518 +U 7781 ; WX 563 ; N uni1E65 ; G 1519 +U 7782 ; WX 722 ; N uni1E66 ; G 1520 +U 7783 ; WX 563 ; N uni1E67 ; G 1521 +U 7784 ; WX 722 ; N uni1E68 ; G 1522 +U 7785 ; WX 563 ; N uni1E69 ; G 1523 +U 7786 ; WX 744 ; N uni1E6A ; G 1524 +U 7787 ; WX 462 ; N uni1E6B ; G 1525 +U 7788 ; WX 744 ; N uni1E6C ; G 1526 +U 7789 ; WX 462 ; N uni1E6D ; G 1527 +U 7790 ; WX 744 ; N uni1E6E ; G 1528 +U 7791 ; WX 462 ; N uni1E6F ; G 1529 +U 7792 ; WX 744 ; N uni1E70 ; G 1530 +U 7793 ; WX 462 ; N uni1E71 ; G 1531 +U 7794 ; WX 872 ; N uni1E72 ; G 1532 +U 7795 ; WX 727 ; N uni1E73 ; G 1533 +U 7796 ; WX 872 ; N uni1E74 ; G 1534 +U 7797 ; WX 727 ; N uni1E75 ; G 1535 +U 7798 ; WX 872 ; N uni1E76 ; G 1536 +U 7799 ; WX 727 ; N uni1E77 ; G 1537 +U 7800 ; WX 872 ; N uni1E78 ; G 1538 +U 7801 ; WX 727 ; N uni1E79 ; G 1539 +U 7802 ; WX 872 ; N uni1E7A ; G 1540 +U 7803 ; WX 727 ; N uni1E7B ; G 1541 +U 7804 ; WX 776 ; N uni1E7C ; G 1542 +U 7805 ; WX 581 ; N uni1E7D ; G 1543 +U 7806 ; WX 776 ; N uni1E7E ; G 1544 +U 7807 ; WX 581 ; N uni1E7F ; G 1545 +U 7808 ; WX 1123 ; N Wgrave ; G 1546 +U 7809 ; WX 861 ; N wgrave ; G 1547 +U 7810 ; WX 1123 ; N Wacute ; G 1548 +U 7811 ; WX 861 ; N wacute ; G 1549 +U 7812 ; WX 1123 ; N Wdieresis ; G 1550 +U 7813 ; WX 861 ; N wdieresis ; G 1551 +U 7814 ; WX 1123 ; N uni1E86 ; G 1552 +U 7815 ; WX 861 ; N uni1E87 ; G 1553 +U 7816 ; WX 1123 ; N uni1E88 ; G 1554 +U 7817 ; WX 861 ; N uni1E89 ; G 1555 +U 7818 ; WX 776 ; N uni1E8A ; G 1556 +U 7819 ; WX 596 ; N uni1E8B ; G 1557 +U 7820 ; WX 776 ; N uni1E8C ; G 1558 +U 7821 ; WX 596 ; N uni1E8D ; G 1559 +U 7822 ; WX 714 ; N uni1E8E ; G 1560 +U 7823 ; WX 581 ; N uni1E8F ; G 1561 +U 7824 ; WX 730 ; N uni1E90 ; G 1562 +U 7825 ; WX 568 ; N uni1E91 ; G 1563 +U 7826 ; WX 730 ; N uni1E92 ; G 1564 +U 7827 ; WX 568 ; N uni1E93 ; G 1565 +U 7828 ; WX 730 ; N uni1E94 ; G 1566 +U 7829 ; WX 568 ; N uni1E95 ; G 1567 +U 7830 ; WX 727 ; N uni1E96 ; G 1568 +U 7831 ; WX 462 ; N uni1E97 ; G 1569 +U 7832 ; WX 861 ; N uni1E98 ; G 1570 +U 7833 ; WX 581 ; N uni1E99 ; G 1571 +U 7834 ; WX 1014 ; N uni1E9A ; G 1572 +U 7835 ; WX 430 ; N uni1E9B ; G 1573 +U 7836 ; WX 430 ; N uni1E9C ; G 1574 +U 7837 ; WX 430 ; N uni1E9D ; G 1575 +U 7838 ; WX 947 ; N uni1E9E ; G 1576 +U 7839 ; WX 667 ; N uni1E9F ; G 1577 +U 7840 ; WX 776 ; N uni1EA0 ; G 1578 +U 7841 ; WX 648 ; N uni1EA1 ; G 1579 +U 7842 ; WX 776 ; N uni1EA2 ; G 1580 +U 7843 ; WX 648 ; N uni1EA3 ; G 1581 +U 7844 ; WX 776 ; N uni1EA4 ; G 1582 +U 7845 ; WX 648 ; N uni1EA5 ; G 1583 +U 7846 ; WX 776 ; N uni1EA6 ; G 1584 +U 7847 ; WX 648 ; N uni1EA7 ; G 1585 +U 7848 ; WX 776 ; N uni1EA8 ; G 1586 +U 7849 ; WX 648 ; N uni1EA9 ; G 1587 +U 7850 ; WX 776 ; N uni1EAA ; G 1588 +U 7851 ; WX 648 ; N uni1EAB ; G 1589 +U 7852 ; WX 776 ; N uni1EAC ; G 1590 +U 7853 ; WX 648 ; N uni1EAD ; G 1591 +U 7854 ; WX 776 ; N uni1EAE ; G 1592 +U 7855 ; WX 648 ; N uni1EAF ; G 1593 +U 7856 ; WX 776 ; N uni1EB0 ; G 1594 +U 7857 ; WX 648 ; N uni1EB1 ; G 1595 +U 7858 ; WX 776 ; N uni1EB2 ; G 1596 +U 7859 ; WX 648 ; N uni1EB3 ; G 1597 +U 7860 ; WX 776 ; N uni1EB4 ; G 1598 +U 7861 ; WX 648 ; N uni1EB5 ; G 1599 +U 7862 ; WX 776 ; N uni1EB6 ; G 1600 +U 7863 ; WX 648 ; N uni1EB7 ; G 1601 +U 7864 ; WX 762 ; N uni1EB8 ; G 1602 +U 7865 ; WX 636 ; N uni1EB9 ; G 1603 +U 7866 ; WX 762 ; N uni1EBA ; G 1604 +U 7867 ; WX 636 ; N uni1EBB ; G 1605 +U 7868 ; WX 762 ; N uni1EBC ; G 1606 +U 7869 ; WX 636 ; N uni1EBD ; G 1607 +U 7870 ; WX 762 ; N uni1EBE ; G 1608 +U 7871 ; WX 636 ; N uni1EBF ; G 1609 +U 7872 ; WX 762 ; N uni1EC0 ; G 1610 +U 7873 ; WX 636 ; N uni1EC1 ; G 1611 +U 7874 ; WX 762 ; N uni1EC2 ; G 1612 +U 7875 ; WX 636 ; N uni1EC3 ; G 1613 +U 7876 ; WX 762 ; N uni1EC4 ; G 1614 +U 7877 ; WX 636 ; N uni1EC5 ; G 1615 +U 7878 ; WX 762 ; N uni1EC6 ; G 1616 +U 7879 ; WX 636 ; N uni1EC7 ; G 1617 +U 7880 ; WX 468 ; N uni1EC8 ; G 1618 +U 7881 ; WX 380 ; N uni1EC9 ; G 1619 +U 7882 ; WX 468 ; N uni1ECA ; G 1620 +U 7883 ; WX 380 ; N uni1ECB ; G 1621 +U 7884 ; WX 871 ; N uni1ECC ; G 1622 +U 7885 ; WX 667 ; N uni1ECD ; G 1623 +U 7886 ; WX 871 ; N uni1ECE ; G 1624 +U 7887 ; WX 667 ; N uni1ECF ; G 1625 +U 7888 ; WX 871 ; N uni1ED0 ; G 1626 +U 7889 ; WX 667 ; N uni1ED1 ; G 1627 +U 7890 ; WX 871 ; N uni1ED2 ; G 1628 +U 7891 ; WX 667 ; N uni1ED3 ; G 1629 +U 7892 ; WX 871 ; N uni1ED4 ; G 1630 +U 7893 ; WX 667 ; N uni1ED5 ; G 1631 +U 7894 ; WX 871 ; N uni1ED6 ; G 1632 +U 7895 ; WX 667 ; N uni1ED7 ; G 1633 +U 7896 ; WX 871 ; N uni1ED8 ; G 1634 +U 7897 ; WX 667 ; N uni1ED9 ; G 1635 +U 7898 ; WX 871 ; N uni1EDA ; G 1636 +U 7899 ; WX 667 ; N uni1EDB ; G 1637 +U 7900 ; WX 871 ; N uni1EDC ; G 1638 +U 7901 ; WX 667 ; N uni1EDD ; G 1639 +U 7902 ; WX 871 ; N uni1EDE ; G 1640 +U 7903 ; WX 667 ; N uni1EDF ; G 1641 +U 7904 ; WX 871 ; N uni1EE0 ; G 1642 +U 7905 ; WX 667 ; N uni1EE1 ; G 1643 +U 7906 ; WX 871 ; N uni1EE2 ; G 1644 +U 7907 ; WX 667 ; N uni1EE3 ; G 1645 +U 7908 ; WX 872 ; N uni1EE4 ; G 1646 +U 7909 ; WX 727 ; N uni1EE5 ; G 1647 +U 7910 ; WX 872 ; N uni1EE6 ; G 1648 +U 7911 ; WX 727 ; N uni1EE7 ; G 1649 +U 7912 ; WX 872 ; N uni1EE8 ; G 1650 +U 7913 ; WX 727 ; N uni1EE9 ; G 1651 +U 7914 ; WX 872 ; N uni1EEA ; G 1652 +U 7915 ; WX 727 ; N uni1EEB ; G 1653 +U 7916 ; WX 872 ; N uni1EEC ; G 1654 +U 7917 ; WX 727 ; N uni1EED ; G 1655 +U 7918 ; WX 872 ; N uni1EEE ; G 1656 +U 7919 ; WX 727 ; N uni1EEF ; G 1657 +U 7920 ; WX 872 ; N uni1EF0 ; G 1658 +U 7921 ; WX 727 ; N uni1EF1 ; G 1659 +U 7922 ; WX 714 ; N Ygrave ; G 1660 +U 7923 ; WX 581 ; N ygrave ; G 1661 +U 7924 ; WX 714 ; N uni1EF4 ; G 1662 +U 7925 ; WX 581 ; N uni1EF5 ; G 1663 +U 7926 ; WX 714 ; N uni1EF6 ; G 1664 +U 7927 ; WX 581 ; N uni1EF7 ; G 1665 +U 7928 ; WX 714 ; N uni1EF8 ; G 1666 +U 7929 ; WX 581 ; N uni1EF9 ; G 1667 +U 7930 ; WX 1078 ; N uni1EFA ; G 1668 +U 7931 ; WX 701 ; N uni1EFB ; G 1669 +U 7936 ; WX 770 ; N uni1F00 ; G 1670 +U 7937 ; WX 770 ; N uni1F01 ; G 1671 +U 7938 ; WX 770 ; N uni1F02 ; G 1672 +U 7939 ; WX 770 ; N uni1F03 ; G 1673 +U 7940 ; WX 770 ; N uni1F04 ; G 1674 +U 7941 ; WX 770 ; N uni1F05 ; G 1675 +U 7942 ; WX 770 ; N uni1F06 ; G 1676 +U 7943 ; WX 770 ; N uni1F07 ; G 1677 +U 7944 ; WX 776 ; N uni1F08 ; G 1678 +U 7945 ; WX 776 ; N uni1F09 ; G 1679 +U 7946 ; WX 978 ; N uni1F0A ; G 1680 +U 7947 ; WX 978 ; N uni1F0B ; G 1681 +U 7948 ; WX 832 ; N uni1F0C ; G 1682 +U 7949 ; WX 849 ; N uni1F0D ; G 1683 +U 7950 ; WX 776 ; N uni1F0E ; G 1684 +U 7951 ; WX 776 ; N uni1F0F ; G 1685 +U 7952 ; WX 608 ; N uni1F10 ; G 1686 +U 7953 ; WX 608 ; N uni1F11 ; G 1687 +U 7954 ; WX 608 ; N uni1F12 ; G 1688 +U 7955 ; WX 608 ; N uni1F13 ; G 1689 +U 7956 ; WX 608 ; N uni1F14 ; G 1690 +U 7957 ; WX 608 ; N uni1F15 ; G 1691 +U 7960 ; WX 917 ; N uni1F18 ; G 1692 +U 7961 ; WX 909 ; N uni1F19 ; G 1693 +U 7962 ; WX 1169 ; N uni1F1A ; G 1694 +U 7963 ; WX 1169 ; N uni1F1B ; G 1695 +U 7964 ; WX 1093 ; N uni1F1C ; G 1696 +U 7965 ; WX 1120 ; N uni1F1D ; G 1697 +U 7968 ; WX 727 ; N uni1F20 ; G 1698 +U 7969 ; WX 727 ; N uni1F21 ; G 1699 +U 7970 ; WX 727 ; N uni1F22 ; G 1700 +U 7971 ; WX 727 ; N uni1F23 ; G 1701 +U 7972 ; WX 727 ; N uni1F24 ; G 1702 +U 7973 ; WX 727 ; N uni1F25 ; G 1703 +U 7974 ; WX 727 ; N uni1F26 ; G 1704 +U 7975 ; WX 727 ; N uni1F27 ; G 1705 +U 7976 ; WX 1100 ; N uni1F28 ; G 1706 +U 7977 ; WX 1094 ; N uni1F29 ; G 1707 +U 7978 ; WX 1358 ; N uni1F2A ; G 1708 +U 7979 ; WX 1361 ; N uni1F2B ; G 1709 +U 7980 ; WX 1279 ; N uni1F2C ; G 1710 +U 7981 ; WX 1308 ; N uni1F2D ; G 1711 +U 7982 ; WX 1197 ; N uni1F2E ; G 1712 +U 7983 ; WX 1194 ; N uni1F2F ; G 1713 +U 7984 ; WX 484 ; N uni1F30 ; G 1714 +U 7985 ; WX 484 ; N uni1F31 ; G 1715 +U 7986 ; WX 484 ; N uni1F32 ; G 1716 +U 7987 ; WX 484 ; N uni1F33 ; G 1717 +U 7988 ; WX 484 ; N uni1F34 ; G 1718 +U 7989 ; WX 484 ; N uni1F35 ; G 1719 +U 7990 ; WX 484 ; N uni1F36 ; G 1720 +U 7991 ; WX 484 ; N uni1F37 ; G 1721 +U 7992 ; WX 629 ; N uni1F38 ; G 1722 +U 7993 ; WX 617 ; N uni1F39 ; G 1723 +U 7994 ; WX 878 ; N uni1F3A ; G 1724 +U 7995 ; WX 881 ; N uni1F3B ; G 1725 +U 7996 ; WX 799 ; N uni1F3C ; G 1726 +U 7997 ; WX 831 ; N uni1F3D ; G 1727 +U 7998 ; WX 723 ; N uni1F3E ; G 1728 +U 7999 ; WX 714 ; N uni1F3F ; G 1729 +U 8000 ; WX 667 ; N uni1F40 ; G 1730 +U 8001 ; WX 667 ; N uni1F41 ; G 1731 +U 8002 ; WX 667 ; N uni1F42 ; G 1732 +U 8003 ; WX 667 ; N uni1F43 ; G 1733 +U 8004 ; WX 667 ; N uni1F44 ; G 1734 +U 8005 ; WX 667 ; N uni1F45 ; G 1735 +U 8008 ; WX 900 ; N uni1F48 ; G 1736 +U 8009 ; WX 935 ; N uni1F49 ; G 1737 +U 8010 ; WX 1240 ; N uni1F4A ; G 1738 +U 8011 ; WX 1237 ; N uni1F4B ; G 1739 +U 8012 ; WX 1035 ; N uni1F4C ; G 1740 +U 8013 ; WX 1066 ; N uni1F4D ; G 1741 +U 8016 ; WX 694 ; N uni1F50 ; G 1742 +U 8017 ; WX 694 ; N uni1F51 ; G 1743 +U 8018 ; WX 694 ; N uni1F52 ; G 1744 +U 8019 ; WX 694 ; N uni1F53 ; G 1745 +U 8020 ; WX 694 ; N uni1F54 ; G 1746 +U 8021 ; WX 694 ; N uni1F55 ; G 1747 +U 8022 ; WX 694 ; N uni1F56 ; G 1748 +U 8023 ; WX 694 ; N uni1F57 ; G 1749 +U 8025 ; WX 922 ; N uni1F59 ; G 1750 +U 8027 ; WX 1186 ; N uni1F5B ; G 1751 +U 8029 ; WX 1133 ; N uni1F5D ; G 1752 +U 8031 ; WX 1019 ; N uni1F5F ; G 1753 +U 8032 ; WX 952 ; N uni1F60 ; G 1754 +U 8033 ; WX 952 ; N uni1F61 ; G 1755 +U 8034 ; WX 952 ; N uni1F62 ; G 1756 +U 8035 ; WX 952 ; N uni1F63 ; G 1757 +U 8036 ; WX 952 ; N uni1F64 ; G 1758 +U 8037 ; WX 952 ; N uni1F65 ; G 1759 +U 8038 ; WX 952 ; N uni1F66 ; G 1760 +U 8039 ; WX 952 ; N uni1F67 ; G 1761 +U 8040 ; WX 931 ; N uni1F68 ; G 1762 +U 8041 ; WX 963 ; N uni1F69 ; G 1763 +U 8042 ; WX 1268 ; N uni1F6A ; G 1764 +U 8043 ; WX 1274 ; N uni1F6B ; G 1765 +U 8044 ; WX 1054 ; N uni1F6C ; G 1766 +U 8045 ; WX 1088 ; N uni1F6D ; G 1767 +U 8046 ; WX 1023 ; N uni1F6E ; G 1768 +U 8047 ; WX 1060 ; N uni1F6F ; G 1769 +U 8048 ; WX 770 ; N uni1F70 ; G 1770 +U 8049 ; WX 770 ; N uni1F71 ; G 1771 +U 8050 ; WX 608 ; N uni1F72 ; G 1772 +U 8051 ; WX 608 ; N uni1F73 ; G 1773 +U 8052 ; WX 727 ; N uni1F74 ; G 1774 +U 8053 ; WX 727 ; N uni1F75 ; G 1775 +U 8054 ; WX 484 ; N uni1F76 ; G 1776 +U 8055 ; WX 484 ; N uni1F77 ; G 1777 +U 8056 ; WX 667 ; N uni1F78 ; G 1778 +U 8057 ; WX 667 ; N uni1F79 ; G 1779 +U 8058 ; WX 694 ; N uni1F7A ; G 1780 +U 8059 ; WX 694 ; N uni1F7B ; G 1781 +U 8060 ; WX 952 ; N uni1F7C ; G 1782 +U 8061 ; WX 952 ; N uni1F7D ; G 1783 +U 8064 ; WX 770 ; N uni1F80 ; G 1784 +U 8065 ; WX 770 ; N uni1F81 ; G 1785 +U 8066 ; WX 770 ; N uni1F82 ; G 1786 +U 8067 ; WX 770 ; N uni1F83 ; G 1787 +U 8068 ; WX 770 ; N uni1F84 ; G 1788 +U 8069 ; WX 770 ; N uni1F85 ; G 1789 +U 8070 ; WX 770 ; N uni1F86 ; G 1790 +U 8071 ; WX 770 ; N uni1F87 ; G 1791 +U 8072 ; WX 776 ; N uni1F88 ; G 1792 +U 8073 ; WX 776 ; N uni1F89 ; G 1793 +U 8074 ; WX 978 ; N uni1F8A ; G 1794 +U 8075 ; WX 978 ; N uni1F8B ; G 1795 +U 8076 ; WX 832 ; N uni1F8C ; G 1796 +U 8077 ; WX 849 ; N uni1F8D ; G 1797 +U 8078 ; WX 776 ; N uni1F8E ; G 1798 +U 8079 ; WX 776 ; N uni1F8F ; G 1799 +U 8080 ; WX 727 ; N uni1F90 ; G 1800 +U 8081 ; WX 727 ; N uni1F91 ; G 1801 +U 8082 ; WX 727 ; N uni1F92 ; G 1802 +U 8083 ; WX 727 ; N uni1F93 ; G 1803 +U 8084 ; WX 727 ; N uni1F94 ; G 1804 +U 8085 ; WX 727 ; N uni1F95 ; G 1805 +U 8086 ; WX 727 ; N uni1F96 ; G 1806 +U 8087 ; WX 727 ; N uni1F97 ; G 1807 +U 8088 ; WX 1100 ; N uni1F98 ; G 1808 +U 8089 ; WX 1094 ; N uni1F99 ; G 1809 +U 8090 ; WX 1358 ; N uni1F9A ; G 1810 +U 8091 ; WX 1361 ; N uni1F9B ; G 1811 +U 8092 ; WX 1279 ; N uni1F9C ; G 1812 +U 8093 ; WX 1308 ; N uni1F9D ; G 1813 +U 8094 ; WX 1197 ; N uni1F9E ; G 1814 +U 8095 ; WX 1194 ; N uni1F9F ; G 1815 +U 8096 ; WX 952 ; N uni1FA0 ; G 1816 +U 8097 ; WX 952 ; N uni1FA1 ; G 1817 +U 8098 ; WX 952 ; N uni1FA2 ; G 1818 +U 8099 ; WX 952 ; N uni1FA3 ; G 1819 +U 8100 ; WX 952 ; N uni1FA4 ; G 1820 +U 8101 ; WX 952 ; N uni1FA5 ; G 1821 +U 8102 ; WX 952 ; N uni1FA6 ; G 1822 +U 8103 ; WX 952 ; N uni1FA7 ; G 1823 +U 8104 ; WX 931 ; N uni1FA8 ; G 1824 +U 8105 ; WX 963 ; N uni1FA9 ; G 1825 +U 8106 ; WX 1268 ; N uni1FAA ; G 1826 +U 8107 ; WX 1274 ; N uni1FAB ; G 1827 +U 8108 ; WX 1054 ; N uni1FAC ; G 1828 +U 8109 ; WX 1088 ; N uni1FAD ; G 1829 +U 8110 ; WX 1023 ; N uni1FAE ; G 1830 +U 8111 ; WX 1060 ; N uni1FAF ; G 1831 +U 8112 ; WX 770 ; N uni1FB0 ; G 1832 +U 8113 ; WX 770 ; N uni1FB1 ; G 1833 +U 8114 ; WX 770 ; N uni1FB2 ; G 1834 +U 8115 ; WX 770 ; N uni1FB3 ; G 1835 +U 8116 ; WX 770 ; N uni1FB4 ; G 1836 +U 8118 ; WX 770 ; N uni1FB6 ; G 1837 +U 8119 ; WX 770 ; N uni1FB7 ; G 1838 +U 8120 ; WX 776 ; N uni1FB8 ; G 1839 +U 8121 ; WX 776 ; N uni1FB9 ; G 1840 +U 8122 ; WX 811 ; N uni1FBA ; G 1841 +U 8123 ; WX 776 ; N uni1FBB ; G 1842 +U 8124 ; WX 776 ; N uni1FBC ; G 1843 +U 8125 ; WX 500 ; N uni1FBD ; G 1844 +U 8126 ; WX 500 ; N uni1FBE ; G 1845 +U 8127 ; WX 500 ; N uni1FBF ; G 1846 +U 8128 ; WX 500 ; N uni1FC0 ; G 1847 +U 8129 ; WX 500 ; N uni1FC1 ; G 1848 +U 8130 ; WX 727 ; N uni1FC2 ; G 1849 +U 8131 ; WX 727 ; N uni1FC3 ; G 1850 +U 8132 ; WX 727 ; N uni1FC4 ; G 1851 +U 8134 ; WX 727 ; N uni1FC6 ; G 1852 +U 8135 ; WX 727 ; N uni1FC7 ; G 1853 +U 8136 ; WX 1000 ; N uni1FC8 ; G 1854 +U 8137 ; WX 947 ; N uni1FC9 ; G 1855 +U 8138 ; WX 1191 ; N uni1FCA ; G 1856 +U 8139 ; WX 1118 ; N uni1FCB ; G 1857 +U 8140 ; WX 945 ; N uni1FCC ; G 1858 +U 8141 ; WX 500 ; N uni1FCD ; G 1859 +U 8142 ; WX 500 ; N uni1FCE ; G 1860 +U 8143 ; WX 500 ; N uni1FCF ; G 1861 +U 8144 ; WX 484 ; N uni1FD0 ; G 1862 +U 8145 ; WX 484 ; N uni1FD1 ; G 1863 +U 8146 ; WX 484 ; N uni1FD2 ; G 1864 +U 8147 ; WX 484 ; N uni1FD3 ; G 1865 +U 8150 ; WX 484 ; N uni1FD6 ; G 1866 +U 8151 ; WX 484 ; N uni1FD7 ; G 1867 +U 8152 ; WX 468 ; N uni1FD8 ; G 1868 +U 8153 ; WX 468 ; N uni1FD9 ; G 1869 +U 8154 ; WX 714 ; N uni1FDA ; G 1870 +U 8155 ; WX 662 ; N uni1FDB ; G 1871 +U 8157 ; WX 500 ; N uni1FDD ; G 1872 +U 8158 ; WX 500 ; N uni1FDE ; G 1873 +U 8159 ; WX 500 ; N uni1FDF ; G 1874 +U 8160 ; WX 694 ; N uni1FE0 ; G 1875 +U 8161 ; WX 694 ; N uni1FE1 ; G 1876 +U 8162 ; WX 694 ; N uni1FE2 ; G 1877 +U 8163 ; WX 694 ; N uni1FE3 ; G 1878 +U 8164 ; WX 665 ; N uni1FE4 ; G 1879 +U 8165 ; WX 665 ; N uni1FE5 ; G 1880 +U 8166 ; WX 694 ; N uni1FE6 ; G 1881 +U 8167 ; WX 694 ; N uni1FE7 ; G 1882 +U 8168 ; WX 714 ; N uni1FE8 ; G 1883 +U 8169 ; WX 714 ; N uni1FE9 ; G 1884 +U 8170 ; WX 1019 ; N uni1FEA ; G 1885 +U 8171 ; WX 953 ; N uni1FEB ; G 1886 +U 8172 ; WX 910 ; N uni1FEC ; G 1887 +U 8173 ; WX 500 ; N uni1FED ; G 1888 +U 8174 ; WX 500 ; N uni1FEE ; G 1889 +U 8175 ; WX 500 ; N uni1FEF ; G 1890 +U 8178 ; WX 952 ; N uni1FF2 ; G 1891 +U 8179 ; WX 952 ; N uni1FF3 ; G 1892 +U 8180 ; WX 952 ; N uni1FF4 ; G 1893 +U 8182 ; WX 952 ; N uni1FF6 ; G 1894 +U 8183 ; WX 952 ; N uni1FF7 ; G 1895 +U 8184 ; WX 1069 ; N uni1FF8 ; G 1896 +U 8185 ; WX 887 ; N uni1FF9 ; G 1897 +U 8186 ; WX 1101 ; N uni1FFA ; G 1898 +U 8187 ; WX 911 ; N uni1FFB ; G 1899 +U 8188 ; WX 890 ; N uni1FFC ; G 1900 +U 8189 ; WX 500 ; N uni1FFD ; G 1901 +U 8190 ; WX 500 ; N uni1FFE ; G 1902 +U 8192 ; WX 500 ; N uni2000 ; G 1903 +U 8193 ; WX 1000 ; N uni2001 ; G 1904 +U 8194 ; WX 500 ; N uni2002 ; G 1905 +U 8195 ; WX 1000 ; N uni2003 ; G 1906 +U 8196 ; WX 330 ; N uni2004 ; G 1907 +U 8197 ; WX 250 ; N uni2005 ; G 1908 +U 8198 ; WX 167 ; N uni2006 ; G 1909 +U 8199 ; WX 696 ; N uni2007 ; G 1910 +U 8200 ; WX 348 ; N uni2008 ; G 1911 +U 8201 ; WX 200 ; N uni2009 ; G 1912 +U 8202 ; WX 100 ; N uni200A ; G 1913 +U 8203 ; WX 0 ; N uni200B ; G 1914 +U 8204 ; WX 0 ; N uni200C ; G 1915 +U 8205 ; WX 0 ; N uni200D ; G 1916 +U 8206 ; WX 0 ; N uni200E ; G 1917 +U 8207 ; WX 0 ; N uni200F ; G 1918 +U 8208 ; WX 415 ; N uni2010 ; G 1919 +U 8209 ; WX 415 ; N uni2011 ; G 1920 +U 8210 ; WX 696 ; N figuredash ; G 1921 +U 8211 ; WX 500 ; N endash ; G 1922 +U 8212 ; WX 1000 ; N emdash ; G 1923 +U 8213 ; WX 1000 ; N uni2015 ; G 1924 +U 8214 ; WX 500 ; N uni2016 ; G 1925 +U 8215 ; WX 500 ; N underscoredbl ; G 1926 +U 8216 ; WX 348 ; N quoteleft ; G 1927 +U 8217 ; WX 348 ; N quoteright ; G 1928 +U 8218 ; WX 348 ; N quotesinglbase ; G 1929 +U 8219 ; WX 348 ; N quotereversed ; G 1930 +U 8220 ; WX 575 ; N quotedblleft ; G 1931 +U 8221 ; WX 575 ; N quotedblright ; G 1932 +U 8222 ; WX 575 ; N quotedblbase ; G 1933 +U 8223 ; WX 575 ; N uni201F ; G 1934 +U 8224 ; WX 523 ; N dagger ; G 1935 +U 8225 ; WX 523 ; N daggerdbl ; G 1936 +U 8226 ; WX 639 ; N bullet ; G 1937 +U 8227 ; WX 639 ; N uni2023 ; G 1938 +U 8228 ; WX 348 ; N onedotenleader ; G 1939 +U 8229 ; WX 674 ; N twodotenleader ; G 1940 +U 8230 ; WX 1000 ; N ellipsis ; G 1941 +U 8234 ; WX 0 ; N uni202A ; G 1942 +U 8235 ; WX 0 ; N uni202B ; G 1943 +U 8236 ; WX 0 ; N uni202C ; G 1944 +U 8237 ; WX 0 ; N uni202D ; G 1945 +U 8238 ; WX 0 ; N uni202E ; G 1946 +U 8239 ; WX 200 ; N uni202F ; G 1947 +U 8240 ; WX 1385 ; N perthousand ; G 1948 +U 8241 ; WX 1820 ; N uni2031 ; G 1949 +U 8242 ; WX 264 ; N minute ; G 1950 +U 8243 ; WX 447 ; N second ; G 1951 +U 8244 ; WX 630 ; N uni2034 ; G 1952 +U 8245 ; WX 264 ; N uni2035 ; G 1953 +U 8246 ; WX 447 ; N uni2036 ; G 1954 +U 8247 ; WX 630 ; N uni2037 ; G 1955 +U 8248 ; WX 733 ; N uni2038 ; G 1956 +U 8249 ; WX 400 ; N guilsinglleft ; G 1957 +U 8250 ; WX 400 ; N guilsinglright ; G 1958 +U 8252 ; WX 629 ; N exclamdbl ; G 1959 +U 8253 ; WX 586 ; N uni203D ; G 1960 +U 8254 ; WX 500 ; N uni203E ; G 1961 +U 8258 ; WX 1023 ; N uni2042 ; G 1962 +U 8260 ; WX 167 ; N fraction ; G 1963 +U 8261 ; WX 473 ; N uni2045 ; G 1964 +U 8262 ; WX 473 ; N uni2046 ; G 1965 +U 8263 ; WX 1082 ; N uni2047 ; G 1966 +U 8264 ; WX 856 ; N uni2048 ; G 1967 +U 8265 ; WX 856 ; N uni2049 ; G 1968 +U 8267 ; WX 636 ; N uni204B ; G 1969 +U 8268 ; WX 500 ; N uni204C ; G 1970 +U 8269 ; WX 500 ; N uni204D ; G 1971 +U 8270 ; WX 523 ; N uni204E ; G 1972 +U 8271 ; WX 369 ; N uni204F ; G 1973 +U 8273 ; WX 523 ; N uni2051 ; G 1974 +U 8274 ; WX 556 ; N uni2052 ; G 1975 +U 8275 ; WX 1000 ; N uni2053 ; G 1976 +U 8279 ; WX 813 ; N uni2057 ; G 1977 +U 8287 ; WX 222 ; N uni205F ; G 1978 +U 8288 ; WX 0 ; N uni2060 ; G 1979 +U 8289 ; WX 0 ; N uni2061 ; G 1980 +U 8290 ; WX 0 ; N uni2062 ; G 1981 +U 8291 ; WX 0 ; N uni2063 ; G 1982 +U 8292 ; WX 0 ; N uni2064 ; G 1983 +U 8298 ; WX 0 ; N uni206A ; G 1984 +U 8299 ; WX 0 ; N uni206B ; G 1985 +U 8300 ; WX 0 ; N uni206C ; G 1986 +U 8301 ; WX 0 ; N uni206D ; G 1987 +U 8302 ; WX 0 ; N uni206E ; G 1988 +U 8303 ; WX 0 ; N uni206F ; G 1989 +U 8304 ; WX 438 ; N uni2070 ; G 1990 +U 8305 ; WX 239 ; N uni2071 ; G 1991 +U 8308 ; WX 438 ; N uni2074 ; G 1992 +U 8309 ; WX 438 ; N uni2075 ; G 1993 +U 8310 ; WX 438 ; N uni2076 ; G 1994 +U 8311 ; WX 438 ; N uni2077 ; G 1995 +U 8312 ; WX 438 ; N uni2078 ; G 1996 +U 8313 ; WX 438 ; N uni2079 ; G 1997 +U 8314 ; WX 528 ; N uni207A ; G 1998 +U 8315 ; WX 528 ; N uni207B ; G 1999 +U 8316 ; WX 528 ; N uni207C ; G 2000 +U 8317 ; WX 298 ; N uni207D ; G 2001 +U 8318 ; WX 298 ; N uni207E ; G 2002 +U 8319 ; WX 519 ; N uni207F ; G 2003 +U 8320 ; WX 438 ; N uni2080 ; G 2004 +U 8321 ; WX 438 ; N uni2081 ; G 2005 +U 8322 ; WX 438 ; N uni2082 ; G 2006 +U 8323 ; WX 438 ; N uni2083 ; G 2007 +U 8324 ; WX 438 ; N uni2084 ; G 2008 +U 8325 ; WX 438 ; N uni2085 ; G 2009 +U 8326 ; WX 438 ; N uni2086 ; G 2010 +U 8327 ; WX 438 ; N uni2087 ; G 2011 +U 8328 ; WX 438 ; N uni2088 ; G 2012 +U 8329 ; WX 438 ; N uni2089 ; G 2013 +U 8330 ; WX 528 ; N uni208A ; G 2014 +U 8331 ; WX 528 ; N uni208B ; G 2015 +U 8332 ; WX 528 ; N uni208C ; G 2016 +U 8333 ; WX 298 ; N uni208D ; G 2017 +U 8334 ; WX 298 ; N uni208E ; G 2018 +U 8336 ; WX 466 ; N uni2090 ; G 2019 +U 8337 ; WX 444 ; N uni2091 ; G 2020 +U 8338 ; WX 467 ; N uni2092 ; G 2021 +U 8339 ; WX 475 ; N uni2093 ; G 2022 +U 8340 ; WX 444 ; N uni2094 ; G 2023 +U 8341 ; WX 521 ; N uni2095 ; G 2024 +U 8342 ; WX 523 ; N uni2096 ; G 2025 +U 8343 ; WX 292 ; N uni2097 ; G 2026 +U 8344 ; WX 729 ; N uni2098 ; G 2027 +U 8345 ; WX 519 ; N uni2099 ; G 2028 +U 8346 ; WX 499 ; N uni209A ; G 2029 +U 8347 ; WX 395 ; N uni209B ; G 2030 +U 8348 ; WX 371 ; N uni209C ; G 2031 +U 8358 ; WX 696 ; N uni20A6 ; G 2032 +U 8364 ; WX 696 ; N Euro ; G 2033 +U 8367 ; WX 1155 ; N uni20AF ; G 2034 +U 8369 ; WX 790 ; N uni20B1 ; G 2035 +U 8372 ; WX 876 ; N uni20B4 ; G 2036 +U 8373 ; WX 696 ; N uni20B5 ; G 2037 +U 8376 ; WX 696 ; N uni20B8 ; G 2038 +U 8377 ; WX 696 ; N uni20B9 ; G 2039 +U 8378 ; WX 696 ; N uni20BA ; G 2040 +U 8381 ; WX 696 ; N uni20BD ; G 2041 +U 8451 ; WX 1198 ; N uni2103 ; G 2042 +U 8457 ; WX 1112 ; N uni2109 ; G 2043 +U 8462 ; WX 727 ; N uni210E ; G 2044 +U 8463 ; WX 727 ; N uni210F ; G 2045 +U 8470 ; WX 1087 ; N uni2116 ; G 2046 +U 8482 ; WX 1000 ; N trademark ; G 2047 +U 8486 ; WX 890 ; N uni2126 ; G 2048 +U 8487 ; WX 890 ; N uni2127 ; G 2049 +U 8490 ; WX 869 ; N uni212A ; G 2050 +U 8491 ; WX 776 ; N uni212B ; G 2051 +U 8498 ; WX 710 ; N uni2132 ; G 2052 +U 8513 ; WX 775 ; N uni2141 ; G 2053 +U 8514 ; WX 557 ; N uni2142 ; G 2054 +U 8515 ; WX 637 ; N uni2143 ; G 2055 +U 8516 ; WX 760 ; N uni2144 ; G 2056 +U 8523 ; WX 903 ; N uni214B ; G 2057 +U 8526 ; WX 592 ; N uni214E ; G 2058 +U 8528 ; WX 1035 ; N uni2150 ; G 2059 +U 8529 ; WX 1035 ; N uni2151 ; G 2060 +U 8530 ; WX 1473 ; N uni2152 ; G 2061 +U 8531 ; WX 1035 ; N onethird ; G 2062 +U 8532 ; WX 1035 ; N twothirds ; G 2063 +U 8533 ; WX 1035 ; N uni2155 ; G 2064 +U 8534 ; WX 1035 ; N uni2156 ; G 2065 +U 8535 ; WX 1035 ; N uni2157 ; G 2066 +U 8536 ; WX 1035 ; N uni2158 ; G 2067 +U 8537 ; WX 1035 ; N uni2159 ; G 2068 +U 8538 ; WX 1035 ; N uni215A ; G 2069 +U 8539 ; WX 1035 ; N oneeighth ; G 2070 +U 8540 ; WX 1035 ; N threeeighths ; G 2071 +U 8541 ; WX 1035 ; N fiveeighths ; G 2072 +U 8542 ; WX 1035 ; N seveneighths ; G 2073 +U 8543 ; WX 615 ; N uni215F ; G 2074 +U 8544 ; WX 468 ; N uni2160 ; G 2075 +U 8545 ; WX 843 ; N uni2161 ; G 2076 +U 8546 ; WX 1218 ; N uni2162 ; G 2077 +U 8547 ; WX 1135 ; N uni2163 ; G 2078 +U 8548 ; WX 776 ; N uni2164 ; G 2079 +U 8549 ; WX 1150 ; N uni2165 ; G 2080 +U 8550 ; WX 1525 ; N uni2166 ; G 2081 +U 8551 ; WX 1900 ; N uni2167 ; G 2082 +U 8552 ; WX 1126 ; N uni2168 ; G 2083 +U 8553 ; WX 776 ; N uni2169 ; G 2084 +U 8554 ; WX 1127 ; N uni216A ; G 2085 +U 8555 ; WX 1502 ; N uni216B ; G 2086 +U 8556 ; WX 703 ; N uni216C ; G 2087 +U 8557 ; WX 796 ; N uni216D ; G 2088 +U 8558 ; WX 867 ; N uni216E ; G 2089 +U 8559 ; WX 1107 ; N uni216F ; G 2090 +U 8560 ; WX 380 ; N uni2170 ; G 2091 +U 8561 ; WX 760 ; N uni2171 ; G 2092 +U 8562 ; WX 1140 ; N uni2172 ; G 2093 +U 8563 ; WX 961 ; N uni2173 ; G 2094 +U 8564 ; WX 581 ; N uni2174 ; G 2095 +U 8565 ; WX 961 ; N uni2175 ; G 2096 +U 8566 ; WX 1341 ; N uni2176 ; G 2097 +U 8567 ; WX 1721 ; N uni2177 ; G 2098 +U 8568 ; WX 976 ; N uni2178 ; G 2099 +U 8569 ; WX 596 ; N uni2179 ; G 2100 +U 8570 ; WX 976 ; N uni217A ; G 2101 +U 8571 ; WX 1356 ; N uni217B ; G 2102 +U 8572 ; WX 380 ; N uni217C ; G 2103 +U 8573 ; WX 609 ; N uni217D ; G 2104 +U 8574 ; WX 699 ; N uni217E ; G 2105 +U 8575 ; WX 1058 ; N uni217F ; G 2106 +U 8576 ; WX 1255 ; N uni2180 ; G 2107 +U 8577 ; WX 867 ; N uni2181 ; G 2108 +U 8578 ; WX 1268 ; N uni2182 ; G 2109 +U 8579 ; WX 796 ; N uni2183 ; G 2110 +U 8580 ; WX 609 ; N uni2184 ; G 2111 +U 8581 ; WX 796 ; N uni2185 ; G 2112 +U 8585 ; WX 1035 ; N uni2189 ; G 2113 +U 8592 ; WX 838 ; N arrowleft ; G 2114 +U 8593 ; WX 838 ; N arrowup ; G 2115 +U 8594 ; WX 838 ; N arrowright ; G 2116 +U 8595 ; WX 838 ; N arrowdown ; G 2117 +U 8596 ; WX 838 ; N arrowboth ; G 2118 +U 8597 ; WX 838 ; N arrowupdn ; G 2119 +U 8598 ; WX 838 ; N uni2196 ; G 2120 +U 8599 ; WX 838 ; N uni2197 ; G 2121 +U 8600 ; WX 838 ; N uni2198 ; G 2122 +U 8601 ; WX 838 ; N uni2199 ; G 2123 +U 8602 ; WX 838 ; N uni219A ; G 2124 +U 8603 ; WX 838 ; N uni219B ; G 2125 +U 8604 ; WX 838 ; N uni219C ; G 2126 +U 8605 ; WX 838 ; N uni219D ; G 2127 +U 8606 ; WX 838 ; N uni219E ; G 2128 +U 8607 ; WX 838 ; N uni219F ; G 2129 +U 8608 ; WX 838 ; N uni21A0 ; G 2130 +U 8609 ; WX 838 ; N uni21A1 ; G 2131 +U 8610 ; WX 838 ; N uni21A2 ; G 2132 +U 8611 ; WX 838 ; N uni21A3 ; G 2133 +U 8612 ; WX 838 ; N uni21A4 ; G 2134 +U 8613 ; WX 838 ; N uni21A5 ; G 2135 +U 8614 ; WX 838 ; N uni21A6 ; G 2136 +U 8615 ; WX 838 ; N uni21A7 ; G 2137 +U 8616 ; WX 838 ; N arrowupdnbse ; G 2138 +U 8617 ; WX 838 ; N uni21A9 ; G 2139 +U 8618 ; WX 838 ; N uni21AA ; G 2140 +U 8619 ; WX 838 ; N uni21AB ; G 2141 +U 8620 ; WX 838 ; N uni21AC ; G 2142 +U 8621 ; WX 838 ; N uni21AD ; G 2143 +U 8622 ; WX 838 ; N uni21AE ; G 2144 +U 8623 ; WX 850 ; N uni21AF ; G 2145 +U 8624 ; WX 838 ; N uni21B0 ; G 2146 +U 8625 ; WX 838 ; N uni21B1 ; G 2147 +U 8626 ; WX 838 ; N uni21B2 ; G 2148 +U 8627 ; WX 838 ; N uni21B3 ; G 2149 +U 8628 ; WX 838 ; N uni21B4 ; G 2150 +U 8629 ; WX 838 ; N carriagereturn ; G 2151 +U 8630 ; WX 838 ; N uni21B6 ; G 2152 +U 8631 ; WX 838 ; N uni21B7 ; G 2153 +U 8632 ; WX 838 ; N uni21B8 ; G 2154 +U 8633 ; WX 838 ; N uni21B9 ; G 2155 +U 8634 ; WX 838 ; N uni21BA ; G 2156 +U 8635 ; WX 838 ; N uni21BB ; G 2157 +U 8636 ; WX 838 ; N uni21BC ; G 2158 +U 8637 ; WX 838 ; N uni21BD ; G 2159 +U 8638 ; WX 838 ; N uni21BE ; G 2160 +U 8639 ; WX 838 ; N uni21BF ; G 2161 +U 8640 ; WX 838 ; N uni21C0 ; G 2162 +U 8641 ; WX 838 ; N uni21C1 ; G 2163 +U 8642 ; WX 838 ; N uni21C2 ; G 2164 +U 8643 ; WX 838 ; N uni21C3 ; G 2165 +U 8644 ; WX 838 ; N uni21C4 ; G 2166 +U 8645 ; WX 838 ; N uni21C5 ; G 2167 +U 8646 ; WX 838 ; N uni21C6 ; G 2168 +U 8647 ; WX 838 ; N uni21C7 ; G 2169 +U 8648 ; WX 838 ; N uni21C8 ; G 2170 +U 8649 ; WX 838 ; N uni21C9 ; G 2171 +U 8650 ; WX 838 ; N uni21CA ; G 2172 +U 8651 ; WX 838 ; N uni21CB ; G 2173 +U 8652 ; WX 838 ; N uni21CC ; G 2174 +U 8653 ; WX 838 ; N uni21CD ; G 2175 +U 8654 ; WX 838 ; N uni21CE ; G 2176 +U 8655 ; WX 838 ; N uni21CF ; G 2177 +U 8656 ; WX 838 ; N arrowdblleft ; G 2178 +U 8657 ; WX 838 ; N arrowdblup ; G 2179 +U 8658 ; WX 838 ; N arrowdblright ; G 2180 +U 8659 ; WX 838 ; N arrowdbldown ; G 2181 +U 8660 ; WX 838 ; N arrowdblboth ; G 2182 +U 8661 ; WX 838 ; N uni21D5 ; G 2183 +U 8662 ; WX 838 ; N uni21D6 ; G 2184 +U 8663 ; WX 838 ; N uni21D7 ; G 2185 +U 8664 ; WX 838 ; N uni21D8 ; G 2186 +U 8665 ; WX 838 ; N uni21D9 ; G 2187 +U 8666 ; WX 838 ; N uni21DA ; G 2188 +U 8667 ; WX 838 ; N uni21DB ; G 2189 +U 8668 ; WX 838 ; N uni21DC ; G 2190 +U 8669 ; WX 838 ; N uni21DD ; G 2191 +U 8670 ; WX 838 ; N uni21DE ; G 2192 +U 8671 ; WX 838 ; N uni21DF ; G 2193 +U 8672 ; WX 838 ; N uni21E0 ; G 2194 +U 8673 ; WX 838 ; N uni21E1 ; G 2195 +U 8674 ; WX 838 ; N uni21E2 ; G 2196 +U 8675 ; WX 838 ; N uni21E3 ; G 2197 +U 8676 ; WX 838 ; N uni21E4 ; G 2198 +U 8677 ; WX 838 ; N uni21E5 ; G 2199 +U 8678 ; WX 838 ; N uni21E6 ; G 2200 +U 8679 ; WX 838 ; N uni21E7 ; G 2201 +U 8680 ; WX 838 ; N uni21E8 ; G 2202 +U 8681 ; WX 838 ; N uni21E9 ; G 2203 +U 8682 ; WX 838 ; N uni21EA ; G 2204 +U 8683 ; WX 838 ; N uni21EB ; G 2205 +U 8684 ; WX 838 ; N uni21EC ; G 2206 +U 8685 ; WX 838 ; N uni21ED ; G 2207 +U 8686 ; WX 838 ; N uni21EE ; G 2208 +U 8687 ; WX 838 ; N uni21EF ; G 2209 +U 8688 ; WX 838 ; N uni21F0 ; G 2210 +U 8689 ; WX 838 ; N uni21F1 ; G 2211 +U 8690 ; WX 838 ; N uni21F2 ; G 2212 +U 8691 ; WX 838 ; N uni21F3 ; G 2213 +U 8692 ; WX 838 ; N uni21F4 ; G 2214 +U 8693 ; WX 838 ; N uni21F5 ; G 2215 +U 8694 ; WX 838 ; N uni21F6 ; G 2216 +U 8695 ; WX 838 ; N uni21F7 ; G 2217 +U 8696 ; WX 838 ; N uni21F8 ; G 2218 +U 8697 ; WX 838 ; N uni21F9 ; G 2219 +U 8698 ; WX 838 ; N uni21FA ; G 2220 +U 8699 ; WX 838 ; N uni21FB ; G 2221 +U 8700 ; WX 838 ; N uni21FC ; G 2222 +U 8701 ; WX 838 ; N uni21FD ; G 2223 +U 8702 ; WX 838 ; N uni21FE ; G 2224 +U 8703 ; WX 838 ; N uni21FF ; G 2225 +U 8704 ; WX 641 ; N universal ; G 2226 +U 8706 ; WX 534 ; N partialdiff ; G 2227 +U 8707 ; WX 620 ; N existential ; G 2228 +U 8708 ; WX 620 ; N uni2204 ; G 2229 +U 8710 ; WX 753 ; N increment ; G 2230 +U 8711 ; WX 753 ; N gradient ; G 2231 +U 8712 ; WX 740 ; N element ; G 2232 +U 8713 ; WX 740 ; N notelement ; G 2233 +U 8715 ; WX 740 ; N suchthat ; G 2234 +U 8716 ; WX 740 ; N uni220C ; G 2235 +U 8719 ; WX 842 ; N product ; G 2236 +U 8720 ; WX 842 ; N uni2210 ; G 2237 +U 8721 ; WX 753 ; N summation ; G 2238 +U 8722 ; WX 838 ; N minus ; G 2239 +U 8723 ; WX 838 ; N uni2213 ; G 2240 +U 8724 ; WX 838 ; N uni2214 ; G 2241 +U 8725 ; WX 365 ; N uni2215 ; G 2242 +U 8727 ; WX 691 ; N asteriskmath ; G 2243 +U 8728 ; WX 519 ; N uni2218 ; G 2244 +U 8729 ; WX 519 ; N uni2219 ; G 2245 +U 8730 ; WX 657 ; N radical ; G 2246 +U 8731 ; WX 657 ; N uni221B ; G 2247 +U 8732 ; WX 657 ; N uni221C ; G 2248 +U 8733 ; WX 672 ; N proportional ; G 2249 +U 8734 ; WX 833 ; N infinity ; G 2250 +U 8735 ; WX 838 ; N orthogonal ; G 2251 +U 8736 ; WX 838 ; N angle ; G 2252 +U 8739 ; WX 324 ; N uni2223 ; G 2253 +U 8740 ; WX 607 ; N uni2224 ; G 2254 +U 8741 ; WX 529 ; N uni2225 ; G 2255 +U 8742 ; WX 773 ; N uni2226 ; G 2256 +U 8743 ; WX 812 ; N logicaland ; G 2257 +U 8744 ; WX 812 ; N logicalor ; G 2258 +U 8745 ; WX 838 ; N intersection ; G 2259 +U 8746 ; WX 838 ; N union ; G 2260 +U 8747 ; WX 579 ; N integral ; G 2261 +U 8748 ; WX 1000 ; N uni222C ; G 2262 +U 8749 ; WX 1391 ; N uni222D ; G 2263 +U 8760 ; WX 838 ; N uni2238 ; G 2264 +U 8761 ; WX 838 ; N uni2239 ; G 2265 +U 8762 ; WX 838 ; N uni223A ; G 2266 +U 8763 ; WX 838 ; N uni223B ; G 2267 +U 8764 ; WX 838 ; N similar ; G 2268 +U 8765 ; WX 838 ; N uni223D ; G 2269 +U 8770 ; WX 838 ; N uni2242 ; G 2270 +U 8771 ; WX 838 ; N uni2243 ; G 2271 +U 8776 ; WX 838 ; N approxequal ; G 2272 +U 8784 ; WX 838 ; N uni2250 ; G 2273 +U 8785 ; WX 838 ; N uni2251 ; G 2274 +U 8786 ; WX 838 ; N uni2252 ; G 2275 +U 8787 ; WX 838 ; N uni2253 ; G 2276 +U 8788 ; WX 1082 ; N uni2254 ; G 2277 +U 8789 ; WX 1082 ; N uni2255 ; G 2278 +U 8800 ; WX 838 ; N notequal ; G 2279 +U 8801 ; WX 838 ; N equivalence ; G 2280 +U 8804 ; WX 838 ; N lessequal ; G 2281 +U 8805 ; WX 838 ; N greaterequal ; G 2282 +U 8834 ; WX 838 ; N propersubset ; G 2283 +U 8835 ; WX 838 ; N propersuperset ; G 2284 +U 8836 ; WX 838 ; N notsubset ; G 2285 +U 8837 ; WX 838 ; N uni2285 ; G 2286 +U 8838 ; WX 838 ; N reflexsubset ; G 2287 +U 8839 ; WX 838 ; N reflexsuperset ; G 2288 +U 8844 ; WX 838 ; N uni228C ; G 2289 +U 8845 ; WX 838 ; N uni228D ; G 2290 +U 8846 ; WX 838 ; N uni228E ; G 2291 +U 8847 ; WX 838 ; N uni228F ; G 2292 +U 8848 ; WX 838 ; N uni2290 ; G 2293 +U 8849 ; WX 838 ; N uni2291 ; G 2294 +U 8850 ; WX 838 ; N uni2292 ; G 2295 +U 8851 ; WX 838 ; N uni2293 ; G 2296 +U 8852 ; WX 838 ; N uni2294 ; G 2297 +U 8853 ; WX 838 ; N circleplus ; G 2298 +U 8854 ; WX 838 ; N uni2296 ; G 2299 +U 8855 ; WX 838 ; N circlemultiply ; G 2300 +U 8856 ; WX 838 ; N uni2298 ; G 2301 +U 8857 ; WX 838 ; N uni2299 ; G 2302 +U 8858 ; WX 838 ; N uni229A ; G 2303 +U 8859 ; WX 838 ; N uni229B ; G 2304 +U 8860 ; WX 838 ; N uni229C ; G 2305 +U 8861 ; WX 838 ; N uni229D ; G 2306 +U 8862 ; WX 838 ; N uni229E ; G 2307 +U 8863 ; WX 838 ; N uni229F ; G 2308 +U 8864 ; WX 838 ; N uni22A0 ; G 2309 +U 8865 ; WX 838 ; N uni22A1 ; G 2310 +U 8866 ; WX 884 ; N uni22A2 ; G 2311 +U 8867 ; WX 884 ; N uni22A3 ; G 2312 +U 8868 ; WX 960 ; N uni22A4 ; G 2313 +U 8869 ; WX 960 ; N perpendicular ; G 2314 +U 8870 ; WX 616 ; N uni22A6 ; G 2315 +U 8871 ; WX 616 ; N uni22A7 ; G 2316 +U 8872 ; WX 884 ; N uni22A8 ; G 2317 +U 8873 ; WX 884 ; N uni22A9 ; G 2318 +U 8874 ; WX 884 ; N uni22AA ; G 2319 +U 8875 ; WX 1080 ; N uni22AB ; G 2320 +U 8876 ; WX 884 ; N uni22AC ; G 2321 +U 8877 ; WX 884 ; N uni22AD ; G 2322 +U 8878 ; WX 884 ; N uni22AE ; G 2323 +U 8879 ; WX 1080 ; N uni22AF ; G 2324 +U 8900 ; WX 626 ; N uni22C4 ; G 2325 +U 8901 ; WX 398 ; N dotmath ; G 2326 +U 8962 ; WX 834 ; N house ; G 2327 +U 8968 ; WX 473 ; N uni2308 ; G 2328 +U 8969 ; WX 473 ; N uni2309 ; G 2329 +U 8970 ; WX 473 ; N uni230A ; G 2330 +U 8971 ; WX 473 ; N uni230B ; G 2331 +U 8976 ; WX 838 ; N revlogicalnot ; G 2332 +U 8977 ; WX 539 ; N uni2311 ; G 2333 +U 8984 ; WX 928 ; N uni2318 ; G 2334 +U 8985 ; WX 838 ; N uni2319 ; G 2335 +U 8992 ; WX 579 ; N integraltp ; G 2336 +U 8993 ; WX 579 ; N integralbt ; G 2337 +U 8997 ; WX 1000 ; N uni2325 ; G 2338 +U 9000 ; WX 1443 ; N uni2328 ; G 2339 +U 9085 ; WX 1008 ; N uni237D ; G 2340 +U 9115 ; WX 500 ; N uni239B ; G 2341 +U 9116 ; WX 500 ; N uni239C ; G 2342 +U 9117 ; WX 500 ; N uni239D ; G 2343 +U 9118 ; WX 500 ; N uni239E ; G 2344 +U 9119 ; WX 500 ; N uni239F ; G 2345 +U 9120 ; WX 500 ; N uni23A0 ; G 2346 +U 9121 ; WX 500 ; N uni23A1 ; G 2347 +U 9122 ; WX 500 ; N uni23A2 ; G 2348 +U 9123 ; WX 500 ; N uni23A3 ; G 2349 +U 9124 ; WX 500 ; N uni23A4 ; G 2350 +U 9125 ; WX 500 ; N uni23A5 ; G 2351 +U 9126 ; WX 500 ; N uni23A6 ; G 2352 +U 9127 ; WX 750 ; N uni23A7 ; G 2353 +U 9128 ; WX 750 ; N uni23A8 ; G 2354 +U 9129 ; WX 750 ; N uni23A9 ; G 2355 +U 9130 ; WX 750 ; N uni23AA ; G 2356 +U 9131 ; WX 750 ; N uni23AB ; G 2357 +U 9132 ; WX 750 ; N uni23AC ; G 2358 +U 9133 ; WX 750 ; N uni23AD ; G 2359 +U 9134 ; WX 579 ; N uni23AE ; G 2360 +U 9167 ; WX 945 ; N uni23CF ; G 2361 +U 9251 ; WX 834 ; N uni2423 ; G 2362 +U 9472 ; WX 602 ; N SF100000 ; G 2363 +U 9473 ; WX 602 ; N uni2501 ; G 2364 +U 9474 ; WX 602 ; N SF110000 ; G 2365 +U 9475 ; WX 602 ; N uni2503 ; G 2366 +U 9476 ; WX 602 ; N uni2504 ; G 2367 +U 9477 ; WX 602 ; N uni2505 ; G 2368 +U 9478 ; WX 602 ; N uni2506 ; G 2369 +U 9479 ; WX 602 ; N uni2507 ; G 2370 +U 9480 ; WX 602 ; N uni2508 ; G 2371 +U 9481 ; WX 602 ; N uni2509 ; G 2372 +U 9482 ; WX 602 ; N uni250A ; G 2373 +U 9483 ; WX 602 ; N uni250B ; G 2374 +U 9484 ; WX 602 ; N SF010000 ; G 2375 +U 9485 ; WX 602 ; N uni250D ; G 2376 +U 9486 ; WX 602 ; N uni250E ; G 2377 +U 9487 ; WX 602 ; N uni250F ; G 2378 +U 9488 ; WX 602 ; N SF030000 ; G 2379 +U 9489 ; WX 602 ; N uni2511 ; G 2380 +U 9490 ; WX 602 ; N uni2512 ; G 2381 +U 9491 ; WX 602 ; N uni2513 ; G 2382 +U 9492 ; WX 602 ; N SF020000 ; G 2383 +U 9493 ; WX 602 ; N uni2515 ; G 2384 +U 9494 ; WX 602 ; N uni2516 ; G 2385 +U 9495 ; WX 602 ; N uni2517 ; G 2386 +U 9496 ; WX 602 ; N SF040000 ; G 2387 +U 9497 ; WX 602 ; N uni2519 ; G 2388 +U 9498 ; WX 602 ; N uni251A ; G 2389 +U 9499 ; WX 602 ; N uni251B ; G 2390 +U 9500 ; WX 602 ; N SF080000 ; G 2391 +U 9501 ; WX 602 ; N uni251D ; G 2392 +U 9502 ; WX 602 ; N uni251E ; G 2393 +U 9503 ; WX 602 ; N uni251F ; G 2394 +U 9504 ; WX 602 ; N uni2520 ; G 2395 +U 9505 ; WX 602 ; N uni2521 ; G 2396 +U 9506 ; WX 602 ; N uni2522 ; G 2397 +U 9507 ; WX 602 ; N uni2523 ; G 2398 +U 9508 ; WX 602 ; N SF090000 ; G 2399 +U 9509 ; WX 602 ; N uni2525 ; G 2400 +U 9510 ; WX 602 ; N uni2526 ; G 2401 +U 9511 ; WX 602 ; N uni2527 ; G 2402 +U 9512 ; WX 602 ; N uni2528 ; G 2403 +U 9513 ; WX 602 ; N uni2529 ; G 2404 +U 9514 ; WX 602 ; N uni252A ; G 2405 +U 9515 ; WX 602 ; N uni252B ; G 2406 +U 9516 ; WX 602 ; N SF060000 ; G 2407 +U 9517 ; WX 602 ; N uni252D ; G 2408 +U 9518 ; WX 602 ; N uni252E ; G 2409 +U 9519 ; WX 602 ; N uni252F ; G 2410 +U 9520 ; WX 602 ; N uni2530 ; G 2411 +U 9521 ; WX 602 ; N uni2531 ; G 2412 +U 9522 ; WX 602 ; N uni2532 ; G 2413 +U 9523 ; WX 602 ; N uni2533 ; G 2414 +U 9524 ; WX 602 ; N SF070000 ; G 2415 +U 9525 ; WX 602 ; N uni2535 ; G 2416 +U 9526 ; WX 602 ; N uni2536 ; G 2417 +U 9527 ; WX 602 ; N uni2537 ; G 2418 +U 9528 ; WX 602 ; N uni2538 ; G 2419 +U 9529 ; WX 602 ; N uni2539 ; G 2420 +U 9530 ; WX 602 ; N uni253A ; G 2421 +U 9531 ; WX 602 ; N uni253B ; G 2422 +U 9532 ; WX 602 ; N SF050000 ; G 2423 +U 9533 ; WX 602 ; N uni253D ; G 2424 +U 9534 ; WX 602 ; N uni253E ; G 2425 +U 9535 ; WX 602 ; N uni253F ; G 2426 +U 9536 ; WX 602 ; N uni2540 ; G 2427 +U 9537 ; WX 602 ; N uni2541 ; G 2428 +U 9538 ; WX 602 ; N uni2542 ; G 2429 +U 9539 ; WX 602 ; N uni2543 ; G 2430 +U 9540 ; WX 602 ; N uni2544 ; G 2431 +U 9541 ; WX 602 ; N uni2545 ; G 2432 +U 9542 ; WX 602 ; N uni2546 ; G 2433 +U 9543 ; WX 602 ; N uni2547 ; G 2434 +U 9544 ; WX 602 ; N uni2548 ; G 2435 +U 9545 ; WX 602 ; N uni2549 ; G 2436 +U 9546 ; WX 602 ; N uni254A ; G 2437 +U 9547 ; WX 602 ; N uni254B ; G 2438 +U 9548 ; WX 602 ; N uni254C ; G 2439 +U 9549 ; WX 602 ; N uni254D ; G 2440 +U 9550 ; WX 602 ; N uni254E ; G 2441 +U 9551 ; WX 602 ; N uni254F ; G 2442 +U 9552 ; WX 602 ; N SF430000 ; G 2443 +U 9553 ; WX 602 ; N SF240000 ; G 2444 +U 9554 ; WX 602 ; N SF510000 ; G 2445 +U 9555 ; WX 602 ; N SF520000 ; G 2446 +U 9556 ; WX 602 ; N SF390000 ; G 2447 +U 9557 ; WX 602 ; N SF220000 ; G 2448 +U 9558 ; WX 602 ; N SF210000 ; G 2449 +U 9559 ; WX 602 ; N SF250000 ; G 2450 +U 9560 ; WX 602 ; N SF500000 ; G 2451 +U 9561 ; WX 602 ; N SF490000 ; G 2452 +U 9562 ; WX 602 ; N SF380000 ; G 2453 +U 9563 ; WX 602 ; N SF280000 ; G 2454 +U 9564 ; WX 602 ; N SF270000 ; G 2455 +U 9565 ; WX 602 ; N SF260000 ; G 2456 +U 9566 ; WX 602 ; N SF360000 ; G 2457 +U 9567 ; WX 602 ; N SF370000 ; G 2458 +U 9568 ; WX 602 ; N SF420000 ; G 2459 +U 9569 ; WX 602 ; N SF190000 ; G 2460 +U 9570 ; WX 602 ; N SF200000 ; G 2461 +U 9571 ; WX 602 ; N SF230000 ; G 2462 +U 9572 ; WX 602 ; N SF470000 ; G 2463 +U 9573 ; WX 602 ; N SF480000 ; G 2464 +U 9574 ; WX 602 ; N SF410000 ; G 2465 +U 9575 ; WX 602 ; N SF450000 ; G 2466 +U 9576 ; WX 602 ; N SF460000 ; G 2467 +U 9577 ; WX 602 ; N SF400000 ; G 2468 +U 9578 ; WX 602 ; N SF540000 ; G 2469 +U 9579 ; WX 602 ; N SF530000 ; G 2470 +U 9580 ; WX 602 ; N SF440000 ; G 2471 +U 9581 ; WX 602 ; N uni256D ; G 2472 +U 9582 ; WX 602 ; N uni256E ; G 2473 +U 9583 ; WX 602 ; N uni256F ; G 2474 +U 9584 ; WX 602 ; N uni2570 ; G 2475 +U 9585 ; WX 602 ; N uni2571 ; G 2476 +U 9586 ; WX 602 ; N uni2572 ; G 2477 +U 9587 ; WX 602 ; N uni2573 ; G 2478 +U 9588 ; WX 602 ; N uni2574 ; G 2479 +U 9589 ; WX 602 ; N uni2575 ; G 2480 +U 9590 ; WX 602 ; N uni2576 ; G 2481 +U 9591 ; WX 602 ; N uni2577 ; G 2482 +U 9592 ; WX 602 ; N uni2578 ; G 2483 +U 9593 ; WX 602 ; N uni2579 ; G 2484 +U 9594 ; WX 602 ; N uni257A ; G 2485 +U 9595 ; WX 602 ; N uni257B ; G 2486 +U 9596 ; WX 602 ; N uni257C ; G 2487 +U 9597 ; WX 602 ; N uni257D ; G 2488 +U 9598 ; WX 602 ; N uni257E ; G 2489 +U 9599 ; WX 602 ; N uni257F ; G 2490 +U 9600 ; WX 769 ; N upblock ; G 2491 +U 9601 ; WX 769 ; N uni2581 ; G 2492 +U 9602 ; WX 769 ; N uni2582 ; G 2493 +U 9603 ; WX 769 ; N uni2583 ; G 2494 +U 9604 ; WX 769 ; N dnblock ; G 2495 +U 9605 ; WX 769 ; N uni2585 ; G 2496 +U 9606 ; WX 769 ; N uni2586 ; G 2497 +U 9607 ; WX 769 ; N uni2587 ; G 2498 +U 9608 ; WX 769 ; N block ; G 2499 +U 9609 ; WX 769 ; N uni2589 ; G 2500 +U 9610 ; WX 769 ; N uni258A ; G 2501 +U 9611 ; WX 769 ; N uni258B ; G 2502 +U 9612 ; WX 769 ; N lfblock ; G 2503 +U 9613 ; WX 769 ; N uni258D ; G 2504 +U 9614 ; WX 769 ; N uni258E ; G 2505 +U 9615 ; WX 769 ; N uni258F ; G 2506 +U 9616 ; WX 769 ; N rtblock ; G 2507 +U 9617 ; WX 769 ; N ltshade ; G 2508 +U 9618 ; WX 769 ; N shade ; G 2509 +U 9619 ; WX 769 ; N dkshade ; G 2510 +U 9620 ; WX 769 ; N uni2594 ; G 2511 +U 9621 ; WX 769 ; N uni2595 ; G 2512 +U 9622 ; WX 769 ; N uni2596 ; G 2513 +U 9623 ; WX 769 ; N uni2597 ; G 2514 +U 9624 ; WX 769 ; N uni2598 ; G 2515 +U 9625 ; WX 769 ; N uni2599 ; G 2516 +U 9626 ; WX 769 ; N uni259A ; G 2517 +U 9627 ; WX 769 ; N uni259B ; G 2518 +U 9628 ; WX 769 ; N uni259C ; G 2519 +U 9629 ; WX 769 ; N uni259D ; G 2520 +U 9630 ; WX 769 ; N uni259E ; G 2521 +U 9631 ; WX 769 ; N uni259F ; G 2522 +U 9632 ; WX 945 ; N filledbox ; G 2523 +U 9633 ; WX 945 ; N H22073 ; G 2524 +U 9634 ; WX 945 ; N uni25A2 ; G 2525 +U 9635 ; WX 945 ; N uni25A3 ; G 2526 +U 9636 ; WX 945 ; N uni25A4 ; G 2527 +U 9637 ; WX 945 ; N uni25A5 ; G 2528 +U 9638 ; WX 945 ; N uni25A6 ; G 2529 +U 9639 ; WX 945 ; N uni25A7 ; G 2530 +U 9640 ; WX 945 ; N uni25A8 ; G 2531 +U 9641 ; WX 945 ; N uni25A9 ; G 2532 +U 9642 ; WX 678 ; N H18543 ; G 2533 +U 9643 ; WX 678 ; N H18551 ; G 2534 +U 9644 ; WX 945 ; N filledrect ; G 2535 +U 9645 ; WX 945 ; N uni25AD ; G 2536 +U 9646 ; WX 550 ; N uni25AE ; G 2537 +U 9647 ; WX 550 ; N uni25AF ; G 2538 +U 9648 ; WX 769 ; N uni25B0 ; G 2539 +U 9649 ; WX 769 ; N uni25B1 ; G 2540 +U 9650 ; WX 769 ; N triagup ; G 2541 +U 9651 ; WX 769 ; N uni25B3 ; G 2542 +U 9652 ; WX 502 ; N uni25B4 ; G 2543 +U 9653 ; WX 502 ; N uni25B5 ; G 2544 +U 9654 ; WX 769 ; N uni25B6 ; G 2545 +U 9655 ; WX 769 ; N uni25B7 ; G 2546 +U 9656 ; WX 502 ; N uni25B8 ; G 2547 +U 9657 ; WX 502 ; N uni25B9 ; G 2548 +U 9658 ; WX 769 ; N triagrt ; G 2549 +U 9659 ; WX 769 ; N uni25BB ; G 2550 +U 9660 ; WX 769 ; N triagdn ; G 2551 +U 9661 ; WX 769 ; N uni25BD ; G 2552 +U 9662 ; WX 502 ; N uni25BE ; G 2553 +U 9663 ; WX 502 ; N uni25BF ; G 2554 +U 9664 ; WX 769 ; N uni25C0 ; G 2555 +U 9665 ; WX 769 ; N uni25C1 ; G 2556 +U 9666 ; WX 502 ; N uni25C2 ; G 2557 +U 9667 ; WX 502 ; N uni25C3 ; G 2558 +U 9668 ; WX 769 ; N triaglf ; G 2559 +U 9669 ; WX 769 ; N uni25C5 ; G 2560 +U 9670 ; WX 769 ; N uni25C6 ; G 2561 +U 9671 ; WX 769 ; N uni25C7 ; G 2562 +U 9672 ; WX 769 ; N uni25C8 ; G 2563 +U 9673 ; WX 873 ; N uni25C9 ; G 2564 +U 9674 ; WX 494 ; N lozenge ; G 2565 +U 9675 ; WX 873 ; N circle ; G 2566 +U 9676 ; WX 873 ; N uni25CC ; G 2567 +U 9677 ; WX 873 ; N uni25CD ; G 2568 +U 9678 ; WX 873 ; N uni25CE ; G 2569 +U 9679 ; WX 873 ; N H18533 ; G 2570 +U 9680 ; WX 873 ; N uni25D0 ; G 2571 +U 9681 ; WX 873 ; N uni25D1 ; G 2572 +U 9682 ; WX 873 ; N uni25D2 ; G 2573 +U 9683 ; WX 873 ; N uni25D3 ; G 2574 +U 9684 ; WX 873 ; N uni25D4 ; G 2575 +U 9685 ; WX 873 ; N uni25D5 ; G 2576 +U 9686 ; WX 527 ; N uni25D6 ; G 2577 +U 9687 ; WX 527 ; N uni25D7 ; G 2578 +U 9688 ; WX 791 ; N invbullet ; G 2579 +U 9689 ; WX 970 ; N invcircle ; G 2580 +U 9690 ; WX 970 ; N uni25DA ; G 2581 +U 9691 ; WX 970 ; N uni25DB ; G 2582 +U 9692 ; WX 387 ; N uni25DC ; G 2583 +U 9693 ; WX 387 ; N uni25DD ; G 2584 +U 9694 ; WX 387 ; N uni25DE ; G 2585 +U 9695 ; WX 387 ; N uni25DF ; G 2586 +U 9696 ; WX 873 ; N uni25E0 ; G 2587 +U 9697 ; WX 873 ; N uni25E1 ; G 2588 +U 9698 ; WX 769 ; N uni25E2 ; G 2589 +U 9699 ; WX 769 ; N uni25E3 ; G 2590 +U 9700 ; WX 769 ; N uni25E4 ; G 2591 +U 9701 ; WX 769 ; N uni25E5 ; G 2592 +U 9702 ; WX 590 ; N openbullet ; G 2593 +U 9703 ; WX 945 ; N uni25E7 ; G 2594 +U 9704 ; WX 945 ; N uni25E8 ; G 2595 +U 9705 ; WX 945 ; N uni25E9 ; G 2596 +U 9706 ; WX 945 ; N uni25EA ; G 2597 +U 9707 ; WX 945 ; N uni25EB ; G 2598 +U 9708 ; WX 769 ; N uni25EC ; G 2599 +U 9709 ; WX 769 ; N uni25ED ; G 2600 +U 9710 ; WX 769 ; N uni25EE ; G 2601 +U 9711 ; WX 1119 ; N uni25EF ; G 2602 +U 9712 ; WX 945 ; N uni25F0 ; G 2603 +U 9713 ; WX 945 ; N uni25F1 ; G 2604 +U 9714 ; WX 945 ; N uni25F2 ; G 2605 +U 9715 ; WX 945 ; N uni25F3 ; G 2606 +U 9716 ; WX 873 ; N uni25F4 ; G 2607 +U 9717 ; WX 873 ; N uni25F5 ; G 2608 +U 9718 ; WX 873 ; N uni25F6 ; G 2609 +U 9719 ; WX 873 ; N uni25F7 ; G 2610 +U 9720 ; WX 769 ; N uni25F8 ; G 2611 +U 9721 ; WX 769 ; N uni25F9 ; G 2612 +U 9722 ; WX 769 ; N uni25FA ; G 2613 +U 9723 ; WX 830 ; N uni25FB ; G 2614 +U 9724 ; WX 830 ; N uni25FC ; G 2615 +U 9725 ; WX 732 ; N uni25FD ; G 2616 +U 9726 ; WX 732 ; N uni25FE ; G 2617 +U 9727 ; WX 769 ; N uni25FF ; G 2618 +U 9728 ; WX 896 ; N uni2600 ; G 2619 +U 9784 ; WX 896 ; N uni2638 ; G 2620 +U 9785 ; WX 896 ; N uni2639 ; G 2621 +U 9786 ; WX 896 ; N smileface ; G 2622 +U 9787 ; WX 896 ; N invsmileface ; G 2623 +U 9788 ; WX 896 ; N sun ; G 2624 +U 9791 ; WX 614 ; N uni263F ; G 2625 +U 9792 ; WX 731 ; N female ; G 2626 +U 9793 ; WX 731 ; N uni2641 ; G 2627 +U 9794 ; WX 896 ; N male ; G 2628 +U 9795 ; WX 896 ; N uni2643 ; G 2629 +U 9796 ; WX 896 ; N uni2644 ; G 2630 +U 9797 ; WX 896 ; N uni2645 ; G 2631 +U 9798 ; WX 896 ; N uni2646 ; G 2632 +U 9799 ; WX 896 ; N uni2647 ; G 2633 +U 9824 ; WX 896 ; N spade ; G 2634 +U 9825 ; WX 896 ; N uni2661 ; G 2635 +U 9826 ; WX 896 ; N uni2662 ; G 2636 +U 9827 ; WX 896 ; N club ; G 2637 +U 9828 ; WX 896 ; N uni2664 ; G 2638 +U 9829 ; WX 896 ; N heart ; G 2639 +U 9830 ; WX 896 ; N diamond ; G 2640 +U 9831 ; WX 896 ; N uni2667 ; G 2641 +U 9833 ; WX 472 ; N uni2669 ; G 2642 +U 9834 ; WX 638 ; N musicalnote ; G 2643 +U 9835 ; WX 896 ; N musicalnotedbl ; G 2644 +U 9836 ; WX 896 ; N uni266C ; G 2645 +U 9837 ; WX 472 ; N uni266D ; G 2646 +U 9838 ; WX 357 ; N uni266E ; G 2647 +U 9839 ; WX 484 ; N uni266F ; G 2648 +U 10145 ; WX 838 ; N uni27A1 ; G 2649 +U 10181 ; WX 457 ; N uni27C5 ; G 2650 +U 10182 ; WX 457 ; N uni27C6 ; G 2651 +U 10208 ; WX 494 ; N uni27E0 ; G 2652 +U 10216 ; WX 457 ; N uni27E8 ; G 2653 +U 10217 ; WX 457 ; N uni27E9 ; G 2654 +U 10224 ; WX 838 ; N uni27F0 ; G 2655 +U 10225 ; WX 838 ; N uni27F1 ; G 2656 +U 10226 ; WX 838 ; N uni27F2 ; G 2657 +U 10227 ; WX 838 ; N uni27F3 ; G 2658 +U 10228 ; WX 1033 ; N uni27F4 ; G 2659 +U 10229 ; WX 1434 ; N uni27F5 ; G 2660 +U 10230 ; WX 1434 ; N uni27F6 ; G 2661 +U 10231 ; WX 1434 ; N uni27F7 ; G 2662 +U 10232 ; WX 1434 ; N uni27F8 ; G 2663 +U 10233 ; WX 1434 ; N uni27F9 ; G 2664 +U 10234 ; WX 1434 ; N uni27FA ; G 2665 +U 10235 ; WX 1434 ; N uni27FB ; G 2666 +U 10236 ; WX 1434 ; N uni27FC ; G 2667 +U 10237 ; WX 1434 ; N uni27FD ; G 2668 +U 10238 ; WX 1434 ; N uni27FE ; G 2669 +U 10239 ; WX 1434 ; N uni27FF ; G 2670 +U 10240 ; WX 781 ; N uni2800 ; G 2671 +U 10241 ; WX 781 ; N uni2801 ; G 2672 +U 10242 ; WX 781 ; N uni2802 ; G 2673 +U 10243 ; WX 781 ; N uni2803 ; G 2674 +U 10244 ; WX 781 ; N uni2804 ; G 2675 +U 10245 ; WX 781 ; N uni2805 ; G 2676 +U 10246 ; WX 781 ; N uni2806 ; G 2677 +U 10247 ; WX 781 ; N uni2807 ; G 2678 +U 10248 ; WX 781 ; N uni2808 ; G 2679 +U 10249 ; WX 781 ; N uni2809 ; G 2680 +U 10250 ; WX 781 ; N uni280A ; G 2681 +U 10251 ; WX 781 ; N uni280B ; G 2682 +U 10252 ; WX 781 ; N uni280C ; G 2683 +U 10253 ; WX 781 ; N uni280D ; G 2684 +U 10254 ; WX 781 ; N uni280E ; G 2685 +U 10255 ; WX 781 ; N uni280F ; G 2686 +U 10256 ; WX 781 ; N uni2810 ; G 2687 +U 10257 ; WX 781 ; N uni2811 ; G 2688 +U 10258 ; WX 781 ; N uni2812 ; G 2689 +U 10259 ; WX 781 ; N uni2813 ; G 2690 +U 10260 ; WX 781 ; N uni2814 ; G 2691 +U 10261 ; WX 781 ; N uni2815 ; G 2692 +U 10262 ; WX 781 ; N uni2816 ; G 2693 +U 10263 ; WX 781 ; N uni2817 ; G 2694 +U 10264 ; WX 781 ; N uni2818 ; G 2695 +U 10265 ; WX 781 ; N uni2819 ; G 2696 +U 10266 ; WX 781 ; N uni281A ; G 2697 +U 10267 ; WX 781 ; N uni281B ; G 2698 +U 10268 ; WX 781 ; N uni281C ; G 2699 +U 10269 ; WX 781 ; N uni281D ; G 2700 +U 10270 ; WX 781 ; N uni281E ; G 2701 +U 10271 ; WX 781 ; N uni281F ; G 2702 +U 10272 ; WX 781 ; N uni2820 ; G 2703 +U 10273 ; WX 781 ; N uni2821 ; G 2704 +U 10274 ; WX 781 ; N uni2822 ; G 2705 +U 10275 ; WX 781 ; N uni2823 ; G 2706 +U 10276 ; WX 781 ; N uni2824 ; G 2707 +U 10277 ; WX 781 ; N uni2825 ; G 2708 +U 10278 ; WX 781 ; N uni2826 ; G 2709 +U 10279 ; WX 781 ; N uni2827 ; G 2710 +U 10280 ; WX 781 ; N uni2828 ; G 2711 +U 10281 ; WX 781 ; N uni2829 ; G 2712 +U 10282 ; WX 781 ; N uni282A ; G 2713 +U 10283 ; WX 781 ; N uni282B ; G 2714 +U 10284 ; WX 781 ; N uni282C ; G 2715 +U 10285 ; WX 781 ; N uni282D ; G 2716 +U 10286 ; WX 781 ; N uni282E ; G 2717 +U 10287 ; WX 781 ; N uni282F ; G 2718 +U 10288 ; WX 781 ; N uni2830 ; G 2719 +U 10289 ; WX 781 ; N uni2831 ; G 2720 +U 10290 ; WX 781 ; N uni2832 ; G 2721 +U 10291 ; WX 781 ; N uni2833 ; G 2722 +U 10292 ; WX 781 ; N uni2834 ; G 2723 +U 10293 ; WX 781 ; N uni2835 ; G 2724 +U 10294 ; WX 781 ; N uni2836 ; G 2725 +U 10295 ; WX 781 ; N uni2837 ; G 2726 +U 10296 ; WX 781 ; N uni2838 ; G 2727 +U 10297 ; WX 781 ; N uni2839 ; G 2728 +U 10298 ; WX 781 ; N uni283A ; G 2729 +U 10299 ; WX 781 ; N uni283B ; G 2730 +U 10300 ; WX 781 ; N uni283C ; G 2731 +U 10301 ; WX 781 ; N uni283D ; G 2732 +U 10302 ; WX 781 ; N uni283E ; G 2733 +U 10303 ; WX 781 ; N uni283F ; G 2734 +U 10304 ; WX 781 ; N uni2840 ; G 2735 +U 10305 ; WX 781 ; N uni2841 ; G 2736 +U 10306 ; WX 781 ; N uni2842 ; G 2737 +U 10307 ; WX 781 ; N uni2843 ; G 2738 +U 10308 ; WX 781 ; N uni2844 ; G 2739 +U 10309 ; WX 781 ; N uni2845 ; G 2740 +U 10310 ; WX 781 ; N uni2846 ; G 2741 +U 10311 ; WX 781 ; N uni2847 ; G 2742 +U 10312 ; WX 781 ; N uni2848 ; G 2743 +U 10313 ; WX 781 ; N uni2849 ; G 2744 +U 10314 ; WX 781 ; N uni284A ; G 2745 +U 10315 ; WX 781 ; N uni284B ; G 2746 +U 10316 ; WX 781 ; N uni284C ; G 2747 +U 10317 ; WX 781 ; N uni284D ; G 2748 +U 10318 ; WX 781 ; N uni284E ; G 2749 +U 10319 ; WX 781 ; N uni284F ; G 2750 +U 10320 ; WX 781 ; N uni2850 ; G 2751 +U 10321 ; WX 781 ; N uni2851 ; G 2752 +U 10322 ; WX 781 ; N uni2852 ; G 2753 +U 10323 ; WX 781 ; N uni2853 ; G 2754 +U 10324 ; WX 781 ; N uni2854 ; G 2755 +U 10325 ; WX 781 ; N uni2855 ; G 2756 +U 10326 ; WX 781 ; N uni2856 ; G 2757 +U 10327 ; WX 781 ; N uni2857 ; G 2758 +U 10328 ; WX 781 ; N uni2858 ; G 2759 +U 10329 ; WX 781 ; N uni2859 ; G 2760 +U 10330 ; WX 781 ; N uni285A ; G 2761 +U 10331 ; WX 781 ; N uni285B ; G 2762 +U 10332 ; WX 781 ; N uni285C ; G 2763 +U 10333 ; WX 781 ; N uni285D ; G 2764 +U 10334 ; WX 781 ; N uni285E ; G 2765 +U 10335 ; WX 781 ; N uni285F ; G 2766 +U 10336 ; WX 781 ; N uni2860 ; G 2767 +U 10337 ; WX 781 ; N uni2861 ; G 2768 +U 10338 ; WX 781 ; N uni2862 ; G 2769 +U 10339 ; WX 781 ; N uni2863 ; G 2770 +U 10340 ; WX 781 ; N uni2864 ; G 2771 +U 10341 ; WX 781 ; N uni2865 ; G 2772 +U 10342 ; WX 781 ; N uni2866 ; G 2773 +U 10343 ; WX 781 ; N uni2867 ; G 2774 +U 10344 ; WX 781 ; N uni2868 ; G 2775 +U 10345 ; WX 781 ; N uni2869 ; G 2776 +U 10346 ; WX 781 ; N uni286A ; G 2777 +U 10347 ; WX 781 ; N uni286B ; G 2778 +U 10348 ; WX 781 ; N uni286C ; G 2779 +U 10349 ; WX 781 ; N uni286D ; G 2780 +U 10350 ; WX 781 ; N uni286E ; G 2781 +U 10351 ; WX 781 ; N uni286F ; G 2782 +U 10352 ; WX 781 ; N uni2870 ; G 2783 +U 10353 ; WX 781 ; N uni2871 ; G 2784 +U 10354 ; WX 781 ; N uni2872 ; G 2785 +U 10355 ; WX 781 ; N uni2873 ; G 2786 +U 10356 ; WX 781 ; N uni2874 ; G 2787 +U 10357 ; WX 781 ; N uni2875 ; G 2788 +U 10358 ; WX 781 ; N uni2876 ; G 2789 +U 10359 ; WX 781 ; N uni2877 ; G 2790 +U 10360 ; WX 781 ; N uni2878 ; G 2791 +U 10361 ; WX 781 ; N uni2879 ; G 2792 +U 10362 ; WX 781 ; N uni287A ; G 2793 +U 10363 ; WX 781 ; N uni287B ; G 2794 +U 10364 ; WX 781 ; N uni287C ; G 2795 +U 10365 ; WX 781 ; N uni287D ; G 2796 +U 10366 ; WX 781 ; N uni287E ; G 2797 +U 10367 ; WX 781 ; N uni287F ; G 2798 +U 10368 ; WX 781 ; N uni2880 ; G 2799 +U 10369 ; WX 781 ; N uni2881 ; G 2800 +U 10370 ; WX 781 ; N uni2882 ; G 2801 +U 10371 ; WX 781 ; N uni2883 ; G 2802 +U 10372 ; WX 781 ; N uni2884 ; G 2803 +U 10373 ; WX 781 ; N uni2885 ; G 2804 +U 10374 ; WX 781 ; N uni2886 ; G 2805 +U 10375 ; WX 781 ; N uni2887 ; G 2806 +U 10376 ; WX 781 ; N uni2888 ; G 2807 +U 10377 ; WX 781 ; N uni2889 ; G 2808 +U 10378 ; WX 781 ; N uni288A ; G 2809 +U 10379 ; WX 781 ; N uni288B ; G 2810 +U 10380 ; WX 781 ; N uni288C ; G 2811 +U 10381 ; WX 781 ; N uni288D ; G 2812 +U 10382 ; WX 781 ; N uni288E ; G 2813 +U 10383 ; WX 781 ; N uni288F ; G 2814 +U 10384 ; WX 781 ; N uni2890 ; G 2815 +U 10385 ; WX 781 ; N uni2891 ; G 2816 +U 10386 ; WX 781 ; N uni2892 ; G 2817 +U 10387 ; WX 781 ; N uni2893 ; G 2818 +U 10388 ; WX 781 ; N uni2894 ; G 2819 +U 10389 ; WX 781 ; N uni2895 ; G 2820 +U 10390 ; WX 781 ; N uni2896 ; G 2821 +U 10391 ; WX 781 ; N uni2897 ; G 2822 +U 10392 ; WX 781 ; N uni2898 ; G 2823 +U 10393 ; WX 781 ; N uni2899 ; G 2824 +U 10394 ; WX 781 ; N uni289A ; G 2825 +U 10395 ; WX 781 ; N uni289B ; G 2826 +U 10396 ; WX 781 ; N uni289C ; G 2827 +U 10397 ; WX 781 ; N uni289D ; G 2828 +U 10398 ; WX 781 ; N uni289E ; G 2829 +U 10399 ; WX 781 ; N uni289F ; G 2830 +U 10400 ; WX 781 ; N uni28A0 ; G 2831 +U 10401 ; WX 781 ; N uni28A1 ; G 2832 +U 10402 ; WX 781 ; N uni28A2 ; G 2833 +U 10403 ; WX 781 ; N uni28A3 ; G 2834 +U 10404 ; WX 781 ; N uni28A4 ; G 2835 +U 10405 ; WX 781 ; N uni28A5 ; G 2836 +U 10406 ; WX 781 ; N uni28A6 ; G 2837 +U 10407 ; WX 781 ; N uni28A7 ; G 2838 +U 10408 ; WX 781 ; N uni28A8 ; G 2839 +U 10409 ; WX 781 ; N uni28A9 ; G 2840 +U 10410 ; WX 781 ; N uni28AA ; G 2841 +U 10411 ; WX 781 ; N uni28AB ; G 2842 +U 10412 ; WX 781 ; N uni28AC ; G 2843 +U 10413 ; WX 781 ; N uni28AD ; G 2844 +U 10414 ; WX 781 ; N uni28AE ; G 2845 +U 10415 ; WX 781 ; N uni28AF ; G 2846 +U 10416 ; WX 781 ; N uni28B0 ; G 2847 +U 10417 ; WX 781 ; N uni28B1 ; G 2848 +U 10418 ; WX 781 ; N uni28B2 ; G 2849 +U 10419 ; WX 781 ; N uni28B3 ; G 2850 +U 10420 ; WX 781 ; N uni28B4 ; G 2851 +U 10421 ; WX 781 ; N uni28B5 ; G 2852 +U 10422 ; WX 781 ; N uni28B6 ; G 2853 +U 10423 ; WX 781 ; N uni28B7 ; G 2854 +U 10424 ; WX 781 ; N uni28B8 ; G 2855 +U 10425 ; WX 781 ; N uni28B9 ; G 2856 +U 10426 ; WX 781 ; N uni28BA ; G 2857 +U 10427 ; WX 781 ; N uni28BB ; G 2858 +U 10428 ; WX 781 ; N uni28BC ; G 2859 +U 10429 ; WX 781 ; N uni28BD ; G 2860 +U 10430 ; WX 781 ; N uni28BE ; G 2861 +U 10431 ; WX 781 ; N uni28BF ; G 2862 +U 10432 ; WX 781 ; N uni28C0 ; G 2863 +U 10433 ; WX 781 ; N uni28C1 ; G 2864 +U 10434 ; WX 781 ; N uni28C2 ; G 2865 +U 10435 ; WX 781 ; N uni28C3 ; G 2866 +U 10436 ; WX 781 ; N uni28C4 ; G 2867 +U 10437 ; WX 781 ; N uni28C5 ; G 2868 +U 10438 ; WX 781 ; N uni28C6 ; G 2869 +U 10439 ; WX 781 ; N uni28C7 ; G 2870 +U 10440 ; WX 781 ; N uni28C8 ; G 2871 +U 10441 ; WX 781 ; N uni28C9 ; G 2872 +U 10442 ; WX 781 ; N uni28CA ; G 2873 +U 10443 ; WX 781 ; N uni28CB ; G 2874 +U 10444 ; WX 781 ; N uni28CC ; G 2875 +U 10445 ; WX 781 ; N uni28CD ; G 2876 +U 10446 ; WX 781 ; N uni28CE ; G 2877 +U 10447 ; WX 781 ; N uni28CF ; G 2878 +U 10448 ; WX 781 ; N uni28D0 ; G 2879 +U 10449 ; WX 781 ; N uni28D1 ; G 2880 +U 10450 ; WX 781 ; N uni28D2 ; G 2881 +U 10451 ; WX 781 ; N uni28D3 ; G 2882 +U 10452 ; WX 781 ; N uni28D4 ; G 2883 +U 10453 ; WX 781 ; N uni28D5 ; G 2884 +U 10454 ; WX 781 ; N uni28D6 ; G 2885 +U 10455 ; WX 781 ; N uni28D7 ; G 2886 +U 10456 ; WX 781 ; N uni28D8 ; G 2887 +U 10457 ; WX 781 ; N uni28D9 ; G 2888 +U 10458 ; WX 781 ; N uni28DA ; G 2889 +U 10459 ; WX 781 ; N uni28DB ; G 2890 +U 10460 ; WX 781 ; N uni28DC ; G 2891 +U 10461 ; WX 781 ; N uni28DD ; G 2892 +U 10462 ; WX 781 ; N uni28DE ; G 2893 +U 10463 ; WX 781 ; N uni28DF ; G 2894 +U 10464 ; WX 781 ; N uni28E0 ; G 2895 +U 10465 ; WX 781 ; N uni28E1 ; G 2896 +U 10466 ; WX 781 ; N uni28E2 ; G 2897 +U 10467 ; WX 781 ; N uni28E3 ; G 2898 +U 10468 ; WX 781 ; N uni28E4 ; G 2899 +U 10469 ; WX 781 ; N uni28E5 ; G 2900 +U 10470 ; WX 781 ; N uni28E6 ; G 2901 +U 10471 ; WX 781 ; N uni28E7 ; G 2902 +U 10472 ; WX 781 ; N uni28E8 ; G 2903 +U 10473 ; WX 781 ; N uni28E9 ; G 2904 +U 10474 ; WX 781 ; N uni28EA ; G 2905 +U 10475 ; WX 781 ; N uni28EB ; G 2906 +U 10476 ; WX 781 ; N uni28EC ; G 2907 +U 10477 ; WX 781 ; N uni28ED ; G 2908 +U 10478 ; WX 781 ; N uni28EE ; G 2909 +U 10479 ; WX 781 ; N uni28EF ; G 2910 +U 10480 ; WX 781 ; N uni28F0 ; G 2911 +U 10481 ; WX 781 ; N uni28F1 ; G 2912 +U 10482 ; WX 781 ; N uni28F2 ; G 2913 +U 10483 ; WX 781 ; N uni28F3 ; G 2914 +U 10484 ; WX 781 ; N uni28F4 ; G 2915 +U 10485 ; WX 781 ; N uni28F5 ; G 2916 +U 10486 ; WX 781 ; N uni28F6 ; G 2917 +U 10487 ; WX 781 ; N uni28F7 ; G 2918 +U 10488 ; WX 781 ; N uni28F8 ; G 2919 +U 10489 ; WX 781 ; N uni28F9 ; G 2920 +U 10490 ; WX 781 ; N uni28FA ; G 2921 +U 10491 ; WX 781 ; N uni28FB ; G 2922 +U 10492 ; WX 781 ; N uni28FC ; G 2923 +U 10493 ; WX 781 ; N uni28FD ; G 2924 +U 10494 ; WX 781 ; N uni28FE ; G 2925 +U 10495 ; WX 781 ; N uni28FF ; G 2926 +U 10496 ; WX 838 ; N uni2900 ; G 2927 +U 10497 ; WX 838 ; N uni2901 ; G 2928 +U 10498 ; WX 838 ; N uni2902 ; G 2929 +U 10499 ; WX 838 ; N uni2903 ; G 2930 +U 10500 ; WX 838 ; N uni2904 ; G 2931 +U 10501 ; WX 838 ; N uni2905 ; G 2932 +U 10502 ; WX 838 ; N uni2906 ; G 2933 +U 10503 ; WX 838 ; N uni2907 ; G 2934 +U 10504 ; WX 838 ; N uni2908 ; G 2935 +U 10505 ; WX 838 ; N uni2909 ; G 2936 +U 10506 ; WX 838 ; N uni290A ; G 2937 +U 10507 ; WX 838 ; N uni290B ; G 2938 +U 10508 ; WX 838 ; N uni290C ; G 2939 +U 10509 ; WX 838 ; N uni290D ; G 2940 +U 10510 ; WX 838 ; N uni290E ; G 2941 +U 10511 ; WX 838 ; N uni290F ; G 2942 +U 10512 ; WX 838 ; N uni2910 ; G 2943 +U 10513 ; WX 838 ; N uni2911 ; G 2944 +U 10514 ; WX 838 ; N uni2912 ; G 2945 +U 10515 ; WX 838 ; N uni2913 ; G 2946 +U 10516 ; WX 838 ; N uni2914 ; G 2947 +U 10517 ; WX 838 ; N uni2915 ; G 2948 +U 10518 ; WX 838 ; N uni2916 ; G 2949 +U 10519 ; WX 838 ; N uni2917 ; G 2950 +U 10520 ; WX 838 ; N uni2918 ; G 2951 +U 10521 ; WX 838 ; N uni2919 ; G 2952 +U 10522 ; WX 838 ; N uni291A ; G 2953 +U 10523 ; WX 838 ; N uni291B ; G 2954 +U 10524 ; WX 838 ; N uni291C ; G 2955 +U 10525 ; WX 838 ; N uni291D ; G 2956 +U 10526 ; WX 838 ; N uni291E ; G 2957 +U 10527 ; WX 838 ; N uni291F ; G 2958 +U 10528 ; WX 838 ; N uni2920 ; G 2959 +U 10529 ; WX 838 ; N uni2921 ; G 2960 +U 10530 ; WX 838 ; N uni2922 ; G 2961 +U 10531 ; WX 838 ; N uni2923 ; G 2962 +U 10532 ; WX 838 ; N uni2924 ; G 2963 +U 10533 ; WX 838 ; N uni2925 ; G 2964 +U 10534 ; WX 838 ; N uni2926 ; G 2965 +U 10535 ; WX 838 ; N uni2927 ; G 2966 +U 10536 ; WX 838 ; N uni2928 ; G 2967 +U 10537 ; WX 838 ; N uni2929 ; G 2968 +U 10538 ; WX 838 ; N uni292A ; G 2969 +U 10539 ; WX 838 ; N uni292B ; G 2970 +U 10540 ; WX 838 ; N uni292C ; G 2971 +U 10541 ; WX 838 ; N uni292D ; G 2972 +U 10542 ; WX 838 ; N uni292E ; G 2973 +U 10543 ; WX 838 ; N uni292F ; G 2974 +U 10544 ; WX 838 ; N uni2930 ; G 2975 +U 10545 ; WX 838 ; N uni2931 ; G 2976 +U 10546 ; WX 838 ; N uni2932 ; G 2977 +U 10547 ; WX 838 ; N uni2933 ; G 2978 +U 10548 ; WX 838 ; N uni2934 ; G 2979 +U 10549 ; WX 838 ; N uni2935 ; G 2980 +U 10550 ; WX 838 ; N uni2936 ; G 2981 +U 10551 ; WX 838 ; N uni2937 ; G 2982 +U 10552 ; WX 838 ; N uni2938 ; G 2983 +U 10553 ; WX 838 ; N uni2939 ; G 2984 +U 10554 ; WX 838 ; N uni293A ; G 2985 +U 10555 ; WX 838 ; N uni293B ; G 2986 +U 10556 ; WX 838 ; N uni293C ; G 2987 +U 10557 ; WX 838 ; N uni293D ; G 2988 +U 10558 ; WX 838 ; N uni293E ; G 2989 +U 10559 ; WX 838 ; N uni293F ; G 2990 +U 10560 ; WX 838 ; N uni2940 ; G 2991 +U 10561 ; WX 838 ; N uni2941 ; G 2992 +U 10562 ; WX 838 ; N uni2942 ; G 2993 +U 10563 ; WX 838 ; N uni2943 ; G 2994 +U 10564 ; WX 838 ; N uni2944 ; G 2995 +U 10565 ; WX 838 ; N uni2945 ; G 2996 +U 10566 ; WX 838 ; N uni2946 ; G 2997 +U 10567 ; WX 838 ; N uni2947 ; G 2998 +U 10568 ; WX 838 ; N uni2948 ; G 2999 +U 10569 ; WX 838 ; N uni2949 ; G 3000 +U 10570 ; WX 838 ; N uni294A ; G 3001 +U 10571 ; WX 838 ; N uni294B ; G 3002 +U 10572 ; WX 838 ; N uni294C ; G 3003 +U 10573 ; WX 838 ; N uni294D ; G 3004 +U 10574 ; WX 838 ; N uni294E ; G 3005 +U 10575 ; WX 838 ; N uni294F ; G 3006 +U 10576 ; WX 838 ; N uni2950 ; G 3007 +U 10577 ; WX 838 ; N uni2951 ; G 3008 +U 10578 ; WX 838 ; N uni2952 ; G 3009 +U 10579 ; WX 838 ; N uni2953 ; G 3010 +U 10580 ; WX 838 ; N uni2954 ; G 3011 +U 10581 ; WX 838 ; N uni2955 ; G 3012 +U 10582 ; WX 838 ; N uni2956 ; G 3013 +U 10583 ; WX 838 ; N uni2957 ; G 3014 +U 10584 ; WX 838 ; N uni2958 ; G 3015 +U 10585 ; WX 838 ; N uni2959 ; G 3016 +U 10586 ; WX 838 ; N uni295A ; G 3017 +U 10587 ; WX 838 ; N uni295B ; G 3018 +U 10588 ; WX 838 ; N uni295C ; G 3019 +U 10589 ; WX 838 ; N uni295D ; G 3020 +U 10590 ; WX 838 ; N uni295E ; G 3021 +U 10591 ; WX 838 ; N uni295F ; G 3022 +U 10592 ; WX 838 ; N uni2960 ; G 3023 +U 10593 ; WX 838 ; N uni2961 ; G 3024 +U 10594 ; WX 838 ; N uni2962 ; G 3025 +U 10595 ; WX 838 ; N uni2963 ; G 3026 +U 10596 ; WX 838 ; N uni2964 ; G 3027 +U 10597 ; WX 838 ; N uni2965 ; G 3028 +U 10598 ; WX 838 ; N uni2966 ; G 3029 +U 10599 ; WX 838 ; N uni2967 ; G 3030 +U 10600 ; WX 838 ; N uni2968 ; G 3031 +U 10601 ; WX 838 ; N uni2969 ; G 3032 +U 10602 ; WX 838 ; N uni296A ; G 3033 +U 10603 ; WX 838 ; N uni296B ; G 3034 +U 10604 ; WX 838 ; N uni296C ; G 3035 +U 10605 ; WX 838 ; N uni296D ; G 3036 +U 10606 ; WX 838 ; N uni296E ; G 3037 +U 10607 ; WX 838 ; N uni296F ; G 3038 +U 10608 ; WX 838 ; N uni2970 ; G 3039 +U 10609 ; WX 838 ; N uni2971 ; G 3040 +U 10610 ; WX 838 ; N uni2972 ; G 3041 +U 10611 ; WX 838 ; N uni2973 ; G 3042 +U 10612 ; WX 838 ; N uni2974 ; G 3043 +U 10613 ; WX 838 ; N uni2975 ; G 3044 +U 10614 ; WX 838 ; N uni2976 ; G 3045 +U 10615 ; WX 1032 ; N uni2977 ; G 3046 +U 10616 ; WX 838 ; N uni2978 ; G 3047 +U 10617 ; WX 838 ; N uni2979 ; G 3048 +U 10618 ; WX 960 ; N uni297A ; G 3049 +U 10619 ; WX 838 ; N uni297B ; G 3050 +U 10620 ; WX 838 ; N uni297C ; G 3051 +U 10621 ; WX 838 ; N uni297D ; G 3052 +U 10622 ; WX 838 ; N uni297E ; G 3053 +U 10623 ; WX 838 ; N uni297F ; G 3054 +U 10731 ; WX 494 ; N uni29EB ; G 3055 +U 10764 ; WX 1782 ; N uni2A0C ; G 3056 +U 10765 ; WX 610 ; N uni2A0D ; G 3057 +U 10766 ; WX 610 ; N uni2A0E ; G 3058 +U 10799 ; WX 838 ; N uni2A2F ; G 3059 +U 10858 ; WX 838 ; N uni2A6A ; G 3060 +U 10859 ; WX 838 ; N uni2A6B ; G 3061 +U 11008 ; WX 838 ; N uni2B00 ; G 3062 +U 11009 ; WX 838 ; N uni2B01 ; G 3063 +U 11010 ; WX 838 ; N uni2B02 ; G 3064 +U 11011 ; WX 838 ; N uni2B03 ; G 3065 +U 11012 ; WX 838 ; N uni2B04 ; G 3066 +U 11013 ; WX 838 ; N uni2B05 ; G 3067 +U 11014 ; WX 838 ; N uni2B06 ; G 3068 +U 11015 ; WX 838 ; N uni2B07 ; G 3069 +U 11016 ; WX 838 ; N uni2B08 ; G 3070 +U 11017 ; WX 838 ; N uni2B09 ; G 3071 +U 11018 ; WX 838 ; N uni2B0A ; G 3072 +U 11019 ; WX 838 ; N uni2B0B ; G 3073 +U 11020 ; WX 838 ; N uni2B0C ; G 3074 +U 11021 ; WX 838 ; N uni2B0D ; G 3075 +U 11022 ; WX 838 ; N uni2B0E ; G 3076 +U 11023 ; WX 838 ; N uni2B0F ; G 3077 +U 11024 ; WX 838 ; N uni2B10 ; G 3078 +U 11025 ; WX 838 ; N uni2B11 ; G 3079 +U 11026 ; WX 945 ; N uni2B12 ; G 3080 +U 11027 ; WX 945 ; N uni2B13 ; G 3081 +U 11028 ; WX 945 ; N uni2B14 ; G 3082 +U 11029 ; WX 945 ; N uni2B15 ; G 3083 +U 11030 ; WX 769 ; N uni2B16 ; G 3084 +U 11031 ; WX 769 ; N uni2B17 ; G 3085 +U 11032 ; WX 769 ; N uni2B18 ; G 3086 +U 11033 ; WX 769 ; N uni2B19 ; G 3087 +U 11034 ; WX 945 ; N uni2B1A ; G 3088 +U 11360 ; WX 703 ; N uni2C60 ; G 3089 +U 11361 ; WX 380 ; N uni2C61 ; G 3090 +U 11363 ; WX 752 ; N uni2C63 ; G 3091 +U 11364 ; WX 831 ; N uni2C64 ; G 3092 +U 11367 ; WX 945 ; N uni2C67 ; G 3093 +U 11368 ; WX 727 ; N uni2C68 ; G 3094 +U 11369 ; WX 869 ; N uni2C69 ; G 3095 +U 11370 ; WX 693 ; N uni2C6A ; G 3096 +U 11371 ; WX 730 ; N uni2C6B ; G 3097 +U 11372 ; WX 568 ; N uni2C6C ; G 3098 +U 11373 ; WX 848 ; N uni2C6D ; G 3099 +U 11374 ; WX 1107 ; N uni2C6E ; G 3100 +U 11375 ; WX 776 ; N uni2C6F ; G 3101 +U 11376 ; WX 848 ; N uni2C70 ; G 3102 +U 11377 ; WX 709 ; N uni2C71 ; G 3103 +U 11378 ; WX 1221 ; N uni2C72 ; G 3104 +U 11379 ; WX 984 ; N uni2C73 ; G 3105 +U 11381 ; WX 779 ; N uni2C75 ; G 3106 +U 11382 ; WX 601 ; N uni2C76 ; G 3107 +U 11383 ; WX 905 ; N uni2C77 ; G 3108 +U 11385 ; WX 571 ; N uni2C79 ; G 3109 +U 11386 ; WX 667 ; N uni2C7A ; G 3110 +U 11387 ; WX 617 ; N uni2C7B ; G 3111 +U 11388 ; WX 313 ; N uni2C7C ; G 3112 +U 11389 ; WX 489 ; N uni2C7D ; G 3113 +U 11390 ; WX 722 ; N uni2C7E ; G 3114 +U 11391 ; WX 730 ; N uni2C7F ; G 3115 +U 11520 ; WX 773 ; N uni2D00 ; G 3116 +U 11521 ; WX 635 ; N uni2D01 ; G 3117 +U 11522 ; WX 804 ; N uni2D02 ; G 3118 +U 11523 ; WX 658 ; N uni2D03 ; G 3119 +U 11524 ; WX 788 ; N uni2D04 ; G 3120 +U 11525 ; WX 962 ; N uni2D05 ; G 3121 +U 11526 ; WX 756 ; N uni2D06 ; G 3122 +U 11527 ; WX 960 ; N uni2D07 ; G 3123 +U 11528 ; WX 617 ; N uni2D08 ; G 3124 +U 11529 ; WX 646 ; N uni2D09 ; G 3125 +U 11530 ; WX 962 ; N uni2D0A ; G 3126 +U 11531 ; WX 631 ; N uni2D0B ; G 3127 +U 11532 ; WX 646 ; N uni2D0C ; G 3128 +U 11533 ; WX 962 ; N uni2D0D ; G 3129 +U 11534 ; WX 846 ; N uni2D0E ; G 3130 +U 11535 ; WX 866 ; N uni2D0F ; G 3131 +U 11536 ; WX 961 ; N uni2D10 ; G 3132 +U 11537 ; WX 645 ; N uni2D11 ; G 3133 +U 11538 ; WX 645 ; N uni2D12 ; G 3134 +U 11539 ; WX 959 ; N uni2D13 ; G 3135 +U 11540 ; WX 945 ; N uni2D14 ; G 3136 +U 11541 ; WX 863 ; N uni2D15 ; G 3137 +U 11542 ; WX 644 ; N uni2D16 ; G 3138 +U 11543 ; WX 646 ; N uni2D17 ; G 3139 +U 11544 ; WX 645 ; N uni2D18 ; G 3140 +U 11545 ; WX 649 ; N uni2D19 ; G 3141 +U 11546 ; WX 688 ; N uni2D1A ; G 3142 +U 11547 ; WX 936 ; N uni2D1B ; G 3143 +U 11548 ; WX 982 ; N uni2D1C ; G 3144 +U 11549 ; WX 681 ; N uni2D1D ; G 3145 +U 11550 ; WX 676 ; N uni2D1E ; G 3146 +U 11551 ; WX 852 ; N uni2D1F ; G 3147 +U 11552 ; WX 1113 ; N uni2D20 ; G 3148 +U 11553 ; WX 632 ; N uni2D21 ; G 3149 +U 11554 ; WX 645 ; N uni2D22 ; G 3150 +U 11555 ; WX 646 ; N uni2D23 ; G 3151 +U 11556 ; WX 749 ; N uni2D24 ; G 3152 +U 11557 ; WX 914 ; N uni2D25 ; G 3153 +U 11800 ; WX 586 ; N uni2E18 ; G 3154 +U 11807 ; WX 838 ; N uni2E1F ; G 3155 +U 11810 ; WX 473 ; N uni2E22 ; G 3156 +U 11811 ; WX 473 ; N uni2E23 ; G 3157 +U 11812 ; WX 473 ; N uni2E24 ; G 3158 +U 11813 ; WX 473 ; N uni2E25 ; G 3159 +U 11822 ; WX 586 ; N uni2E2E ; G 3160 +U 42564 ; WX 722 ; N uniA644 ; G 3161 +U 42565 ; WX 563 ; N uniA645 ; G 3162 +U 42566 ; WX 468 ; N uniA646 ; G 3163 +U 42567 ; WX 380 ; N uniA647 ; G 3164 +U 42576 ; WX 1333 ; N uniA650 ; G 3165 +U 42577 ; WX 1092 ; N uniA651 ; G 3166 +U 42580 ; WX 1287 ; N uniA654 ; G 3167 +U 42581 ; WX 1025 ; N uniA655 ; G 3168 +U 42582 ; WX 1287 ; N uniA656 ; G 3169 +U 42583 ; WX 1039 ; N uniA657 ; G 3170 +U 42648 ; WX 1448 ; N uniA698 ; G 3171 +U 42649 ; WX 1060 ; N uniA699 ; G 3172 +U 42760 ; WX 500 ; N uniA708 ; G 3173 +U 42761 ; WX 500 ; N uniA709 ; G 3174 +U 42762 ; WX 500 ; N uniA70A ; G 3175 +U 42763 ; WX 500 ; N uniA70B ; G 3176 +U 42764 ; WX 500 ; N uniA70C ; G 3177 +U 42765 ; WX 500 ; N uniA70D ; G 3178 +U 42766 ; WX 500 ; N uniA70E ; G 3179 +U 42767 ; WX 500 ; N uniA70F ; G 3180 +U 42768 ; WX 500 ; N uniA710 ; G 3181 +U 42769 ; WX 500 ; N uniA711 ; G 3182 +U 42770 ; WX 500 ; N uniA712 ; G 3183 +U 42771 ; WX 500 ; N uniA713 ; G 3184 +U 42772 ; WX 500 ; N uniA714 ; G 3185 +U 42773 ; WX 500 ; N uniA715 ; G 3186 +U 42774 ; WX 500 ; N uniA716 ; G 3187 +U 42779 ; WX 384 ; N uniA71B ; G 3188 +U 42780 ; WX 384 ; N uniA71C ; G 3189 +U 42781 ; WX 276 ; N uniA71D ; G 3190 +U 42782 ; WX 276 ; N uniA71E ; G 3191 +U 42783 ; WX 276 ; N uniA71F ; G 3192 +U 42790 ; WX 945 ; N uniA726 ; G 3193 +U 42791 ; WX 712 ; N uniA727 ; G 3194 +U 42792 ; WX 1003 ; N uniA728 ; G 3195 +U 42793 ; WX 909 ; N uniA729 ; G 3196 +U 42794 ; WX 696 ; N uniA72A ; G 3197 +U 42795 ; WX 609 ; N uniA72B ; G 3198 +U 42796 ; WX 634 ; N uniA72C ; G 3199 +U 42797 ; WX 598 ; N uniA72D ; G 3200 +U 42798 ; WX 741 ; N uniA72E ; G 3201 +U 42799 ; WX 706 ; N uniA72F ; G 3202 +U 42800 ; WX 592 ; N uniA730 ; G 3203 +U 42801 ; WX 563 ; N uniA731 ; G 3204 +U 42802 ; WX 1301 ; N uniA732 ; G 3205 +U 42803 ; WX 986 ; N uniA733 ; G 3206 +U 42804 ; WX 1261 ; N uniA734 ; G 3207 +U 42805 ; WX 1004 ; N uniA735 ; G 3208 +U 42806 ; WX 1168 ; N uniA736 ; G 3209 +U 42807 ; WX 1008 ; N uniA737 ; G 3210 +U 42808 ; WX 1016 ; N uniA738 ; G 3211 +U 42809 ; WX 813 ; N uniA739 ; G 3212 +U 42810 ; WX 1016 ; N uniA73A ; G 3213 +U 42811 ; WX 813 ; N uniA73B ; G 3214 +U 42812 ; WX 994 ; N uniA73C ; G 3215 +U 42813 ; WX 847 ; N uniA73D ; G 3216 +U 42814 ; WX 796 ; N uniA73E ; G 3217 +U 42815 ; WX 609 ; N uniA73F ; G 3218 +U 42816 ; WX 910 ; N uniA740 ; G 3219 +U 42817 ; WX 722 ; N uniA741 ; G 3220 +U 42822 ; WX 916 ; N uniA746 ; G 3221 +U 42823 ; WX 581 ; N uniA747 ; G 3222 +U 42826 ; WX 1010 ; N uniA74A ; G 3223 +U 42827 ; WX 770 ; N uniA74B ; G 3224 +U 42830 ; WX 1448 ; N uniA74E ; G 3225 +U 42831 ; WX 1060 ; N uniA74F ; G 3226 +U 42856 ; WX 787 ; N uniA768 ; G 3227 +U 42857 ; WX 716 ; N uniA769 ; G 3228 +U 42875 ; WX 694 ; N uniA77B ; G 3229 +U 42876 ; WX 527 ; N uniA77C ; G 3230 +U 42880 ; WX 703 ; N uniA780 ; G 3231 +U 42881 ; WX 380 ; N uniA781 ; G 3232 +U 42882 ; WX 872 ; N uniA782 ; G 3233 +U 42883 ; WX 727 ; N uniA783 ; G 3234 +U 42884 ; WX 694 ; N uniA784 ; G 3235 +U 42885 ; WX 527 ; N uniA785 ; G 3236 +U 42886 ; WX 796 ; N uniA786 ; G 3237 +U 42887 ; WX 609 ; N uniA787 ; G 3238 +U 42891 ; WX 439 ; N uniA78B ; G 3239 +U 42892 ; WX 306 ; N uniA78C ; G 3240 +U 42893 ; WX 913 ; N uniA78D ; G 3241 +U 42896 ; WX 914 ; N uniA790 ; G 3242 +U 42897 ; WX 727 ; N uniA791 ; G 3243 +U 42922 ; WX 945 ; N uniA7AA ; G 3244 +U 43000 ; WX 595 ; N uniA7F8 ; G 3245 +U 43001 ; WX 647 ; N uniA7F9 ; G 3246 +U 43002 ; WX 1069 ; N uniA7FA ; G 3247 +U 43003 ; WX 710 ; N uniA7FB ; G 3248 +U 43004 ; WX 752 ; N uniA7FC ; G 3249 +U 43005 ; WX 1107 ; N uniA7FD ; G 3250 +U 43006 ; WX 468 ; N uniA7FE ; G 3251 +U 43007 ; WX 1286 ; N uniA7FF ; G 3252 +U 62464 ; WX 705 ; N uniF400 ; G 3253 +U 62465 ; WX 716 ; N uniF401 ; G 3254 +U 62466 ; WX 765 ; N uniF402 ; G 3255 +U 62467 ; WX 999 ; N uniF403 ; G 3256 +U 62468 ; WX 716 ; N uniF404 ; G 3257 +U 62469 ; WX 710 ; N uniF405 ; G 3258 +U 62470 ; WX 776 ; N uniF406 ; G 3259 +U 62471 ; WX 1038 ; N uniF407 ; G 3260 +U 62472 ; WX 716 ; N uniF408 ; G 3261 +U 62473 ; WX 716 ; N uniF409 ; G 3262 +U 62474 ; WX 1309 ; N uniF40A ; G 3263 +U 62475 ; WX 734 ; N uniF40B ; G 3264 +U 62476 ; WX 733 ; N uniF40C ; G 3265 +U 62477 ; WX 1004 ; N uniF40D ; G 3266 +U 62478 ; WX 716 ; N uniF40E ; G 3267 +U 62479 ; WX 733 ; N uniF40F ; G 3268 +U 62480 ; WX 1050 ; N uniF410 ; G 3269 +U 62481 ; WX 797 ; N uniF411 ; G 3270 +U 62482 ; WX 850 ; N uniF412 ; G 3271 +U 62483 ; WX 799 ; N uniF413 ; G 3272 +U 62484 ; WX 996 ; N uniF414 ; G 3273 +U 62485 ; WX 732 ; N uniF415 ; G 3274 +U 62486 ; WX 987 ; N uniF416 ; G 3275 +U 62487 ; WX 731 ; N uniF417 ; G 3276 +U 62488 ; WX 739 ; N uniF418 ; G 3277 +U 62489 ; WX 733 ; N uniF419 ; G 3278 +U 62490 ; WX 780 ; N uniF41A ; G 3279 +U 62491 ; WX 733 ; N uniF41B ; G 3280 +U 62492 ; WX 739 ; N uniF41C ; G 3281 +U 62493 ; WX 717 ; N uniF41D ; G 3282 +U 62494 ; WX 780 ; N uniF41E ; G 3283 +U 62495 ; WX 936 ; N uniF41F ; G 3284 +U 62496 ; WX 716 ; N uniF420 ; G 3285 +U 62497 ; WX 826 ; N uniF421 ; G 3286 +U 62498 ; WX 717 ; N uniF422 ; G 3287 +U 62499 ; WX 716 ; N uniF423 ; G 3288 +U 62500 ; WX 716 ; N uniF424 ; G 3289 +U 62501 ; WX 773 ; N uniF425 ; G 3290 +U 62502 ; WX 1013 ; N uniF426 ; G 3291 +U 62504 ; WX 904 ; N uniF428 ; G 3292 +U 63173 ; WX 667 ; N uniF6C5 ; G 3293 +U 63185 ; WX 500 ; N cyrBreve ; G 3294 +U 63188 ; WX 500 ; N cyrbreve ; G 3295 +U 64256 ; WX 821 ; N uniFB00 ; G 3296 +U 64257 ; WX 727 ; N fi ; G 3297 +U 64258 ; WX 727 ; N fl ; G 3298 +U 64259 ; WX 1120 ; N uniFB03 ; G 3299 +U 64260 ; WX 1117 ; N uniFB04 ; G 3300 +U 64261 ; WX 871 ; N uniFB05 ; G 3301 +U 64262 ; WX 971 ; N uniFB06 ; G 3302 +U 65024 ; WX 0 ; N uniFE00 ; G 3303 +U 65025 ; WX 0 ; N uniFE01 ; G 3304 +U 65026 ; WX 0 ; N uniFE02 ; G 3305 +U 65027 ; WX 0 ; N uniFE03 ; G 3306 +U 65028 ; WX 0 ; N uniFE04 ; G 3307 +U 65029 ; WX 0 ; N uniFE05 ; G 3308 +U 65030 ; WX 0 ; N uniFE06 ; G 3309 +U 65031 ; WX 0 ; N uniFE07 ; G 3310 +U 65032 ; WX 0 ; N uniFE08 ; G 3311 +U 65033 ; WX 0 ; N uniFE09 ; G 3312 +U 65034 ; WX 0 ; N uniFE0A ; G 3313 +U 65035 ; WX 0 ; N uniFE0B ; G 3314 +U 65036 ; WX 0 ; N uniFE0C ; G 3315 +U 65037 ; WX 0 ; N uniFE0D ; G 3316 +U 65038 ; WX 0 ; N uniFE0E ; G 3317 +U 65039 ; WX 0 ; N uniFE0F ; G 3318 +U 65529 ; WX 0 ; N uniFFF9 ; G 3319 +U 65530 ; WX 0 ; N uniFFFA ; G 3320 +U 65531 ; WX 0 ; N uniFFFB ; G 3321 +U 65532 ; WX 0 ; N uniFFFC ; G 3322 +U 65533 ; WX 1113 ; N uniFFFD ; G 3323 +EndCharMetrics +StartKernData +StartKernPairs 1408 + +KPX dollar seven -112 +KPX dollar nine -149 +KPX dollar colon -102 +KPX dollar less -102 +KPX dollar I -36 +KPX dollar W -36 +KPX dollar Y -83 +KPX dollar Z -83 +KPX dollar backslash -83 +KPX dollar questiondown -83 +KPX dollar Aacute -83 +KPX dollar Hcircumflex -112 +KPX dollar hcircumflex -36 +KPX dollar Hbar -112 +KPX dollar hbar -36 +KPX dollar Kcommaaccent -102 +KPX dollar kcommaaccent -83 +KPX dollar kgreenlandic -102 +KPX dollar Lacute -83 +KPX dollar lacute -102 +KPX dollar uni01DC -112 +KPX dollar uni01DD -36 +KPX dollar uni01F4 -102 +KPX dollar uni01F5 -83 + +KPX percent ampersand 38 +KPX percent asterisk 38 +KPX percent two 38 +KPX percent less -36 +KPX percent Egrave 38 +KPX percent Ecircumflex 38 +KPX percent Igrave 38 +KPX percent Icircumflex 38 +KPX percent Thorn 38 +KPX percent agrave 38 +KPX percent acircumflex 38 +KPX percent adieresis 38 +KPX percent Dcaron 38 +KPX percent Dcroat 38 +KPX percent Emacron 38 +KPX percent Ebreve 38 +KPX percent kgreenlandic -36 +KPX percent lacute -36 +KPX percent uni01AC 38 +KPX percent uni01AE 38 +KPX percent uni01F0 38 +KPX percent uni01F4 -36 + + +KPX quotesingle nine -36 + + +KPX parenright dollar -120 +KPX parenright D -112 +KPX parenright H -112 +KPX parenright R -112 +KPX parenright U -36 +KPX parenright X -36 +KPX parenright cent -112 +KPX parenright sterling -112 +KPX parenright currency -112 +KPX parenright yen -112 +KPX parenright brokenbar -112 +KPX parenright section -112 +KPX parenright dieresis -112 +KPX parenright ordfeminine -112 +KPX parenright guillemotleft -112 +KPX parenright logicalnot -112 +KPX parenright sfthyphen -112 +KPX parenright acute -112 +KPX parenright mu -112 +KPX parenright paragraph -112 +KPX parenright periodcentered -112 +KPX parenright cedilla -112 +KPX parenright ordmasculine -112 +KPX parenright guillemotright -36 +KPX parenright onequarter -36 +KPX parenright onehalf -36 +KPX parenright threequarters -36 +KPX parenright Acircumflex -120 +KPX parenright Atilde -112 +KPX parenright Adieresis -120 +KPX parenright Aring -112 +KPX parenright AE -120 +KPX parenright Ccedilla -112 +KPX parenright Otilde -112 +KPX parenright multiply -112 +KPX parenright Ugrave -112 +KPX parenright Ucircumflex -112 +KPX parenright Yacute -112 +KPX parenright dcaron -112 +KPX parenright dmacron -112 +KPX parenright emacron -112 +KPX parenright ebreve -112 +KPX parenright edotaccent -36 +KPX parenright eogonek -36 +KPX parenright ecaron -36 +KPX parenright imacron -36 +KPX parenright ibreve -36 +KPX parenright iogonek -36 +KPX parenright dotlessi -36 +KPX parenright ij -36 +KPX parenright jcircumflex -36 +KPX parenright uni01A5 -112 +KPX parenright uni01AD -112 +KPX parenright Uhorn -112 +KPX parenright uni01F1 -112 + + + +KPX period dollar -83 +KPX period ampersand -55 +KPX period two -55 +KPX period eight -73 +KPX period colon -73 +KPX period less -55 +KPX period H -45 +KPX period R -45 +KPX period X -45 +KPX period backslash -92 +KPX period ordfeminine -45 +KPX period guillemotleft -45 +KPX period logicalnot -45 +KPX period sfthyphen -45 +KPX period acute -45 +KPX period mu -45 +KPX period paragraph -45 +KPX period periodcentered -45 +KPX period cedilla -45 +KPX period ordmasculine -36 +KPX period guillemotright -45 +KPX period onequarter -45 +KPX period onehalf -45 +KPX period threequarters -45 +KPX period questiondown -92 +KPX period Aacute -92 +KPX period Egrave -55 +KPX period Icircumflex -55 +KPX period Yacute -45 +KPX period Ebreve -55 +KPX period ebreve -45 +KPX period Idot -73 +KPX period dotlessi -45 +KPX period lacute -55 + +KPX slash seven -167 +KPX slash eight -112 +KPX slash nine -243 +KPX slash colon -139 +KPX slash less -131 +KPX slash backslash -73 +KPX slash questiondown -73 +KPX slash Aacute -73 +KPX slash Hbar -167 +KPX slash Idot -112 +KPX slash lacute -131 + + +KPX two nine -36 +KPX two semicolon -36 + +KPX three dollar -149 +KPX three D -55 +KPX three H -55 +KPX three R -55 +KPX three cent -55 +KPX three sterling -55 +KPX three currency -55 +KPX three yen -55 +KPX three brokenbar -55 +KPX three section -55 +KPX three dieresis -55 +KPX three ordfeminine -55 +KPX three guillemotleft -55 +KPX three logicalnot -55 +KPX three sfthyphen -55 +KPX three acute -55 +KPX three mu -55 +KPX three paragraph -55 +KPX three periodcentered -55 +KPX three cedilla -55 +KPX three ordmasculine -55 +KPX three Yacute -55 +KPX three ebreve -55 + + +KPX five seven -36 +KPX five nine -73 +KPX five colon -45 +KPX five less -63 +KPX five D 47 +KPX five backslash -36 +KPX five cent 47 +KPX five sterling 47 +KPX five currency 47 +KPX five yen 47 +KPX five brokenbar 47 +KPX five section 47 +KPX five dieresis 47 +KPX five ordmasculine 38 +KPX five questiondown -36 +KPX five Aacute -36 +KPX five Hbar -36 +KPX five lacute -63 + +KPX six six -45 +KPX six Gdotaccent -45 +KPX six Gcommaaccent -45 + +KPX seven dollar -112 +KPX seven seven -73 +KPX seven D -196 +KPX seven F -235 +KPX seven H -235 +KPX seven R -235 +KPX seven U -149 +KPX seven V -188 +KPX seven X -188 +KPX seven Z -225 +KPX seven backslash -225 +KPX seven m -149 +KPX seven braceright -149 +KPX seven cent -96 +KPX seven sterling -196 +KPX seven currency -96 +KPX seven yen -96 +KPX seven brokenbar -96 +KPX seven section -96 +KPX seven dieresis -159 +KPX seven copyright -235 +KPX seven ordfeminine -175 +KPX seven guillemotleft -235 +KPX seven logicalnot -175 +KPX seven sfthyphen -175 +KPX seven acute -155 +KPX seven mu -235 +KPX seven paragraph -155 +KPX seven periodcentered -155 +KPX seven cedilla -155 +KPX seven ordmasculine -159 +KPX seven guillemotright -158 +KPX seven onequarter -188 +KPX seven onehalf -158 +KPX seven threequarters -158 +KPX seven questiondown -225 +KPX seven Aacute -225 +KPX seven Eacute -235 +KPX seven Idieresis -235 +KPX seven Yacute -235 +KPX seven ebreve -159 +KPX seven edotaccent -149 +KPX seven ecaron -149 +KPX seven gdotaccent -188 +KPX seven gcommaaccent -188 +KPX seven Hbar -73 +KPX seven dotlessi -188 + +KPX eight dollar -63 + +KPX nine dollar -159 +KPX nine two -36 +KPX nine D -188 +KPX nine H -188 +KPX nine L -36 +KPX nine R -188 +KPX nine X -131 +KPX nine backslash -83 +KPX nine cent -188 +KPX nine sterling -188 +KPX nine currency -188 +KPX nine yen -188 +KPX nine brokenbar -188 +KPX nine section -188 +KPX nine dieresis -188 +KPX nine ordfeminine -188 +KPX nine guillemotleft -188 +KPX nine logicalnot -188 +KPX nine sfthyphen -188 +KPX nine acute -188 +KPX nine mu -188 +KPX nine paragraph -188 +KPX nine periodcentered -188 +KPX nine cedilla -188 +KPX nine ordmasculine -188 +KPX nine guillemotright -131 +KPX nine onequarter -131 +KPX nine onehalf -131 +KPX nine threequarters -131 +KPX nine questiondown -83 +KPX nine Aacute -83 +KPX nine Yacute -188 +KPX nine Ebreve -36 +KPX nine ebreve -188 +KPX nine dotlessi -131 + +KPX colon dollar -131 +KPX colon D -178 +KPX colon H -167 +KPX colon L -36 +KPX colon R -167 +KPX colon U -92 +KPX colon X -83 +KPX colon backslash -45 +KPX colon cent -178 +KPX colon sterling -178 +KPX colon currency -178 +KPX colon yen -178 +KPX colon brokenbar -178 +KPX colon section -178 +KPX colon dieresis -139 +KPX colon ordfeminine -167 +KPX colon guillemotleft -167 +KPX colon logicalnot -167 +KPX colon sfthyphen -167 +KPX colon acute -167 +KPX colon mu -167 +KPX colon paragraph -167 +KPX colon periodcentered -167 +KPX colon cedilla -167 +KPX colon ordmasculine -167 +KPX colon guillemotright -83 +KPX colon onequarter -83 +KPX colon onehalf -83 +KPX colon threequarters -83 +KPX colon questiondown -45 +KPX colon Aacute -45 +KPX colon Yacute -167 +KPX colon ebreve -167 +KPX colon edotaccent -92 +KPX colon ecaron -92 +KPX colon dotlessi -83 + +KPX semicolon dollar -73 +KPX semicolon ampersand -36 +KPX semicolon two -36 +KPX semicolon Egrave -36 +KPX semicolon Icircumflex -36 +KPX semicolon Ebreve -36 + +KPX less dollar -131 +KPX less ampersand -36 +KPX less D -159 +KPX less H -178 +KPX less L -36 +KPX less R -178 +KPX less X -178 +KPX less cent -159 +KPX less sterling -159 +KPX less currency -159 +KPX less yen -159 +KPX less brokenbar -159 +KPX less section -159 +KPX less dieresis -159 +KPX less ordfeminine -178 +KPX less guillemotleft -178 +KPX less logicalnot -178 +KPX less sfthyphen -178 +KPX less acute -178 +KPX less mu -178 +KPX less paragraph -178 +KPX less periodcentered -178 +KPX less cedilla -178 +KPX less ordmasculine -178 +KPX less guillemotright -178 +KPX less onequarter -178 +KPX less onehalf -178 +KPX less threequarters -178 +KPX less Egrave -36 +KPX less Icircumflex -36 +KPX less Yacute -178 +KPX less ebreve -178 +KPX less dotlessi -178 + + + + + + + + + + +KPX m hyphen -73 +KPX m seven -149 +KPX m Hbar -149 + +KPX braceright hyphen -73 +KPX braceright seven -149 +KPX braceright Hbar -149 + + + + + + + + + + + + +KPX Acircumflex seven -112 +KPX Acircumflex nine -149 +KPX Acircumflex colon -102 +KPX Acircumflex less -102 +KPX Acircumflex I -36 +KPX Acircumflex W -36 +KPX Acircumflex Y -83 +KPX Acircumflex Z -83 +KPX Acircumflex backslash -83 +KPX Acircumflex questiondown -83 +KPX Acircumflex Aacute -83 +KPX Acircumflex Hcircumflex -112 +KPX Acircumflex hcircumflex -36 +KPX Acircumflex Hbar -112 +KPX Acircumflex hbar -36 +KPX Acircumflex Kcommaaccent -102 +KPX Acircumflex kcommaaccent -83 +KPX Acircumflex kgreenlandic -102 +KPX Acircumflex Lacute -83 +KPX Acircumflex lacute -102 +KPX Acircumflex uni01DC -112 +KPX Acircumflex uni01DD -36 +KPX Acircumflex uni01F4 -102 +KPX Acircumflex uni01F5 -83 + +KPX Adieresis seven -112 +KPX Adieresis nine -149 +KPX Adieresis colon -102 +KPX Adieresis less -102 +KPX Adieresis I -36 +KPX Adieresis W -36 +KPX Adieresis Y -83 +KPX Adieresis Z -83 +KPX Adieresis backslash -83 +KPX Adieresis questiondown -83 +KPX Adieresis Aacute -83 +KPX Adieresis Hcircumflex -112 +KPX Adieresis hcircumflex -36 +KPX Adieresis Hbar -112 +KPX Adieresis hbar -36 +KPX Adieresis Kcommaaccent -102 +KPX Adieresis kcommaaccent -83 +KPX Adieresis kgreenlandic -102 +KPX Adieresis Lacute -83 +KPX Adieresis lacute -102 +KPX Adieresis uni01DC -112 +KPX Adieresis uni01DD -36 +KPX Adieresis uni01F4 -102 +KPX Adieresis uni01F5 -83 + +KPX AE seven -112 +KPX AE nine -149 +KPX AE colon -102 +KPX AE less -102 +KPX AE I -36 +KPX AE W -36 +KPX AE Y -83 +KPX AE Z -83 +KPX AE backslash -83 +KPX AE questiondown -83 +KPX AE Aacute -83 +KPX AE Hcircumflex -112 +KPX AE hcircumflex -36 +KPX AE Hbar -112 +KPX AE hbar -36 +KPX AE Kcommaaccent -102 +KPX AE kcommaaccent -83 +KPX AE kgreenlandic -102 +KPX AE Lacute -83 +KPX AE lacute -102 +KPX AE uni01DC -112 +KPX AE uni01DD -36 +KPX AE uni01F4 -102 +KPX AE uni01F5 -83 + + + + + +KPX Eth nine -36 + +KPX Ograve nine -36 + + + +KPX ucircumflex seven -167 +KPX ucircumflex eight -112 +KPX ucircumflex nine -243 +KPX ucircumflex colon -139 +KPX ucircumflex less -131 +KPX ucircumflex backslash -73 +KPX ucircumflex questiondown -73 +KPX ucircumflex Aacute -73 +KPX ucircumflex Hbar -167 +KPX ucircumflex Idot -112 +KPX ucircumflex lacute -131 + +KPX ydieresis seven -167 +KPX ydieresis eight -112 +KPX ydieresis nine -243 +KPX ydieresis colon -139 +KPX ydieresis less -131 +KPX ydieresis backslash -73 +KPX ydieresis questiondown -73 +KPX ydieresis Aacute -73 +KPX ydieresis Hbar -167 +KPX ydieresis Idot -112 +KPX ydieresis lacute -131 + +KPX Abreve O -241 + +KPX abreve seven -167 +KPX abreve eight -112 +KPX abreve nine -243 +KPX abreve colon -139 +KPX abreve less -131 +KPX abreve backslash -73 +KPX abreve questiondown -73 +KPX abreve Aacute -73 +KPX abreve Hbar -167 +KPX abreve Idot -112 +KPX abreve lacute -131 + + + +KPX Edotaccent seven -36 +KPX Edotaccent nine -73 +KPX Edotaccent colon -45 +KPX Edotaccent less -63 +KPX Edotaccent D 47 +KPX Edotaccent backslash -36 +KPX Edotaccent cent 47 +KPX Edotaccent sterling 47 +KPX Edotaccent currency 47 +KPX Edotaccent yen 47 +KPX Edotaccent brokenbar 47 +KPX Edotaccent section 47 +KPX Edotaccent dieresis 47 +KPX Edotaccent ordmasculine 38 +KPX Edotaccent questiondown -36 +KPX Edotaccent Aacute -36 +KPX Edotaccent Hbar -36 +KPX Edotaccent lacute -63 + + +KPX Ecaron seven -36 +KPX Ecaron nine -73 +KPX Ecaron colon -45 +KPX Ecaron less -63 +KPX Ecaron D 47 +KPX Ecaron backslash -36 +KPX Ecaron cent 47 +KPX Ecaron sterling 47 +KPX Ecaron currency 47 +KPX Ecaron yen 47 +KPX Ecaron brokenbar 47 +KPX Ecaron section 47 +KPX Ecaron dieresis 47 +KPX Ecaron ordmasculine 38 +KPX Ecaron questiondown -36 +KPX Ecaron Aacute -36 +KPX Ecaron Hbar -36 +KPX Ecaron lacute -63 + + +KPX Gdotaccent six -45 +KPX Gdotaccent Gdotaccent -45 +KPX Gdotaccent Gcommaaccent -45 + +KPX Gcommaaccent six -45 +KPX Gcommaaccent Gdotaccent -45 +KPX Gcommaaccent Gcommaaccent -45 + +KPX Hbar dollar -112 +KPX Hbar seven -73 +KPX Hbar D -196 +KPX Hbar F -235 +KPX Hbar H -235 +KPX Hbar R -235 +KPX Hbar U -149 +KPX Hbar V -188 +KPX Hbar X -188 +KPX Hbar Z -225 +KPX Hbar backslash -225 +KPX Hbar m -149 +KPX Hbar braceright -149 +KPX Hbar cent -196 +KPX Hbar sterling -196 +KPX Hbar currency -196 +KPX Hbar yen -196 +KPX Hbar brokenbar -196 +KPX Hbar section -196 +KPX Hbar dieresis -159 +KPX Hbar copyright -235 +KPX Hbar ordfeminine -235 +KPX Hbar guillemotleft -235 +KPX Hbar logicalnot -235 +KPX Hbar sfthyphen -235 +KPX Hbar acute -235 +KPX Hbar mu -235 +KPX Hbar paragraph -235 +KPX Hbar periodcentered -235 +KPX Hbar cedilla -235 +KPX Hbar ordmasculine -159 +KPX Hbar guillemotright -188 +KPX Hbar onequarter -188 +KPX Hbar onehalf -188 +KPX Hbar threequarters -188 +KPX Hbar questiondown -225 +KPX Hbar Aacute -225 +KPX Hbar Eacute -235 +KPX Hbar Idieresis -235 +KPX Hbar Yacute -235 +KPX Hbar ebreve -159 +KPX Hbar edotaccent -149 +KPX Hbar ecaron -149 +KPX Hbar gdotaccent -188 +KPX Hbar gcommaaccent -188 +KPX Hbar Hbar -73 +KPX Hbar dotlessi -188 + +KPX Idot dollar -63 + +KPX lacute dollar -131 +KPX lacute ampersand -36 +KPX lacute D -159 +KPX lacute H -178 +KPX lacute L -36 +KPX lacute R -178 +KPX lacute X -178 +KPX lacute cent -159 +KPX lacute sterling -159 +KPX lacute currency -159 +KPX lacute yen -159 +KPX lacute brokenbar -159 +KPX lacute section -159 +KPX lacute dieresis -159 +KPX lacute ordfeminine -178 +KPX lacute guillemotleft -178 +KPX lacute logicalnot -178 +KPX lacute sfthyphen -178 +KPX lacute acute -178 +KPX lacute mu -178 +KPX lacute paragraph -178 +KPX lacute periodcentered -178 +KPX lacute cedilla -178 +KPX lacute ordmasculine -178 +KPX lacute guillemotright -178 +KPX lacute onequarter -178 +KPX lacute onehalf -178 +KPX lacute threequarters -178 +KPX lacute Egrave -36 +KPX lacute Icircumflex -36 +KPX lacute Yacute -178 +KPX lacute ebreve -178 +KPX lacute dotlessi -178 + + +KPX uni027D dollar -282 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-BoldItalic.ttf b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-BoldItalic.ttf new file mode 100644 index 0000000..a36dd4b Binary files /dev/null and b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-BoldItalic.ttf differ diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-BoldItalic.ufm b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-BoldItalic.ufm new file mode 100644 index 0000000..f6db21d --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-BoldItalic.ufm @@ -0,0 +1,3892 @@ +StartFontMetrics 4.1 +Notice Converted by PHP-font-lib +Comment https://github.com/PhenX/php-font-lib +EncodingScheme FontSpecific +FontName DejaVu Serif +FontSubfamily Bold Italic +UniqueID DejaVu Serif Bold Italic +FullName DejaVu Serif Bold Italic +Version Version 2.37 +PostScriptName DejaVuSerif-BoldItalic +Manufacturer DejaVu fonts team +FontVendorURL http://dejavu.sourceforge.net +LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License +PreferredFamily DejaVu Serif +PreferredSubfamily Bold Italic +Weight Bold +ItalicAngle -11 +IsFixedPitch false +UnderlineThickness 44 +UnderlinePosition -63 +FontHeightOffset 0 +Ascender 939 +Descender -236 +FontBBox -906 -389 1925 1145 +StartCharMetrics 3506 +U 32 ; WX 348 ; N space ; G 3 +U 33 ; WX 439 ; N exclam ; G 4 +U 34 ; WX 521 ; N quotedbl ; G 5 +U 35 ; WX 838 ; N numbersign ; G 6 +U 36 ; WX 696 ; N dollar ; G 7 +U 37 ; WX 950 ; N percent ; G 8 +U 38 ; WX 903 ; N ampersand ; G 9 +U 39 ; WX 306 ; N quotesingle ; G 10 +U 40 ; WX 473 ; N parenleft ; G 11 +U 41 ; WX 473 ; N parenright ; G 12 +U 42 ; WX 523 ; N asterisk ; G 13 +U 43 ; WX 838 ; N plus ; G 14 +U 44 ; WX 348 ; N comma ; G 15 +U 45 ; WX 415 ; N hyphen ; G 16 +U 46 ; WX 348 ; N period ; G 17 +U 47 ; WX 365 ; N slash ; G 18 +U 48 ; WX 696 ; N zero ; G 19 +U 49 ; WX 696 ; N one ; G 20 +U 50 ; WX 696 ; N two ; G 21 +U 51 ; WX 696 ; N three ; G 22 +U 52 ; WX 696 ; N four ; G 23 +U 53 ; WX 696 ; N five ; G 24 +U 54 ; WX 696 ; N six ; G 25 +U 55 ; WX 696 ; N seven ; G 26 +U 56 ; WX 696 ; N eight ; G 27 +U 57 ; WX 696 ; N nine ; G 28 +U 58 ; WX 369 ; N colon ; G 29 +U 59 ; WX 369 ; N semicolon ; G 30 +U 60 ; WX 838 ; N less ; G 31 +U 61 ; WX 838 ; N equal ; G 32 +U 62 ; WX 838 ; N greater ; G 33 +U 63 ; WX 586 ; N question ; G 34 +U 64 ; WX 1000 ; N at ; G 35 +U 65 ; WX 776 ; N A ; G 36 +U 66 ; WX 845 ; N B ; G 37 +U 67 ; WX 796 ; N C ; G 38 +U 68 ; WX 867 ; N D ; G 39 +U 69 ; WX 762 ; N E ; G 40 +U 70 ; WX 710 ; N F ; G 41 +U 71 ; WX 854 ; N G ; G 42 +U 72 ; WX 945 ; N H ; G 43 +U 73 ; WX 468 ; N I ; G 44 +U 74 ; WX 473 ; N J ; G 45 +U 75 ; WX 869 ; N K ; G 46 +U 76 ; WX 703 ; N L ; G 47 +U 77 ; WX 1107 ; N M ; G 48 +U 78 ; WX 914 ; N N ; G 49 +U 79 ; WX 871 ; N O ; G 50 +U 80 ; WX 752 ; N P ; G 51 +U 81 ; WX 871 ; N Q ; G 52 +U 82 ; WX 831 ; N R ; G 53 +U 83 ; WX 722 ; N S ; G 54 +U 84 ; WX 744 ; N T ; G 55 +U 85 ; WX 872 ; N U ; G 56 +U 86 ; WX 776 ; N V ; G 57 +U 87 ; WX 1123 ; N W ; G 58 +U 88 ; WX 776 ; N X ; G 59 +U 89 ; WX 714 ; N Y ; G 60 +U 90 ; WX 730 ; N Z ; G 61 +U 91 ; WX 473 ; N bracketleft ; G 62 +U 92 ; WX 365 ; N backslash ; G 63 +U 93 ; WX 473 ; N bracketright ; G 64 +U 94 ; WX 838 ; N asciicircum ; G 65 +U 95 ; WX 500 ; N underscore ; G 66 +U 96 ; WX 500 ; N grave ; G 67 +U 97 ; WX 648 ; N a ; G 68 +U 98 ; WX 699 ; N b ; G 69 +U 99 ; WX 609 ; N c ; G 70 +U 100 ; WX 699 ; N d ; G 71 +U 101 ; WX 636 ; N e ; G 72 +U 102 ; WX 430 ; N f ; G 73 +U 103 ; WX 699 ; N g ; G 74 +U 104 ; WX 727 ; N h ; G 75 +U 105 ; WX 380 ; N i ; G 76 +U 106 ; WX 362 ; N j ; G 77 +U 107 ; WX 693 ; N k ; G 78 +U 108 ; WX 380 ; N l ; G 79 +U 109 ; WX 1058 ; N m ; G 80 +U 110 ; WX 727 ; N n ; G 81 +U 111 ; WX 667 ; N o ; G 82 +U 112 ; WX 699 ; N p ; G 83 +U 113 ; WX 699 ; N q ; G 84 +U 114 ; WX 527 ; N r ; G 85 +U 115 ; WX 563 ; N s ; G 86 +U 116 ; WX 462 ; N t ; G 87 +U 117 ; WX 727 ; N u ; G 88 +U 118 ; WX 581 ; N v ; G 89 +U 119 ; WX 861 ; N w ; G 90 +U 120 ; WX 596 ; N x ; G 91 +U 121 ; WX 581 ; N y ; G 92 +U 122 ; WX 568 ; N z ; G 93 +U 123 ; WX 643 ; N braceleft ; G 94 +U 124 ; WX 364 ; N bar ; G 95 +U 125 ; WX 643 ; N braceright ; G 96 +U 126 ; WX 838 ; N asciitilde ; G 97 +U 160 ; WX 348 ; N nbspace ; G 98 +U 161 ; WX 439 ; N exclamdown ; G 99 +U 162 ; WX 696 ; N cent ; G 100 +U 163 ; WX 696 ; N sterling ; G 101 +U 164 ; WX 636 ; N currency ; G 102 +U 165 ; WX 696 ; N yen ; G 103 +U 166 ; WX 364 ; N brokenbar ; G 104 +U 167 ; WX 523 ; N section ; G 105 +U 168 ; WX 500 ; N dieresis ; G 106 +U 169 ; WX 1000 ; N copyright ; G 107 +U 170 ; WX 487 ; N ordfeminine ; G 108 +U 171 ; WX 625 ; N guillemotleft ; G 109 +U 172 ; WX 838 ; N logicalnot ; G 110 +U 173 ; WX 415 ; N sfthyphen ; G 111 +U 174 ; WX 1000 ; N registered ; G 112 +U 175 ; WX 500 ; N macron ; G 113 +U 176 ; WX 500 ; N degree ; G 114 +U 177 ; WX 838 ; N plusminus ; G 115 +U 178 ; WX 438 ; N twosuperior ; G 116 +U 179 ; WX 438 ; N threesuperior ; G 117 +U 180 ; WX 500 ; N acute ; G 118 +U 181 ; WX 732 ; N mu ; G 119 +U 182 ; WX 636 ; N paragraph ; G 120 +U 183 ; WX 348 ; N periodcentered ; G 121 +U 184 ; WX 500 ; N cedilla ; G 122 +U 185 ; WX 438 ; N onesuperior ; G 123 +U 186 ; WX 500 ; N ordmasculine ; G 124 +U 187 ; WX 625 ; N guillemotright ; G 125 +U 188 ; WX 1043 ; N onequarter ; G 126 +U 189 ; WX 1043 ; N onehalf ; G 127 +U 190 ; WX 1043 ; N threequarters ; G 128 +U 191 ; WX 586 ; N questiondown ; G 129 +U 192 ; WX 776 ; N Agrave ; G 130 +U 193 ; WX 776 ; N Aacute ; G 131 +U 194 ; WX 776 ; N Acircumflex ; G 132 +U 195 ; WX 776 ; N Atilde ; G 133 +U 196 ; WX 776 ; N Adieresis ; G 134 +U 197 ; WX 776 ; N Aring ; G 135 +U 198 ; WX 1034 ; N AE ; G 136 +U 199 ; WX 796 ; N Ccedilla ; G 137 +U 200 ; WX 762 ; N Egrave ; G 138 +U 201 ; WX 762 ; N Eacute ; G 139 +U 202 ; WX 762 ; N Ecircumflex ; G 140 +U 203 ; WX 762 ; N Edieresis ; G 141 +U 204 ; WX 468 ; N Igrave ; G 142 +U 205 ; WX 468 ; N Iacute ; G 143 +U 206 ; WX 468 ; N Icircumflex ; G 144 +U 207 ; WX 468 ; N Idieresis ; G 145 +U 208 ; WX 874 ; N Eth ; G 146 +U 209 ; WX 914 ; N Ntilde ; G 147 +U 210 ; WX 871 ; N Ograve ; G 148 +U 211 ; WX 871 ; N Oacute ; G 149 +U 212 ; WX 871 ; N Ocircumflex ; G 150 +U 213 ; WX 871 ; N Otilde ; G 151 +U 214 ; WX 871 ; N Odieresis ; G 152 +U 215 ; WX 838 ; N multiply ; G 153 +U 216 ; WX 871 ; N Oslash ; G 154 +U 217 ; WX 872 ; N Ugrave ; G 155 +U 218 ; WX 872 ; N Uacute ; G 156 +U 219 ; WX 872 ; N Ucircumflex ; G 157 +U 220 ; WX 872 ; N Udieresis ; G 158 +U 221 ; WX 714 ; N Yacute ; G 159 +U 222 ; WX 757 ; N Thorn ; G 160 +U 223 ; WX 760 ; N germandbls ; G 161 +U 224 ; WX 648 ; N agrave ; G 162 +U 225 ; WX 648 ; N aacute ; G 163 +U 226 ; WX 648 ; N acircumflex ; G 164 +U 227 ; WX 648 ; N atilde ; G 165 +U 228 ; WX 648 ; N adieresis ; G 166 +U 229 ; WX 648 ; N aring ; G 167 +U 230 ; WX 932 ; N ae ; G 168 +U 231 ; WX 609 ; N ccedilla ; G 169 +U 232 ; WX 636 ; N egrave ; G 170 +U 233 ; WX 636 ; N eacute ; G 171 +U 234 ; WX 636 ; N ecircumflex ; G 172 +U 235 ; WX 636 ; N edieresis ; G 173 +U 236 ; WX 380 ; N igrave ; G 174 +U 237 ; WX 380 ; N iacute ; G 175 +U 238 ; WX 380 ; N icircumflex ; G 176 +U 239 ; WX 380 ; N idieresis ; G 177 +U 240 ; WX 667 ; N eth ; G 178 +U 241 ; WX 727 ; N ntilde ; G 179 +U 242 ; WX 667 ; N ograve ; G 180 +U 243 ; WX 667 ; N oacute ; G 181 +U 244 ; WX 667 ; N ocircumflex ; G 182 +U 245 ; WX 667 ; N otilde ; G 183 +U 246 ; WX 667 ; N odieresis ; G 184 +U 247 ; WX 838 ; N divide ; G 185 +U 248 ; WX 667 ; N oslash ; G 186 +U 249 ; WX 727 ; N ugrave ; G 187 +U 250 ; WX 727 ; N uacute ; G 188 +U 251 ; WX 727 ; N ucircumflex ; G 189 +U 252 ; WX 727 ; N udieresis ; G 190 +U 253 ; WX 581 ; N yacute ; G 191 +U 254 ; WX 699 ; N thorn ; G 192 +U 255 ; WX 581 ; N ydieresis ; G 193 +U 256 ; WX 776 ; N Amacron ; G 194 +U 257 ; WX 648 ; N amacron ; G 195 +U 258 ; WX 776 ; N Abreve ; G 196 +U 259 ; WX 648 ; N abreve ; G 197 +U 260 ; WX 776 ; N Aogonek ; G 198 +U 261 ; WX 648 ; N aogonek ; G 199 +U 262 ; WX 796 ; N Cacute ; G 200 +U 263 ; WX 609 ; N cacute ; G 201 +U 264 ; WX 796 ; N Ccircumflex ; G 202 +U 265 ; WX 609 ; N ccircumflex ; G 203 +U 266 ; WX 796 ; N Cdotaccent ; G 204 +U 267 ; WX 609 ; N cdotaccent ; G 205 +U 268 ; WX 796 ; N Ccaron ; G 206 +U 269 ; WX 609 ; N ccaron ; G 207 +U 270 ; WX 867 ; N Dcaron ; G 208 +U 271 ; WX 699 ; N dcaron ; G 209 +U 272 ; WX 874 ; N Dcroat ; G 210 +U 273 ; WX 699 ; N dmacron ; G 211 +U 274 ; WX 762 ; N Emacron ; G 212 +U 275 ; WX 636 ; N emacron ; G 213 +U 276 ; WX 762 ; N Ebreve ; G 214 +U 277 ; WX 636 ; N ebreve ; G 215 +U 278 ; WX 762 ; N Edotaccent ; G 216 +U 279 ; WX 636 ; N edotaccent ; G 217 +U 280 ; WX 762 ; N Eogonek ; G 218 +U 281 ; WX 636 ; N eogonek ; G 219 +U 282 ; WX 762 ; N Ecaron ; G 220 +U 283 ; WX 636 ; N ecaron ; G 221 +U 284 ; WX 854 ; N Gcircumflex ; G 222 +U 285 ; WX 699 ; N gcircumflex ; G 223 +U 286 ; WX 854 ; N Gbreve ; G 224 +U 287 ; WX 699 ; N gbreve ; G 225 +U 288 ; WX 854 ; N Gdotaccent ; G 226 +U 289 ; WX 699 ; N gdotaccent ; G 227 +U 290 ; WX 854 ; N Gcommaaccent ; G 228 +U 291 ; WX 699 ; N gcommaaccent ; G 229 +U 292 ; WX 945 ; N Hcircumflex ; G 230 +U 293 ; WX 727 ; N hcircumflex ; G 231 +U 294 ; WX 945 ; N Hbar ; G 232 +U 295 ; WX 727 ; N hbar ; G 233 +U 296 ; WX 468 ; N Itilde ; G 234 +U 297 ; WX 380 ; N itilde ; G 235 +U 298 ; WX 468 ; N Imacron ; G 236 +U 299 ; WX 380 ; N imacron ; G 237 +U 300 ; WX 468 ; N Ibreve ; G 238 +U 301 ; WX 380 ; N ibreve ; G 239 +U 302 ; WX 468 ; N Iogonek ; G 240 +U 303 ; WX 380 ; N iogonek ; G 241 +U 304 ; WX 468 ; N Idot ; G 242 +U 305 ; WX 380 ; N dotlessi ; G 243 +U 306 ; WX 942 ; N IJ ; G 244 +U 307 ; WX 751 ; N ij ; G 245 +U 308 ; WX 473 ; N Jcircumflex ; G 246 +U 309 ; WX 362 ; N jcircumflex ; G 247 +U 310 ; WX 869 ; N Kcommaaccent ; G 248 +U 311 ; WX 693 ; N kcommaaccent ; G 249 +U 312 ; WX 693 ; N kgreenlandic ; G 250 +U 313 ; WX 703 ; N Lacute ; G 251 +U 314 ; WX 380 ; N lacute ; G 252 +U 315 ; WX 703 ; N Lcommaaccent ; G 253 +U 316 ; WX 380 ; N lcommaaccent ; G 254 +U 317 ; WX 703 ; N Lcaron ; G 255 +U 318 ; WX 508 ; N lcaron ; G 256 +U 319 ; WX 703 ; N Ldot ; G 257 +U 320 ; WX 557 ; N ldot ; G 258 +U 321 ; WX 710 ; N Lslash ; G 259 +U 322 ; WX 385 ; N lslash ; G 260 +U 323 ; WX 914 ; N Nacute ; G 261 +U 324 ; WX 727 ; N nacute ; G 262 +U 325 ; WX 914 ; N Ncommaaccent ; G 263 +U 326 ; WX 727 ; N ncommaaccent ; G 264 +U 327 ; WX 914 ; N Ncaron ; G 265 +U 328 ; WX 727 ; N ncaron ; G 266 +U 329 ; WX 1008 ; N napostrophe ; G 267 +U 330 ; WX 872 ; N Eng ; G 268 +U 331 ; WX 727 ; N eng ; G 269 +U 332 ; WX 871 ; N Omacron ; G 270 +U 333 ; WX 667 ; N omacron ; G 271 +U 334 ; WX 871 ; N Obreve ; G 272 +U 335 ; WX 667 ; N obreve ; G 273 +U 336 ; WX 871 ; N Ohungarumlaut ; G 274 +U 337 ; WX 667 ; N ohungarumlaut ; G 275 +U 338 ; WX 1180 ; N OE ; G 276 +U 339 ; WX 1028 ; N oe ; G 277 +U 340 ; WX 831 ; N Racute ; G 278 +U 341 ; WX 527 ; N racute ; G 279 +U 342 ; WX 831 ; N Rcommaaccent ; G 280 +U 343 ; WX 527 ; N rcommaaccent ; G 281 +U 344 ; WX 831 ; N Rcaron ; G 282 +U 345 ; WX 527 ; N rcaron ; G 283 +U 346 ; WX 722 ; N Sacute ; G 284 +U 347 ; WX 563 ; N sacute ; G 285 +U 348 ; WX 722 ; N Scircumflex ; G 286 +U 349 ; WX 563 ; N scircumflex ; G 287 +U 350 ; WX 722 ; N Scedilla ; G 288 +U 351 ; WX 563 ; N scedilla ; G 289 +U 352 ; WX 722 ; N Scaron ; G 290 +U 353 ; WX 563 ; N scaron ; G 291 +U 354 ; WX 744 ; N Tcommaaccent ; G 292 +U 355 ; WX 462 ; N tcommaaccent ; G 293 +U 356 ; WX 744 ; N Tcaron ; G 294 +U 357 ; WX 462 ; N tcaron ; G 295 +U 358 ; WX 744 ; N Tbar ; G 296 +U 359 ; WX 462 ; N tbar ; G 297 +U 360 ; WX 872 ; N Utilde ; G 298 +U 361 ; WX 727 ; N utilde ; G 299 +U 362 ; WX 872 ; N Umacron ; G 300 +U 363 ; WX 727 ; N umacron ; G 301 +U 364 ; WX 872 ; N Ubreve ; G 302 +U 365 ; WX 727 ; N ubreve ; G 303 +U 366 ; WX 872 ; N Uring ; G 304 +U 367 ; WX 727 ; N uring ; G 305 +U 368 ; WX 872 ; N Uhungarumlaut ; G 306 +U 369 ; WX 727 ; N uhungarumlaut ; G 307 +U 370 ; WX 872 ; N Uogonek ; G 308 +U 371 ; WX 727 ; N uogonek ; G 309 +U 372 ; WX 1123 ; N Wcircumflex ; G 310 +U 373 ; WX 861 ; N wcircumflex ; G 311 +U 374 ; WX 714 ; N Ycircumflex ; G 312 +U 375 ; WX 581 ; N ycircumflex ; G 313 +U 376 ; WX 714 ; N Ydieresis ; G 314 +U 377 ; WX 730 ; N Zacute ; G 315 +U 378 ; WX 568 ; N zacute ; G 316 +U 379 ; WX 730 ; N Zdotaccent ; G 317 +U 380 ; WX 568 ; N zdotaccent ; G 318 +U 381 ; WX 730 ; N Zcaron ; G 319 +U 382 ; WX 568 ; N zcaron ; G 320 +U 383 ; WX 430 ; N longs ; G 321 +U 384 ; WX 699 ; N uni0180 ; G 322 +U 385 ; WX 845 ; N uni0181 ; G 323 +U 386 ; WX 854 ; N uni0182 ; G 324 +U 387 ; WX 699 ; N uni0183 ; G 325 +U 388 ; WX 854 ; N uni0184 ; G 326 +U 389 ; WX 699 ; N uni0185 ; G 327 +U 390 ; WX 796 ; N uni0186 ; G 328 +U 391 ; WX 796 ; N uni0187 ; G 329 +U 392 ; WX 609 ; N uni0188 ; G 330 +U 393 ; WX 874 ; N uni0189 ; G 331 +U 394 ; WX 867 ; N uni018A ; G 332 +U 395 ; WX 854 ; N uni018B ; G 333 +U 396 ; WX 699 ; N uni018C ; G 334 +U 397 ; WX 667 ; N uni018D ; G 335 +U 398 ; WX 762 ; N uni018E ; G 336 +U 399 ; WX 871 ; N uni018F ; G 337 +U 400 ; WX 721 ; N uni0190 ; G 338 +U 401 ; WX 710 ; N uni0191 ; G 339 +U 402 ; WX 430 ; N florin ; G 340 +U 403 ; WX 854 ; N uni0193 ; G 341 +U 404 ; WX 771 ; N uni0194 ; G 342 +U 405 ; WX 1043 ; N uni0195 ; G 343 +U 406 ; WX 468 ; N uni0196 ; G 344 +U 407 ; WX 468 ; N uni0197 ; G 345 +U 408 ; WX 869 ; N uni0198 ; G 346 +U 409 ; WX 693 ; N uni0199 ; G 347 +U 410 ; WX 380 ; N uni019A ; G 348 +U 411 ; WX 701 ; N uni019B ; G 349 +U 412 ; WX 1058 ; N uni019C ; G 350 +U 413 ; WX 914 ; N uni019D ; G 351 +U 414 ; WX 727 ; N uni019E ; G 352 +U 415 ; WX 871 ; N uni019F ; G 353 +U 416 ; WX 871 ; N Ohorn ; G 354 +U 417 ; WX 667 ; N ohorn ; G 355 +U 418 ; WX 1200 ; N uni01A2 ; G 356 +U 419 ; WX 943 ; N uni01A3 ; G 357 +U 420 ; WX 752 ; N uni01A4 ; G 358 +U 421 ; WX 699 ; N uni01A5 ; G 359 +U 422 ; WX 831 ; N uni01A6 ; G 360 +U 423 ; WX 722 ; N uni01A7 ; G 361 +U 424 ; WX 563 ; N uni01A8 ; G 362 +U 425 ; WX 707 ; N uni01A9 ; G 363 +U 426 ; WX 331 ; N uni01AA ; G 364 +U 427 ; WX 462 ; N uni01AB ; G 365 +U 428 ; WX 744 ; N uni01AC ; G 366 +U 429 ; WX 462 ; N uni01AD ; G 367 +U 430 ; WX 744 ; N uni01AE ; G 368 +U 431 ; WX 872 ; N Uhorn ; G 369 +U 432 ; WX 727 ; N uhorn ; G 370 +U 433 ; WX 890 ; N uni01B1 ; G 371 +U 434 ; WX 890 ; N uni01B2 ; G 372 +U 435 ; WX 714 ; N uni01B3 ; G 373 +U 436 ; WX 699 ; N uni01B4 ; G 374 +U 437 ; WX 730 ; N uni01B5 ; G 375 +U 438 ; WX 568 ; N uni01B6 ; G 376 +U 439 ; WX 657 ; N uni01B7 ; G 377 +U 440 ; WX 657 ; N uni01B8 ; G 378 +U 441 ; WX 657 ; N uni01B9 ; G 379 +U 442 ; WX 657 ; N uni01BA ; G 380 +U 443 ; WX 696 ; N uni01BB ; G 381 +U 444 ; WX 754 ; N uni01BC ; G 382 +U 445 ; WX 568 ; N uni01BD ; G 383 +U 446 ; WX 536 ; N uni01BE ; G 384 +U 447 ; WX 716 ; N uni01BF ; G 385 +U 448 ; WX 295 ; N uni01C0 ; G 386 +U 449 ; WX 492 ; N uni01C1 ; G 387 +U 450 ; WX 459 ; N uni01C2 ; G 388 +U 451 ; WX 295 ; N uni01C3 ; G 389 +U 452 ; WX 1597 ; N uni01C4 ; G 390 +U 453 ; WX 1435 ; N uni01C5 ; G 391 +U 454 ; WX 1267 ; N uni01C6 ; G 392 +U 455 ; WX 1176 ; N uni01C7 ; G 393 +U 456 ; WX 1065 ; N uni01C8 ; G 394 +U 457 ; WX 742 ; N uni01C9 ; G 395 +U 458 ; WX 1387 ; N uni01CA ; G 396 +U 459 ; WX 1276 ; N uni01CB ; G 397 +U 460 ; WX 1089 ; N uni01CC ; G 398 +U 461 ; WX 776 ; N uni01CD ; G 399 +U 462 ; WX 648 ; N uni01CE ; G 400 +U 463 ; WX 468 ; N uni01CF ; G 401 +U 464 ; WX 380 ; N uni01D0 ; G 402 +U 465 ; WX 871 ; N uni01D1 ; G 403 +U 466 ; WX 667 ; N uni01D2 ; G 404 +U 467 ; WX 872 ; N uni01D3 ; G 405 +U 468 ; WX 727 ; N uni01D4 ; G 406 +U 469 ; WX 872 ; N uni01D5 ; G 407 +U 470 ; WX 727 ; N uni01D6 ; G 408 +U 471 ; WX 872 ; N uni01D7 ; G 409 +U 472 ; WX 727 ; N uni01D8 ; G 410 +U 473 ; WX 872 ; N uni01D9 ; G 411 +U 474 ; WX 727 ; N uni01DA ; G 412 +U 475 ; WX 872 ; N uni01DB ; G 413 +U 476 ; WX 727 ; N uni01DC ; G 414 +U 477 ; WX 636 ; N uni01DD ; G 415 +U 478 ; WX 776 ; N uni01DE ; G 416 +U 479 ; WX 648 ; N uni01DF ; G 417 +U 480 ; WX 776 ; N uni01E0 ; G 418 +U 481 ; WX 648 ; N uni01E1 ; G 419 +U 482 ; WX 1034 ; N uni01E2 ; G 420 +U 483 ; WX 975 ; N uni01E3 ; G 421 +U 484 ; WX 896 ; N uni01E4 ; G 422 +U 485 ; WX 699 ; N uni01E5 ; G 423 +U 486 ; WX 854 ; N Gcaron ; G 424 +U 487 ; WX 699 ; N gcaron ; G 425 +U 488 ; WX 869 ; N uni01E8 ; G 426 +U 489 ; WX 693 ; N uni01E9 ; G 427 +U 490 ; WX 871 ; N uni01EA ; G 428 +U 491 ; WX 667 ; N uni01EB ; G 429 +U 492 ; WX 871 ; N uni01EC ; G 430 +U 493 ; WX 667 ; N uni01ED ; G 431 +U 494 ; WX 657 ; N uni01EE ; G 432 +U 495 ; WX 568 ; N uni01EF ; G 433 +U 496 ; WX 362 ; N uni01F0 ; G 434 +U 497 ; WX 1597 ; N uni01F1 ; G 435 +U 498 ; WX 1435 ; N uni01F2 ; G 436 +U 499 ; WX 1267 ; N uni01F3 ; G 437 +U 500 ; WX 854 ; N uni01F4 ; G 438 +U 501 ; WX 699 ; N uni01F5 ; G 439 +U 502 ; WX 1221 ; N uni01F6 ; G 440 +U 503 ; WX 787 ; N uni01F7 ; G 441 +U 504 ; WX 914 ; N uni01F8 ; G 442 +U 505 ; WX 727 ; N uni01F9 ; G 443 +U 506 ; WX 776 ; N Aringacute ; G 444 +U 507 ; WX 648 ; N aringacute ; G 445 +U 508 ; WX 1034 ; N AEacute ; G 446 +U 509 ; WX 932 ; N aeacute ; G 447 +U 510 ; WX 871 ; N Oslashacute ; G 448 +U 511 ; WX 667 ; N oslashacute ; G 449 +U 512 ; WX 776 ; N uni0200 ; G 450 +U 513 ; WX 648 ; N uni0201 ; G 451 +U 514 ; WX 776 ; N uni0202 ; G 452 +U 515 ; WX 648 ; N uni0203 ; G 453 +U 516 ; WX 762 ; N uni0204 ; G 454 +U 517 ; WX 636 ; N uni0205 ; G 455 +U 518 ; WX 762 ; N uni0206 ; G 456 +U 519 ; WX 636 ; N uni0207 ; G 457 +U 520 ; WX 468 ; N uni0208 ; G 458 +U 521 ; WX 380 ; N uni0209 ; G 459 +U 522 ; WX 468 ; N uni020A ; G 460 +U 523 ; WX 380 ; N uni020B ; G 461 +U 524 ; WX 871 ; N uni020C ; G 462 +U 525 ; WX 667 ; N uni020D ; G 463 +U 526 ; WX 871 ; N uni020E ; G 464 +U 527 ; WX 667 ; N uni020F ; G 465 +U 528 ; WX 831 ; N uni0210 ; G 466 +U 529 ; WX 527 ; N uni0211 ; G 467 +U 530 ; WX 831 ; N uni0212 ; G 468 +U 531 ; WX 527 ; N uni0213 ; G 469 +U 532 ; WX 872 ; N uni0214 ; G 470 +U 533 ; WX 727 ; N uni0215 ; G 471 +U 534 ; WX 872 ; N uni0216 ; G 472 +U 535 ; WX 727 ; N uni0217 ; G 473 +U 536 ; WX 722 ; N Scommaaccent ; G 474 +U 537 ; WX 563 ; N scommaaccent ; G 475 +U 538 ; WX 744 ; N uni021A ; G 476 +U 539 ; WX 462 ; N uni021B ; G 477 +U 540 ; WX 690 ; N uni021C ; G 478 +U 541 ; WX 607 ; N uni021D ; G 479 +U 542 ; WX 945 ; N uni021E ; G 480 +U 543 ; WX 727 ; N uni021F ; G 481 +U 544 ; WX 872 ; N uni0220 ; G 482 +U 545 ; WX 791 ; N uni0221 ; G 483 +U 546 ; WX 703 ; N uni0222 ; G 484 +U 547 ; WX 616 ; N uni0223 ; G 485 +U 548 ; WX 730 ; N uni0224 ; G 486 +U 549 ; WX 568 ; N uni0225 ; G 487 +U 550 ; WX 776 ; N uni0226 ; G 488 +U 551 ; WX 648 ; N uni0227 ; G 489 +U 552 ; WX 762 ; N uni0228 ; G 490 +U 553 ; WX 636 ; N uni0229 ; G 491 +U 554 ; WX 871 ; N uni022A ; G 492 +U 555 ; WX 667 ; N uni022B ; G 493 +U 556 ; WX 871 ; N uni022C ; G 494 +U 557 ; WX 667 ; N uni022D ; G 495 +U 558 ; WX 871 ; N uni022E ; G 496 +U 559 ; WX 667 ; N uni022F ; G 497 +U 560 ; WX 871 ; N uni0230 ; G 498 +U 561 ; WX 667 ; N uni0231 ; G 499 +U 562 ; WX 714 ; N uni0232 ; G 500 +U 563 ; WX 581 ; N uni0233 ; G 501 +U 564 ; WX 573 ; N uni0234 ; G 502 +U 565 ; WX 922 ; N uni0235 ; G 503 +U 566 ; WX 564 ; N uni0236 ; G 504 +U 567 ; WX 362 ; N dotlessj ; G 505 +U 568 ; WX 1031 ; N uni0238 ; G 506 +U 569 ; WX 1031 ; N uni0239 ; G 507 +U 570 ; WX 776 ; N uni023A ; G 508 +U 571 ; WX 796 ; N uni023B ; G 509 +U 572 ; WX 609 ; N uni023C ; G 510 +U 573 ; WX 703 ; N uni023D ; G 511 +U 574 ; WX 744 ; N uni023E ; G 512 +U 575 ; WX 563 ; N uni023F ; G 513 +U 576 ; WX 568 ; N uni0240 ; G 514 +U 577 ; WX 660 ; N uni0241 ; G 515 +U 578 ; WX 547 ; N uni0242 ; G 516 +U 579 ; WX 845 ; N uni0243 ; G 517 +U 580 ; WX 872 ; N uni0244 ; G 518 +U 581 ; WX 776 ; N uni0245 ; G 519 +U 582 ; WX 762 ; N uni0246 ; G 520 +U 583 ; WX 636 ; N uni0247 ; G 521 +U 584 ; WX 473 ; N uni0248 ; G 522 +U 585 ; WX 387 ; N uni0249 ; G 523 +U 586 ; WX 848 ; N uni024A ; G 524 +U 587 ; WX 699 ; N uni024B ; G 525 +U 588 ; WX 831 ; N uni024C ; G 526 +U 589 ; WX 527 ; N uni024D ; G 527 +U 590 ; WX 714 ; N uni024E ; G 528 +U 591 ; WX 581 ; N uni024F ; G 529 +U 592 ; WX 648 ; N uni0250 ; G 530 +U 593 ; WX 770 ; N uni0251 ; G 531 +U 594 ; WX 770 ; N uni0252 ; G 532 +U 595 ; WX 699 ; N uni0253 ; G 533 +U 596 ; WX 609 ; N uni0254 ; G 534 +U 597 ; WX 609 ; N uni0255 ; G 535 +U 598 ; WX 699 ; N uni0256 ; G 536 +U 599 ; WX 730 ; N uni0257 ; G 537 +U 600 ; WX 636 ; N uni0258 ; G 538 +U 601 ; WX 636 ; N uni0259 ; G 539 +U 602 ; WX 907 ; N uni025A ; G 540 +U 603 ; WX 608 ; N uni025B ; G 541 +U 604 ; WX 562 ; N uni025C ; G 542 +U 605 ; WX 907 ; N uni025D ; G 543 +U 606 ; WX 714 ; N uni025E ; G 544 +U 607 ; WX 387 ; N uni025F ; G 545 +U 608 ; WX 699 ; N uni0260 ; G 546 +U 609 ; WX 699 ; N uni0261 ; G 547 +U 610 ; WX 638 ; N uni0262 ; G 548 +U 611 ; WX 601 ; N uni0263 ; G 549 +U 612 ; WX 627 ; N uni0264 ; G 550 +U 613 ; WX 727 ; N uni0265 ; G 551 +U 614 ; WX 727 ; N uni0266 ; G 552 +U 615 ; WX 727 ; N uni0267 ; G 553 +U 616 ; WX 380 ; N uni0268 ; G 554 +U 617 ; WX 380 ; N uni0269 ; G 555 +U 618 ; WX 380 ; N uni026A ; G 556 +U 619 ; WX 409 ; N uni026B ; G 557 +U 620 ; WX 514 ; N uni026C ; G 558 +U 621 ; WX 380 ; N uni026D ; G 559 +U 622 ; WX 795 ; N uni026E ; G 560 +U 623 ; WX 1058 ; N uni026F ; G 561 +U 624 ; WX 1058 ; N uni0270 ; G 562 +U 625 ; WX 1058 ; N uni0271 ; G 563 +U 626 ; WX 727 ; N uni0272 ; G 564 +U 627 ; WX 727 ; N uni0273 ; G 565 +U 628 ; WX 712 ; N uni0274 ; G 566 +U 629 ; WX 667 ; N uni0275 ; G 567 +U 630 ; WX 1061 ; N uni0276 ; G 568 +U 631 ; WX 944 ; N uni0277 ; G 569 +U 632 ; WX 797 ; N uni0278 ; G 570 +U 633 ; WX 571 ; N uni0279 ; G 571 +U 634 ; WX 571 ; N uni027A ; G 572 +U 635 ; WX 571 ; N uni027B ; G 573 +U 636 ; WX 527 ; N uni027C ; G 574 +U 637 ; WX 527 ; N uni027D ; G 575 +U 638 ; WX 452 ; N uni027E ; G 576 +U 639 ; WX 487 ; N uni027F ; G 577 +U 640 ; WX 694 ; N uni0280 ; G 578 +U 641 ; WX 694 ; N uni0281 ; G 579 +U 642 ; WX 563 ; N uni0282 ; G 580 +U 643 ; WX 331 ; N uni0283 ; G 581 +U 644 ; WX 430 ; N uni0284 ; G 582 +U 645 ; WX 540 ; N uni0285 ; G 583 +U 646 ; WX 331 ; N uni0286 ; G 584 +U 647 ; WX 492 ; N uni0287 ; G 585 +U 648 ; WX 462 ; N uni0288 ; G 586 +U 649 ; WX 727 ; N uni0289 ; G 587 +U 650 ; WX 679 ; N uni028A ; G 588 +U 651 ; WX 694 ; N uni028B ; G 589 +U 652 ; WX 581 ; N uni028C ; G 590 +U 653 ; WX 861 ; N uni028D ; G 591 +U 654 ; WX 635 ; N uni028E ; G 592 +U 655 ; WX 727 ; N uni028F ; G 593 +U 656 ; WX 568 ; N uni0290 ; G 594 +U 657 ; WX 568 ; N uni0291 ; G 595 +U 658 ; WX 568 ; N uni0292 ; G 596 +U 659 ; WX 568 ; N uni0293 ; G 597 +U 660 ; WX 551 ; N uni0294 ; G 598 +U 661 ; WX 551 ; N uni0295 ; G 599 +U 662 ; WX 551 ; N uni0296 ; G 600 +U 663 ; WX 545 ; N uni0297 ; G 601 +U 664 ; WX 871 ; N uni0298 ; G 602 +U 665 ; WX 695 ; N uni0299 ; G 603 +U 666 ; WX 714 ; N uni029A ; G 604 +U 667 ; WX 689 ; N uni029B ; G 605 +U 668 ; WX 732 ; N uni029C ; G 606 +U 669 ; WX 384 ; N uni029D ; G 607 +U 670 ; WX 740 ; N uni029E ; G 608 +U 671 ; WX 617 ; N uni029F ; G 609 +U 672 ; WX 699 ; N uni02A0 ; G 610 +U 673 ; WX 551 ; N uni02A1 ; G 611 +U 674 ; WX 551 ; N uni02A2 ; G 612 +U 675 ; WX 1117 ; N uni02A3 ; G 613 +U 676 ; WX 1179 ; N uni02A4 ; G 614 +U 677 ; WX 1117 ; N uni02A5 ; G 615 +U 678 ; WX 938 ; N uni02A6 ; G 616 +U 679 ; WX 715 ; N uni02A7 ; G 617 +U 680 ; WX 946 ; N uni02A8 ; G 618 +U 681 ; WX 1039 ; N uni02A9 ; G 619 +U 682 ; WX 870 ; N uni02AA ; G 620 +U 683 ; WX 795 ; N uni02AB ; G 621 +U 684 ; WX 662 ; N uni02AC ; G 622 +U 685 ; WX 443 ; N uni02AD ; G 623 +U 686 ; WX 613 ; N uni02AE ; G 624 +U 687 ; WX 717 ; N uni02AF ; G 625 +U 688 ; WX 521 ; N uni02B0 ; G 626 +U 689 ; WX 519 ; N uni02B1 ; G 627 +U 690 ; WX 313 ; N uni02B2 ; G 628 +U 691 ; WX 414 ; N uni02B3 ; G 629 +U 692 ; WX 414 ; N uni02B4 ; G 630 +U 693 ; WX 480 ; N uni02B5 ; G 631 +U 694 ; WX 527 ; N uni02B6 ; G 632 +U 695 ; WX 542 ; N uni02B7 ; G 633 +U 696 ; WX 366 ; N uni02B8 ; G 634 +U 697 ; WX 302 ; N uni02B9 ; G 635 +U 698 ; WX 521 ; N uni02BA ; G 636 +U 699 ; WX 348 ; N uni02BB ; G 637 +U 700 ; WX 348 ; N uni02BC ; G 638 +U 701 ; WX 348 ; N uni02BD ; G 639 +U 702 ; WX 366 ; N uni02BE ; G 640 +U 703 ; WX 366 ; N uni02BF ; G 641 +U 704 ; WX 313 ; N uni02C0 ; G 642 +U 705 ; WX 313 ; N uni02C1 ; G 643 +U 706 ; WX 500 ; N uni02C2 ; G 644 +U 707 ; WX 500 ; N uni02C3 ; G 645 +U 708 ; WX 500 ; N uni02C4 ; G 646 +U 709 ; WX 500 ; N uni02C5 ; G 647 +U 710 ; WX 500 ; N circumflex ; G 648 +U 711 ; WX 500 ; N caron ; G 649 +U 712 ; WX 282 ; N uni02C8 ; G 650 +U 713 ; WX 500 ; N uni02C9 ; G 651 +U 714 ; WX 500 ; N uni02CA ; G 652 +U 715 ; WX 500 ; N uni02CB ; G 653 +U 716 ; WX 282 ; N uni02CC ; G 654 +U 717 ; WX 500 ; N uni02CD ; G 655 +U 720 ; WX 369 ; N uni02D0 ; G 656 +U 721 ; WX 369 ; N uni02D1 ; G 657 +U 722 ; WX 366 ; N uni02D2 ; G 658 +U 723 ; WX 366 ; N uni02D3 ; G 659 +U 726 ; WX 392 ; N uni02D6 ; G 660 +U 727 ; WX 392 ; N uni02D7 ; G 661 +U 728 ; WX 500 ; N breve ; G 662 +U 729 ; WX 500 ; N dotaccent ; G 663 +U 730 ; WX 500 ; N ring ; G 664 +U 731 ; WX 500 ; N ogonek ; G 665 +U 732 ; WX 500 ; N tilde ; G 666 +U 733 ; WX 500 ; N hungarumlaut ; G 667 +U 734 ; WX 417 ; N uni02DE ; G 668 +U 736 ; WX 378 ; N uni02E0 ; G 669 +U 737 ; WX 292 ; N uni02E1 ; G 670 +U 738 ; WX 395 ; N uni02E2 ; G 671 +U 739 ; WX 375 ; N uni02E3 ; G 672 +U 740 ; WX 313 ; N uni02E4 ; G 673 +U 741 ; WX 500 ; N uni02E5 ; G 674 +U 742 ; WX 500 ; N uni02E6 ; G 675 +U 743 ; WX 500 ; N uni02E7 ; G 676 +U 744 ; WX 500 ; N uni02E8 ; G 677 +U 745 ; WX 500 ; N uni02E9 ; G 678 +U 748 ; WX 500 ; N uni02EC ; G 679 +U 750 ; WX 553 ; N uni02EE ; G 680 +U 751 ; WX 500 ; N uni02EF ; G 681 +U 752 ; WX 500 ; N uni02F0 ; G 682 +U 755 ; WX 500 ; N uni02F3 ; G 683 +U 759 ; WX 500 ; N uni02F7 ; G 684 +U 768 ; WX 0 ; N gravecomb ; G 685 +U 769 ; WX 0 ; N acutecomb ; G 686 +U 770 ; WX 0 ; N uni0302 ; G 687 +U 771 ; WX 0 ; N tildecomb ; G 688 +U 772 ; WX 0 ; N uni0304 ; G 689 +U 773 ; WX 0 ; N uni0305 ; G 690 +U 774 ; WX 0 ; N uni0306 ; G 691 +U 775 ; WX 0 ; N uni0307 ; G 692 +U 776 ; WX 0 ; N uni0308 ; G 693 +U 777 ; WX 0 ; N hookabovecomb ; G 694 +U 778 ; WX 0 ; N uni030A ; G 695 +U 779 ; WX 0 ; N uni030B ; G 696 +U 780 ; WX 0 ; N uni030C ; G 697 +U 781 ; WX 0 ; N uni030D ; G 698 +U 782 ; WX 0 ; N uni030E ; G 699 +U 783 ; WX 0 ; N uni030F ; G 700 +U 784 ; WX 0 ; N uni0310 ; G 701 +U 785 ; WX 0 ; N uni0311 ; G 702 +U 786 ; WX 0 ; N uni0312 ; G 703 +U 787 ; WX 0 ; N uni0313 ; G 704 +U 788 ; WX 0 ; N uni0314 ; G 705 +U 789 ; WX 0 ; N uni0315 ; G 706 +U 790 ; WX 0 ; N uni0316 ; G 707 +U 791 ; WX 0 ; N uni0317 ; G 708 +U 792 ; WX 0 ; N uni0318 ; G 709 +U 793 ; WX 0 ; N uni0319 ; G 710 +U 794 ; WX 0 ; N uni031A ; G 711 +U 795 ; WX 0 ; N uni031B ; G 712 +U 796 ; WX 0 ; N uni031C ; G 713 +U 797 ; WX 0 ; N uni031D ; G 714 +U 798 ; WX 0 ; N uni031E ; G 715 +U 799 ; WX 0 ; N uni031F ; G 716 +U 800 ; WX 0 ; N uni0320 ; G 717 +U 801 ; WX 0 ; N uni0321 ; G 718 +U 802 ; WX 0 ; N uni0322 ; G 719 +U 803 ; WX 0 ; N dotbelowcomb ; G 720 +U 804 ; WX 0 ; N uni0324 ; G 721 +U 805 ; WX 0 ; N uni0325 ; G 722 +U 806 ; WX 0 ; N uni0326 ; G 723 +U 807 ; WX 0 ; N uni0327 ; G 724 +U 808 ; WX 0 ; N uni0328 ; G 725 +U 809 ; WX 0 ; N uni0329 ; G 726 +U 810 ; WX 0 ; N uni032A ; G 727 +U 811 ; WX 0 ; N uni032B ; G 728 +U 812 ; WX 0 ; N uni032C ; G 729 +U 813 ; WX 0 ; N uni032D ; G 730 +U 814 ; WX 0 ; N uni032E ; G 731 +U 815 ; WX 0 ; N uni032F ; G 732 +U 816 ; WX 0 ; N uni0330 ; G 733 +U 817 ; WX 0 ; N uni0331 ; G 734 +U 818 ; WX 0 ; N uni0332 ; G 735 +U 819 ; WX 0 ; N uni0333 ; G 736 +U 820 ; WX 0 ; N uni0334 ; G 737 +U 821 ; WX 0 ; N uni0335 ; G 738 +U 822 ; WX 0 ; N uni0336 ; G 739 +U 823 ; WX 0 ; N uni0337 ; G 740 +U 824 ; WX 0 ; N uni0338 ; G 741 +U 825 ; WX 0 ; N uni0339 ; G 742 +U 826 ; WX 0 ; N uni033A ; G 743 +U 827 ; WX 0 ; N uni033B ; G 744 +U 828 ; WX 0 ; N uni033C ; G 745 +U 829 ; WX 0 ; N uni033D ; G 746 +U 830 ; WX 0 ; N uni033E ; G 747 +U 831 ; WX 0 ; N uni033F ; G 748 +U 835 ; WX 0 ; N uni0343 ; G 749 +U 847 ; WX 0 ; N uni034F ; G 750 +U 856 ; WX 0 ; N uni0358 ; G 751 +U 864 ; WX 0 ; N uni0360 ; G 752 +U 865 ; WX 0 ; N uni0361 ; G 753 +U 880 ; WX 779 ; N uni0370 ; G 754 +U 881 ; WX 576 ; N uni0371 ; G 755 +U 882 ; WX 803 ; N uni0372 ; G 756 +U 883 ; WX 777 ; N uni0373 ; G 757 +U 884 ; WX 302 ; N uni0374 ; G 758 +U 885 ; WX 302 ; N uni0375 ; G 759 +U 886 ; WX 963 ; N uni0376 ; G 760 +U 887 ; WX 737 ; N uni0377 ; G 761 +U 890 ; WX 500 ; N uni037A ; G 762 +U 891 ; WX 609 ; N uni037B ; G 763 +U 892 ; WX 609 ; N uni037C ; G 764 +U 893 ; WX 609 ; N uni037D ; G 765 +U 894 ; WX 369 ; N uni037E ; G 766 +U 895 ; WX 473 ; N uni037F ; G 767 +U 900 ; WX 500 ; N tonos ; G 768 +U 901 ; WX 500 ; N dieresistonos ; G 769 +U 902 ; WX 776 ; N Alphatonos ; G 770 +U 903 ; WX 348 ; N anoteleia ; G 771 +U 904 ; WX 947 ; N Epsilontonos ; G 772 +U 905 ; WX 1136 ; N Etatonos ; G 773 +U 906 ; WX 662 ; N Iotatonos ; G 774 +U 908 ; WX 887 ; N Omicrontonos ; G 775 +U 910 ; WX 953 ; N Upsilontonos ; G 776 +U 911 ; WX 911 ; N Omegatonos ; G 777 +U 912 ; WX 484 ; N iotadieresistonos ; G 778 +U 913 ; WX 776 ; N Alpha ; G 779 +U 914 ; WX 845 ; N Beta ; G 780 +U 915 ; WX 710 ; N Gamma ; G 781 +U 916 ; WX 776 ; N uni0394 ; G 782 +U 917 ; WX 762 ; N Epsilon ; G 783 +U 918 ; WX 730 ; N Zeta ; G 784 +U 919 ; WX 945 ; N Eta ; G 785 +U 920 ; WX 871 ; N Theta ; G 786 +U 921 ; WX 468 ; N Iota ; G 787 +U 922 ; WX 869 ; N Kappa ; G 788 +U 923 ; WX 776 ; N Lambda ; G 789 +U 924 ; WX 1107 ; N Mu ; G 790 +U 925 ; WX 914 ; N Nu ; G 791 +U 926 ; WX 704 ; N Xi ; G 792 +U 927 ; WX 871 ; N Omicron ; G 793 +U 928 ; WX 945 ; N Pi ; G 794 +U 929 ; WX 752 ; N Rho ; G 795 +U 931 ; WX 707 ; N Sigma ; G 796 +U 932 ; WX 744 ; N Tau ; G 797 +U 933 ; WX 714 ; N Upsilon ; G 798 +U 934 ; WX 871 ; N Phi ; G 799 +U 935 ; WX 776 ; N Chi ; G 800 +U 936 ; WX 913 ; N Psi ; G 801 +U 937 ; WX 890 ; N Omega ; G 802 +U 938 ; WX 468 ; N Iotadieresis ; G 803 +U 939 ; WX 714 ; N Upsilondieresis ; G 804 +U 940 ; WX 770 ; N alphatonos ; G 805 +U 941 ; WX 608 ; N epsilontonos ; G 806 +U 942 ; WX 727 ; N etatonos ; G 807 +U 943 ; WX 484 ; N iotatonos ; G 808 +U 944 ; WX 694 ; N upsilondieresistonos ; G 809 +U 945 ; WX 770 ; N alpha ; G 810 +U 946 ; WX 664 ; N beta ; G 811 +U 947 ; WX 660 ; N gamma ; G 812 +U 948 ; WX 667 ; N delta ; G 813 +U 949 ; WX 608 ; N epsilon ; G 814 +U 950 ; WX 592 ; N zeta ; G 815 +U 951 ; WX 727 ; N eta ; G 816 +U 952 ; WX 667 ; N theta ; G 817 +U 953 ; WX 484 ; N iota ; G 818 +U 954 ; WX 750 ; N kappa ; G 819 +U 955 ; WX 701 ; N lambda ; G 820 +U 956 ; WX 732 ; N uni03BC ; G 821 +U 957 ; WX 694 ; N nu ; G 822 +U 958 ; WX 592 ; N xi ; G 823 +U 959 ; WX 667 ; N omicron ; G 824 +U 960 ; WX 732 ; N pi ; G 825 +U 961 ; WX 665 ; N rho ; G 826 +U 962 ; WX 609 ; N sigma1 ; G 827 +U 963 ; WX 737 ; N sigma ; G 828 +U 964 ; WX 673 ; N tau ; G 829 +U 965 ; WX 694 ; N upsilon ; G 830 +U 966 ; WX 905 ; N phi ; G 831 +U 967 ; WX 658 ; N chi ; G 832 +U 968 ; WX 941 ; N psi ; G 833 +U 969 ; WX 952 ; N omega ; G 834 +U 970 ; WX 484 ; N iotadieresis ; G 835 +U 971 ; WX 694 ; N upsilondieresis ; G 836 +U 972 ; WX 667 ; N omicrontonos ; G 837 +U 973 ; WX 694 ; N upsilontonos ; G 838 +U 974 ; WX 952 ; N omegatonos ; G 839 +U 975 ; WX 869 ; N uni03CF ; G 840 +U 976 ; WX 667 ; N uni03D0 ; G 841 +U 977 ; WX 849 ; N theta1 ; G 842 +U 978 ; WX 764 ; N Upsilon1 ; G 843 +U 979 ; WX 969 ; N uni03D3 ; G 844 +U 980 ; WX 764 ; N uni03D4 ; G 845 +U 981 ; WX 941 ; N phi1 ; G 846 +U 982 ; WX 952 ; N omega1 ; G 847 +U 983 ; WX 655 ; N uni03D7 ; G 848 +U 984 ; WX 871 ; N uni03D8 ; G 849 +U 985 ; WX 667 ; N uni03D9 ; G 850 +U 986 ; WX 796 ; N uni03DA ; G 851 +U 987 ; WX 609 ; N uni03DB ; G 852 +U 988 ; WX 710 ; N uni03DC ; G 853 +U 989 ; WX 527 ; N uni03DD ; G 854 +U 990 ; WX 590 ; N uni03DE ; G 855 +U 991 ; WX 660 ; N uni03DF ; G 856 +U 992 ; WX 796 ; N uni03E0 ; G 857 +U 993 ; WX 667 ; N uni03E1 ; G 858 +U 1008 ; WX 655 ; N uni03F0 ; G 859 +U 1009 ; WX 665 ; N uni03F1 ; G 860 +U 1010 ; WX 609 ; N uni03F2 ; G 861 +U 1011 ; WX 362 ; N uni03F3 ; G 862 +U 1012 ; WX 871 ; N uni03F4 ; G 863 +U 1013 ; WX 609 ; N uni03F5 ; G 864 +U 1014 ; WX 609 ; N uni03F6 ; G 865 +U 1015 ; WX 757 ; N uni03F7 ; G 866 +U 1016 ; WX 699 ; N uni03F8 ; G 867 +U 1017 ; WX 796 ; N uni03F9 ; G 868 +U 1018 ; WX 1107 ; N uni03FA ; G 869 +U 1019 ; WX 860 ; N uni03FB ; G 870 +U 1020 ; WX 692 ; N uni03FC ; G 871 +U 1021 ; WX 796 ; N uni03FD ; G 872 +U 1022 ; WX 796 ; N uni03FE ; G 873 +U 1023 ; WX 796 ; N uni03FF ; G 874 +U 1024 ; WX 762 ; N uni0400 ; G 875 +U 1025 ; WX 762 ; N uni0401 ; G 876 +U 1026 ; WX 901 ; N uni0402 ; G 877 +U 1027 ; WX 690 ; N uni0403 ; G 878 +U 1028 ; WX 795 ; N uni0404 ; G 879 +U 1029 ; WX 722 ; N uni0405 ; G 880 +U 1030 ; WX 468 ; N uni0406 ; G 881 +U 1031 ; WX 468 ; N uni0407 ; G 882 +U 1032 ; WX 473 ; N uni0408 ; G 883 +U 1033 ; WX 1202 ; N uni0409 ; G 884 +U 1034 ; WX 1262 ; N uni040A ; G 885 +U 1035 ; WX 963 ; N uni040B ; G 886 +U 1036 ; WX 910 ; N uni040C ; G 887 +U 1037 ; WX 945 ; N uni040D ; G 888 +U 1038 ; WX 812 ; N uni040E ; G 889 +U 1039 ; WX 945 ; N uni040F ; G 890 +U 1040 ; WX 814 ; N uni0410 ; G 891 +U 1041 ; WX 854 ; N uni0411 ; G 892 +U 1042 ; WX 845 ; N uni0412 ; G 893 +U 1043 ; WX 690 ; N uni0413 ; G 894 +U 1044 ; WX 889 ; N uni0414 ; G 895 +U 1045 ; WX 762 ; N uni0415 ; G 896 +U 1046 ; WX 1312 ; N uni0416 ; G 897 +U 1047 ; WX 721 ; N uni0417 ; G 898 +U 1048 ; WX 945 ; N uni0418 ; G 899 +U 1049 ; WX 945 ; N uni0419 ; G 900 +U 1050 ; WX 910 ; N uni041A ; G 901 +U 1051 ; WX 884 ; N uni041B ; G 902 +U 1052 ; WX 1107 ; N uni041C ; G 903 +U 1053 ; WX 945 ; N uni041D ; G 904 +U 1054 ; WX 871 ; N uni041E ; G 905 +U 1055 ; WX 945 ; N uni041F ; G 906 +U 1056 ; WX 752 ; N uni0420 ; G 907 +U 1057 ; WX 796 ; N uni0421 ; G 908 +U 1058 ; WX 744 ; N uni0422 ; G 909 +U 1059 ; WX 812 ; N uni0423 ; G 910 +U 1060 ; WX 949 ; N uni0424 ; G 911 +U 1061 ; WX 776 ; N uni0425 ; G 912 +U 1062 ; WX 966 ; N uni0426 ; G 913 +U 1063 ; WX 913 ; N uni0427 ; G 914 +U 1064 ; WX 1268 ; N uni0428 ; G 915 +U 1065 ; WX 1293 ; N uni0429 ; G 916 +U 1066 ; WX 957 ; N uni042A ; G 917 +U 1067 ; WX 1202 ; N uni042B ; G 918 +U 1068 ; WX 825 ; N uni042C ; G 919 +U 1069 ; WX 795 ; N uni042D ; G 920 +U 1070 ; WX 1287 ; N uni042E ; G 921 +U 1071 ; WX 882 ; N uni042F ; G 922 +U 1072 ; WX 648 ; N uni0430 ; G 923 +U 1073 ; WX 722 ; N uni0431 ; G 924 +U 1074 ; WX 657 ; N uni0432 ; G 925 +U 1075 ; WX 563 ; N uni0433 ; G 926 +U 1076 ; WX 695 ; N uni0434 ; G 927 +U 1077 ; WX 636 ; N uni0435 ; G 928 +U 1078 ; WX 1306 ; N uni0436 ; G 929 +U 1079 ; WX 638 ; N uni0437 ; G 930 +U 1080 ; WX 727 ; N uni0438 ; G 931 +U 1081 ; WX 727 ; N uni0439 ; G 932 +U 1082 ; WX 677 ; N uni043A ; G 933 +U 1083 ; WX 732 ; N uni043B ; G 934 +U 1084 ; WX 951 ; N uni043C ; G 935 +U 1085 ; WX 729 ; N uni043D ; G 936 +U 1086 ; WX 667 ; N uni043E ; G 937 +U 1087 ; WX 727 ; N uni043F ; G 938 +U 1088 ; WX 699 ; N uni0440 ; G 939 +U 1089 ; WX 609 ; N uni0441 ; G 940 +U 1090 ; WX 1058 ; N uni0442 ; G 941 +U 1091 ; WX 598 ; N uni0443 ; G 942 +U 1092 ; WX 902 ; N uni0444 ; G 943 +U 1093 ; WX 596 ; N uni0445 ; G 944 +U 1094 ; WX 803 ; N uni0446 ; G 945 +U 1095 ; WX 715 ; N uni0447 ; G 946 +U 1096 ; WX 1058 ; N uni0448 ; G 947 +U 1097 ; WX 1134 ; N uni0449 ; G 948 +U 1098 ; WX 727 ; N uni044A ; G 949 +U 1099 ; WX 1018 ; N uni044B ; G 950 +U 1100 ; WX 660 ; N uni044C ; G 951 +U 1101 ; WX 645 ; N uni044D ; G 952 +U 1102 ; WX 1001 ; N uni044E ; G 953 +U 1103 ; WX 796 ; N uni044F ; G 954 +U 1104 ; WX 636 ; N uni0450 ; G 955 +U 1105 ; WX 636 ; N uni0451 ; G 956 +U 1106 ; WX 719 ; N uni0452 ; G 957 +U 1107 ; WX 563 ; N uni0453 ; G 958 +U 1108 ; WX 609 ; N uni0454 ; G 959 +U 1109 ; WX 563 ; N uni0455 ; G 960 +U 1110 ; WX 380 ; N uni0456 ; G 961 +U 1111 ; WX 380 ; N uni0457 ; G 962 +U 1112 ; WX 362 ; N uni0458 ; G 963 +U 1113 ; WX 1014 ; N uni0459 ; G 964 +U 1114 ; WX 1011 ; N uni045A ; G 965 +U 1115 ; WX 727 ; N uni045B ; G 966 +U 1116 ; WX 677 ; N uni045C ; G 967 +U 1117 ; WX 727 ; N uni045D ; G 968 +U 1118 ; WX 598 ; N uni045E ; G 969 +U 1119 ; WX 727 ; N uni045F ; G 970 +U 1122 ; WX 880 ; N uni0462 ; G 971 +U 1123 ; WX 1050 ; N uni0463 ; G 972 +U 1124 ; WX 1195 ; N uni0464 ; G 973 +U 1125 ; WX 963 ; N uni0465 ; G 974 +U 1130 ; WX 1312 ; N uni046A ; G 975 +U 1131 ; WX 1010 ; N uni046B ; G 976 +U 1132 ; WX 1630 ; N uni046C ; G 977 +U 1133 ; WX 1247 ; N uni046D ; G 978 +U 1136 ; WX 1096 ; N uni0470 ; G 979 +U 1137 ; WX 1105 ; N uni0471 ; G 980 +U 1138 ; WX 871 ; N uni0472 ; G 981 +U 1139 ; WX 652 ; N uni0473 ; G 982 +U 1140 ; WX 916 ; N uni0474 ; G 983 +U 1141 ; WX 749 ; N uni0475 ; G 984 +U 1142 ; WX 916 ; N uni0476 ; G 985 +U 1143 ; WX 749 ; N uni0477 ; G 986 +U 1164 ; WX 846 ; N uni048C ; G 987 +U 1165 ; WX 673 ; N uni048D ; G 988 +U 1168 ; WX 700 ; N uni0490 ; G 989 +U 1169 ; WX 618 ; N uni0491 ; G 990 +U 1170 ; WX 690 ; N uni0492 ; G 991 +U 1171 ; WX 563 ; N uni0493 ; G 992 +U 1172 ; WX 854 ; N uni0494 ; G 993 +U 1173 ; WX 705 ; N uni0495 ; G 994 +U 1174 ; WX 1312 ; N uni0496 ; G 995 +U 1175 ; WX 1306 ; N uni0497 ; G 996 +U 1176 ; WX 721 ; N uni0498 ; G 997 +U 1177 ; WX 638 ; N uni0499 ; G 998 +U 1178 ; WX 902 ; N uni049A ; G 999 +U 1179 ; WX 703 ; N uni049B ; G 1000 +U 1182 ; WX 910 ; N uni049E ; G 1001 +U 1183 ; WX 677 ; N uni049F ; G 1002 +U 1184 ; WX 1041 ; N uni04A0 ; G 1003 +U 1185 ; WX 760 ; N uni04A1 ; G 1004 +U 1186 ; WX 952 ; N uni04A2 ; G 1005 +U 1187 ; WX 805 ; N uni04A3 ; G 1006 +U 1188 ; WX 1167 ; N uni04A4 ; G 1007 +U 1189 ; WX 955 ; N uni04A5 ; G 1008 +U 1190 ; WX 1324 ; N uni04A6 ; G 1009 +U 1191 ; WX 1013 ; N uni04A7 ; G 1010 +U 1194 ; WX 796 ; N uni04AA ; G 1011 +U 1195 ; WX 609 ; N uni04AB ; G 1012 +U 1196 ; WX 744 ; N uni04AC ; G 1013 +U 1197 ; WX 1142 ; N uni04AD ; G 1014 +U 1198 ; WX 714 ; N uni04AE ; G 1015 +U 1199 ; WX 572 ; N uni04AF ; G 1016 +U 1200 ; WX 713 ; N uni04B0 ; G 1017 +U 1201 ; WX 572 ; N uni04B1 ; G 1018 +U 1202 ; WX 789 ; N uni04B2 ; G 1019 +U 1203 ; WX 596 ; N uni04B3 ; G 1020 +U 1204 ; WX 1010 ; N uni04B4 ; G 1021 +U 1205 ; WX 833 ; N uni04B5 ; G 1022 +U 1206 ; WX 913 ; N uni04B6 ; G 1023 +U 1207 ; WX 792 ; N uni04B7 ; G 1024 +U 1210 ; WX 910 ; N uni04BA ; G 1025 +U 1211 ; WX 727 ; N uni04BB ; G 1026 +U 1216 ; WX 468 ; N uni04C0 ; G 1027 +U 1217 ; WX 1312 ; N uni04C1 ; G 1028 +U 1218 ; WX 1306 ; N uni04C2 ; G 1029 +U 1219 ; WX 869 ; N uni04C3 ; G 1030 +U 1220 ; WX 693 ; N uni04C4 ; G 1031 +U 1223 ; WX 945 ; N uni04C7 ; G 1032 +U 1224 ; WX 732 ; N uni04C8 ; G 1033 +U 1227 ; WX 984 ; N uni04CB ; G 1034 +U 1228 ; WX 732 ; N uni04CC ; G 1035 +U 1231 ; WX 380 ; N uni04CF ; G 1036 +U 1232 ; WX 814 ; N uni04D0 ; G 1037 +U 1233 ; WX 648 ; N uni04D1 ; G 1038 +U 1234 ; WX 814 ; N uni04D2 ; G 1039 +U 1235 ; WX 648 ; N uni04D3 ; G 1040 +U 1236 ; WX 1034 ; N uni04D4 ; G 1041 +U 1237 ; WX 975 ; N uni04D5 ; G 1042 +U 1238 ; WX 762 ; N uni04D6 ; G 1043 +U 1239 ; WX 636 ; N uni04D7 ; G 1044 +U 1240 ; WX 871 ; N uni04D8 ; G 1045 +U 1241 ; WX 636 ; N uni04D9 ; G 1046 +U 1242 ; WX 871 ; N uni04DA ; G 1047 +U 1243 ; WX 636 ; N uni04DB ; G 1048 +U 1244 ; WX 1312 ; N uni04DC ; G 1049 +U 1245 ; WX 1306 ; N uni04DD ; G 1050 +U 1246 ; WX 721 ; N uni04DE ; G 1051 +U 1247 ; WX 638 ; N uni04DF ; G 1052 +U 1248 ; WX 657 ; N uni04E0 ; G 1053 +U 1249 ; WX 568 ; N uni04E1 ; G 1054 +U 1250 ; WX 945 ; N uni04E2 ; G 1055 +U 1251 ; WX 727 ; N uni04E3 ; G 1056 +U 1252 ; WX 945 ; N uni04E4 ; G 1057 +U 1253 ; WX 727 ; N uni04E5 ; G 1058 +U 1254 ; WX 871 ; N uni04E6 ; G 1059 +U 1255 ; WX 667 ; N uni04E7 ; G 1060 +U 1256 ; WX 871 ; N uni04E8 ; G 1061 +U 1257 ; WX 667 ; N uni04E9 ; G 1062 +U 1258 ; WX 871 ; N uni04EA ; G 1063 +U 1259 ; WX 667 ; N uni04EB ; G 1064 +U 1260 ; WX 795 ; N uni04EC ; G 1065 +U 1261 ; WX 645 ; N uni04ED ; G 1066 +U 1262 ; WX 812 ; N uni04EE ; G 1067 +U 1263 ; WX 598 ; N uni04EF ; G 1068 +U 1264 ; WX 812 ; N uni04F0 ; G 1069 +U 1265 ; WX 598 ; N uni04F1 ; G 1070 +U 1266 ; WX 812 ; N uni04F2 ; G 1071 +U 1267 ; WX 598 ; N uni04F3 ; G 1072 +U 1268 ; WX 913 ; N uni04F4 ; G 1073 +U 1269 ; WX 715 ; N uni04F5 ; G 1074 +U 1270 ; WX 690 ; N uni04F6 ; G 1075 +U 1271 ; WX 563 ; N uni04F7 ; G 1076 +U 1272 ; WX 1202 ; N uni04F8 ; G 1077 +U 1273 ; WX 1018 ; N uni04F9 ; G 1078 +U 1296 ; WX 721 ; N uni0510 ; G 1079 +U 1297 ; WX 638 ; N uni0511 ; G 1080 +U 1298 ; WX 884 ; N uni0512 ; G 1081 +U 1299 ; WX 732 ; N uni0513 ; G 1082 +U 1300 ; WX 1248 ; N uni0514 ; G 1083 +U 1301 ; WX 1005 ; N uni0515 ; G 1084 +U 1306 ; WX 820 ; N uni051A ; G 1085 +U 1307 ; WX 640 ; N uni051B ; G 1086 +U 1308 ; WX 1028 ; N uni051C ; G 1087 +U 1309 ; WX 856 ; N uni051D ; G 1088 +U 1329 ; WX 942 ; N uni0531 ; G 1089 +U 1330 ; WX 832 ; N uni0532 ; G 1090 +U 1331 ; WX 894 ; N uni0533 ; G 1091 +U 1332 ; WX 909 ; N uni0534 ; G 1092 +U 1333 ; WX 822 ; N uni0535 ; G 1093 +U 1334 ; WX 821 ; N uni0536 ; G 1094 +U 1335 ; WX 747 ; N uni0537 ; G 1095 +U 1336 ; WX 832 ; N uni0538 ; G 1096 +U 1337 ; WX 1125 ; N uni0539 ; G 1097 +U 1338 ; WX 894 ; N uni053A ; G 1098 +U 1339 ; WX 803 ; N uni053B ; G 1099 +U 1340 ; WX 722 ; N uni053C ; G 1100 +U 1341 ; WX 1188 ; N uni053D ; G 1101 +U 1342 ; WX 887 ; N uni053E ; G 1102 +U 1343 ; WX 842 ; N uni053F ; G 1103 +U 1344 ; WX 737 ; N uni0540 ; G 1104 +U 1345 ; WX 863 ; N uni0541 ; G 1105 +U 1346 ; WX 918 ; N uni0542 ; G 1106 +U 1347 ; WX 851 ; N uni0543 ; G 1107 +U 1348 ; WX 977 ; N uni0544 ; G 1108 +U 1349 ; WX 833 ; N uni0545 ; G 1109 +U 1350 ; WX 914 ; N uni0546 ; G 1110 +U 1351 ; WX 843 ; N uni0547 ; G 1111 +U 1352 ; WX 871 ; N uni0548 ; G 1112 +U 1353 ; WX 818 ; N uni0549 ; G 1113 +U 1354 ; WX 1034 ; N uni054A ; G 1114 +U 1355 ; WX 846 ; N uni054B ; G 1115 +U 1356 ; WX 964 ; N uni054C ; G 1116 +U 1357 ; WX 871 ; N uni054D ; G 1117 +U 1358 ; WX 914 ; N uni054E ; G 1118 +U 1359 ; WX 808 ; N uni054F ; G 1119 +U 1360 ; WX 808 ; N uni0550 ; G 1120 +U 1361 ; WX 836 ; N uni0551 ; G 1121 +U 1362 ; WX 710 ; N uni0552 ; G 1122 +U 1363 ; WX 955 ; N uni0553 ; G 1123 +U 1364 ; WX 891 ; N uni0554 ; G 1124 +U 1365 ; WX 871 ; N uni0555 ; G 1125 +U 1366 ; WX 963 ; N uni0556 ; G 1126 +U 1369 ; WX 307 ; N uni0559 ; G 1127 +U 1370 ; WX 264 ; N uni055A ; G 1128 +U 1371 ; WX 293 ; N uni055B ; G 1129 +U 1372 ; WX 391 ; N uni055C ; G 1130 +U 1373 ; WX 323 ; N uni055D ; G 1131 +U 1374 ; WX 439 ; N uni055E ; G 1132 +U 1375 ; WX 500 ; N uni055F ; G 1133 +U 1377 ; WX 1055 ; N uni0561 ; G 1134 +U 1378 ; WX 695 ; N uni0562 ; G 1135 +U 1379 ; WX 776 ; N uni0563 ; G 1136 +U 1380 ; WX 801 ; N uni0564 ; G 1137 +U 1381 ; WX 729 ; N uni0565 ; G 1138 +U 1382 ; WX 742 ; N uni0566 ; G 1139 +U 1383 ; WX 599 ; N uni0567 ; G 1140 +U 1384 ; WX 733 ; N uni0568 ; G 1141 +U 1385 ; WX 909 ; N uni0569 ; G 1142 +U 1386 ; WX 768 ; N uni056A ; G 1143 +U 1387 ; WX 724 ; N uni056B ; G 1144 +U 1388 ; WX 398 ; N uni056C ; G 1145 +U 1389 ; WX 1087 ; N uni056D ; G 1146 +U 1390 ; WX 695 ; N uni056E ; G 1147 +U 1391 ; WX 719 ; N uni056F ; G 1148 +U 1392 ; WX 737 ; N uni0570 ; G 1149 +U 1393 ; WX 684 ; N uni0571 ; G 1150 +U 1394 ; WX 738 ; N uni0572 ; G 1151 +U 1395 ; WX 703 ; N uni0573 ; G 1152 +U 1396 ; WX 724 ; N uni0574 ; G 1153 +U 1397 ; WX 359 ; N uni0575 ; G 1154 +U 1398 ; WX 719 ; N uni0576 ; G 1155 +U 1399 ; WX 496 ; N uni0577 ; G 1156 +U 1400 ; WX 738 ; N uni0578 ; G 1157 +U 1401 ; WX 428 ; N uni0579 ; G 1158 +U 1402 ; WX 1059 ; N uni057A ; G 1159 +U 1403 ; WX 668 ; N uni057B ; G 1160 +U 1404 ; WX 744 ; N uni057C ; G 1161 +U 1405 ; WX 724 ; N uni057D ; G 1162 +U 1406 ; WX 724 ; N uni057E ; G 1163 +U 1407 ; WX 1040 ; N uni057F ; G 1164 +U 1408 ; WX 724 ; N uni0580 ; G 1165 +U 1409 ; WX 713 ; N uni0581 ; G 1166 +U 1410 ; WX 493 ; N uni0582 ; G 1167 +U 1411 ; WX 1040 ; N uni0583 ; G 1168 +U 1412 ; WX 734 ; N uni0584 ; G 1169 +U 1413 ; WX 693 ; N uni0585 ; G 1170 +U 1414 ; WX 956 ; N uni0586 ; G 1171 +U 1415 ; WX 833 ; N uni0587 ; G 1172 +U 1417 ; WX 340 ; N uni0589 ; G 1173 +U 1418 ; WX 388 ; N uni058A ; G 1174 +U 3647 ; WX 696 ; N uni0E3F ; G 1175 +U 4256 ; WX 765 ; N uni10A0 ; G 1176 +U 4257 ; WX 945 ; N uni10A1 ; G 1177 +U 4258 ; WX 876 ; N uni10A2 ; G 1178 +U 4259 ; WX 884 ; N uni10A3 ; G 1179 +U 4260 ; WX 791 ; N uni10A4 ; G 1180 +U 4261 ; WX 1087 ; N uni10A5 ; G 1181 +U 4262 ; WX 1024 ; N uni10A6 ; G 1182 +U 4263 ; WX 1223 ; N uni10A7 ; G 1183 +U 4264 ; WX 653 ; N uni10A8 ; G 1184 +U 4265 ; WX 828 ; N uni10A9 ; G 1185 +U 4266 ; WX 1061 ; N uni10AA ; G 1186 +U 4267 ; WX 1061 ; N uni10AB ; G 1187 +U 4268 ; WX 806 ; N uni10AC ; G 1188 +U 4269 ; WX 1145 ; N uni10AD ; G 1189 +U 4270 ; WX 979 ; N uni10AE ; G 1190 +U 4271 ; WX 912 ; N uni10AF ; G 1191 +U 4272 ; WX 1119 ; N uni10B0 ; G 1192 +U 4273 ; WX 802 ; N uni10B1 ; G 1193 +U 4274 ; WX 766 ; N uni10B2 ; G 1194 +U 4275 ; WX 1085 ; N uni10B3 ; G 1195 +U 4276 ; WX 986 ; N uni10B4 ; G 1196 +U 4277 ; WX 1076 ; N uni10B5 ; G 1197 +U 4278 ; WX 820 ; N uni10B6 ; G 1198 +U 4279 ; WX 843 ; N uni10B7 ; G 1199 +U 4280 ; WX 831 ; N uni10B8 ; G 1200 +U 4281 ; WX 843 ; N uni10B9 ; G 1201 +U 4282 ; WX 918 ; N uni10BA ; G 1202 +U 4283 ; WX 1086 ; N uni10BB ; G 1203 +U 4284 ; WX 779 ; N uni10BC ; G 1204 +U 4285 ; WX 832 ; N uni10BD ; G 1205 +U 4286 ; WX 822 ; N uni10BE ; G 1206 +U 4287 ; WX 1121 ; N uni10BF ; G 1207 +U 4288 ; WX 1132 ; N uni10C0 ; G 1208 +U 4289 ; WX 812 ; N uni10C1 ; G 1209 +U 4290 ; WX 902 ; N uni10C2 ; G 1210 +U 4291 ; WX 812 ; N uni10C3 ; G 1211 +U 4292 ; WX 890 ; N uni10C4 ; G 1212 +U 4293 ; WX 1073 ; N uni10C5 ; G 1213 +U 4304 ; WX 594 ; N uni10D0 ; G 1214 +U 4305 ; WX 625 ; N uni10D1 ; G 1215 +U 4306 ; WX 643 ; N uni10D2 ; G 1216 +U 4307 ; WX 887 ; N uni10D3 ; G 1217 +U 4308 ; WX 615 ; N uni10D4 ; G 1218 +U 4309 ; WX 611 ; N uni10D5 ; G 1219 +U 4310 ; WX 666 ; N uni10D6 ; G 1220 +U 4311 ; WX 915 ; N uni10D7 ; G 1221 +U 4312 ; WX 613 ; N uni10D8 ; G 1222 +U 4313 ; WX 600 ; N uni10D9 ; G 1223 +U 4314 ; WX 1120 ; N uni10DA ; G 1224 +U 4315 ; WX 654 ; N uni10DB ; G 1225 +U 4316 ; WX 640 ; N uni10DC ; G 1226 +U 4317 ; WX 879 ; N uni10DD ; G 1227 +U 4318 ; WX 624 ; N uni10DE ; G 1228 +U 4319 ; WX 634 ; N uni10DF ; G 1229 +U 4320 ; WX 877 ; N uni10E0 ; G 1230 +U 4321 ; WX 657 ; N uni10E1 ; G 1231 +U 4322 ; WX 802 ; N uni10E2 ; G 1232 +U 4323 ; WX 751 ; N uni10E3 ; G 1233 +U 4324 ; WX 869 ; N uni10E4 ; G 1234 +U 4325 ; WX 639 ; N uni10E5 ; G 1235 +U 4326 ; WX 912 ; N uni10E6 ; G 1236 +U 4327 ; WX 622 ; N uni10E7 ; G 1237 +U 4328 ; WX 647 ; N uni10E8 ; G 1238 +U 4329 ; WX 640 ; N uni10E9 ; G 1239 +U 4330 ; WX 729 ; N uni10EA ; G 1240 +U 4331 ; WX 641 ; N uni10EB ; G 1241 +U 4332 ; WX 639 ; N uni10EC ; G 1242 +U 4333 ; WX 629 ; N uni10ED ; G 1243 +U 4334 ; WX 674 ; N uni10EE ; G 1244 +U 4335 ; WX 737 ; N uni10EF ; G 1245 +U 4336 ; WX 625 ; N uni10F0 ; G 1246 +U 4337 ; WX 657 ; N uni10F1 ; G 1247 +U 4338 ; WX 625 ; N uni10F2 ; G 1248 +U 4339 ; WX 625 ; N uni10F3 ; G 1249 +U 4340 ; WX 624 ; N uni10F4 ; G 1250 +U 4341 ; WX 670 ; N uni10F5 ; G 1251 +U 4342 ; WX 940 ; N uni10F6 ; G 1252 +U 4343 ; WX 680 ; N uni10F7 ; G 1253 +U 4344 ; WX 636 ; N uni10F8 ; G 1254 +U 4345 ; WX 672 ; N uni10F9 ; G 1255 +U 4346 ; WX 625 ; N uni10FA ; G 1256 +U 4347 ; WX 446 ; N uni10FB ; G 1257 +U 4348 ; WX 363 ; N uni10FC ; G 1258 +U 7424 ; WX 641 ; N uni1D00 ; G 1259 +U 7425 ; WX 892 ; N uni1D01 ; G 1260 +U 7426 ; WX 932 ; N uni1D02 ; G 1261 +U 7427 ; WX 695 ; N uni1D03 ; G 1262 +U 7428 ; WX 609 ; N uni1D04 ; G 1263 +U 7429 ; WX 675 ; N uni1D05 ; G 1264 +U 7430 ; WX 675 ; N uni1D06 ; G 1265 +U 7431 ; WX 617 ; N uni1D07 ; G 1266 +U 7432 ; WX 509 ; N uni1D08 ; G 1267 +U 7433 ; WX 320 ; N uni1D09 ; G 1268 +U 7434 ; WX 561 ; N uni1D0A ; G 1269 +U 7435 ; WX 722 ; N uni1D0B ; G 1270 +U 7436 ; WX 617 ; N uni1D0C ; G 1271 +U 7437 ; WX 869 ; N uni1D0D ; G 1272 +U 7438 ; WX 737 ; N uni1D0E ; G 1273 +U 7439 ; WX 667 ; N uni1D0F ; G 1274 +U 7440 ; WX 609 ; N uni1D10 ; G 1275 +U 7441 ; WX 628 ; N uni1D11 ; G 1276 +U 7442 ; WX 628 ; N uni1D12 ; G 1277 +U 7443 ; WX 667 ; N uni1D13 ; G 1278 +U 7444 ; WX 1028 ; N uni1D14 ; G 1279 +U 7445 ; WX 598 ; N uni1D15 ; G 1280 +U 7446 ; WX 667 ; N uni1D16 ; G 1281 +U 7447 ; WX 667 ; N uni1D17 ; G 1282 +U 7448 ; WX 586 ; N uni1D18 ; G 1283 +U 7449 ; WX 801 ; N uni1D19 ; G 1284 +U 7450 ; WX 801 ; N uni1D1A ; G 1285 +U 7451 ; WX 620 ; N uni1D1B ; G 1286 +U 7452 ; WX 647 ; N uni1D1C ; G 1287 +U 7453 ; WX 664 ; N uni1D1D ; G 1288 +U 7454 ; WX 923 ; N uni1D1E ; G 1289 +U 7455 ; WX 655 ; N uni1D1F ; G 1290 +U 7456 ; WX 581 ; N uni1D20 ; G 1291 +U 7457 ; WX 861 ; N uni1D21 ; G 1292 +U 7458 ; WX 568 ; N uni1D22 ; G 1293 +U 7459 ; WX 568 ; N uni1D23 ; G 1294 +U 7460 ; WX 588 ; N uni1D24 ; G 1295 +U 7461 ; WX 802 ; N uni1D25 ; G 1296 +U 7462 ; WX 586 ; N uni1D26 ; G 1297 +U 7463 ; WX 641 ; N uni1D27 ; G 1298 +U 7464 ; WX 732 ; N uni1D28 ; G 1299 +U 7465 ; WX 586 ; N uni1D29 ; G 1300 +U 7466 ; WX 854 ; N uni1D2A ; G 1301 +U 7467 ; WX 705 ; N uni1D2B ; G 1302 +U 7468 ; WX 489 ; N uni1D2C ; G 1303 +U 7469 ; WX 651 ; N uni1D2D ; G 1304 +U 7470 ; WX 532 ; N uni1D2E ; G 1305 +U 7471 ; WX 532 ; N uni1D2F ; G 1306 +U 7472 ; WX 546 ; N uni1D30 ; G 1307 +U 7473 ; WX 480 ; N uni1D31 ; G 1308 +U 7474 ; WX 480 ; N uni1D32 ; G 1309 +U 7475 ; WX 538 ; N uni1D33 ; G 1310 +U 7476 ; WX 595 ; N uni1D34 ; G 1311 +U 7477 ; WX 294 ; N uni1D35 ; G 1312 +U 7478 ; WX 298 ; N uni1D36 ; G 1313 +U 7479 ; WX 547 ; N uni1D37 ; G 1314 +U 7480 ; WX 443 ; N uni1D38 ; G 1315 +U 7481 ; WX 697 ; N uni1D39 ; G 1316 +U 7482 ; WX 576 ; N uni1D3A ; G 1317 +U 7483 ; WX 606 ; N uni1D3B ; G 1318 +U 7484 ; WX 548 ; N uni1D3C ; G 1319 +U 7485 ; WX 442 ; N uni1D3D ; G 1320 +U 7486 ; WX 474 ; N uni1D3E ; G 1321 +U 7487 ; WX 523 ; N uni1D3F ; G 1322 +U 7488 ; WX 469 ; N uni1D40 ; G 1323 +U 7489 ; WX 549 ; N uni1D41 ; G 1324 +U 7490 ; WX 708 ; N uni1D42 ; G 1325 +U 7491 ; WX 408 ; N uni1D43 ; G 1326 +U 7492 ; WX 408 ; N uni1D44 ; G 1327 +U 7493 ; WX 484 ; N uni1D45 ; G 1328 +U 7494 ; WX 587 ; N uni1D46 ; G 1329 +U 7495 ; WX 499 ; N uni1D47 ; G 1330 +U 7496 ; WX 498 ; N uni1D48 ; G 1331 +U 7497 ; WX 444 ; N uni1D49 ; G 1332 +U 7498 ; WX 444 ; N uni1D4A ; G 1333 +U 7499 ; WX 412 ; N uni1D4B ; G 1334 +U 7500 ; WX 412 ; N uni1D4C ; G 1335 +U 7501 ; WX 498 ; N uni1D4D ; G 1336 +U 7502 ; WX 300 ; N uni1D4E ; G 1337 +U 7503 ; WX 523 ; N uni1D4F ; G 1338 +U 7504 ; WX 729 ; N uni1D50 ; G 1339 +U 7505 ; WX 473 ; N uni1D51 ; G 1340 +U 7506 ; WX 467 ; N uni1D52 ; G 1341 +U 7507 ; WX 427 ; N uni1D53 ; G 1342 +U 7508 ; WX 467 ; N uni1D54 ; G 1343 +U 7509 ; WX 467 ; N uni1D55 ; G 1344 +U 7510 ; WX 499 ; N uni1D56 ; G 1345 +U 7511 ; WX 371 ; N uni1D57 ; G 1346 +U 7512 ; WX 520 ; N uni1D58 ; G 1347 +U 7513 ; WX 418 ; N uni1D59 ; G 1348 +U 7514 ; WX 729 ; N uni1D5A ; G 1349 +U 7515 ; WX 491 ; N uni1D5B ; G 1350 +U 7516 ; WX 505 ; N uni1D5C ; G 1351 +U 7517 ; WX 418 ; N uni1D5D ; G 1352 +U 7518 ; WX 416 ; N uni1D5E ; G 1353 +U 7519 ; WX 420 ; N uni1D5F ; G 1354 +U 7520 ; WX 570 ; N uni1D60 ; G 1355 +U 7521 ; WX 414 ; N uni1D61 ; G 1356 +U 7522 ; WX 239 ; N uni1D62 ; G 1357 +U 7523 ; WX 414 ; N uni1D63 ; G 1358 +U 7524 ; WX 520 ; N uni1D64 ; G 1359 +U 7525 ; WX 491 ; N uni1D65 ; G 1360 +U 7526 ; WX 418 ; N uni1D66 ; G 1361 +U 7527 ; WX 416 ; N uni1D67 ; G 1362 +U 7528 ; WX 419 ; N uni1D68 ; G 1363 +U 7529 ; WX 570 ; N uni1D69 ; G 1364 +U 7530 ; WX 414 ; N uni1D6A ; G 1365 +U 7531 ; WX 1042 ; N uni1D6B ; G 1366 +U 7543 ; WX 640 ; N uni1D77 ; G 1367 +U 7544 ; WX 595 ; N uni1D78 ; G 1368 +U 7547 ; WX 380 ; N uni1D7B ; G 1369 +U 7548 ; WX 380 ; N uni1D7C ; G 1370 +U 7549 ; WX 699 ; N uni1D7D ; G 1371 +U 7550 ; WX 647 ; N uni1D7E ; G 1372 +U 7551 ; WX 679 ; N uni1D7F ; G 1373 +U 7557 ; WX 380 ; N uni1D85 ; G 1374 +U 7579 ; WX 484 ; N uni1D9B ; G 1375 +U 7580 ; WX 427 ; N uni1D9C ; G 1376 +U 7581 ; WX 427 ; N uni1D9D ; G 1377 +U 7582 ; WX 467 ; N uni1D9E ; G 1378 +U 7583 ; WX 412 ; N uni1D9F ; G 1379 +U 7584 ; WX 271 ; N uni1DA0 ; G 1380 +U 7585 ; WX 373 ; N uni1DA1 ; G 1381 +U 7586 ; WX 498 ; N uni1DA2 ; G 1382 +U 7587 ; WX 522 ; N uni1DA3 ; G 1383 +U 7588 ; WX 300 ; N uni1DA4 ; G 1384 +U 7589 ; WX 307 ; N uni1DA5 ; G 1385 +U 7590 ; WX 300 ; N uni1DA6 ; G 1386 +U 7591 ; WX 300 ; N uni1DA7 ; G 1387 +U 7592 ; WX 370 ; N uni1DA8 ; G 1388 +U 7593 ; WX 368 ; N uni1DA9 ; G 1389 +U 7594 ; WX 321 ; N uni1DAA ; G 1390 +U 7595 ; WX 430 ; N uni1DAB ; G 1391 +U 7596 ; WX 682 ; N uni1DAC ; G 1392 +U 7597 ; WX 729 ; N uni1DAD ; G 1393 +U 7598 ; WX 588 ; N uni1DAE ; G 1394 +U 7599 ; WX 587 ; N uni1DAF ; G 1395 +U 7600 ; WX 472 ; N uni1DB0 ; G 1396 +U 7601 ; WX 467 ; N uni1DB1 ; G 1397 +U 7602 ; WX 522 ; N uni1DB2 ; G 1398 +U 7603 ; WX 400 ; N uni1DB3 ; G 1399 +U 7604 ; WX 387 ; N uni1DB4 ; G 1400 +U 7605 ; WX 371 ; N uni1DB5 ; G 1401 +U 7606 ; WX 520 ; N uni1DB6 ; G 1402 +U 7607 ; WX 475 ; N uni1DB7 ; G 1403 +U 7608 ; WX 408 ; N uni1DB8 ; G 1404 +U 7609 ; WX 489 ; N uni1DB9 ; G 1405 +U 7610 ; WX 366 ; N uni1DBA ; G 1406 +U 7611 ; WX 357 ; N uni1DBB ; G 1407 +U 7612 ; WX 527 ; N uni1DBC ; G 1408 +U 7613 ; WX 412 ; N uni1DBD ; G 1409 +U 7614 ; WX 452 ; N uni1DBE ; G 1410 +U 7615 ; WX 467 ; N uni1DBF ; G 1411 +U 7620 ; WX 0 ; N uni1DC4 ; G 1412 +U 7621 ; WX 0 ; N uni1DC5 ; G 1413 +U 7622 ; WX 0 ; N uni1DC6 ; G 1414 +U 7623 ; WX 0 ; N uni1DC7 ; G 1415 +U 7624 ; WX 0 ; N uni1DC8 ; G 1416 +U 7625 ; WX 0 ; N uni1DC9 ; G 1417 +U 7680 ; WX 776 ; N uni1E00 ; G 1418 +U 7681 ; WX 648 ; N uni1E01 ; G 1419 +U 7682 ; WX 845 ; N uni1E02 ; G 1420 +U 7683 ; WX 699 ; N uni1E03 ; G 1421 +U 7684 ; WX 845 ; N uni1E04 ; G 1422 +U 7685 ; WX 699 ; N uni1E05 ; G 1423 +U 7686 ; WX 845 ; N uni1E06 ; G 1424 +U 7687 ; WX 699 ; N uni1E07 ; G 1425 +U 7688 ; WX 796 ; N uni1E08 ; G 1426 +U 7689 ; WX 609 ; N uni1E09 ; G 1427 +U 7690 ; WX 867 ; N uni1E0A ; G 1428 +U 7691 ; WX 699 ; N uni1E0B ; G 1429 +U 7692 ; WX 867 ; N uni1E0C ; G 1430 +U 7693 ; WX 699 ; N uni1E0D ; G 1431 +U 7694 ; WX 867 ; N uni1E0E ; G 1432 +U 7695 ; WX 699 ; N uni1E0F ; G 1433 +U 7696 ; WX 867 ; N uni1E10 ; G 1434 +U 7697 ; WX 699 ; N uni1E11 ; G 1435 +U 7698 ; WX 867 ; N uni1E12 ; G 1436 +U 7699 ; WX 699 ; N uni1E13 ; G 1437 +U 7700 ; WX 762 ; N uni1E14 ; G 1438 +U 7701 ; WX 636 ; N uni1E15 ; G 1439 +U 7702 ; WX 762 ; N uni1E16 ; G 1440 +U 7703 ; WX 636 ; N uni1E17 ; G 1441 +U 7704 ; WX 762 ; N uni1E18 ; G 1442 +U 7705 ; WX 636 ; N uni1E19 ; G 1443 +U 7706 ; WX 762 ; N uni1E1A ; G 1444 +U 7707 ; WX 636 ; N uni1E1B ; G 1445 +U 7708 ; WX 762 ; N uni1E1C ; G 1446 +U 7709 ; WX 636 ; N uni1E1D ; G 1447 +U 7710 ; WX 710 ; N uni1E1E ; G 1448 +U 7711 ; WX 430 ; N uni1E1F ; G 1449 +U 7712 ; WX 854 ; N uni1E20 ; G 1450 +U 7713 ; WX 699 ; N uni1E21 ; G 1451 +U 7714 ; WX 945 ; N uni1E22 ; G 1452 +U 7715 ; WX 727 ; N uni1E23 ; G 1453 +U 7716 ; WX 945 ; N uni1E24 ; G 1454 +U 7717 ; WX 727 ; N uni1E25 ; G 1455 +U 7718 ; WX 945 ; N uni1E26 ; G 1456 +U 7719 ; WX 727 ; N uni1E27 ; G 1457 +U 7720 ; WX 945 ; N uni1E28 ; G 1458 +U 7721 ; WX 727 ; N uni1E29 ; G 1459 +U 7722 ; WX 945 ; N uni1E2A ; G 1460 +U 7723 ; WX 727 ; N uni1E2B ; G 1461 +U 7724 ; WX 468 ; N uni1E2C ; G 1462 +U 7725 ; WX 380 ; N uni1E2D ; G 1463 +U 7726 ; WX 468 ; N uni1E2E ; G 1464 +U 7727 ; WX 380 ; N uni1E2F ; G 1465 +U 7728 ; WX 869 ; N uni1E30 ; G 1466 +U 7729 ; WX 693 ; N uni1E31 ; G 1467 +U 7730 ; WX 869 ; N uni1E32 ; G 1468 +U 7731 ; WX 693 ; N uni1E33 ; G 1469 +U 7732 ; WX 869 ; N uni1E34 ; G 1470 +U 7733 ; WX 693 ; N uni1E35 ; G 1471 +U 7734 ; WX 703 ; N uni1E36 ; G 1472 +U 7735 ; WX 380 ; N uni1E37 ; G 1473 +U 7736 ; WX 703 ; N uni1E38 ; G 1474 +U 7737 ; WX 380 ; N uni1E39 ; G 1475 +U 7738 ; WX 703 ; N uni1E3A ; G 1476 +U 7739 ; WX 380 ; N uni1E3B ; G 1477 +U 7740 ; WX 703 ; N uni1E3C ; G 1478 +U 7741 ; WX 380 ; N uni1E3D ; G 1479 +U 7742 ; WX 1107 ; N uni1E3E ; G 1480 +U 7743 ; WX 1058 ; N uni1E3F ; G 1481 +U 7744 ; WX 1107 ; N uni1E40 ; G 1482 +U 7745 ; WX 1058 ; N uni1E41 ; G 1483 +U 7746 ; WX 1107 ; N uni1E42 ; G 1484 +U 7747 ; WX 1058 ; N uni1E43 ; G 1485 +U 7748 ; WX 914 ; N uni1E44 ; G 1486 +U 7749 ; WX 727 ; N uni1E45 ; G 1487 +U 7750 ; WX 914 ; N uni1E46 ; G 1488 +U 7751 ; WX 727 ; N uni1E47 ; G 1489 +U 7752 ; WX 914 ; N uni1E48 ; G 1490 +U 7753 ; WX 727 ; N uni1E49 ; G 1491 +U 7754 ; WX 914 ; N uni1E4A ; G 1492 +U 7755 ; WX 727 ; N uni1E4B ; G 1493 +U 7756 ; WX 871 ; N uni1E4C ; G 1494 +U 7757 ; WX 667 ; N uni1E4D ; G 1495 +U 7758 ; WX 871 ; N uni1E4E ; G 1496 +U 7759 ; WX 667 ; N uni1E4F ; G 1497 +U 7760 ; WX 871 ; N uni1E50 ; G 1498 +U 7761 ; WX 667 ; N uni1E51 ; G 1499 +U 7762 ; WX 871 ; N uni1E52 ; G 1500 +U 7763 ; WX 667 ; N uni1E53 ; G 1501 +U 7764 ; WX 752 ; N uni1E54 ; G 1502 +U 7765 ; WX 699 ; N uni1E55 ; G 1503 +U 7766 ; WX 752 ; N uni1E56 ; G 1504 +U 7767 ; WX 699 ; N uni1E57 ; G 1505 +U 7768 ; WX 831 ; N uni1E58 ; G 1506 +U 7769 ; WX 527 ; N uni1E59 ; G 1507 +U 7770 ; WX 831 ; N uni1E5A ; G 1508 +U 7771 ; WX 527 ; N uni1E5B ; G 1509 +U 7772 ; WX 831 ; N uni1E5C ; G 1510 +U 7773 ; WX 527 ; N uni1E5D ; G 1511 +U 7774 ; WX 831 ; N uni1E5E ; G 1512 +U 7775 ; WX 527 ; N uni1E5F ; G 1513 +U 7776 ; WX 722 ; N uni1E60 ; G 1514 +U 7777 ; WX 563 ; N uni1E61 ; G 1515 +U 7778 ; WX 722 ; N uni1E62 ; G 1516 +U 7779 ; WX 563 ; N uni1E63 ; G 1517 +U 7780 ; WX 722 ; N uni1E64 ; G 1518 +U 7781 ; WX 563 ; N uni1E65 ; G 1519 +U 7782 ; WX 722 ; N uni1E66 ; G 1520 +U 7783 ; WX 563 ; N uni1E67 ; G 1521 +U 7784 ; WX 722 ; N uni1E68 ; G 1522 +U 7785 ; WX 563 ; N uni1E69 ; G 1523 +U 7786 ; WX 744 ; N uni1E6A ; G 1524 +U 7787 ; WX 462 ; N uni1E6B ; G 1525 +U 7788 ; WX 744 ; N uni1E6C ; G 1526 +U 7789 ; WX 462 ; N uni1E6D ; G 1527 +U 7790 ; WX 744 ; N uni1E6E ; G 1528 +U 7791 ; WX 462 ; N uni1E6F ; G 1529 +U 7792 ; WX 744 ; N uni1E70 ; G 1530 +U 7793 ; WX 462 ; N uni1E71 ; G 1531 +U 7794 ; WX 872 ; N uni1E72 ; G 1532 +U 7795 ; WX 727 ; N uni1E73 ; G 1533 +U 7796 ; WX 872 ; N uni1E74 ; G 1534 +U 7797 ; WX 727 ; N uni1E75 ; G 1535 +U 7798 ; WX 872 ; N uni1E76 ; G 1536 +U 7799 ; WX 727 ; N uni1E77 ; G 1537 +U 7800 ; WX 872 ; N uni1E78 ; G 1538 +U 7801 ; WX 727 ; N uni1E79 ; G 1539 +U 7802 ; WX 872 ; N uni1E7A ; G 1540 +U 7803 ; WX 727 ; N uni1E7B ; G 1541 +U 7804 ; WX 776 ; N uni1E7C ; G 1542 +U 7805 ; WX 581 ; N uni1E7D ; G 1543 +U 7806 ; WX 776 ; N uni1E7E ; G 1544 +U 7807 ; WX 581 ; N uni1E7F ; G 1545 +U 7808 ; WX 1123 ; N Wgrave ; G 1546 +U 7809 ; WX 861 ; N wgrave ; G 1547 +U 7810 ; WX 1123 ; N Wacute ; G 1548 +U 7811 ; WX 861 ; N wacute ; G 1549 +U 7812 ; WX 1123 ; N Wdieresis ; G 1550 +U 7813 ; WX 861 ; N wdieresis ; G 1551 +U 7814 ; WX 1123 ; N uni1E86 ; G 1552 +U 7815 ; WX 861 ; N uni1E87 ; G 1553 +U 7816 ; WX 1123 ; N uni1E88 ; G 1554 +U 7817 ; WX 861 ; N uni1E89 ; G 1555 +U 7818 ; WX 776 ; N uni1E8A ; G 1556 +U 7819 ; WX 596 ; N uni1E8B ; G 1557 +U 7820 ; WX 776 ; N uni1E8C ; G 1558 +U 7821 ; WX 596 ; N uni1E8D ; G 1559 +U 7822 ; WX 714 ; N uni1E8E ; G 1560 +U 7823 ; WX 581 ; N uni1E8F ; G 1561 +U 7824 ; WX 730 ; N uni1E90 ; G 1562 +U 7825 ; WX 568 ; N uni1E91 ; G 1563 +U 7826 ; WX 730 ; N uni1E92 ; G 1564 +U 7827 ; WX 568 ; N uni1E93 ; G 1565 +U 7828 ; WX 730 ; N uni1E94 ; G 1566 +U 7829 ; WX 568 ; N uni1E95 ; G 1567 +U 7830 ; WX 727 ; N uni1E96 ; G 1568 +U 7831 ; WX 462 ; N uni1E97 ; G 1569 +U 7832 ; WX 861 ; N uni1E98 ; G 1570 +U 7833 ; WX 581 ; N uni1E99 ; G 1571 +U 7834 ; WX 1014 ; N uni1E9A ; G 1572 +U 7835 ; WX 430 ; N uni1E9B ; G 1573 +U 7836 ; WX 430 ; N uni1E9C ; G 1574 +U 7837 ; WX 430 ; N uni1E9D ; G 1575 +U 7838 ; WX 947 ; N uni1E9E ; G 1576 +U 7839 ; WX 667 ; N uni1E9F ; G 1577 +U 7840 ; WX 776 ; N uni1EA0 ; G 1578 +U 7841 ; WX 648 ; N uni1EA1 ; G 1579 +U 7842 ; WX 776 ; N uni1EA2 ; G 1580 +U 7843 ; WX 648 ; N uni1EA3 ; G 1581 +U 7844 ; WX 776 ; N uni1EA4 ; G 1582 +U 7845 ; WX 648 ; N uni1EA5 ; G 1583 +U 7846 ; WX 776 ; N uni1EA6 ; G 1584 +U 7847 ; WX 648 ; N uni1EA7 ; G 1585 +U 7848 ; WX 776 ; N uni1EA8 ; G 1586 +U 7849 ; WX 648 ; N uni1EA9 ; G 1587 +U 7850 ; WX 776 ; N uni1EAA ; G 1588 +U 7851 ; WX 648 ; N uni1EAB ; G 1589 +U 7852 ; WX 776 ; N uni1EAC ; G 1590 +U 7853 ; WX 648 ; N uni1EAD ; G 1591 +U 7854 ; WX 776 ; N uni1EAE ; G 1592 +U 7855 ; WX 648 ; N uni1EAF ; G 1593 +U 7856 ; WX 776 ; N uni1EB0 ; G 1594 +U 7857 ; WX 648 ; N uni1EB1 ; G 1595 +U 7858 ; WX 776 ; N uni1EB2 ; G 1596 +U 7859 ; WX 648 ; N uni1EB3 ; G 1597 +U 7860 ; WX 776 ; N uni1EB4 ; G 1598 +U 7861 ; WX 648 ; N uni1EB5 ; G 1599 +U 7862 ; WX 776 ; N uni1EB6 ; G 1600 +U 7863 ; WX 648 ; N uni1EB7 ; G 1601 +U 7864 ; WX 762 ; N uni1EB8 ; G 1602 +U 7865 ; WX 636 ; N uni1EB9 ; G 1603 +U 7866 ; WX 762 ; N uni1EBA ; G 1604 +U 7867 ; WX 636 ; N uni1EBB ; G 1605 +U 7868 ; WX 762 ; N uni1EBC ; G 1606 +U 7869 ; WX 636 ; N uni1EBD ; G 1607 +U 7870 ; WX 762 ; N uni1EBE ; G 1608 +U 7871 ; WX 636 ; N uni1EBF ; G 1609 +U 7872 ; WX 762 ; N uni1EC0 ; G 1610 +U 7873 ; WX 636 ; N uni1EC1 ; G 1611 +U 7874 ; WX 762 ; N uni1EC2 ; G 1612 +U 7875 ; WX 636 ; N uni1EC3 ; G 1613 +U 7876 ; WX 762 ; N uni1EC4 ; G 1614 +U 7877 ; WX 636 ; N uni1EC5 ; G 1615 +U 7878 ; WX 762 ; N uni1EC6 ; G 1616 +U 7879 ; WX 636 ; N uni1EC7 ; G 1617 +U 7880 ; WX 468 ; N uni1EC8 ; G 1618 +U 7881 ; WX 380 ; N uni1EC9 ; G 1619 +U 7882 ; WX 468 ; N uni1ECA ; G 1620 +U 7883 ; WX 380 ; N uni1ECB ; G 1621 +U 7884 ; WX 871 ; N uni1ECC ; G 1622 +U 7885 ; WX 667 ; N uni1ECD ; G 1623 +U 7886 ; WX 871 ; N uni1ECE ; G 1624 +U 7887 ; WX 667 ; N uni1ECF ; G 1625 +U 7888 ; WX 871 ; N uni1ED0 ; G 1626 +U 7889 ; WX 667 ; N uni1ED1 ; G 1627 +U 7890 ; WX 871 ; N uni1ED2 ; G 1628 +U 7891 ; WX 667 ; N uni1ED3 ; G 1629 +U 7892 ; WX 871 ; N uni1ED4 ; G 1630 +U 7893 ; WX 667 ; N uni1ED5 ; G 1631 +U 7894 ; WX 871 ; N uni1ED6 ; G 1632 +U 7895 ; WX 667 ; N uni1ED7 ; G 1633 +U 7896 ; WX 871 ; N uni1ED8 ; G 1634 +U 7897 ; WX 667 ; N uni1ED9 ; G 1635 +U 7898 ; WX 871 ; N uni1EDA ; G 1636 +U 7899 ; WX 667 ; N uni1EDB ; G 1637 +U 7900 ; WX 871 ; N uni1EDC ; G 1638 +U 7901 ; WX 667 ; N uni1EDD ; G 1639 +U 7902 ; WX 871 ; N uni1EDE ; G 1640 +U 7903 ; WX 667 ; N uni1EDF ; G 1641 +U 7904 ; WX 871 ; N uni1EE0 ; G 1642 +U 7905 ; WX 667 ; N uni1EE1 ; G 1643 +U 7906 ; WX 871 ; N uni1EE2 ; G 1644 +U 7907 ; WX 667 ; N uni1EE3 ; G 1645 +U 7908 ; WX 872 ; N uni1EE4 ; G 1646 +U 7909 ; WX 727 ; N uni1EE5 ; G 1647 +U 7910 ; WX 872 ; N uni1EE6 ; G 1648 +U 7911 ; WX 727 ; N uni1EE7 ; G 1649 +U 7912 ; WX 872 ; N uni1EE8 ; G 1650 +U 7913 ; WX 727 ; N uni1EE9 ; G 1651 +U 7914 ; WX 872 ; N uni1EEA ; G 1652 +U 7915 ; WX 727 ; N uni1EEB ; G 1653 +U 7916 ; WX 872 ; N uni1EEC ; G 1654 +U 7917 ; WX 727 ; N uni1EED ; G 1655 +U 7918 ; WX 872 ; N uni1EEE ; G 1656 +U 7919 ; WX 727 ; N uni1EEF ; G 1657 +U 7920 ; WX 872 ; N uni1EF0 ; G 1658 +U 7921 ; WX 727 ; N uni1EF1 ; G 1659 +U 7922 ; WX 714 ; N Ygrave ; G 1660 +U 7923 ; WX 581 ; N ygrave ; G 1661 +U 7924 ; WX 714 ; N uni1EF4 ; G 1662 +U 7925 ; WX 581 ; N uni1EF5 ; G 1663 +U 7926 ; WX 714 ; N uni1EF6 ; G 1664 +U 7927 ; WX 581 ; N uni1EF7 ; G 1665 +U 7928 ; WX 714 ; N uni1EF8 ; G 1666 +U 7929 ; WX 581 ; N uni1EF9 ; G 1667 +U 7930 ; WX 1078 ; N uni1EFA ; G 1668 +U 7931 ; WX 701 ; N uni1EFB ; G 1669 +U 7936 ; WX 770 ; N uni1F00 ; G 1670 +U 7937 ; WX 770 ; N uni1F01 ; G 1671 +U 7938 ; WX 770 ; N uni1F02 ; G 1672 +U 7939 ; WX 770 ; N uni1F03 ; G 1673 +U 7940 ; WX 770 ; N uni1F04 ; G 1674 +U 7941 ; WX 770 ; N uni1F05 ; G 1675 +U 7942 ; WX 770 ; N uni1F06 ; G 1676 +U 7943 ; WX 770 ; N uni1F07 ; G 1677 +U 7944 ; WX 776 ; N uni1F08 ; G 1678 +U 7945 ; WX 776 ; N uni1F09 ; G 1679 +U 7946 ; WX 978 ; N uni1F0A ; G 1680 +U 7947 ; WX 978 ; N uni1F0B ; G 1681 +U 7948 ; WX 832 ; N uni1F0C ; G 1682 +U 7949 ; WX 849 ; N uni1F0D ; G 1683 +U 7950 ; WX 776 ; N uni1F0E ; G 1684 +U 7951 ; WX 776 ; N uni1F0F ; G 1685 +U 7952 ; WX 608 ; N uni1F10 ; G 1686 +U 7953 ; WX 608 ; N uni1F11 ; G 1687 +U 7954 ; WX 608 ; N uni1F12 ; G 1688 +U 7955 ; WX 608 ; N uni1F13 ; G 1689 +U 7956 ; WX 608 ; N uni1F14 ; G 1690 +U 7957 ; WX 608 ; N uni1F15 ; G 1691 +U 7960 ; WX 917 ; N uni1F18 ; G 1692 +U 7961 ; WX 909 ; N uni1F19 ; G 1693 +U 7962 ; WX 1169 ; N uni1F1A ; G 1694 +U 7963 ; WX 1169 ; N uni1F1B ; G 1695 +U 7964 ; WX 1093 ; N uni1F1C ; G 1696 +U 7965 ; WX 1120 ; N uni1F1D ; G 1697 +U 7968 ; WX 727 ; N uni1F20 ; G 1698 +U 7969 ; WX 727 ; N uni1F21 ; G 1699 +U 7970 ; WX 727 ; N uni1F22 ; G 1700 +U 7971 ; WX 727 ; N uni1F23 ; G 1701 +U 7972 ; WX 727 ; N uni1F24 ; G 1702 +U 7973 ; WX 727 ; N uni1F25 ; G 1703 +U 7974 ; WX 727 ; N uni1F26 ; G 1704 +U 7975 ; WX 727 ; N uni1F27 ; G 1705 +U 7976 ; WX 1100 ; N uni1F28 ; G 1706 +U 7977 ; WX 1094 ; N uni1F29 ; G 1707 +U 7978 ; WX 1358 ; N uni1F2A ; G 1708 +U 7979 ; WX 1361 ; N uni1F2B ; G 1709 +U 7980 ; WX 1279 ; N uni1F2C ; G 1710 +U 7981 ; WX 1308 ; N uni1F2D ; G 1711 +U 7982 ; WX 1197 ; N uni1F2E ; G 1712 +U 7983 ; WX 1194 ; N uni1F2F ; G 1713 +U 7984 ; WX 484 ; N uni1F30 ; G 1714 +U 7985 ; WX 484 ; N uni1F31 ; G 1715 +U 7986 ; WX 484 ; N uni1F32 ; G 1716 +U 7987 ; WX 484 ; N uni1F33 ; G 1717 +U 7988 ; WX 484 ; N uni1F34 ; G 1718 +U 7989 ; WX 484 ; N uni1F35 ; G 1719 +U 7990 ; WX 484 ; N uni1F36 ; G 1720 +U 7991 ; WX 484 ; N uni1F37 ; G 1721 +U 7992 ; WX 629 ; N uni1F38 ; G 1722 +U 7993 ; WX 617 ; N uni1F39 ; G 1723 +U 7994 ; WX 878 ; N uni1F3A ; G 1724 +U 7995 ; WX 881 ; N uni1F3B ; G 1725 +U 7996 ; WX 799 ; N uni1F3C ; G 1726 +U 7997 ; WX 831 ; N uni1F3D ; G 1727 +U 7998 ; WX 723 ; N uni1F3E ; G 1728 +U 7999 ; WX 714 ; N uni1F3F ; G 1729 +U 8000 ; WX 667 ; N uni1F40 ; G 1730 +U 8001 ; WX 667 ; N uni1F41 ; G 1731 +U 8002 ; WX 667 ; N uni1F42 ; G 1732 +U 8003 ; WX 667 ; N uni1F43 ; G 1733 +U 8004 ; WX 667 ; N uni1F44 ; G 1734 +U 8005 ; WX 667 ; N uni1F45 ; G 1735 +U 8008 ; WX 900 ; N uni1F48 ; G 1736 +U 8009 ; WX 935 ; N uni1F49 ; G 1737 +U 8010 ; WX 1240 ; N uni1F4A ; G 1738 +U 8011 ; WX 1237 ; N uni1F4B ; G 1739 +U 8012 ; WX 1035 ; N uni1F4C ; G 1740 +U 8013 ; WX 1066 ; N uni1F4D ; G 1741 +U 8016 ; WX 694 ; N uni1F50 ; G 1742 +U 8017 ; WX 694 ; N uni1F51 ; G 1743 +U 8018 ; WX 694 ; N uni1F52 ; G 1744 +U 8019 ; WX 694 ; N uni1F53 ; G 1745 +U 8020 ; WX 694 ; N uni1F54 ; G 1746 +U 8021 ; WX 694 ; N uni1F55 ; G 1747 +U 8022 ; WX 694 ; N uni1F56 ; G 1748 +U 8023 ; WX 694 ; N uni1F57 ; G 1749 +U 8025 ; WX 922 ; N uni1F59 ; G 1750 +U 8027 ; WX 1186 ; N uni1F5B ; G 1751 +U 8029 ; WX 1133 ; N uni1F5D ; G 1752 +U 8031 ; WX 1019 ; N uni1F5F ; G 1753 +U 8032 ; WX 952 ; N uni1F60 ; G 1754 +U 8033 ; WX 952 ; N uni1F61 ; G 1755 +U 8034 ; WX 952 ; N uni1F62 ; G 1756 +U 8035 ; WX 952 ; N uni1F63 ; G 1757 +U 8036 ; WX 952 ; N uni1F64 ; G 1758 +U 8037 ; WX 952 ; N uni1F65 ; G 1759 +U 8038 ; WX 952 ; N uni1F66 ; G 1760 +U 8039 ; WX 952 ; N uni1F67 ; G 1761 +U 8040 ; WX 931 ; N uni1F68 ; G 1762 +U 8041 ; WX 963 ; N uni1F69 ; G 1763 +U 8042 ; WX 1268 ; N uni1F6A ; G 1764 +U 8043 ; WX 1274 ; N uni1F6B ; G 1765 +U 8044 ; WX 1054 ; N uni1F6C ; G 1766 +U 8045 ; WX 1088 ; N uni1F6D ; G 1767 +U 8046 ; WX 1023 ; N uni1F6E ; G 1768 +U 8047 ; WX 1060 ; N uni1F6F ; G 1769 +U 8048 ; WX 770 ; N uni1F70 ; G 1770 +U 8049 ; WX 770 ; N uni1F71 ; G 1771 +U 8050 ; WX 608 ; N uni1F72 ; G 1772 +U 8051 ; WX 608 ; N uni1F73 ; G 1773 +U 8052 ; WX 727 ; N uni1F74 ; G 1774 +U 8053 ; WX 727 ; N uni1F75 ; G 1775 +U 8054 ; WX 484 ; N uni1F76 ; G 1776 +U 8055 ; WX 484 ; N uni1F77 ; G 1777 +U 8056 ; WX 667 ; N uni1F78 ; G 1778 +U 8057 ; WX 667 ; N uni1F79 ; G 1779 +U 8058 ; WX 694 ; N uni1F7A ; G 1780 +U 8059 ; WX 694 ; N uni1F7B ; G 1781 +U 8060 ; WX 952 ; N uni1F7C ; G 1782 +U 8061 ; WX 952 ; N uni1F7D ; G 1783 +U 8064 ; WX 770 ; N uni1F80 ; G 1784 +U 8065 ; WX 770 ; N uni1F81 ; G 1785 +U 8066 ; WX 770 ; N uni1F82 ; G 1786 +U 8067 ; WX 770 ; N uni1F83 ; G 1787 +U 8068 ; WX 770 ; N uni1F84 ; G 1788 +U 8069 ; WX 770 ; N uni1F85 ; G 1789 +U 8070 ; WX 770 ; N uni1F86 ; G 1790 +U 8071 ; WX 770 ; N uni1F87 ; G 1791 +U 8072 ; WX 776 ; N uni1F88 ; G 1792 +U 8073 ; WX 776 ; N uni1F89 ; G 1793 +U 8074 ; WX 978 ; N uni1F8A ; G 1794 +U 8075 ; WX 978 ; N uni1F8B ; G 1795 +U 8076 ; WX 832 ; N uni1F8C ; G 1796 +U 8077 ; WX 849 ; N uni1F8D ; G 1797 +U 8078 ; WX 776 ; N uni1F8E ; G 1798 +U 8079 ; WX 776 ; N uni1F8F ; G 1799 +U 8080 ; WX 727 ; N uni1F90 ; G 1800 +U 8081 ; WX 727 ; N uni1F91 ; G 1801 +U 8082 ; WX 727 ; N uni1F92 ; G 1802 +U 8083 ; WX 727 ; N uni1F93 ; G 1803 +U 8084 ; WX 727 ; N uni1F94 ; G 1804 +U 8085 ; WX 727 ; N uni1F95 ; G 1805 +U 8086 ; WX 727 ; N uni1F96 ; G 1806 +U 8087 ; WX 727 ; N uni1F97 ; G 1807 +U 8088 ; WX 1100 ; N uni1F98 ; G 1808 +U 8089 ; WX 1094 ; N uni1F99 ; G 1809 +U 8090 ; WX 1358 ; N uni1F9A ; G 1810 +U 8091 ; WX 1361 ; N uni1F9B ; G 1811 +U 8092 ; WX 1279 ; N uni1F9C ; G 1812 +U 8093 ; WX 1308 ; N uni1F9D ; G 1813 +U 8094 ; WX 1197 ; N uni1F9E ; G 1814 +U 8095 ; WX 1194 ; N uni1F9F ; G 1815 +U 8096 ; WX 952 ; N uni1FA0 ; G 1816 +U 8097 ; WX 952 ; N uni1FA1 ; G 1817 +U 8098 ; WX 952 ; N uni1FA2 ; G 1818 +U 8099 ; WX 952 ; N uni1FA3 ; G 1819 +U 8100 ; WX 952 ; N uni1FA4 ; G 1820 +U 8101 ; WX 952 ; N uni1FA5 ; G 1821 +U 8102 ; WX 952 ; N uni1FA6 ; G 1822 +U 8103 ; WX 952 ; N uni1FA7 ; G 1823 +U 8104 ; WX 931 ; N uni1FA8 ; G 1824 +U 8105 ; WX 963 ; N uni1FA9 ; G 1825 +U 8106 ; WX 1268 ; N uni1FAA ; G 1826 +U 8107 ; WX 1274 ; N uni1FAB ; G 1827 +U 8108 ; WX 1054 ; N uni1FAC ; G 1828 +U 8109 ; WX 1088 ; N uni1FAD ; G 1829 +U 8110 ; WX 1023 ; N uni1FAE ; G 1830 +U 8111 ; WX 1060 ; N uni1FAF ; G 1831 +U 8112 ; WX 770 ; N uni1FB0 ; G 1832 +U 8113 ; WX 770 ; N uni1FB1 ; G 1833 +U 8114 ; WX 770 ; N uni1FB2 ; G 1834 +U 8115 ; WX 770 ; N uni1FB3 ; G 1835 +U 8116 ; WX 770 ; N uni1FB4 ; G 1836 +U 8118 ; WX 770 ; N uni1FB6 ; G 1837 +U 8119 ; WX 770 ; N uni1FB7 ; G 1838 +U 8120 ; WX 776 ; N uni1FB8 ; G 1839 +U 8121 ; WX 776 ; N uni1FB9 ; G 1840 +U 8122 ; WX 811 ; N uni1FBA ; G 1841 +U 8123 ; WX 776 ; N uni1FBB ; G 1842 +U 8124 ; WX 776 ; N uni1FBC ; G 1843 +U 8125 ; WX 500 ; N uni1FBD ; G 1844 +U 8126 ; WX 500 ; N uni1FBE ; G 1845 +U 8127 ; WX 500 ; N uni1FBF ; G 1846 +U 8128 ; WX 500 ; N uni1FC0 ; G 1847 +U 8129 ; WX 500 ; N uni1FC1 ; G 1848 +U 8130 ; WX 727 ; N uni1FC2 ; G 1849 +U 8131 ; WX 727 ; N uni1FC3 ; G 1850 +U 8132 ; WX 727 ; N uni1FC4 ; G 1851 +U 8134 ; WX 727 ; N uni1FC6 ; G 1852 +U 8135 ; WX 727 ; N uni1FC7 ; G 1853 +U 8136 ; WX 1000 ; N uni1FC8 ; G 1854 +U 8137 ; WX 947 ; N uni1FC9 ; G 1855 +U 8138 ; WX 1191 ; N uni1FCA ; G 1856 +U 8139 ; WX 1118 ; N uni1FCB ; G 1857 +U 8140 ; WX 945 ; N uni1FCC ; G 1858 +U 8141 ; WX 500 ; N uni1FCD ; G 1859 +U 8142 ; WX 500 ; N uni1FCE ; G 1860 +U 8143 ; WX 500 ; N uni1FCF ; G 1861 +U 8144 ; WX 484 ; N uni1FD0 ; G 1862 +U 8145 ; WX 484 ; N uni1FD1 ; G 1863 +U 8146 ; WX 484 ; N uni1FD2 ; G 1864 +U 8147 ; WX 484 ; N uni1FD3 ; G 1865 +U 8150 ; WX 484 ; N uni1FD6 ; G 1866 +U 8151 ; WX 484 ; N uni1FD7 ; G 1867 +U 8152 ; WX 468 ; N uni1FD8 ; G 1868 +U 8153 ; WX 468 ; N uni1FD9 ; G 1869 +U 8154 ; WX 714 ; N uni1FDA ; G 1870 +U 8155 ; WX 662 ; N uni1FDB ; G 1871 +U 8157 ; WX 500 ; N uni1FDD ; G 1872 +U 8158 ; WX 500 ; N uni1FDE ; G 1873 +U 8159 ; WX 500 ; N uni1FDF ; G 1874 +U 8160 ; WX 694 ; N uni1FE0 ; G 1875 +U 8161 ; WX 694 ; N uni1FE1 ; G 1876 +U 8162 ; WX 694 ; N uni1FE2 ; G 1877 +U 8163 ; WX 694 ; N uni1FE3 ; G 1878 +U 8164 ; WX 665 ; N uni1FE4 ; G 1879 +U 8165 ; WX 665 ; N uni1FE5 ; G 1880 +U 8166 ; WX 694 ; N uni1FE6 ; G 1881 +U 8167 ; WX 694 ; N uni1FE7 ; G 1882 +U 8168 ; WX 714 ; N uni1FE8 ; G 1883 +U 8169 ; WX 714 ; N uni1FE9 ; G 1884 +U 8170 ; WX 1019 ; N uni1FEA ; G 1885 +U 8171 ; WX 953 ; N uni1FEB ; G 1886 +U 8172 ; WX 910 ; N uni1FEC ; G 1887 +U 8173 ; WX 500 ; N uni1FED ; G 1888 +U 8174 ; WX 500 ; N uni1FEE ; G 1889 +U 8175 ; WX 500 ; N uni1FEF ; G 1890 +U 8178 ; WX 952 ; N uni1FF2 ; G 1891 +U 8179 ; WX 952 ; N uni1FF3 ; G 1892 +U 8180 ; WX 952 ; N uni1FF4 ; G 1893 +U 8182 ; WX 952 ; N uni1FF6 ; G 1894 +U 8183 ; WX 952 ; N uni1FF7 ; G 1895 +U 8184 ; WX 1069 ; N uni1FF8 ; G 1896 +U 8185 ; WX 887 ; N uni1FF9 ; G 1897 +U 8186 ; WX 1101 ; N uni1FFA ; G 1898 +U 8187 ; WX 911 ; N uni1FFB ; G 1899 +U 8188 ; WX 890 ; N uni1FFC ; G 1900 +U 8189 ; WX 500 ; N uni1FFD ; G 1901 +U 8190 ; WX 500 ; N uni1FFE ; G 1902 +U 8192 ; WX 500 ; N uni2000 ; G 1903 +U 8193 ; WX 1000 ; N uni2001 ; G 1904 +U 8194 ; WX 500 ; N uni2002 ; G 1905 +U 8195 ; WX 1000 ; N uni2003 ; G 1906 +U 8196 ; WX 330 ; N uni2004 ; G 1907 +U 8197 ; WX 250 ; N uni2005 ; G 1908 +U 8198 ; WX 167 ; N uni2006 ; G 1909 +U 8199 ; WX 696 ; N uni2007 ; G 1910 +U 8200 ; WX 348 ; N uni2008 ; G 1911 +U 8201 ; WX 200 ; N uni2009 ; G 1912 +U 8202 ; WX 100 ; N uni200A ; G 1913 +U 8203 ; WX 0 ; N uni200B ; G 1914 +U 8204 ; WX 0 ; N uni200C ; G 1915 +U 8205 ; WX 0 ; N uni200D ; G 1916 +U 8206 ; WX 0 ; N uni200E ; G 1917 +U 8207 ; WX 0 ; N uni200F ; G 1918 +U 8208 ; WX 415 ; N uni2010 ; G 1919 +U 8209 ; WX 415 ; N uni2011 ; G 1920 +U 8210 ; WX 696 ; N figuredash ; G 1921 +U 8211 ; WX 500 ; N endash ; G 1922 +U 8212 ; WX 1000 ; N emdash ; G 1923 +U 8213 ; WX 1000 ; N uni2015 ; G 1924 +U 8214 ; WX 500 ; N uni2016 ; G 1925 +U 8215 ; WX 500 ; N underscoredbl ; G 1926 +U 8216 ; WX 348 ; N quoteleft ; G 1927 +U 8217 ; WX 348 ; N quoteright ; G 1928 +U 8218 ; WX 348 ; N quotesinglbase ; G 1929 +U 8219 ; WX 348 ; N quotereversed ; G 1930 +U 8220 ; WX 575 ; N quotedblleft ; G 1931 +U 8221 ; WX 575 ; N quotedblright ; G 1932 +U 8222 ; WX 575 ; N quotedblbase ; G 1933 +U 8223 ; WX 575 ; N uni201F ; G 1934 +U 8224 ; WX 523 ; N dagger ; G 1935 +U 8225 ; WX 523 ; N daggerdbl ; G 1936 +U 8226 ; WX 639 ; N bullet ; G 1937 +U 8227 ; WX 639 ; N uni2023 ; G 1938 +U 8228 ; WX 348 ; N onedotenleader ; G 1939 +U 8229 ; WX 674 ; N twodotenleader ; G 1940 +U 8230 ; WX 1000 ; N ellipsis ; G 1941 +U 8234 ; WX 0 ; N uni202A ; G 1942 +U 8235 ; WX 0 ; N uni202B ; G 1943 +U 8236 ; WX 0 ; N uni202C ; G 1944 +U 8237 ; WX 0 ; N uni202D ; G 1945 +U 8238 ; WX 0 ; N uni202E ; G 1946 +U 8239 ; WX 200 ; N uni202F ; G 1947 +U 8240 ; WX 1385 ; N perthousand ; G 1948 +U 8241 ; WX 1813 ; N uni2031 ; G 1949 +U 8242 ; WX 264 ; N minute ; G 1950 +U 8243 ; WX 447 ; N second ; G 1951 +U 8244 ; WX 630 ; N uni2034 ; G 1952 +U 8245 ; WX 264 ; N uni2035 ; G 1953 +U 8246 ; WX 447 ; N uni2036 ; G 1954 +U 8247 ; WX 630 ; N uni2037 ; G 1955 +U 8248 ; WX 733 ; N uni2038 ; G 1956 +U 8249 ; WX 400 ; N guilsinglleft ; G 1957 +U 8250 ; WX 400 ; N guilsinglright ; G 1958 +U 8252 ; WX 629 ; N exclamdbl ; G 1959 +U 8253 ; WX 586 ; N uni203D ; G 1960 +U 8254 ; WX 500 ; N uni203E ; G 1961 +U 8258 ; WX 1023 ; N uni2042 ; G 1962 +U 8260 ; WX 167 ; N fraction ; G 1963 +U 8261 ; WX 473 ; N uni2045 ; G 1964 +U 8262 ; WX 473 ; N uni2046 ; G 1965 +U 8263 ; WX 1082 ; N uni2047 ; G 1966 +U 8264 ; WX 856 ; N uni2048 ; G 1967 +U 8265 ; WX 856 ; N uni2049 ; G 1968 +U 8267 ; WX 636 ; N uni204B ; G 1969 +U 8268 ; WX 500 ; N uni204C ; G 1970 +U 8269 ; WX 500 ; N uni204D ; G 1971 +U 8270 ; WX 523 ; N uni204E ; G 1972 +U 8271 ; WX 369 ; N uni204F ; G 1973 +U 8273 ; WX 523 ; N uni2051 ; G 1974 +U 8274 ; WX 556 ; N uni2052 ; G 1975 +U 8275 ; WX 1000 ; N uni2053 ; G 1976 +U 8279 ; WX 813 ; N uni2057 ; G 1977 +U 8287 ; WX 222 ; N uni205F ; G 1978 +U 8288 ; WX 0 ; N uni2060 ; G 1979 +U 8289 ; WX 0 ; N uni2061 ; G 1980 +U 8290 ; WX 0 ; N uni2062 ; G 1981 +U 8291 ; WX 0 ; N uni2063 ; G 1982 +U 8292 ; WX 0 ; N uni2064 ; G 1983 +U 8298 ; WX 0 ; N uni206A ; G 1984 +U 8299 ; WX 0 ; N uni206B ; G 1985 +U 8300 ; WX 0 ; N uni206C ; G 1986 +U 8301 ; WX 0 ; N uni206D ; G 1987 +U 8302 ; WX 0 ; N uni206E ; G 1988 +U 8303 ; WX 0 ; N uni206F ; G 1989 +U 8304 ; WX 438 ; N uni2070 ; G 1990 +U 8305 ; WX 239 ; N uni2071 ; G 1991 +U 8308 ; WX 438 ; N uni2074 ; G 1992 +U 8309 ; WX 438 ; N uni2075 ; G 1993 +U 8310 ; WX 438 ; N uni2076 ; G 1994 +U 8311 ; WX 438 ; N uni2077 ; G 1995 +U 8312 ; WX 438 ; N uni2078 ; G 1996 +U 8313 ; WX 438 ; N uni2079 ; G 1997 +U 8314 ; WX 528 ; N uni207A ; G 1998 +U 8315 ; WX 528 ; N uni207B ; G 1999 +U 8316 ; WX 528 ; N uni207C ; G 2000 +U 8317 ; WX 298 ; N uni207D ; G 2001 +U 8318 ; WX 298 ; N uni207E ; G 2002 +U 8319 ; WX 458 ; N uni207F ; G 2003 +U 8320 ; WX 438 ; N uni2080 ; G 2004 +U 8321 ; WX 438 ; N uni2081 ; G 2005 +U 8322 ; WX 438 ; N uni2082 ; G 2006 +U 8323 ; WX 438 ; N uni2083 ; G 2007 +U 8324 ; WX 438 ; N uni2084 ; G 2008 +U 8325 ; WX 438 ; N uni2085 ; G 2009 +U 8326 ; WX 438 ; N uni2086 ; G 2010 +U 8327 ; WX 438 ; N uni2087 ; G 2011 +U 8328 ; WX 438 ; N uni2088 ; G 2012 +U 8329 ; WX 438 ; N uni2089 ; G 2013 +U 8330 ; WX 528 ; N uni208A ; G 2014 +U 8331 ; WX 528 ; N uni208B ; G 2015 +U 8332 ; WX 528 ; N uni208C ; G 2016 +U 8333 ; WX 298 ; N uni208D ; G 2017 +U 8334 ; WX 298 ; N uni208E ; G 2018 +U 8336 ; WX 408 ; N uni2090 ; G 2019 +U 8337 ; WX 444 ; N uni2091 ; G 2020 +U 8338 ; WX 467 ; N uni2092 ; G 2021 +U 8339 ; WX 375 ; N uni2093 ; G 2022 +U 8340 ; WX 444 ; N uni2094 ; G 2023 +U 8341 ; WX 521 ; N uni2095 ; G 2024 +U 8342 ; WX 523 ; N uni2096 ; G 2025 +U 8343 ; WX 292 ; N uni2097 ; G 2026 +U 8344 ; WX 729 ; N uni2098 ; G 2027 +U 8345 ; WX 458 ; N uni2099 ; G 2028 +U 8346 ; WX 499 ; N uni209A ; G 2029 +U 8347 ; WX 395 ; N uni209B ; G 2030 +U 8348 ; WX 371 ; N uni209C ; G 2031 +U 8358 ; WX 696 ; N uni20A6 ; G 2032 +U 8364 ; WX 696 ; N Euro ; G 2033 +U 8367 ; WX 1155 ; N uni20AF ; G 2034 +U 8369 ; WX 790 ; N uni20B1 ; G 2035 +U 8372 ; WX 876 ; N uni20B4 ; G 2036 +U 8373 ; WX 696 ; N uni20B5 ; G 2037 +U 8376 ; WX 696 ; N uni20B8 ; G 2038 +U 8377 ; WX 696 ; N uni20B9 ; G 2039 +U 8378 ; WX 696 ; N uni20BA ; G 2040 +U 8381 ; WX 696 ; N uni20BD ; G 2041 +U 8451 ; WX 1198 ; N uni2103 ; G 2042 +U 8457 ; WX 1112 ; N uni2109 ; G 2043 +U 8462 ; WX 727 ; N uni210E ; G 2044 +U 8463 ; WX 727 ; N uni210F ; G 2045 +U 8470 ; WX 1087 ; N uni2116 ; G 2046 +U 8482 ; WX 1000 ; N trademark ; G 2047 +U 8486 ; WX 890 ; N uni2126 ; G 2048 +U 8487 ; WX 890 ; N uni2127 ; G 2049 +U 8490 ; WX 869 ; N uni212A ; G 2050 +U 8491 ; WX 776 ; N uni212B ; G 2051 +U 8498 ; WX 710 ; N uni2132 ; G 2052 +U 8513 ; WX 786 ; N uni2141 ; G 2053 +U 8514 ; WX 576 ; N uni2142 ; G 2054 +U 8515 ; WX 637 ; N uni2143 ; G 2055 +U 8516 ; WX 760 ; N uni2144 ; G 2056 +U 8523 ; WX 903 ; N uni214B ; G 2057 +U 8526 ; WX 592 ; N uni214E ; G 2058 +U 8528 ; WX 1035 ; N uni2150 ; G 2059 +U 8529 ; WX 1035 ; N uni2151 ; G 2060 +U 8530 ; WX 1473 ; N uni2152 ; G 2061 +U 8531 ; WX 1035 ; N onethird ; G 2062 +U 8532 ; WX 1035 ; N twothirds ; G 2063 +U 8533 ; WX 1035 ; N uni2155 ; G 2064 +U 8534 ; WX 1035 ; N uni2156 ; G 2065 +U 8535 ; WX 1035 ; N uni2157 ; G 2066 +U 8536 ; WX 1035 ; N uni2158 ; G 2067 +U 8537 ; WX 1035 ; N uni2159 ; G 2068 +U 8538 ; WX 1035 ; N uni215A ; G 2069 +U 8539 ; WX 1035 ; N oneeighth ; G 2070 +U 8540 ; WX 1035 ; N threeeighths ; G 2071 +U 8541 ; WX 1035 ; N fiveeighths ; G 2072 +U 8542 ; WX 1035 ; N seveneighths ; G 2073 +U 8543 ; WX 615 ; N uni215F ; G 2074 +U 8544 ; WX 468 ; N uni2160 ; G 2075 +U 8545 ; WX 843 ; N uni2161 ; G 2076 +U 8546 ; WX 1218 ; N uni2162 ; G 2077 +U 8547 ; WX 1135 ; N uni2163 ; G 2078 +U 8548 ; WX 776 ; N uni2164 ; G 2079 +U 8549 ; WX 1150 ; N uni2165 ; G 2080 +U 8550 ; WX 1525 ; N uni2166 ; G 2081 +U 8551 ; WX 1900 ; N uni2167 ; G 2082 +U 8552 ; WX 1126 ; N uni2168 ; G 2083 +U 8553 ; WX 776 ; N uni2169 ; G 2084 +U 8554 ; WX 1127 ; N uni216A ; G 2085 +U 8555 ; WX 1502 ; N uni216B ; G 2086 +U 8556 ; WX 703 ; N uni216C ; G 2087 +U 8557 ; WX 796 ; N uni216D ; G 2088 +U 8558 ; WX 867 ; N uni216E ; G 2089 +U 8559 ; WX 1107 ; N uni216F ; G 2090 +U 8560 ; WX 380 ; N uni2170 ; G 2091 +U 8561 ; WX 760 ; N uni2171 ; G 2092 +U 8562 ; WX 1140 ; N uni2172 ; G 2093 +U 8563 ; WX 961 ; N uni2173 ; G 2094 +U 8564 ; WX 581 ; N uni2174 ; G 2095 +U 8565 ; WX 961 ; N uni2175 ; G 2096 +U 8566 ; WX 1341 ; N uni2176 ; G 2097 +U 8567 ; WX 1721 ; N uni2177 ; G 2098 +U 8568 ; WX 976 ; N uni2178 ; G 2099 +U 8569 ; WX 596 ; N uni2179 ; G 2100 +U 8570 ; WX 976 ; N uni217A ; G 2101 +U 8571 ; WX 1356 ; N uni217B ; G 2102 +U 8572 ; WX 380 ; N uni217C ; G 2103 +U 8573 ; WX 609 ; N uni217D ; G 2104 +U 8574 ; WX 699 ; N uni217E ; G 2105 +U 8575 ; WX 1058 ; N uni217F ; G 2106 +U 8576 ; WX 1255 ; N uni2180 ; G 2107 +U 8577 ; WX 867 ; N uni2181 ; G 2108 +U 8578 ; WX 1268 ; N uni2182 ; G 2109 +U 8579 ; WX 796 ; N uni2183 ; G 2110 +U 8580 ; WX 609 ; N uni2184 ; G 2111 +U 8581 ; WX 796 ; N uni2185 ; G 2112 +U 8585 ; WX 1035 ; N uni2189 ; G 2113 +U 8592 ; WX 838 ; N arrowleft ; G 2114 +U 8593 ; WX 838 ; N arrowup ; G 2115 +U 8594 ; WX 838 ; N arrowright ; G 2116 +U 8595 ; WX 838 ; N arrowdown ; G 2117 +U 8596 ; WX 838 ; N arrowboth ; G 2118 +U 8597 ; WX 838 ; N arrowupdn ; G 2119 +U 8598 ; WX 838 ; N uni2196 ; G 2120 +U 8599 ; WX 838 ; N uni2197 ; G 2121 +U 8600 ; WX 838 ; N uni2198 ; G 2122 +U 8601 ; WX 838 ; N uni2199 ; G 2123 +U 8602 ; WX 838 ; N uni219A ; G 2124 +U 8603 ; WX 838 ; N uni219B ; G 2125 +U 8604 ; WX 838 ; N uni219C ; G 2126 +U 8605 ; WX 838 ; N uni219D ; G 2127 +U 8606 ; WX 838 ; N uni219E ; G 2128 +U 8607 ; WX 838 ; N uni219F ; G 2129 +U 8608 ; WX 838 ; N uni21A0 ; G 2130 +U 8609 ; WX 838 ; N uni21A1 ; G 2131 +U 8610 ; WX 838 ; N uni21A2 ; G 2132 +U 8611 ; WX 838 ; N uni21A3 ; G 2133 +U 8612 ; WX 838 ; N uni21A4 ; G 2134 +U 8613 ; WX 838 ; N uni21A5 ; G 2135 +U 8614 ; WX 838 ; N uni21A6 ; G 2136 +U 8615 ; WX 838 ; N uni21A7 ; G 2137 +U 8616 ; WX 838 ; N arrowupdnbse ; G 2138 +U 8617 ; WX 838 ; N uni21A9 ; G 2139 +U 8618 ; WX 838 ; N uni21AA ; G 2140 +U 8619 ; WX 838 ; N uni21AB ; G 2141 +U 8620 ; WX 838 ; N uni21AC ; G 2142 +U 8621 ; WX 838 ; N uni21AD ; G 2143 +U 8622 ; WX 838 ; N uni21AE ; G 2144 +U 8623 ; WX 850 ; N uni21AF ; G 2145 +U 8624 ; WX 838 ; N uni21B0 ; G 2146 +U 8625 ; WX 838 ; N uni21B1 ; G 2147 +U 8626 ; WX 838 ; N uni21B2 ; G 2148 +U 8627 ; WX 838 ; N uni21B3 ; G 2149 +U 8628 ; WX 838 ; N uni21B4 ; G 2150 +U 8629 ; WX 838 ; N carriagereturn ; G 2151 +U 8630 ; WX 838 ; N uni21B6 ; G 2152 +U 8631 ; WX 838 ; N uni21B7 ; G 2153 +U 8632 ; WX 838 ; N uni21B8 ; G 2154 +U 8633 ; WX 838 ; N uni21B9 ; G 2155 +U 8634 ; WX 838 ; N uni21BA ; G 2156 +U 8635 ; WX 838 ; N uni21BB ; G 2157 +U 8636 ; WX 838 ; N uni21BC ; G 2158 +U 8637 ; WX 838 ; N uni21BD ; G 2159 +U 8638 ; WX 838 ; N uni21BE ; G 2160 +U 8639 ; WX 838 ; N uni21BF ; G 2161 +U 8640 ; WX 838 ; N uni21C0 ; G 2162 +U 8641 ; WX 838 ; N uni21C1 ; G 2163 +U 8642 ; WX 838 ; N uni21C2 ; G 2164 +U 8643 ; WX 838 ; N uni21C3 ; G 2165 +U 8644 ; WX 838 ; N uni21C4 ; G 2166 +U 8645 ; WX 838 ; N uni21C5 ; G 2167 +U 8646 ; WX 838 ; N uni21C6 ; G 2168 +U 8647 ; WX 838 ; N uni21C7 ; G 2169 +U 8648 ; WX 838 ; N uni21C8 ; G 2170 +U 8649 ; WX 838 ; N uni21C9 ; G 2171 +U 8650 ; WX 838 ; N uni21CA ; G 2172 +U 8651 ; WX 838 ; N uni21CB ; G 2173 +U 8652 ; WX 838 ; N uni21CC ; G 2174 +U 8653 ; WX 838 ; N uni21CD ; G 2175 +U 8654 ; WX 838 ; N uni21CE ; G 2176 +U 8655 ; WX 838 ; N uni21CF ; G 2177 +U 8656 ; WX 838 ; N arrowdblleft ; G 2178 +U 8657 ; WX 838 ; N arrowdblup ; G 2179 +U 8658 ; WX 838 ; N arrowdblright ; G 2180 +U 8659 ; WX 838 ; N arrowdbldown ; G 2181 +U 8660 ; WX 838 ; N arrowdblboth ; G 2182 +U 8661 ; WX 838 ; N uni21D5 ; G 2183 +U 8662 ; WX 838 ; N uni21D6 ; G 2184 +U 8663 ; WX 838 ; N uni21D7 ; G 2185 +U 8664 ; WX 838 ; N uni21D8 ; G 2186 +U 8665 ; WX 838 ; N uni21D9 ; G 2187 +U 8666 ; WX 838 ; N uni21DA ; G 2188 +U 8667 ; WX 838 ; N uni21DB ; G 2189 +U 8668 ; WX 838 ; N uni21DC ; G 2190 +U 8669 ; WX 838 ; N uni21DD ; G 2191 +U 8670 ; WX 838 ; N uni21DE ; G 2192 +U 8671 ; WX 838 ; N uni21DF ; G 2193 +U 8672 ; WX 838 ; N uni21E0 ; G 2194 +U 8673 ; WX 838 ; N uni21E1 ; G 2195 +U 8674 ; WX 838 ; N uni21E2 ; G 2196 +U 8675 ; WX 838 ; N uni21E3 ; G 2197 +U 8676 ; WX 838 ; N uni21E4 ; G 2198 +U 8677 ; WX 838 ; N uni21E5 ; G 2199 +U 8678 ; WX 838 ; N uni21E6 ; G 2200 +U 8679 ; WX 838 ; N uni21E7 ; G 2201 +U 8680 ; WX 838 ; N uni21E8 ; G 2202 +U 8681 ; WX 838 ; N uni21E9 ; G 2203 +U 8682 ; WX 838 ; N uni21EA ; G 2204 +U 8683 ; WX 838 ; N uni21EB ; G 2205 +U 8684 ; WX 838 ; N uni21EC ; G 2206 +U 8685 ; WX 838 ; N uni21ED ; G 2207 +U 8686 ; WX 838 ; N uni21EE ; G 2208 +U 8687 ; WX 838 ; N uni21EF ; G 2209 +U 8688 ; WX 838 ; N uni21F0 ; G 2210 +U 8689 ; WX 838 ; N uni21F1 ; G 2211 +U 8690 ; WX 838 ; N uni21F2 ; G 2212 +U 8691 ; WX 838 ; N uni21F3 ; G 2213 +U 8692 ; WX 838 ; N uni21F4 ; G 2214 +U 8693 ; WX 838 ; N uni21F5 ; G 2215 +U 8694 ; WX 838 ; N uni21F6 ; G 2216 +U 8695 ; WX 838 ; N uni21F7 ; G 2217 +U 8696 ; WX 838 ; N uni21F8 ; G 2218 +U 8697 ; WX 838 ; N uni21F9 ; G 2219 +U 8698 ; WX 838 ; N uni21FA ; G 2220 +U 8699 ; WX 838 ; N uni21FB ; G 2221 +U 8700 ; WX 838 ; N uni21FC ; G 2222 +U 8701 ; WX 838 ; N uni21FD ; G 2223 +U 8702 ; WX 838 ; N uni21FE ; G 2224 +U 8703 ; WX 838 ; N uni21FF ; G 2225 +U 8704 ; WX 641 ; N universal ; G 2226 +U 8706 ; WX 534 ; N partialdiff ; G 2227 +U 8707 ; WX 620 ; N existential ; G 2228 +U 8708 ; WX 620 ; N uni2204 ; G 2229 +U 8710 ; WX 753 ; N increment ; G 2230 +U 8711 ; WX 753 ; N gradient ; G 2231 +U 8712 ; WX 740 ; N element ; G 2232 +U 8713 ; WX 740 ; N notelement ; G 2233 +U 8715 ; WX 740 ; N suchthat ; G 2234 +U 8716 ; WX 740 ; N uni220C ; G 2235 +U 8719 ; WX 842 ; N product ; G 2236 +U 8720 ; WX 842 ; N uni2210 ; G 2237 +U 8721 ; WX 753 ; N summation ; G 2238 +U 8722 ; WX 838 ; N minus ; G 2239 +U 8723 ; WX 838 ; N uni2213 ; G 2240 +U 8724 ; WX 838 ; N uni2214 ; G 2241 +U 8725 ; WX 365 ; N uni2215 ; G 2242 +U 8727 ; WX 691 ; N asteriskmath ; G 2243 +U 8728 ; WX 519 ; N uni2218 ; G 2244 +U 8729 ; WX 519 ; N uni2219 ; G 2245 +U 8730 ; WX 657 ; N radical ; G 2246 +U 8731 ; WX 657 ; N uni221B ; G 2247 +U 8732 ; WX 657 ; N uni221C ; G 2248 +U 8733 ; WX 672 ; N proportional ; G 2249 +U 8734 ; WX 833 ; N infinity ; G 2250 +U 8735 ; WX 838 ; N orthogonal ; G 2251 +U 8736 ; WX 838 ; N angle ; G 2252 +U 8739 ; WX 324 ; N uni2223 ; G 2253 +U 8740 ; WX 607 ; N uni2224 ; G 2254 +U 8741 ; WX 529 ; N uni2225 ; G 2255 +U 8742 ; WX 773 ; N uni2226 ; G 2256 +U 8743 ; WX 812 ; N logicaland ; G 2257 +U 8744 ; WX 812 ; N logicalor ; G 2258 +U 8745 ; WX 838 ; N intersection ; G 2259 +U 8746 ; WX 838 ; N union ; G 2260 +U 8747 ; WX 579 ; N integral ; G 2261 +U 8748 ; WX 1000 ; N uni222C ; G 2262 +U 8749 ; WX 1391 ; N uni222D ; G 2263 +U 8760 ; WX 838 ; N uni2238 ; G 2264 +U 8761 ; WX 838 ; N uni2239 ; G 2265 +U 8762 ; WX 838 ; N uni223A ; G 2266 +U 8763 ; WX 838 ; N uni223B ; G 2267 +U 8764 ; WX 838 ; N similar ; G 2268 +U 8765 ; WX 838 ; N uni223D ; G 2269 +U 8770 ; WX 838 ; N uni2242 ; G 2270 +U 8771 ; WX 838 ; N uni2243 ; G 2271 +U 8776 ; WX 838 ; N approxequal ; G 2272 +U 8784 ; WX 838 ; N uni2250 ; G 2273 +U 8785 ; WX 838 ; N uni2251 ; G 2274 +U 8786 ; WX 838 ; N uni2252 ; G 2275 +U 8787 ; WX 838 ; N uni2253 ; G 2276 +U 8788 ; WX 1082 ; N uni2254 ; G 2277 +U 8789 ; WX 1082 ; N uni2255 ; G 2278 +U 8800 ; WX 838 ; N notequal ; G 2279 +U 8801 ; WX 838 ; N equivalence ; G 2280 +U 8804 ; WX 838 ; N lessequal ; G 2281 +U 8805 ; WX 838 ; N greaterequal ; G 2282 +U 8834 ; WX 838 ; N propersubset ; G 2283 +U 8835 ; WX 838 ; N propersuperset ; G 2284 +U 8836 ; WX 838 ; N notsubset ; G 2285 +U 8837 ; WX 838 ; N uni2285 ; G 2286 +U 8838 ; WX 838 ; N reflexsubset ; G 2287 +U 8839 ; WX 838 ; N reflexsuperset ; G 2288 +U 8844 ; WX 838 ; N uni228C ; G 2289 +U 8845 ; WX 838 ; N uni228D ; G 2290 +U 8846 ; WX 838 ; N uni228E ; G 2291 +U 8847 ; WX 838 ; N uni228F ; G 2292 +U 8848 ; WX 838 ; N uni2290 ; G 2293 +U 8849 ; WX 838 ; N uni2291 ; G 2294 +U 8850 ; WX 838 ; N uni2292 ; G 2295 +U 8851 ; WX 838 ; N uni2293 ; G 2296 +U 8852 ; WX 838 ; N uni2294 ; G 2297 +U 8853 ; WX 838 ; N circleplus ; G 2298 +U 8854 ; WX 838 ; N uni2296 ; G 2299 +U 8855 ; WX 838 ; N circlemultiply ; G 2300 +U 8856 ; WX 838 ; N uni2298 ; G 2301 +U 8857 ; WX 838 ; N uni2299 ; G 2302 +U 8858 ; WX 838 ; N uni229A ; G 2303 +U 8859 ; WX 838 ; N uni229B ; G 2304 +U 8860 ; WX 838 ; N uni229C ; G 2305 +U 8861 ; WX 838 ; N uni229D ; G 2306 +U 8862 ; WX 838 ; N uni229E ; G 2307 +U 8863 ; WX 838 ; N uni229F ; G 2308 +U 8864 ; WX 838 ; N uni22A0 ; G 2309 +U 8865 ; WX 838 ; N uni22A1 ; G 2310 +U 8866 ; WX 884 ; N uni22A2 ; G 2311 +U 8867 ; WX 884 ; N uni22A3 ; G 2312 +U 8868 ; WX 960 ; N uni22A4 ; G 2313 +U 8869 ; WX 960 ; N perpendicular ; G 2314 +U 8870 ; WX 616 ; N uni22A6 ; G 2315 +U 8871 ; WX 616 ; N uni22A7 ; G 2316 +U 8872 ; WX 884 ; N uni22A8 ; G 2317 +U 8873 ; WX 884 ; N uni22A9 ; G 2318 +U 8874 ; WX 884 ; N uni22AA ; G 2319 +U 8875 ; WX 1080 ; N uni22AB ; G 2320 +U 8876 ; WX 884 ; N uni22AC ; G 2321 +U 8877 ; WX 884 ; N uni22AD ; G 2322 +U 8878 ; WX 884 ; N uni22AE ; G 2323 +U 8879 ; WX 1080 ; N uni22AF ; G 2324 +U 8900 ; WX 626 ; N uni22C4 ; G 2325 +U 8901 ; WX 398 ; N dotmath ; G 2326 +U 8962 ; WX 834 ; N house ; G 2327 +U 8968 ; WX 473 ; N uni2308 ; G 2328 +U 8969 ; WX 473 ; N uni2309 ; G 2329 +U 8970 ; WX 473 ; N uni230A ; G 2330 +U 8971 ; WX 473 ; N uni230B ; G 2331 +U 8976 ; WX 838 ; N revlogicalnot ; G 2332 +U 8977 ; WX 539 ; N uni2311 ; G 2333 +U 8984 ; WX 928 ; N uni2318 ; G 2334 +U 8985 ; WX 838 ; N uni2319 ; G 2335 +U 8992 ; WX 579 ; N integraltp ; G 2336 +U 8993 ; WX 579 ; N integralbt ; G 2337 +U 8997 ; WX 1000 ; N uni2325 ; G 2338 +U 9000 ; WX 1443 ; N uni2328 ; G 2339 +U 9085 ; WX 1008 ; N uni237D ; G 2340 +U 9115 ; WX 500 ; N uni239B ; G 2341 +U 9116 ; WX 500 ; N uni239C ; G 2342 +U 9117 ; WX 500 ; N uni239D ; G 2343 +U 9118 ; WX 500 ; N uni239E ; G 2344 +U 9119 ; WX 500 ; N uni239F ; G 2345 +U 9120 ; WX 500 ; N uni23A0 ; G 2346 +U 9121 ; WX 500 ; N uni23A1 ; G 2347 +U 9122 ; WX 500 ; N uni23A2 ; G 2348 +U 9123 ; WX 500 ; N uni23A3 ; G 2349 +U 9124 ; WX 500 ; N uni23A4 ; G 2350 +U 9125 ; WX 500 ; N uni23A5 ; G 2351 +U 9126 ; WX 500 ; N uni23A6 ; G 2352 +U 9127 ; WX 750 ; N uni23A7 ; G 2353 +U 9128 ; WX 750 ; N uni23A8 ; G 2354 +U 9129 ; WX 750 ; N uni23A9 ; G 2355 +U 9130 ; WX 750 ; N uni23AA ; G 2356 +U 9131 ; WX 750 ; N uni23AB ; G 2357 +U 9132 ; WX 750 ; N uni23AC ; G 2358 +U 9133 ; WX 750 ; N uni23AD ; G 2359 +U 9134 ; WX 579 ; N uni23AE ; G 2360 +U 9167 ; WX 945 ; N uni23CF ; G 2361 +U 9251 ; WX 834 ; N uni2423 ; G 2362 +U 9472 ; WX 602 ; N SF100000 ; G 2363 +U 9473 ; WX 602 ; N uni2501 ; G 2364 +U 9474 ; WX 602 ; N SF110000 ; G 2365 +U 9475 ; WX 602 ; N uni2503 ; G 2366 +U 9476 ; WX 602 ; N uni2504 ; G 2367 +U 9477 ; WX 602 ; N uni2505 ; G 2368 +U 9478 ; WX 602 ; N uni2506 ; G 2369 +U 9479 ; WX 602 ; N uni2507 ; G 2370 +U 9480 ; WX 602 ; N uni2508 ; G 2371 +U 9481 ; WX 602 ; N uni2509 ; G 2372 +U 9482 ; WX 602 ; N uni250A ; G 2373 +U 9483 ; WX 602 ; N uni250B ; G 2374 +U 9484 ; WX 602 ; N SF010000 ; G 2375 +U 9485 ; WX 602 ; N uni250D ; G 2376 +U 9486 ; WX 602 ; N uni250E ; G 2377 +U 9487 ; WX 602 ; N uni250F ; G 2378 +U 9488 ; WX 602 ; N SF030000 ; G 2379 +U 9489 ; WX 602 ; N uni2511 ; G 2380 +U 9490 ; WX 602 ; N uni2512 ; G 2381 +U 9491 ; WX 602 ; N uni2513 ; G 2382 +U 9492 ; WX 602 ; N SF020000 ; G 2383 +U 9493 ; WX 602 ; N uni2515 ; G 2384 +U 9494 ; WX 602 ; N uni2516 ; G 2385 +U 9495 ; WX 602 ; N uni2517 ; G 2386 +U 9496 ; WX 602 ; N SF040000 ; G 2387 +U 9497 ; WX 602 ; N uni2519 ; G 2388 +U 9498 ; WX 602 ; N uni251A ; G 2389 +U 9499 ; WX 602 ; N uni251B ; G 2390 +U 9500 ; WX 602 ; N SF080000 ; G 2391 +U 9501 ; WX 602 ; N uni251D ; G 2392 +U 9502 ; WX 602 ; N uni251E ; G 2393 +U 9503 ; WX 602 ; N uni251F ; G 2394 +U 9504 ; WX 602 ; N uni2520 ; G 2395 +U 9505 ; WX 602 ; N uni2521 ; G 2396 +U 9506 ; WX 602 ; N uni2522 ; G 2397 +U 9507 ; WX 602 ; N uni2523 ; G 2398 +U 9508 ; WX 602 ; N SF090000 ; G 2399 +U 9509 ; WX 602 ; N uni2525 ; G 2400 +U 9510 ; WX 602 ; N uni2526 ; G 2401 +U 9511 ; WX 602 ; N uni2527 ; G 2402 +U 9512 ; WX 602 ; N uni2528 ; G 2403 +U 9513 ; WX 602 ; N uni2529 ; G 2404 +U 9514 ; WX 602 ; N uni252A ; G 2405 +U 9515 ; WX 602 ; N uni252B ; G 2406 +U 9516 ; WX 602 ; N SF060000 ; G 2407 +U 9517 ; WX 602 ; N uni252D ; G 2408 +U 9518 ; WX 602 ; N uni252E ; G 2409 +U 9519 ; WX 602 ; N uni252F ; G 2410 +U 9520 ; WX 602 ; N uni2530 ; G 2411 +U 9521 ; WX 602 ; N uni2531 ; G 2412 +U 9522 ; WX 602 ; N uni2532 ; G 2413 +U 9523 ; WX 602 ; N uni2533 ; G 2414 +U 9524 ; WX 602 ; N SF070000 ; G 2415 +U 9525 ; WX 602 ; N uni2535 ; G 2416 +U 9526 ; WX 602 ; N uni2536 ; G 2417 +U 9527 ; WX 602 ; N uni2537 ; G 2418 +U 9528 ; WX 602 ; N uni2538 ; G 2419 +U 9529 ; WX 602 ; N uni2539 ; G 2420 +U 9530 ; WX 602 ; N uni253A ; G 2421 +U 9531 ; WX 602 ; N uni253B ; G 2422 +U 9532 ; WX 602 ; N SF050000 ; G 2423 +U 9533 ; WX 602 ; N uni253D ; G 2424 +U 9534 ; WX 602 ; N uni253E ; G 2425 +U 9535 ; WX 602 ; N uni253F ; G 2426 +U 9536 ; WX 602 ; N uni2540 ; G 2427 +U 9537 ; WX 602 ; N uni2541 ; G 2428 +U 9538 ; WX 602 ; N uni2542 ; G 2429 +U 9539 ; WX 602 ; N uni2543 ; G 2430 +U 9540 ; WX 602 ; N uni2544 ; G 2431 +U 9541 ; WX 602 ; N uni2545 ; G 2432 +U 9542 ; WX 602 ; N uni2546 ; G 2433 +U 9543 ; WX 602 ; N uni2547 ; G 2434 +U 9544 ; WX 602 ; N uni2548 ; G 2435 +U 9545 ; WX 602 ; N uni2549 ; G 2436 +U 9546 ; WX 602 ; N uni254A ; G 2437 +U 9547 ; WX 602 ; N uni254B ; G 2438 +U 9548 ; WX 602 ; N uni254C ; G 2439 +U 9549 ; WX 602 ; N uni254D ; G 2440 +U 9550 ; WX 602 ; N uni254E ; G 2441 +U 9551 ; WX 602 ; N uni254F ; G 2442 +U 9552 ; WX 602 ; N SF430000 ; G 2443 +U 9553 ; WX 602 ; N SF240000 ; G 2444 +U 9554 ; WX 602 ; N SF510000 ; G 2445 +U 9555 ; WX 602 ; N SF520000 ; G 2446 +U 9556 ; WX 602 ; N SF390000 ; G 2447 +U 9557 ; WX 602 ; N SF220000 ; G 2448 +U 9558 ; WX 602 ; N SF210000 ; G 2449 +U 9559 ; WX 602 ; N SF250000 ; G 2450 +U 9560 ; WX 602 ; N SF500000 ; G 2451 +U 9561 ; WX 602 ; N SF490000 ; G 2452 +U 9562 ; WX 602 ; N SF380000 ; G 2453 +U 9563 ; WX 602 ; N SF280000 ; G 2454 +U 9564 ; WX 602 ; N SF270000 ; G 2455 +U 9565 ; WX 602 ; N SF260000 ; G 2456 +U 9566 ; WX 602 ; N SF360000 ; G 2457 +U 9567 ; WX 602 ; N SF370000 ; G 2458 +U 9568 ; WX 602 ; N SF420000 ; G 2459 +U 9569 ; WX 602 ; N SF190000 ; G 2460 +U 9570 ; WX 602 ; N SF200000 ; G 2461 +U 9571 ; WX 602 ; N SF230000 ; G 2462 +U 9572 ; WX 602 ; N SF470000 ; G 2463 +U 9573 ; WX 602 ; N SF480000 ; G 2464 +U 9574 ; WX 602 ; N SF410000 ; G 2465 +U 9575 ; WX 602 ; N SF450000 ; G 2466 +U 9576 ; WX 602 ; N SF460000 ; G 2467 +U 9577 ; WX 602 ; N SF400000 ; G 2468 +U 9578 ; WX 602 ; N SF540000 ; G 2469 +U 9579 ; WX 602 ; N SF530000 ; G 2470 +U 9580 ; WX 602 ; N SF440000 ; G 2471 +U 9581 ; WX 602 ; N uni256D ; G 2472 +U 9582 ; WX 602 ; N uni256E ; G 2473 +U 9583 ; WX 602 ; N uni256F ; G 2474 +U 9584 ; WX 602 ; N uni2570 ; G 2475 +U 9585 ; WX 602 ; N uni2571 ; G 2476 +U 9586 ; WX 602 ; N uni2572 ; G 2477 +U 9587 ; WX 602 ; N uni2573 ; G 2478 +U 9588 ; WX 602 ; N uni2574 ; G 2479 +U 9589 ; WX 602 ; N uni2575 ; G 2480 +U 9590 ; WX 602 ; N uni2576 ; G 2481 +U 9591 ; WX 602 ; N uni2577 ; G 2482 +U 9592 ; WX 602 ; N uni2578 ; G 2483 +U 9593 ; WX 602 ; N uni2579 ; G 2484 +U 9594 ; WX 602 ; N uni257A ; G 2485 +U 9595 ; WX 602 ; N uni257B ; G 2486 +U 9596 ; WX 602 ; N uni257C ; G 2487 +U 9597 ; WX 602 ; N uni257D ; G 2488 +U 9598 ; WX 602 ; N uni257E ; G 2489 +U 9599 ; WX 602 ; N uni257F ; G 2490 +U 9600 ; WX 769 ; N upblock ; G 2491 +U 9601 ; WX 769 ; N uni2581 ; G 2492 +U 9602 ; WX 769 ; N uni2582 ; G 2493 +U 9603 ; WX 769 ; N uni2583 ; G 2494 +U 9604 ; WX 769 ; N dnblock ; G 2495 +U 9605 ; WX 769 ; N uni2585 ; G 2496 +U 9606 ; WX 769 ; N uni2586 ; G 2497 +U 9607 ; WX 769 ; N uni2587 ; G 2498 +U 9608 ; WX 769 ; N block ; G 2499 +U 9609 ; WX 769 ; N uni2589 ; G 2500 +U 9610 ; WX 769 ; N uni258A ; G 2501 +U 9611 ; WX 769 ; N uni258B ; G 2502 +U 9612 ; WX 769 ; N lfblock ; G 2503 +U 9613 ; WX 769 ; N uni258D ; G 2504 +U 9614 ; WX 769 ; N uni258E ; G 2505 +U 9615 ; WX 769 ; N uni258F ; G 2506 +U 9616 ; WX 769 ; N rtblock ; G 2507 +U 9617 ; WX 769 ; N ltshade ; G 2508 +U 9618 ; WX 769 ; N shade ; G 2509 +U 9619 ; WX 769 ; N dkshade ; G 2510 +U 9620 ; WX 769 ; N uni2594 ; G 2511 +U 9621 ; WX 769 ; N uni2595 ; G 2512 +U 9622 ; WX 769 ; N uni2596 ; G 2513 +U 9623 ; WX 769 ; N uni2597 ; G 2514 +U 9624 ; WX 769 ; N uni2598 ; G 2515 +U 9625 ; WX 769 ; N uni2599 ; G 2516 +U 9626 ; WX 769 ; N uni259A ; G 2517 +U 9627 ; WX 769 ; N uni259B ; G 2518 +U 9628 ; WX 769 ; N uni259C ; G 2519 +U 9629 ; WX 769 ; N uni259D ; G 2520 +U 9630 ; WX 769 ; N uni259E ; G 2521 +U 9631 ; WX 769 ; N uni259F ; G 2522 +U 9632 ; WX 945 ; N filledbox ; G 2523 +U 9633 ; WX 945 ; N H22073 ; G 2524 +U 9634 ; WX 945 ; N uni25A2 ; G 2525 +U 9635 ; WX 945 ; N uni25A3 ; G 2526 +U 9636 ; WX 945 ; N uni25A4 ; G 2527 +U 9637 ; WX 945 ; N uni25A5 ; G 2528 +U 9638 ; WX 945 ; N uni25A6 ; G 2529 +U 9639 ; WX 945 ; N uni25A7 ; G 2530 +U 9640 ; WX 945 ; N uni25A8 ; G 2531 +U 9641 ; WX 945 ; N uni25A9 ; G 2532 +U 9642 ; WX 678 ; N H18543 ; G 2533 +U 9643 ; WX 678 ; N H18551 ; G 2534 +U 9644 ; WX 945 ; N filledrect ; G 2535 +U 9645 ; WX 945 ; N uni25AD ; G 2536 +U 9646 ; WX 550 ; N uni25AE ; G 2537 +U 9647 ; WX 550 ; N uni25AF ; G 2538 +U 9648 ; WX 769 ; N uni25B0 ; G 2539 +U 9649 ; WX 769 ; N uni25B1 ; G 2540 +U 9650 ; WX 769 ; N triagup ; G 2541 +U 9651 ; WX 769 ; N uni25B3 ; G 2542 +U 9652 ; WX 502 ; N uni25B4 ; G 2543 +U 9653 ; WX 502 ; N uni25B5 ; G 2544 +U 9654 ; WX 769 ; N uni25B6 ; G 2545 +U 9655 ; WX 769 ; N uni25B7 ; G 2546 +U 9656 ; WX 502 ; N uni25B8 ; G 2547 +U 9657 ; WX 502 ; N uni25B9 ; G 2548 +U 9658 ; WX 769 ; N triagrt ; G 2549 +U 9659 ; WX 769 ; N uni25BB ; G 2550 +U 9660 ; WX 769 ; N triagdn ; G 2551 +U 9661 ; WX 769 ; N uni25BD ; G 2552 +U 9662 ; WX 502 ; N uni25BE ; G 2553 +U 9663 ; WX 502 ; N uni25BF ; G 2554 +U 9664 ; WX 769 ; N uni25C0 ; G 2555 +U 9665 ; WX 769 ; N uni25C1 ; G 2556 +U 9666 ; WX 502 ; N uni25C2 ; G 2557 +U 9667 ; WX 502 ; N uni25C3 ; G 2558 +U 9668 ; WX 769 ; N triaglf ; G 2559 +U 9669 ; WX 769 ; N uni25C5 ; G 2560 +U 9670 ; WX 769 ; N uni25C6 ; G 2561 +U 9671 ; WX 769 ; N uni25C7 ; G 2562 +U 9672 ; WX 769 ; N uni25C8 ; G 2563 +U 9673 ; WX 873 ; N uni25C9 ; G 2564 +U 9674 ; WX 494 ; N lozenge ; G 2565 +U 9675 ; WX 873 ; N circle ; G 2566 +U 9676 ; WX 873 ; N uni25CC ; G 2567 +U 9677 ; WX 873 ; N uni25CD ; G 2568 +U 9678 ; WX 873 ; N uni25CE ; G 2569 +U 9679 ; WX 873 ; N H18533 ; G 2570 +U 9680 ; WX 873 ; N uni25D0 ; G 2571 +U 9681 ; WX 873 ; N uni25D1 ; G 2572 +U 9682 ; WX 873 ; N uni25D2 ; G 2573 +U 9683 ; WX 873 ; N uni25D3 ; G 2574 +U 9684 ; WX 873 ; N uni25D4 ; G 2575 +U 9685 ; WX 873 ; N uni25D5 ; G 2576 +U 9686 ; WX 527 ; N uni25D6 ; G 2577 +U 9687 ; WX 527 ; N uni25D7 ; G 2578 +U 9688 ; WX 791 ; N invbullet ; G 2579 +U 9689 ; WX 970 ; N invcircle ; G 2580 +U 9690 ; WX 970 ; N uni25DA ; G 2581 +U 9691 ; WX 970 ; N uni25DB ; G 2582 +U 9692 ; WX 387 ; N uni25DC ; G 2583 +U 9693 ; WX 387 ; N uni25DD ; G 2584 +U 9694 ; WX 387 ; N uni25DE ; G 2585 +U 9695 ; WX 387 ; N uni25DF ; G 2586 +U 9696 ; WX 873 ; N uni25E0 ; G 2587 +U 9697 ; WX 873 ; N uni25E1 ; G 2588 +U 9698 ; WX 769 ; N uni25E2 ; G 2589 +U 9699 ; WX 769 ; N uni25E3 ; G 2590 +U 9700 ; WX 769 ; N uni25E4 ; G 2591 +U 9701 ; WX 769 ; N uni25E5 ; G 2592 +U 9702 ; WX 590 ; N openbullet ; G 2593 +U 9703 ; WX 945 ; N uni25E7 ; G 2594 +U 9704 ; WX 945 ; N uni25E8 ; G 2595 +U 9705 ; WX 945 ; N uni25E9 ; G 2596 +U 9706 ; WX 945 ; N uni25EA ; G 2597 +U 9707 ; WX 945 ; N uni25EB ; G 2598 +U 9708 ; WX 769 ; N uni25EC ; G 2599 +U 9709 ; WX 769 ; N uni25ED ; G 2600 +U 9710 ; WX 769 ; N uni25EE ; G 2601 +U 9711 ; WX 1119 ; N uni25EF ; G 2602 +U 9712 ; WX 945 ; N uni25F0 ; G 2603 +U 9713 ; WX 945 ; N uni25F1 ; G 2604 +U 9714 ; WX 945 ; N uni25F2 ; G 2605 +U 9715 ; WX 945 ; N uni25F3 ; G 2606 +U 9716 ; WX 873 ; N uni25F4 ; G 2607 +U 9717 ; WX 873 ; N uni25F5 ; G 2608 +U 9718 ; WX 873 ; N uni25F6 ; G 2609 +U 9719 ; WX 873 ; N uni25F7 ; G 2610 +U 9720 ; WX 769 ; N uni25F8 ; G 2611 +U 9721 ; WX 769 ; N uni25F9 ; G 2612 +U 9722 ; WX 769 ; N uni25FA ; G 2613 +U 9723 ; WX 830 ; N uni25FB ; G 2614 +U 9724 ; WX 830 ; N uni25FC ; G 2615 +U 9725 ; WX 732 ; N uni25FD ; G 2616 +U 9726 ; WX 732 ; N uni25FE ; G 2617 +U 9727 ; WX 769 ; N uni25FF ; G 2618 +U 9728 ; WX 896 ; N uni2600 ; G 2619 +U 9784 ; WX 896 ; N uni2638 ; G 2620 +U 9785 ; WX 896 ; N uni2639 ; G 2621 +U 9786 ; WX 896 ; N smileface ; G 2622 +U 9787 ; WX 896 ; N invsmileface ; G 2623 +U 9788 ; WX 896 ; N sun ; G 2624 +U 9791 ; WX 614 ; N uni263F ; G 2625 +U 9792 ; WX 731 ; N female ; G 2626 +U 9793 ; WX 731 ; N uni2641 ; G 2627 +U 9794 ; WX 896 ; N male ; G 2628 +U 9795 ; WX 896 ; N uni2643 ; G 2629 +U 9796 ; WX 896 ; N uni2644 ; G 2630 +U 9797 ; WX 896 ; N uni2645 ; G 2631 +U 9798 ; WX 896 ; N uni2646 ; G 2632 +U 9799 ; WX 896 ; N uni2647 ; G 2633 +U 9824 ; WX 896 ; N spade ; G 2634 +U 9825 ; WX 896 ; N uni2661 ; G 2635 +U 9826 ; WX 896 ; N uni2662 ; G 2636 +U 9827 ; WX 896 ; N club ; G 2637 +U 9828 ; WX 896 ; N uni2664 ; G 2638 +U 9829 ; WX 896 ; N heart ; G 2639 +U 9830 ; WX 896 ; N diamond ; G 2640 +U 9831 ; WX 896 ; N uni2667 ; G 2641 +U 9833 ; WX 472 ; N uni2669 ; G 2642 +U 9834 ; WX 638 ; N musicalnote ; G 2643 +U 9835 ; WX 896 ; N musicalnotedbl ; G 2644 +U 9836 ; WX 896 ; N uni266C ; G 2645 +U 9837 ; WX 472 ; N uni266D ; G 2646 +U 9838 ; WX 357 ; N uni266E ; G 2647 +U 9839 ; WX 484 ; N uni266F ; G 2648 +U 10145 ; WX 838 ; N uni27A1 ; G 2649 +U 10181 ; WX 457 ; N uni27C5 ; G 2650 +U 10182 ; WX 457 ; N uni27C6 ; G 2651 +U 10208 ; WX 494 ; N uni27E0 ; G 2652 +U 10216 ; WX 457 ; N uni27E8 ; G 2653 +U 10217 ; WX 457 ; N uni27E9 ; G 2654 +U 10224 ; WX 838 ; N uni27F0 ; G 2655 +U 10225 ; WX 838 ; N uni27F1 ; G 2656 +U 10226 ; WX 838 ; N uni27F2 ; G 2657 +U 10227 ; WX 838 ; N uni27F3 ; G 2658 +U 10228 ; WX 1033 ; N uni27F4 ; G 2659 +U 10229 ; WX 1434 ; N uni27F5 ; G 2660 +U 10230 ; WX 1434 ; N uni27F6 ; G 2661 +U 10231 ; WX 1434 ; N uni27F7 ; G 2662 +U 10232 ; WX 1434 ; N uni27F8 ; G 2663 +U 10233 ; WX 1434 ; N uni27F9 ; G 2664 +U 10234 ; WX 1434 ; N uni27FA ; G 2665 +U 10235 ; WX 1434 ; N uni27FB ; G 2666 +U 10236 ; WX 1434 ; N uni27FC ; G 2667 +U 10237 ; WX 1434 ; N uni27FD ; G 2668 +U 10238 ; WX 1434 ; N uni27FE ; G 2669 +U 10239 ; WX 1434 ; N uni27FF ; G 2670 +U 10240 ; WX 781 ; N uni2800 ; G 2671 +U 10241 ; WX 781 ; N uni2801 ; G 2672 +U 10242 ; WX 781 ; N uni2802 ; G 2673 +U 10243 ; WX 781 ; N uni2803 ; G 2674 +U 10244 ; WX 781 ; N uni2804 ; G 2675 +U 10245 ; WX 781 ; N uni2805 ; G 2676 +U 10246 ; WX 781 ; N uni2806 ; G 2677 +U 10247 ; WX 781 ; N uni2807 ; G 2678 +U 10248 ; WX 781 ; N uni2808 ; G 2679 +U 10249 ; WX 781 ; N uni2809 ; G 2680 +U 10250 ; WX 781 ; N uni280A ; G 2681 +U 10251 ; WX 781 ; N uni280B ; G 2682 +U 10252 ; WX 781 ; N uni280C ; G 2683 +U 10253 ; WX 781 ; N uni280D ; G 2684 +U 10254 ; WX 781 ; N uni280E ; G 2685 +U 10255 ; WX 781 ; N uni280F ; G 2686 +U 10256 ; WX 781 ; N uni2810 ; G 2687 +U 10257 ; WX 781 ; N uni2811 ; G 2688 +U 10258 ; WX 781 ; N uni2812 ; G 2689 +U 10259 ; WX 781 ; N uni2813 ; G 2690 +U 10260 ; WX 781 ; N uni2814 ; G 2691 +U 10261 ; WX 781 ; N uni2815 ; G 2692 +U 10262 ; WX 781 ; N uni2816 ; G 2693 +U 10263 ; WX 781 ; N uni2817 ; G 2694 +U 10264 ; WX 781 ; N uni2818 ; G 2695 +U 10265 ; WX 781 ; N uni2819 ; G 2696 +U 10266 ; WX 781 ; N uni281A ; G 2697 +U 10267 ; WX 781 ; N uni281B ; G 2698 +U 10268 ; WX 781 ; N uni281C ; G 2699 +U 10269 ; WX 781 ; N uni281D ; G 2700 +U 10270 ; WX 781 ; N uni281E ; G 2701 +U 10271 ; WX 781 ; N uni281F ; G 2702 +U 10272 ; WX 781 ; N uni2820 ; G 2703 +U 10273 ; WX 781 ; N uni2821 ; G 2704 +U 10274 ; WX 781 ; N uni2822 ; G 2705 +U 10275 ; WX 781 ; N uni2823 ; G 2706 +U 10276 ; WX 781 ; N uni2824 ; G 2707 +U 10277 ; WX 781 ; N uni2825 ; G 2708 +U 10278 ; WX 781 ; N uni2826 ; G 2709 +U 10279 ; WX 781 ; N uni2827 ; G 2710 +U 10280 ; WX 781 ; N uni2828 ; G 2711 +U 10281 ; WX 781 ; N uni2829 ; G 2712 +U 10282 ; WX 781 ; N uni282A ; G 2713 +U 10283 ; WX 781 ; N uni282B ; G 2714 +U 10284 ; WX 781 ; N uni282C ; G 2715 +U 10285 ; WX 781 ; N uni282D ; G 2716 +U 10286 ; WX 781 ; N uni282E ; G 2717 +U 10287 ; WX 781 ; N uni282F ; G 2718 +U 10288 ; WX 781 ; N uni2830 ; G 2719 +U 10289 ; WX 781 ; N uni2831 ; G 2720 +U 10290 ; WX 781 ; N uni2832 ; G 2721 +U 10291 ; WX 781 ; N uni2833 ; G 2722 +U 10292 ; WX 781 ; N uni2834 ; G 2723 +U 10293 ; WX 781 ; N uni2835 ; G 2724 +U 10294 ; WX 781 ; N uni2836 ; G 2725 +U 10295 ; WX 781 ; N uni2837 ; G 2726 +U 10296 ; WX 781 ; N uni2838 ; G 2727 +U 10297 ; WX 781 ; N uni2839 ; G 2728 +U 10298 ; WX 781 ; N uni283A ; G 2729 +U 10299 ; WX 781 ; N uni283B ; G 2730 +U 10300 ; WX 781 ; N uni283C ; G 2731 +U 10301 ; WX 781 ; N uni283D ; G 2732 +U 10302 ; WX 781 ; N uni283E ; G 2733 +U 10303 ; WX 781 ; N uni283F ; G 2734 +U 10304 ; WX 781 ; N uni2840 ; G 2735 +U 10305 ; WX 781 ; N uni2841 ; G 2736 +U 10306 ; WX 781 ; N uni2842 ; G 2737 +U 10307 ; WX 781 ; N uni2843 ; G 2738 +U 10308 ; WX 781 ; N uni2844 ; G 2739 +U 10309 ; WX 781 ; N uni2845 ; G 2740 +U 10310 ; WX 781 ; N uni2846 ; G 2741 +U 10311 ; WX 781 ; N uni2847 ; G 2742 +U 10312 ; WX 781 ; N uni2848 ; G 2743 +U 10313 ; WX 781 ; N uni2849 ; G 2744 +U 10314 ; WX 781 ; N uni284A ; G 2745 +U 10315 ; WX 781 ; N uni284B ; G 2746 +U 10316 ; WX 781 ; N uni284C ; G 2747 +U 10317 ; WX 781 ; N uni284D ; G 2748 +U 10318 ; WX 781 ; N uni284E ; G 2749 +U 10319 ; WX 781 ; N uni284F ; G 2750 +U 10320 ; WX 781 ; N uni2850 ; G 2751 +U 10321 ; WX 781 ; N uni2851 ; G 2752 +U 10322 ; WX 781 ; N uni2852 ; G 2753 +U 10323 ; WX 781 ; N uni2853 ; G 2754 +U 10324 ; WX 781 ; N uni2854 ; G 2755 +U 10325 ; WX 781 ; N uni2855 ; G 2756 +U 10326 ; WX 781 ; N uni2856 ; G 2757 +U 10327 ; WX 781 ; N uni2857 ; G 2758 +U 10328 ; WX 781 ; N uni2858 ; G 2759 +U 10329 ; WX 781 ; N uni2859 ; G 2760 +U 10330 ; WX 781 ; N uni285A ; G 2761 +U 10331 ; WX 781 ; N uni285B ; G 2762 +U 10332 ; WX 781 ; N uni285C ; G 2763 +U 10333 ; WX 781 ; N uni285D ; G 2764 +U 10334 ; WX 781 ; N uni285E ; G 2765 +U 10335 ; WX 781 ; N uni285F ; G 2766 +U 10336 ; WX 781 ; N uni2860 ; G 2767 +U 10337 ; WX 781 ; N uni2861 ; G 2768 +U 10338 ; WX 781 ; N uni2862 ; G 2769 +U 10339 ; WX 781 ; N uni2863 ; G 2770 +U 10340 ; WX 781 ; N uni2864 ; G 2771 +U 10341 ; WX 781 ; N uni2865 ; G 2772 +U 10342 ; WX 781 ; N uni2866 ; G 2773 +U 10343 ; WX 781 ; N uni2867 ; G 2774 +U 10344 ; WX 781 ; N uni2868 ; G 2775 +U 10345 ; WX 781 ; N uni2869 ; G 2776 +U 10346 ; WX 781 ; N uni286A ; G 2777 +U 10347 ; WX 781 ; N uni286B ; G 2778 +U 10348 ; WX 781 ; N uni286C ; G 2779 +U 10349 ; WX 781 ; N uni286D ; G 2780 +U 10350 ; WX 781 ; N uni286E ; G 2781 +U 10351 ; WX 781 ; N uni286F ; G 2782 +U 10352 ; WX 781 ; N uni2870 ; G 2783 +U 10353 ; WX 781 ; N uni2871 ; G 2784 +U 10354 ; WX 781 ; N uni2872 ; G 2785 +U 10355 ; WX 781 ; N uni2873 ; G 2786 +U 10356 ; WX 781 ; N uni2874 ; G 2787 +U 10357 ; WX 781 ; N uni2875 ; G 2788 +U 10358 ; WX 781 ; N uni2876 ; G 2789 +U 10359 ; WX 781 ; N uni2877 ; G 2790 +U 10360 ; WX 781 ; N uni2878 ; G 2791 +U 10361 ; WX 781 ; N uni2879 ; G 2792 +U 10362 ; WX 781 ; N uni287A ; G 2793 +U 10363 ; WX 781 ; N uni287B ; G 2794 +U 10364 ; WX 781 ; N uni287C ; G 2795 +U 10365 ; WX 781 ; N uni287D ; G 2796 +U 10366 ; WX 781 ; N uni287E ; G 2797 +U 10367 ; WX 781 ; N uni287F ; G 2798 +U 10368 ; WX 781 ; N uni2880 ; G 2799 +U 10369 ; WX 781 ; N uni2881 ; G 2800 +U 10370 ; WX 781 ; N uni2882 ; G 2801 +U 10371 ; WX 781 ; N uni2883 ; G 2802 +U 10372 ; WX 781 ; N uni2884 ; G 2803 +U 10373 ; WX 781 ; N uni2885 ; G 2804 +U 10374 ; WX 781 ; N uni2886 ; G 2805 +U 10375 ; WX 781 ; N uni2887 ; G 2806 +U 10376 ; WX 781 ; N uni2888 ; G 2807 +U 10377 ; WX 781 ; N uni2889 ; G 2808 +U 10378 ; WX 781 ; N uni288A ; G 2809 +U 10379 ; WX 781 ; N uni288B ; G 2810 +U 10380 ; WX 781 ; N uni288C ; G 2811 +U 10381 ; WX 781 ; N uni288D ; G 2812 +U 10382 ; WX 781 ; N uni288E ; G 2813 +U 10383 ; WX 781 ; N uni288F ; G 2814 +U 10384 ; WX 781 ; N uni2890 ; G 2815 +U 10385 ; WX 781 ; N uni2891 ; G 2816 +U 10386 ; WX 781 ; N uni2892 ; G 2817 +U 10387 ; WX 781 ; N uni2893 ; G 2818 +U 10388 ; WX 781 ; N uni2894 ; G 2819 +U 10389 ; WX 781 ; N uni2895 ; G 2820 +U 10390 ; WX 781 ; N uni2896 ; G 2821 +U 10391 ; WX 781 ; N uni2897 ; G 2822 +U 10392 ; WX 781 ; N uni2898 ; G 2823 +U 10393 ; WX 781 ; N uni2899 ; G 2824 +U 10394 ; WX 781 ; N uni289A ; G 2825 +U 10395 ; WX 781 ; N uni289B ; G 2826 +U 10396 ; WX 781 ; N uni289C ; G 2827 +U 10397 ; WX 781 ; N uni289D ; G 2828 +U 10398 ; WX 781 ; N uni289E ; G 2829 +U 10399 ; WX 781 ; N uni289F ; G 2830 +U 10400 ; WX 781 ; N uni28A0 ; G 2831 +U 10401 ; WX 781 ; N uni28A1 ; G 2832 +U 10402 ; WX 781 ; N uni28A2 ; G 2833 +U 10403 ; WX 781 ; N uni28A3 ; G 2834 +U 10404 ; WX 781 ; N uni28A4 ; G 2835 +U 10405 ; WX 781 ; N uni28A5 ; G 2836 +U 10406 ; WX 781 ; N uni28A6 ; G 2837 +U 10407 ; WX 781 ; N uni28A7 ; G 2838 +U 10408 ; WX 781 ; N uni28A8 ; G 2839 +U 10409 ; WX 781 ; N uni28A9 ; G 2840 +U 10410 ; WX 781 ; N uni28AA ; G 2841 +U 10411 ; WX 781 ; N uni28AB ; G 2842 +U 10412 ; WX 781 ; N uni28AC ; G 2843 +U 10413 ; WX 781 ; N uni28AD ; G 2844 +U 10414 ; WX 781 ; N uni28AE ; G 2845 +U 10415 ; WX 781 ; N uni28AF ; G 2846 +U 10416 ; WX 781 ; N uni28B0 ; G 2847 +U 10417 ; WX 781 ; N uni28B1 ; G 2848 +U 10418 ; WX 781 ; N uni28B2 ; G 2849 +U 10419 ; WX 781 ; N uni28B3 ; G 2850 +U 10420 ; WX 781 ; N uni28B4 ; G 2851 +U 10421 ; WX 781 ; N uni28B5 ; G 2852 +U 10422 ; WX 781 ; N uni28B6 ; G 2853 +U 10423 ; WX 781 ; N uni28B7 ; G 2854 +U 10424 ; WX 781 ; N uni28B8 ; G 2855 +U 10425 ; WX 781 ; N uni28B9 ; G 2856 +U 10426 ; WX 781 ; N uni28BA ; G 2857 +U 10427 ; WX 781 ; N uni28BB ; G 2858 +U 10428 ; WX 781 ; N uni28BC ; G 2859 +U 10429 ; WX 781 ; N uni28BD ; G 2860 +U 10430 ; WX 781 ; N uni28BE ; G 2861 +U 10431 ; WX 781 ; N uni28BF ; G 2862 +U 10432 ; WX 781 ; N uni28C0 ; G 2863 +U 10433 ; WX 781 ; N uni28C1 ; G 2864 +U 10434 ; WX 781 ; N uni28C2 ; G 2865 +U 10435 ; WX 781 ; N uni28C3 ; G 2866 +U 10436 ; WX 781 ; N uni28C4 ; G 2867 +U 10437 ; WX 781 ; N uni28C5 ; G 2868 +U 10438 ; WX 781 ; N uni28C6 ; G 2869 +U 10439 ; WX 781 ; N uni28C7 ; G 2870 +U 10440 ; WX 781 ; N uni28C8 ; G 2871 +U 10441 ; WX 781 ; N uni28C9 ; G 2872 +U 10442 ; WX 781 ; N uni28CA ; G 2873 +U 10443 ; WX 781 ; N uni28CB ; G 2874 +U 10444 ; WX 781 ; N uni28CC ; G 2875 +U 10445 ; WX 781 ; N uni28CD ; G 2876 +U 10446 ; WX 781 ; N uni28CE ; G 2877 +U 10447 ; WX 781 ; N uni28CF ; G 2878 +U 10448 ; WX 781 ; N uni28D0 ; G 2879 +U 10449 ; WX 781 ; N uni28D1 ; G 2880 +U 10450 ; WX 781 ; N uni28D2 ; G 2881 +U 10451 ; WX 781 ; N uni28D3 ; G 2882 +U 10452 ; WX 781 ; N uni28D4 ; G 2883 +U 10453 ; WX 781 ; N uni28D5 ; G 2884 +U 10454 ; WX 781 ; N uni28D6 ; G 2885 +U 10455 ; WX 781 ; N uni28D7 ; G 2886 +U 10456 ; WX 781 ; N uni28D8 ; G 2887 +U 10457 ; WX 781 ; N uni28D9 ; G 2888 +U 10458 ; WX 781 ; N uni28DA ; G 2889 +U 10459 ; WX 781 ; N uni28DB ; G 2890 +U 10460 ; WX 781 ; N uni28DC ; G 2891 +U 10461 ; WX 781 ; N uni28DD ; G 2892 +U 10462 ; WX 781 ; N uni28DE ; G 2893 +U 10463 ; WX 781 ; N uni28DF ; G 2894 +U 10464 ; WX 781 ; N uni28E0 ; G 2895 +U 10465 ; WX 781 ; N uni28E1 ; G 2896 +U 10466 ; WX 781 ; N uni28E2 ; G 2897 +U 10467 ; WX 781 ; N uni28E3 ; G 2898 +U 10468 ; WX 781 ; N uni28E4 ; G 2899 +U 10469 ; WX 781 ; N uni28E5 ; G 2900 +U 10470 ; WX 781 ; N uni28E6 ; G 2901 +U 10471 ; WX 781 ; N uni28E7 ; G 2902 +U 10472 ; WX 781 ; N uni28E8 ; G 2903 +U 10473 ; WX 781 ; N uni28E9 ; G 2904 +U 10474 ; WX 781 ; N uni28EA ; G 2905 +U 10475 ; WX 781 ; N uni28EB ; G 2906 +U 10476 ; WX 781 ; N uni28EC ; G 2907 +U 10477 ; WX 781 ; N uni28ED ; G 2908 +U 10478 ; WX 781 ; N uni28EE ; G 2909 +U 10479 ; WX 781 ; N uni28EF ; G 2910 +U 10480 ; WX 781 ; N uni28F0 ; G 2911 +U 10481 ; WX 781 ; N uni28F1 ; G 2912 +U 10482 ; WX 781 ; N uni28F2 ; G 2913 +U 10483 ; WX 781 ; N uni28F3 ; G 2914 +U 10484 ; WX 781 ; N uni28F4 ; G 2915 +U 10485 ; WX 781 ; N uni28F5 ; G 2916 +U 10486 ; WX 781 ; N uni28F6 ; G 2917 +U 10487 ; WX 781 ; N uni28F7 ; G 2918 +U 10488 ; WX 781 ; N uni28F8 ; G 2919 +U 10489 ; WX 781 ; N uni28F9 ; G 2920 +U 10490 ; WX 781 ; N uni28FA ; G 2921 +U 10491 ; WX 781 ; N uni28FB ; G 2922 +U 10492 ; WX 781 ; N uni28FC ; G 2923 +U 10493 ; WX 781 ; N uni28FD ; G 2924 +U 10494 ; WX 781 ; N uni28FE ; G 2925 +U 10495 ; WX 781 ; N uni28FF ; G 2926 +U 10496 ; WX 838 ; N uni2900 ; G 2927 +U 10497 ; WX 838 ; N uni2901 ; G 2928 +U 10498 ; WX 838 ; N uni2902 ; G 2929 +U 10499 ; WX 838 ; N uni2903 ; G 2930 +U 10500 ; WX 838 ; N uni2904 ; G 2931 +U 10501 ; WX 838 ; N uni2905 ; G 2932 +U 10502 ; WX 838 ; N uni2906 ; G 2933 +U 10503 ; WX 838 ; N uni2907 ; G 2934 +U 10504 ; WX 838 ; N uni2908 ; G 2935 +U 10505 ; WX 838 ; N uni2909 ; G 2936 +U 10506 ; WX 838 ; N uni290A ; G 2937 +U 10507 ; WX 838 ; N uni290B ; G 2938 +U 10508 ; WX 838 ; N uni290C ; G 2939 +U 10509 ; WX 838 ; N uni290D ; G 2940 +U 10510 ; WX 838 ; N uni290E ; G 2941 +U 10511 ; WX 838 ; N uni290F ; G 2942 +U 10512 ; WX 838 ; N uni2910 ; G 2943 +U 10513 ; WX 838 ; N uni2911 ; G 2944 +U 10514 ; WX 838 ; N uni2912 ; G 2945 +U 10515 ; WX 838 ; N uni2913 ; G 2946 +U 10516 ; WX 838 ; N uni2914 ; G 2947 +U 10517 ; WX 838 ; N uni2915 ; G 2948 +U 10518 ; WX 838 ; N uni2916 ; G 2949 +U 10519 ; WX 838 ; N uni2917 ; G 2950 +U 10520 ; WX 838 ; N uni2918 ; G 2951 +U 10521 ; WX 838 ; N uni2919 ; G 2952 +U 10522 ; WX 838 ; N uni291A ; G 2953 +U 10523 ; WX 838 ; N uni291B ; G 2954 +U 10524 ; WX 838 ; N uni291C ; G 2955 +U 10525 ; WX 838 ; N uni291D ; G 2956 +U 10526 ; WX 838 ; N uni291E ; G 2957 +U 10527 ; WX 838 ; N uni291F ; G 2958 +U 10528 ; WX 838 ; N uni2920 ; G 2959 +U 10529 ; WX 838 ; N uni2921 ; G 2960 +U 10530 ; WX 838 ; N uni2922 ; G 2961 +U 10531 ; WX 838 ; N uni2923 ; G 2962 +U 10532 ; WX 838 ; N uni2924 ; G 2963 +U 10533 ; WX 838 ; N uni2925 ; G 2964 +U 10534 ; WX 838 ; N uni2926 ; G 2965 +U 10535 ; WX 838 ; N uni2927 ; G 2966 +U 10536 ; WX 838 ; N uni2928 ; G 2967 +U 10537 ; WX 838 ; N uni2929 ; G 2968 +U 10538 ; WX 838 ; N uni292A ; G 2969 +U 10539 ; WX 838 ; N uni292B ; G 2970 +U 10540 ; WX 838 ; N uni292C ; G 2971 +U 10541 ; WX 838 ; N uni292D ; G 2972 +U 10542 ; WX 838 ; N uni292E ; G 2973 +U 10543 ; WX 838 ; N uni292F ; G 2974 +U 10544 ; WX 838 ; N uni2930 ; G 2975 +U 10545 ; WX 838 ; N uni2931 ; G 2976 +U 10546 ; WX 838 ; N uni2932 ; G 2977 +U 10547 ; WX 838 ; N uni2933 ; G 2978 +U 10548 ; WX 838 ; N uni2934 ; G 2979 +U 10549 ; WX 838 ; N uni2935 ; G 2980 +U 10550 ; WX 838 ; N uni2936 ; G 2981 +U 10551 ; WX 838 ; N uni2937 ; G 2982 +U 10552 ; WX 838 ; N uni2938 ; G 2983 +U 10553 ; WX 838 ; N uni2939 ; G 2984 +U 10554 ; WX 838 ; N uni293A ; G 2985 +U 10555 ; WX 838 ; N uni293B ; G 2986 +U 10556 ; WX 838 ; N uni293C ; G 2987 +U 10557 ; WX 838 ; N uni293D ; G 2988 +U 10558 ; WX 838 ; N uni293E ; G 2989 +U 10559 ; WX 838 ; N uni293F ; G 2990 +U 10560 ; WX 838 ; N uni2940 ; G 2991 +U 10561 ; WX 838 ; N uni2941 ; G 2992 +U 10562 ; WX 838 ; N uni2942 ; G 2993 +U 10563 ; WX 838 ; N uni2943 ; G 2994 +U 10564 ; WX 838 ; N uni2944 ; G 2995 +U 10565 ; WX 838 ; N uni2945 ; G 2996 +U 10566 ; WX 838 ; N uni2946 ; G 2997 +U 10567 ; WX 838 ; N uni2947 ; G 2998 +U 10568 ; WX 838 ; N uni2948 ; G 2999 +U 10569 ; WX 838 ; N uni2949 ; G 3000 +U 10570 ; WX 838 ; N uni294A ; G 3001 +U 10571 ; WX 838 ; N uni294B ; G 3002 +U 10572 ; WX 838 ; N uni294C ; G 3003 +U 10573 ; WX 838 ; N uni294D ; G 3004 +U 10574 ; WX 838 ; N uni294E ; G 3005 +U 10575 ; WX 838 ; N uni294F ; G 3006 +U 10576 ; WX 838 ; N uni2950 ; G 3007 +U 10577 ; WX 838 ; N uni2951 ; G 3008 +U 10578 ; WX 838 ; N uni2952 ; G 3009 +U 10579 ; WX 838 ; N uni2953 ; G 3010 +U 10580 ; WX 838 ; N uni2954 ; G 3011 +U 10581 ; WX 838 ; N uni2955 ; G 3012 +U 10582 ; WX 838 ; N uni2956 ; G 3013 +U 10583 ; WX 838 ; N uni2957 ; G 3014 +U 10584 ; WX 838 ; N uni2958 ; G 3015 +U 10585 ; WX 838 ; N uni2959 ; G 3016 +U 10586 ; WX 838 ; N uni295A ; G 3017 +U 10587 ; WX 838 ; N uni295B ; G 3018 +U 10588 ; WX 838 ; N uni295C ; G 3019 +U 10589 ; WX 838 ; N uni295D ; G 3020 +U 10590 ; WX 838 ; N uni295E ; G 3021 +U 10591 ; WX 838 ; N uni295F ; G 3022 +U 10592 ; WX 838 ; N uni2960 ; G 3023 +U 10593 ; WX 838 ; N uni2961 ; G 3024 +U 10594 ; WX 838 ; N uni2962 ; G 3025 +U 10595 ; WX 838 ; N uni2963 ; G 3026 +U 10596 ; WX 838 ; N uni2964 ; G 3027 +U 10597 ; WX 838 ; N uni2965 ; G 3028 +U 10598 ; WX 838 ; N uni2966 ; G 3029 +U 10599 ; WX 838 ; N uni2967 ; G 3030 +U 10600 ; WX 838 ; N uni2968 ; G 3031 +U 10601 ; WX 838 ; N uni2969 ; G 3032 +U 10602 ; WX 838 ; N uni296A ; G 3033 +U 10603 ; WX 838 ; N uni296B ; G 3034 +U 10604 ; WX 838 ; N uni296C ; G 3035 +U 10605 ; WX 838 ; N uni296D ; G 3036 +U 10606 ; WX 838 ; N uni296E ; G 3037 +U 10607 ; WX 838 ; N uni296F ; G 3038 +U 10608 ; WX 838 ; N uni2970 ; G 3039 +U 10609 ; WX 838 ; N uni2971 ; G 3040 +U 10610 ; WX 838 ; N uni2972 ; G 3041 +U 10611 ; WX 838 ; N uni2973 ; G 3042 +U 10612 ; WX 838 ; N uni2974 ; G 3043 +U 10613 ; WX 838 ; N uni2975 ; G 3044 +U 10614 ; WX 838 ; N uni2976 ; G 3045 +U 10615 ; WX 1032 ; N uni2977 ; G 3046 +U 10616 ; WX 838 ; N uni2978 ; G 3047 +U 10617 ; WX 838 ; N uni2979 ; G 3048 +U 10618 ; WX 960 ; N uni297A ; G 3049 +U 10619 ; WX 838 ; N uni297B ; G 3050 +U 10620 ; WX 838 ; N uni297C ; G 3051 +U 10621 ; WX 838 ; N uni297D ; G 3052 +U 10622 ; WX 838 ; N uni297E ; G 3053 +U 10623 ; WX 838 ; N uni297F ; G 3054 +U 10731 ; WX 494 ; N uni29EB ; G 3055 +U 10764 ; WX 1782 ; N uni2A0C ; G 3056 +U 10765 ; WX 610 ; N uni2A0D ; G 3057 +U 10766 ; WX 610 ; N uni2A0E ; G 3058 +U 10799 ; WX 838 ; N uni2A2F ; G 3059 +U 10858 ; WX 838 ; N uni2A6A ; G 3060 +U 10859 ; WX 838 ; N uni2A6B ; G 3061 +U 11008 ; WX 838 ; N uni2B00 ; G 3062 +U 11009 ; WX 838 ; N uni2B01 ; G 3063 +U 11010 ; WX 838 ; N uni2B02 ; G 3064 +U 11011 ; WX 838 ; N uni2B03 ; G 3065 +U 11012 ; WX 838 ; N uni2B04 ; G 3066 +U 11013 ; WX 838 ; N uni2B05 ; G 3067 +U 11014 ; WX 838 ; N uni2B06 ; G 3068 +U 11015 ; WX 838 ; N uni2B07 ; G 3069 +U 11016 ; WX 838 ; N uni2B08 ; G 3070 +U 11017 ; WX 838 ; N uni2B09 ; G 3071 +U 11018 ; WX 838 ; N uni2B0A ; G 3072 +U 11019 ; WX 838 ; N uni2B0B ; G 3073 +U 11020 ; WX 838 ; N uni2B0C ; G 3074 +U 11021 ; WX 838 ; N uni2B0D ; G 3075 +U 11022 ; WX 838 ; N uni2B0E ; G 3076 +U 11023 ; WX 838 ; N uni2B0F ; G 3077 +U 11024 ; WX 838 ; N uni2B10 ; G 3078 +U 11025 ; WX 838 ; N uni2B11 ; G 3079 +U 11026 ; WX 945 ; N uni2B12 ; G 3080 +U 11027 ; WX 945 ; N uni2B13 ; G 3081 +U 11028 ; WX 945 ; N uni2B14 ; G 3082 +U 11029 ; WX 945 ; N uni2B15 ; G 3083 +U 11030 ; WX 769 ; N uni2B16 ; G 3084 +U 11031 ; WX 769 ; N uni2B17 ; G 3085 +U 11032 ; WX 769 ; N uni2B18 ; G 3086 +U 11033 ; WX 769 ; N uni2B19 ; G 3087 +U 11034 ; WX 945 ; N uni2B1A ; G 3088 +U 11360 ; WX 703 ; N uni2C60 ; G 3089 +U 11361 ; WX 380 ; N uni2C61 ; G 3090 +U 11363 ; WX 752 ; N uni2C63 ; G 3091 +U 11364 ; WX 831 ; N uni2C64 ; G 3092 +U 11367 ; WX 945 ; N uni2C67 ; G 3093 +U 11368 ; WX 727 ; N uni2C68 ; G 3094 +U 11369 ; WX 869 ; N uni2C69 ; G 3095 +U 11370 ; WX 693 ; N uni2C6A ; G 3096 +U 11371 ; WX 730 ; N uni2C6B ; G 3097 +U 11372 ; WX 568 ; N uni2C6C ; G 3098 +U 11373 ; WX 848 ; N uni2C6D ; G 3099 +U 11374 ; WX 1107 ; N uni2C6E ; G 3100 +U 11375 ; WX 776 ; N uni2C6F ; G 3101 +U 11376 ; WX 848 ; N uni2C70 ; G 3102 +U 11377 ; WX 709 ; N uni2C71 ; G 3103 +U 11378 ; WX 1221 ; N uni2C72 ; G 3104 +U 11379 ; WX 984 ; N uni2C73 ; G 3105 +U 11381 ; WX 779 ; N uni2C75 ; G 3106 +U 11382 ; WX 576 ; N uni2C76 ; G 3107 +U 11383 ; WX 905 ; N uni2C77 ; G 3108 +U 11385 ; WX 571 ; N uni2C79 ; G 3109 +U 11386 ; WX 667 ; N uni2C7A ; G 3110 +U 11387 ; WX 617 ; N uni2C7B ; G 3111 +U 11388 ; WX 313 ; N uni2C7C ; G 3112 +U 11389 ; WX 489 ; N uni2C7D ; G 3113 +U 11390 ; WX 722 ; N uni2C7E ; G 3114 +U 11391 ; WX 730 ; N uni2C7F ; G 3115 +U 11520 ; WX 773 ; N uni2D00 ; G 3116 +U 11521 ; WX 635 ; N uni2D01 ; G 3117 +U 11522 ; WX 804 ; N uni2D02 ; G 3118 +U 11523 ; WX 658 ; N uni2D03 ; G 3119 +U 11524 ; WX 788 ; N uni2D04 ; G 3120 +U 11525 ; WX 962 ; N uni2D05 ; G 3121 +U 11526 ; WX 756 ; N uni2D06 ; G 3122 +U 11527 ; WX 960 ; N uni2D07 ; G 3123 +U 11528 ; WX 617 ; N uni2D08 ; G 3124 +U 11529 ; WX 646 ; N uni2D09 ; G 3125 +U 11530 ; WX 962 ; N uni2D0A ; G 3126 +U 11531 ; WX 631 ; N uni2D0B ; G 3127 +U 11532 ; WX 646 ; N uni2D0C ; G 3128 +U 11533 ; WX 962 ; N uni2D0D ; G 3129 +U 11534 ; WX 846 ; N uni2D0E ; G 3130 +U 11535 ; WX 866 ; N uni2D0F ; G 3131 +U 11536 ; WX 961 ; N uni2D10 ; G 3132 +U 11537 ; WX 645 ; N uni2D11 ; G 3133 +U 11538 ; WX 645 ; N uni2D12 ; G 3134 +U 11539 ; WX 959 ; N uni2D13 ; G 3135 +U 11540 ; WX 945 ; N uni2D14 ; G 3136 +U 11541 ; WX 863 ; N uni2D15 ; G 3137 +U 11542 ; WX 644 ; N uni2D16 ; G 3138 +U 11543 ; WX 646 ; N uni2D17 ; G 3139 +U 11544 ; WX 645 ; N uni2D18 ; G 3140 +U 11545 ; WX 649 ; N uni2D19 ; G 3141 +U 11546 ; WX 688 ; N uni2D1A ; G 3142 +U 11547 ; WX 936 ; N uni2D1B ; G 3143 +U 11548 ; WX 982 ; N uni2D1C ; G 3144 +U 11549 ; WX 681 ; N uni2D1D ; G 3145 +U 11550 ; WX 676 ; N uni2D1E ; G 3146 +U 11551 ; WX 852 ; N uni2D1F ; G 3147 +U 11552 ; WX 1113 ; N uni2D20 ; G 3148 +U 11553 ; WX 632 ; N uni2D21 ; G 3149 +U 11554 ; WX 645 ; N uni2D22 ; G 3150 +U 11555 ; WX 646 ; N uni2D23 ; G 3151 +U 11556 ; WX 749 ; N uni2D24 ; G 3152 +U 11557 ; WX 914 ; N uni2D25 ; G 3153 +U 11800 ; WX 586 ; N uni2E18 ; G 3154 +U 11807 ; WX 838 ; N uni2E1F ; G 3155 +U 11810 ; WX 473 ; N uni2E22 ; G 3156 +U 11811 ; WX 473 ; N uni2E23 ; G 3157 +U 11812 ; WX 473 ; N uni2E24 ; G 3158 +U 11813 ; WX 473 ; N uni2E25 ; G 3159 +U 11822 ; WX 586 ; N uni2E2E ; G 3160 +U 42564 ; WX 722 ; N uniA644 ; G 3161 +U 42565 ; WX 563 ; N uniA645 ; G 3162 +U 42566 ; WX 468 ; N uniA646 ; G 3163 +U 42567 ; WX 380 ; N uniA647 ; G 3164 +U 42576 ; WX 1333 ; N uniA650 ; G 3165 +U 42577 ; WX 1085 ; N uniA651 ; G 3166 +U 42580 ; WX 1287 ; N uniA654 ; G 3167 +U 42581 ; WX 1025 ; N uniA655 ; G 3168 +U 42582 ; WX 1287 ; N uniA656 ; G 3169 +U 42583 ; WX 1029 ; N uniA657 ; G 3170 +U 42648 ; WX 1448 ; N uniA698 ; G 3171 +U 42649 ; WX 1060 ; N uniA699 ; G 3172 +U 42760 ; WX 500 ; N uniA708 ; G 3173 +U 42761 ; WX 500 ; N uniA709 ; G 3174 +U 42762 ; WX 500 ; N uniA70A ; G 3175 +U 42763 ; WX 500 ; N uniA70B ; G 3176 +U 42764 ; WX 500 ; N uniA70C ; G 3177 +U 42765 ; WX 500 ; N uniA70D ; G 3178 +U 42766 ; WX 500 ; N uniA70E ; G 3179 +U 42767 ; WX 500 ; N uniA70F ; G 3180 +U 42768 ; WX 500 ; N uniA710 ; G 3181 +U 42769 ; WX 500 ; N uniA711 ; G 3182 +U 42770 ; WX 500 ; N uniA712 ; G 3183 +U 42771 ; WX 500 ; N uniA713 ; G 3184 +U 42772 ; WX 500 ; N uniA714 ; G 3185 +U 42773 ; WX 500 ; N uniA715 ; G 3186 +U 42774 ; WX 500 ; N uniA716 ; G 3187 +U 42779 ; WX 384 ; N uniA71B ; G 3188 +U 42780 ; WX 384 ; N uniA71C ; G 3189 +U 42781 ; WX 276 ; N uniA71D ; G 3190 +U 42782 ; WX 276 ; N uniA71E ; G 3191 +U 42783 ; WX 276 ; N uniA71F ; G 3192 +U 42790 ; WX 945 ; N uniA726 ; G 3193 +U 42791 ; WX 712 ; N uniA727 ; G 3194 +U 42792 ; WX 1003 ; N uniA728 ; G 3195 +U 42793 ; WX 909 ; N uniA729 ; G 3196 +U 42794 ; WX 696 ; N uniA72A ; G 3197 +U 42795 ; WX 609 ; N uniA72B ; G 3198 +U 42796 ; WX 634 ; N uniA72C ; G 3199 +U 42797 ; WX 598 ; N uniA72D ; G 3200 +U 42798 ; WX 741 ; N uniA72E ; G 3201 +U 42799 ; WX 706 ; N uniA72F ; G 3202 +U 42800 ; WX 592 ; N uniA730 ; G 3203 +U 42801 ; WX 563 ; N uniA731 ; G 3204 +U 42802 ; WX 1301 ; N uniA732 ; G 3205 +U 42803 ; WX 983 ; N uniA733 ; G 3206 +U 42804 ; WX 1261 ; N uniA734 ; G 3207 +U 42805 ; WX 985 ; N uniA735 ; G 3208 +U 42806 ; WX 1168 ; N uniA736 ; G 3209 +U 42807 ; WX 1007 ; N uniA737 ; G 3210 +U 42808 ; WX 1016 ; N uniA738 ; G 3211 +U 42809 ; WX 832 ; N uniA739 ; G 3212 +U 42810 ; WX 1016 ; N uniA73A ; G 3213 +U 42811 ; WX 832 ; N uniA73B ; G 3214 +U 42812 ; WX 994 ; N uniA73C ; G 3215 +U 42813 ; WX 746 ; N uniA73D ; G 3216 +U 42814 ; WX 796 ; N uniA73E ; G 3217 +U 42815 ; WX 609 ; N uniA73F ; G 3218 +U 42816 ; WX 869 ; N uniA740 ; G 3219 +U 42817 ; WX 693 ; N uniA741 ; G 3220 +U 42822 ; WX 916 ; N uniA746 ; G 3221 +U 42823 ; WX 581 ; N uniA747 ; G 3222 +U 42826 ; WX 1010 ; N uniA74A ; G 3223 +U 42827 ; WX 770 ; N uniA74B ; G 3224 +U 42830 ; WX 1448 ; N uniA74E ; G 3225 +U 42831 ; WX 1060 ; N uniA74F ; G 3226 +U 42856 ; WX 787 ; N uniA768 ; G 3227 +U 42857 ; WX 716 ; N uniA769 ; G 3228 +U 42875 ; WX 694 ; N uniA77B ; G 3229 +U 42876 ; WX 527 ; N uniA77C ; G 3230 +U 42880 ; WX 703 ; N uniA780 ; G 3231 +U 42881 ; WX 380 ; N uniA781 ; G 3232 +U 42882 ; WX 872 ; N uniA782 ; G 3233 +U 42883 ; WX 727 ; N uniA783 ; G 3234 +U 42884 ; WX 694 ; N uniA784 ; G 3235 +U 42885 ; WX 527 ; N uniA785 ; G 3236 +U 42886 ; WX 796 ; N uniA786 ; G 3237 +U 42887 ; WX 609 ; N uniA787 ; G 3238 +U 42891 ; WX 439 ; N uniA78B ; G 3239 +U 42892 ; WX 306 ; N uniA78C ; G 3240 +U 42893 ; WX 913 ; N uniA78D ; G 3241 +U 42896 ; WX 914 ; N uniA790 ; G 3242 +U 42897 ; WX 812 ; N uniA791 ; G 3243 +U 42922 ; WX 945 ; N uniA7AA ; G 3244 +U 43000 ; WX 595 ; N uniA7F8 ; G 3245 +U 43001 ; WX 647 ; N uniA7F9 ; G 3246 +U 43002 ; WX 1068 ; N uniA7FA ; G 3247 +U 43003 ; WX 710 ; N uniA7FB ; G 3248 +U 43004 ; WX 752 ; N uniA7FC ; G 3249 +U 43005 ; WX 1107 ; N uniA7FD ; G 3250 +U 43006 ; WX 468 ; N uniA7FE ; G 3251 +U 43007 ; WX 1286 ; N uniA7FF ; G 3252 +U 62464 ; WX 726 ; N uniF400 ; G 3253 +U 62465 ; WX 737 ; N uniF401 ; G 3254 +U 62466 ; WX 786 ; N uniF402 ; G 3255 +U 62467 ; WX 1019 ; N uniF403 ; G 3256 +U 62468 ; WX 737 ; N uniF404 ; G 3257 +U 62469 ; WX 731 ; N uniF405 ; G 3258 +U 62470 ; WX 796 ; N uniF406 ; G 3259 +U 62471 ; WX 1058 ; N uniF407 ; G 3260 +U 62472 ; WX 737 ; N uniF408 ; G 3261 +U 62473 ; WX 737 ; N uniF409 ; G 3262 +U 62474 ; WX 1329 ; N uniF40A ; G 3263 +U 62475 ; WX 754 ; N uniF40B ; G 3264 +U 62476 ; WX 753 ; N uniF40C ; G 3265 +U 62477 ; WX 1024 ; N uniF40D ; G 3266 +U 62478 ; WX 737 ; N uniF40E ; G 3267 +U 62479 ; WX 753 ; N uniF40F ; G 3268 +U 62480 ; WX 1070 ; N uniF410 ; G 3269 +U 62481 ; WX 818 ; N uniF411 ; G 3270 +U 62482 ; WX 870 ; N uniF412 ; G 3271 +U 62483 ; WX 819 ; N uniF413 ; G 3272 +U 62484 ; WX 1016 ; N uniF414 ; G 3273 +U 62485 ; WX 753 ; N uniF415 ; G 3274 +U 62486 ; WX 1008 ; N uniF416 ; G 3275 +U 62487 ; WX 752 ; N uniF417 ; G 3276 +U 62488 ; WX 760 ; N uniF418 ; G 3277 +U 62489 ; WX 753 ; N uniF419 ; G 3278 +U 62490 ; WX 800 ; N uniF41A ; G 3279 +U 62491 ; WX 753 ; N uniF41B ; G 3280 +U 62492 ; WX 760 ; N uniF41C ; G 3281 +U 62493 ; WX 738 ; N uniF41D ; G 3282 +U 62494 ; WX 801 ; N uniF41E ; G 3283 +U 62495 ; WX 956 ; N uniF41F ; G 3284 +U 62496 ; WX 736 ; N uniF420 ; G 3285 +U 62497 ; WX 847 ; N uniF421 ; G 3286 +U 62498 ; WX 737 ; N uniF422 ; G 3287 +U 62499 ; WX 737 ; N uniF423 ; G 3288 +U 62500 ; WX 737 ; N uniF424 ; G 3289 +U 62501 ; WX 793 ; N uniF425 ; G 3290 +U 62502 ; WX 1033 ; N uniF426 ; G 3291 +U 62504 ; WX 904 ; N uniF428 ; G 3292 +U 63172 ; WX 380 ; N uniF6C4 ; G 3293 +U 63173 ; WX 667 ; N uniF6C5 ; G 3294 +U 63174 ; WX 699 ; N uniF6C6 ; G 3295 +U 63175 ; WX 727 ; N uniF6C7 ; G 3296 +U 63176 ; WX 1058 ; N uniF6C8 ; G 3297 +U 63185 ; WX 500 ; N cyrBreve ; G 3298 +U 63188 ; WX 500 ; N cyrbreve ; G 3299 +U 64256 ; WX 827 ; N uniFB00 ; G 3300 +U 64257 ; WX 727 ; N fi ; G 3301 +U 64258 ; WX 727 ; N fl ; G 3302 +U 64259 ; WX 1108 ; N uniFB03 ; G 3303 +U 64260 ; WX 1146 ; N uniFB04 ; G 3304 +U 64261 ; WX 879 ; N uniFB05 ; G 3305 +U 64262 ; WX 971 ; N uniFB06 ; G 3306 +U 65024 ; WX 0 ; N uniFE00 ; G 3307 +U 65025 ; WX 0 ; N uniFE01 ; G 3308 +U 65026 ; WX 0 ; N uniFE02 ; G 3309 +U 65027 ; WX 0 ; N uniFE03 ; G 3310 +U 65028 ; WX 0 ; N uniFE04 ; G 3311 +U 65029 ; WX 0 ; N uniFE05 ; G 3312 +U 65030 ; WX 0 ; N uniFE06 ; G 3313 +U 65031 ; WX 0 ; N uniFE07 ; G 3314 +U 65032 ; WX 0 ; N uniFE08 ; G 3315 +U 65033 ; WX 0 ; N uniFE09 ; G 3316 +U 65034 ; WX 0 ; N uniFE0A ; G 3317 +U 65035 ; WX 0 ; N uniFE0B ; G 3318 +U 65036 ; WX 0 ; N uniFE0C ; G 3319 +U 65037 ; WX 0 ; N uniFE0D ; G 3320 +U 65038 ; WX 0 ; N uniFE0E ; G 3321 +U 65039 ; WX 0 ; N uniFE0F ; G 3322 +U 65529 ; WX 0 ; N uniFFF9 ; G 3323 +U 65530 ; WX 0 ; N uniFFFA ; G 3324 +U 65531 ; WX 0 ; N uniFFFB ; G 3325 +U 65532 ; WX 0 ; N uniFFFC ; G 3326 +U 65533 ; WX 1113 ; N uniFFFD ; G 3327 +EndCharMetrics +StartKernData +StartKernPairs 1153 + +KPX dollar seven -112 +KPX dollar nine -149 +KPX dollar colon -102 +KPX dollar less -102 +KPX dollar I -36 +KPX dollar W -36 +KPX dollar Y -83 +KPX dollar Z -83 +KPX dollar backslash -83 +KPX dollar questiondown -83 +KPX dollar Aacute -83 +KPX dollar Hbar -112 +KPX dollar hbar -36 +KPX dollar lacute -102 + +KPX percent ampersand 38 +KPX percent asterisk 38 +KPX percent two 38 +KPX percent less -36 +KPX percent Egrave 38 +KPX percent Icircumflex 38 +KPX percent agrave 38 +KPX percent Ebreve 38 +KPX percent lacute -36 + + +KPX quotesingle nine -36 + + +KPX parenright dollar -120 +KPX parenright D -112 +KPX parenright H -112 +KPX parenright R -112 +KPX parenright U -36 +KPX parenright X -36 +KPX parenright cent -112 +KPX parenright sterling -112 +KPX parenright currency -112 +KPX parenright yen -112 +KPX parenright brokenbar -112 +KPX parenright section -112 +KPX parenright dieresis -112 +KPX parenright ordfeminine -112 +KPX parenright guillemotleft -112 +KPX parenright logicalnot -112 +KPX parenright sfthyphen -112 +KPX parenright acute -112 +KPX parenright mu -112 +KPX parenright paragraph -112 +KPX parenright periodcentered -112 +KPX parenright cedilla -112 +KPX parenright ordmasculine -112 +KPX parenright guillemotright -36 +KPX parenright onequarter -36 +KPX parenright onehalf -36 +KPX parenright threequarters -36 +KPX parenright Yacute -112 +KPX parenright ebreve -112 +KPX parenright edotaccent -36 +KPX parenright ecaron -36 +KPX parenright dotlessi -36 + + + +KPX period dollar -83 +KPX period ampersand -55 +KPX period two -55 +KPX period eight -73 +KPX period colon -73 +KPX period less -55 +KPX period H -45 +KPX period R -45 +KPX period X -45 +KPX period backslash -92 +KPX period ordfeminine -45 +KPX period guillemotleft -45 +KPX period logicalnot -45 +KPX period sfthyphen -45 +KPX period acute -45 +KPX period mu -45 +KPX period paragraph -45 +KPX period periodcentered -45 +KPX period cedilla -45 +KPX period ordmasculine -36 +KPX period guillemotright -45 +KPX period onequarter -45 +KPX period onehalf -45 +KPX period threequarters -45 +KPX period questiondown -92 +KPX period Aacute -92 +KPX period Egrave -55 +KPX period Icircumflex -55 +KPX period Yacute -45 +KPX period Ebreve -55 +KPX period ebreve -45 +KPX period Idot -73 +KPX period dotlessi -45 +KPX period lacute -55 + +KPX slash seven -167 +KPX slash eight -112 +KPX slash nine -243 +KPX slash colon -139 +KPX slash less -131 +KPX slash backslash -73 +KPX slash questiondown -73 +KPX slash Aacute -73 +KPX slash Hbar -167 +KPX slash Idot -112 +KPX slash lacute -131 + + +KPX two nine -36 +KPX two semicolon -36 + +KPX three dollar -149 +KPX three D -55 +KPX three H -55 +KPX three R -55 +KPX three cent -55 +KPX three sterling -55 +KPX three currency -55 +KPX three yen -55 +KPX three brokenbar -55 +KPX three section -55 +KPX three dieresis -55 +KPX three ordfeminine -55 +KPX three guillemotleft -55 +KPX three logicalnot -55 +KPX three sfthyphen -55 +KPX three acute -55 +KPX three mu -55 +KPX three paragraph -55 +KPX three periodcentered -55 +KPX three cedilla -55 +KPX three ordmasculine -55 +KPX three Yacute -55 +KPX three ebreve -55 + + +KPX five seven -36 +KPX five nine -73 +KPX five colon -45 +KPX five less -63 +KPX five D 47 +KPX five backslash -36 +KPX five cent 47 +KPX five sterling 47 +KPX five currency 47 +KPX five yen 47 +KPX five brokenbar 47 +KPX five section 47 +KPX five dieresis 47 +KPX five ordmasculine 38 +KPX five questiondown -36 +KPX five Aacute -36 +KPX five Hbar -36 +KPX five lacute -63 + +KPX six six -45 +KPX six Gdotaccent -45 +KPX six Gcommaaccent -45 + +KPX seven dollar -112 +KPX seven seven -73 +KPX seven D -196 +KPX seven F -235 +KPX seven H -235 +KPX seven R -235 +KPX seven U -149 +KPX seven V -188 +KPX seven X -188 +KPX seven Z -225 +KPX seven backslash -225 +KPX seven m -149 +KPX seven braceright -149 +KPX seven cent -196 +KPX seven sterling -196 +KPX seven currency -196 +KPX seven yen -196 +KPX seven brokenbar -196 +KPX seven section -196 +KPX seven dieresis -159 +KPX seven copyright -235 +KPX seven ordfeminine -235 +KPX seven guillemotleft -235 +KPX seven logicalnot -235 +KPX seven sfthyphen -235 +KPX seven acute -235 +KPX seven mu -235 +KPX seven paragraph -235 +KPX seven periodcentered -235 +KPX seven cedilla -235 +KPX seven ordmasculine -159 +KPX seven guillemotright -188 +KPX seven onequarter -188 +KPX seven onehalf -188 +KPX seven threequarters -188 +KPX seven questiondown -225 +KPX seven Aacute -225 +KPX seven Eacute -235 +KPX seven Idieresis -235 +KPX seven Yacute -235 +KPX seven ebreve -159 +KPX seven edotaccent -149 +KPX seven ecaron -149 +KPX seven gdotaccent -188 +KPX seven gcommaaccent -188 +KPX seven Hbar -73 +KPX seven dotlessi -188 + +KPX eight dollar -63 + +KPX nine dollar -159 +KPX nine two -36 +KPX nine D -188 +KPX nine H -188 +KPX nine L -36 +KPX nine R -188 +KPX nine X -131 +KPX nine backslash -83 +KPX nine cent -188 +KPX nine sterling -188 +KPX nine currency -188 +KPX nine yen -188 +KPX nine brokenbar -188 +KPX nine section -188 +KPX nine dieresis -188 +KPX nine ordfeminine -188 +KPX nine guillemotleft -188 +KPX nine logicalnot -188 +KPX nine sfthyphen -188 +KPX nine acute -188 +KPX nine mu -188 +KPX nine paragraph -188 +KPX nine periodcentered -188 +KPX nine cedilla -188 +KPX nine ordmasculine -188 +KPX nine guillemotright -131 +KPX nine onequarter -131 +KPX nine onehalf -131 +KPX nine threequarters -131 +KPX nine questiondown -83 +KPX nine Aacute -83 +KPX nine Yacute -188 +KPX nine Ebreve -36 +KPX nine ebreve -188 +KPX nine dotlessi -131 + +KPX colon dollar -131 +KPX colon D -178 +KPX colon H -167 +KPX colon L -36 +KPX colon R -167 +KPX colon U -92 +KPX colon X -83 +KPX colon backslash -45 +KPX colon cent -178 +KPX colon sterling -178 +KPX colon currency -178 +KPX colon yen -178 +KPX colon brokenbar -178 +KPX colon section -178 +KPX colon dieresis -139 +KPX colon ordfeminine -167 +KPX colon guillemotleft -167 +KPX colon logicalnot -167 +KPX colon sfthyphen -167 +KPX colon acute -167 +KPX colon mu -167 +KPX colon paragraph -167 +KPX colon periodcentered -167 +KPX colon cedilla -167 +KPX colon ordmasculine -167 +KPX colon guillemotright -83 +KPX colon onequarter -83 +KPX colon onehalf -83 +KPX colon threequarters -83 +KPX colon questiondown -45 +KPX colon Aacute -45 +KPX colon Yacute -167 +KPX colon ebreve -167 +KPX colon edotaccent -92 +KPX colon ecaron -92 +KPX colon dotlessi -83 + +KPX semicolon dollar -73 +KPX semicolon ampersand -36 +KPX semicolon two -36 +KPX semicolon Egrave -36 +KPX semicolon Icircumflex -36 +KPX semicolon Ebreve -36 + +KPX less dollar -131 +KPX less ampersand -36 +KPX less D -159 +KPX less H -178 +KPX less L -36 +KPX less R -178 +KPX less X -178 +KPX less cent -159 +KPX less sterling -159 +KPX less currency -159 +KPX less yen -159 +KPX less brokenbar -159 +KPX less section -159 +KPX less dieresis -159 +KPX less ordfeminine -178 +KPX less guillemotleft -178 +KPX less logicalnot -178 +KPX less sfthyphen -178 +KPX less acute -178 +KPX less mu -178 +KPX less paragraph -178 +KPX less periodcentered -178 +KPX less cedilla -178 +KPX less ordmasculine -178 +KPX less guillemotright -178 +KPX less onequarter -178 +KPX less onehalf -178 +KPX less threequarters -178 +KPX less Egrave -36 +KPX less Icircumflex -36 +KPX less Yacute -178 +KPX less ebreve -178 +KPX less dotlessi -178 + + + + + + + + + + +KPX m hyphen -73 +KPX m seven -149 +KPX m Hbar -149 + +KPX braceright hyphen -73 +KPX braceright seven -149 +KPX braceright Hbar -149 + + + + + + + + + + + + + + +KPX Eth nine -36 + + + +KPX ucircumflex seven -167 +KPX ucircumflex eight -112 +KPX ucircumflex nine -243 +KPX ucircumflex colon -139 +KPX ucircumflex less -131 +KPX ucircumflex backslash -73 +KPX ucircumflex questiondown -73 +KPX ucircumflex Aacute -73 +KPX ucircumflex Hbar -167 +KPX ucircumflex Idot -112 +KPX ucircumflex lacute -131 + +KPX ydieresis seven -167 +KPX ydieresis eight -112 +KPX ydieresis nine -243 +KPX ydieresis colon -139 +KPX ydieresis less -131 +KPX ydieresis backslash -73 +KPX ydieresis questiondown -73 +KPX ydieresis Aacute -73 +KPX ydieresis Hbar -167 +KPX ydieresis Idot -112 +KPX ydieresis lacute -131 + +KPX Abreve O -241 + +KPX abreve seven -167 +KPX abreve eight -112 +KPX abreve nine -243 +KPX abreve colon -139 +KPX abreve less -131 +KPX abreve backslash -73 +KPX abreve questiondown -73 +KPX abreve Aacute -73 +KPX abreve Hbar -167 +KPX abreve Idot -112 +KPX abreve lacute -131 + + + +KPX Edotaccent seven -36 +KPX Edotaccent nine -73 +KPX Edotaccent colon -45 +KPX Edotaccent less -63 +KPX Edotaccent D 47 +KPX Edotaccent backslash -36 +KPX Edotaccent cent 47 +KPX Edotaccent sterling 47 +KPX Edotaccent currency 47 +KPX Edotaccent yen 47 +KPX Edotaccent brokenbar 47 +KPX Edotaccent section 47 +KPX Edotaccent dieresis 47 +KPX Edotaccent ordmasculine 38 +KPX Edotaccent questiondown -36 +KPX Edotaccent Aacute -36 +KPX Edotaccent Hbar -36 +KPX Edotaccent lacute -63 + + +KPX Ecaron seven -36 +KPX Ecaron nine -73 +KPX Ecaron colon -45 +KPX Ecaron less -63 +KPX Ecaron D 47 +KPX Ecaron backslash -36 +KPX Ecaron cent 47 +KPX Ecaron sterling 47 +KPX Ecaron currency 47 +KPX Ecaron yen 47 +KPX Ecaron brokenbar 47 +KPX Ecaron section 47 +KPX Ecaron dieresis 47 +KPX Ecaron ordmasculine 38 +KPX Ecaron questiondown -36 +KPX Ecaron Aacute -36 +KPX Ecaron Hbar -36 +KPX Ecaron lacute -63 + + +KPX Gdotaccent six -45 +KPX Gdotaccent Gdotaccent -45 +KPX Gdotaccent Gcommaaccent -45 + +KPX Gcommaaccent six -45 +KPX Gcommaaccent Gdotaccent -45 +KPX Gcommaaccent Gcommaaccent -45 + +KPX Hbar dollar -112 +KPX Hbar seven -73 +KPX Hbar D -196 +KPX Hbar F -235 +KPX Hbar H -235 +KPX Hbar R -235 +KPX Hbar U -149 +KPX Hbar V -188 +KPX Hbar X -188 +KPX Hbar Z -225 +KPX Hbar backslash -225 +KPX Hbar m -149 +KPX Hbar braceright -149 +KPX Hbar cent -196 +KPX Hbar sterling -196 +KPX Hbar currency -196 +KPX Hbar yen -196 +KPX Hbar brokenbar -196 +KPX Hbar section -196 +KPX Hbar dieresis -159 +KPX Hbar copyright -235 +KPX Hbar ordfeminine -235 +KPX Hbar guillemotleft -235 +KPX Hbar logicalnot -235 +KPX Hbar sfthyphen -235 +KPX Hbar acute -235 +KPX Hbar mu -235 +KPX Hbar paragraph -235 +KPX Hbar periodcentered -235 +KPX Hbar cedilla -235 +KPX Hbar ordmasculine -159 +KPX Hbar guillemotright -188 +KPX Hbar onequarter -188 +KPX Hbar onehalf -188 +KPX Hbar threequarters -188 +KPX Hbar questiondown -225 +KPX Hbar Aacute -225 +KPX Hbar Eacute -235 +KPX Hbar Idieresis -235 +KPX Hbar Yacute -235 +KPX Hbar ebreve -159 +KPX Hbar edotaccent -149 +KPX Hbar ecaron -149 +KPX Hbar gdotaccent -188 +KPX Hbar gcommaaccent -188 +KPX Hbar Hbar -73 +KPX Hbar dotlessi -188 + +KPX Idot dollar -63 + +KPX lacute dollar -131 +KPX lacute ampersand -36 +KPX lacute D -159 +KPX lacute H -178 +KPX lacute L -36 +KPX lacute R -178 +KPX lacute X -178 +KPX lacute cent -159 +KPX lacute sterling -159 +KPX lacute currency -159 +KPX lacute yen -159 +KPX lacute brokenbar -159 +KPX lacute section -159 +KPX lacute dieresis -159 +KPX lacute ordfeminine -178 +KPX lacute guillemotleft -178 +KPX lacute logicalnot -178 +KPX lacute sfthyphen -178 +KPX lacute acute -178 +KPX lacute mu -178 +KPX lacute paragraph -178 +KPX lacute periodcentered -178 +KPX lacute cedilla -178 +KPX lacute ordmasculine -178 +KPX lacute guillemotright -178 +KPX lacute onequarter -178 +KPX lacute onehalf -178 +KPX lacute threequarters -178 +KPX lacute Egrave -36 +KPX lacute Icircumflex -36 +KPX lacute Yacute -178 +KPX lacute ebreve -178 +KPX lacute dotlessi -178 + + +KPX uni027D dollar -282 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Italic.ttf b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Italic.ttf new file mode 100644 index 0000000..805daf2 Binary files /dev/null and b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Italic.ttf differ diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Italic.ufm b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Italic.ufm new file mode 100644 index 0000000..e9d62b8 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif-Italic.ufm @@ -0,0 +1,3883 @@ +StartFontMetrics 4.1 +Notice Converted by PHP-font-lib +Comment https://github.com/PhenX/php-font-lib +EncodingScheme FontSpecific +FontName DejaVu Serif +FontSubfamily Italic +UniqueID DejaVu Serif Italic +FullName DejaVu Serif Italic +Version Version 2.37 +PostScriptName DejaVuSerif-Italic +Manufacturer DejaVu fonts team +FontVendorURL http://dejavu.sourceforge.net +LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License +PreferredFamily DejaVu Serif +PreferredSubfamily Italic +Weight Medium +ItalicAngle -11 +IsFixedPitch false +UnderlineThickness 44 +UnderlinePosition -63 +FontHeightOffset 0 +Ascender 928 +Descender -236 +FontBBox -839 -347 1645 1109 +StartCharMetrics 3507 +U 32 ; WX 318 ; N space ; G 3 +U 33 ; WX 402 ; N exclam ; G 4 +U 34 ; WX 460 ; N quotedbl ; G 5 +U 35 ; WX 838 ; N numbersign ; G 6 +U 36 ; WX 636 ; N dollar ; G 7 +U 37 ; WX 950 ; N percent ; G 8 +U 38 ; WX 890 ; N ampersand ; G 9 +U 39 ; WX 275 ; N quotesingle ; G 10 +U 40 ; WX 390 ; N parenleft ; G 11 +U 41 ; WX 390 ; N parenright ; G 12 +U 42 ; WX 500 ; N asterisk ; G 13 +U 43 ; WX 838 ; N plus ; G 14 +U 44 ; WX 318 ; N comma ; G 15 +U 45 ; WX 338 ; N hyphen ; G 16 +U 46 ; WX 318 ; N period ; G 17 +U 47 ; WX 337 ; N slash ; G 18 +U 48 ; WX 636 ; N zero ; G 19 +U 49 ; WX 636 ; N one ; G 20 +U 50 ; WX 636 ; N two ; G 21 +U 51 ; WX 636 ; N three ; G 22 +U 52 ; WX 636 ; N four ; G 23 +U 53 ; WX 636 ; N five ; G 24 +U 54 ; WX 636 ; N six ; G 25 +U 55 ; WX 636 ; N seven ; G 26 +U 56 ; WX 636 ; N eight ; G 27 +U 57 ; WX 636 ; N nine ; G 28 +U 58 ; WX 337 ; N colon ; G 29 +U 59 ; WX 337 ; N semicolon ; G 30 +U 60 ; WX 838 ; N less ; G 31 +U 61 ; WX 838 ; N equal ; G 32 +U 62 ; WX 838 ; N greater ; G 33 +U 63 ; WX 536 ; N question ; G 34 +U 64 ; WX 1000 ; N at ; G 35 +U 65 ; WX 722 ; N A ; G 36 +U 66 ; WX 735 ; N B ; G 37 +U 67 ; WX 765 ; N C ; G 38 +U 68 ; WX 802 ; N D ; G 39 +U 69 ; WX 730 ; N E ; G 40 +U 70 ; WX 694 ; N F ; G 41 +U 71 ; WX 799 ; N G ; G 42 +U 72 ; WX 872 ; N H ; G 43 +U 73 ; WX 395 ; N I ; G 44 +U 74 ; WX 401 ; N J ; G 45 +U 75 ; WX 747 ; N K ; G 46 +U 76 ; WX 664 ; N L ; G 47 +U 77 ; WX 1024 ; N M ; G 48 +U 78 ; WX 875 ; N N ; G 49 +U 79 ; WX 820 ; N O ; G 50 +U 80 ; WX 673 ; N P ; G 51 +U 81 ; WX 820 ; N Q ; G 52 +U 82 ; WX 753 ; N R ; G 53 +U 83 ; WX 685 ; N S ; G 54 +U 84 ; WX 667 ; N T ; G 55 +U 85 ; WX 843 ; N U ; G 56 +U 86 ; WX 722 ; N V ; G 57 +U 87 ; WX 1028 ; N W ; G 58 +U 88 ; WX 712 ; N X ; G 59 +U 89 ; WX 660 ; N Y ; G 60 +U 90 ; WX 695 ; N Z ; G 61 +U 91 ; WX 390 ; N bracketleft ; G 62 +U 92 ; WX 337 ; N backslash ; G 63 +U 93 ; WX 390 ; N bracketright ; G 64 +U 94 ; WX 838 ; N asciicircum ; G 65 +U 95 ; WX 500 ; N underscore ; G 66 +U 96 ; WX 500 ; N grave ; G 67 +U 97 ; WX 596 ; N a ; G 68 +U 98 ; WX 640 ; N b ; G 69 +U 99 ; WX 560 ; N c ; G 70 +U 100 ; WX 640 ; N d ; G 71 +U 101 ; WX 592 ; N e ; G 72 +U 102 ; WX 370 ; N f ; G 73 +U 103 ; WX 640 ; N g ; G 74 +U 104 ; WX 644 ; N h ; G 75 +U 105 ; WX 320 ; N i ; G 76 +U 106 ; WX 310 ; N j ; G 77 +U 107 ; WX 606 ; N k ; G 78 +U 108 ; WX 320 ; N l ; G 79 +U 109 ; WX 948 ; N m ; G 80 +U 110 ; WX 644 ; N n ; G 81 +U 111 ; WX 602 ; N o ; G 82 +U 112 ; WX 640 ; N p ; G 83 +U 113 ; WX 640 ; N q ; G 84 +U 114 ; WX 478 ; N r ; G 85 +U 115 ; WX 513 ; N s ; G 86 +U 116 ; WX 402 ; N t ; G 87 +U 117 ; WX 644 ; N u ; G 88 +U 118 ; WX 565 ; N v ; G 89 +U 119 ; WX 856 ; N w ; G 90 +U 120 ; WX 564 ; N x ; G 91 +U 121 ; WX 565 ; N y ; G 92 +U 122 ; WX 527 ; N z ; G 93 +U 123 ; WX 636 ; N braceleft ; G 94 +U 124 ; WX 337 ; N bar ; G 95 +U 125 ; WX 636 ; N braceright ; G 96 +U 126 ; WX 838 ; N asciitilde ; G 97 +U 160 ; WX 318 ; N nbspace ; G 98 +U 161 ; WX 402 ; N exclamdown ; G 99 +U 162 ; WX 636 ; N cent ; G 100 +U 163 ; WX 636 ; N sterling ; G 101 +U 164 ; WX 636 ; N currency ; G 102 +U 165 ; WX 636 ; N yen ; G 103 +U 166 ; WX 337 ; N brokenbar ; G 104 +U 167 ; WX 500 ; N section ; G 105 +U 168 ; WX 500 ; N dieresis ; G 106 +U 169 ; WX 1000 ; N copyright ; G 107 +U 170 ; WX 475 ; N ordfeminine ; G 108 +U 171 ; WX 612 ; N guillemotleft ; G 109 +U 172 ; WX 838 ; N logicalnot ; G 110 +U 173 ; WX 338 ; N sfthyphen ; G 111 +U 174 ; WX 1000 ; N registered ; G 112 +U 175 ; WX 500 ; N macron ; G 113 +U 176 ; WX 500 ; N degree ; G 114 +U 177 ; WX 838 ; N plusminus ; G 115 +U 178 ; WX 401 ; N twosuperior ; G 116 +U 179 ; WX 401 ; N threesuperior ; G 117 +U 180 ; WX 500 ; N acute ; G 118 +U 181 ; WX 650 ; N mu ; G 119 +U 182 ; WX 636 ; N paragraph ; G 120 +U 183 ; WX 318 ; N periodcentered ; G 121 +U 184 ; WX 500 ; N cedilla ; G 122 +U 185 ; WX 401 ; N onesuperior ; G 123 +U 186 ; WX 470 ; N ordmasculine ; G 124 +U 187 ; WX 612 ; N guillemotright ; G 125 +U 188 ; WX 969 ; N onequarter ; G 126 +U 189 ; WX 969 ; N onehalf ; G 127 +U 190 ; WX 969 ; N threequarters ; G 128 +U 191 ; WX 536 ; N questiondown ; G 129 +U 192 ; WX 722 ; N Agrave ; G 130 +U 193 ; WX 722 ; N Aacute ; G 131 +U 194 ; WX 722 ; N Acircumflex ; G 132 +U 195 ; WX 722 ; N Atilde ; G 133 +U 196 ; WX 722 ; N Adieresis ; G 134 +U 197 ; WX 722 ; N Aring ; G 135 +U 198 ; WX 1001 ; N AE ; G 136 +U 199 ; WX 765 ; N Ccedilla ; G 137 +U 200 ; WX 730 ; N Egrave ; G 138 +U 201 ; WX 730 ; N Eacute ; G 139 +U 202 ; WX 730 ; N Ecircumflex ; G 140 +U 203 ; WX 730 ; N Edieresis ; G 141 +U 204 ; WX 395 ; N Igrave ; G 142 +U 205 ; WX 395 ; N Iacute ; G 143 +U 206 ; WX 395 ; N Icircumflex ; G 144 +U 207 ; WX 395 ; N Idieresis ; G 145 +U 208 ; WX 807 ; N Eth ; G 146 +U 209 ; WX 875 ; N Ntilde ; G 147 +U 210 ; WX 820 ; N Ograve ; G 148 +U 211 ; WX 820 ; N Oacute ; G 149 +U 212 ; WX 820 ; N Ocircumflex ; G 150 +U 213 ; WX 820 ; N Otilde ; G 151 +U 214 ; WX 820 ; N Odieresis ; G 152 +U 215 ; WX 838 ; N multiply ; G 153 +U 216 ; WX 820 ; N Oslash ; G 154 +U 217 ; WX 843 ; N Ugrave ; G 155 +U 218 ; WX 843 ; N Uacute ; G 156 +U 219 ; WX 843 ; N Ucircumflex ; G 157 +U 220 ; WX 843 ; N Udieresis ; G 158 +U 221 ; WX 660 ; N Yacute ; G 159 +U 222 ; WX 676 ; N Thorn ; G 160 +U 223 ; WX 668 ; N germandbls ; G 161 +U 224 ; WX 596 ; N agrave ; G 162 +U 225 ; WX 596 ; N aacute ; G 163 +U 226 ; WX 596 ; N acircumflex ; G 164 +U 227 ; WX 596 ; N atilde ; G 165 +U 228 ; WX 596 ; N adieresis ; G 166 +U 229 ; WX 596 ; N aring ; G 167 +U 230 ; WX 940 ; N ae ; G 168 +U 231 ; WX 560 ; N ccedilla ; G 169 +U 232 ; WX 592 ; N egrave ; G 170 +U 233 ; WX 592 ; N eacute ; G 171 +U 234 ; WX 592 ; N ecircumflex ; G 172 +U 235 ; WX 592 ; N edieresis ; G 173 +U 236 ; WX 320 ; N igrave ; G 174 +U 237 ; WX 320 ; N iacute ; G 175 +U 238 ; WX 320 ; N icircumflex ; G 176 +U 239 ; WX 320 ; N idieresis ; G 177 +U 240 ; WX 602 ; N eth ; G 178 +U 241 ; WX 644 ; N ntilde ; G 179 +U 242 ; WX 602 ; N ograve ; G 180 +U 243 ; WX 602 ; N oacute ; G 181 +U 244 ; WX 602 ; N ocircumflex ; G 182 +U 245 ; WX 602 ; N otilde ; G 183 +U 246 ; WX 602 ; N odieresis ; G 184 +U 247 ; WX 838 ; N divide ; G 185 +U 248 ; WX 602 ; N oslash ; G 186 +U 249 ; WX 644 ; N ugrave ; G 187 +U 250 ; WX 644 ; N uacute ; G 188 +U 251 ; WX 644 ; N ucircumflex ; G 189 +U 252 ; WX 644 ; N udieresis ; G 190 +U 253 ; WX 565 ; N yacute ; G 191 +U 254 ; WX 640 ; N thorn ; G 192 +U 255 ; WX 565 ; N ydieresis ; G 193 +U 256 ; WX 722 ; N Amacron ; G 194 +U 257 ; WX 596 ; N amacron ; G 195 +U 258 ; WX 722 ; N Abreve ; G 196 +U 259 ; WX 596 ; N abreve ; G 197 +U 260 ; WX 722 ; N Aogonek ; G 198 +U 261 ; WX 596 ; N aogonek ; G 199 +U 262 ; WX 765 ; N Cacute ; G 200 +U 263 ; WX 560 ; N cacute ; G 201 +U 264 ; WX 765 ; N Ccircumflex ; G 202 +U 265 ; WX 560 ; N ccircumflex ; G 203 +U 266 ; WX 765 ; N Cdotaccent ; G 204 +U 267 ; WX 560 ; N cdotaccent ; G 205 +U 268 ; WX 765 ; N Ccaron ; G 206 +U 269 ; WX 560 ; N ccaron ; G 207 +U 270 ; WX 802 ; N Dcaron ; G 208 +U 271 ; WX 640 ; N dcaron ; G 209 +U 272 ; WX 807 ; N Dcroat ; G 210 +U 273 ; WX 640 ; N dmacron ; G 211 +U 274 ; WX 730 ; N Emacron ; G 212 +U 275 ; WX 592 ; N emacron ; G 213 +U 276 ; WX 730 ; N Ebreve ; G 214 +U 277 ; WX 592 ; N ebreve ; G 215 +U 278 ; WX 730 ; N Edotaccent ; G 216 +U 279 ; WX 592 ; N edotaccent ; G 217 +U 280 ; WX 730 ; N Eogonek ; G 218 +U 281 ; WX 592 ; N eogonek ; G 219 +U 282 ; WX 730 ; N Ecaron ; G 220 +U 283 ; WX 592 ; N ecaron ; G 221 +U 284 ; WX 799 ; N Gcircumflex ; G 222 +U 285 ; WX 640 ; N gcircumflex ; G 223 +U 286 ; WX 799 ; N Gbreve ; G 224 +U 287 ; WX 640 ; N gbreve ; G 225 +U 288 ; WX 799 ; N Gdotaccent ; G 226 +U 289 ; WX 640 ; N gdotaccent ; G 227 +U 290 ; WX 799 ; N Gcommaaccent ; G 228 +U 291 ; WX 640 ; N gcommaaccent ; G 229 +U 292 ; WX 872 ; N Hcircumflex ; G 230 +U 293 ; WX 644 ; N hcircumflex ; G 231 +U 294 ; WX 872 ; N Hbar ; G 232 +U 295 ; WX 644 ; N hbar ; G 233 +U 296 ; WX 395 ; N Itilde ; G 234 +U 297 ; WX 320 ; N itilde ; G 235 +U 298 ; WX 395 ; N Imacron ; G 236 +U 299 ; WX 320 ; N imacron ; G 237 +U 300 ; WX 395 ; N Ibreve ; G 238 +U 301 ; WX 320 ; N ibreve ; G 239 +U 302 ; WX 395 ; N Iogonek ; G 240 +U 303 ; WX 320 ; N iogonek ; G 241 +U 304 ; WX 395 ; N Idot ; G 242 +U 305 ; WX 320 ; N dotlessi ; G 243 +U 306 ; WX 801 ; N IJ ; G 244 +U 307 ; WX 533 ; N ij ; G 245 +U 308 ; WX 401 ; N Jcircumflex ; G 246 +U 309 ; WX 310 ; N jcircumflex ; G 247 +U 310 ; WX 747 ; N Kcommaaccent ; G 248 +U 311 ; WX 606 ; N kcommaaccent ; G 249 +U 312 ; WX 606 ; N kgreenlandic ; G 250 +U 313 ; WX 664 ; N Lacute ; G 251 +U 314 ; WX 320 ; N lacute ; G 252 +U 315 ; WX 664 ; N Lcommaaccent ; G 253 +U 316 ; WX 320 ; N lcommaaccent ; G 254 +U 317 ; WX 664 ; N Lcaron ; G 255 +U 318 ; WX 400 ; N lcaron ; G 256 +U 319 ; WX 671 ; N Ldot ; G 257 +U 320 ; WX 465 ; N ldot ; G 258 +U 321 ; WX 669 ; N Lslash ; G 259 +U 322 ; WX 324 ; N lslash ; G 260 +U 323 ; WX 875 ; N Nacute ; G 261 +U 324 ; WX 644 ; N nacute ; G 262 +U 325 ; WX 875 ; N Ncommaaccent ; G 263 +U 326 ; WX 644 ; N ncommaaccent ; G 264 +U 327 ; WX 875 ; N Ncaron ; G 265 +U 328 ; WX 644 ; N ncaron ; G 266 +U 329 ; WX 866 ; N napostrophe ; G 267 +U 330 ; WX 843 ; N Eng ; G 268 +U 331 ; WX 644 ; N eng ; G 269 +U 332 ; WX 820 ; N Omacron ; G 270 +U 333 ; WX 602 ; N omacron ; G 271 +U 334 ; WX 820 ; N Obreve ; G 272 +U 335 ; WX 602 ; N obreve ; G 273 +U 336 ; WX 820 ; N Ohungarumlaut ; G 274 +U 337 ; WX 602 ; N ohungarumlaut ; G 275 +U 338 ; WX 1137 ; N OE ; G 276 +U 339 ; WX 989 ; N oe ; G 277 +U 340 ; WX 753 ; N Racute ; G 278 +U 341 ; WX 478 ; N racute ; G 279 +U 342 ; WX 753 ; N Rcommaaccent ; G 280 +U 343 ; WX 478 ; N rcommaaccent ; G 281 +U 344 ; WX 753 ; N Rcaron ; G 282 +U 345 ; WX 478 ; N rcaron ; G 283 +U 346 ; WX 685 ; N Sacute ; G 284 +U 347 ; WX 513 ; N sacute ; G 285 +U 348 ; WX 685 ; N Scircumflex ; G 286 +U 349 ; WX 513 ; N scircumflex ; G 287 +U 350 ; WX 685 ; N Scedilla ; G 288 +U 351 ; WX 513 ; N scedilla ; G 289 +U 352 ; WX 685 ; N Scaron ; G 290 +U 353 ; WX 513 ; N scaron ; G 291 +U 354 ; WX 667 ; N Tcommaaccent ; G 292 +U 355 ; WX 402 ; N tcommaaccent ; G 293 +U 356 ; WX 667 ; N Tcaron ; G 294 +U 357 ; WX 402 ; N tcaron ; G 295 +U 358 ; WX 667 ; N Tbar ; G 296 +U 359 ; WX 402 ; N tbar ; G 297 +U 360 ; WX 843 ; N Utilde ; G 298 +U 361 ; WX 644 ; N utilde ; G 299 +U 362 ; WX 843 ; N Umacron ; G 300 +U 363 ; WX 644 ; N umacron ; G 301 +U 364 ; WX 843 ; N Ubreve ; G 302 +U 365 ; WX 644 ; N ubreve ; G 303 +U 366 ; WX 843 ; N Uring ; G 304 +U 367 ; WX 644 ; N uring ; G 305 +U 368 ; WX 843 ; N Uhungarumlaut ; G 306 +U 369 ; WX 644 ; N uhungarumlaut ; G 307 +U 370 ; WX 843 ; N Uogonek ; G 308 +U 371 ; WX 644 ; N uogonek ; G 309 +U 372 ; WX 1028 ; N Wcircumflex ; G 310 +U 373 ; WX 856 ; N wcircumflex ; G 311 +U 374 ; WX 660 ; N Ycircumflex ; G 312 +U 375 ; WX 565 ; N ycircumflex ; G 313 +U 376 ; WX 660 ; N Ydieresis ; G 314 +U 377 ; WX 695 ; N Zacute ; G 315 +U 378 ; WX 527 ; N zacute ; G 316 +U 379 ; WX 695 ; N Zdotaccent ; G 317 +U 380 ; WX 527 ; N zdotaccent ; G 318 +U 381 ; WX 695 ; N Zcaron ; G 319 +U 382 ; WX 527 ; N zcaron ; G 320 +U 383 ; WX 370 ; N longs ; G 321 +U 384 ; WX 640 ; N uni0180 ; G 322 +U 385 ; WX 735 ; N uni0181 ; G 323 +U 386 ; WX 735 ; N uni0182 ; G 324 +U 387 ; WX 640 ; N uni0183 ; G 325 +U 388 ; WX 735 ; N uni0184 ; G 326 +U 389 ; WX 640 ; N uni0185 ; G 327 +U 390 ; WX 765 ; N uni0186 ; G 328 +U 391 ; WX 765 ; N uni0187 ; G 329 +U 392 ; WX 560 ; N uni0188 ; G 330 +U 393 ; WX 807 ; N uni0189 ; G 331 +U 394 ; WX 802 ; N uni018A ; G 332 +U 395 ; WX 735 ; N uni018B ; G 333 +U 396 ; WX 640 ; N uni018C ; G 334 +U 397 ; WX 602 ; N uni018D ; G 335 +U 398 ; WX 730 ; N uni018E ; G 336 +U 399 ; WX 820 ; N uni018F ; G 337 +U 400 ; WX 623 ; N uni0190 ; G 338 +U 401 ; WX 694 ; N uni0191 ; G 339 +U 402 ; WX 370 ; N florin ; G 340 +U 403 ; WX 799 ; N uni0193 ; G 341 +U 404 ; WX 712 ; N uni0194 ; G 342 +U 405 ; WX 932 ; N uni0195 ; G 343 +U 406 ; WX 395 ; N uni0196 ; G 344 +U 407 ; WX 395 ; N uni0197 ; G 345 +U 408 ; WX 747 ; N uni0198 ; G 346 +U 409 ; WX 606 ; N uni0199 ; G 347 +U 410 ; WX 320 ; N uni019A ; G 348 +U 411 ; WX 634 ; N uni019B ; G 349 +U 412 ; WX 948 ; N uni019C ; G 350 +U 413 ; WX 875 ; N uni019D ; G 351 +U 414 ; WX 644 ; N uni019E ; G 352 +U 415 ; WX 820 ; N uni019F ; G 353 +U 416 ; WX 820 ; N Ohorn ; G 354 +U 417 ; WX 602 ; N ohorn ; G 355 +U 418 ; WX 1040 ; N uni01A2 ; G 356 +U 419 ; WX 807 ; N uni01A3 ; G 357 +U 420 ; WX 673 ; N uni01A4 ; G 358 +U 421 ; WX 640 ; N uni01A5 ; G 359 +U 422 ; WX 753 ; N uni01A6 ; G 360 +U 423 ; WX 685 ; N uni01A7 ; G 361 +U 424 ; WX 513 ; N uni01A8 ; G 362 +U 425 ; WX 707 ; N uni01A9 ; G 363 +U 426 ; WX 324 ; N uni01AA ; G 364 +U 427 ; WX 402 ; N uni01AB ; G 365 +U 428 ; WX 667 ; N uni01AC ; G 366 +U 429 ; WX 402 ; N uni01AD ; G 367 +U 430 ; WX 667 ; N uni01AE ; G 368 +U 431 ; WX 843 ; N Uhorn ; G 369 +U 432 ; WX 644 ; N uhorn ; G 370 +U 433 ; WX 829 ; N uni01B1 ; G 371 +U 434 ; WX 760 ; N uni01B2 ; G 372 +U 435 ; WX 738 ; N uni01B3 ; G 373 +U 436 ; WX 745 ; N uni01B4 ; G 374 +U 437 ; WX 695 ; N uni01B5 ; G 375 +U 438 ; WX 527 ; N uni01B6 ; G 376 +U 439 ; WX 564 ; N uni01B7 ; G 377 +U 440 ; WX 564 ; N uni01B8 ; G 378 +U 441 ; WX 564 ; N uni01B9 ; G 379 +U 442 ; WX 564 ; N uni01BA ; G 380 +U 443 ; WX 636 ; N uni01BB ; G 381 +U 444 ; WX 687 ; N uni01BC ; G 382 +U 445 ; WX 564 ; N uni01BD ; G 383 +U 446 ; WX 536 ; N uni01BE ; G 384 +U 447 ; WX 635 ; N uni01BF ; G 385 +U 448 ; WX 295 ; N uni01C0 ; G 386 +U 449 ; WX 492 ; N uni01C1 ; G 387 +U 450 ; WX 459 ; N uni01C2 ; G 388 +U 451 ; WX 295 ; N uni01C3 ; G 389 +U 452 ; WX 1497 ; N uni01C4 ; G 390 +U 453 ; WX 1329 ; N uni01C5 ; G 391 +U 454 ; WX 1167 ; N uni01C6 ; G 392 +U 455 ; WX 1065 ; N uni01C7 ; G 393 +U 456 ; WX 974 ; N uni01C8 ; G 394 +U 457 ; WX 630 ; N uni01C9 ; G 395 +U 458 ; WX 1276 ; N uni01CA ; G 396 +U 459 ; WX 1185 ; N uni01CB ; G 397 +U 460 ; WX 954 ; N uni01CC ; G 398 +U 461 ; WX 722 ; N uni01CD ; G 399 +U 462 ; WX 596 ; N uni01CE ; G 400 +U 463 ; WX 395 ; N uni01CF ; G 401 +U 464 ; WX 320 ; N uni01D0 ; G 402 +U 465 ; WX 820 ; N uni01D1 ; G 403 +U 466 ; WX 602 ; N uni01D2 ; G 404 +U 467 ; WX 843 ; N uni01D3 ; G 405 +U 468 ; WX 644 ; N uni01D4 ; G 406 +U 469 ; WX 843 ; N uni01D5 ; G 407 +U 470 ; WX 644 ; N uni01D6 ; G 408 +U 471 ; WX 843 ; N uni01D7 ; G 409 +U 472 ; WX 644 ; N uni01D8 ; G 410 +U 473 ; WX 843 ; N uni01D9 ; G 411 +U 474 ; WX 644 ; N uni01DA ; G 412 +U 475 ; WX 843 ; N uni01DB ; G 413 +U 476 ; WX 644 ; N uni01DC ; G 414 +U 477 ; WX 592 ; N uni01DD ; G 415 +U 478 ; WX 722 ; N uni01DE ; G 416 +U 479 ; WX 596 ; N uni01DF ; G 417 +U 480 ; WX 722 ; N uni01E0 ; G 418 +U 481 ; WX 596 ; N uni01E1 ; G 419 +U 482 ; WX 1001 ; N uni01E2 ; G 420 +U 483 ; WX 940 ; N uni01E3 ; G 421 +U 484 ; WX 848 ; N uni01E4 ; G 422 +U 485 ; WX 640 ; N uni01E5 ; G 423 +U 486 ; WX 799 ; N Gcaron ; G 424 +U 487 ; WX 640 ; N gcaron ; G 425 +U 488 ; WX 747 ; N uni01E8 ; G 426 +U 489 ; WX 606 ; N uni01E9 ; G 427 +U 490 ; WX 820 ; N uni01EA ; G 428 +U 491 ; WX 602 ; N uni01EB ; G 429 +U 492 ; WX 820 ; N uni01EC ; G 430 +U 493 ; WX 602 ; N uni01ED ; G 431 +U 494 ; WX 564 ; N uni01EE ; G 432 +U 495 ; WX 564 ; N uni01EF ; G 433 +U 496 ; WX 320 ; N uni01F0 ; G 434 +U 497 ; WX 1497 ; N uni01F1 ; G 435 +U 498 ; WX 1329 ; N uni01F2 ; G 436 +U 499 ; WX 1167 ; N uni01F3 ; G 437 +U 500 ; WX 799 ; N uni01F4 ; G 438 +U 501 ; WX 640 ; N uni01F5 ; G 439 +U 502 ; WX 1154 ; N uni01F6 ; G 440 +U 503 ; WX 707 ; N uni01F7 ; G 441 +U 504 ; WX 875 ; N uni01F8 ; G 442 +U 505 ; WX 644 ; N uni01F9 ; G 443 +U 506 ; WX 722 ; N Aringacute ; G 444 +U 507 ; WX 596 ; N aringacute ; G 445 +U 508 ; WX 1001 ; N AEacute ; G 446 +U 509 ; WX 940 ; N aeacute ; G 447 +U 510 ; WX 820 ; N Oslashacute ; G 448 +U 511 ; WX 602 ; N oslashacute ; G 449 +U 512 ; WX 722 ; N uni0200 ; G 450 +U 513 ; WX 596 ; N uni0201 ; G 451 +U 514 ; WX 722 ; N uni0202 ; G 452 +U 515 ; WX 596 ; N uni0203 ; G 453 +U 516 ; WX 730 ; N uni0204 ; G 454 +U 517 ; WX 592 ; N uni0205 ; G 455 +U 518 ; WX 730 ; N uni0206 ; G 456 +U 519 ; WX 592 ; N uni0207 ; G 457 +U 520 ; WX 395 ; N uni0208 ; G 458 +U 521 ; WX 320 ; N uni0209 ; G 459 +U 522 ; WX 395 ; N uni020A ; G 460 +U 523 ; WX 320 ; N uni020B ; G 461 +U 524 ; WX 820 ; N uni020C ; G 462 +U 525 ; WX 602 ; N uni020D ; G 463 +U 526 ; WX 820 ; N uni020E ; G 464 +U 527 ; WX 602 ; N uni020F ; G 465 +U 528 ; WX 753 ; N uni0210 ; G 466 +U 529 ; WX 478 ; N uni0211 ; G 467 +U 530 ; WX 753 ; N uni0212 ; G 468 +U 531 ; WX 478 ; N uni0213 ; G 469 +U 532 ; WX 843 ; N uni0214 ; G 470 +U 533 ; WX 644 ; N uni0215 ; G 471 +U 534 ; WX 843 ; N uni0216 ; G 472 +U 535 ; WX 644 ; N uni0217 ; G 473 +U 536 ; WX 685 ; N Scommaaccent ; G 474 +U 537 ; WX 513 ; N scommaaccent ; G 475 +U 538 ; WX 667 ; N uni021A ; G 476 +U 539 ; WX 402 ; N uni021B ; G 477 +U 540 ; WX 627 ; N uni021C ; G 478 +U 541 ; WX 521 ; N uni021D ; G 479 +U 542 ; WX 872 ; N uni021E ; G 480 +U 543 ; WX 644 ; N uni021F ; G 481 +U 544 ; WX 843 ; N uni0220 ; G 482 +U 545 ; WX 814 ; N uni0221 ; G 483 +U 546 ; WX 572 ; N uni0222 ; G 484 +U 547 ; WX 552 ; N uni0223 ; G 485 +U 548 ; WX 695 ; N uni0224 ; G 486 +U 549 ; WX 527 ; N uni0225 ; G 487 +U 550 ; WX 722 ; N uni0226 ; G 488 +U 551 ; WX 596 ; N uni0227 ; G 489 +U 552 ; WX 730 ; N uni0228 ; G 490 +U 553 ; WX 592 ; N uni0229 ; G 491 +U 554 ; WX 820 ; N uni022A ; G 492 +U 555 ; WX 602 ; N uni022B ; G 493 +U 556 ; WX 820 ; N uni022C ; G 494 +U 557 ; WX 602 ; N uni022D ; G 495 +U 558 ; WX 820 ; N uni022E ; G 496 +U 559 ; WX 602 ; N uni022F ; G 497 +U 560 ; WX 820 ; N uni0230 ; G 498 +U 561 ; WX 602 ; N uni0231 ; G 499 +U 562 ; WX 660 ; N uni0232 ; G 500 +U 563 ; WX 565 ; N uni0233 ; G 501 +U 564 ; WX 500 ; N uni0234 ; G 502 +U 565 ; WX 832 ; N uni0235 ; G 503 +U 566 ; WX 494 ; N uni0236 ; G 504 +U 567 ; WX 310 ; N dotlessj ; G 505 +U 568 ; WX 960 ; N uni0238 ; G 506 +U 569 ; WX 960 ; N uni0239 ; G 507 +U 570 ; WX 722 ; N uni023A ; G 508 +U 571 ; WX 765 ; N uni023B ; G 509 +U 572 ; WX 560 ; N uni023C ; G 510 +U 573 ; WX 664 ; N uni023D ; G 511 +U 574 ; WX 667 ; N uni023E ; G 512 +U 575 ; WX 513 ; N uni023F ; G 513 +U 576 ; WX 527 ; N uni0240 ; G 514 +U 577 ; WX 583 ; N uni0241 ; G 515 +U 578 ; WX 464 ; N uni0242 ; G 516 +U 579 ; WX 735 ; N uni0243 ; G 517 +U 580 ; WX 843 ; N uni0244 ; G 518 +U 581 ; WX 722 ; N uni0245 ; G 519 +U 582 ; WX 730 ; N uni0246 ; G 520 +U 583 ; WX 592 ; N uni0247 ; G 521 +U 584 ; WX 401 ; N uni0248 ; G 522 +U 585 ; WX 315 ; N uni0249 ; G 523 +U 586 ; WX 782 ; N uni024A ; G 524 +U 587 ; WX 640 ; N uni024B ; G 525 +U 588 ; WX 753 ; N uni024C ; G 526 +U 589 ; WX 478 ; N uni024D ; G 527 +U 590 ; WX 660 ; N uni024E ; G 528 +U 591 ; WX 565 ; N uni024F ; G 529 +U 592 ; WX 596 ; N uni0250 ; G 530 +U 593 ; WX 675 ; N uni0251 ; G 531 +U 594 ; WX 675 ; N uni0252 ; G 532 +U 595 ; WX 640 ; N uni0253 ; G 533 +U 596 ; WX 560 ; N uni0254 ; G 534 +U 597 ; WX 560 ; N uni0255 ; G 535 +U 598 ; WX 647 ; N uni0256 ; G 536 +U 599 ; WX 683 ; N uni0257 ; G 537 +U 600 ; WX 592 ; N uni0258 ; G 538 +U 601 ; WX 592 ; N uni0259 ; G 539 +U 602 ; WX 843 ; N uni025A ; G 540 +U 603 ; WX 537 ; N uni025B ; G 541 +U 604 ; WX 509 ; N uni025C ; G 542 +U 605 ; WX 773 ; N uni025D ; G 543 +U 606 ; WX 613 ; N uni025E ; G 544 +U 607 ; WX 315 ; N uni025F ; G 545 +U 608 ; WX 683 ; N uni0260 ; G 546 +U 609 ; WX 640 ; N uni0261 ; G 547 +U 610 ; WX 580 ; N uni0262 ; G 548 +U 611 ; WX 599 ; N uni0263 ; G 549 +U 612 ; WX 564 ; N uni0264 ; G 550 +U 613 ; WX 644 ; N uni0265 ; G 551 +U 614 ; WX 644 ; N uni0266 ; G 552 +U 615 ; WX 644 ; N uni0267 ; G 553 +U 616 ; WX 320 ; N uni0268 ; G 554 +U 617 ; WX 392 ; N uni0269 ; G 555 +U 618 ; WX 320 ; N uni026A ; G 556 +U 619 ; WX 380 ; N uni026B ; G 557 +U 620 ; WX 454 ; N uni026C ; G 558 +U 621 ; WX 363 ; N uni026D ; G 559 +U 622 ; WX 704 ; N uni026E ; G 560 +U 623 ; WX 948 ; N uni026F ; G 561 +U 624 ; WX 948 ; N uni0270 ; G 562 +U 625 ; WX 948 ; N uni0271 ; G 563 +U 626 ; WX 644 ; N uni0272 ; G 564 +U 627 ; WX 694 ; N uni0273 ; G 565 +U 628 ; WX 646 ; N uni0274 ; G 566 +U 629 ; WX 602 ; N uni0275 ; G 567 +U 630 ; WX 790 ; N uni0276 ; G 568 +U 631 ; WX 821 ; N uni0277 ; G 569 +U 632 ; WX 692 ; N uni0278 ; G 570 +U 633 ; WX 501 ; N uni0279 ; G 571 +U 634 ; WX 501 ; N uni027A ; G 572 +U 635 ; WX 551 ; N uni027B ; G 573 +U 636 ; WX 478 ; N uni027C ; G 574 +U 637 ; WX 478 ; N uni027D ; G 575 +U 638 ; WX 453 ; N uni027E ; G 576 +U 639 ; WX 453 ; N uni027F ; G 577 +U 640 ; WX 581 ; N uni0280 ; G 578 +U 641 ; WX 581 ; N uni0281 ; G 579 +U 642 ; WX 513 ; N uni0282 ; G 580 +U 643 ; WX 271 ; N uni0283 ; G 581 +U 644 ; WX 370 ; N uni0284 ; G 582 +U 645 ; WX 487 ; N uni0285 ; G 583 +U 646 ; WX 324 ; N uni0286 ; G 584 +U 647 ; WX 402 ; N uni0287 ; G 585 +U 648 ; WX 402 ; N uni0288 ; G 586 +U 649 ; WX 644 ; N uni0289 ; G 587 +U 650 ; WX 620 ; N uni028A ; G 588 +U 651 ; WX 608 ; N uni028B ; G 589 +U 652 ; WX 565 ; N uni028C ; G 590 +U 653 ; WX 856 ; N uni028D ; G 591 +U 654 ; WX 565 ; N uni028E ; G 592 +U 655 ; WX 655 ; N uni028F ; G 593 +U 656 ; WX 597 ; N uni0290 ; G 594 +U 657 ; WX 560 ; N uni0291 ; G 595 +U 658 ; WX 564 ; N uni0292 ; G 596 +U 659 ; WX 560 ; N uni0293 ; G 597 +U 660 ; WX 536 ; N uni0294 ; G 598 +U 661 ; WX 536 ; N uni0295 ; G 599 +U 662 ; WX 536 ; N uni0296 ; G 600 +U 663 ; WX 420 ; N uni0297 ; G 601 +U 664 ; WX 820 ; N uni0298 ; G 602 +U 665 ; WX 563 ; N uni0299 ; G 603 +U 666 ; WX 613 ; N uni029A ; G 604 +U 667 ; WX 660 ; N uni029B ; G 605 +U 668 ; WX 667 ; N uni029C ; G 606 +U 669 ; WX 366 ; N uni029D ; G 607 +U 670 ; WX 606 ; N uni029E ; G 608 +U 671 ; WX 543 ; N uni029F ; G 609 +U 672 ; WX 683 ; N uni02A0 ; G 610 +U 673 ; WX 536 ; N uni02A1 ; G 611 +U 674 ; WX 536 ; N uni02A2 ; G 612 +U 675 ; WX 996 ; N uni02A3 ; G 613 +U 676 ; WX 1033 ; N uni02A4 ; G 614 +U 677 ; WX 998 ; N uni02A5 ; G 615 +U 678 ; WX 823 ; N uni02A6 ; G 616 +U 679 ; WX 598 ; N uni02A7 ; G 617 +U 680 ; WX 825 ; N uni02A8 ; G 618 +U 681 ; WX 894 ; N uni02A9 ; G 619 +U 682 ; WX 725 ; N uni02AA ; G 620 +U 683 ; WX 676 ; N uni02AB ; G 621 +U 684 ; WX 598 ; N uni02AC ; G 622 +U 685 ; WX 443 ; N uni02AD ; G 623 +U 686 ; WX 781 ; N uni02AE ; G 624 +U 687 ; WX 767 ; N uni02AF ; G 625 +U 688 ; WX 433 ; N uni02B0 ; G 626 +U 689 ; WX 430 ; N uni02B1 ; G 627 +U 690 ; WX 264 ; N uni02B2 ; G 628 +U 691 ; WX 347 ; N uni02B3 ; G 629 +U 692 ; WX 347 ; N uni02B4 ; G 630 +U 693 ; WX 430 ; N uni02B5 ; G 631 +U 694 ; WX 392 ; N uni02B6 ; G 632 +U 695 ; WX 539 ; N uni02B7 ; G 633 +U 696 ; WX 355 ; N uni02B8 ; G 634 +U 697 ; WX 278 ; N uni02B9 ; G 635 +U 698 ; WX 460 ; N uni02BA ; G 636 +U 699 ; WX 318 ; N uni02BB ; G 637 +U 700 ; WX 318 ; N uni02BC ; G 638 +U 701 ; WX 318 ; N uni02BD ; G 639 +U 702 ; WX 307 ; N uni02BE ; G 640 +U 703 ; WX 307 ; N uni02BF ; G 641 +U 704 ; WX 280 ; N uni02C0 ; G 642 +U 705 ; WX 281 ; N uni02C1 ; G 643 +U 706 ; WX 500 ; N uni02C2 ; G 644 +U 707 ; WX 500 ; N uni02C3 ; G 645 +U 708 ; WX 500 ; N uni02C4 ; G 646 +U 709 ; WX 500 ; N uni02C5 ; G 647 +U 710 ; WX 500 ; N circumflex ; G 648 +U 711 ; WX 500 ; N caron ; G 649 +U 712 ; WX 282 ; N uni02C8 ; G 650 +U 713 ; WX 500 ; N uni02C9 ; G 651 +U 714 ; WX 500 ; N uni02CA ; G 652 +U 715 ; WX 500 ; N uni02CB ; G 653 +U 716 ; WX 282 ; N uni02CC ; G 654 +U 717 ; WX 500 ; N uni02CD ; G 655 +U 720 ; WX 337 ; N uni02D0 ; G 656 +U 721 ; WX 337 ; N uni02D1 ; G 657 +U 722 ; WX 307 ; N uni02D2 ; G 658 +U 723 ; WX 307 ; N uni02D3 ; G 659 +U 726 ; WX 392 ; N uni02D6 ; G 660 +U 727 ; WX 392 ; N uni02D7 ; G 661 +U 728 ; WX 500 ; N breve ; G 662 +U 729 ; WX 500 ; N dotaccent ; G 663 +U 730 ; WX 500 ; N ring ; G 664 +U 731 ; WX 500 ; N ogonek ; G 665 +U 732 ; WX 500 ; N tilde ; G 666 +U 733 ; WX 500 ; N hungarumlaut ; G 667 +U 734 ; WX 417 ; N uni02DE ; G 668 +U 736 ; WX 377 ; N uni02E0 ; G 669 +U 737 ; WX 243 ; N uni02E1 ; G 670 +U 738 ; WX 337 ; N uni02E2 ; G 671 +U 739 ; WX 355 ; N uni02E3 ; G 672 +U 740 ; WX 281 ; N uni02E4 ; G 673 +U 741 ; WX 493 ; N uni02E5 ; G 674 +U 742 ; WX 493 ; N uni02E6 ; G 675 +U 743 ; WX 493 ; N uni02E7 ; G 676 +U 744 ; WX 493 ; N uni02E8 ; G 677 +U 745 ; WX 493 ; N uni02E9 ; G 678 +U 748 ; WX 500 ; N uni02EC ; G 679 +U 750 ; WX 484 ; N uni02EE ; G 680 +U 751 ; WX 500 ; N uni02EF ; G 681 +U 752 ; WX 500 ; N uni02F0 ; G 682 +U 755 ; WX 500 ; N uni02F3 ; G 683 +U 759 ; WX 500 ; N uni02F7 ; G 684 +U 768 ; WX 0 ; N gravecomb ; G 685 +U 769 ; WX 0 ; N acutecomb ; G 686 +U 770 ; WX 0 ; N uni0302 ; G 687 +U 771 ; WX 0 ; N tildecomb ; G 688 +U 772 ; WX 0 ; N uni0304 ; G 689 +U 773 ; WX 0 ; N uni0305 ; G 690 +U 774 ; WX 0 ; N uni0306 ; G 691 +U 775 ; WX 0 ; N uni0307 ; G 692 +U 776 ; WX 0 ; N uni0308 ; G 693 +U 777 ; WX 0 ; N hookabovecomb ; G 694 +U 778 ; WX 0 ; N uni030A ; G 695 +U 779 ; WX 0 ; N uni030B ; G 696 +U 780 ; WX 0 ; N uni030C ; G 697 +U 781 ; WX 0 ; N uni030D ; G 698 +U 782 ; WX 0 ; N uni030E ; G 699 +U 783 ; WX 0 ; N uni030F ; G 700 +U 784 ; WX 0 ; N uni0310 ; G 701 +U 785 ; WX 0 ; N uni0311 ; G 702 +U 786 ; WX 0 ; N uni0312 ; G 703 +U 787 ; WX 0 ; N uni0313 ; G 704 +U 788 ; WX 0 ; N uni0314 ; G 705 +U 789 ; WX 0 ; N uni0315 ; G 706 +U 790 ; WX 0 ; N uni0316 ; G 707 +U 791 ; WX 0 ; N uni0317 ; G 708 +U 792 ; WX 0 ; N uni0318 ; G 709 +U 793 ; WX 0 ; N uni0319 ; G 710 +U 794 ; WX 0 ; N uni031A ; G 711 +U 795 ; WX 0 ; N uni031B ; G 712 +U 796 ; WX 0 ; N uni031C ; G 713 +U 797 ; WX 0 ; N uni031D ; G 714 +U 798 ; WX 0 ; N uni031E ; G 715 +U 799 ; WX 0 ; N uni031F ; G 716 +U 800 ; WX 0 ; N uni0320 ; G 717 +U 801 ; WX 0 ; N uni0321 ; G 718 +U 802 ; WX 0 ; N uni0322 ; G 719 +U 803 ; WX 0 ; N dotbelowcomb ; G 720 +U 804 ; WX 0 ; N uni0324 ; G 721 +U 805 ; WX 0 ; N uni0325 ; G 722 +U 806 ; WX 0 ; N uni0326 ; G 723 +U 807 ; WX 0 ; N uni0327 ; G 724 +U 808 ; WX 0 ; N uni0328 ; G 725 +U 809 ; WX 0 ; N uni0329 ; G 726 +U 810 ; WX 0 ; N uni032A ; G 727 +U 811 ; WX 0 ; N uni032B ; G 728 +U 812 ; WX 0 ; N uni032C ; G 729 +U 813 ; WX 0 ; N uni032D ; G 730 +U 814 ; WX 0 ; N uni032E ; G 731 +U 815 ; WX 0 ; N uni032F ; G 732 +U 816 ; WX 0 ; N uni0330 ; G 733 +U 817 ; WX 0 ; N uni0331 ; G 734 +U 818 ; WX 0 ; N uni0332 ; G 735 +U 819 ; WX 0 ; N uni0333 ; G 736 +U 820 ; WX 0 ; N uni0334 ; G 737 +U 821 ; WX 0 ; N uni0335 ; G 738 +U 822 ; WX 0 ; N uni0336 ; G 739 +U 823 ; WX 0 ; N uni0337 ; G 740 +U 824 ; WX 0 ; N uni0338 ; G 741 +U 825 ; WX 0 ; N uni0339 ; G 742 +U 826 ; WX 0 ; N uni033A ; G 743 +U 827 ; WX 0 ; N uni033B ; G 744 +U 828 ; WX 0 ; N uni033C ; G 745 +U 829 ; WX 0 ; N uni033D ; G 746 +U 830 ; WX 0 ; N uni033E ; G 747 +U 831 ; WX 0 ; N uni033F ; G 748 +U 835 ; WX 0 ; N uni0343 ; G 749 +U 847 ; WX 0 ; N uni034F ; G 750 +U 856 ; WX 0 ; N uni0358 ; G 751 +U 864 ; WX 0 ; N uni0360 ; G 752 +U 865 ; WX 0 ; N uni0361 ; G 753 +U 880 ; WX 740 ; N uni0370 ; G 754 +U 881 ; WX 531 ; N uni0371 ; G 755 +U 882 ; WX 667 ; N uni0372 ; G 756 +U 883 ; WX 553 ; N uni0373 ; G 757 +U 884 ; WX 278 ; N uni0374 ; G 758 +U 885 ; WX 278 ; N uni0375 ; G 759 +U 886 ; WX 875 ; N uni0376 ; G 760 +U 887 ; WX 667 ; N uni0377 ; G 761 +U 890 ; WX 500 ; N uni037A ; G 762 +U 891 ; WX 560 ; N uni037B ; G 763 +U 892 ; WX 560 ; N uni037C ; G 764 +U 893 ; WX 560 ; N uni037D ; G 765 +U 894 ; WX 337 ; N uni037E ; G 766 +U 895 ; WX 401 ; N uni037F ; G 767 +U 900 ; WX 500 ; N tonos ; G 768 +U 901 ; WX 500 ; N dieresistonos ; G 769 +U 902 ; WX 722 ; N Alphatonos ; G 770 +U 903 ; WX 318 ; N anoteleia ; G 771 +U 904 ; WX 900 ; N Epsilontonos ; G 772 +U 905 ; WX 1039 ; N Etatonos ; G 773 +U 906 ; WX 562 ; N Iotatonos ; G 774 +U 908 ; WX 835 ; N Omicrontonos ; G 775 +U 910 ; WX 897 ; N Upsilontonos ; G 776 +U 911 ; WX 853 ; N Omegatonos ; G 777 +U 912 ; WX 392 ; N iotadieresistonos ; G 778 +U 913 ; WX 722 ; N Alpha ; G 779 +U 914 ; WX 735 ; N Beta ; G 780 +U 915 ; WX 694 ; N Gamma ; G 781 +U 916 ; WX 722 ; N uni0394 ; G 782 +U 917 ; WX 730 ; N Epsilon ; G 783 +U 918 ; WX 695 ; N Zeta ; G 784 +U 919 ; WX 872 ; N Eta ; G 785 +U 920 ; WX 820 ; N Theta ; G 786 +U 921 ; WX 395 ; N Iota ; G 787 +U 922 ; WX 747 ; N Kappa ; G 788 +U 923 ; WX 722 ; N Lambda ; G 789 +U 924 ; WX 1024 ; N Mu ; G 790 +U 925 ; WX 875 ; N Nu ; G 791 +U 926 ; WX 704 ; N Xi ; G 792 +U 927 ; WX 820 ; N Omicron ; G 793 +U 928 ; WX 872 ; N Pi ; G 794 +U 929 ; WX 673 ; N Rho ; G 795 +U 931 ; WX 707 ; N Sigma ; G 796 +U 932 ; WX 667 ; N Tau ; G 797 +U 933 ; WX 660 ; N Upsilon ; G 798 +U 934 ; WX 820 ; N Phi ; G 799 +U 935 ; WX 712 ; N Chi ; G 800 +U 936 ; WX 877 ; N Psi ; G 801 +U 937 ; WX 829 ; N Omega ; G 802 +U 938 ; WX 395 ; N Iotadieresis ; G 803 +U 939 ; WX 660 ; N Upsilondieresis ; G 804 +U 940 ; WX 675 ; N alphatonos ; G 805 +U 941 ; WX 537 ; N epsilontonos ; G 806 +U 942 ; WX 599 ; N etatonos ; G 807 +U 943 ; WX 392 ; N iotatonos ; G 808 +U 944 ; WX 608 ; N upsilondieresistonos ; G 809 +U 945 ; WX 675 ; N alpha ; G 810 +U 946 ; WX 578 ; N beta ; G 811 +U 947 ; WX 598 ; N gamma ; G 812 +U 948 ; WX 602 ; N delta ; G 813 +U 949 ; WX 537 ; N epsilon ; G 814 +U 950 ; WX 542 ; N zeta ; G 815 +U 951 ; WX 599 ; N eta ; G 816 +U 952 ; WX 602 ; N theta ; G 817 +U 953 ; WX 392 ; N iota ; G 818 +U 954 ; WX 656 ; N kappa ; G 819 +U 955 ; WX 634 ; N lambda ; G 820 +U 956 ; WX 650 ; N uni03BC ; G 821 +U 957 ; WX 608 ; N nu ; G 822 +U 958 ; WX 551 ; N xi ; G 823 +U 959 ; WX 602 ; N omicron ; G 824 +U 960 ; WX 657 ; N pi ; G 825 +U 961 ; WX 588 ; N rho ; G 826 +U 962 ; WX 560 ; N sigma1 ; G 827 +U 963 ; WX 683 ; N sigma ; G 828 +U 964 ; WX 553 ; N tau ; G 829 +U 965 ; WX 608 ; N upsilon ; G 830 +U 966 ; WX 700 ; N phi ; G 831 +U 967 ; WX 606 ; N chi ; G 832 +U 968 ; WX 784 ; N psi ; G 833 +U 969 ; WX 815 ; N omega ; G 834 +U 970 ; WX 392 ; N iotadieresis ; G 835 +U 971 ; WX 608 ; N upsilondieresis ; G 836 +U 972 ; WX 602 ; N omicrontonos ; G 837 +U 973 ; WX 608 ; N upsilontonos ; G 838 +U 974 ; WX 815 ; N omegatonos ; G 839 +U 975 ; WX 747 ; N uni03CF ; G 840 +U 976 ; WX 583 ; N uni03D0 ; G 841 +U 977 ; WX 715 ; N theta1 ; G 842 +U 978 ; WX 687 ; N Upsilon1 ; G 843 +U 979 ; WX 874 ; N uni03D3 ; G 844 +U 980 ; WX 687 ; N uni03D4 ; G 845 +U 981 ; WX 682 ; N phi1 ; G 846 +U 982 ; WX 815 ; N omega1 ; G 847 +U 983 ; WX 624 ; N uni03D7 ; G 848 +U 984 ; WX 820 ; N uni03D8 ; G 849 +U 985 ; WX 602 ; N uni03D9 ; G 850 +U 986 ; WX 765 ; N uni03DA ; G 851 +U 987 ; WX 560 ; N uni03DB ; G 852 +U 988 ; WX 694 ; N uni03DC ; G 853 +U 989 ; WX 463 ; N uni03DD ; G 854 +U 990 ; WX 590 ; N uni03DE ; G 855 +U 991 ; WX 660 ; N uni03DF ; G 856 +U 992 ; WX 782 ; N uni03E0 ; G 857 +U 993 ; WX 577 ; N uni03E1 ; G 858 +U 1008 ; WX 624 ; N uni03F0 ; G 859 +U 1009 ; WX 588 ; N uni03F1 ; G 860 +U 1010 ; WX 560 ; N uni03F2 ; G 861 +U 1011 ; WX 310 ; N uni03F3 ; G 862 +U 1012 ; WX 820 ; N uni03F4 ; G 863 +U 1013 ; WX 560 ; N uni03F5 ; G 864 +U 1014 ; WX 560 ; N uni03F6 ; G 865 +U 1015 ; WX 676 ; N uni03F7 ; G 866 +U 1016 ; WX 640 ; N uni03F8 ; G 867 +U 1017 ; WX 765 ; N uni03F9 ; G 868 +U 1018 ; WX 1024 ; N uni03FA ; G 869 +U 1019 ; WX 708 ; N uni03FB ; G 870 +U 1020 ; WX 588 ; N uni03FC ; G 871 +U 1021 ; WX 765 ; N uni03FD ; G 872 +U 1022 ; WX 765 ; N uni03FE ; G 873 +U 1023 ; WX 765 ; N uni03FF ; G 874 +U 1024 ; WX 730 ; N uni0400 ; G 875 +U 1025 ; WX 730 ; N uni0401 ; G 876 +U 1026 ; WX 799 ; N uni0402 ; G 877 +U 1027 ; WX 662 ; N uni0403 ; G 878 +U 1028 ; WX 765 ; N uni0404 ; G 879 +U 1029 ; WX 685 ; N uni0405 ; G 880 +U 1030 ; WX 395 ; N uni0406 ; G 881 +U 1031 ; WX 395 ; N uni0407 ; G 882 +U 1032 ; WX 401 ; N uni0408 ; G 883 +U 1033 ; WX 1084 ; N uni0409 ; G 884 +U 1034 ; WX 1118 ; N uni040A ; G 885 +U 1035 ; WX 872 ; N uni040B ; G 886 +U 1036 ; WX 774 ; N uni040C ; G 887 +U 1037 ; WX 872 ; N uni040D ; G 888 +U 1038 ; WX 723 ; N uni040E ; G 889 +U 1039 ; WX 872 ; N uni040F ; G 890 +U 1040 ; WX 757 ; N uni0410 ; G 891 +U 1041 ; WX 735 ; N uni0411 ; G 892 +U 1042 ; WX 735 ; N uni0412 ; G 893 +U 1043 ; WX 662 ; N uni0413 ; G 894 +U 1044 ; WX 813 ; N uni0414 ; G 895 +U 1045 ; WX 730 ; N uni0415 ; G 896 +U 1046 ; WX 1124 ; N uni0416 ; G 897 +U 1047 ; WX 623 ; N uni0417 ; G 898 +U 1048 ; WX 872 ; N uni0418 ; G 899 +U 1049 ; WX 872 ; N uni0419 ; G 900 +U 1050 ; WX 774 ; N uni041A ; G 901 +U 1051 ; WX 834 ; N uni041B ; G 902 +U 1052 ; WX 1024 ; N uni041C ; G 903 +U 1053 ; WX 872 ; N uni041D ; G 904 +U 1054 ; WX 820 ; N uni041E ; G 905 +U 1055 ; WX 872 ; N uni041F ; G 906 +U 1056 ; WX 673 ; N uni0420 ; G 907 +U 1057 ; WX 765 ; N uni0421 ; G 908 +U 1058 ; WX 667 ; N uni0422 ; G 909 +U 1059 ; WX 723 ; N uni0423 ; G 910 +U 1060 ; WX 830 ; N uni0424 ; G 911 +U 1061 ; WX 712 ; N uni0425 ; G 912 +U 1062 ; WX 872 ; N uni0426 ; G 913 +U 1063 ; WX 773 ; N uni0427 ; G 914 +U 1064 ; WX 1141 ; N uni0428 ; G 915 +U 1065 ; WX 1141 ; N uni0429 ; G 916 +U 1066 ; WX 794 ; N uni042A ; G 917 +U 1067 ; WX 984 ; N uni042B ; G 918 +U 1068 ; WX 674 ; N uni042C ; G 919 +U 1069 ; WX 765 ; N uni042D ; G 920 +U 1070 ; WX 1193 ; N uni042E ; G 921 +U 1071 ; WX 808 ; N uni042F ; G 922 +U 1072 ; WX 596 ; N uni0430 ; G 923 +U 1073 ; WX 610 ; N uni0431 ; G 924 +U 1074 ; WX 582 ; N uni0432 ; G 925 +U 1075 ; WX 505 ; N uni0433 ; G 926 +U 1076 ; WX 634 ; N uni0434 ; G 927 +U 1077 ; WX 592 ; N uni0435 ; G 928 +U 1078 ; WX 1137 ; N uni0436 ; G 929 +U 1079 ; WX 545 ; N uni0437 ; G 930 +U 1080 ; WX 644 ; N uni0438 ; G 931 +U 1081 ; WX 644 ; N uni0439 ; G 932 +U 1082 ; WX 597 ; N uni043A ; G 933 +U 1083 ; WX 637 ; N uni043B ; G 934 +U 1084 ; WX 829 ; N uni043C ; G 935 +U 1085 ; WX 659 ; N uni043D ; G 936 +U 1086 ; WX 602 ; N uni043E ; G 937 +U 1087 ; WX 644 ; N uni043F ; G 938 +U 1088 ; WX 640 ; N uni0440 ; G 939 +U 1089 ; WX 560 ; N uni0441 ; G 940 +U 1090 ; WX 948 ; N uni0442 ; G 941 +U 1091 ; WX 580 ; N uni0443 ; G 942 +U 1092 ; WX 783 ; N uni0444 ; G 943 +U 1093 ; WX 564 ; N uni0445 ; G 944 +U 1094 ; WX 698 ; N uni0446 ; G 945 +U 1095 ; WX 622 ; N uni0447 ; G 946 +U 1096 ; WX 947 ; N uni0448 ; G 947 +U 1097 ; WX 1001 ; N uni0449 ; G 948 +U 1098 ; WX 667 ; N uni044A ; G 949 +U 1099 ; WX 814 ; N uni044B ; G 950 +U 1100 ; WX 544 ; N uni044C ; G 951 +U 1101 ; WX 560 ; N uni044D ; G 952 +U 1102 ; WX 880 ; N uni044E ; G 953 +U 1103 ; WX 662 ; N uni044F ; G 954 +U 1104 ; WX 592 ; N uni0450 ; G 955 +U 1105 ; WX 592 ; N uni0451 ; G 956 +U 1106 ; WX 624 ; N uni0452 ; G 957 +U 1107 ; WX 505 ; N uni0453 ; G 958 +U 1108 ; WX 560 ; N uni0454 ; G 959 +U 1109 ; WX 513 ; N uni0455 ; G 960 +U 1110 ; WX 320 ; N uni0456 ; G 961 +U 1111 ; WX 320 ; N uni0457 ; G 962 +U 1112 ; WX 310 ; N uni0458 ; G 963 +U 1113 ; WX 859 ; N uni0459 ; G 964 +U 1114 ; WX 878 ; N uni045A ; G 965 +U 1115 ; WX 644 ; N uni045B ; G 966 +U 1116 ; WX 597 ; N uni045C ; G 967 +U 1117 ; WX 644 ; N uni045D ; G 968 +U 1118 ; WX 580 ; N uni045E ; G 969 +U 1119 ; WX 644 ; N uni045F ; G 970 +U 1122 ; WX 762 ; N uni0462 ; G 971 +U 1123 ; WX 882 ; N uni0463 ; G 972 +U 1124 ; WX 1129 ; N uni0464 ; G 973 +U 1125 ; WX 834 ; N uni0465 ; G 974 +U 1130 ; WX 1124 ; N uni046A ; G 975 +U 1131 ; WX 920 ; N uni046B ; G 976 +U 1132 ; WX 1359 ; N uni046C ; G 977 +U 1133 ; WX 1063 ; N uni046D ; G 978 +U 1136 ; WX 944 ; N uni0470 ; G 979 +U 1137 ; WX 902 ; N uni0471 ; G 980 +U 1138 ; WX 820 ; N uni0472 ; G 981 +U 1139 ; WX 552 ; N uni0473 ; G 982 +U 1140 ; WX 859 ; N uni0474 ; G 983 +U 1141 ; WX 678 ; N uni0475 ; G 984 +U 1142 ; WX 859 ; N uni0476 ; G 985 +U 1143 ; WX 678 ; N uni0477 ; G 986 +U 1164 ; WX 707 ; N uni048C ; G 987 +U 1165 ; WX 544 ; N uni048D ; G 988 +U 1168 ; WX 672 ; N uni0490 ; G 989 +U 1169 ; WX 529 ; N uni0491 ; G 990 +U 1170 ; WX 662 ; N uni0492 ; G 991 +U 1171 ; WX 505 ; N uni0493 ; G 992 +U 1172 ; WX 730 ; N uni0494 ; G 993 +U 1173 ; WX 614 ; N uni0495 ; G 994 +U 1174 ; WX 1124 ; N uni0496 ; G 995 +U 1175 ; WX 1137 ; N uni0497 ; G 996 +U 1176 ; WX 623 ; N uni0498 ; G 997 +U 1177 ; WX 545 ; N uni0499 ; G 998 +U 1178 ; WX 774 ; N uni049A ; G 999 +U 1179 ; WX 604 ; N uni049B ; G 1000 +U 1182 ; WX 774 ; N uni049E ; G 1001 +U 1183 ; WX 597 ; N uni049F ; G 1002 +U 1184 ; WX 892 ; N uni04A0 ; G 1003 +U 1185 ; WX 669 ; N uni04A1 ; G 1004 +U 1186 ; WX 872 ; N uni04A2 ; G 1005 +U 1187 ; WX 712 ; N uni04A3 ; G 1006 +U 1188 ; WX 1139 ; N uni04A4 ; G 1007 +U 1189 ; WX 857 ; N uni04A5 ; G 1008 +U 1190 ; WX 1206 ; N uni04A6 ; G 1009 +U 1191 ; WX 943 ; N uni04A7 ; G 1010 +U 1194 ; WX 765 ; N uni04AA ; G 1011 +U 1195 ; WX 560 ; N uni04AB ; G 1012 +U 1196 ; WX 667 ; N uni04AC ; G 1013 +U 1197 ; WX 1013 ; N uni04AD ; G 1014 +U 1198 ; WX 660 ; N uni04AE ; G 1015 +U 1199 ; WX 571 ; N uni04AF ; G 1016 +U 1200 ; WX 660 ; N uni04B0 ; G 1017 +U 1201 ; WX 571 ; N uni04B1 ; G 1018 +U 1202 ; WX 712 ; N uni04B2 ; G 1019 +U 1203 ; WX 629 ; N uni04B3 ; G 1020 +U 1204 ; WX 936 ; N uni04B4 ; G 1021 +U 1205 ; WX 732 ; N uni04B5 ; G 1022 +U 1206 ; WX 749 ; N uni04B6 ; G 1023 +U 1207 ; WX 677 ; N uni04B7 ; G 1024 +U 1210 ; WX 749 ; N uni04BA ; G 1025 +U 1211 ; WX 644 ; N uni04BB ; G 1026 +U 1216 ; WX 395 ; N uni04C0 ; G 1027 +U 1217 ; WX 1124 ; N uni04C1 ; G 1028 +U 1218 ; WX 1137 ; N uni04C2 ; G 1029 +U 1219 ; WX 747 ; N uni04C3 ; G 1030 +U 1220 ; WX 606 ; N uni04C4 ; G 1031 +U 1223 ; WX 872 ; N uni04C7 ; G 1032 +U 1224 ; WX 667 ; N uni04C8 ; G 1033 +U 1227 ; WX 749 ; N uni04CB ; G 1034 +U 1228 ; WX 667 ; N uni04CC ; G 1035 +U 1231 ; WX 320 ; N uni04CF ; G 1036 +U 1232 ; WX 757 ; N uni04D0 ; G 1037 +U 1233 ; WX 596 ; N uni04D1 ; G 1038 +U 1234 ; WX 757 ; N uni04D2 ; G 1039 +U 1235 ; WX 596 ; N uni04D3 ; G 1040 +U 1236 ; WX 1001 ; N uni04D4 ; G 1041 +U 1237 ; WX 940 ; N uni04D5 ; G 1042 +U 1238 ; WX 730 ; N uni04D6 ; G 1043 +U 1239 ; WX 592 ; N uni04D7 ; G 1044 +U 1240 ; WX 820 ; N uni04D8 ; G 1045 +U 1241 ; WX 592 ; N uni04D9 ; G 1046 +U 1242 ; WX 820 ; N uni04DA ; G 1047 +U 1243 ; WX 592 ; N uni04DB ; G 1048 +U 1244 ; WX 1124 ; N uni04DC ; G 1049 +U 1245 ; WX 1137 ; N uni04DD ; G 1050 +U 1246 ; WX 623 ; N uni04DE ; G 1051 +U 1247 ; WX 545 ; N uni04DF ; G 1052 +U 1248 ; WX 564 ; N uni04E0 ; G 1053 +U 1249 ; WX 564 ; N uni04E1 ; G 1054 +U 1250 ; WX 872 ; N uni04E2 ; G 1055 +U 1251 ; WX 644 ; N uni04E3 ; G 1056 +U 1252 ; WX 872 ; N uni04E4 ; G 1057 +U 1253 ; WX 644 ; N uni04E5 ; G 1058 +U 1254 ; WX 820 ; N uni04E6 ; G 1059 +U 1255 ; WX 602 ; N uni04E7 ; G 1060 +U 1256 ; WX 820 ; N uni04E8 ; G 1061 +U 1257 ; WX 602 ; N uni04E9 ; G 1062 +U 1258 ; WX 820 ; N uni04EA ; G 1063 +U 1259 ; WX 602 ; N uni04EB ; G 1064 +U 1260 ; WX 765 ; N uni04EC ; G 1065 +U 1261 ; WX 560 ; N uni04ED ; G 1066 +U 1262 ; WX 723 ; N uni04EE ; G 1067 +U 1263 ; WX 580 ; N uni04EF ; G 1068 +U 1264 ; WX 723 ; N uni04F0 ; G 1069 +U 1265 ; WX 580 ; N uni04F1 ; G 1070 +U 1266 ; WX 723 ; N uni04F2 ; G 1071 +U 1267 ; WX 580 ; N uni04F3 ; G 1072 +U 1268 ; WX 773 ; N uni04F4 ; G 1073 +U 1269 ; WX 622 ; N uni04F5 ; G 1074 +U 1270 ; WX 662 ; N uni04F6 ; G 1075 +U 1271 ; WX 505 ; N uni04F7 ; G 1076 +U 1272 ; WX 984 ; N uni04F8 ; G 1077 +U 1273 ; WX 814 ; N uni04F9 ; G 1078 +U 1296 ; WX 623 ; N uni0510 ; G 1079 +U 1297 ; WX 545 ; N uni0511 ; G 1080 +U 1298 ; WX 834 ; N uni0512 ; G 1081 +U 1299 ; WX 637 ; N uni0513 ; G 1082 +U 1300 ; WX 1199 ; N uni0514 ; G 1083 +U 1301 ; WX 939 ; N uni0515 ; G 1084 +U 1306 ; WX 820 ; N uni051A ; G 1085 +U 1307 ; WX 640 ; N uni051B ; G 1086 +U 1308 ; WX 1028 ; N uni051C ; G 1087 +U 1309 ; WX 856 ; N uni051D ; G 1088 +U 1329 ; WX 810 ; N uni0531 ; G 1089 +U 1330 ; WX 811 ; N uni0532 ; G 1090 +U 1331 ; WX 806 ; N uni0533 ; G 1091 +U 1332 ; WX 828 ; N uni0534 ; G 1092 +U 1333 ; WX 806 ; N uni0535 ; G 1093 +U 1334 ; WX 826 ; N uni0536 ; G 1094 +U 1335 ; WX 761 ; N uni0537 ; G 1095 +U 1336 ; WX 811 ; N uni0538 ; G 1096 +U 1337 ; WX 968 ; N uni0539 ; G 1097 +U 1338 ; WX 816 ; N uni053A ; G 1098 +U 1339 ; WX 772 ; N uni053B ; G 1099 +U 1340 ; WX 682 ; N uni053C ; G 1100 +U 1341 ; WX 1097 ; N uni053D ; G 1101 +U 1342 ; WX 845 ; N uni053E ; G 1102 +U 1343 ; WX 804 ; N uni053F ; G 1103 +U 1344 ; WX 719 ; N uni0540 ; G 1104 +U 1345 ; WX 810 ; N uni0541 ; G 1105 +U 1346 ; WX 833 ; N uni0542 ; G 1106 +U 1347 ; WX 831 ; N uni0543 ; G 1107 +U 1348 ; WX 897 ; N uni0544 ; G 1108 +U 1349 ; WX 763 ; N uni0545 ; G 1109 +U 1350 ; WX 794 ; N uni0546 ; G 1110 +U 1351 ; WX 754 ; N uni0547 ; G 1111 +U 1352 ; WX 799 ; N uni0548 ; G 1112 +U 1353 ; WX 797 ; N uni0549 ; G 1113 +U 1354 ; WX 875 ; N uni054A ; G 1114 +U 1355 ; WX 830 ; N uni054B ; G 1115 +U 1356 ; WX 864 ; N uni054C ; G 1116 +U 1357 ; WX 799 ; N uni054D ; G 1117 +U 1358 ; WX 802 ; N uni054E ; G 1118 +U 1359 ; WX 731 ; N uni054F ; G 1119 +U 1360 ; WX 774 ; N uni0550 ; G 1120 +U 1361 ; WX 749 ; N uni0551 ; G 1121 +U 1362 ; WX 633 ; N uni0552 ; G 1122 +U 1363 ; WX 845 ; N uni0553 ; G 1123 +U 1364 ; WX 843 ; N uni0554 ; G 1124 +U 1365 ; WX 835 ; N uni0555 ; G 1125 +U 1366 ; WX 821 ; N uni0556 ; G 1126 +U 1369 ; WX 307 ; N uni0559 ; G 1127 +U 1370 ; WX 264 ; N uni055A ; G 1128 +U 1371 ; WX 229 ; N uni055B ; G 1129 +U 1372 ; WX 391 ; N uni055C ; G 1130 +U 1373 ; WX 364 ; N uni055D ; G 1131 +U 1374 ; WX 386 ; N uni055E ; G 1132 +U 1375 ; WX 500 ; N uni055F ; G 1133 +U 1377 ; WX 949 ; N uni0561 ; G 1134 +U 1378 ; WX 618 ; N uni0562 ; G 1135 +U 1379 ; WX 695 ; N uni0563 ; G 1136 +U 1380 ; WX 695 ; N uni0564 ; G 1137 +U 1381 ; WX 628 ; N uni0565 ; G 1138 +U 1382 ; WX 688 ; N uni0566 ; G 1139 +U 1383 ; WX 510 ; N uni0567 ; G 1140 +U 1384 ; WX 636 ; N uni0568 ; G 1141 +U 1385 ; WX 791 ; N uni0569 ; G 1142 +U 1386 ; WX 671 ; N uni056A ; G 1143 +U 1387 ; WX 635 ; N uni056B ; G 1144 +U 1388 ; WX 305 ; N uni056C ; G 1145 +U 1389 ; WX 973 ; N uni056D ; G 1146 +U 1390 ; WX 614 ; N uni056E ; G 1147 +U 1391 ; WX 628 ; N uni056F ; G 1148 +U 1392 ; WX 636 ; N uni0570 ; G 1149 +U 1393 ; WX 630 ; N uni0571 ; G 1150 +U 1394 ; WX 636 ; N uni0572 ; G 1151 +U 1395 ; WX 654 ; N uni0573 ; G 1152 +U 1396 ; WX 644 ; N uni0574 ; G 1153 +U 1397 ; WX 309 ; N uni0575 ; G 1154 +U 1398 ; WX 636 ; N uni0576 ; G 1155 +U 1399 ; WX 461 ; N uni0577 ; G 1156 +U 1400 ; WX 649 ; N uni0578 ; G 1157 +U 1401 ; WX 365 ; N uni0579 ; G 1158 +U 1402 ; WX 940 ; N uni057A ; G 1159 +U 1403 ; WX 562 ; N uni057B ; G 1160 +U 1404 ; WX 657 ; N uni057C ; G 1161 +U 1405 ; WX 644 ; N uni057D ; G 1162 +U 1406 ; WX 630 ; N uni057E ; G 1163 +U 1407 ; WX 930 ; N uni057F ; G 1164 +U 1408 ; WX 644 ; N uni0580 ; G 1165 +U 1409 ; WX 643 ; N uni0581 ; G 1166 +U 1410 ; WX 483 ; N uni0582 ; G 1167 +U 1411 ; WX 930 ; N uni0583 ; G 1168 +U 1412 ; WX 636 ; N uni0584 ; G 1169 +U 1413 ; WX 609 ; N uni0585 ; G 1170 +U 1414 ; WX 809 ; N uni0586 ; G 1171 +U 1415 ; WX 789 ; N uni0587 ; G 1172 +U 1417 ; WX 340 ; N uni0589 ; G 1173 +U 1418 ; WX 334 ; N uni058A ; G 1174 +U 3647 ; WX 636 ; N uni0E3F ; G 1175 +U 4256 ; WX 732 ; N uni10A0 ; G 1176 +U 4257 ; WX 860 ; N uni10A1 ; G 1177 +U 4258 ; WX 837 ; N uni10A2 ; G 1178 +U 4259 ; WX 869 ; N uni10A3 ; G 1179 +U 4260 ; WX 743 ; N uni10A4 ; G 1180 +U 4261 ; WX 991 ; N uni10A5 ; G 1181 +U 4262 ; WX 925 ; N uni10A6 ; G 1182 +U 4263 ; WX 1111 ; N uni10A7 ; G 1183 +U 4264 ; WX 576 ; N uni10A8 ; G 1184 +U 4265 ; WX 760 ; N uni10A9 ; G 1185 +U 4266 ; WX 972 ; N uni10AA ; G 1186 +U 4267 ; WX 951 ; N uni10AB ; G 1187 +U 4268 ; WX 753 ; N uni10AC ; G 1188 +U 4269 ; WX 1084 ; N uni10AD ; G 1189 +U 4270 ; WX 906 ; N uni10AE ; G 1190 +U 4271 ; WX 838 ; N uni10AF ; G 1191 +U 4272 ; WX 1049 ; N uni10B0 ; G 1192 +U 4273 ; WX 743 ; N uni10B1 ; G 1193 +U 4274 ; WX 679 ; N uni10B2 ; G 1194 +U 4275 ; WX 1025 ; N uni10B3 ; G 1195 +U 4276 ; WX 946 ; N uni10B4 ; G 1196 +U 4277 ; WX 1029 ; N uni10B5 ; G 1197 +U 4278 ; WX 741 ; N uni10B6 ; G 1198 +U 4279 ; WX 743 ; N uni10B7 ; G 1199 +U 4280 ; WX 742 ; N uni10B8 ; G 1200 +U 4281 ; WX 743 ; N uni10B9 ; G 1201 +U 4282 ; WX 889 ; N uni10BA ; G 1202 +U 4283 ; WX 946 ; N uni10BB ; G 1203 +U 4284 ; WX 724 ; N uni10BC ; G 1204 +U 4285 ; WX 765 ; N uni10BD ; G 1205 +U 4286 ; WX 743 ; N uni10BE ; G 1206 +U 4287 ; WX 968 ; N uni10BF ; G 1207 +U 4288 ; WX 1010 ; N uni10C0 ; G 1208 +U 4289 ; WX 712 ; N uni10C1 ; G 1209 +U 4290 ; WX 874 ; N uni10C2 ; G 1210 +U 4291 ; WX 744 ; N uni10C3 ; G 1211 +U 4292 ; WX 847 ; N uni10C4 ; G 1212 +U 4293 ; WX 960 ; N uni10C5 ; G 1213 +U 4304 ; WX 550 ; N uni10D0 ; G 1214 +U 4305 ; WX 581 ; N uni10D1 ; G 1215 +U 4306 ; WX 599 ; N uni10D2 ; G 1216 +U 4307 ; WX 843 ; N uni10D3 ; G 1217 +U 4308 ; WX 571 ; N uni10D4 ; G 1218 +U 4309 ; WX 567 ; N uni10D5 ; G 1219 +U 4310 ; WX 620 ; N uni10D6 ; G 1220 +U 4311 ; WX 871 ; N uni10D7 ; G 1221 +U 4312 ; WX 569 ; N uni10D8 ; G 1222 +U 4313 ; WX 556 ; N uni10D9 ; G 1223 +U 4314 ; WX 1076 ; N uni10DA ; G 1224 +U 4315 ; WX 596 ; N uni10DB ; G 1225 +U 4316 ; WX 596 ; N uni10DC ; G 1226 +U 4317 ; WX 835 ; N uni10DD ; G 1227 +U 4318 ; WX 580 ; N uni10DE ; G 1228 +U 4319 ; WX 590 ; N uni10DF ; G 1229 +U 4320 ; WX 833 ; N uni10E0 ; G 1230 +U 4321 ; WX 607 ; N uni10E1 ; G 1231 +U 4322 ; WX 758 ; N uni10E2 ; G 1232 +U 4323 ; WX 701 ; N uni10E3 ; G 1233 +U 4324 ; WX 825 ; N uni10E4 ; G 1234 +U 4325 ; WX 595 ; N uni10E5 ; G 1235 +U 4326 ; WX 868 ; N uni10E6 ; G 1236 +U 4327 ; WX 578 ; N uni10E7 ; G 1237 +U 4328 ; WX 604 ; N uni10E8 ; G 1238 +U 4329 ; WX 596 ; N uni10E9 ; G 1239 +U 4330 ; WX 685 ; N uni10EA ; G 1240 +U 4331 ; WX 597 ; N uni10EB ; G 1241 +U 4332 ; WX 557 ; N uni10EC ; G 1242 +U 4333 ; WX 585 ; N uni10ED ; G 1243 +U 4334 ; WX 625 ; N uni10EE ; G 1244 +U 4335 ; WX 693 ; N uni10EF ; G 1245 +U 4336 ; WX 582 ; N uni10F0 ; G 1246 +U 4337 ; WX 613 ; N uni10F1 ; G 1247 +U 4338 ; WX 581 ; N uni10F2 ; G 1248 +U 4339 ; WX 582 ; N uni10F3 ; G 1249 +U 4340 ; WX 580 ; N uni10F4 ; G 1250 +U 4341 ; WX 659 ; N uni10F5 ; G 1251 +U 4342 ; WX 896 ; N uni10F6 ; G 1252 +U 4343 ; WX 636 ; N uni10F7 ; G 1253 +U 4344 ; WX 592 ; N uni10F8 ; G 1254 +U 4345 ; WX 628 ; N uni10F9 ; G 1255 +U 4346 ; WX 581 ; N uni10FA ; G 1256 +U 4347 ; WX 456 ; N uni10FB ; G 1257 +U 4348 ; WX 373 ; N uni10FC ; G 1258 +U 7424 ; WX 565 ; N uni1D00 ; G 1259 +U 7425 ; WX 774 ; N uni1D01 ; G 1260 +U 7426 ; WX 940 ; N uni1D02 ; G 1261 +U 7427 ; WX 563 ; N uni1D03 ; G 1262 +U 7428 ; WX 560 ; N uni1D04 ; G 1263 +U 7429 ; WX 585 ; N uni1D05 ; G 1264 +U 7430 ; WX 585 ; N uni1D06 ; G 1265 +U 7431 ; WX 553 ; N uni1D07 ; G 1266 +U 7432 ; WX 509 ; N uni1D08 ; G 1267 +U 7433 ; WX 320 ; N uni1D09 ; G 1268 +U 7434 ; WX 499 ; N uni1D0A ; G 1269 +U 7435 ; WX 597 ; N uni1D0B ; G 1270 +U 7436 ; WX 543 ; N uni1D0C ; G 1271 +U 7437 ; WX 778 ; N uni1D0D ; G 1272 +U 7438 ; WX 667 ; N uni1D0E ; G 1273 +U 7439 ; WX 602 ; N uni1D0F ; G 1274 +U 7440 ; WX 560 ; N uni1D10 ; G 1275 +U 7441 ; WX 647 ; N uni1D11 ; G 1276 +U 7442 ; WX 647 ; N uni1D12 ; G 1277 +U 7443 ; WX 647 ; N uni1D13 ; G 1278 +U 7444 ; WX 989 ; N uni1D14 ; G 1279 +U 7445 ; WX 512 ; N uni1D15 ; G 1280 +U 7446 ; WX 602 ; N uni1D16 ; G 1281 +U 7447 ; WX 602 ; N uni1D17 ; G 1282 +U 7448 ; WX 553 ; N uni1D18 ; G 1283 +U 7449 ; WX 594 ; N uni1D19 ; G 1284 +U 7450 ; WX 594 ; N uni1D1A ; G 1285 +U 7451 ; WX 553 ; N uni1D1B ; G 1286 +U 7452 ; WX 585 ; N uni1D1C ; G 1287 +U 7453 ; WX 664 ; N uni1D1D ; G 1288 +U 7454 ; WX 923 ; N uni1D1E ; G 1289 +U 7455 ; WX 655 ; N uni1D1F ; G 1290 +U 7456 ; WX 565 ; N uni1D20 ; G 1291 +U 7457 ; WX 856 ; N uni1D21 ; G 1292 +U 7458 ; WX 527 ; N uni1D22 ; G 1293 +U 7459 ; WX 527 ; N uni1D23 ; G 1294 +U 7460 ; WX 531 ; N uni1D24 ; G 1295 +U 7461 ; WX 743 ; N uni1D25 ; G 1296 +U 7462 ; WX 524 ; N uni1D26 ; G 1297 +U 7463 ; WX 565 ; N uni1D27 ; G 1298 +U 7464 ; WX 657 ; N uni1D28 ; G 1299 +U 7465 ; WX 553 ; N uni1D29 ; G 1300 +U 7466 ; WX 703 ; N uni1D2A ; G 1301 +U 7467 ; WX 635 ; N uni1D2B ; G 1302 +U 7468 ; WX 455 ; N uni1D2C ; G 1303 +U 7469 ; WX 630 ; N uni1D2D ; G 1304 +U 7470 ; WX 463 ; N uni1D2E ; G 1305 +U 7471 ; WX 463 ; N uni1D2F ; G 1306 +U 7472 ; WX 505 ; N uni1D30 ; G 1307 +U 7473 ; WX 459 ; N uni1D31 ; G 1308 +U 7474 ; WX 459 ; N uni1D32 ; G 1309 +U 7475 ; WX 503 ; N uni1D33 ; G 1310 +U 7476 ; WX 549 ; N uni1D34 ; G 1311 +U 7477 ; WX 249 ; N uni1D35 ; G 1312 +U 7478 ; WX 252 ; N uni1D36 ; G 1313 +U 7479 ; WX 470 ; N uni1D37 ; G 1314 +U 7480 ; WX 418 ; N uni1D38 ; G 1315 +U 7481 ; WX 645 ; N uni1D39 ; G 1316 +U 7482 ; WX 551 ; N uni1D3A ; G 1317 +U 7483 ; WX 551 ; N uni1D3B ; G 1318 +U 7484 ; WX 516 ; N uni1D3C ; G 1319 +U 7485 ; WX 369 ; N uni1D3D ; G 1320 +U 7486 ; WX 424 ; N uni1D3E ; G 1321 +U 7487 ; WX 474 ; N uni1D3F ; G 1322 +U 7488 ; WX 420 ; N uni1D40 ; G 1323 +U 7489 ; WX 531 ; N uni1D41 ; G 1324 +U 7490 ; WX 647 ; N uni1D42 ; G 1325 +U 7491 ; WX 375 ; N uni1D43 ; G 1326 +U 7492 ; WX 375 ; N uni1D44 ; G 1327 +U 7493 ; WX 425 ; N uni1D45 ; G 1328 +U 7494 ; WX 592 ; N uni1D46 ; G 1329 +U 7495 ; WX 400 ; N uni1D47 ; G 1330 +U 7496 ; WX 400 ; N uni1D48 ; G 1331 +U 7497 ; WX 387 ; N uni1D49 ; G 1332 +U 7498 ; WX 387 ; N uni1D4A ; G 1333 +U 7499 ; WX 428 ; N uni1D4B ; G 1334 +U 7500 ; WX 340 ; N uni1D4C ; G 1335 +U 7501 ; WX 400 ; N uni1D4D ; G 1336 +U 7502 ; WX 175 ; N uni1D4E ; G 1337 +U 7503 ; WX 365 ; N uni1D4F ; G 1338 +U 7504 ; WX 613 ; N uni1D50 ; G 1339 +U 7505 ; WX 399 ; N uni1D51 ; G 1340 +U 7506 ; WX 385 ; N uni1D52 ; G 1341 +U 7507 ; WX 346 ; N uni1D53 ; G 1342 +U 7508 ; WX 385 ; N uni1D54 ; G 1343 +U 7509 ; WX 385 ; N uni1D55 ; G 1344 +U 7510 ; WX 400 ; N uni1D56 ; G 1345 +U 7511 ; WX 247 ; N uni1D57 ; G 1346 +U 7512 ; WX 399 ; N uni1D58 ; G 1347 +U 7513 ; WX 418 ; N uni1D59 ; G 1348 +U 7514 ; WX 613 ; N uni1D5A ; G 1349 +U 7515 ; WX 373 ; N uni1D5B ; G 1350 +U 7516 ; WX 468 ; N uni1D5C ; G 1351 +U 7517 ; WX 364 ; N uni1D5D ; G 1352 +U 7518 ; WX 376 ; N uni1D5E ; G 1353 +U 7519 ; WX 379 ; N uni1D5F ; G 1354 +U 7520 ; WX 441 ; N uni1D60 ; G 1355 +U 7521 ; WX 381 ; N uni1D61 ; G 1356 +U 7522 ; WX 201 ; N uni1D62 ; G 1357 +U 7523 ; WX 347 ; N uni1D63 ; G 1358 +U 7524 ; WX 399 ; N uni1D64 ; G 1359 +U 7525 ; WX 373 ; N uni1D65 ; G 1360 +U 7526 ; WX 364 ; N uni1D66 ; G 1361 +U 7527 ; WX 376 ; N uni1D67 ; G 1362 +U 7528 ; WX 370 ; N uni1D68 ; G 1363 +U 7529 ; WX 441 ; N uni1D69 ; G 1364 +U 7530 ; WX 381 ; N uni1D6A ; G 1365 +U 7531 ; WX 974 ; N uni1D6B ; G 1366 +U 7543 ; WX 640 ; N uni1D77 ; G 1367 +U 7544 ; WX 549 ; N uni1D78 ; G 1368 +U 7547 ; WX 320 ; N uni1D7B ; G 1369 +U 7548 ; WX 392 ; N uni1D7C ; G 1370 +U 7549 ; WX 640 ; N uni1D7D ; G 1371 +U 7550 ; WX 585 ; N uni1D7E ; G 1372 +U 7551 ; WX 620 ; N uni1D7F ; G 1373 +U 7557 ; WX 320 ; N uni1D85 ; G 1374 +U 7579 ; WX 425 ; N uni1D9B ; G 1375 +U 7580 ; WX 353 ; N uni1D9C ; G 1376 +U 7581 ; WX 353 ; N uni1D9D ; G 1377 +U 7582 ; WX 473 ; N uni1D9E ; G 1378 +U 7583 ; WX 428 ; N uni1D9F ; G 1379 +U 7584 ; WX 233 ; N uni1DA0 ; G 1380 +U 7585 ; WX 316 ; N uni1DA1 ; G 1381 +U 7586 ; WX 488 ; N uni1DA2 ; G 1382 +U 7587 ; WX 399 ; N uni1DA3 ; G 1383 +U 7588 ; WX 201 ; N uni1DA4 ; G 1384 +U 7589 ; WX 201 ; N uni1DA5 ; G 1385 +U 7590 ; WX 201 ; N uni1DA6 ; G 1386 +U 7591 ; WX 201 ; N uni1DA7 ; G 1387 +U 7592 ; WX 318 ; N uni1DA8 ; G 1388 +U 7593 ; WX 263 ; N uni1DA9 ; G 1389 +U 7594 ; WX 263 ; N uni1DAA ; G 1390 +U 7595 ; WX 455 ; N uni1DAB ; G 1391 +U 7596 ; WX 613 ; N uni1DAC ; G 1392 +U 7597 ; WX 613 ; N uni1DAD ; G 1393 +U 7598 ; WX 495 ; N uni1DAE ; G 1394 +U 7599 ; WX 492 ; N uni1DAF ; G 1395 +U 7600 ; WX 487 ; N uni1DB0 ; G 1396 +U 7601 ; WX 385 ; N uni1DB1 ; G 1397 +U 7602 ; WX 473 ; N uni1DB2 ; G 1398 +U 7603 ; WX 328 ; N uni1DB3 ; G 1399 +U 7604 ; WX 299 ; N uni1DB4 ; G 1400 +U 7605 ; WX 334 ; N uni1DB5 ; G 1401 +U 7606 ; WX 399 ; N uni1DB6 ; G 1402 +U 7607 ; WX 477 ; N uni1DB7 ; G 1403 +U 7608 ; WX 368 ; N uni1DB8 ; G 1404 +U 7609 ; WX 464 ; N uni1DB9 ; G 1405 +U 7610 ; WX 355 ; N uni1DBA ; G 1406 +U 7611 ; WX 332 ; N uni1DBB ; G 1407 +U 7612 ; WX 418 ; N uni1DBC ; G 1408 +U 7613 ; WX 418 ; N uni1DBD ; G 1409 +U 7614 ; WX 452 ; N uni1DBE ; G 1410 +U 7615 ; WX 473 ; N uni1DBF ; G 1411 +U 7620 ; WX 0 ; N uni1DC4 ; G 1412 +U 7621 ; WX 0 ; N uni1DC5 ; G 1413 +U 7622 ; WX 0 ; N uni1DC6 ; G 1414 +U 7623 ; WX 0 ; N uni1DC7 ; G 1415 +U 7624 ; WX 0 ; N uni1DC8 ; G 1416 +U 7625 ; WX 0 ; N uni1DC9 ; G 1417 +U 7680 ; WX 722 ; N uni1E00 ; G 1418 +U 7681 ; WX 596 ; N uni1E01 ; G 1419 +U 7682 ; WX 735 ; N uni1E02 ; G 1420 +U 7683 ; WX 640 ; N uni1E03 ; G 1421 +U 7684 ; WX 735 ; N uni1E04 ; G 1422 +U 7685 ; WX 640 ; N uni1E05 ; G 1423 +U 7686 ; WX 735 ; N uni1E06 ; G 1424 +U 7687 ; WX 640 ; N uni1E07 ; G 1425 +U 7688 ; WX 765 ; N uni1E08 ; G 1426 +U 7689 ; WX 560 ; N uni1E09 ; G 1427 +U 7690 ; WX 802 ; N uni1E0A ; G 1428 +U 7691 ; WX 640 ; N uni1E0B ; G 1429 +U 7692 ; WX 802 ; N uni1E0C ; G 1430 +U 7693 ; WX 640 ; N uni1E0D ; G 1431 +U 7694 ; WX 802 ; N uni1E0E ; G 1432 +U 7695 ; WX 640 ; N uni1E0F ; G 1433 +U 7696 ; WX 802 ; N uni1E10 ; G 1434 +U 7697 ; WX 640 ; N uni1E11 ; G 1435 +U 7698 ; WX 802 ; N uni1E12 ; G 1436 +U 7699 ; WX 640 ; N uni1E13 ; G 1437 +U 7700 ; WX 730 ; N uni1E14 ; G 1438 +U 7701 ; WX 592 ; N uni1E15 ; G 1439 +U 7702 ; WX 730 ; N uni1E16 ; G 1440 +U 7703 ; WX 592 ; N uni1E17 ; G 1441 +U 7704 ; WX 730 ; N uni1E18 ; G 1442 +U 7705 ; WX 592 ; N uni1E19 ; G 1443 +U 7706 ; WX 730 ; N uni1E1A ; G 1444 +U 7707 ; WX 592 ; N uni1E1B ; G 1445 +U 7708 ; WX 730 ; N uni1E1C ; G 1446 +U 7709 ; WX 592 ; N uni1E1D ; G 1447 +U 7710 ; WX 694 ; N uni1E1E ; G 1448 +U 7711 ; WX 370 ; N uni1E1F ; G 1449 +U 7712 ; WX 799 ; N uni1E20 ; G 1450 +U 7713 ; WX 640 ; N uni1E21 ; G 1451 +U 7714 ; WX 872 ; N uni1E22 ; G 1452 +U 7715 ; WX 644 ; N uni1E23 ; G 1453 +U 7716 ; WX 872 ; N uni1E24 ; G 1454 +U 7717 ; WX 644 ; N uni1E25 ; G 1455 +U 7718 ; WX 872 ; N uni1E26 ; G 1456 +U 7719 ; WX 644 ; N uni1E27 ; G 1457 +U 7720 ; WX 872 ; N uni1E28 ; G 1458 +U 7721 ; WX 644 ; N uni1E29 ; G 1459 +U 7722 ; WX 872 ; N uni1E2A ; G 1460 +U 7723 ; WX 644 ; N uni1E2B ; G 1461 +U 7724 ; WX 395 ; N uni1E2C ; G 1462 +U 7725 ; WX 320 ; N uni1E2D ; G 1463 +U 7726 ; WX 395 ; N uni1E2E ; G 1464 +U 7727 ; WX 320 ; N uni1E2F ; G 1465 +U 7728 ; WX 747 ; N uni1E30 ; G 1466 +U 7729 ; WX 606 ; N uni1E31 ; G 1467 +U 7730 ; WX 747 ; N uni1E32 ; G 1468 +U 7731 ; WX 606 ; N uni1E33 ; G 1469 +U 7732 ; WX 747 ; N uni1E34 ; G 1470 +U 7733 ; WX 606 ; N uni1E35 ; G 1471 +U 7734 ; WX 664 ; N uni1E36 ; G 1472 +U 7735 ; WX 320 ; N uni1E37 ; G 1473 +U 7736 ; WX 664 ; N uni1E38 ; G 1474 +U 7737 ; WX 320 ; N uni1E39 ; G 1475 +U 7738 ; WX 664 ; N uni1E3A ; G 1476 +U 7739 ; WX 320 ; N uni1E3B ; G 1477 +U 7740 ; WX 664 ; N uni1E3C ; G 1478 +U 7741 ; WX 320 ; N uni1E3D ; G 1479 +U 7742 ; WX 1024 ; N uni1E3E ; G 1480 +U 7743 ; WX 948 ; N uni1E3F ; G 1481 +U 7744 ; WX 1024 ; N uni1E40 ; G 1482 +U 7745 ; WX 948 ; N uni1E41 ; G 1483 +U 7746 ; WX 1024 ; N uni1E42 ; G 1484 +U 7747 ; WX 953 ; N uni1E43 ; G 1485 +U 7748 ; WX 875 ; N uni1E44 ; G 1486 +U 7749 ; WX 644 ; N uni1E45 ; G 1487 +U 7750 ; WX 875 ; N uni1E46 ; G 1488 +U 7751 ; WX 644 ; N uni1E47 ; G 1489 +U 7752 ; WX 875 ; N uni1E48 ; G 1490 +U 7753 ; WX 644 ; N uni1E49 ; G 1491 +U 7754 ; WX 875 ; N uni1E4A ; G 1492 +U 7755 ; WX 644 ; N uni1E4B ; G 1493 +U 7756 ; WX 820 ; N uni1E4C ; G 1494 +U 7757 ; WX 602 ; N uni1E4D ; G 1495 +U 7758 ; WX 820 ; N uni1E4E ; G 1496 +U 7759 ; WX 602 ; N uni1E4F ; G 1497 +U 7760 ; WX 820 ; N uni1E50 ; G 1498 +U 7761 ; WX 602 ; N uni1E51 ; G 1499 +U 7762 ; WX 820 ; N uni1E52 ; G 1500 +U 7763 ; WX 602 ; N uni1E53 ; G 1501 +U 7764 ; WX 673 ; N uni1E54 ; G 1502 +U 7765 ; WX 640 ; N uni1E55 ; G 1503 +U 7766 ; WX 673 ; N uni1E56 ; G 1504 +U 7767 ; WX 640 ; N uni1E57 ; G 1505 +U 7768 ; WX 753 ; N uni1E58 ; G 1506 +U 7769 ; WX 478 ; N uni1E59 ; G 1507 +U 7770 ; WX 753 ; N uni1E5A ; G 1508 +U 7771 ; WX 478 ; N uni1E5B ; G 1509 +U 7772 ; WX 753 ; N uni1E5C ; G 1510 +U 7773 ; WX 478 ; N uni1E5D ; G 1511 +U 7774 ; WX 753 ; N uni1E5E ; G 1512 +U 7775 ; WX 478 ; N uni1E5F ; G 1513 +U 7776 ; WX 685 ; N uni1E60 ; G 1514 +U 7777 ; WX 513 ; N uni1E61 ; G 1515 +U 7778 ; WX 685 ; N uni1E62 ; G 1516 +U 7779 ; WX 513 ; N uni1E63 ; G 1517 +U 7780 ; WX 685 ; N uni1E64 ; G 1518 +U 7781 ; WX 513 ; N uni1E65 ; G 1519 +U 7782 ; WX 685 ; N uni1E66 ; G 1520 +U 7783 ; WX 521 ; N uni1E67 ; G 1521 +U 7784 ; WX 685 ; N uni1E68 ; G 1522 +U 7785 ; WX 513 ; N uni1E69 ; G 1523 +U 7786 ; WX 667 ; N uni1E6A ; G 1524 +U 7787 ; WX 402 ; N uni1E6B ; G 1525 +U 7788 ; WX 667 ; N uni1E6C ; G 1526 +U 7789 ; WX 402 ; N uni1E6D ; G 1527 +U 7790 ; WX 667 ; N uni1E6E ; G 1528 +U 7791 ; WX 402 ; N uni1E6F ; G 1529 +U 7792 ; WX 667 ; N uni1E70 ; G 1530 +U 7793 ; WX 402 ; N uni1E71 ; G 1531 +U 7794 ; WX 843 ; N uni1E72 ; G 1532 +U 7795 ; WX 644 ; N uni1E73 ; G 1533 +U 7796 ; WX 843 ; N uni1E74 ; G 1534 +U 7797 ; WX 644 ; N uni1E75 ; G 1535 +U 7798 ; WX 843 ; N uni1E76 ; G 1536 +U 7799 ; WX 644 ; N uni1E77 ; G 1537 +U 7800 ; WX 843 ; N uni1E78 ; G 1538 +U 7801 ; WX 644 ; N uni1E79 ; G 1539 +U 7802 ; WX 843 ; N uni1E7A ; G 1540 +U 7803 ; WX 644 ; N uni1E7B ; G 1541 +U 7804 ; WX 722 ; N uni1E7C ; G 1542 +U 7805 ; WX 565 ; N uni1E7D ; G 1543 +U 7806 ; WX 722 ; N uni1E7E ; G 1544 +U 7807 ; WX 565 ; N uni1E7F ; G 1545 +U 7808 ; WX 1028 ; N Wgrave ; G 1546 +U 7809 ; WX 856 ; N wgrave ; G 1547 +U 7810 ; WX 1028 ; N Wacute ; G 1548 +U 7811 ; WX 856 ; N wacute ; G 1549 +U 7812 ; WX 1028 ; N Wdieresis ; G 1550 +U 7813 ; WX 856 ; N wdieresis ; G 1551 +U 7814 ; WX 1028 ; N uni1E86 ; G 1552 +U 7815 ; WX 856 ; N uni1E87 ; G 1553 +U 7816 ; WX 1028 ; N uni1E88 ; G 1554 +U 7817 ; WX 856 ; N uni1E89 ; G 1555 +U 7818 ; WX 712 ; N uni1E8A ; G 1556 +U 7819 ; WX 564 ; N uni1E8B ; G 1557 +U 7820 ; WX 712 ; N uni1E8C ; G 1558 +U 7821 ; WX 564 ; N uni1E8D ; G 1559 +U 7822 ; WX 660 ; N uni1E8E ; G 1560 +U 7823 ; WX 565 ; N uni1E8F ; G 1561 +U 7824 ; WX 695 ; N uni1E90 ; G 1562 +U 7825 ; WX 527 ; N uni1E91 ; G 1563 +U 7826 ; WX 695 ; N uni1E92 ; G 1564 +U 7827 ; WX 527 ; N uni1E93 ; G 1565 +U 7828 ; WX 695 ; N uni1E94 ; G 1566 +U 7829 ; WX 527 ; N uni1E95 ; G 1567 +U 7830 ; WX 644 ; N uni1E96 ; G 1568 +U 7831 ; WX 402 ; N uni1E97 ; G 1569 +U 7832 ; WX 856 ; N uni1E98 ; G 1570 +U 7833 ; WX 565 ; N uni1E99 ; G 1571 +U 7834 ; WX 903 ; N uni1E9A ; G 1572 +U 7835 ; WX 370 ; N uni1E9B ; G 1573 +U 7836 ; WX 370 ; N uni1E9C ; G 1574 +U 7837 ; WX 370 ; N uni1E9D ; G 1575 +U 7838 ; WX 829 ; N uni1E9E ; G 1576 +U 7839 ; WX 602 ; N uni1E9F ; G 1577 +U 7840 ; WX 722 ; N uni1EA0 ; G 1578 +U 7841 ; WX 596 ; N uni1EA1 ; G 1579 +U 7842 ; WX 722 ; N uni1EA2 ; G 1580 +U 7843 ; WX 596 ; N uni1EA3 ; G 1581 +U 7844 ; WX 722 ; N uni1EA4 ; G 1582 +U 7845 ; WX 613 ; N uni1EA5 ; G 1583 +U 7846 ; WX 722 ; N uni1EA6 ; G 1584 +U 7847 ; WX 613 ; N uni1EA7 ; G 1585 +U 7848 ; WX 722 ; N uni1EA8 ; G 1586 +U 7849 ; WX 613 ; N uni1EA9 ; G 1587 +U 7850 ; WX 722 ; N uni1EAA ; G 1588 +U 7851 ; WX 613 ; N uni1EAB ; G 1589 +U 7852 ; WX 722 ; N uni1EAC ; G 1590 +U 7853 ; WX 596 ; N uni1EAD ; G 1591 +U 7854 ; WX 722 ; N uni1EAE ; G 1592 +U 7855 ; WX 596 ; N uni1EAF ; G 1593 +U 7856 ; WX 722 ; N uni1EB0 ; G 1594 +U 7857 ; WX 596 ; N uni1EB1 ; G 1595 +U 7858 ; WX 722 ; N uni1EB2 ; G 1596 +U 7859 ; WX 596 ; N uni1EB3 ; G 1597 +U 7860 ; WX 722 ; N uni1EB4 ; G 1598 +U 7861 ; WX 596 ; N uni1EB5 ; G 1599 +U 7862 ; WX 722 ; N uni1EB6 ; G 1600 +U 7863 ; WX 596 ; N uni1EB7 ; G 1601 +U 7864 ; WX 730 ; N uni1EB8 ; G 1602 +U 7865 ; WX 592 ; N uni1EB9 ; G 1603 +U 7866 ; WX 730 ; N uni1EBA ; G 1604 +U 7867 ; WX 592 ; N uni1EBB ; G 1605 +U 7868 ; WX 730 ; N uni1EBC ; G 1606 +U 7869 ; WX 592 ; N uni1EBD ; G 1607 +U 7870 ; WX 730 ; N uni1EBE ; G 1608 +U 7871 ; WX 615 ; N uni1EBF ; G 1609 +U 7872 ; WX 730 ; N uni1EC0 ; G 1610 +U 7873 ; WX 615 ; N uni1EC1 ; G 1611 +U 7874 ; WX 730 ; N uni1EC2 ; G 1612 +U 7875 ; WX 615 ; N uni1EC3 ; G 1613 +U 7876 ; WX 730 ; N uni1EC4 ; G 1614 +U 7877 ; WX 615 ; N uni1EC5 ; G 1615 +U 7878 ; WX 730 ; N uni1EC6 ; G 1616 +U 7879 ; WX 592 ; N uni1EC7 ; G 1617 +U 7880 ; WX 395 ; N uni1EC8 ; G 1618 +U 7881 ; WX 320 ; N uni1EC9 ; G 1619 +U 7882 ; WX 395 ; N uni1ECA ; G 1620 +U 7883 ; WX 320 ; N uni1ECB ; G 1621 +U 7884 ; WX 820 ; N uni1ECC ; G 1622 +U 7885 ; WX 602 ; N uni1ECD ; G 1623 +U 7886 ; WX 820 ; N uni1ECE ; G 1624 +U 7887 ; WX 602 ; N uni1ECF ; G 1625 +U 7888 ; WX 820 ; N uni1ED0 ; G 1626 +U 7889 ; WX 612 ; N uni1ED1 ; G 1627 +U 7890 ; WX 820 ; N uni1ED2 ; G 1628 +U 7891 ; WX 612 ; N uni1ED3 ; G 1629 +U 7892 ; WX 820 ; N uni1ED4 ; G 1630 +U 7893 ; WX 612 ; N uni1ED5 ; G 1631 +U 7894 ; WX 820 ; N uni1ED6 ; G 1632 +U 7895 ; WX 612 ; N uni1ED7 ; G 1633 +U 7896 ; WX 820 ; N uni1ED8 ; G 1634 +U 7897 ; WX 602 ; N uni1ED9 ; G 1635 +U 7898 ; WX 820 ; N uni1EDA ; G 1636 +U 7899 ; WX 602 ; N uni1EDB ; G 1637 +U 7900 ; WX 820 ; N uni1EDC ; G 1638 +U 7901 ; WX 602 ; N uni1EDD ; G 1639 +U 7902 ; WX 820 ; N uni1EDE ; G 1640 +U 7903 ; WX 602 ; N uni1EDF ; G 1641 +U 7904 ; WX 820 ; N uni1EE0 ; G 1642 +U 7905 ; WX 602 ; N uni1EE1 ; G 1643 +U 7906 ; WX 820 ; N uni1EE2 ; G 1644 +U 7907 ; WX 602 ; N uni1EE3 ; G 1645 +U 7908 ; WX 843 ; N uni1EE4 ; G 1646 +U 7909 ; WX 644 ; N uni1EE5 ; G 1647 +U 7910 ; WX 843 ; N uni1EE6 ; G 1648 +U 7911 ; WX 644 ; N uni1EE7 ; G 1649 +U 7912 ; WX 843 ; N uni1EE8 ; G 1650 +U 7913 ; WX 644 ; N uni1EE9 ; G 1651 +U 7914 ; WX 843 ; N uni1EEA ; G 1652 +U 7915 ; WX 644 ; N uni1EEB ; G 1653 +U 7916 ; WX 843 ; N uni1EEC ; G 1654 +U 7917 ; WX 644 ; N uni1EED ; G 1655 +U 7918 ; WX 843 ; N uni1EEE ; G 1656 +U 7919 ; WX 644 ; N uni1EEF ; G 1657 +U 7920 ; WX 843 ; N uni1EF0 ; G 1658 +U 7921 ; WX 644 ; N uni1EF1 ; G 1659 +U 7922 ; WX 660 ; N Ygrave ; G 1660 +U 7923 ; WX 565 ; N ygrave ; G 1661 +U 7924 ; WX 660 ; N uni1EF4 ; G 1662 +U 7925 ; WX 565 ; N uni1EF5 ; G 1663 +U 7926 ; WX 660 ; N uni1EF6 ; G 1664 +U 7927 ; WX 565 ; N uni1EF7 ; G 1665 +U 7928 ; WX 660 ; N uni1EF8 ; G 1666 +U 7929 ; WX 565 ; N uni1EF9 ; G 1667 +U 7930 ; WX 949 ; N uni1EFA ; G 1668 +U 7931 ; WX 581 ; N uni1EFB ; G 1669 +U 7936 ; WX 675 ; N uni1F00 ; G 1670 +U 7937 ; WX 675 ; N uni1F01 ; G 1671 +U 7938 ; WX 675 ; N uni1F02 ; G 1672 +U 7939 ; WX 675 ; N uni1F03 ; G 1673 +U 7940 ; WX 675 ; N uni1F04 ; G 1674 +U 7941 ; WX 675 ; N uni1F05 ; G 1675 +U 7942 ; WX 675 ; N uni1F06 ; G 1676 +U 7943 ; WX 675 ; N uni1F07 ; G 1677 +U 7944 ; WX 722 ; N uni1F08 ; G 1678 +U 7945 ; WX 722 ; N uni1F09 ; G 1679 +U 7946 ; WX 869 ; N uni1F0A ; G 1680 +U 7947 ; WX 869 ; N uni1F0B ; G 1681 +U 7948 ; WX 734 ; N uni1F0C ; G 1682 +U 7949 ; WX 763 ; N uni1F0D ; G 1683 +U 7950 ; WX 722 ; N uni1F0E ; G 1684 +U 7951 ; WX 722 ; N uni1F0F ; G 1685 +U 7952 ; WX 537 ; N uni1F10 ; G 1686 +U 7953 ; WX 537 ; N uni1F11 ; G 1687 +U 7954 ; WX 537 ; N uni1F12 ; G 1688 +U 7955 ; WX 537 ; N uni1F13 ; G 1689 +U 7956 ; WX 537 ; N uni1F14 ; G 1690 +U 7957 ; WX 537 ; N uni1F15 ; G 1691 +U 7960 ; WX 853 ; N uni1F18 ; G 1692 +U 7961 ; WX 841 ; N uni1F19 ; G 1693 +U 7962 ; WX 1067 ; N uni1F1A ; G 1694 +U 7963 ; WX 1077 ; N uni1F1B ; G 1695 +U 7964 ; WX 1008 ; N uni1F1C ; G 1696 +U 7965 ; WX 1035 ; N uni1F1D ; G 1697 +U 7968 ; WX 599 ; N uni1F20 ; G 1698 +U 7969 ; WX 599 ; N uni1F21 ; G 1699 +U 7970 ; WX 599 ; N uni1F22 ; G 1700 +U 7971 ; WX 599 ; N uni1F23 ; G 1701 +U 7972 ; WX 599 ; N uni1F24 ; G 1702 +U 7973 ; WX 599 ; N uni1F25 ; G 1703 +U 7974 ; WX 599 ; N uni1F26 ; G 1704 +U 7975 ; WX 599 ; N uni1F27 ; G 1705 +U 7976 ; WX 998 ; N uni1F28 ; G 1706 +U 7977 ; WX 992 ; N uni1F29 ; G 1707 +U 7978 ; WX 1212 ; N uni1F2A ; G 1708 +U 7979 ; WX 1224 ; N uni1F2B ; G 1709 +U 7980 ; WX 1159 ; N uni1F2C ; G 1710 +U 7981 ; WX 1183 ; N uni1F2D ; G 1711 +U 7982 ; WX 1098 ; N uni1F2E ; G 1712 +U 7983 ; WX 1095 ; N uni1F2F ; G 1713 +U 7984 ; WX 392 ; N uni1F30 ; G 1714 +U 7985 ; WX 392 ; N uni1F31 ; G 1715 +U 7986 ; WX 392 ; N uni1F32 ; G 1716 +U 7987 ; WX 392 ; N uni1F33 ; G 1717 +U 7988 ; WX 392 ; N uni1F34 ; G 1718 +U 7989 ; WX 392 ; N uni1F35 ; G 1719 +U 7990 ; WX 392 ; N uni1F36 ; G 1720 +U 7991 ; WX 392 ; N uni1F37 ; G 1721 +U 7992 ; WX 521 ; N uni1F38 ; G 1722 +U 7993 ; WX 512 ; N uni1F39 ; G 1723 +U 7994 ; WX 735 ; N uni1F3A ; G 1724 +U 7995 ; WX 738 ; N uni1F3B ; G 1725 +U 7996 ; WX 679 ; N uni1F3C ; G 1726 +U 7997 ; WX 706 ; N uni1F3D ; G 1727 +U 7998 ; WX 624 ; N uni1F3E ; G 1728 +U 7999 ; WX 615 ; N uni1F3F ; G 1729 +U 8000 ; WX 602 ; N uni1F40 ; G 1730 +U 8001 ; WX 602 ; N uni1F41 ; G 1731 +U 8002 ; WX 602 ; N uni1F42 ; G 1732 +U 8003 ; WX 602 ; N uni1F43 ; G 1733 +U 8004 ; WX 602 ; N uni1F44 ; G 1734 +U 8005 ; WX 602 ; N uni1F45 ; G 1735 +U 8008 ; WX 820 ; N uni1F48 ; G 1736 +U 8009 ; WX 859 ; N uni1F49 ; G 1737 +U 8010 ; WX 1120 ; N uni1F4A ; G 1738 +U 8011 ; WX 1127 ; N uni1F4B ; G 1739 +U 8012 ; WX 937 ; N uni1F4C ; G 1740 +U 8013 ; WX 964 ; N uni1F4D ; G 1741 +U 8016 ; WX 608 ; N uni1F50 ; G 1742 +U 8017 ; WX 608 ; N uni1F51 ; G 1743 +U 8018 ; WX 608 ; N uni1F52 ; G 1744 +U 8019 ; WX 608 ; N uni1F53 ; G 1745 +U 8020 ; WX 608 ; N uni1F54 ; G 1746 +U 8021 ; WX 608 ; N uni1F55 ; G 1747 +U 8022 ; WX 608 ; N uni1F56 ; G 1748 +U 8023 ; WX 608 ; N uni1F57 ; G 1749 +U 8025 ; WX 851 ; N uni1F59 ; G 1750 +U 8027 ; WX 1079 ; N uni1F5B ; G 1751 +U 8029 ; WX 1044 ; N uni1F5D ; G 1752 +U 8031 ; WX 953 ; N uni1F5F ; G 1753 +U 8032 ; WX 815 ; N uni1F60 ; G 1754 +U 8033 ; WX 815 ; N uni1F61 ; G 1755 +U 8034 ; WX 815 ; N uni1F62 ; G 1756 +U 8035 ; WX 815 ; N uni1F63 ; G 1757 +U 8036 ; WX 815 ; N uni1F64 ; G 1758 +U 8037 ; WX 815 ; N uni1F65 ; G 1759 +U 8038 ; WX 815 ; N uni1F66 ; G 1760 +U 8039 ; WX 815 ; N uni1F67 ; G 1761 +U 8040 ; WX 829 ; N uni1F68 ; G 1762 +U 8041 ; WX 870 ; N uni1F69 ; G 1763 +U 8042 ; WX 1131 ; N uni1F6A ; G 1764 +U 8043 ; WX 1137 ; N uni1F6B ; G 1765 +U 8044 ; WX 946 ; N uni1F6C ; G 1766 +U 8045 ; WX 976 ; N uni1F6D ; G 1767 +U 8046 ; WX 938 ; N uni1F6E ; G 1768 +U 8047 ; WX 970 ; N uni1F6F ; G 1769 +U 8048 ; WX 675 ; N uni1F70 ; G 1770 +U 8049 ; WX 675 ; N uni1F71 ; G 1771 +U 8050 ; WX 537 ; N uni1F72 ; G 1772 +U 8051 ; WX 537 ; N uni1F73 ; G 1773 +U 8052 ; WX 599 ; N uni1F74 ; G 1774 +U 8053 ; WX 599 ; N uni1F75 ; G 1775 +U 8054 ; WX 392 ; N uni1F76 ; G 1776 +U 8055 ; WX 392 ; N uni1F77 ; G 1777 +U 8056 ; WX 602 ; N uni1F78 ; G 1778 +U 8057 ; WX 602 ; N uni1F79 ; G 1779 +U 8058 ; WX 608 ; N uni1F7A ; G 1780 +U 8059 ; WX 608 ; N uni1F7B ; G 1781 +U 8060 ; WX 815 ; N uni1F7C ; G 1782 +U 8061 ; WX 815 ; N uni1F7D ; G 1783 +U 8064 ; WX 675 ; N uni1F80 ; G 1784 +U 8065 ; WX 675 ; N uni1F81 ; G 1785 +U 8066 ; WX 675 ; N uni1F82 ; G 1786 +U 8067 ; WX 675 ; N uni1F83 ; G 1787 +U 8068 ; WX 675 ; N uni1F84 ; G 1788 +U 8069 ; WX 675 ; N uni1F85 ; G 1789 +U 8070 ; WX 675 ; N uni1F86 ; G 1790 +U 8071 ; WX 675 ; N uni1F87 ; G 1791 +U 8072 ; WX 722 ; N uni1F88 ; G 1792 +U 8073 ; WX 722 ; N uni1F89 ; G 1793 +U 8074 ; WX 869 ; N uni1F8A ; G 1794 +U 8075 ; WX 869 ; N uni1F8B ; G 1795 +U 8076 ; WX 734 ; N uni1F8C ; G 1796 +U 8077 ; WX 763 ; N uni1F8D ; G 1797 +U 8078 ; WX 722 ; N uni1F8E ; G 1798 +U 8079 ; WX 722 ; N uni1F8F ; G 1799 +U 8080 ; WX 599 ; N uni1F90 ; G 1800 +U 8081 ; WX 599 ; N uni1F91 ; G 1801 +U 8082 ; WX 599 ; N uni1F92 ; G 1802 +U 8083 ; WX 599 ; N uni1F93 ; G 1803 +U 8084 ; WX 599 ; N uni1F94 ; G 1804 +U 8085 ; WX 599 ; N uni1F95 ; G 1805 +U 8086 ; WX 599 ; N uni1F96 ; G 1806 +U 8087 ; WX 599 ; N uni1F97 ; G 1807 +U 8088 ; WX 998 ; N uni1F98 ; G 1808 +U 8089 ; WX 992 ; N uni1F99 ; G 1809 +U 8090 ; WX 1212 ; N uni1F9A ; G 1810 +U 8091 ; WX 1224 ; N uni1F9B ; G 1811 +U 8092 ; WX 1159 ; N uni1F9C ; G 1812 +U 8093 ; WX 1183 ; N uni1F9D ; G 1813 +U 8094 ; WX 1098 ; N uni1F9E ; G 1814 +U 8095 ; WX 1095 ; N uni1F9F ; G 1815 +U 8096 ; WX 815 ; N uni1FA0 ; G 1816 +U 8097 ; WX 815 ; N uni1FA1 ; G 1817 +U 8098 ; WX 815 ; N uni1FA2 ; G 1818 +U 8099 ; WX 815 ; N uni1FA3 ; G 1819 +U 8100 ; WX 815 ; N uni1FA4 ; G 1820 +U 8101 ; WX 815 ; N uni1FA5 ; G 1821 +U 8102 ; WX 815 ; N uni1FA6 ; G 1822 +U 8103 ; WX 815 ; N uni1FA7 ; G 1823 +U 8104 ; WX 829 ; N uni1FA8 ; G 1824 +U 8105 ; WX 870 ; N uni1FA9 ; G 1825 +U 8106 ; WX 1131 ; N uni1FAA ; G 1826 +U 8107 ; WX 1137 ; N uni1FAB ; G 1827 +U 8108 ; WX 946 ; N uni1FAC ; G 1828 +U 8109 ; WX 976 ; N uni1FAD ; G 1829 +U 8110 ; WX 938 ; N uni1FAE ; G 1830 +U 8111 ; WX 970 ; N uni1FAF ; G 1831 +U 8112 ; WX 675 ; N uni1FB0 ; G 1832 +U 8113 ; WX 675 ; N uni1FB1 ; G 1833 +U 8114 ; WX 675 ; N uni1FB2 ; G 1834 +U 8115 ; WX 675 ; N uni1FB3 ; G 1835 +U 8116 ; WX 675 ; N uni1FB4 ; G 1836 +U 8118 ; WX 675 ; N uni1FB6 ; G 1837 +U 8119 ; WX 675 ; N uni1FB7 ; G 1838 +U 8120 ; WX 722 ; N uni1FB8 ; G 1839 +U 8121 ; WX 722 ; N uni1FB9 ; G 1840 +U 8122 ; WX 722 ; N uni1FBA ; G 1841 +U 8123 ; WX 722 ; N uni1FBB ; G 1842 +U 8124 ; WX 722 ; N uni1FBC ; G 1843 +U 8125 ; WX 500 ; N uni1FBD ; G 1844 +U 8126 ; WX 500 ; N uni1FBE ; G 1845 +U 8127 ; WX 500 ; N uni1FBF ; G 1846 +U 8128 ; WX 500 ; N uni1FC0 ; G 1847 +U 8129 ; WX 500 ; N uni1FC1 ; G 1848 +U 8130 ; WX 599 ; N uni1FC2 ; G 1849 +U 8131 ; WX 599 ; N uni1FC3 ; G 1850 +U 8132 ; WX 599 ; N uni1FC4 ; G 1851 +U 8134 ; WX 599 ; N uni1FC6 ; G 1852 +U 8135 ; WX 599 ; N uni1FC7 ; G 1853 +U 8136 ; WX 912 ; N uni1FC8 ; G 1854 +U 8137 ; WX 900 ; N uni1FC9 ; G 1855 +U 8138 ; WX 1063 ; N uni1FCA ; G 1856 +U 8139 ; WX 1039 ; N uni1FCB ; G 1857 +U 8140 ; WX 872 ; N uni1FCC ; G 1858 +U 8141 ; WX 500 ; N uni1FCD ; G 1859 +U 8142 ; WX 500 ; N uni1FCE ; G 1860 +U 8143 ; WX 500 ; N uni1FCF ; G 1861 +U 8144 ; WX 392 ; N uni1FD0 ; G 1862 +U 8145 ; WX 392 ; N uni1FD1 ; G 1863 +U 8146 ; WX 392 ; N uni1FD2 ; G 1864 +U 8147 ; WX 392 ; N uni1FD3 ; G 1865 +U 8150 ; WX 392 ; N uni1FD6 ; G 1866 +U 8151 ; WX 392 ; N uni1FD7 ; G 1867 +U 8152 ; WX 395 ; N uni1FD8 ; G 1868 +U 8153 ; WX 395 ; N uni1FD9 ; G 1869 +U 8154 ; WX 588 ; N uni1FDA ; G 1870 +U 8155 ; WX 562 ; N uni1FDB ; G 1871 +U 8157 ; WX 500 ; N uni1FDD ; G 1872 +U 8158 ; WX 500 ; N uni1FDE ; G 1873 +U 8159 ; WX 500 ; N uni1FDF ; G 1874 +U 8160 ; WX 608 ; N uni1FE0 ; G 1875 +U 8161 ; WX 608 ; N uni1FE1 ; G 1876 +U 8162 ; WX 608 ; N uni1FE2 ; G 1877 +U 8163 ; WX 608 ; N uni1FE3 ; G 1878 +U 8164 ; WX 588 ; N uni1FE4 ; G 1879 +U 8165 ; WX 588 ; N uni1FE5 ; G 1880 +U 8166 ; WX 608 ; N uni1FE6 ; G 1881 +U 8167 ; WX 608 ; N uni1FE7 ; G 1882 +U 8168 ; WX 660 ; N uni1FE8 ; G 1883 +U 8169 ; WX 660 ; N uni1FE9 ; G 1884 +U 8170 ; WX 921 ; N uni1FEA ; G 1885 +U 8171 ; WX 897 ; N uni1FEB ; G 1886 +U 8172 ; WX 790 ; N uni1FEC ; G 1887 +U 8173 ; WX 500 ; N uni1FED ; G 1888 +U 8174 ; WX 500 ; N uni1FEE ; G 1889 +U 8175 ; WX 500 ; N uni1FEF ; G 1890 +U 8178 ; WX 815 ; N uni1FF2 ; G 1891 +U 8179 ; WX 815 ; N uni1FF3 ; G 1892 +U 8180 ; WX 815 ; N uni1FF4 ; G 1893 +U 8182 ; WX 815 ; N uni1FF6 ; G 1894 +U 8183 ; WX 815 ; N uni1FF7 ; G 1895 +U 8184 ; WX 961 ; N uni1FF8 ; G 1896 +U 8185 ; WX 835 ; N uni1FF9 ; G 1897 +U 8186 ; WX 984 ; N uni1FFA ; G 1898 +U 8187 ; WX 853 ; N uni1FFB ; G 1899 +U 8188 ; WX 829 ; N uni1FFC ; G 1900 +U 8189 ; WX 500 ; N uni1FFD ; G 1901 +U 8190 ; WX 500 ; N uni1FFE ; G 1902 +U 8192 ; WX 500 ; N uni2000 ; G 1903 +U 8193 ; WX 1000 ; N uni2001 ; G 1904 +U 8194 ; WX 500 ; N uni2002 ; G 1905 +U 8195 ; WX 1000 ; N uni2003 ; G 1906 +U 8196 ; WX 330 ; N uni2004 ; G 1907 +U 8197 ; WX 250 ; N uni2005 ; G 1908 +U 8198 ; WX 167 ; N uni2006 ; G 1909 +U 8199 ; WX 636 ; N uni2007 ; G 1910 +U 8200 ; WX 318 ; N uni2008 ; G 1911 +U 8201 ; WX 200 ; N uni2009 ; G 1912 +U 8202 ; WX 100 ; N uni200A ; G 1913 +U 8203 ; WX 0 ; N uni200B ; G 1914 +U 8204 ; WX 0 ; N uni200C ; G 1915 +U 8205 ; WX 0 ; N uni200D ; G 1916 +U 8206 ; WX 0 ; N uni200E ; G 1917 +U 8207 ; WX 0 ; N uni200F ; G 1918 +U 8208 ; WX 338 ; N uni2010 ; G 1919 +U 8209 ; WX 338 ; N uni2011 ; G 1920 +U 8210 ; WX 636 ; N figuredash ; G 1921 +U 8211 ; WX 500 ; N endash ; G 1922 +U 8212 ; WX 1000 ; N emdash ; G 1923 +U 8213 ; WX 1000 ; N uni2015 ; G 1924 +U 8214 ; WX 500 ; N uni2016 ; G 1925 +U 8215 ; WX 500 ; N underscoredbl ; G 1926 +U 8216 ; WX 318 ; N quoteleft ; G 1927 +U 8217 ; WX 318 ; N quoteright ; G 1928 +U 8218 ; WX 318 ; N quotesinglbase ; G 1929 +U 8219 ; WX 318 ; N quotereversed ; G 1930 +U 8220 ; WX 511 ; N quotedblleft ; G 1931 +U 8221 ; WX 511 ; N quotedblright ; G 1932 +U 8222 ; WX 518 ; N quotedblbase ; G 1933 +U 8223 ; WX 511 ; N uni201F ; G 1934 +U 8224 ; WX 500 ; N dagger ; G 1935 +U 8225 ; WX 500 ; N daggerdbl ; G 1936 +U 8226 ; WX 590 ; N bullet ; G 1937 +U 8227 ; WX 590 ; N uni2023 ; G 1938 +U 8228 ; WX 334 ; N onedotenleader ; G 1939 +U 8229 ; WX 667 ; N twodotenleader ; G 1940 +U 8230 ; WX 1000 ; N ellipsis ; G 1941 +U 8234 ; WX 0 ; N uni202A ; G 1942 +U 8235 ; WX 0 ; N uni202B ; G 1943 +U 8236 ; WX 0 ; N uni202C ; G 1944 +U 8237 ; WX 0 ; N uni202D ; G 1945 +U 8238 ; WX 0 ; N uni202E ; G 1946 +U 8239 ; WX 200 ; N uni202F ; G 1947 +U 8240 ; WX 1342 ; N perthousand ; G 1948 +U 8241 ; WX 1734 ; N uni2031 ; G 1949 +U 8242 ; WX 227 ; N minute ; G 1950 +U 8243 ; WX 374 ; N second ; G 1951 +U 8244 ; WX 520 ; N uni2034 ; G 1952 +U 8245 ; WX 227 ; N uni2035 ; G 1953 +U 8246 ; WX 374 ; N uni2036 ; G 1954 +U 8247 ; WX 520 ; N uni2037 ; G 1955 +U 8248 ; WX 339 ; N uni2038 ; G 1956 +U 8249 ; WX 400 ; N guilsinglleft ; G 1957 +U 8250 ; WX 400 ; N guilsinglright ; G 1958 +U 8252 ; WX 527 ; N exclamdbl ; G 1959 +U 8253 ; WX 536 ; N uni203D ; G 1960 +U 8254 ; WX 500 ; N uni203E ; G 1961 +U 8258 ; WX 1000 ; N uni2042 ; G 1962 +U 8260 ; WX 167 ; N fraction ; G 1963 +U 8261 ; WX 390 ; N uni2045 ; G 1964 +U 8262 ; WX 390 ; N uni2046 ; G 1965 +U 8263 ; WX 976 ; N uni2047 ; G 1966 +U 8264 ; WX 753 ; N uni2048 ; G 1967 +U 8265 ; WX 753 ; N uni2049 ; G 1968 +U 8267 ; WX 636 ; N uni204B ; G 1969 +U 8268 ; WX 500 ; N uni204C ; G 1970 +U 8269 ; WX 500 ; N uni204D ; G 1971 +U 8270 ; WX 500 ; N uni204E ; G 1972 +U 8271 ; WX 337 ; N uni204F ; G 1973 +U 8273 ; WX 500 ; N uni2051 ; G 1974 +U 8274 ; WX 450 ; N uni2052 ; G 1975 +U 8275 ; WX 1000 ; N uni2053 ; G 1976 +U 8279 ; WX 663 ; N uni2057 ; G 1977 +U 8287 ; WX 222 ; N uni205F ; G 1978 +U 8288 ; WX 0 ; N uni2060 ; G 1979 +U 8289 ; WX 0 ; N uni2061 ; G 1980 +U 8290 ; WX 0 ; N uni2062 ; G 1981 +U 8291 ; WX 0 ; N uni2063 ; G 1982 +U 8292 ; WX 0 ; N uni2064 ; G 1983 +U 8298 ; WX 0 ; N uni206A ; G 1984 +U 8299 ; WX 0 ; N uni206B ; G 1985 +U 8300 ; WX 0 ; N uni206C ; G 1986 +U 8301 ; WX 0 ; N uni206D ; G 1987 +U 8302 ; WX 0 ; N uni206E ; G 1988 +U 8303 ; WX 0 ; N uni206F ; G 1989 +U 8304 ; WX 401 ; N uni2070 ; G 1990 +U 8305 ; WX 201 ; N uni2071 ; G 1991 +U 8308 ; WX 401 ; N uni2074 ; G 1992 +U 8309 ; WX 401 ; N uni2075 ; G 1993 +U 8310 ; WX 401 ; N uni2076 ; G 1994 +U 8311 ; WX 401 ; N uni2077 ; G 1995 +U 8312 ; WX 401 ; N uni2078 ; G 1996 +U 8313 ; WX 401 ; N uni2079 ; G 1997 +U 8314 ; WX 528 ; N uni207A ; G 1998 +U 8315 ; WX 528 ; N uni207B ; G 1999 +U 8316 ; WX 528 ; N uni207C ; G 2000 +U 8317 ; WX 246 ; N uni207D ; G 2001 +U 8318 ; WX 246 ; N uni207E ; G 2002 +U 8319 ; WX 405 ; N uni207F ; G 2003 +U 8320 ; WX 401 ; N uni2080 ; G 2004 +U 8321 ; WX 401 ; N uni2081 ; G 2005 +U 8322 ; WX 401 ; N uni2082 ; G 2006 +U 8323 ; WX 401 ; N uni2083 ; G 2007 +U 8324 ; WX 401 ; N uni2084 ; G 2008 +U 8325 ; WX 401 ; N uni2085 ; G 2009 +U 8326 ; WX 401 ; N uni2086 ; G 2010 +U 8327 ; WX 401 ; N uni2087 ; G 2011 +U 8328 ; WX 401 ; N uni2088 ; G 2012 +U 8329 ; WX 401 ; N uni2089 ; G 2013 +U 8330 ; WX 528 ; N uni208A ; G 2014 +U 8331 ; WX 528 ; N uni208B ; G 2015 +U 8332 ; WX 528 ; N uni208C ; G 2016 +U 8333 ; WX 246 ; N uni208D ; G 2017 +U 8334 ; WX 246 ; N uni208E ; G 2018 +U 8336 ; WX 375 ; N uni2090 ; G 2019 +U 8337 ; WX 387 ; N uni2091 ; G 2020 +U 8338 ; WX 385 ; N uni2092 ; G 2021 +U 8339 ; WX 355 ; N uni2093 ; G 2022 +U 8340 ; WX 387 ; N uni2094 ; G 2023 +U 8341 ; WX 433 ; N uni2095 ; G 2024 +U 8342 ; WX 365 ; N uni2096 ; G 2025 +U 8343 ; WX 243 ; N uni2097 ; G 2026 +U 8344 ; WX 613 ; N uni2098 ; G 2027 +U 8345 ; WX 405 ; N uni2099 ; G 2028 +U 8346 ; WX 400 ; N uni209A ; G 2029 +U 8347 ; WX 337 ; N uni209B ; G 2030 +U 8348 ; WX 247 ; N uni209C ; G 2031 +U 8358 ; WX 636 ; N uni20A6 ; G 2032 +U 8364 ; WX 636 ; N Euro ; G 2033 +U 8367 ; WX 1057 ; N uni20AF ; G 2034 +U 8369 ; WX 706 ; N uni20B1 ; G 2035 +U 8372 ; WX 780 ; N uni20B4 ; G 2036 +U 8373 ; WX 636 ; N uni20B5 ; G 2037 +U 8376 ; WX 636 ; N uni20B8 ; G 2038 +U 8377 ; WX 636 ; N uni20B9 ; G 2039 +U 8378 ; WX 636 ; N uni20BA ; G 2040 +U 8381 ; WX 636 ; N uni20BD ; G 2041 +U 8451 ; WX 1119 ; N uni2103 ; G 2042 +U 8457 ; WX 1047 ; N uni2109 ; G 2043 +U 8462 ; WX 644 ; N uni210E ; G 2044 +U 8463 ; WX 644 ; N uni210F ; G 2045 +U 8470 ; WX 946 ; N uni2116 ; G 2046 +U 8482 ; WX 1000 ; N trademark ; G 2047 +U 8486 ; WX 829 ; N uni2126 ; G 2048 +U 8487 ; WX 829 ; N uni2127 ; G 2049 +U 8490 ; WX 747 ; N uni212A ; G 2050 +U 8491 ; WX 722 ; N uni212B ; G 2051 +U 8498 ; WX 694 ; N uni2132 ; G 2052 +U 8513 ; WX 775 ; N uni2141 ; G 2053 +U 8514 ; WX 557 ; N uni2142 ; G 2054 +U 8515 ; WX 557 ; N uni2143 ; G 2055 +U 8516 ; WX 611 ; N uni2144 ; G 2056 +U 8523 ; WX 890 ; N uni214B ; G 2057 +U 8526 ; WX 514 ; N uni214E ; G 2058 +U 8528 ; WX 969 ; N uni2150 ; G 2059 +U 8529 ; WX 969 ; N uni2151 ; G 2060 +U 8530 ; WX 1370 ; N uni2152 ; G 2061 +U 8531 ; WX 969 ; N onethird ; G 2062 +U 8532 ; WX 969 ; N twothirds ; G 2063 +U 8533 ; WX 969 ; N uni2155 ; G 2064 +U 8534 ; WX 969 ; N uni2156 ; G 2065 +U 8535 ; WX 969 ; N uni2157 ; G 2066 +U 8536 ; WX 969 ; N uni2158 ; G 2067 +U 8537 ; WX 969 ; N uni2159 ; G 2068 +U 8538 ; WX 969 ; N uni215A ; G 2069 +U 8539 ; WX 969 ; N oneeighth ; G 2070 +U 8540 ; WX 969 ; N threeeighths ; G 2071 +U 8541 ; WX 969 ; N fiveeighths ; G 2072 +U 8542 ; WX 969 ; N seveneighths ; G 2073 +U 8543 ; WX 568 ; N uni215F ; G 2074 +U 8544 ; WX 395 ; N uni2160 ; G 2075 +U 8545 ; WX 680 ; N uni2161 ; G 2076 +U 8546 ; WX 964 ; N uni2162 ; G 2077 +U 8547 ; WX 999 ; N uni2163 ; G 2078 +U 8548 ; WX 722 ; N uni2164 ; G 2079 +U 8549 ; WX 1006 ; N uni2165 ; G 2080 +U 8550 ; WX 1291 ; N uni2166 ; G 2081 +U 8551 ; WX 1575 ; N uni2167 ; G 2082 +U 8552 ; WX 965 ; N uni2168 ; G 2083 +U 8553 ; WX 712 ; N uni2169 ; G 2084 +U 8554 ; WX 969 ; N uni216A ; G 2085 +U 8555 ; WX 1253 ; N uni216B ; G 2086 +U 8556 ; WX 664 ; N uni216C ; G 2087 +U 8557 ; WX 765 ; N uni216D ; G 2088 +U 8558 ; WX 802 ; N uni216E ; G 2089 +U 8559 ; WX 1024 ; N uni216F ; G 2090 +U 8560 ; WX 320 ; N uni2170 ; G 2091 +U 8561 ; WX 640 ; N uni2171 ; G 2092 +U 8562 ; WX 959 ; N uni2172 ; G 2093 +U 8563 ; WX 885 ; N uni2173 ; G 2094 +U 8564 ; WX 565 ; N uni2174 ; G 2095 +U 8565 ; WX 885 ; N uni2175 ; G 2096 +U 8566 ; WX 1205 ; N uni2176 ; G 2097 +U 8567 ; WX 1524 ; N uni2177 ; G 2098 +U 8568 ; WX 884 ; N uni2178 ; G 2099 +U 8569 ; WX 564 ; N uni2179 ; G 2100 +U 8570 ; WX 884 ; N uni217A ; G 2101 +U 8571 ; WX 1204 ; N uni217B ; G 2102 +U 8572 ; WX 320 ; N uni217C ; G 2103 +U 8573 ; WX 560 ; N uni217D ; G 2104 +U 8574 ; WX 640 ; N uni217E ; G 2105 +U 8575 ; WX 948 ; N uni217F ; G 2106 +U 8576 ; WX 1206 ; N uni2180 ; G 2107 +U 8577 ; WX 802 ; N uni2181 ; G 2108 +U 8578 ; WX 1206 ; N uni2182 ; G 2109 +U 8579 ; WX 765 ; N uni2183 ; G 2110 +U 8580 ; WX 560 ; N uni2184 ; G 2111 +U 8581 ; WX 765 ; N uni2185 ; G 2112 +U 8585 ; WX 969 ; N uni2189 ; G 2113 +U 8592 ; WX 838 ; N arrowleft ; G 2114 +U 8593 ; WX 838 ; N arrowup ; G 2115 +U 8594 ; WX 838 ; N arrowright ; G 2116 +U 8595 ; WX 838 ; N arrowdown ; G 2117 +U 8596 ; WX 838 ; N arrowboth ; G 2118 +U 8597 ; WX 838 ; N arrowupdn ; G 2119 +U 8598 ; WX 838 ; N uni2196 ; G 2120 +U 8599 ; WX 838 ; N uni2197 ; G 2121 +U 8600 ; WX 838 ; N uni2198 ; G 2122 +U 8601 ; WX 838 ; N uni2199 ; G 2123 +U 8602 ; WX 838 ; N uni219A ; G 2124 +U 8603 ; WX 838 ; N uni219B ; G 2125 +U 8604 ; WX 838 ; N uni219C ; G 2126 +U 8605 ; WX 838 ; N uni219D ; G 2127 +U 8606 ; WX 838 ; N uni219E ; G 2128 +U 8607 ; WX 838 ; N uni219F ; G 2129 +U 8608 ; WX 838 ; N uni21A0 ; G 2130 +U 8609 ; WX 838 ; N uni21A1 ; G 2131 +U 8610 ; WX 838 ; N uni21A2 ; G 2132 +U 8611 ; WX 838 ; N uni21A3 ; G 2133 +U 8612 ; WX 838 ; N uni21A4 ; G 2134 +U 8613 ; WX 838 ; N uni21A5 ; G 2135 +U 8614 ; WX 838 ; N uni21A6 ; G 2136 +U 8615 ; WX 838 ; N uni21A7 ; G 2137 +U 8616 ; WX 838 ; N arrowupdnbse ; G 2138 +U 8617 ; WX 838 ; N uni21A9 ; G 2139 +U 8618 ; WX 838 ; N uni21AA ; G 2140 +U 8619 ; WX 838 ; N uni21AB ; G 2141 +U 8620 ; WX 838 ; N uni21AC ; G 2142 +U 8621 ; WX 838 ; N uni21AD ; G 2143 +U 8622 ; WX 838 ; N uni21AE ; G 2144 +U 8623 ; WX 838 ; N uni21AF ; G 2145 +U 8624 ; WX 838 ; N uni21B0 ; G 2146 +U 8625 ; WX 838 ; N uni21B1 ; G 2147 +U 8626 ; WX 838 ; N uni21B2 ; G 2148 +U 8627 ; WX 838 ; N uni21B3 ; G 2149 +U 8628 ; WX 838 ; N uni21B4 ; G 2150 +U 8629 ; WX 838 ; N carriagereturn ; G 2151 +U 8630 ; WX 838 ; N uni21B6 ; G 2152 +U 8631 ; WX 838 ; N uni21B7 ; G 2153 +U 8632 ; WX 838 ; N uni21B8 ; G 2154 +U 8633 ; WX 838 ; N uni21B9 ; G 2155 +U 8634 ; WX 838 ; N uni21BA ; G 2156 +U 8635 ; WX 838 ; N uni21BB ; G 2157 +U 8636 ; WX 838 ; N uni21BC ; G 2158 +U 8637 ; WX 838 ; N uni21BD ; G 2159 +U 8638 ; WX 838 ; N uni21BE ; G 2160 +U 8639 ; WX 838 ; N uni21BF ; G 2161 +U 8640 ; WX 838 ; N uni21C0 ; G 2162 +U 8641 ; WX 838 ; N uni21C1 ; G 2163 +U 8642 ; WX 838 ; N uni21C2 ; G 2164 +U 8643 ; WX 838 ; N uni21C3 ; G 2165 +U 8644 ; WX 838 ; N uni21C4 ; G 2166 +U 8645 ; WX 838 ; N uni21C5 ; G 2167 +U 8646 ; WX 838 ; N uni21C6 ; G 2168 +U 8647 ; WX 838 ; N uni21C7 ; G 2169 +U 8648 ; WX 838 ; N uni21C8 ; G 2170 +U 8649 ; WX 838 ; N uni21C9 ; G 2171 +U 8650 ; WX 838 ; N uni21CA ; G 2172 +U 8651 ; WX 838 ; N uni21CB ; G 2173 +U 8652 ; WX 838 ; N uni21CC ; G 2174 +U 8653 ; WX 838 ; N uni21CD ; G 2175 +U 8654 ; WX 838 ; N uni21CE ; G 2176 +U 8655 ; WX 838 ; N uni21CF ; G 2177 +U 8656 ; WX 838 ; N arrowdblleft ; G 2178 +U 8657 ; WX 838 ; N arrowdblup ; G 2179 +U 8658 ; WX 838 ; N arrowdblright ; G 2180 +U 8659 ; WX 838 ; N arrowdbldown ; G 2181 +U 8660 ; WX 838 ; N arrowdblboth ; G 2182 +U 8661 ; WX 838 ; N uni21D5 ; G 2183 +U 8662 ; WX 838 ; N uni21D6 ; G 2184 +U 8663 ; WX 838 ; N uni21D7 ; G 2185 +U 8664 ; WX 838 ; N uni21D8 ; G 2186 +U 8665 ; WX 838 ; N uni21D9 ; G 2187 +U 8666 ; WX 838 ; N uni21DA ; G 2188 +U 8667 ; WX 838 ; N uni21DB ; G 2189 +U 8668 ; WX 838 ; N uni21DC ; G 2190 +U 8669 ; WX 838 ; N uni21DD ; G 2191 +U 8670 ; WX 838 ; N uni21DE ; G 2192 +U 8671 ; WX 838 ; N uni21DF ; G 2193 +U 8672 ; WX 838 ; N uni21E0 ; G 2194 +U 8673 ; WX 838 ; N uni21E1 ; G 2195 +U 8674 ; WX 838 ; N uni21E2 ; G 2196 +U 8675 ; WX 838 ; N uni21E3 ; G 2197 +U 8676 ; WX 838 ; N uni21E4 ; G 2198 +U 8677 ; WX 838 ; N uni21E5 ; G 2199 +U 8678 ; WX 838 ; N uni21E6 ; G 2200 +U 8679 ; WX 838 ; N uni21E7 ; G 2201 +U 8680 ; WX 838 ; N uni21E8 ; G 2202 +U 8681 ; WX 838 ; N uni21E9 ; G 2203 +U 8682 ; WX 838 ; N uni21EA ; G 2204 +U 8683 ; WX 838 ; N uni21EB ; G 2205 +U 8684 ; WX 838 ; N uni21EC ; G 2206 +U 8685 ; WX 838 ; N uni21ED ; G 2207 +U 8686 ; WX 838 ; N uni21EE ; G 2208 +U 8687 ; WX 838 ; N uni21EF ; G 2209 +U 8688 ; WX 838 ; N uni21F0 ; G 2210 +U 8689 ; WX 838 ; N uni21F1 ; G 2211 +U 8690 ; WX 838 ; N uni21F2 ; G 2212 +U 8691 ; WX 838 ; N uni21F3 ; G 2213 +U 8692 ; WX 838 ; N uni21F4 ; G 2214 +U 8693 ; WX 838 ; N uni21F5 ; G 2215 +U 8694 ; WX 838 ; N uni21F6 ; G 2216 +U 8695 ; WX 838 ; N uni21F7 ; G 2217 +U 8696 ; WX 838 ; N uni21F8 ; G 2218 +U 8697 ; WX 838 ; N uni21F9 ; G 2219 +U 8698 ; WX 838 ; N uni21FA ; G 2220 +U 8699 ; WX 838 ; N uni21FB ; G 2221 +U 8700 ; WX 838 ; N uni21FC ; G 2222 +U 8701 ; WX 838 ; N uni21FD ; G 2223 +U 8702 ; WX 838 ; N uni21FE ; G 2224 +U 8703 ; WX 838 ; N uni21FF ; G 2225 +U 8704 ; WX 604 ; N universal ; G 2226 +U 8706 ; WX 517 ; N partialdiff ; G 2227 +U 8707 ; WX 542 ; N existential ; G 2228 +U 8708 ; WX 542 ; N uni2204 ; G 2229 +U 8710 ; WX 698 ; N increment ; G 2230 +U 8711 ; WX 698 ; N gradient ; G 2231 +U 8712 ; WX 740 ; N element ; G 2232 +U 8713 ; WX 740 ; N notelement ; G 2233 +U 8715 ; WX 740 ; N suchthat ; G 2234 +U 8716 ; WX 740 ; N uni220C ; G 2235 +U 8719 ; WX 796 ; N product ; G 2236 +U 8720 ; WX 796 ; N uni2210 ; G 2237 +U 8721 ; WX 714 ; N summation ; G 2238 +U 8722 ; WX 838 ; N minus ; G 2239 +U 8723 ; WX 838 ; N uni2213 ; G 2240 +U 8724 ; WX 838 ; N uni2214 ; G 2241 +U 8725 ; WX 337 ; N uni2215 ; G 2242 +U 8727 ; WX 680 ; N asteriskmath ; G 2243 +U 8728 ; WX 490 ; N uni2218 ; G 2244 +U 8729 ; WX 490 ; N uni2219 ; G 2245 +U 8730 ; WX 637 ; N radical ; G 2246 +U 8731 ; WX 637 ; N uni221B ; G 2247 +U 8732 ; WX 637 ; N uni221C ; G 2248 +U 8733 ; WX 677 ; N proportional ; G 2249 +U 8734 ; WX 833 ; N infinity ; G 2250 +U 8735 ; WX 838 ; N orthogonal ; G 2251 +U 8736 ; WX 838 ; N angle ; G 2252 +U 8739 ; WX 291 ; N uni2223 ; G 2253 +U 8740 ; WX 479 ; N uni2224 ; G 2254 +U 8741 ; WX 462 ; N uni2225 ; G 2255 +U 8742 ; WX 634 ; N uni2226 ; G 2256 +U 8743 ; WX 732 ; N logicaland ; G 2257 +U 8744 ; WX 732 ; N logicalor ; G 2258 +U 8745 ; WX 838 ; N intersection ; G 2259 +U 8746 ; WX 838 ; N union ; G 2260 +U 8747 ; WX 521 ; N integral ; G 2261 +U 8748 ; WX 852 ; N uni222C ; G 2262 +U 8749 ; WX 1182 ; N uni222D ; G 2263 +U 8760 ; WX 838 ; N uni2238 ; G 2264 +U 8761 ; WX 838 ; N uni2239 ; G 2265 +U 8762 ; WX 838 ; N uni223A ; G 2266 +U 8763 ; WX 838 ; N uni223B ; G 2267 +U 8764 ; WX 838 ; N similar ; G 2268 +U 8765 ; WX 838 ; N uni223D ; G 2269 +U 8770 ; WX 838 ; N uni2242 ; G 2270 +U 8771 ; WX 838 ; N uni2243 ; G 2271 +U 8776 ; WX 838 ; N approxequal ; G 2272 +U 8784 ; WX 838 ; N uni2250 ; G 2273 +U 8785 ; WX 838 ; N uni2251 ; G 2274 +U 8786 ; WX 838 ; N uni2252 ; G 2275 +U 8787 ; WX 838 ; N uni2253 ; G 2276 +U 8788 ; WX 1033 ; N uni2254 ; G 2277 +U 8789 ; WX 1033 ; N uni2255 ; G 2278 +U 8800 ; WX 838 ; N notequal ; G 2279 +U 8801 ; WX 838 ; N equivalence ; G 2280 +U 8804 ; WX 838 ; N lessequal ; G 2281 +U 8805 ; WX 838 ; N greaterequal ; G 2282 +U 8834 ; WX 838 ; N propersubset ; G 2283 +U 8835 ; WX 838 ; N propersuperset ; G 2284 +U 8836 ; WX 838 ; N notsubset ; G 2285 +U 8837 ; WX 838 ; N uni2285 ; G 2286 +U 8838 ; WX 838 ; N reflexsubset ; G 2287 +U 8839 ; WX 838 ; N reflexsuperset ; G 2288 +U 8844 ; WX 838 ; N uni228C ; G 2289 +U 8845 ; WX 838 ; N uni228D ; G 2290 +U 8846 ; WX 838 ; N uni228E ; G 2291 +U 8847 ; WX 846 ; N uni228F ; G 2292 +U 8848 ; WX 846 ; N uni2290 ; G 2293 +U 8849 ; WX 846 ; N uni2291 ; G 2294 +U 8850 ; WX 846 ; N uni2292 ; G 2295 +U 8851 ; WX 838 ; N uni2293 ; G 2296 +U 8852 ; WX 838 ; N uni2294 ; G 2297 +U 8853 ; WX 838 ; N circleplus ; G 2298 +U 8854 ; WX 838 ; N uni2296 ; G 2299 +U 8855 ; WX 838 ; N circlemultiply ; G 2300 +U 8856 ; WX 838 ; N uni2298 ; G 2301 +U 8857 ; WX 838 ; N uni2299 ; G 2302 +U 8858 ; WX 838 ; N uni229A ; G 2303 +U 8859 ; WX 838 ; N uni229B ; G 2304 +U 8860 ; WX 838 ; N uni229C ; G 2305 +U 8861 ; WX 838 ; N uni229D ; G 2306 +U 8862 ; WX 838 ; N uni229E ; G 2307 +U 8863 ; WX 838 ; N uni229F ; G 2308 +U 8864 ; WX 838 ; N uni22A0 ; G 2309 +U 8865 ; WX 838 ; N uni22A1 ; G 2310 +U 8866 ; WX 860 ; N uni22A2 ; G 2311 +U 8867 ; WX 860 ; N uni22A3 ; G 2312 +U 8868 ; WX 940 ; N uni22A4 ; G 2313 +U 8869 ; WX 940 ; N perpendicular ; G 2314 +U 8870 ; WX 567 ; N uni22A6 ; G 2315 +U 8871 ; WX 567 ; N uni22A7 ; G 2316 +U 8872 ; WX 860 ; N uni22A8 ; G 2317 +U 8873 ; WX 860 ; N uni22A9 ; G 2318 +U 8874 ; WX 860 ; N uni22AA ; G 2319 +U 8875 ; WX 1031 ; N uni22AB ; G 2320 +U 8876 ; WX 860 ; N uni22AC ; G 2321 +U 8877 ; WX 860 ; N uni22AD ; G 2322 +U 8878 ; WX 860 ; N uni22AE ; G 2323 +U 8879 ; WX 1031 ; N uni22AF ; G 2324 +U 8900 ; WX 626 ; N uni22C4 ; G 2325 +U 8901 ; WX 342 ; N dotmath ; G 2326 +U 8962 ; WX 764 ; N house ; G 2327 +U 8968 ; WX 390 ; N uni2308 ; G 2328 +U 8969 ; WX 390 ; N uni2309 ; G 2329 +U 8970 ; WX 390 ; N uni230A ; G 2330 +U 8971 ; WX 390 ; N uni230B ; G 2331 +U 8976 ; WX 838 ; N revlogicalnot ; G 2332 +U 8977 ; WX 513 ; N uni2311 ; G 2333 +U 8984 ; WX 1000 ; N uni2318 ; G 2334 +U 8985 ; WX 838 ; N uni2319 ; G 2335 +U 8992 ; WX 521 ; N integraltp ; G 2336 +U 8993 ; WX 521 ; N integralbt ; G 2337 +U 8997 ; WX 1000 ; N uni2325 ; G 2338 +U 9000 ; WX 1443 ; N uni2328 ; G 2339 +U 9085 ; WX 919 ; N uni237D ; G 2340 +U 9115 ; WX 500 ; N uni239B ; G 2341 +U 9116 ; WX 500 ; N uni239C ; G 2342 +U 9117 ; WX 500 ; N uni239D ; G 2343 +U 9118 ; WX 500 ; N uni239E ; G 2344 +U 9119 ; WX 500 ; N uni239F ; G 2345 +U 9120 ; WX 500 ; N uni23A0 ; G 2346 +U 9121 ; WX 500 ; N uni23A1 ; G 2347 +U 9122 ; WX 500 ; N uni23A2 ; G 2348 +U 9123 ; WX 500 ; N uni23A3 ; G 2349 +U 9124 ; WX 500 ; N uni23A4 ; G 2350 +U 9125 ; WX 500 ; N uni23A5 ; G 2351 +U 9126 ; WX 500 ; N uni23A6 ; G 2352 +U 9127 ; WX 750 ; N uni23A7 ; G 2353 +U 9128 ; WX 750 ; N uni23A8 ; G 2354 +U 9129 ; WX 750 ; N uni23A9 ; G 2355 +U 9130 ; WX 750 ; N uni23AA ; G 2356 +U 9131 ; WX 750 ; N uni23AB ; G 2357 +U 9132 ; WX 750 ; N uni23AC ; G 2358 +U 9133 ; WX 750 ; N uni23AD ; G 2359 +U 9134 ; WX 521 ; N uni23AE ; G 2360 +U 9167 ; WX 945 ; N uni23CF ; G 2361 +U 9251 ; WX 764 ; N uni2423 ; G 2362 +U 9472 ; WX 602 ; N SF100000 ; G 2363 +U 9473 ; WX 602 ; N uni2501 ; G 2364 +U 9474 ; WX 602 ; N SF110000 ; G 2365 +U 9475 ; WX 602 ; N uni2503 ; G 2366 +U 9476 ; WX 602 ; N uni2504 ; G 2367 +U 9477 ; WX 602 ; N uni2505 ; G 2368 +U 9478 ; WX 602 ; N uni2506 ; G 2369 +U 9479 ; WX 602 ; N uni2507 ; G 2370 +U 9480 ; WX 602 ; N uni2508 ; G 2371 +U 9481 ; WX 602 ; N uni2509 ; G 2372 +U 9482 ; WX 602 ; N uni250A ; G 2373 +U 9483 ; WX 602 ; N uni250B ; G 2374 +U 9484 ; WX 602 ; N SF010000 ; G 2375 +U 9485 ; WX 602 ; N uni250D ; G 2376 +U 9486 ; WX 602 ; N uni250E ; G 2377 +U 9487 ; WX 602 ; N uni250F ; G 2378 +U 9488 ; WX 602 ; N SF030000 ; G 2379 +U 9489 ; WX 602 ; N uni2511 ; G 2380 +U 9490 ; WX 602 ; N uni2512 ; G 2381 +U 9491 ; WX 602 ; N uni2513 ; G 2382 +U 9492 ; WX 602 ; N SF020000 ; G 2383 +U 9493 ; WX 602 ; N uni2515 ; G 2384 +U 9494 ; WX 602 ; N uni2516 ; G 2385 +U 9495 ; WX 602 ; N uni2517 ; G 2386 +U 9496 ; WX 602 ; N SF040000 ; G 2387 +U 9497 ; WX 602 ; N uni2519 ; G 2388 +U 9498 ; WX 602 ; N uni251A ; G 2389 +U 9499 ; WX 602 ; N uni251B ; G 2390 +U 9500 ; WX 602 ; N SF080000 ; G 2391 +U 9501 ; WX 602 ; N uni251D ; G 2392 +U 9502 ; WX 602 ; N uni251E ; G 2393 +U 9503 ; WX 602 ; N uni251F ; G 2394 +U 9504 ; WX 602 ; N uni2520 ; G 2395 +U 9505 ; WX 602 ; N uni2521 ; G 2396 +U 9506 ; WX 602 ; N uni2522 ; G 2397 +U 9507 ; WX 602 ; N uni2523 ; G 2398 +U 9508 ; WX 602 ; N SF090000 ; G 2399 +U 9509 ; WX 602 ; N uni2525 ; G 2400 +U 9510 ; WX 602 ; N uni2526 ; G 2401 +U 9511 ; WX 602 ; N uni2527 ; G 2402 +U 9512 ; WX 602 ; N uni2528 ; G 2403 +U 9513 ; WX 602 ; N uni2529 ; G 2404 +U 9514 ; WX 602 ; N uni252A ; G 2405 +U 9515 ; WX 602 ; N uni252B ; G 2406 +U 9516 ; WX 602 ; N SF060000 ; G 2407 +U 9517 ; WX 602 ; N uni252D ; G 2408 +U 9518 ; WX 602 ; N uni252E ; G 2409 +U 9519 ; WX 602 ; N uni252F ; G 2410 +U 9520 ; WX 602 ; N uni2530 ; G 2411 +U 9521 ; WX 602 ; N uni2531 ; G 2412 +U 9522 ; WX 602 ; N uni2532 ; G 2413 +U 9523 ; WX 602 ; N uni2533 ; G 2414 +U 9524 ; WX 602 ; N SF070000 ; G 2415 +U 9525 ; WX 602 ; N uni2535 ; G 2416 +U 9526 ; WX 602 ; N uni2536 ; G 2417 +U 9527 ; WX 602 ; N uni2537 ; G 2418 +U 9528 ; WX 602 ; N uni2538 ; G 2419 +U 9529 ; WX 602 ; N uni2539 ; G 2420 +U 9530 ; WX 602 ; N uni253A ; G 2421 +U 9531 ; WX 602 ; N uni253B ; G 2422 +U 9532 ; WX 602 ; N SF050000 ; G 2423 +U 9533 ; WX 602 ; N uni253D ; G 2424 +U 9534 ; WX 602 ; N uni253E ; G 2425 +U 9535 ; WX 602 ; N uni253F ; G 2426 +U 9536 ; WX 602 ; N uni2540 ; G 2427 +U 9537 ; WX 602 ; N uni2541 ; G 2428 +U 9538 ; WX 602 ; N uni2542 ; G 2429 +U 9539 ; WX 602 ; N uni2543 ; G 2430 +U 9540 ; WX 602 ; N uni2544 ; G 2431 +U 9541 ; WX 602 ; N uni2545 ; G 2432 +U 9542 ; WX 602 ; N uni2546 ; G 2433 +U 9543 ; WX 602 ; N uni2547 ; G 2434 +U 9544 ; WX 602 ; N uni2548 ; G 2435 +U 9545 ; WX 602 ; N uni2549 ; G 2436 +U 9546 ; WX 602 ; N uni254A ; G 2437 +U 9547 ; WX 602 ; N uni254B ; G 2438 +U 9548 ; WX 602 ; N uni254C ; G 2439 +U 9549 ; WX 602 ; N uni254D ; G 2440 +U 9550 ; WX 602 ; N uni254E ; G 2441 +U 9551 ; WX 602 ; N uni254F ; G 2442 +U 9552 ; WX 602 ; N SF430000 ; G 2443 +U 9553 ; WX 602 ; N SF240000 ; G 2444 +U 9554 ; WX 602 ; N SF510000 ; G 2445 +U 9555 ; WX 602 ; N SF520000 ; G 2446 +U 9556 ; WX 602 ; N SF390000 ; G 2447 +U 9557 ; WX 602 ; N SF220000 ; G 2448 +U 9558 ; WX 602 ; N SF210000 ; G 2449 +U 9559 ; WX 602 ; N SF250000 ; G 2450 +U 9560 ; WX 602 ; N SF500000 ; G 2451 +U 9561 ; WX 602 ; N SF490000 ; G 2452 +U 9562 ; WX 602 ; N SF380000 ; G 2453 +U 9563 ; WX 602 ; N SF280000 ; G 2454 +U 9564 ; WX 602 ; N SF270000 ; G 2455 +U 9565 ; WX 602 ; N SF260000 ; G 2456 +U 9566 ; WX 602 ; N SF360000 ; G 2457 +U 9567 ; WX 602 ; N SF370000 ; G 2458 +U 9568 ; WX 602 ; N SF420000 ; G 2459 +U 9569 ; WX 602 ; N SF190000 ; G 2460 +U 9570 ; WX 602 ; N SF200000 ; G 2461 +U 9571 ; WX 602 ; N SF230000 ; G 2462 +U 9572 ; WX 602 ; N SF470000 ; G 2463 +U 9573 ; WX 602 ; N SF480000 ; G 2464 +U 9574 ; WX 602 ; N SF410000 ; G 2465 +U 9575 ; WX 602 ; N SF450000 ; G 2466 +U 9576 ; WX 602 ; N SF460000 ; G 2467 +U 9577 ; WX 602 ; N SF400000 ; G 2468 +U 9578 ; WX 602 ; N SF540000 ; G 2469 +U 9579 ; WX 602 ; N SF530000 ; G 2470 +U 9580 ; WX 602 ; N SF440000 ; G 2471 +U 9581 ; WX 602 ; N uni256D ; G 2472 +U 9582 ; WX 602 ; N uni256E ; G 2473 +U 9583 ; WX 602 ; N uni256F ; G 2474 +U 9584 ; WX 602 ; N uni2570 ; G 2475 +U 9585 ; WX 602 ; N uni2571 ; G 2476 +U 9586 ; WX 602 ; N uni2572 ; G 2477 +U 9587 ; WX 602 ; N uni2573 ; G 2478 +U 9588 ; WX 602 ; N uni2574 ; G 2479 +U 9589 ; WX 602 ; N uni2575 ; G 2480 +U 9590 ; WX 602 ; N uni2576 ; G 2481 +U 9591 ; WX 602 ; N uni2577 ; G 2482 +U 9592 ; WX 602 ; N uni2578 ; G 2483 +U 9593 ; WX 602 ; N uni2579 ; G 2484 +U 9594 ; WX 602 ; N uni257A ; G 2485 +U 9595 ; WX 602 ; N uni257B ; G 2486 +U 9596 ; WX 602 ; N uni257C ; G 2487 +U 9597 ; WX 602 ; N uni257D ; G 2488 +U 9598 ; WX 602 ; N uni257E ; G 2489 +U 9599 ; WX 602 ; N uni257F ; G 2490 +U 9600 ; WX 769 ; N upblock ; G 2491 +U 9601 ; WX 769 ; N uni2581 ; G 2492 +U 9602 ; WX 769 ; N uni2582 ; G 2493 +U 9603 ; WX 769 ; N uni2583 ; G 2494 +U 9604 ; WX 769 ; N dnblock ; G 2495 +U 9605 ; WX 769 ; N uni2585 ; G 2496 +U 9606 ; WX 769 ; N uni2586 ; G 2497 +U 9607 ; WX 769 ; N uni2587 ; G 2498 +U 9608 ; WX 769 ; N block ; G 2499 +U 9609 ; WX 769 ; N uni2589 ; G 2500 +U 9610 ; WX 769 ; N uni258A ; G 2501 +U 9611 ; WX 769 ; N uni258B ; G 2502 +U 9612 ; WX 769 ; N lfblock ; G 2503 +U 9613 ; WX 769 ; N uni258D ; G 2504 +U 9614 ; WX 769 ; N uni258E ; G 2505 +U 9615 ; WX 769 ; N uni258F ; G 2506 +U 9616 ; WX 769 ; N rtblock ; G 2507 +U 9617 ; WX 769 ; N ltshade ; G 2508 +U 9618 ; WX 769 ; N shade ; G 2509 +U 9619 ; WX 769 ; N dkshade ; G 2510 +U 9620 ; WX 769 ; N uni2594 ; G 2511 +U 9621 ; WX 769 ; N uni2595 ; G 2512 +U 9622 ; WX 769 ; N uni2596 ; G 2513 +U 9623 ; WX 769 ; N uni2597 ; G 2514 +U 9624 ; WX 769 ; N uni2598 ; G 2515 +U 9625 ; WX 769 ; N uni2599 ; G 2516 +U 9626 ; WX 769 ; N uni259A ; G 2517 +U 9627 ; WX 769 ; N uni259B ; G 2518 +U 9628 ; WX 769 ; N uni259C ; G 2519 +U 9629 ; WX 769 ; N uni259D ; G 2520 +U 9630 ; WX 769 ; N uni259E ; G 2521 +U 9631 ; WX 769 ; N uni259F ; G 2522 +U 9632 ; WX 945 ; N filledbox ; G 2523 +U 9633 ; WX 945 ; N H22073 ; G 2524 +U 9634 ; WX 945 ; N uni25A2 ; G 2525 +U 9635 ; WX 945 ; N uni25A3 ; G 2526 +U 9636 ; WX 945 ; N uni25A4 ; G 2527 +U 9637 ; WX 945 ; N uni25A5 ; G 2528 +U 9638 ; WX 945 ; N uni25A6 ; G 2529 +U 9639 ; WX 945 ; N uni25A7 ; G 2530 +U 9640 ; WX 945 ; N uni25A8 ; G 2531 +U 9641 ; WX 945 ; N uni25A9 ; G 2532 +U 9642 ; WX 678 ; N H18543 ; G 2533 +U 9643 ; WX 678 ; N H18551 ; G 2534 +U 9644 ; WX 945 ; N filledrect ; G 2535 +U 9645 ; WX 945 ; N uni25AD ; G 2536 +U 9646 ; WX 550 ; N uni25AE ; G 2537 +U 9647 ; WX 550 ; N uni25AF ; G 2538 +U 9648 ; WX 769 ; N uni25B0 ; G 2539 +U 9649 ; WX 769 ; N uni25B1 ; G 2540 +U 9650 ; WX 769 ; N triagup ; G 2541 +U 9651 ; WX 769 ; N uni25B3 ; G 2542 +U 9652 ; WX 502 ; N uni25B4 ; G 2543 +U 9653 ; WX 502 ; N uni25B5 ; G 2544 +U 9654 ; WX 769 ; N uni25B6 ; G 2545 +U 9655 ; WX 769 ; N uni25B7 ; G 2546 +U 9656 ; WX 502 ; N uni25B8 ; G 2547 +U 9657 ; WX 502 ; N uni25B9 ; G 2548 +U 9658 ; WX 769 ; N triagrt ; G 2549 +U 9659 ; WX 769 ; N uni25BB ; G 2550 +U 9660 ; WX 769 ; N triagdn ; G 2551 +U 9661 ; WX 769 ; N uni25BD ; G 2552 +U 9662 ; WX 502 ; N uni25BE ; G 2553 +U 9663 ; WX 502 ; N uni25BF ; G 2554 +U 9664 ; WX 769 ; N uni25C0 ; G 2555 +U 9665 ; WX 769 ; N uni25C1 ; G 2556 +U 9666 ; WX 502 ; N uni25C2 ; G 2557 +U 9667 ; WX 502 ; N uni25C3 ; G 2558 +U 9668 ; WX 769 ; N triaglf ; G 2559 +U 9669 ; WX 769 ; N uni25C5 ; G 2560 +U 9670 ; WX 769 ; N uni25C6 ; G 2561 +U 9671 ; WX 769 ; N uni25C7 ; G 2562 +U 9672 ; WX 769 ; N uni25C8 ; G 2563 +U 9673 ; WX 873 ; N uni25C9 ; G 2564 +U 9674 ; WX 494 ; N lozenge ; G 2565 +U 9675 ; WX 873 ; N circle ; G 2566 +U 9676 ; WX 873 ; N uni25CC ; G 2567 +U 9677 ; WX 873 ; N uni25CD ; G 2568 +U 9678 ; WX 873 ; N uni25CE ; G 2569 +U 9679 ; WX 873 ; N H18533 ; G 2570 +U 9680 ; WX 873 ; N uni25D0 ; G 2571 +U 9681 ; WX 873 ; N uni25D1 ; G 2572 +U 9682 ; WX 873 ; N uni25D2 ; G 2573 +U 9683 ; WX 873 ; N uni25D3 ; G 2574 +U 9684 ; WX 873 ; N uni25D4 ; G 2575 +U 9685 ; WX 873 ; N uni25D5 ; G 2576 +U 9686 ; WX 527 ; N uni25D6 ; G 2577 +U 9687 ; WX 527 ; N uni25D7 ; G 2578 +U 9688 ; WX 791 ; N invbullet ; G 2579 +U 9689 ; WX 970 ; N invcircle ; G 2580 +U 9690 ; WX 970 ; N uni25DA ; G 2581 +U 9691 ; WX 970 ; N uni25DB ; G 2582 +U 9692 ; WX 387 ; N uni25DC ; G 2583 +U 9693 ; WX 387 ; N uni25DD ; G 2584 +U 9694 ; WX 387 ; N uni25DE ; G 2585 +U 9695 ; WX 387 ; N uni25DF ; G 2586 +U 9696 ; WX 873 ; N uni25E0 ; G 2587 +U 9697 ; WX 873 ; N uni25E1 ; G 2588 +U 9698 ; WX 769 ; N uni25E2 ; G 2589 +U 9699 ; WX 769 ; N uni25E3 ; G 2590 +U 9700 ; WX 769 ; N uni25E4 ; G 2591 +U 9701 ; WX 769 ; N uni25E5 ; G 2592 +U 9702 ; WX 590 ; N openbullet ; G 2593 +U 9703 ; WX 945 ; N uni25E7 ; G 2594 +U 9704 ; WX 945 ; N uni25E8 ; G 2595 +U 9705 ; WX 945 ; N uni25E9 ; G 2596 +U 9706 ; WX 945 ; N uni25EA ; G 2597 +U 9707 ; WX 945 ; N uni25EB ; G 2598 +U 9708 ; WX 769 ; N uni25EC ; G 2599 +U 9709 ; WX 769 ; N uni25ED ; G 2600 +U 9710 ; WX 769 ; N uni25EE ; G 2601 +U 9711 ; WX 1119 ; N uni25EF ; G 2602 +U 9712 ; WX 945 ; N uni25F0 ; G 2603 +U 9713 ; WX 945 ; N uni25F1 ; G 2604 +U 9714 ; WX 945 ; N uni25F2 ; G 2605 +U 9715 ; WX 945 ; N uni25F3 ; G 2606 +U 9716 ; WX 873 ; N uni25F4 ; G 2607 +U 9717 ; WX 873 ; N uni25F5 ; G 2608 +U 9718 ; WX 873 ; N uni25F6 ; G 2609 +U 9719 ; WX 873 ; N uni25F7 ; G 2610 +U 9720 ; WX 769 ; N uni25F8 ; G 2611 +U 9721 ; WX 769 ; N uni25F9 ; G 2612 +U 9722 ; WX 769 ; N uni25FA ; G 2613 +U 9723 ; WX 830 ; N uni25FB ; G 2614 +U 9724 ; WX 830 ; N uni25FC ; G 2615 +U 9725 ; WX 732 ; N uni25FD ; G 2616 +U 9726 ; WX 732 ; N uni25FE ; G 2617 +U 9727 ; WX 769 ; N uni25FF ; G 2618 +U 9728 ; WX 896 ; N uni2600 ; G 2619 +U 9784 ; WX 896 ; N uni2638 ; G 2620 +U 9785 ; WX 896 ; N uni2639 ; G 2621 +U 9786 ; WX 896 ; N smileface ; G 2622 +U 9787 ; WX 896 ; N invsmileface ; G 2623 +U 9788 ; WX 896 ; N sun ; G 2624 +U 9791 ; WX 614 ; N uni263F ; G 2625 +U 9792 ; WX 731 ; N female ; G 2626 +U 9793 ; WX 731 ; N uni2641 ; G 2627 +U 9794 ; WX 896 ; N male ; G 2628 +U 9795 ; WX 896 ; N uni2643 ; G 2629 +U 9796 ; WX 896 ; N uni2644 ; G 2630 +U 9797 ; WX 896 ; N uni2645 ; G 2631 +U 9798 ; WX 896 ; N uni2646 ; G 2632 +U 9799 ; WX 896 ; N uni2647 ; G 2633 +U 9824 ; WX 896 ; N spade ; G 2634 +U 9825 ; WX 896 ; N uni2661 ; G 2635 +U 9826 ; WX 896 ; N uni2662 ; G 2636 +U 9827 ; WX 896 ; N club ; G 2637 +U 9828 ; WX 896 ; N uni2664 ; G 2638 +U 9829 ; WX 896 ; N heart ; G 2639 +U 9830 ; WX 896 ; N diamond ; G 2640 +U 9831 ; WX 896 ; N uni2667 ; G 2641 +U 9833 ; WX 472 ; N uni2669 ; G 2642 +U 9834 ; WX 638 ; N musicalnote ; G 2643 +U 9835 ; WX 896 ; N musicalnotedbl ; G 2644 +U 9836 ; WX 896 ; N uni266C ; G 2645 +U 9837 ; WX 472 ; N uni266D ; G 2646 +U 9838 ; WX 357 ; N uni266E ; G 2647 +U 9839 ; WX 484 ; N uni266F ; G 2648 +U 10145 ; WX 838 ; N uni27A1 ; G 2649 +U 10181 ; WX 390 ; N uni27C5 ; G 2650 +U 10182 ; WX 390 ; N uni27C6 ; G 2651 +U 10208 ; WX 494 ; N uni27E0 ; G 2652 +U 10216 ; WX 390 ; N uni27E8 ; G 2653 +U 10217 ; WX 390 ; N uni27E9 ; G 2654 +U 10224 ; WX 838 ; N uni27F0 ; G 2655 +U 10225 ; WX 838 ; N uni27F1 ; G 2656 +U 10226 ; WX 838 ; N uni27F2 ; G 2657 +U 10227 ; WX 838 ; N uni27F3 ; G 2658 +U 10228 ; WX 1033 ; N uni27F4 ; G 2659 +U 10229 ; WX 1434 ; N uni27F5 ; G 2660 +U 10230 ; WX 1434 ; N uni27F6 ; G 2661 +U 10231 ; WX 1434 ; N uni27F7 ; G 2662 +U 10232 ; WX 1434 ; N uni27F8 ; G 2663 +U 10233 ; WX 1434 ; N uni27F9 ; G 2664 +U 10234 ; WX 1434 ; N uni27FA ; G 2665 +U 10235 ; WX 1434 ; N uni27FB ; G 2666 +U 10236 ; WX 1434 ; N uni27FC ; G 2667 +U 10237 ; WX 1434 ; N uni27FD ; G 2668 +U 10238 ; WX 1434 ; N uni27FE ; G 2669 +U 10239 ; WX 1434 ; N uni27FF ; G 2670 +U 10240 ; WX 732 ; N uni2800 ; G 2671 +U 10241 ; WX 732 ; N uni2801 ; G 2672 +U 10242 ; WX 732 ; N uni2802 ; G 2673 +U 10243 ; WX 732 ; N uni2803 ; G 2674 +U 10244 ; WX 732 ; N uni2804 ; G 2675 +U 10245 ; WX 732 ; N uni2805 ; G 2676 +U 10246 ; WX 732 ; N uni2806 ; G 2677 +U 10247 ; WX 732 ; N uni2807 ; G 2678 +U 10248 ; WX 732 ; N uni2808 ; G 2679 +U 10249 ; WX 732 ; N uni2809 ; G 2680 +U 10250 ; WX 732 ; N uni280A ; G 2681 +U 10251 ; WX 732 ; N uni280B ; G 2682 +U 10252 ; WX 732 ; N uni280C ; G 2683 +U 10253 ; WX 732 ; N uni280D ; G 2684 +U 10254 ; WX 732 ; N uni280E ; G 2685 +U 10255 ; WX 732 ; N uni280F ; G 2686 +U 10256 ; WX 732 ; N uni2810 ; G 2687 +U 10257 ; WX 732 ; N uni2811 ; G 2688 +U 10258 ; WX 732 ; N uni2812 ; G 2689 +U 10259 ; WX 732 ; N uni2813 ; G 2690 +U 10260 ; WX 732 ; N uni2814 ; G 2691 +U 10261 ; WX 732 ; N uni2815 ; G 2692 +U 10262 ; WX 732 ; N uni2816 ; G 2693 +U 10263 ; WX 732 ; N uni2817 ; G 2694 +U 10264 ; WX 732 ; N uni2818 ; G 2695 +U 10265 ; WX 732 ; N uni2819 ; G 2696 +U 10266 ; WX 732 ; N uni281A ; G 2697 +U 10267 ; WX 732 ; N uni281B ; G 2698 +U 10268 ; WX 732 ; N uni281C ; G 2699 +U 10269 ; WX 732 ; N uni281D ; G 2700 +U 10270 ; WX 732 ; N uni281E ; G 2701 +U 10271 ; WX 732 ; N uni281F ; G 2702 +U 10272 ; WX 732 ; N uni2820 ; G 2703 +U 10273 ; WX 732 ; N uni2821 ; G 2704 +U 10274 ; WX 732 ; N uni2822 ; G 2705 +U 10275 ; WX 732 ; N uni2823 ; G 2706 +U 10276 ; WX 732 ; N uni2824 ; G 2707 +U 10277 ; WX 732 ; N uni2825 ; G 2708 +U 10278 ; WX 732 ; N uni2826 ; G 2709 +U 10279 ; WX 732 ; N uni2827 ; G 2710 +U 10280 ; WX 732 ; N uni2828 ; G 2711 +U 10281 ; WX 732 ; N uni2829 ; G 2712 +U 10282 ; WX 732 ; N uni282A ; G 2713 +U 10283 ; WX 732 ; N uni282B ; G 2714 +U 10284 ; WX 732 ; N uni282C ; G 2715 +U 10285 ; WX 732 ; N uni282D ; G 2716 +U 10286 ; WX 732 ; N uni282E ; G 2717 +U 10287 ; WX 732 ; N uni282F ; G 2718 +U 10288 ; WX 732 ; N uni2830 ; G 2719 +U 10289 ; WX 732 ; N uni2831 ; G 2720 +U 10290 ; WX 732 ; N uni2832 ; G 2721 +U 10291 ; WX 732 ; N uni2833 ; G 2722 +U 10292 ; WX 732 ; N uni2834 ; G 2723 +U 10293 ; WX 732 ; N uni2835 ; G 2724 +U 10294 ; WX 732 ; N uni2836 ; G 2725 +U 10295 ; WX 732 ; N uni2837 ; G 2726 +U 10296 ; WX 732 ; N uni2838 ; G 2727 +U 10297 ; WX 732 ; N uni2839 ; G 2728 +U 10298 ; WX 732 ; N uni283A ; G 2729 +U 10299 ; WX 732 ; N uni283B ; G 2730 +U 10300 ; WX 732 ; N uni283C ; G 2731 +U 10301 ; WX 732 ; N uni283D ; G 2732 +U 10302 ; WX 732 ; N uni283E ; G 2733 +U 10303 ; WX 732 ; N uni283F ; G 2734 +U 10304 ; WX 732 ; N uni2840 ; G 2735 +U 10305 ; WX 732 ; N uni2841 ; G 2736 +U 10306 ; WX 732 ; N uni2842 ; G 2737 +U 10307 ; WX 732 ; N uni2843 ; G 2738 +U 10308 ; WX 732 ; N uni2844 ; G 2739 +U 10309 ; WX 732 ; N uni2845 ; G 2740 +U 10310 ; WX 732 ; N uni2846 ; G 2741 +U 10311 ; WX 732 ; N uni2847 ; G 2742 +U 10312 ; WX 732 ; N uni2848 ; G 2743 +U 10313 ; WX 732 ; N uni2849 ; G 2744 +U 10314 ; WX 732 ; N uni284A ; G 2745 +U 10315 ; WX 732 ; N uni284B ; G 2746 +U 10316 ; WX 732 ; N uni284C ; G 2747 +U 10317 ; WX 732 ; N uni284D ; G 2748 +U 10318 ; WX 732 ; N uni284E ; G 2749 +U 10319 ; WX 732 ; N uni284F ; G 2750 +U 10320 ; WX 732 ; N uni2850 ; G 2751 +U 10321 ; WX 732 ; N uni2851 ; G 2752 +U 10322 ; WX 732 ; N uni2852 ; G 2753 +U 10323 ; WX 732 ; N uni2853 ; G 2754 +U 10324 ; WX 732 ; N uni2854 ; G 2755 +U 10325 ; WX 732 ; N uni2855 ; G 2756 +U 10326 ; WX 732 ; N uni2856 ; G 2757 +U 10327 ; WX 732 ; N uni2857 ; G 2758 +U 10328 ; WX 732 ; N uni2858 ; G 2759 +U 10329 ; WX 732 ; N uni2859 ; G 2760 +U 10330 ; WX 732 ; N uni285A ; G 2761 +U 10331 ; WX 732 ; N uni285B ; G 2762 +U 10332 ; WX 732 ; N uni285C ; G 2763 +U 10333 ; WX 732 ; N uni285D ; G 2764 +U 10334 ; WX 732 ; N uni285E ; G 2765 +U 10335 ; WX 732 ; N uni285F ; G 2766 +U 10336 ; WX 732 ; N uni2860 ; G 2767 +U 10337 ; WX 732 ; N uni2861 ; G 2768 +U 10338 ; WX 732 ; N uni2862 ; G 2769 +U 10339 ; WX 732 ; N uni2863 ; G 2770 +U 10340 ; WX 732 ; N uni2864 ; G 2771 +U 10341 ; WX 732 ; N uni2865 ; G 2772 +U 10342 ; WX 732 ; N uni2866 ; G 2773 +U 10343 ; WX 732 ; N uni2867 ; G 2774 +U 10344 ; WX 732 ; N uni2868 ; G 2775 +U 10345 ; WX 732 ; N uni2869 ; G 2776 +U 10346 ; WX 732 ; N uni286A ; G 2777 +U 10347 ; WX 732 ; N uni286B ; G 2778 +U 10348 ; WX 732 ; N uni286C ; G 2779 +U 10349 ; WX 732 ; N uni286D ; G 2780 +U 10350 ; WX 732 ; N uni286E ; G 2781 +U 10351 ; WX 732 ; N uni286F ; G 2782 +U 10352 ; WX 732 ; N uni2870 ; G 2783 +U 10353 ; WX 732 ; N uni2871 ; G 2784 +U 10354 ; WX 732 ; N uni2872 ; G 2785 +U 10355 ; WX 732 ; N uni2873 ; G 2786 +U 10356 ; WX 732 ; N uni2874 ; G 2787 +U 10357 ; WX 732 ; N uni2875 ; G 2788 +U 10358 ; WX 732 ; N uni2876 ; G 2789 +U 10359 ; WX 732 ; N uni2877 ; G 2790 +U 10360 ; WX 732 ; N uni2878 ; G 2791 +U 10361 ; WX 732 ; N uni2879 ; G 2792 +U 10362 ; WX 732 ; N uni287A ; G 2793 +U 10363 ; WX 732 ; N uni287B ; G 2794 +U 10364 ; WX 732 ; N uni287C ; G 2795 +U 10365 ; WX 732 ; N uni287D ; G 2796 +U 10366 ; WX 732 ; N uni287E ; G 2797 +U 10367 ; WX 732 ; N uni287F ; G 2798 +U 10368 ; WX 732 ; N uni2880 ; G 2799 +U 10369 ; WX 732 ; N uni2881 ; G 2800 +U 10370 ; WX 732 ; N uni2882 ; G 2801 +U 10371 ; WX 732 ; N uni2883 ; G 2802 +U 10372 ; WX 732 ; N uni2884 ; G 2803 +U 10373 ; WX 732 ; N uni2885 ; G 2804 +U 10374 ; WX 732 ; N uni2886 ; G 2805 +U 10375 ; WX 732 ; N uni2887 ; G 2806 +U 10376 ; WX 732 ; N uni2888 ; G 2807 +U 10377 ; WX 732 ; N uni2889 ; G 2808 +U 10378 ; WX 732 ; N uni288A ; G 2809 +U 10379 ; WX 732 ; N uni288B ; G 2810 +U 10380 ; WX 732 ; N uni288C ; G 2811 +U 10381 ; WX 732 ; N uni288D ; G 2812 +U 10382 ; WX 732 ; N uni288E ; G 2813 +U 10383 ; WX 732 ; N uni288F ; G 2814 +U 10384 ; WX 732 ; N uni2890 ; G 2815 +U 10385 ; WX 732 ; N uni2891 ; G 2816 +U 10386 ; WX 732 ; N uni2892 ; G 2817 +U 10387 ; WX 732 ; N uni2893 ; G 2818 +U 10388 ; WX 732 ; N uni2894 ; G 2819 +U 10389 ; WX 732 ; N uni2895 ; G 2820 +U 10390 ; WX 732 ; N uni2896 ; G 2821 +U 10391 ; WX 732 ; N uni2897 ; G 2822 +U 10392 ; WX 732 ; N uni2898 ; G 2823 +U 10393 ; WX 732 ; N uni2899 ; G 2824 +U 10394 ; WX 732 ; N uni289A ; G 2825 +U 10395 ; WX 732 ; N uni289B ; G 2826 +U 10396 ; WX 732 ; N uni289C ; G 2827 +U 10397 ; WX 732 ; N uni289D ; G 2828 +U 10398 ; WX 732 ; N uni289E ; G 2829 +U 10399 ; WX 732 ; N uni289F ; G 2830 +U 10400 ; WX 732 ; N uni28A0 ; G 2831 +U 10401 ; WX 732 ; N uni28A1 ; G 2832 +U 10402 ; WX 732 ; N uni28A2 ; G 2833 +U 10403 ; WX 732 ; N uni28A3 ; G 2834 +U 10404 ; WX 732 ; N uni28A4 ; G 2835 +U 10405 ; WX 732 ; N uni28A5 ; G 2836 +U 10406 ; WX 732 ; N uni28A6 ; G 2837 +U 10407 ; WX 732 ; N uni28A7 ; G 2838 +U 10408 ; WX 732 ; N uni28A8 ; G 2839 +U 10409 ; WX 732 ; N uni28A9 ; G 2840 +U 10410 ; WX 732 ; N uni28AA ; G 2841 +U 10411 ; WX 732 ; N uni28AB ; G 2842 +U 10412 ; WX 732 ; N uni28AC ; G 2843 +U 10413 ; WX 732 ; N uni28AD ; G 2844 +U 10414 ; WX 732 ; N uni28AE ; G 2845 +U 10415 ; WX 732 ; N uni28AF ; G 2846 +U 10416 ; WX 732 ; N uni28B0 ; G 2847 +U 10417 ; WX 732 ; N uni28B1 ; G 2848 +U 10418 ; WX 732 ; N uni28B2 ; G 2849 +U 10419 ; WX 732 ; N uni28B3 ; G 2850 +U 10420 ; WX 732 ; N uni28B4 ; G 2851 +U 10421 ; WX 732 ; N uni28B5 ; G 2852 +U 10422 ; WX 732 ; N uni28B6 ; G 2853 +U 10423 ; WX 732 ; N uni28B7 ; G 2854 +U 10424 ; WX 732 ; N uni28B8 ; G 2855 +U 10425 ; WX 732 ; N uni28B9 ; G 2856 +U 10426 ; WX 732 ; N uni28BA ; G 2857 +U 10427 ; WX 732 ; N uni28BB ; G 2858 +U 10428 ; WX 732 ; N uni28BC ; G 2859 +U 10429 ; WX 732 ; N uni28BD ; G 2860 +U 10430 ; WX 732 ; N uni28BE ; G 2861 +U 10431 ; WX 732 ; N uni28BF ; G 2862 +U 10432 ; WX 732 ; N uni28C0 ; G 2863 +U 10433 ; WX 732 ; N uni28C1 ; G 2864 +U 10434 ; WX 732 ; N uni28C2 ; G 2865 +U 10435 ; WX 732 ; N uni28C3 ; G 2866 +U 10436 ; WX 732 ; N uni28C4 ; G 2867 +U 10437 ; WX 732 ; N uni28C5 ; G 2868 +U 10438 ; WX 732 ; N uni28C6 ; G 2869 +U 10439 ; WX 732 ; N uni28C7 ; G 2870 +U 10440 ; WX 732 ; N uni28C8 ; G 2871 +U 10441 ; WX 732 ; N uni28C9 ; G 2872 +U 10442 ; WX 732 ; N uni28CA ; G 2873 +U 10443 ; WX 732 ; N uni28CB ; G 2874 +U 10444 ; WX 732 ; N uni28CC ; G 2875 +U 10445 ; WX 732 ; N uni28CD ; G 2876 +U 10446 ; WX 732 ; N uni28CE ; G 2877 +U 10447 ; WX 732 ; N uni28CF ; G 2878 +U 10448 ; WX 732 ; N uni28D0 ; G 2879 +U 10449 ; WX 732 ; N uni28D1 ; G 2880 +U 10450 ; WX 732 ; N uni28D2 ; G 2881 +U 10451 ; WX 732 ; N uni28D3 ; G 2882 +U 10452 ; WX 732 ; N uni28D4 ; G 2883 +U 10453 ; WX 732 ; N uni28D5 ; G 2884 +U 10454 ; WX 732 ; N uni28D6 ; G 2885 +U 10455 ; WX 732 ; N uni28D7 ; G 2886 +U 10456 ; WX 732 ; N uni28D8 ; G 2887 +U 10457 ; WX 732 ; N uni28D9 ; G 2888 +U 10458 ; WX 732 ; N uni28DA ; G 2889 +U 10459 ; WX 732 ; N uni28DB ; G 2890 +U 10460 ; WX 732 ; N uni28DC ; G 2891 +U 10461 ; WX 732 ; N uni28DD ; G 2892 +U 10462 ; WX 732 ; N uni28DE ; G 2893 +U 10463 ; WX 732 ; N uni28DF ; G 2894 +U 10464 ; WX 732 ; N uni28E0 ; G 2895 +U 10465 ; WX 732 ; N uni28E1 ; G 2896 +U 10466 ; WX 732 ; N uni28E2 ; G 2897 +U 10467 ; WX 732 ; N uni28E3 ; G 2898 +U 10468 ; WX 732 ; N uni28E4 ; G 2899 +U 10469 ; WX 732 ; N uni28E5 ; G 2900 +U 10470 ; WX 732 ; N uni28E6 ; G 2901 +U 10471 ; WX 732 ; N uni28E7 ; G 2902 +U 10472 ; WX 732 ; N uni28E8 ; G 2903 +U 10473 ; WX 732 ; N uni28E9 ; G 2904 +U 10474 ; WX 732 ; N uni28EA ; G 2905 +U 10475 ; WX 732 ; N uni28EB ; G 2906 +U 10476 ; WX 732 ; N uni28EC ; G 2907 +U 10477 ; WX 732 ; N uni28ED ; G 2908 +U 10478 ; WX 732 ; N uni28EE ; G 2909 +U 10479 ; WX 732 ; N uni28EF ; G 2910 +U 10480 ; WX 732 ; N uni28F0 ; G 2911 +U 10481 ; WX 732 ; N uni28F1 ; G 2912 +U 10482 ; WX 732 ; N uni28F2 ; G 2913 +U 10483 ; WX 732 ; N uni28F3 ; G 2914 +U 10484 ; WX 732 ; N uni28F4 ; G 2915 +U 10485 ; WX 732 ; N uni28F5 ; G 2916 +U 10486 ; WX 732 ; N uni28F6 ; G 2917 +U 10487 ; WX 732 ; N uni28F7 ; G 2918 +U 10488 ; WX 732 ; N uni28F8 ; G 2919 +U 10489 ; WX 732 ; N uni28F9 ; G 2920 +U 10490 ; WX 732 ; N uni28FA ; G 2921 +U 10491 ; WX 732 ; N uni28FB ; G 2922 +U 10492 ; WX 732 ; N uni28FC ; G 2923 +U 10493 ; WX 732 ; N uni28FD ; G 2924 +U 10494 ; WX 732 ; N uni28FE ; G 2925 +U 10495 ; WX 732 ; N uni28FF ; G 2926 +U 10496 ; WX 838 ; N uni2900 ; G 2927 +U 10497 ; WX 838 ; N uni2901 ; G 2928 +U 10498 ; WX 838 ; N uni2902 ; G 2929 +U 10499 ; WX 838 ; N uni2903 ; G 2930 +U 10500 ; WX 838 ; N uni2904 ; G 2931 +U 10501 ; WX 838 ; N uni2905 ; G 2932 +U 10502 ; WX 838 ; N uni2906 ; G 2933 +U 10503 ; WX 838 ; N uni2907 ; G 2934 +U 10504 ; WX 838 ; N uni2908 ; G 2935 +U 10505 ; WX 838 ; N uni2909 ; G 2936 +U 10506 ; WX 838 ; N uni290A ; G 2937 +U 10507 ; WX 838 ; N uni290B ; G 2938 +U 10508 ; WX 838 ; N uni290C ; G 2939 +U 10509 ; WX 838 ; N uni290D ; G 2940 +U 10510 ; WX 838 ; N uni290E ; G 2941 +U 10511 ; WX 838 ; N uni290F ; G 2942 +U 10512 ; WX 838 ; N uni2910 ; G 2943 +U 10513 ; WX 838 ; N uni2911 ; G 2944 +U 10514 ; WX 838 ; N uni2912 ; G 2945 +U 10515 ; WX 838 ; N uni2913 ; G 2946 +U 10516 ; WX 838 ; N uni2914 ; G 2947 +U 10517 ; WX 838 ; N uni2915 ; G 2948 +U 10518 ; WX 838 ; N uni2916 ; G 2949 +U 10519 ; WX 838 ; N uni2917 ; G 2950 +U 10520 ; WX 838 ; N uni2918 ; G 2951 +U 10521 ; WX 838 ; N uni2919 ; G 2952 +U 10522 ; WX 838 ; N uni291A ; G 2953 +U 10523 ; WX 838 ; N uni291B ; G 2954 +U 10524 ; WX 838 ; N uni291C ; G 2955 +U 10525 ; WX 838 ; N uni291D ; G 2956 +U 10526 ; WX 838 ; N uni291E ; G 2957 +U 10527 ; WX 838 ; N uni291F ; G 2958 +U 10528 ; WX 838 ; N uni2920 ; G 2959 +U 10529 ; WX 838 ; N uni2921 ; G 2960 +U 10530 ; WX 838 ; N uni2922 ; G 2961 +U 10531 ; WX 838 ; N uni2923 ; G 2962 +U 10532 ; WX 838 ; N uni2924 ; G 2963 +U 10533 ; WX 838 ; N uni2925 ; G 2964 +U 10534 ; WX 838 ; N uni2926 ; G 2965 +U 10535 ; WX 838 ; N uni2927 ; G 2966 +U 10536 ; WX 838 ; N uni2928 ; G 2967 +U 10537 ; WX 838 ; N uni2929 ; G 2968 +U 10538 ; WX 838 ; N uni292A ; G 2969 +U 10539 ; WX 838 ; N uni292B ; G 2970 +U 10540 ; WX 838 ; N uni292C ; G 2971 +U 10541 ; WX 838 ; N uni292D ; G 2972 +U 10542 ; WX 838 ; N uni292E ; G 2973 +U 10543 ; WX 838 ; N uni292F ; G 2974 +U 10544 ; WX 838 ; N uni2930 ; G 2975 +U 10545 ; WX 838 ; N uni2931 ; G 2976 +U 10546 ; WX 838 ; N uni2932 ; G 2977 +U 10547 ; WX 838 ; N uni2933 ; G 2978 +U 10548 ; WX 838 ; N uni2934 ; G 2979 +U 10549 ; WX 838 ; N uni2935 ; G 2980 +U 10550 ; WX 838 ; N uni2936 ; G 2981 +U 10551 ; WX 838 ; N uni2937 ; G 2982 +U 10552 ; WX 838 ; N uni2938 ; G 2983 +U 10553 ; WX 838 ; N uni2939 ; G 2984 +U 10554 ; WX 838 ; N uni293A ; G 2985 +U 10555 ; WX 838 ; N uni293B ; G 2986 +U 10556 ; WX 838 ; N uni293C ; G 2987 +U 10557 ; WX 838 ; N uni293D ; G 2988 +U 10558 ; WX 838 ; N uni293E ; G 2989 +U 10559 ; WX 838 ; N uni293F ; G 2990 +U 10560 ; WX 838 ; N uni2940 ; G 2991 +U 10561 ; WX 838 ; N uni2941 ; G 2992 +U 10562 ; WX 838 ; N uni2942 ; G 2993 +U 10563 ; WX 838 ; N uni2943 ; G 2994 +U 10564 ; WX 838 ; N uni2944 ; G 2995 +U 10565 ; WX 838 ; N uni2945 ; G 2996 +U 10566 ; WX 838 ; N uni2946 ; G 2997 +U 10567 ; WX 838 ; N uni2947 ; G 2998 +U 10568 ; WX 838 ; N uni2948 ; G 2999 +U 10569 ; WX 838 ; N uni2949 ; G 3000 +U 10570 ; WX 838 ; N uni294A ; G 3001 +U 10571 ; WX 838 ; N uni294B ; G 3002 +U 10572 ; WX 838 ; N uni294C ; G 3003 +U 10573 ; WX 838 ; N uni294D ; G 3004 +U 10574 ; WX 838 ; N uni294E ; G 3005 +U 10575 ; WX 838 ; N uni294F ; G 3006 +U 10576 ; WX 838 ; N uni2950 ; G 3007 +U 10577 ; WX 838 ; N uni2951 ; G 3008 +U 10578 ; WX 838 ; N uni2952 ; G 3009 +U 10579 ; WX 838 ; N uni2953 ; G 3010 +U 10580 ; WX 838 ; N uni2954 ; G 3011 +U 10581 ; WX 838 ; N uni2955 ; G 3012 +U 10582 ; WX 838 ; N uni2956 ; G 3013 +U 10583 ; WX 838 ; N uni2957 ; G 3014 +U 10584 ; WX 838 ; N uni2958 ; G 3015 +U 10585 ; WX 838 ; N uni2959 ; G 3016 +U 10586 ; WX 838 ; N uni295A ; G 3017 +U 10587 ; WX 838 ; N uni295B ; G 3018 +U 10588 ; WX 838 ; N uni295C ; G 3019 +U 10589 ; WX 838 ; N uni295D ; G 3020 +U 10590 ; WX 838 ; N uni295E ; G 3021 +U 10591 ; WX 838 ; N uni295F ; G 3022 +U 10592 ; WX 838 ; N uni2960 ; G 3023 +U 10593 ; WX 838 ; N uni2961 ; G 3024 +U 10594 ; WX 838 ; N uni2962 ; G 3025 +U 10595 ; WX 838 ; N uni2963 ; G 3026 +U 10596 ; WX 838 ; N uni2964 ; G 3027 +U 10597 ; WX 838 ; N uni2965 ; G 3028 +U 10598 ; WX 838 ; N uni2966 ; G 3029 +U 10599 ; WX 838 ; N uni2967 ; G 3030 +U 10600 ; WX 838 ; N uni2968 ; G 3031 +U 10601 ; WX 838 ; N uni2969 ; G 3032 +U 10602 ; WX 838 ; N uni296A ; G 3033 +U 10603 ; WX 838 ; N uni296B ; G 3034 +U 10604 ; WX 838 ; N uni296C ; G 3035 +U 10605 ; WX 838 ; N uni296D ; G 3036 +U 10606 ; WX 838 ; N uni296E ; G 3037 +U 10607 ; WX 838 ; N uni296F ; G 3038 +U 10608 ; WX 838 ; N uni2970 ; G 3039 +U 10609 ; WX 838 ; N uni2971 ; G 3040 +U 10610 ; WX 838 ; N uni2972 ; G 3041 +U 10611 ; WX 838 ; N uni2973 ; G 3042 +U 10612 ; WX 838 ; N uni2974 ; G 3043 +U 10613 ; WX 838 ; N uni2975 ; G 3044 +U 10614 ; WX 838 ; N uni2976 ; G 3045 +U 10615 ; WX 981 ; N uni2977 ; G 3046 +U 10616 ; WX 838 ; N uni2978 ; G 3047 +U 10617 ; WX 838 ; N uni2979 ; G 3048 +U 10618 ; WX 984 ; N uni297A ; G 3049 +U 10619 ; WX 838 ; N uni297B ; G 3050 +U 10620 ; WX 838 ; N uni297C ; G 3051 +U 10621 ; WX 838 ; N uni297D ; G 3052 +U 10622 ; WX 838 ; N uni297E ; G 3053 +U 10623 ; WX 838 ; N uni297F ; G 3054 +U 10731 ; WX 494 ; N uni29EB ; G 3055 +U 10764 ; WX 1513 ; N uni2A0C ; G 3056 +U 10765 ; WX 521 ; N uni2A0D ; G 3057 +U 10766 ; WX 521 ; N uni2A0E ; G 3058 +U 10799 ; WX 838 ; N uni2A2F ; G 3059 +U 10858 ; WX 838 ; N uni2A6A ; G 3060 +U 10859 ; WX 838 ; N uni2A6B ; G 3061 +U 11008 ; WX 838 ; N uni2B00 ; G 3062 +U 11009 ; WX 838 ; N uni2B01 ; G 3063 +U 11010 ; WX 838 ; N uni2B02 ; G 3064 +U 11011 ; WX 838 ; N uni2B03 ; G 3065 +U 11012 ; WX 838 ; N uni2B04 ; G 3066 +U 11013 ; WX 838 ; N uni2B05 ; G 3067 +U 11014 ; WX 838 ; N uni2B06 ; G 3068 +U 11015 ; WX 838 ; N uni2B07 ; G 3069 +U 11016 ; WX 838 ; N uni2B08 ; G 3070 +U 11017 ; WX 838 ; N uni2B09 ; G 3071 +U 11018 ; WX 838 ; N uni2B0A ; G 3072 +U 11019 ; WX 838 ; N uni2B0B ; G 3073 +U 11020 ; WX 838 ; N uni2B0C ; G 3074 +U 11021 ; WX 838 ; N uni2B0D ; G 3075 +U 11022 ; WX 838 ; N uni2B0E ; G 3076 +U 11023 ; WX 838 ; N uni2B0F ; G 3077 +U 11024 ; WX 838 ; N uni2B10 ; G 3078 +U 11025 ; WX 838 ; N uni2B11 ; G 3079 +U 11026 ; WX 945 ; N uni2B12 ; G 3080 +U 11027 ; WX 945 ; N uni2B13 ; G 3081 +U 11028 ; WX 945 ; N uni2B14 ; G 3082 +U 11029 ; WX 945 ; N uni2B15 ; G 3083 +U 11030 ; WX 769 ; N uni2B16 ; G 3084 +U 11031 ; WX 769 ; N uni2B17 ; G 3085 +U 11032 ; WX 769 ; N uni2B18 ; G 3086 +U 11033 ; WX 769 ; N uni2B19 ; G 3087 +U 11034 ; WX 945 ; N uni2B1A ; G 3088 +U 11360 ; WX 664 ; N uni2C60 ; G 3089 +U 11361 ; WX 320 ; N uni2C61 ; G 3090 +U 11363 ; WX 673 ; N uni2C63 ; G 3091 +U 11364 ; WX 753 ; N uni2C64 ; G 3092 +U 11367 ; WX 872 ; N uni2C67 ; G 3093 +U 11368 ; WX 644 ; N uni2C68 ; G 3094 +U 11369 ; WX 747 ; N uni2C69 ; G 3095 +U 11370 ; WX 606 ; N uni2C6A ; G 3096 +U 11371 ; WX 695 ; N uni2C6B ; G 3097 +U 11372 ; WX 527 ; N uni2C6C ; G 3098 +U 11373 ; WX 782 ; N uni2C6D ; G 3099 +U 11374 ; WX 1024 ; N uni2C6E ; G 3100 +U 11375 ; WX 722 ; N uni2C6F ; G 3101 +U 11376 ; WX 782 ; N uni2C70 ; G 3102 +U 11377 ; WX 663 ; N uni2C71 ; G 3103 +U 11378 ; WX 1130 ; N uni2C72 ; G 3104 +U 11379 ; WX 939 ; N uni2C73 ; G 3105 +U 11381 ; WX 740 ; N uni2C75 ; G 3106 +U 11382 ; WX 531 ; N uni2C76 ; G 3107 +U 11383 ; WX 700 ; N uni2C77 ; G 3108 +U 11385 ; WX 501 ; N uni2C79 ; G 3109 +U 11386 ; WX 602 ; N uni2C7A ; G 3110 +U 11387 ; WX 553 ; N uni2C7B ; G 3111 +U 11388 ; WX 264 ; N uni2C7C ; G 3112 +U 11389 ; WX 455 ; N uni2C7D ; G 3113 +U 11390 ; WX 685 ; N uni2C7E ; G 3114 +U 11391 ; WX 695 ; N uni2C7F ; G 3115 +U 11520 ; WX 773 ; N uni2D00 ; G 3116 +U 11521 ; WX 635 ; N uni2D01 ; G 3117 +U 11522 ; WX 633 ; N uni2D02 ; G 3118 +U 11523 ; WX 658 ; N uni2D03 ; G 3119 +U 11524 ; WX 631 ; N uni2D04 ; G 3120 +U 11525 ; WX 962 ; N uni2D05 ; G 3121 +U 11526 ; WX 756 ; N uni2D06 ; G 3122 +U 11527 ; WX 960 ; N uni2D07 ; G 3123 +U 11528 ; WX 617 ; N uni2D08 ; G 3124 +U 11529 ; WX 646 ; N uni2D09 ; G 3125 +U 11530 ; WX 962 ; N uni2D0A ; G 3126 +U 11531 ; WX 632 ; N uni2D0B ; G 3127 +U 11532 ; WX 646 ; N uni2D0C ; G 3128 +U 11533 ; WX 962 ; N uni2D0D ; G 3129 +U 11534 ; WX 645 ; N uni2D0E ; G 3130 +U 11535 ; WX 866 ; N uni2D0F ; G 3131 +U 11536 ; WX 961 ; N uni2D10 ; G 3132 +U 11537 ; WX 645 ; N uni2D11 ; G 3133 +U 11538 ; WX 645 ; N uni2D12 ; G 3134 +U 11539 ; WX 959 ; N uni2D13 ; G 3135 +U 11540 ; WX 945 ; N uni2D14 ; G 3136 +U 11541 ; WX 863 ; N uni2D15 ; G 3137 +U 11542 ; WX 644 ; N uni2D16 ; G 3138 +U 11543 ; WX 646 ; N uni2D17 ; G 3139 +U 11544 ; WX 645 ; N uni2D18 ; G 3140 +U 11545 ; WX 649 ; N uni2D19 ; G 3141 +U 11546 ; WX 688 ; N uni2D1A ; G 3142 +U 11547 ; WX 634 ; N uni2D1B ; G 3143 +U 11548 ; WX 982 ; N uni2D1C ; G 3144 +U 11549 ; WX 681 ; N uni2D1D ; G 3145 +U 11550 ; WX 676 ; N uni2D1E ; G 3146 +U 11551 ; WX 852 ; N uni2D1F ; G 3147 +U 11552 ; WX 957 ; N uni2D20 ; G 3148 +U 11553 ; WX 632 ; N uni2D21 ; G 3149 +U 11554 ; WX 645 ; N uni2D22 ; G 3150 +U 11555 ; WX 646 ; N uni2D23 ; G 3151 +U 11556 ; WX 749 ; N uni2D24 ; G 3152 +U 11557 ; WX 914 ; N uni2D25 ; G 3153 +U 11800 ; WX 536 ; N uni2E18 ; G 3154 +U 11807 ; WX 838 ; N uni2E1F ; G 3155 +U 11810 ; WX 390 ; N uni2E22 ; G 3156 +U 11811 ; WX 390 ; N uni2E23 ; G 3157 +U 11812 ; WX 390 ; N uni2E24 ; G 3158 +U 11813 ; WX 390 ; N uni2E25 ; G 3159 +U 11822 ; WX 536 ; N uni2E2E ; G 3160 +U 42564 ; WX 685 ; N uniA644 ; G 3161 +U 42565 ; WX 513 ; N uniA645 ; G 3162 +U 42566 ; WX 395 ; N uniA646 ; G 3163 +U 42567 ; WX 392 ; N uniA647 ; G 3164 +U 42576 ; WX 1104 ; N uniA650 ; G 3165 +U 42577 ; WX 939 ; N uniA651 ; G 3166 +U 42580 ; WX 1193 ; N uniA654 ; G 3167 +U 42581 ; WX 871 ; N uniA655 ; G 3168 +U 42582 ; WX 1140 ; N uniA656 ; G 3169 +U 42583 ; WX 875 ; N uniA657 ; G 3170 +U 42648 ; WX 1416 ; N uniA698 ; G 3171 +U 42649 ; WX 999 ; N uniA699 ; G 3172 +U 42760 ; WX 493 ; N uniA708 ; G 3173 +U 42761 ; WX 493 ; N uniA709 ; G 3174 +U 42762 ; WX 493 ; N uniA70A ; G 3175 +U 42763 ; WX 493 ; N uniA70B ; G 3176 +U 42764 ; WX 493 ; N uniA70C ; G 3177 +U 42765 ; WX 493 ; N uniA70D ; G 3178 +U 42766 ; WX 493 ; N uniA70E ; G 3179 +U 42767 ; WX 493 ; N uniA70F ; G 3180 +U 42768 ; WX 493 ; N uniA710 ; G 3181 +U 42769 ; WX 493 ; N uniA711 ; G 3182 +U 42770 ; WX 493 ; N uniA712 ; G 3183 +U 42771 ; WX 493 ; N uniA713 ; G 3184 +U 42772 ; WX 493 ; N uniA714 ; G 3185 +U 42773 ; WX 493 ; N uniA715 ; G 3186 +U 42774 ; WX 493 ; N uniA716 ; G 3187 +U 42779 ; WX 369 ; N uniA71B ; G 3188 +U 42780 ; WX 369 ; N uniA71C ; G 3189 +U 42781 ; WX 253 ; N uniA71D ; G 3190 +U 42782 ; WX 253 ; N uniA71E ; G 3191 +U 42783 ; WX 253 ; N uniA71F ; G 3192 +U 42790 ; WX 872 ; N uniA726 ; G 3193 +U 42791 ; WX 634 ; N uniA727 ; G 3194 +U 42792 ; WX 843 ; N uniA728 ; G 3195 +U 42793 ; WX 754 ; N uniA729 ; G 3196 +U 42794 ; WX 612 ; N uniA72A ; G 3197 +U 42795 ; WX 560 ; N uniA72B ; G 3198 +U 42796 ; WX 548 ; N uniA72C ; G 3199 +U 42797 ; WX 531 ; N uniA72D ; G 3200 +U 42798 ; WX 629 ; N uniA72E ; G 3201 +U 42799 ; WX 610 ; N uniA72F ; G 3202 +U 42800 ; WX 514 ; N uniA730 ; G 3203 +U 42801 ; WX 513 ; N uniA731 ; G 3204 +U 42802 ; WX 1195 ; N uniA732 ; G 3205 +U 42803 ; WX 943 ; N uniA733 ; G 3206 +U 42804 ; WX 1226 ; N uniA734 ; G 3207 +U 42805 ; WX 950 ; N uniA735 ; G 3208 +U 42806 ; WX 1149 ; N uniA736 ; G 3209 +U 42807 ; WX 933 ; N uniA737 ; G 3210 +U 42808 ; WX 968 ; N uniA738 ; G 3211 +U 42809 ; WX 784 ; N uniA739 ; G 3212 +U 42810 ; WX 968 ; N uniA73A ; G 3213 +U 42811 ; WX 784 ; N uniA73B ; G 3214 +U 42812 ; WX 962 ; N uniA73C ; G 3215 +U 42813 ; WX 759 ; N uniA73D ; G 3216 +U 42814 ; WX 765 ; N uniA73E ; G 3217 +U 42815 ; WX 560 ; N uniA73F ; G 3218 +U 42816 ; WX 747 ; N uniA740 ; G 3219 +U 42817 ; WX 606 ; N uniA741 ; G 3220 +U 42822 ; WX 787 ; N uniA746 ; G 3221 +U 42823 ; WX 434 ; N uniA747 ; G 3222 +U 42826 ; WX 932 ; N uniA74A ; G 3223 +U 42827 ; WX 711 ; N uniA74B ; G 3224 +U 42830 ; WX 1416 ; N uniA74E ; G 3225 +U 42831 ; WX 999 ; N uniA74F ; G 3226 +U 42856 ; WX 707 ; N uniA768 ; G 3227 +U 42857 ; WX 610 ; N uniA769 ; G 3228 +U 42875 ; WX 612 ; N uniA77B ; G 3229 +U 42876 ; WX 478 ; N uniA77C ; G 3230 +U 42880 ; WX 664 ; N uniA780 ; G 3231 +U 42881 ; WX 320 ; N uniA781 ; G 3232 +U 42882 ; WX 843 ; N uniA782 ; G 3233 +U 42883 ; WX 644 ; N uniA783 ; G 3234 +U 42884 ; WX 612 ; N uniA784 ; G 3235 +U 42885 ; WX 478 ; N uniA785 ; G 3236 +U 42886 ; WX 765 ; N uniA786 ; G 3237 +U 42887 ; WX 560 ; N uniA787 ; G 3238 +U 42891 ; WX 402 ; N uniA78B ; G 3239 +U 42892 ; WX 275 ; N uniA78C ; G 3240 +U 42893 ; WX 773 ; N uniA78D ; G 3241 +U 42896 ; WX 875 ; N uniA790 ; G 3242 +U 42897 ; WX 698 ; N uniA791 ; G 3243 +U 42922 ; WX 872 ; N uniA7AA ; G 3244 +U 43000 ; WX 549 ; N uniA7F8 ; G 3245 +U 43001 ; WX 623 ; N uniA7F9 ; G 3246 +U 43002 ; WX 957 ; N uniA7FA ; G 3247 +U 43003 ; WX 694 ; N uniA7FB ; G 3248 +U 43004 ; WX 673 ; N uniA7FC ; G 3249 +U 43005 ; WX 1024 ; N uniA7FD ; G 3250 +U 43006 ; WX 395 ; N uniA7FE ; G 3251 +U 43007 ; WX 1201 ; N uniA7FF ; G 3252 +U 62464 ; WX 664 ; N uniF400 ; G 3253 +U 62465 ; WX 675 ; N uniF401 ; G 3254 +U 62466 ; WX 724 ; N uniF402 ; G 3255 +U 62467 ; WX 958 ; N uniF403 ; G 3256 +U 62468 ; WX 675 ; N uniF404 ; G 3257 +U 62469 ; WX 669 ; N uniF405 ; G 3258 +U 62470 ; WX 735 ; N uniF406 ; G 3259 +U 62471 ; WX 997 ; N uniF407 ; G 3260 +U 62472 ; WX 675 ; N uniF408 ; G 3261 +U 62473 ; WX 675 ; N uniF409 ; G 3262 +U 62474 ; WX 1268 ; N uniF40A ; G 3263 +U 62475 ; WX 693 ; N uniF40B ; G 3264 +U 62476 ; WX 692 ; N uniF40C ; G 3265 +U 62477 ; WX 963 ; N uniF40D ; G 3266 +U 62478 ; WX 675 ; N uniF40E ; G 3267 +U 62479 ; WX 692 ; N uniF40F ; G 3268 +U 62480 ; WX 1009 ; N uniF410 ; G 3269 +U 62481 ; WX 756 ; N uniF411 ; G 3270 +U 62482 ; WX 809 ; N uniF412 ; G 3271 +U 62483 ; WX 758 ; N uniF413 ; G 3272 +U 62484 ; WX 955 ; N uniF414 ; G 3273 +U 62485 ; WX 691 ; N uniF415 ; G 3274 +U 62486 ; WX 946 ; N uniF416 ; G 3275 +U 62487 ; WX 690 ; N uniF417 ; G 3276 +U 62488 ; WX 698 ; N uniF418 ; G 3277 +U 62489 ; WX 692 ; N uniF419 ; G 3278 +U 62490 ; WX 739 ; N uniF41A ; G 3279 +U 62491 ; WX 692 ; N uniF41B ; G 3280 +U 62492 ; WX 698 ; N uniF41C ; G 3281 +U 62493 ; WX 676 ; N uniF41D ; G 3282 +U 62494 ; WX 739 ; N uniF41E ; G 3283 +U 62495 ; WX 895 ; N uniF41F ; G 3284 +U 62496 ; WX 675 ; N uniF420 ; G 3285 +U 62497 ; WX 785 ; N uniF421 ; G 3286 +U 62498 ; WX 676 ; N uniF422 ; G 3287 +U 62499 ; WX 675 ; N uniF423 ; G 3288 +U 62500 ; WX 675 ; N uniF424 ; G 3289 +U 62501 ; WX 732 ; N uniF425 ; G 3290 +U 62502 ; WX 972 ; N uniF426 ; G 3291 +U 62504 ; WX 904 ; N uniF428 ; G 3292 +U 63172 ; WX 320 ; N uniF6C4 ; G 3293 +U 63173 ; WX 602 ; N uniF6C5 ; G 3294 +U 63174 ; WX 640 ; N uniF6C6 ; G 3295 +U 63175 ; WX 644 ; N uniF6C7 ; G 3296 +U 63176 ; WX 947 ; N uniF6C8 ; G 3297 +U 63185 ; WX 500 ; N cyrBreve ; G 3298 +U 63188 ; WX 500 ; N cyrbreve ; G 3299 +U 64256 ; WX 708 ; N uniFB00 ; G 3300 +U 64257 ; WX 667 ; N fi ; G 3301 +U 64258 ; WX 667 ; N fl ; G 3302 +U 64259 ; WX 941 ; N uniFB03 ; G 3303 +U 64260 ; WX 986 ; N uniFB04 ; G 3304 +U 64261 ; WX 744 ; N uniFB05 ; G 3305 +U 64262 ; WX 916 ; N uniFB06 ; G 3306 +U 65024 ; WX 0 ; N uniFE00 ; G 3307 +U 65025 ; WX 0 ; N uniFE01 ; G 3308 +U 65026 ; WX 0 ; N uniFE02 ; G 3309 +U 65027 ; WX 0 ; N uniFE03 ; G 3310 +U 65028 ; WX 0 ; N uniFE04 ; G 3311 +U 65029 ; WX 0 ; N uniFE05 ; G 3312 +U 65030 ; WX 0 ; N uniFE06 ; G 3313 +U 65031 ; WX 0 ; N uniFE07 ; G 3314 +U 65032 ; WX 0 ; N uniFE08 ; G 3315 +U 65033 ; WX 0 ; N uniFE09 ; G 3316 +U 65034 ; WX 0 ; N uniFE0A ; G 3317 +U 65035 ; WX 0 ; N uniFE0B ; G 3318 +U 65036 ; WX 0 ; N uniFE0C ; G 3319 +U 65037 ; WX 0 ; N uniFE0D ; G 3320 +U 65038 ; WX 0 ; N uniFE0E ; G 3321 +U 65039 ; WX 0 ; N uniFE0F ; G 3322 +U 65529 ; WX 0 ; N uniFFF9 ; G 3323 +U 65530 ; WX 0 ; N uniFFFA ; G 3324 +U 65531 ; WX 0 ; N uniFFFB ; G 3325 +U 65532 ; WX 0 ; N uniFFFC ; G 3326 +U 65533 ; WX 1025 ; N uniFFFD ; G 3327 +EndCharMetrics +StartKernData +StartKernPairs 1103 + +KPX dollar seven -112 +KPX dollar nine -102 +KPX dollar colon -83 +KPX dollar less -83 +KPX dollar I -36 +KPX dollar W -36 +KPX dollar Y -83 +KPX dollar Z -92 +KPX dollar backslash -83 +KPX dollar questiondown -83 +KPX dollar Aacute -83 +KPX dollar Hbar -112 +KPX dollar hbar -36 +KPX dollar lacute -83 + +KPX percent ampersand 38 +KPX percent asterisk 38 +KPX percent two 38 +KPX percent less -36 +KPX percent Egrave 38 +KPX percent Icircumflex 38 +KPX percent agrave 38 +KPX percent Ebreve 38 +KPX percent lacute -36 + + +KPX quotesingle nine -36 + + +KPX parenright dollar -178 +KPX parenright D -139 +KPX parenright H -112 +KPX parenright R -112 +KPX parenright cent -139 +KPX parenright sterling -139 +KPX parenright currency -139 +KPX parenright yen -139 +KPX parenright brokenbar -139 +KPX parenright section -139 +KPX parenright dieresis -139 +KPX parenright ordfeminine -112 +KPX parenright guillemotleft -112 +KPX parenright logicalnot -112 +KPX parenright sfthyphen -112 +KPX parenright acute -112 +KPX parenright mu -112 +KPX parenright paragraph -112 +KPX parenright periodcentered -112 +KPX parenright cedilla -112 +KPX parenright ordmasculine -112 +KPX parenright Yacute -112 +KPX parenright ebreve -112 + +KPX asterisk less -36 +KPX asterisk lacute -36 + + +KPX period dollar -83 +KPX period ampersand -55 +KPX period two -55 +KPX period eight -73 +KPX period colon -73 +KPX period less -55 +KPX period H -55 +KPX period R -55 +KPX period X -45 +KPX period backslash -131 +KPX period ordfeminine -55 +KPX period guillemotleft -55 +KPX period logicalnot -55 +KPX period sfthyphen -55 +KPX period acute -55 +KPX period mu -55 +KPX period paragraph -55 +KPX period periodcentered -55 +KPX period cedilla -55 +KPX period ordmasculine -36 +KPX period guillemotright -45 +KPX period onequarter -45 +KPX period onehalf -45 +KPX period threequarters -45 +KPX period questiondown -131 +KPX period Aacute -131 +KPX period Egrave -55 +KPX period Icircumflex -55 +KPX period Yacute -55 +KPX period Ebreve -55 +KPX period ebreve -55 +KPX period Idot -73 +KPX period dotlessi -45 +KPX period lacute -55 + +KPX slash seven -167 +KPX slash eight -112 +KPX slash nine -243 +KPX slash colon -178 +KPX slash less -131 +KPX slash backslash -36 +KPX slash questiondown -36 +KPX slash Aacute -36 +KPX slash Hbar -167 +KPX slash Idot -112 +KPX slash lacute -131 + + +KPX two nine -36 +KPX two semicolon -36 + +KPX three dollar -188 +KPX three eight -36 +KPX three D -92 +KPX three H -92 +KPX three R -83 +KPX three V -55 +KPX three cent -92 +KPX three sterling -92 +KPX three currency -92 +KPX three yen -92 +KPX three brokenbar -92 +KPX three section -92 +KPX three dieresis -92 +KPX three ordfeminine -92 +KPX three guillemotleft -92 +KPX three logicalnot -92 +KPX three sfthyphen -92 +KPX three acute -83 +KPX three mu -83 +KPX three paragraph -83 +KPX three periodcentered -83 +KPX three cedilla -83 +KPX three ordmasculine -83 +KPX three Yacute -92 +KPX three ebreve -83 +KPX three gdotaccent -55 +KPX three gcommaaccent -55 +KPX three Idot -36 + + +KPX five seven -36 +KPX five nine -73 +KPX five colon -45 +KPX five less -63 +KPX five D 47 +KPX five backslash -36 +KPX five cent 47 +KPX five sterling 47 +KPX five currency 47 +KPX five yen 47 +KPX five brokenbar 47 +KPX five section 47 +KPX five dieresis 47 +KPX five ordmasculine 38 +KPX five questiondown -36 +KPX five Aacute -36 +KPX five Hbar -36 +KPX five lacute -63 + +KPX six six -36 +KPX six Gdotaccent -36 +KPX six Gcommaaccent -36 + +KPX seven dollar -112 +KPX seven seven 38 +KPX seven D -159 +KPX seven F -159 +KPX seven H -159 +KPX seven R -159 +KPX seven V -149 +KPX seven Z -73 +KPX seven cent -159 +KPX seven sterling -159 +KPX seven currency -159 +KPX seven yen -159 +KPX seven brokenbar -159 +KPX seven section -159 +KPX seven dieresis -159 +KPX seven copyright -159 +KPX seven ordfeminine -159 +KPX seven guillemotleft -159 +KPX seven logicalnot -159 +KPX seven sfthyphen -159 +KPX seven acute -159 +KPX seven mu -159 +KPX seven paragraph -159 +KPX seven periodcentered -159 +KPX seven cedilla -159 +KPX seven ordmasculine -159 +KPX seven Eacute -159 +KPX seven Idieresis -159 +KPX seven Yacute -159 +KPX seven ebreve -159 +KPX seven gdotaccent -149 +KPX seven gcommaaccent -149 +KPX seven Hbar 38 + +KPX eight dollar -63 +KPX eight hyphen -55 + +KPX nine dollar -139 +KPX nine two -36 +KPX nine D -188 +KPX nine H -188 +KPX nine L -36 +KPX nine R -188 +KPX nine X -131 +KPX nine backslash -83 +KPX nine cent -188 +KPX nine sterling -188 +KPX nine currency -188 +KPX nine yen -188 +KPX nine brokenbar -188 +KPX nine section -188 +KPX nine dieresis -188 +KPX nine ordfeminine -188 +KPX nine guillemotleft -188 +KPX nine logicalnot -188 +KPX nine sfthyphen -188 +KPX nine acute -188 +KPX nine mu -188 +KPX nine paragraph -188 +KPX nine periodcentered -188 +KPX nine cedilla -188 +KPX nine ordmasculine -188 +KPX nine guillemotright -131 +KPX nine onequarter -131 +KPX nine onehalf -131 +KPX nine threequarters -131 +KPX nine questiondown -83 +KPX nine Aacute -83 +KPX nine Yacute -188 +KPX nine Ebreve -36 +KPX nine ebreve -188 +KPX nine dotlessi -131 + +KPX colon dollar -102 +KPX colon D -178 +KPX colon H -167 +KPX colon L -36 +KPX colon R -139 +KPX colon U -92 +KPX colon X -83 +KPX colon backslash -45 +KPX colon cent -178 +KPX colon sterling -178 +KPX colon currency -178 +KPX colon yen -178 +KPX colon brokenbar -178 +KPX colon section -178 +KPX colon dieresis -139 +KPX colon ordfeminine -167 +KPX colon guillemotleft -167 +KPX colon logicalnot -167 +KPX colon sfthyphen -167 +KPX colon acute -139 +KPX colon mu -139 +KPX colon paragraph -139 +KPX colon periodcentered -139 +KPX colon cedilla -139 +KPX colon ordmasculine -139 +KPX colon guillemotright -83 +KPX colon onequarter -83 +KPX colon onehalf -83 +KPX colon threequarters -83 +KPX colon questiondown -45 +KPX colon Aacute -45 +KPX colon Yacute -167 +KPX colon ebreve -139 +KPX colon edotaccent -92 +KPX colon ecaron -92 +KPX colon dotlessi -83 + +KPX semicolon dollar -73 +KPX semicolon ampersand -36 +KPX semicolon two -36 +KPX semicolon Egrave -36 +KPX semicolon Icircumflex -36 +KPX semicolon Ebreve -36 + +KPX less dollar -159 +KPX less ampersand -36 +KPX less D -159 +KPX less H -178 +KPX less L -36 +KPX less R -178 +KPX less X -178 +KPX less cent -159 +KPX less sterling -159 +KPX less currency -159 +KPX less yen -159 +KPX less brokenbar -159 +KPX less section -159 +KPX less dieresis -196 +KPX less ordfeminine -178 +KPX less guillemotleft -178 +KPX less logicalnot -178 +KPX less sfthyphen -178 +KPX less acute -178 +KPX less mu -178 +KPX less paragraph -178 +KPX less periodcentered -178 +KPX less cedilla -178 +KPX less ordmasculine -178 +KPX less guillemotright -178 +KPX less onequarter -178 +KPX less onehalf -178 +KPX less threequarters -178 +KPX less Egrave -36 +KPX less Icircumflex -36 +KPX less Yacute -178 +KPX less ebreve -215 +KPX less dotlessi -178 + + + + + + + + + + + + + + + + + + + + + + + +KPX Eth nine -36 + + +KPX agrave less -36 +KPX agrave lacute -36 + +KPX ucircumflex seven -167 +KPX ucircumflex eight -112 +KPX ucircumflex nine -243 +KPX ucircumflex colon -178 +KPX ucircumflex less -131 +KPX ucircumflex backslash -36 +KPX ucircumflex questiondown -36 +KPX ucircumflex Aacute -36 +KPX ucircumflex Hbar -167 +KPX ucircumflex Idot -112 +KPX ucircumflex lacute -131 + +KPX ydieresis seven -167 +KPX ydieresis eight -112 +KPX ydieresis nine -243 +KPX ydieresis colon -178 +KPX ydieresis less -131 +KPX ydieresis backslash -36 +KPX ydieresis questiondown -36 +KPX ydieresis Aacute -36 +KPX ydieresis Hbar -167 +KPX ydieresis Idot -112 +KPX ydieresis lacute -131 + +KPX Abreve O -227 + +KPX abreve seven -167 +KPX abreve eight -36 +KPX abreve nine -243 +KPX abreve colon -178 +KPX abreve less -206 +KPX abreve backslash -36 +KPX abreve questiondown -36 +KPX abreve Aacute -36 +KPX abreve Hbar -167 +KPX abreve Idot -36 +KPX abreve lacute -206 + + + +KPX Edotaccent seven -36 +KPX Edotaccent nine -73 +KPX Edotaccent colon -45 +KPX Edotaccent less -63 +KPX Edotaccent D 47 +KPX Edotaccent backslash -36 +KPX Edotaccent cent 47 +KPX Edotaccent sterling 47 +KPX Edotaccent currency 47 +KPX Edotaccent yen 47 +KPX Edotaccent brokenbar 47 +KPX Edotaccent section 47 +KPX Edotaccent dieresis 47 +KPX Edotaccent ordmasculine 38 +KPX Edotaccent questiondown -36 +KPX Edotaccent Aacute -36 +KPX Edotaccent Hbar -36 +KPX Edotaccent lacute -63 + + +KPX Ecaron seven -36 +KPX Ecaron nine -73 +KPX Ecaron colon -45 +KPX Ecaron less -63 +KPX Ecaron D 47 +KPX Ecaron backslash -36 +KPX Ecaron cent 47 +KPX Ecaron sterling 47 +KPX Ecaron currency 47 +KPX Ecaron yen 47 +KPX Ecaron brokenbar 47 +KPX Ecaron section 47 +KPX Ecaron dieresis 47 +KPX Ecaron ordmasculine 38 +KPX Ecaron questiondown -36 +KPX Ecaron Aacute -36 +KPX Ecaron Hbar -36 +KPX Ecaron lacute -63 + + +KPX Gdotaccent six -36 +KPX Gdotaccent Gdotaccent -36 +KPX Gdotaccent Gcommaaccent -36 + +KPX Gcommaaccent six -36 +KPX Gcommaaccent Gdotaccent -36 +KPX Gcommaaccent Gcommaaccent -36 + +KPX Hbar dollar -112 +KPX Hbar seven 38 +KPX Hbar D -159 +KPX Hbar F -159 +KPX Hbar H -159 +KPX Hbar R -159 +KPX Hbar V -149 +KPX Hbar Z -73 +KPX Hbar cent -159 +KPX Hbar sterling -159 +KPX Hbar currency -159 +KPX Hbar yen -159 +KPX Hbar brokenbar -159 +KPX Hbar section -159 +KPX Hbar dieresis -159 +KPX Hbar copyright -159 +KPX Hbar ordfeminine -159 +KPX Hbar guillemotleft -159 +KPX Hbar logicalnot -159 +KPX Hbar sfthyphen -159 +KPX Hbar acute -159 +KPX Hbar mu -159 +KPX Hbar paragraph -159 +KPX Hbar periodcentered -159 +KPX Hbar cedilla -159 +KPX Hbar ordmasculine -159 +KPX Hbar Eacute -159 +KPX Hbar Idieresis -159 +KPX Hbar Yacute -159 +KPX Hbar ebreve -159 +KPX Hbar gdotaccent -149 +KPX Hbar gcommaaccent -149 +KPX Hbar Hbar 38 + +KPX Idot dollar -63 +KPX Idot hyphen -55 + +KPX kcommaaccent D 110 +KPX kcommaaccent F 85 +KPX kcommaaccent G 97 +KPX kcommaaccent H 86 +KPX kcommaaccent I 220 +KPX kcommaaccent J 97 +KPX kcommaaccent L 220 +KPX kcommaaccent M 218 +KPX kcommaaccent P 125 +KPX kcommaaccent Q 125 +KPX kcommaaccent R 85 +KPX kcommaaccent S 140 +KPX kcommaaccent T 97 +KPX kcommaaccent U 125 +KPX kcommaaccent V 155 +KPX kcommaaccent W 235 +KPX kcommaaccent X 144 +KPX kcommaaccent Y 205 +KPX kcommaaccent Z 166 +KPX kcommaaccent bracketleft 174 +KPX kcommaaccent backslash 205 +KPX kcommaaccent bracketright 179 +KPX kcommaaccent kcommaaccent 261 + +KPX lacute dollar -159 +KPX lacute ampersand -36 +KPX lacute D -159 +KPX lacute H -178 +KPX lacute L -36 +KPX lacute R -178 +KPX lacute X -178 +KPX lacute cent -159 +KPX lacute sterling -159 +KPX lacute currency -159 +KPX lacute yen -159 +KPX lacute brokenbar -159 +KPX lacute section -159 +KPX lacute dieresis -196 +KPX lacute ordfeminine -178 +KPX lacute guillemotleft -178 +KPX lacute logicalnot -178 +KPX lacute sfthyphen -178 +KPX lacute acute -178 +KPX lacute mu -178 +KPX lacute paragraph -178 +KPX lacute periodcentered -178 +KPX lacute cedilla -178 +KPX lacute ordmasculine -178 +KPX lacute guillemotright -178 +KPX lacute onequarter -178 +KPX lacute onehalf -178 +KPX lacute threequarters -178 +KPX lacute Egrave -36 +KPX lacute Icircumflex -36 +KPX lacute Yacute -178 +KPX lacute ebreve -215 +KPX lacute dotlessi -178 + + +KPX uni027D dollar -264 +KPX uni027D hyphen 47 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif.ttf b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif.ttf new file mode 100644 index 0000000..0b803d2 Binary files /dev/null and b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif.ttf differ diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif.ufm b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif.ufm new file mode 100644 index 0000000..358b026 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/DejaVuSerif.ufm @@ -0,0 +1,4012 @@ +StartFontMetrics 4.1 +Notice Converted by PHP-font-lib +Comment https://github.com/PhenX/php-font-lib +EncodingScheme FontSpecific +FontName DejaVu Serif +FontSubfamily Book +UniqueID DejaVu Serif +FullName DejaVu Serif +Version Version 2.37 +PostScriptName DejaVuSerif +Manufacturer DejaVu fonts team +FontVendorURL http://dejavu.sourceforge.net +LicenseURL http://dejavu.sourceforge.net/wiki/index.php/License +PreferredFamily DejaVu Serif +PreferredSubfamily Book +Weight Medium +ItalicAngle 0 +IsFixedPitch false +UnderlineThickness 44 +UnderlinePosition -63 +FontHeightOffset 0 +Ascender 928 +Descender -236 +FontBBox -770 -347 2105 1109 +StartCharMetrics 3528 +U 32 ; WX 318 ; N space ; G 3 +U 33 ; WX 402 ; N exclam ; G 4 +U 34 ; WX 460 ; N quotedbl ; G 5 +U 35 ; WX 838 ; N numbersign ; G 6 +U 36 ; WX 636 ; N dollar ; G 7 +U 37 ; WX 950 ; N percent ; G 8 +U 38 ; WX 890 ; N ampersand ; G 9 +U 39 ; WX 275 ; N quotesingle ; G 10 +U 40 ; WX 390 ; N parenleft ; G 11 +U 41 ; WX 390 ; N parenright ; G 12 +U 42 ; WX 500 ; N asterisk ; G 13 +U 43 ; WX 838 ; N plus ; G 14 +U 44 ; WX 318 ; N comma ; G 15 +U 45 ; WX 338 ; N hyphen ; G 16 +U 46 ; WX 318 ; N period ; G 17 +U 47 ; WX 337 ; N slash ; G 18 +U 48 ; WX 636 ; N zero ; G 19 +U 49 ; WX 636 ; N one ; G 20 +U 50 ; WX 636 ; N two ; G 21 +U 51 ; WX 636 ; N three ; G 22 +U 52 ; WX 636 ; N four ; G 23 +U 53 ; WX 636 ; N five ; G 24 +U 54 ; WX 636 ; N six ; G 25 +U 55 ; WX 636 ; N seven ; G 26 +U 56 ; WX 636 ; N eight ; G 27 +U 57 ; WX 636 ; N nine ; G 28 +U 58 ; WX 337 ; N colon ; G 29 +U 59 ; WX 337 ; N semicolon ; G 30 +U 60 ; WX 838 ; N less ; G 31 +U 61 ; WX 838 ; N equal ; G 32 +U 62 ; WX 838 ; N greater ; G 33 +U 63 ; WX 536 ; N question ; G 34 +U 64 ; WX 1000 ; N at ; G 35 +U 65 ; WX 722 ; N A ; G 36 +U 66 ; WX 735 ; N B ; G 37 +U 67 ; WX 765 ; N C ; G 38 +U 68 ; WX 802 ; N D ; G 39 +U 69 ; WX 730 ; N E ; G 40 +U 70 ; WX 694 ; N F ; G 41 +U 71 ; WX 799 ; N G ; G 42 +U 72 ; WX 872 ; N H ; G 43 +U 73 ; WX 395 ; N I ; G 44 +U 74 ; WX 401 ; N J ; G 45 +U 75 ; WX 747 ; N K ; G 46 +U 76 ; WX 664 ; N L ; G 47 +U 77 ; WX 1024 ; N M ; G 48 +U 78 ; WX 875 ; N N ; G 49 +U 79 ; WX 820 ; N O ; G 50 +U 80 ; WX 673 ; N P ; G 51 +U 81 ; WX 820 ; N Q ; G 52 +U 82 ; WX 753 ; N R ; G 53 +U 83 ; WX 685 ; N S ; G 54 +U 84 ; WX 667 ; N T ; G 55 +U 85 ; WX 843 ; N U ; G 56 +U 86 ; WX 722 ; N V ; G 57 +U 87 ; WX 1028 ; N W ; G 58 +U 88 ; WX 712 ; N X ; G 59 +U 89 ; WX 660 ; N Y ; G 60 +U 90 ; WX 695 ; N Z ; G 61 +U 91 ; WX 390 ; N bracketleft ; G 62 +U 92 ; WX 337 ; N backslash ; G 63 +U 93 ; WX 390 ; N bracketright ; G 64 +U 94 ; WX 838 ; N asciicircum ; G 65 +U 95 ; WX 500 ; N underscore ; G 66 +U 96 ; WX 500 ; N grave ; G 67 +U 97 ; WX 596 ; N a ; G 68 +U 98 ; WX 640 ; N b ; G 69 +U 99 ; WX 560 ; N c ; G 70 +U 100 ; WX 640 ; N d ; G 71 +U 101 ; WX 592 ; N e ; G 72 +U 102 ; WX 370 ; N f ; G 73 +U 103 ; WX 640 ; N g ; G 74 +U 104 ; WX 644 ; N h ; G 75 +U 105 ; WX 320 ; N i ; G 76 +U 106 ; WX 310 ; N j ; G 77 +U 107 ; WX 606 ; N k ; G 78 +U 108 ; WX 320 ; N l ; G 79 +U 109 ; WX 948 ; N m ; G 80 +U 110 ; WX 644 ; N n ; G 81 +U 111 ; WX 602 ; N o ; G 82 +U 112 ; WX 640 ; N p ; G 83 +U 113 ; WX 640 ; N q ; G 84 +U 114 ; WX 478 ; N r ; G 85 +U 115 ; WX 513 ; N s ; G 86 +U 116 ; WX 402 ; N t ; G 87 +U 117 ; WX 644 ; N u ; G 88 +U 118 ; WX 565 ; N v ; G 89 +U 119 ; WX 856 ; N w ; G 90 +U 120 ; WX 564 ; N x ; G 91 +U 121 ; WX 565 ; N y ; G 92 +U 122 ; WX 527 ; N z ; G 93 +U 123 ; WX 636 ; N braceleft ; G 94 +U 124 ; WX 337 ; N bar ; G 95 +U 125 ; WX 636 ; N braceright ; G 96 +U 126 ; WX 838 ; N asciitilde ; G 97 +U 160 ; WX 318 ; N nbspace ; G 98 +U 161 ; WX 402 ; N exclamdown ; G 99 +U 162 ; WX 636 ; N cent ; G 100 +U 163 ; WX 636 ; N sterling ; G 101 +U 164 ; WX 636 ; N currency ; G 102 +U 165 ; WX 636 ; N yen ; G 103 +U 166 ; WX 337 ; N brokenbar ; G 104 +U 167 ; WX 500 ; N section ; G 105 +U 168 ; WX 500 ; N dieresis ; G 106 +U 169 ; WX 1000 ; N copyright ; G 107 +U 170 ; WX 475 ; N ordfeminine ; G 108 +U 171 ; WX 612 ; N guillemotleft ; G 109 +U 172 ; WX 838 ; N logicalnot ; G 110 +U 173 ; WX 338 ; N sfthyphen ; G 111 +U 174 ; WX 1000 ; N registered ; G 112 +U 175 ; WX 500 ; N macron ; G 113 +U 176 ; WX 500 ; N degree ; G 114 +U 177 ; WX 838 ; N plusminus ; G 115 +U 178 ; WX 401 ; N twosuperior ; G 116 +U 179 ; WX 401 ; N threesuperior ; G 117 +U 180 ; WX 500 ; N acute ; G 118 +U 181 ; WX 650 ; N mu ; G 119 +U 182 ; WX 636 ; N paragraph ; G 120 +U 183 ; WX 318 ; N periodcentered ; G 121 +U 184 ; WX 500 ; N cedilla ; G 122 +U 185 ; WX 401 ; N onesuperior ; G 123 +U 186 ; WX 470 ; N ordmasculine ; G 124 +U 187 ; WX 612 ; N guillemotright ; G 125 +U 188 ; WX 969 ; N onequarter ; G 126 +U 189 ; WX 969 ; N onehalf ; G 127 +U 190 ; WX 969 ; N threequarters ; G 128 +U 191 ; WX 536 ; N questiondown ; G 129 +U 192 ; WX 722 ; N Agrave ; G 130 +U 193 ; WX 722 ; N Aacute ; G 131 +U 194 ; WX 722 ; N Acircumflex ; G 132 +U 195 ; WX 722 ; N Atilde ; G 133 +U 196 ; WX 722 ; N Adieresis ; G 134 +U 197 ; WX 722 ; N Aring ; G 135 +U 198 ; WX 1001 ; N AE ; G 136 +U 199 ; WX 765 ; N Ccedilla ; G 137 +U 200 ; WX 730 ; N Egrave ; G 138 +U 201 ; WX 730 ; N Eacute ; G 139 +U 202 ; WX 730 ; N Ecircumflex ; G 140 +U 203 ; WX 730 ; N Edieresis ; G 141 +U 204 ; WX 395 ; N Igrave ; G 142 +U 205 ; WX 395 ; N Iacute ; G 143 +U 206 ; WX 395 ; N Icircumflex ; G 144 +U 207 ; WX 395 ; N Idieresis ; G 145 +U 208 ; WX 807 ; N Eth ; G 146 +U 209 ; WX 875 ; N Ntilde ; G 147 +U 210 ; WX 820 ; N Ograve ; G 148 +U 211 ; WX 820 ; N Oacute ; G 149 +U 212 ; WX 820 ; N Ocircumflex ; G 150 +U 213 ; WX 820 ; N Otilde ; G 151 +U 214 ; WX 820 ; N Odieresis ; G 152 +U 215 ; WX 838 ; N multiply ; G 153 +U 216 ; WX 820 ; N Oslash ; G 154 +U 217 ; WX 843 ; N Ugrave ; G 155 +U 218 ; WX 843 ; N Uacute ; G 156 +U 219 ; WX 843 ; N Ucircumflex ; G 157 +U 220 ; WX 843 ; N Udieresis ; G 158 +U 221 ; WX 660 ; N Yacute ; G 159 +U 222 ; WX 676 ; N Thorn ; G 160 +U 223 ; WX 668 ; N germandbls ; G 161 +U 224 ; WX 596 ; N agrave ; G 162 +U 225 ; WX 596 ; N aacute ; G 163 +U 226 ; WX 596 ; N acircumflex ; G 164 +U 227 ; WX 596 ; N atilde ; G 165 +U 228 ; WX 596 ; N adieresis ; G 166 +U 229 ; WX 596 ; N aring ; G 167 +U 230 ; WX 940 ; N ae ; G 168 +U 231 ; WX 560 ; N ccedilla ; G 169 +U 232 ; WX 592 ; N egrave ; G 170 +U 233 ; WX 592 ; N eacute ; G 171 +U 234 ; WX 592 ; N ecircumflex ; G 172 +U 235 ; WX 592 ; N edieresis ; G 173 +U 236 ; WX 320 ; N igrave ; G 174 +U 237 ; WX 320 ; N iacute ; G 175 +U 238 ; WX 320 ; N icircumflex ; G 176 +U 239 ; WX 320 ; N idieresis ; G 177 +U 240 ; WX 602 ; N eth ; G 178 +U 241 ; WX 644 ; N ntilde ; G 179 +U 242 ; WX 602 ; N ograve ; G 180 +U 243 ; WX 602 ; N oacute ; G 181 +U 244 ; WX 602 ; N ocircumflex ; G 182 +U 245 ; WX 602 ; N otilde ; G 183 +U 246 ; WX 602 ; N odieresis ; G 184 +U 247 ; WX 838 ; N divide ; G 185 +U 248 ; WX 602 ; N oslash ; G 186 +U 249 ; WX 644 ; N ugrave ; G 187 +U 250 ; WX 644 ; N uacute ; G 188 +U 251 ; WX 644 ; N ucircumflex ; G 189 +U 252 ; WX 644 ; N udieresis ; G 190 +U 253 ; WX 565 ; N yacute ; G 191 +U 254 ; WX 640 ; N thorn ; G 192 +U 255 ; WX 565 ; N ydieresis ; G 193 +U 256 ; WX 722 ; N Amacron ; G 194 +U 257 ; WX 596 ; N amacron ; G 195 +U 258 ; WX 722 ; N Abreve ; G 196 +U 259 ; WX 596 ; N abreve ; G 197 +U 260 ; WX 722 ; N Aogonek ; G 198 +U 261 ; WX 596 ; N aogonek ; G 199 +U 262 ; WX 765 ; N Cacute ; G 200 +U 263 ; WX 560 ; N cacute ; G 201 +U 264 ; WX 765 ; N Ccircumflex ; G 202 +U 265 ; WX 560 ; N ccircumflex ; G 203 +U 266 ; WX 765 ; N Cdotaccent ; G 204 +U 267 ; WX 560 ; N cdotaccent ; G 205 +U 268 ; WX 765 ; N Ccaron ; G 206 +U 269 ; WX 560 ; N ccaron ; G 207 +U 270 ; WX 802 ; N Dcaron ; G 208 +U 271 ; WX 640 ; N dcaron ; G 209 +U 272 ; WX 807 ; N Dcroat ; G 210 +U 273 ; WX 640 ; N dmacron ; G 211 +U 274 ; WX 730 ; N Emacron ; G 212 +U 275 ; WX 592 ; N emacron ; G 213 +U 276 ; WX 730 ; N Ebreve ; G 214 +U 277 ; WX 592 ; N ebreve ; G 215 +U 278 ; WX 730 ; N Edotaccent ; G 216 +U 279 ; WX 592 ; N edotaccent ; G 217 +U 280 ; WX 730 ; N Eogonek ; G 218 +U 281 ; WX 592 ; N eogonek ; G 219 +U 282 ; WX 730 ; N Ecaron ; G 220 +U 283 ; WX 592 ; N ecaron ; G 221 +U 284 ; WX 799 ; N Gcircumflex ; G 222 +U 285 ; WX 640 ; N gcircumflex ; G 223 +U 286 ; WX 799 ; N Gbreve ; G 224 +U 287 ; WX 640 ; N gbreve ; G 225 +U 288 ; WX 799 ; N Gdotaccent ; G 226 +U 289 ; WX 640 ; N gdotaccent ; G 227 +U 290 ; WX 799 ; N Gcommaaccent ; G 228 +U 291 ; WX 640 ; N gcommaaccent ; G 229 +U 292 ; WX 872 ; N Hcircumflex ; G 230 +U 293 ; WX 644 ; N hcircumflex ; G 231 +U 294 ; WX 872 ; N Hbar ; G 232 +U 295 ; WX 644 ; N hbar ; G 233 +U 296 ; WX 395 ; N Itilde ; G 234 +U 297 ; WX 320 ; N itilde ; G 235 +U 298 ; WX 395 ; N Imacron ; G 236 +U 299 ; WX 320 ; N imacron ; G 237 +U 300 ; WX 395 ; N Ibreve ; G 238 +U 301 ; WX 320 ; N ibreve ; G 239 +U 302 ; WX 395 ; N Iogonek ; G 240 +U 303 ; WX 320 ; N iogonek ; G 241 +U 304 ; WX 395 ; N Idot ; G 242 +U 305 ; WX 320 ; N dotlessi ; G 243 +U 306 ; WX 801 ; N IJ ; G 244 +U 307 ; WX 533 ; N ij ; G 245 +U 308 ; WX 401 ; N Jcircumflex ; G 246 +U 309 ; WX 310 ; N jcircumflex ; G 247 +U 310 ; WX 747 ; N Kcommaaccent ; G 248 +U 311 ; WX 606 ; N kcommaaccent ; G 249 +U 312 ; WX 606 ; N kgreenlandic ; G 250 +U 313 ; WX 664 ; N Lacute ; G 251 +U 314 ; WX 320 ; N lacute ; G 252 +U 315 ; WX 664 ; N Lcommaaccent ; G 253 +U 316 ; WX 320 ; N lcommaaccent ; G 254 +U 317 ; WX 664 ; N Lcaron ; G 255 +U 318 ; WX 320 ; N lcaron ; G 256 +U 319 ; WX 664 ; N Ldot ; G 257 +U 320 ; WX 320 ; N ldot ; G 258 +U 321 ; WX 669 ; N Lslash ; G 259 +U 322 ; WX 324 ; N lslash ; G 260 +U 323 ; WX 875 ; N Nacute ; G 261 +U 324 ; WX 644 ; N nacute ; G 262 +U 325 ; WX 875 ; N Ncommaaccent ; G 263 +U 326 ; WX 644 ; N ncommaaccent ; G 264 +U 327 ; WX 875 ; N Ncaron ; G 265 +U 328 ; WX 644 ; N ncaron ; G 266 +U 329 ; WX 866 ; N napostrophe ; G 267 +U 330 ; WX 843 ; N Eng ; G 268 +U 331 ; WX 644 ; N eng ; G 269 +U 332 ; WX 820 ; N Omacron ; G 270 +U 333 ; WX 602 ; N omacron ; G 271 +U 334 ; WX 820 ; N Obreve ; G 272 +U 335 ; WX 602 ; N obreve ; G 273 +U 336 ; WX 820 ; N Ohungarumlaut ; G 274 +U 337 ; WX 602 ; N ohungarumlaut ; G 275 +U 338 ; WX 1137 ; N OE ; G 276 +U 339 ; WX 989 ; N oe ; G 277 +U 340 ; WX 753 ; N Racute ; G 278 +U 341 ; WX 478 ; N racute ; G 279 +U 342 ; WX 753 ; N Rcommaaccent ; G 280 +U 343 ; WX 478 ; N rcommaaccent ; G 281 +U 344 ; WX 753 ; N Rcaron ; G 282 +U 345 ; WX 478 ; N rcaron ; G 283 +U 346 ; WX 685 ; N Sacute ; G 284 +U 347 ; WX 513 ; N sacute ; G 285 +U 348 ; WX 685 ; N Scircumflex ; G 286 +U 349 ; WX 513 ; N scircumflex ; G 287 +U 350 ; WX 685 ; N Scedilla ; G 288 +U 351 ; WX 513 ; N scedilla ; G 289 +U 352 ; WX 685 ; N Scaron ; G 290 +U 353 ; WX 513 ; N scaron ; G 291 +U 354 ; WX 667 ; N Tcommaaccent ; G 292 +U 355 ; WX 402 ; N tcommaaccent ; G 293 +U 356 ; WX 667 ; N Tcaron ; G 294 +U 357 ; WX 402 ; N tcaron ; G 295 +U 358 ; WX 667 ; N Tbar ; G 296 +U 359 ; WX 402 ; N tbar ; G 297 +U 360 ; WX 843 ; N Utilde ; G 298 +U 361 ; WX 644 ; N utilde ; G 299 +U 362 ; WX 843 ; N Umacron ; G 300 +U 363 ; WX 644 ; N umacron ; G 301 +U 364 ; WX 843 ; N Ubreve ; G 302 +U 365 ; WX 644 ; N ubreve ; G 303 +U 366 ; WX 843 ; N Uring ; G 304 +U 367 ; WX 644 ; N uring ; G 305 +U 368 ; WX 843 ; N Uhungarumlaut ; G 306 +U 369 ; WX 644 ; N uhungarumlaut ; G 307 +U 370 ; WX 843 ; N Uogonek ; G 308 +U 371 ; WX 644 ; N uogonek ; G 309 +U 372 ; WX 1028 ; N Wcircumflex ; G 310 +U 373 ; WX 856 ; N wcircumflex ; G 311 +U 374 ; WX 660 ; N Ycircumflex ; G 312 +U 375 ; WX 565 ; N ycircumflex ; G 313 +U 376 ; WX 660 ; N Ydieresis ; G 314 +U 377 ; WX 695 ; N Zacute ; G 315 +U 378 ; WX 527 ; N zacute ; G 316 +U 379 ; WX 695 ; N Zdotaccent ; G 317 +U 380 ; WX 527 ; N zdotaccent ; G 318 +U 381 ; WX 695 ; N Zcaron ; G 319 +U 382 ; WX 527 ; N zcaron ; G 320 +U 383 ; WX 370 ; N longs ; G 321 +U 384 ; WX 640 ; N uni0180 ; G 322 +U 385 ; WX 735 ; N uni0181 ; G 323 +U 386 ; WX 735 ; N uni0182 ; G 324 +U 387 ; WX 640 ; N uni0183 ; G 325 +U 388 ; WX 735 ; N uni0184 ; G 326 +U 389 ; WX 640 ; N uni0185 ; G 327 +U 390 ; WX 765 ; N uni0186 ; G 328 +U 391 ; WX 765 ; N uni0187 ; G 329 +U 392 ; WX 560 ; N uni0188 ; G 330 +U 393 ; WX 807 ; N uni0189 ; G 331 +U 394 ; WX 802 ; N uni018A ; G 332 +U 395 ; WX 735 ; N uni018B ; G 333 +U 396 ; WX 640 ; N uni018C ; G 334 +U 397 ; WX 602 ; N uni018D ; G 335 +U 398 ; WX 730 ; N uni018E ; G 336 +U 399 ; WX 820 ; N uni018F ; G 337 +U 400 ; WX 623 ; N uni0190 ; G 338 +U 401 ; WX 694 ; N uni0191 ; G 339 +U 402 ; WX 370 ; N florin ; G 340 +U 403 ; WX 799 ; N uni0193 ; G 341 +U 404 ; WX 712 ; N uni0194 ; G 342 +U 405 ; WX 932 ; N uni0195 ; G 343 +U 406 ; WX 395 ; N uni0196 ; G 344 +U 407 ; WX 395 ; N uni0197 ; G 345 +U 408 ; WX 747 ; N uni0198 ; G 346 +U 409 ; WX 606 ; N uni0199 ; G 347 +U 410 ; WX 320 ; N uni019A ; G 348 +U 411 ; WX 634 ; N uni019B ; G 349 +U 412 ; WX 948 ; N uni019C ; G 350 +U 413 ; WX 875 ; N uni019D ; G 351 +U 414 ; WX 644 ; N uni019E ; G 352 +U 415 ; WX 820 ; N uni019F ; G 353 +U 416 ; WX 820 ; N Ohorn ; G 354 +U 417 ; WX 602 ; N ohorn ; G 355 +U 418 ; WX 1040 ; N uni01A2 ; G 356 +U 419 ; WX 807 ; N uni01A3 ; G 357 +U 420 ; WX 673 ; N uni01A4 ; G 358 +U 421 ; WX 640 ; N uni01A5 ; G 359 +U 422 ; WX 753 ; N uni01A6 ; G 360 +U 423 ; WX 685 ; N uni01A7 ; G 361 +U 424 ; WX 513 ; N uni01A8 ; G 362 +U 425 ; WX 707 ; N uni01A9 ; G 363 +U 426 ; WX 324 ; N uni01AA ; G 364 +U 427 ; WX 402 ; N uni01AB ; G 365 +U 428 ; WX 667 ; N uni01AC ; G 366 +U 429 ; WX 402 ; N uni01AD ; G 367 +U 430 ; WX 667 ; N uni01AE ; G 368 +U 431 ; WX 843 ; N Uhorn ; G 369 +U 432 ; WX 644 ; N uhorn ; G 370 +U 433 ; WX 829 ; N uni01B1 ; G 371 +U 434 ; WX 760 ; N uni01B2 ; G 372 +U 435 ; WX 738 ; N uni01B3 ; G 373 +U 436 ; WX 663 ; N uni01B4 ; G 374 +U 437 ; WX 695 ; N uni01B5 ; G 375 +U 438 ; WX 527 ; N uni01B6 ; G 376 +U 439 ; WX 564 ; N uni01B7 ; G 377 +U 440 ; WX 564 ; N uni01B8 ; G 378 +U 441 ; WX 564 ; N uni01B9 ; G 379 +U 442 ; WX 564 ; N uni01BA ; G 380 +U 443 ; WX 636 ; N uni01BB ; G 381 +U 444 ; WX 687 ; N uni01BC ; G 382 +U 445 ; WX 564 ; N uni01BD ; G 383 +U 446 ; WX 536 ; N uni01BE ; G 384 +U 447 ; WX 635 ; N uni01BF ; G 385 +U 448 ; WX 295 ; N uni01C0 ; G 386 +U 449 ; WX 492 ; N uni01C1 ; G 387 +U 450 ; WX 459 ; N uni01C2 ; G 388 +U 451 ; WX 295 ; N uni01C3 ; G 389 +U 452 ; WX 1497 ; N uni01C4 ; G 390 +U 453 ; WX 1329 ; N uni01C5 ; G 391 +U 454 ; WX 1167 ; N uni01C6 ; G 392 +U 455 ; WX 1065 ; N uni01C7 ; G 393 +U 456 ; WX 974 ; N uni01C8 ; G 394 +U 457 ; WX 630 ; N uni01C9 ; G 395 +U 458 ; WX 1276 ; N uni01CA ; G 396 +U 459 ; WX 1185 ; N uni01CB ; G 397 +U 460 ; WX 954 ; N uni01CC ; G 398 +U 461 ; WX 722 ; N uni01CD ; G 399 +U 462 ; WX 596 ; N uni01CE ; G 400 +U 463 ; WX 395 ; N uni01CF ; G 401 +U 464 ; WX 320 ; N uni01D0 ; G 402 +U 465 ; WX 820 ; N uni01D1 ; G 403 +U 466 ; WX 602 ; N uni01D2 ; G 404 +U 467 ; WX 843 ; N uni01D3 ; G 405 +U 468 ; WX 644 ; N uni01D4 ; G 406 +U 469 ; WX 843 ; N uni01D5 ; G 407 +U 470 ; WX 644 ; N uni01D6 ; G 408 +U 471 ; WX 843 ; N uni01D7 ; G 409 +U 472 ; WX 644 ; N uni01D8 ; G 410 +U 473 ; WX 843 ; N uni01D9 ; G 411 +U 474 ; WX 644 ; N uni01DA ; G 412 +U 475 ; WX 843 ; N uni01DB ; G 413 +U 476 ; WX 644 ; N uni01DC ; G 414 +U 477 ; WX 592 ; N uni01DD ; G 415 +U 478 ; WX 722 ; N uni01DE ; G 416 +U 479 ; WX 596 ; N uni01DF ; G 417 +U 480 ; WX 722 ; N uni01E0 ; G 418 +U 481 ; WX 596 ; N uni01E1 ; G 419 +U 482 ; WX 1001 ; N uni01E2 ; G 420 +U 483 ; WX 940 ; N uni01E3 ; G 421 +U 484 ; WX 848 ; N uni01E4 ; G 422 +U 485 ; WX 640 ; N uni01E5 ; G 423 +U 486 ; WX 799 ; N Gcaron ; G 424 +U 487 ; WX 640 ; N gcaron ; G 425 +U 488 ; WX 747 ; N uni01E8 ; G 426 +U 489 ; WX 606 ; N uni01E9 ; G 427 +U 490 ; WX 820 ; N uni01EA ; G 428 +U 491 ; WX 602 ; N uni01EB ; G 429 +U 492 ; WX 820 ; N uni01EC ; G 430 +U 493 ; WX 602 ; N uni01ED ; G 431 +U 494 ; WX 564 ; N uni01EE ; G 432 +U 495 ; WX 564 ; N uni01EF ; G 433 +U 496 ; WX 320 ; N uni01F0 ; G 434 +U 497 ; WX 1497 ; N uni01F1 ; G 435 +U 498 ; WX 1329 ; N uni01F2 ; G 436 +U 499 ; WX 1167 ; N uni01F3 ; G 437 +U 500 ; WX 799 ; N uni01F4 ; G 438 +U 501 ; WX 640 ; N uni01F5 ; G 439 +U 502 ; WX 1154 ; N uni01F6 ; G 440 +U 503 ; WX 707 ; N uni01F7 ; G 441 +U 504 ; WX 875 ; N uni01F8 ; G 442 +U 505 ; WX 644 ; N uni01F9 ; G 443 +U 506 ; WX 722 ; N Aringacute ; G 444 +U 507 ; WX 596 ; N aringacute ; G 445 +U 508 ; WX 1001 ; N AEacute ; G 446 +U 509 ; WX 940 ; N aeacute ; G 447 +U 510 ; WX 820 ; N Oslashacute ; G 448 +U 511 ; WX 602 ; N oslashacute ; G 449 +U 512 ; WX 722 ; N uni0200 ; G 450 +U 513 ; WX 596 ; N uni0201 ; G 451 +U 514 ; WX 722 ; N uni0202 ; G 452 +U 515 ; WX 596 ; N uni0203 ; G 453 +U 516 ; WX 730 ; N uni0204 ; G 454 +U 517 ; WX 592 ; N uni0205 ; G 455 +U 518 ; WX 730 ; N uni0206 ; G 456 +U 519 ; WX 592 ; N uni0207 ; G 457 +U 520 ; WX 395 ; N uni0208 ; G 458 +U 521 ; WX 320 ; N uni0209 ; G 459 +U 522 ; WX 395 ; N uni020A ; G 460 +U 523 ; WX 320 ; N uni020B ; G 461 +U 524 ; WX 820 ; N uni020C ; G 462 +U 525 ; WX 602 ; N uni020D ; G 463 +U 526 ; WX 820 ; N uni020E ; G 464 +U 527 ; WX 602 ; N uni020F ; G 465 +U 528 ; WX 753 ; N uni0210 ; G 466 +U 529 ; WX 478 ; N uni0211 ; G 467 +U 530 ; WX 753 ; N uni0212 ; G 468 +U 531 ; WX 478 ; N uni0213 ; G 469 +U 532 ; WX 843 ; N uni0214 ; G 470 +U 533 ; WX 644 ; N uni0215 ; G 471 +U 534 ; WX 843 ; N uni0216 ; G 472 +U 535 ; WX 644 ; N uni0217 ; G 473 +U 536 ; WX 685 ; N Scommaaccent ; G 474 +U 537 ; WX 513 ; N scommaaccent ; G 475 +U 538 ; WX 667 ; N uni021A ; G 476 +U 539 ; WX 402 ; N uni021B ; G 477 +U 540 ; WX 627 ; N uni021C ; G 478 +U 541 ; WX 521 ; N uni021D ; G 479 +U 542 ; WX 872 ; N uni021E ; G 480 +U 543 ; WX 644 ; N uni021F ; G 481 +U 544 ; WX 843 ; N uni0220 ; G 482 +U 545 ; WX 814 ; N uni0221 ; G 483 +U 546 ; WX 572 ; N uni0222 ; G 484 +U 547 ; WX 552 ; N uni0223 ; G 485 +U 548 ; WX 695 ; N uni0224 ; G 486 +U 549 ; WX 527 ; N uni0225 ; G 487 +U 550 ; WX 722 ; N uni0226 ; G 488 +U 551 ; WX 596 ; N uni0227 ; G 489 +U 552 ; WX 730 ; N uni0228 ; G 490 +U 553 ; WX 592 ; N uni0229 ; G 491 +U 554 ; WX 820 ; N uni022A ; G 492 +U 555 ; WX 602 ; N uni022B ; G 493 +U 556 ; WX 820 ; N uni022C ; G 494 +U 557 ; WX 602 ; N uni022D ; G 495 +U 558 ; WX 820 ; N uni022E ; G 496 +U 559 ; WX 602 ; N uni022F ; G 497 +U 560 ; WX 820 ; N uni0230 ; G 498 +U 561 ; WX 602 ; N uni0231 ; G 499 +U 562 ; WX 660 ; N uni0232 ; G 500 +U 563 ; WX 565 ; N uni0233 ; G 501 +U 564 ; WX 500 ; N uni0234 ; G 502 +U 565 ; WX 832 ; N uni0235 ; G 503 +U 566 ; WX 494 ; N uni0236 ; G 504 +U 567 ; WX 310 ; N dotlessj ; G 505 +U 568 ; WX 960 ; N uni0238 ; G 506 +U 569 ; WX 960 ; N uni0239 ; G 507 +U 570 ; WX 722 ; N uni023A ; G 508 +U 571 ; WX 765 ; N uni023B ; G 509 +U 572 ; WX 560 ; N uni023C ; G 510 +U 573 ; WX 664 ; N uni023D ; G 511 +U 574 ; WX 667 ; N uni023E ; G 512 +U 575 ; WX 513 ; N uni023F ; G 513 +U 576 ; WX 527 ; N uni0240 ; G 514 +U 577 ; WX 583 ; N uni0241 ; G 515 +U 578 ; WX 464 ; N uni0242 ; G 516 +U 579 ; WX 735 ; N uni0243 ; G 517 +U 580 ; WX 843 ; N uni0244 ; G 518 +U 581 ; WX 722 ; N uni0245 ; G 519 +U 582 ; WX 730 ; N uni0246 ; G 520 +U 583 ; WX 592 ; N uni0247 ; G 521 +U 584 ; WX 401 ; N uni0248 ; G 522 +U 585 ; WX 315 ; N uni0249 ; G 523 +U 586 ; WX 782 ; N uni024A ; G 524 +U 587 ; WX 640 ; N uni024B ; G 525 +U 588 ; WX 753 ; N uni024C ; G 526 +U 589 ; WX 478 ; N uni024D ; G 527 +U 590 ; WX 660 ; N uni024E ; G 528 +U 591 ; WX 565 ; N uni024F ; G 529 +U 592 ; WX 596 ; N uni0250 ; G 530 +U 593 ; WX 640 ; N uni0251 ; G 531 +U 594 ; WX 640 ; N uni0252 ; G 532 +U 595 ; WX 640 ; N uni0253 ; G 533 +U 596 ; WX 560 ; N uni0254 ; G 534 +U 597 ; WX 560 ; N uni0255 ; G 535 +U 598 ; WX 647 ; N uni0256 ; G 536 +U 599 ; WX 683 ; N uni0257 ; G 537 +U 600 ; WX 592 ; N uni0258 ; G 538 +U 601 ; WX 592 ; N uni0259 ; G 539 +U 602 ; WX 843 ; N uni025A ; G 540 +U 603 ; WX 518 ; N uni025B ; G 541 +U 604 ; WX 509 ; N uni025C ; G 542 +U 605 ; WX 773 ; N uni025D ; G 543 +U 606 ; WX 613 ; N uni025E ; G 544 +U 607 ; WX 315 ; N uni025F ; G 545 +U 608 ; WX 683 ; N uni0260 ; G 546 +U 609 ; WX 640 ; N uni0261 ; G 547 +U 610 ; WX 580 ; N uni0262 ; G 548 +U 611 ; WX 599 ; N uni0263 ; G 549 +U 612 ; WX 564 ; N uni0264 ; G 550 +U 613 ; WX 644 ; N uni0265 ; G 551 +U 614 ; WX 644 ; N uni0266 ; G 552 +U 615 ; WX 644 ; N uni0267 ; G 553 +U 616 ; WX 320 ; N uni0268 ; G 554 +U 617 ; WX 392 ; N uni0269 ; G 555 +U 618 ; WX 320 ; N uni026A ; G 556 +U 619 ; WX 380 ; N uni026B ; G 557 +U 620 ; WX 454 ; N uni026C ; G 558 +U 621 ; WX 363 ; N uni026D ; G 559 +U 622 ; WX 704 ; N uni026E ; G 560 +U 623 ; WX 948 ; N uni026F ; G 561 +U 624 ; WX 948 ; N uni0270 ; G 562 +U 625 ; WX 948 ; N uni0271 ; G 563 +U 626 ; WX 644 ; N uni0272 ; G 564 +U 627 ; WX 694 ; N uni0273 ; G 565 +U 628 ; WX 646 ; N uni0274 ; G 566 +U 629 ; WX 602 ; N uni0275 ; G 567 +U 630 ; WX 790 ; N uni0276 ; G 568 +U 631 ; WX 821 ; N uni0277 ; G 569 +U 632 ; WX 692 ; N uni0278 ; G 570 +U 633 ; WX 501 ; N uni0279 ; G 571 +U 634 ; WX 501 ; N uni027A ; G 572 +U 635 ; WX 551 ; N uni027B ; G 573 +U 636 ; WX 478 ; N uni027C ; G 574 +U 637 ; WX 478 ; N uni027D ; G 575 +U 638 ; WX 453 ; N uni027E ; G 576 +U 639 ; WX 453 ; N uni027F ; G 577 +U 640 ; WX 581 ; N uni0280 ; G 578 +U 641 ; WX 581 ; N uni0281 ; G 579 +U 642 ; WX 513 ; N uni0282 ; G 580 +U 643 ; WX 271 ; N uni0283 ; G 581 +U 644 ; WX 370 ; N uni0284 ; G 582 +U 645 ; WX 487 ; N uni0285 ; G 583 +U 646 ; WX 324 ; N uni0286 ; G 584 +U 647 ; WX 402 ; N uni0287 ; G 585 +U 648 ; WX 402 ; N uni0288 ; G 586 +U 649 ; WX 644 ; N uni0289 ; G 587 +U 650 ; WX 620 ; N uni028A ; G 588 +U 651 ; WX 608 ; N uni028B ; G 589 +U 652 ; WX 565 ; N uni028C ; G 590 +U 653 ; WX 856 ; N uni028D ; G 591 +U 654 ; WX 565 ; N uni028E ; G 592 +U 655 ; WX 655 ; N uni028F ; G 593 +U 656 ; WX 597 ; N uni0290 ; G 594 +U 657 ; WX 560 ; N uni0291 ; G 595 +U 658 ; WX 564 ; N uni0292 ; G 596 +U 659 ; WX 560 ; N uni0293 ; G 597 +U 660 ; WX 536 ; N uni0294 ; G 598 +U 661 ; WX 536 ; N uni0295 ; G 599 +U 662 ; WX 536 ; N uni0296 ; G 600 +U 663 ; WX 420 ; N uni0297 ; G 601 +U 664 ; WX 820 ; N uni0298 ; G 602 +U 665 ; WX 563 ; N uni0299 ; G 603 +U 666 ; WX 613 ; N uni029A ; G 604 +U 667 ; WX 660 ; N uni029B ; G 605 +U 668 ; WX 667 ; N uni029C ; G 606 +U 669 ; WX 366 ; N uni029D ; G 607 +U 670 ; WX 606 ; N uni029E ; G 608 +U 671 ; WX 543 ; N uni029F ; G 609 +U 672 ; WX 683 ; N uni02A0 ; G 610 +U 673 ; WX 536 ; N uni02A1 ; G 611 +U 674 ; WX 536 ; N uni02A2 ; G 612 +U 675 ; WX 996 ; N uni02A3 ; G 613 +U 676 ; WX 1033 ; N uni02A4 ; G 614 +U 677 ; WX 998 ; N uni02A5 ; G 615 +U 678 ; WX 823 ; N uni02A6 ; G 616 +U 679 ; WX 598 ; N uni02A7 ; G 617 +U 680 ; WX 825 ; N uni02A8 ; G 618 +U 681 ; WX 894 ; N uni02A9 ; G 619 +U 682 ; WX 725 ; N uni02AA ; G 620 +U 683 ; WX 676 ; N uni02AB ; G 621 +U 684 ; WX 598 ; N uni02AC ; G 622 +U 685 ; WX 443 ; N uni02AD ; G 623 +U 686 ; WX 781 ; N uni02AE ; G 624 +U 687 ; WX 767 ; N uni02AF ; G 625 +U 688 ; WX 433 ; N uni02B0 ; G 626 +U 689 ; WX 430 ; N uni02B1 ; G 627 +U 690 ; WX 264 ; N uni02B2 ; G 628 +U 691 ; WX 347 ; N uni02B3 ; G 629 +U 692 ; WX 347 ; N uni02B4 ; G 630 +U 693 ; WX 430 ; N uni02B5 ; G 631 +U 694 ; WX 392 ; N uni02B6 ; G 632 +U 695 ; WX 585 ; N uni02B7 ; G 633 +U 696 ; WX 423 ; N uni02B8 ; G 634 +U 697 ; WX 278 ; N uni02B9 ; G 635 +U 698 ; WX 460 ; N uni02BA ; G 636 +U 699 ; WX 318 ; N uni02BB ; G 637 +U 700 ; WX 318 ; N uni02BC ; G 638 +U 701 ; WX 318 ; N uni02BD ; G 639 +U 702 ; WX 307 ; N uni02BE ; G 640 +U 703 ; WX 307 ; N uni02BF ; G 641 +U 704 ; WX 280 ; N uni02C0 ; G 642 +U 705 ; WX 281 ; N uni02C1 ; G 643 +U 706 ; WX 500 ; N uni02C2 ; G 644 +U 707 ; WX 500 ; N uni02C3 ; G 645 +U 708 ; WX 500 ; N uni02C4 ; G 646 +U 709 ; WX 500 ; N uni02C5 ; G 647 +U 710 ; WX 500 ; N circumflex ; G 648 +U 711 ; WX 500 ; N caron ; G 649 +U 712 ; WX 275 ; N uni02C8 ; G 650 +U 713 ; WX 500 ; N uni02C9 ; G 651 +U 714 ; WX 500 ; N uni02CA ; G 652 +U 715 ; WX 500 ; N uni02CB ; G 653 +U 716 ; WX 275 ; N uni02CC ; G 654 +U 717 ; WX 500 ; N uni02CD ; G 655 +U 720 ; WX 337 ; N uni02D0 ; G 656 +U 721 ; WX 337 ; N uni02D1 ; G 657 +U 722 ; WX 307 ; N uni02D2 ; G 658 +U 723 ; WX 307 ; N uni02D3 ; G 659 +U 726 ; WX 329 ; N uni02D6 ; G 660 +U 727 ; WX 329 ; N uni02D7 ; G 661 +U 728 ; WX 500 ; N breve ; G 662 +U 729 ; WX 500 ; N dotaccent ; G 663 +U 730 ; WX 500 ; N ring ; G 664 +U 731 ; WX 500 ; N ogonek ; G 665 +U 732 ; WX 500 ; N tilde ; G 666 +U 733 ; WX 500 ; N hungarumlaut ; G 667 +U 734 ; WX 417 ; N uni02DE ; G 668 +U 736 ; WX 377 ; N uni02E0 ; G 669 +U 737 ; WX 243 ; N uni02E1 ; G 670 +U 738 ; WX 337 ; N uni02E2 ; G 671 +U 739 ; WX 424 ; N uni02E3 ; G 672 +U 740 ; WX 281 ; N uni02E4 ; G 673 +U 741 ; WX 493 ; N uni02E5 ; G 674 +U 742 ; WX 493 ; N uni02E6 ; G 675 +U 743 ; WX 493 ; N uni02E7 ; G 676 +U 744 ; WX 493 ; N uni02E8 ; G 677 +U 745 ; WX 493 ; N uni02E9 ; G 678 +U 748 ; WX 500 ; N uni02EC ; G 679 +U 750 ; WX 484 ; N uni02EE ; G 680 +U 751 ; WX 500 ; N uni02EF ; G 681 +U 752 ; WX 500 ; N uni02F0 ; G 682 +U 755 ; WX 500 ; N uni02F3 ; G 683 +U 759 ; WX 500 ; N uni02F7 ; G 684 +U 768 ; WX 0 ; N gravecomb ; G 685 +U 769 ; WX 0 ; N acutecomb ; G 686 +U 770 ; WX 0 ; N uni0302 ; G 687 +U 771 ; WX 0 ; N tildecomb ; G 688 +U 772 ; WX 0 ; N uni0304 ; G 689 +U 773 ; WX 0 ; N uni0305 ; G 690 +U 774 ; WX 0 ; N uni0306 ; G 691 +U 775 ; WX 0 ; N uni0307 ; G 692 +U 776 ; WX 0 ; N uni0308 ; G 693 +U 777 ; WX 0 ; N hookabovecomb ; G 694 +U 778 ; WX 0 ; N uni030A ; G 695 +U 779 ; WX 0 ; N uni030B ; G 696 +U 780 ; WX 0 ; N uni030C ; G 697 +U 781 ; WX 0 ; N uni030D ; G 698 +U 782 ; WX 0 ; N uni030E ; G 699 +U 783 ; WX 0 ; N uni030F ; G 700 +U 784 ; WX 0 ; N uni0310 ; G 701 +U 785 ; WX 0 ; N uni0311 ; G 702 +U 786 ; WX 0 ; N uni0312 ; G 703 +U 787 ; WX 0 ; N uni0313 ; G 704 +U 788 ; WX 0 ; N uni0314 ; G 705 +U 789 ; WX 0 ; N uni0315 ; G 706 +U 790 ; WX 0 ; N uni0316 ; G 707 +U 791 ; WX 0 ; N uni0317 ; G 708 +U 792 ; WX 0 ; N uni0318 ; G 709 +U 793 ; WX 0 ; N uni0319 ; G 710 +U 794 ; WX 0 ; N uni031A ; G 711 +U 795 ; WX 0 ; N uni031B ; G 712 +U 796 ; WX 0 ; N uni031C ; G 713 +U 797 ; WX 0 ; N uni031D ; G 714 +U 798 ; WX 0 ; N uni031E ; G 715 +U 799 ; WX 0 ; N uni031F ; G 716 +U 800 ; WX 0 ; N uni0320 ; G 717 +U 801 ; WX 0 ; N uni0321 ; G 718 +U 802 ; WX 0 ; N uni0322 ; G 719 +U 803 ; WX 0 ; N dotbelowcomb ; G 720 +U 804 ; WX 0 ; N uni0324 ; G 721 +U 805 ; WX 0 ; N uni0325 ; G 722 +U 806 ; WX 0 ; N uni0326 ; G 723 +U 807 ; WX 0 ; N uni0327 ; G 724 +U 808 ; WX 0 ; N uni0328 ; G 725 +U 809 ; WX 0 ; N uni0329 ; G 726 +U 810 ; WX 0 ; N uni032A ; G 727 +U 811 ; WX 0 ; N uni032B ; G 728 +U 812 ; WX 0 ; N uni032C ; G 729 +U 813 ; WX 0 ; N uni032D ; G 730 +U 814 ; WX 0 ; N uni032E ; G 731 +U 815 ; WX 0 ; N uni032F ; G 732 +U 816 ; WX 0 ; N uni0330 ; G 733 +U 817 ; WX 0 ; N uni0331 ; G 734 +U 818 ; WX 0 ; N uni0332 ; G 735 +U 819 ; WX 0 ; N uni0333 ; G 736 +U 820 ; WX 0 ; N uni0334 ; G 737 +U 821 ; WX 0 ; N uni0335 ; G 738 +U 822 ; WX 0 ; N uni0336 ; G 739 +U 823 ; WX 0 ; N uni0337 ; G 740 +U 824 ; WX 0 ; N uni0338 ; G 741 +U 825 ; WX 0 ; N uni0339 ; G 742 +U 826 ; WX 0 ; N uni033A ; G 743 +U 827 ; WX 0 ; N uni033B ; G 744 +U 828 ; WX 0 ; N uni033C ; G 745 +U 829 ; WX 0 ; N uni033D ; G 746 +U 830 ; WX 0 ; N uni033E ; G 747 +U 831 ; WX 0 ; N uni033F ; G 748 +U 835 ; WX 0 ; N uni0343 ; G 749 +U 847 ; WX 0 ; N uni034F ; G 750 +U 856 ; WX 0 ; N uni0358 ; G 751 +U 864 ; WX 0 ; N uni0360 ; G 752 +U 865 ; WX 0 ; N uni0361 ; G 753 +U 880 ; WX 740 ; N uni0370 ; G 754 +U 881 ; WX 531 ; N uni0371 ; G 755 +U 882 ; WX 667 ; N uni0372 ; G 756 +U 883 ; WX 553 ; N uni0373 ; G 757 +U 884 ; WX 278 ; N uni0374 ; G 758 +U 885 ; WX 278 ; N uni0375 ; G 759 +U 886 ; WX 875 ; N uni0376 ; G 760 +U 887 ; WX 667 ; N uni0377 ; G 761 +U 890 ; WX 500 ; N uni037A ; G 762 +U 891 ; WX 560 ; N uni037B ; G 763 +U 892 ; WX 560 ; N uni037C ; G 764 +U 893 ; WX 560 ; N uni037D ; G 765 +U 894 ; WX 337 ; N uni037E ; G 766 +U 895 ; WX 401 ; N uni037F ; G 767 +U 900 ; WX 500 ; N tonos ; G 768 +U 901 ; WX 500 ; N dieresistonos ; G 769 +U 902 ; WX 722 ; N Alphatonos ; G 770 +U 903 ; WX 318 ; N anoteleia ; G 771 +U 904 ; WX 900 ; N Epsilontonos ; G 772 +U 905 ; WX 1039 ; N Etatonos ; G 773 +U 906 ; WX 562 ; N Iotatonos ; G 774 +U 908 ; WX 835 ; N Omicrontonos ; G 775 +U 910 ; WX 897 ; N Upsilontonos ; G 776 +U 911 ; WX 853 ; N Omegatonos ; G 777 +U 912 ; WX 392 ; N iotadieresistonos ; G 778 +U 913 ; WX 722 ; N Alpha ; G 779 +U 914 ; WX 735 ; N Beta ; G 780 +U 915 ; WX 694 ; N Gamma ; G 781 +U 916 ; WX 722 ; N uni0394 ; G 782 +U 917 ; WX 730 ; N Epsilon ; G 783 +U 918 ; WX 695 ; N Zeta ; G 784 +U 919 ; WX 872 ; N Eta ; G 785 +U 920 ; WX 820 ; N Theta ; G 786 +U 921 ; WX 395 ; N Iota ; G 787 +U 922 ; WX 747 ; N Kappa ; G 788 +U 923 ; WX 722 ; N Lambda ; G 789 +U 924 ; WX 1024 ; N Mu ; G 790 +U 925 ; WX 875 ; N Nu ; G 791 +U 926 ; WX 704 ; N Xi ; G 792 +U 927 ; WX 820 ; N Omicron ; G 793 +U 928 ; WX 872 ; N Pi ; G 794 +U 929 ; WX 673 ; N Rho ; G 795 +U 931 ; WX 707 ; N Sigma ; G 796 +U 932 ; WX 667 ; N Tau ; G 797 +U 933 ; WX 660 ; N Upsilon ; G 798 +U 934 ; WX 820 ; N Phi ; G 799 +U 935 ; WX 712 ; N Chi ; G 800 +U 936 ; WX 877 ; N Psi ; G 801 +U 937 ; WX 829 ; N Omega ; G 802 +U 938 ; WX 395 ; N Iotadieresis ; G 803 +U 939 ; WX 660 ; N Upsilondieresis ; G 804 +U 940 ; WX 675 ; N alphatonos ; G 805 +U 941 ; WX 518 ; N epsilontonos ; G 806 +U 942 ; WX 599 ; N etatonos ; G 807 +U 943 ; WX 392 ; N iotatonos ; G 808 +U 944 ; WX 608 ; N upsilondieresistonos ; G 809 +U 945 ; WX 675 ; N alpha ; G 810 +U 946 ; WX 578 ; N beta ; G 811 +U 947 ; WX 598 ; N gamma ; G 812 +U 948 ; WX 602 ; N delta ; G 813 +U 949 ; WX 518 ; N epsilon ; G 814 +U 950 ; WX 542 ; N zeta ; G 815 +U 951 ; WX 599 ; N eta ; G 816 +U 952 ; WX 602 ; N theta ; G 817 +U 953 ; WX 392 ; N iota ; G 818 +U 954 ; WX 625 ; N kappa ; G 819 +U 955 ; WX 634 ; N lambda ; G 820 +U 956 ; WX 650 ; N uni03BC ; G 821 +U 957 ; WX 608 ; N nu ; G 822 +U 958 ; WX 551 ; N xi ; G 823 +U 959 ; WX 602 ; N omicron ; G 824 +U 960 ; WX 657 ; N pi ; G 825 +U 961 ; WX 588 ; N rho ; G 826 +U 962 ; WX 560 ; N sigma1 ; G 827 +U 963 ; WX 683 ; N sigma ; G 828 +U 964 ; WX 553 ; N tau ; G 829 +U 965 ; WX 608 ; N upsilon ; G 830 +U 966 ; WX 700 ; N phi ; G 831 +U 967 ; WX 606 ; N chi ; G 832 +U 968 ; WX 784 ; N psi ; G 833 +U 969 ; WX 815 ; N omega ; G 834 +U 970 ; WX 392 ; N iotadieresis ; G 835 +U 971 ; WX 608 ; N upsilondieresis ; G 836 +U 972 ; WX 602 ; N omicrontonos ; G 837 +U 973 ; WX 608 ; N upsilontonos ; G 838 +U 974 ; WX 815 ; N omegatonos ; G 839 +U 975 ; WX 747 ; N uni03CF ; G 840 +U 976 ; WX 583 ; N uni03D0 ; G 841 +U 977 ; WX 715 ; N theta1 ; G 842 +U 978 ; WX 687 ; N Upsilon1 ; G 843 +U 979 ; WX 874 ; N uni03D3 ; G 844 +U 980 ; WX 687 ; N uni03D4 ; G 845 +U 981 ; WX 682 ; N phi1 ; G 846 +U 982 ; WX 815 ; N omega1 ; G 847 +U 983 ; WX 624 ; N uni03D7 ; G 848 +U 984 ; WX 820 ; N uni03D8 ; G 849 +U 985 ; WX 602 ; N uni03D9 ; G 850 +U 986 ; WX 765 ; N uni03DA ; G 851 +U 987 ; WX 560 ; N uni03DB ; G 852 +U 988 ; WX 694 ; N uni03DC ; G 853 +U 989 ; WX 463 ; N uni03DD ; G 854 +U 990 ; WX 590 ; N uni03DE ; G 855 +U 991 ; WX 660 ; N uni03DF ; G 856 +U 992 ; WX 782 ; N uni03E0 ; G 857 +U 993 ; WX 577 ; N uni03E1 ; G 858 +U 1008 ; WX 624 ; N uni03F0 ; G 859 +U 1009 ; WX 588 ; N uni03F1 ; G 860 +U 1010 ; WX 560 ; N uni03F2 ; G 861 +U 1011 ; WX 310 ; N uni03F3 ; G 862 +U 1012 ; WX 820 ; N uni03F4 ; G 863 +U 1013 ; WX 560 ; N uni03F5 ; G 864 +U 1014 ; WX 560 ; N uni03F6 ; G 865 +U 1015 ; WX 676 ; N uni03F7 ; G 866 +U 1016 ; WX 640 ; N uni03F8 ; G 867 +U 1017 ; WX 765 ; N uni03F9 ; G 868 +U 1018 ; WX 1024 ; N uni03FA ; G 869 +U 1019 ; WX 708 ; N uni03FB ; G 870 +U 1020 ; WX 588 ; N uni03FC ; G 871 +U 1021 ; WX 765 ; N uni03FD ; G 872 +U 1022 ; WX 765 ; N uni03FE ; G 873 +U 1023 ; WX 765 ; N uni03FF ; G 874 +U 1024 ; WX 730 ; N uni0400 ; G 875 +U 1025 ; WX 730 ; N uni0401 ; G 876 +U 1026 ; WX 799 ; N uni0402 ; G 877 +U 1027 ; WX 662 ; N uni0403 ; G 878 +U 1028 ; WX 765 ; N uni0404 ; G 879 +U 1029 ; WX 685 ; N uni0405 ; G 880 +U 1030 ; WX 395 ; N uni0406 ; G 881 +U 1031 ; WX 395 ; N uni0407 ; G 882 +U 1032 ; WX 401 ; N uni0408 ; G 883 +U 1033 ; WX 1084 ; N uni0409 ; G 884 +U 1034 ; WX 1118 ; N uni040A ; G 885 +U 1035 ; WX 872 ; N uni040B ; G 886 +U 1036 ; WX 774 ; N uni040C ; G 887 +U 1037 ; WX 872 ; N uni040D ; G 888 +U 1038 ; WX 723 ; N uni040E ; G 889 +U 1039 ; WX 872 ; N uni040F ; G 890 +U 1040 ; WX 757 ; N uni0410 ; G 891 +U 1041 ; WX 735 ; N uni0411 ; G 892 +U 1042 ; WX 735 ; N uni0412 ; G 893 +U 1043 ; WX 662 ; N uni0413 ; G 894 +U 1044 ; WX 813 ; N uni0414 ; G 895 +U 1045 ; WX 730 ; N uni0415 ; G 896 +U 1046 ; WX 1124 ; N uni0416 ; G 897 +U 1047 ; WX 623 ; N uni0417 ; G 898 +U 1048 ; WX 872 ; N uni0418 ; G 899 +U 1049 ; WX 872 ; N uni0419 ; G 900 +U 1050 ; WX 774 ; N uni041A ; G 901 +U 1051 ; WX 834 ; N uni041B ; G 902 +U 1052 ; WX 1024 ; N uni041C ; G 903 +U 1053 ; WX 872 ; N uni041D ; G 904 +U 1054 ; WX 820 ; N uni041E ; G 905 +U 1055 ; WX 872 ; N uni041F ; G 906 +U 1056 ; WX 673 ; N uni0420 ; G 907 +U 1057 ; WX 765 ; N uni0421 ; G 908 +U 1058 ; WX 667 ; N uni0422 ; G 909 +U 1059 ; WX 723 ; N uni0423 ; G 910 +U 1060 ; WX 830 ; N uni0424 ; G 911 +U 1061 ; WX 712 ; N uni0425 ; G 912 +U 1062 ; WX 872 ; N uni0426 ; G 913 +U 1063 ; WX 773 ; N uni0427 ; G 914 +U 1064 ; WX 1141 ; N uni0428 ; G 915 +U 1065 ; WX 1141 ; N uni0429 ; G 916 +U 1066 ; WX 794 ; N uni042A ; G 917 +U 1067 ; WX 984 ; N uni042B ; G 918 +U 1068 ; WX 674 ; N uni042C ; G 919 +U 1069 ; WX 765 ; N uni042D ; G 920 +U 1070 ; WX 1193 ; N uni042E ; G 921 +U 1071 ; WX 808 ; N uni042F ; G 922 +U 1072 ; WX 596 ; N uni0430 ; G 923 +U 1073 ; WX 602 ; N uni0431 ; G 924 +U 1074 ; WX 563 ; N uni0432 ; G 925 +U 1075 ; WX 524 ; N uni0433 ; G 926 +U 1076 ; WX 616 ; N uni0434 ; G 927 +U 1077 ; WX 592 ; N uni0435 ; G 928 +U 1078 ; WX 920 ; N uni0436 ; G 929 +U 1079 ; WX 545 ; N uni0437 ; G 930 +U 1080 ; WX 667 ; N uni0438 ; G 931 +U 1081 ; WX 667 ; N uni0439 ; G 932 +U 1082 ; WX 625 ; N uni043A ; G 933 +U 1083 ; WX 635 ; N uni043B ; G 934 +U 1084 ; WX 778 ; N uni043C ; G 935 +U 1085 ; WX 667 ; N uni043D ; G 936 +U 1086 ; WX 602 ; N uni043E ; G 937 +U 1087 ; WX 667 ; N uni043F ; G 938 +U 1088 ; WX 640 ; N uni0440 ; G 939 +U 1089 ; WX 560 ; N uni0441 ; G 940 +U 1090 ; WX 553 ; N uni0442 ; G 941 +U 1091 ; WX 588 ; N uni0443 ; G 942 +U 1092 ; WX 783 ; N uni0444 ; G 943 +U 1093 ; WX 564 ; N uni0445 ; G 944 +U 1094 ; WX 643 ; N uni0446 ; G 945 +U 1095 ; WX 661 ; N uni0447 ; G 946 +U 1096 ; WX 930 ; N uni0448 ; G 947 +U 1097 ; WX 930 ; N uni0449 ; G 948 +U 1098 ; WX 636 ; N uni044A ; G 949 +U 1099 ; WX 796 ; N uni044B ; G 950 +U 1100 ; WX 544 ; N uni044C ; G 951 +U 1101 ; WX 560 ; N uni044D ; G 952 +U 1102 ; WX 871 ; N uni044E ; G 953 +U 1103 ; WX 631 ; N uni044F ; G 954 +U 1104 ; WX 592 ; N uni0450 ; G 955 +U 1105 ; WX 592 ; N uni0451 ; G 956 +U 1106 ; WX 624 ; N uni0452 ; G 957 +U 1107 ; WX 524 ; N uni0453 ; G 958 +U 1108 ; WX 560 ; N uni0454 ; G 959 +U 1109 ; WX 513 ; N uni0455 ; G 960 +U 1110 ; WX 320 ; N uni0456 ; G 961 +U 1111 ; WX 320 ; N uni0457 ; G 962 +U 1112 ; WX 310 ; N uni0458 ; G 963 +U 1113 ; WX 843 ; N uni0459 ; G 964 +U 1114 ; WX 860 ; N uni045A ; G 965 +U 1115 ; WX 644 ; N uni045B ; G 966 +U 1116 ; WX 625 ; N uni045C ; G 967 +U 1117 ; WX 667 ; N uni045D ; G 968 +U 1118 ; WX 588 ; N uni045E ; G 969 +U 1119 ; WX 656 ; N uni045F ; G 970 +U 1122 ; WX 762 ; N uni0462 ; G 971 +U 1123 ; WX 603 ; N uni0463 ; G 972 +U 1124 ; WX 1129 ; N uni0464 ; G 973 +U 1125 ; WX 834 ; N uni0465 ; G 974 +U 1130 ; WX 1124 ; N uni046A ; G 975 +U 1131 ; WX 920 ; N uni046B ; G 976 +U 1132 ; WX 1359 ; N uni046C ; G 977 +U 1133 ; WX 1113 ; N uni046D ; G 978 +U 1136 ; WX 944 ; N uni0470 ; G 979 +U 1137 ; WX 902 ; N uni0471 ; G 980 +U 1138 ; WX 820 ; N uni0472 ; G 981 +U 1139 ; WX 552 ; N uni0473 ; G 982 +U 1140 ; WX 859 ; N uni0474 ; G 983 +U 1141 ; WX 678 ; N uni0475 ; G 984 +U 1142 ; WX 859 ; N uni0476 ; G 985 +U 1143 ; WX 678 ; N uni0477 ; G 986 +U 1164 ; WX 707 ; N uni048C ; G 987 +U 1165 ; WX 544 ; N uni048D ; G 988 +U 1168 ; WX 672 ; N uni0490 ; G 989 +U 1169 ; WX 529 ; N uni0491 ; G 990 +U 1170 ; WX 662 ; N uni0492 ; G 991 +U 1171 ; WX 523 ; N uni0493 ; G 992 +U 1172 ; WX 728 ; N uni0494 ; G 993 +U 1173 ; WX 614 ; N uni0495 ; G 994 +U 1174 ; WX 1124 ; N uni0496 ; G 995 +U 1175 ; WX 920 ; N uni0497 ; G 996 +U 1176 ; WX 636 ; N uni0498 ; G 997 +U 1177 ; WX 537 ; N uni0499 ; G 998 +U 1178 ; WX 774 ; N uni049A ; G 999 +U 1179 ; WX 606 ; N uni049B ; G 1000 +U 1182 ; WX 774 ; N uni049E ; G 1001 +U 1183 ; WX 625 ; N uni049F ; G 1002 +U 1184 ; WX 891 ; N uni04A0 ; G 1003 +U 1185 ; WX 717 ; N uni04A1 ; G 1004 +U 1186 ; WX 872 ; N uni04A2 ; G 1005 +U 1187 ; WX 641 ; N uni04A3 ; G 1006 +U 1188 ; WX 1139 ; N uni04A4 ; G 1007 +U 1189 ; WX 852 ; N uni04A5 ; G 1008 +U 1190 ; WX 1205 ; N uni04A6 ; G 1009 +U 1191 ; WX 941 ; N uni04A7 ; G 1010 +U 1194 ; WX 765 ; N uni04AA ; G 1011 +U 1195 ; WX 560 ; N uni04AB ; G 1012 +U 1196 ; WX 667 ; N uni04AC ; G 1013 +U 1197 ; WX 553 ; N uni04AD ; G 1014 +U 1198 ; WX 660 ; N uni04AE ; G 1015 +U 1199 ; WX 565 ; N uni04AF ; G 1016 +U 1200 ; WX 660 ; N uni04B0 ; G 1017 +U 1201 ; WX 565 ; N uni04B1 ; G 1018 +U 1202 ; WX 712 ; N uni04B2 ; G 1019 +U 1203 ; WX 564 ; N uni04B3 ; G 1020 +U 1204 ; WX 952 ; N uni04B4 ; G 1021 +U 1205 ; WX 732 ; N uni04B5 ; G 1022 +U 1206 ; WX 749 ; N uni04B6 ; G 1023 +U 1207 ; WX 690 ; N uni04B7 ; G 1024 +U 1210 ; WX 749 ; N uni04BA ; G 1025 +U 1211 ; WX 644 ; N uni04BB ; G 1026 +U 1216 ; WX 395 ; N uni04C0 ; G 1027 +U 1217 ; WX 1124 ; N uni04C1 ; G 1028 +U 1218 ; WX 920 ; N uni04C2 ; G 1029 +U 1219 ; WX 747 ; N uni04C3 ; G 1030 +U 1220 ; WX 606 ; N uni04C4 ; G 1031 +U 1223 ; WX 872 ; N uni04C7 ; G 1032 +U 1224 ; WX 667 ; N uni04C8 ; G 1033 +U 1227 ; WX 749 ; N uni04CB ; G 1034 +U 1228 ; WX 667 ; N uni04CC ; G 1035 +U 1231 ; WX 320 ; N uni04CF ; G 1036 +U 1232 ; WX 757 ; N uni04D0 ; G 1037 +U 1233 ; WX 596 ; N uni04D1 ; G 1038 +U 1234 ; WX 757 ; N uni04D2 ; G 1039 +U 1235 ; WX 596 ; N uni04D3 ; G 1040 +U 1236 ; WX 1001 ; N uni04D4 ; G 1041 +U 1237 ; WX 940 ; N uni04D5 ; G 1042 +U 1238 ; WX 730 ; N uni04D6 ; G 1043 +U 1239 ; WX 592 ; N uni04D7 ; G 1044 +U 1240 ; WX 820 ; N uni04D8 ; G 1045 +U 1241 ; WX 592 ; N uni04D9 ; G 1046 +U 1242 ; WX 820 ; N uni04DA ; G 1047 +U 1243 ; WX 592 ; N uni04DB ; G 1048 +U 1244 ; WX 1124 ; N uni04DC ; G 1049 +U 1245 ; WX 920 ; N uni04DD ; G 1050 +U 1246 ; WX 623 ; N uni04DE ; G 1051 +U 1247 ; WX 545 ; N uni04DF ; G 1052 +U 1248 ; WX 564 ; N uni04E0 ; G 1053 +U 1249 ; WX 564 ; N uni04E1 ; G 1054 +U 1250 ; WX 872 ; N uni04E2 ; G 1055 +U 1251 ; WX 667 ; N uni04E3 ; G 1056 +U 1252 ; WX 872 ; N uni04E4 ; G 1057 +U 1253 ; WX 667 ; N uni04E5 ; G 1058 +U 1254 ; WX 820 ; N uni04E6 ; G 1059 +U 1255 ; WX 602 ; N uni04E7 ; G 1060 +U 1256 ; WX 820 ; N uni04E8 ; G 1061 +U 1257 ; WX 602 ; N uni04E9 ; G 1062 +U 1258 ; WX 820 ; N uni04EA ; G 1063 +U 1259 ; WX 602 ; N uni04EB ; G 1064 +U 1260 ; WX 765 ; N uni04EC ; G 1065 +U 1261 ; WX 560 ; N uni04ED ; G 1066 +U 1262 ; WX 723 ; N uni04EE ; G 1067 +U 1263 ; WX 588 ; N uni04EF ; G 1068 +U 1264 ; WX 723 ; N uni04F0 ; G 1069 +U 1265 ; WX 588 ; N uni04F1 ; G 1070 +U 1266 ; WX 723 ; N uni04F2 ; G 1071 +U 1267 ; WX 588 ; N uni04F3 ; G 1072 +U 1268 ; WX 773 ; N uni04F4 ; G 1073 +U 1269 ; WX 661 ; N uni04F5 ; G 1074 +U 1270 ; WX 662 ; N uni04F6 ; G 1075 +U 1271 ; WX 524 ; N uni04F7 ; G 1076 +U 1272 ; WX 984 ; N uni04F8 ; G 1077 +U 1273 ; WX 796 ; N uni04F9 ; G 1078 +U 1296 ; WX 623 ; N uni0510 ; G 1079 +U 1297 ; WX 545 ; N uni0511 ; G 1080 +U 1298 ; WX 834 ; N uni0512 ; G 1081 +U 1299 ; WX 635 ; N uni0513 ; G 1082 +U 1300 ; WX 1198 ; N uni0514 ; G 1083 +U 1301 ; WX 919 ; N uni0515 ; G 1084 +U 1306 ; WX 820 ; N uni051A ; G 1085 +U 1307 ; WX 640 ; N uni051B ; G 1086 +U 1308 ; WX 1028 ; N uni051C ; G 1087 +U 1309 ; WX 856 ; N uni051D ; G 1088 +U 1329 ; WX 810 ; N uni0531 ; G 1089 +U 1330 ; WX 811 ; N uni0532 ; G 1090 +U 1331 ; WX 826 ; N uni0533 ; G 1091 +U 1332 ; WX 847 ; N uni0534 ; G 1092 +U 1333 ; WX 806 ; N uni0535 ; G 1093 +U 1334 ; WX 826 ; N uni0536 ; G 1094 +U 1335 ; WX 761 ; N uni0537 ; G 1095 +U 1336 ; WX 811 ; N uni0538 ; G 1096 +U 1337 ; WX 968 ; N uni0539 ; G 1097 +U 1338 ; WX 816 ; N uni053A ; G 1098 +U 1339 ; WX 772 ; N uni053B ; G 1099 +U 1340 ; WX 682 ; N uni053C ; G 1100 +U 1341 ; WX 1097 ; N uni053D ; G 1101 +U 1342 ; WX 845 ; N uni053E ; G 1102 +U 1343 ; WX 804 ; N uni053F ; G 1103 +U 1344 ; WX 719 ; N uni0540 ; G 1104 +U 1345 ; WX 810 ; N uni0541 ; G 1105 +U 1346 ; WX 833 ; N uni0542 ; G 1106 +U 1347 ; WX 843 ; N uni0543 ; G 1107 +U 1348 ; WX 897 ; N uni0544 ; G 1108 +U 1349 ; WX 763 ; N uni0545 ; G 1109 +U 1350 ; WX 794 ; N uni0546 ; G 1110 +U 1351 ; WX 754 ; N uni0547 ; G 1111 +U 1352 ; WX 799 ; N uni0548 ; G 1112 +U 1353 ; WX 797 ; N uni0549 ; G 1113 +U 1354 ; WX 875 ; N uni054A ; G 1114 +U 1355 ; WX 830 ; N uni054B ; G 1115 +U 1356 ; WX 884 ; N uni054C ; G 1116 +U 1357 ; WX 799 ; N uni054D ; G 1117 +U 1358 ; WX 802 ; N uni054E ; G 1118 +U 1359 ; WX 731 ; N uni054F ; G 1119 +U 1360 ; WX 774 ; N uni0550 ; G 1120 +U 1361 ; WX 749 ; N uni0551 ; G 1121 +U 1362 ; WX 633 ; N uni0552 ; G 1122 +U 1363 ; WX 845 ; N uni0553 ; G 1123 +U 1364 ; WX 843 ; N uni0554 ; G 1124 +U 1365 ; WX 835 ; N uni0555 ; G 1125 +U 1366 ; WX 821 ; N uni0556 ; G 1126 +U 1369 ; WX 307 ; N uni0559 ; G 1127 +U 1370 ; WX 264 ; N uni055A ; G 1128 +U 1371 ; WX 229 ; N uni055B ; G 1129 +U 1372 ; WX 391 ; N uni055C ; G 1130 +U 1373 ; WX 364 ; N uni055D ; G 1131 +U 1374 ; WX 386 ; N uni055E ; G 1132 +U 1375 ; WX 500 ; N uni055F ; G 1133 +U 1377 ; WX 949 ; N uni0561 ; G 1134 +U 1378 ; WX 618 ; N uni0562 ; G 1135 +U 1379 ; WX 695 ; N uni0563 ; G 1136 +U 1380 ; WX 695 ; N uni0564 ; G 1137 +U 1381 ; WX 628 ; N uni0565 ; G 1138 +U 1382 ; WX 688 ; N uni0566 ; G 1139 +U 1383 ; WX 510 ; N uni0567 ; G 1140 +U 1384 ; WX 636 ; N uni0568 ; G 1141 +U 1385 ; WX 791 ; N uni0569 ; G 1142 +U 1386 ; WX 671 ; N uni056A ; G 1143 +U 1387 ; WX 635 ; N uni056B ; G 1144 +U 1388 ; WX 305 ; N uni056C ; G 1145 +U 1389 ; WX 973 ; N uni056D ; G 1146 +U 1390 ; WX 614 ; N uni056E ; G 1147 +U 1391 ; WX 628 ; N uni056F ; G 1148 +U 1392 ; WX 636 ; N uni0570 ; G 1149 +U 1393 ; WX 630 ; N uni0571 ; G 1150 +U 1394 ; WX 636 ; N uni0572 ; G 1151 +U 1395 ; WX 654 ; N uni0573 ; G 1152 +U 1396 ; WX 644 ; N uni0574 ; G 1153 +U 1397 ; WX 309 ; N uni0575 ; G 1154 +U 1398 ; WX 636 ; N uni0576 ; G 1155 +U 1399 ; WX 461 ; N uni0577 ; G 1156 +U 1400 ; WX 649 ; N uni0578 ; G 1157 +U 1401 ; WX 365 ; N uni0579 ; G 1158 +U 1402 ; WX 940 ; N uni057A ; G 1159 +U 1403 ; WX 562 ; N uni057B ; G 1160 +U 1404 ; WX 657 ; N uni057C ; G 1161 +U 1405 ; WX 644 ; N uni057D ; G 1162 +U 1406 ; WX 630 ; N uni057E ; G 1163 +U 1407 ; WX 930 ; N uni057F ; G 1164 +U 1408 ; WX 644 ; N uni0580 ; G 1165 +U 1409 ; WX 643 ; N uni0581 ; G 1166 +U 1410 ; WX 483 ; N uni0582 ; G 1167 +U 1411 ; WX 930 ; N uni0583 ; G 1168 +U 1412 ; WX 636 ; N uni0584 ; G 1169 +U 1413 ; WX 609 ; N uni0585 ; G 1170 +U 1414 ; WX 809 ; N uni0586 ; G 1171 +U 1415 ; WX 789 ; N uni0587 ; G 1172 +U 1417 ; WX 340 ; N uni0589 ; G 1173 +U 1418 ; WX 334 ; N uni058A ; G 1174 +U 3647 ; WX 636 ; N uni0E3F ; G 1175 +U 4256 ; WX 723 ; N uni10A0 ; G 1176 +U 4257 ; WX 850 ; N uni10A1 ; G 1177 +U 4258 ; WX 828 ; N uni10A2 ; G 1178 +U 4259 ; WX 859 ; N uni10A3 ; G 1179 +U 4260 ; WX 733 ; N uni10A4 ; G 1180 +U 4261 ; WX 981 ; N uni10A5 ; G 1181 +U 4262 ; WX 916 ; N uni10A6 ; G 1182 +U 4263 ; WX 1101 ; N uni10A7 ; G 1183 +U 4264 ; WX 566 ; N uni10A8 ; G 1184 +U 4265 ; WX 750 ; N uni10A9 ; G 1185 +U 4266 ; WX 962 ; N uni10AA ; G 1186 +U 4267 ; WX 941 ; N uni10AB ; G 1187 +U 4268 ; WX 743 ; N uni10AC ; G 1188 +U 4269 ; WX 1075 ; N uni10AD ; G 1189 +U 4270 ; WX 896 ; N uni10AE ; G 1190 +U 4271 ; WX 829 ; N uni10AF ; G 1191 +U 4272 ; WX 1040 ; N uni10B0 ; G 1192 +U 4273 ; WX 733 ; N uni10B1 ; G 1193 +U 4274 ; WX 669 ; N uni10B2 ; G 1194 +U 4275 ; WX 1015 ; N uni10B3 ; G 1195 +U 4276 ; WX 937 ; N uni10B4 ; G 1196 +U 4277 ; WX 1020 ; N uni10B5 ; G 1197 +U 4278 ; WX 731 ; N uni10B6 ; G 1198 +U 4279 ; WX 733 ; N uni10B7 ; G 1199 +U 4280 ; WX 732 ; N uni10B8 ; G 1200 +U 4281 ; WX 733 ; N uni10B9 ; G 1201 +U 4282 ; WX 879 ; N uni10BA ; G 1202 +U 4283 ; WX 937 ; N uni10BB ; G 1203 +U 4284 ; WX 714 ; N uni10BC ; G 1204 +U 4285 ; WX 755 ; N uni10BD ; G 1205 +U 4286 ; WX 733 ; N uni10BE ; G 1206 +U 4287 ; WX 958 ; N uni10BF ; G 1207 +U 4288 ; WX 1000 ; N uni10C0 ; G 1208 +U 4289 ; WX 702 ; N uni10C1 ; G 1209 +U 4290 ; WX 864 ; N uni10C2 ; G 1210 +U 4291 ; WX 734 ; N uni10C3 ; G 1211 +U 4292 ; WX 837 ; N uni10C4 ; G 1212 +U 4293 ; WX 951 ; N uni10C5 ; G 1213 +U 4304 ; WX 541 ; N uni10D0 ; G 1214 +U 4305 ; WX 571 ; N uni10D1 ; G 1215 +U 4306 ; WX 589 ; N uni10D2 ; G 1216 +U 4307 ; WX 833 ; N uni10D3 ; G 1217 +U 4308 ; WX 561 ; N uni10D4 ; G 1218 +U 4309 ; WX 557 ; N uni10D5 ; G 1219 +U 4310 ; WX 618 ; N uni10D6 ; G 1220 +U 4311 ; WX 861 ; N uni10D7 ; G 1221 +U 4312 ; WX 560 ; N uni10D8 ; G 1222 +U 4313 ; WX 546 ; N uni10D9 ; G 1223 +U 4314 ; WX 1066 ; N uni10DA ; G 1224 +U 4315 ; WX 586 ; N uni10DB ; G 1225 +U 4316 ; WX 586 ; N uni10DC ; G 1226 +U 4317 ; WX 825 ; N uni10DD ; G 1227 +U 4318 ; WX 570 ; N uni10DE ; G 1228 +U 4319 ; WX 581 ; N uni10DF ; G 1229 +U 4320 ; WX 824 ; N uni10E0 ; G 1230 +U 4321 ; WX 607 ; N uni10E1 ; G 1231 +U 4322 ; WX 748 ; N uni10E2 ; G 1232 +U 4323 ; WX 698 ; N uni10E3 ; G 1233 +U 4324 ; WX 815 ; N uni10E4 ; G 1234 +U 4325 ; WX 585 ; N uni10E5 ; G 1235 +U 4326 ; WX 858 ; N uni10E6 ; G 1236 +U 4327 ; WX 568 ; N uni10E7 ; G 1237 +U 4328 ; WX 594 ; N uni10E8 ; G 1238 +U 4329 ; WX 586 ; N uni10E9 ; G 1239 +U 4330 ; WX 675 ; N uni10EA ; G 1240 +U 4331 ; WX 587 ; N uni10EB ; G 1241 +U 4332 ; WX 582 ; N uni10EC ; G 1242 +U 4333 ; WX 576 ; N uni10ED ; G 1243 +U 4334 ; WX 612 ; N uni10EE ; G 1244 +U 4335 ; WX 683 ; N uni10EF ; G 1245 +U 4336 ; WX 572 ; N uni10F0 ; G 1246 +U 4337 ; WX 603 ; N uni10F1 ; G 1247 +U 4338 ; WX 571 ; N uni10F2 ; G 1248 +U 4339 ; WX 572 ; N uni10F3 ; G 1249 +U 4340 ; WX 570 ; N uni10F4 ; G 1250 +U 4341 ; WX 649 ; N uni10F5 ; G 1251 +U 4342 ; WX 886 ; N uni10F6 ; G 1252 +U 4343 ; WX 626 ; N uni10F7 ; G 1253 +U 4344 ; WX 582 ; N uni10F8 ; G 1254 +U 4345 ; WX 619 ; N uni10F9 ; G 1255 +U 4346 ; WX 571 ; N uni10FA ; G 1256 +U 4347 ; WX 437 ; N uni10FB ; G 1257 +U 4348 ; WX 354 ; N uni10FC ; G 1258 +U 7424 ; WX 565 ; N uni1D00 ; G 1259 +U 7425 ; WX 774 ; N uni1D01 ; G 1260 +U 7426 ; WX 940 ; N uni1D02 ; G 1261 +U 7427 ; WX 563 ; N uni1D03 ; G 1262 +U 7428 ; WX 560 ; N uni1D04 ; G 1263 +U 7429 ; WX 585 ; N uni1D05 ; G 1264 +U 7430 ; WX 585 ; N uni1D06 ; G 1265 +U 7431 ; WX 553 ; N uni1D07 ; G 1266 +U 7432 ; WX 509 ; N uni1D08 ; G 1267 +U 7433 ; WX 320 ; N uni1D09 ; G 1268 +U 7434 ; WX 499 ; N uni1D0A ; G 1269 +U 7435 ; WX 625 ; N uni1D0B ; G 1270 +U 7436 ; WX 543 ; N uni1D0C ; G 1271 +U 7437 ; WX 778 ; N uni1D0D ; G 1272 +U 7438 ; WX 667 ; N uni1D0E ; G 1273 +U 7439 ; WX 602 ; N uni1D0F ; G 1274 +U 7440 ; WX 560 ; N uni1D10 ; G 1275 +U 7441 ; WX 647 ; N uni1D11 ; G 1276 +U 7442 ; WX 647 ; N uni1D12 ; G 1277 +U 7443 ; WX 647 ; N uni1D13 ; G 1278 +U 7444 ; WX 989 ; N uni1D14 ; G 1279 +U 7445 ; WX 512 ; N uni1D15 ; G 1280 +U 7446 ; WX 602 ; N uni1D16 ; G 1281 +U 7447 ; WX 602 ; N uni1D17 ; G 1282 +U 7448 ; WX 553 ; N uni1D18 ; G 1283 +U 7449 ; WX 594 ; N uni1D19 ; G 1284 +U 7450 ; WX 594 ; N uni1D1A ; G 1285 +U 7451 ; WX 553 ; N uni1D1B ; G 1286 +U 7452 ; WX 585 ; N uni1D1C ; G 1287 +U 7453 ; WX 664 ; N uni1D1D ; G 1288 +U 7454 ; WX 923 ; N uni1D1E ; G 1289 +U 7455 ; WX 655 ; N uni1D1F ; G 1290 +U 7456 ; WX 565 ; N uni1D20 ; G 1291 +U 7457 ; WX 856 ; N uni1D21 ; G 1292 +U 7458 ; WX 527 ; N uni1D22 ; G 1293 +U 7459 ; WX 527 ; N uni1D23 ; G 1294 +U 7460 ; WX 531 ; N uni1D24 ; G 1295 +U 7461 ; WX 743 ; N uni1D25 ; G 1296 +U 7462 ; WX 524 ; N uni1D26 ; G 1297 +U 7463 ; WX 565 ; N uni1D27 ; G 1298 +U 7464 ; WX 657 ; N uni1D28 ; G 1299 +U 7465 ; WX 553 ; N uni1D29 ; G 1300 +U 7466 ; WX 703 ; N uni1D2A ; G 1301 +U 7467 ; WX 635 ; N uni1D2B ; G 1302 +U 7468 ; WX 455 ; N uni1D2C ; G 1303 +U 7469 ; WX 630 ; N uni1D2D ; G 1304 +U 7470 ; WX 463 ; N uni1D2E ; G 1305 +U 7471 ; WX 463 ; N uni1D2F ; G 1306 +U 7472 ; WX 505 ; N uni1D30 ; G 1307 +U 7473 ; WX 459 ; N uni1D31 ; G 1308 +U 7474 ; WX 459 ; N uni1D32 ; G 1309 +U 7475 ; WX 503 ; N uni1D33 ; G 1310 +U 7476 ; WX 549 ; N uni1D34 ; G 1311 +U 7477 ; WX 249 ; N uni1D35 ; G 1312 +U 7478 ; WX 252 ; N uni1D36 ; G 1313 +U 7479 ; WX 470 ; N uni1D37 ; G 1314 +U 7480 ; WX 418 ; N uni1D38 ; G 1315 +U 7481 ; WX 645 ; N uni1D39 ; G 1316 +U 7482 ; WX 551 ; N uni1D3A ; G 1317 +U 7483 ; WX 551 ; N uni1D3B ; G 1318 +U 7484 ; WX 516 ; N uni1D3C ; G 1319 +U 7485 ; WX 369 ; N uni1D3D ; G 1320 +U 7486 ; WX 424 ; N uni1D3E ; G 1321 +U 7487 ; WX 474 ; N uni1D3F ; G 1322 +U 7488 ; WX 420 ; N uni1D40 ; G 1323 +U 7489 ; WX 531 ; N uni1D41 ; G 1324 +U 7490 ; WX 647 ; N uni1D42 ; G 1325 +U 7491 ; WX 386 ; N uni1D43 ; G 1326 +U 7492 ; WX 386 ; N uni1D44 ; G 1327 +U 7493 ; WX 400 ; N uni1D45 ; G 1328 +U 7494 ; WX 618 ; N uni1D46 ; G 1329 +U 7495 ; WX 400 ; N uni1D47 ; G 1330 +U 7496 ; WX 400 ; N uni1D48 ; G 1331 +U 7497 ; WX 387 ; N uni1D49 ; G 1332 +U 7498 ; WX 387 ; N uni1D4A ; G 1333 +U 7499 ; WX 340 ; N uni1D4B ; G 1334 +U 7500 ; WX 340 ; N uni1D4C ; G 1335 +U 7501 ; WX 400 ; N uni1D4D ; G 1336 +U 7502 ; WX 175 ; N uni1D4E ; G 1337 +U 7503 ; WX 365 ; N uni1D4F ; G 1338 +U 7504 ; WX 613 ; N uni1D50 ; G 1339 +U 7505 ; WX 399 ; N uni1D51 ; G 1340 +U 7506 ; WX 385 ; N uni1D52 ; G 1341 +U 7507 ; WX 346 ; N uni1D53 ; G 1342 +U 7508 ; WX 385 ; N uni1D54 ; G 1343 +U 7509 ; WX 385 ; N uni1D55 ; G 1344 +U 7510 ; WX 400 ; N uni1D56 ; G 1345 +U 7511 ; WX 247 ; N uni1D57 ; G 1346 +U 7512 ; WX 399 ; N uni1D58 ; G 1347 +U 7513 ; WX 418 ; N uni1D59 ; G 1348 +U 7514 ; WX 613 ; N uni1D5A ; G 1349 +U 7515 ; WX 373 ; N uni1D5B ; G 1350 +U 7516 ; WX 468 ; N uni1D5C ; G 1351 +U 7517 ; WX 364 ; N uni1D5D ; G 1352 +U 7518 ; WX 376 ; N uni1D5E ; G 1353 +U 7519 ; WX 379 ; N uni1D5F ; G 1354 +U 7520 ; WX 441 ; N uni1D60 ; G 1355 +U 7521 ; WX 381 ; N uni1D61 ; G 1356 +U 7522 ; WX 201 ; N uni1D62 ; G 1357 +U 7523 ; WX 347 ; N uni1D63 ; G 1358 +U 7524 ; WX 399 ; N uni1D64 ; G 1359 +U 7525 ; WX 373 ; N uni1D65 ; G 1360 +U 7526 ; WX 364 ; N uni1D66 ; G 1361 +U 7527 ; WX 376 ; N uni1D67 ; G 1362 +U 7528 ; WX 370 ; N uni1D68 ; G 1363 +U 7529 ; WX 441 ; N uni1D69 ; G 1364 +U 7530 ; WX 381 ; N uni1D6A ; G 1365 +U 7531 ; WX 974 ; N uni1D6B ; G 1366 +U 7543 ; WX 640 ; N uni1D77 ; G 1367 +U 7544 ; WX 549 ; N uni1D78 ; G 1368 +U 7547 ; WX 320 ; N uni1D7B ; G 1369 +U 7548 ; WX 392 ; N uni1D7C ; G 1370 +U 7549 ; WX 640 ; N uni1D7D ; G 1371 +U 7550 ; WX 585 ; N uni1D7E ; G 1372 +U 7551 ; WX 620 ; N uni1D7F ; G 1373 +U 7557 ; WX 320 ; N uni1D85 ; G 1374 +U 7579 ; WX 400 ; N uni1D9B ; G 1375 +U 7580 ; WX 346 ; N uni1D9C ; G 1376 +U 7581 ; WX 346 ; N uni1D9D ; G 1377 +U 7582 ; WX 385 ; N uni1D9E ; G 1378 +U 7583 ; WX 340 ; N uni1D9F ; G 1379 +U 7584 ; WX 222 ; N uni1DA0 ; G 1380 +U 7585 ; WX 229 ; N uni1DA1 ; G 1381 +U 7586 ; WX 400 ; N uni1DA2 ; G 1382 +U 7587 ; WX 399 ; N uni1DA3 ; G 1383 +U 7588 ; WX 234 ; N uni1DA4 ; G 1384 +U 7589 ; WX 244 ; N uni1DA5 ; G 1385 +U 7590 ; WX 234 ; N uni1DA6 ; G 1386 +U 7591 ; WX 234 ; N uni1DA7 ; G 1387 +U 7592 ; WX 230 ; N uni1DA8 ; G 1388 +U 7593 ; WX 175 ; N uni1DA9 ; G 1389 +U 7594 ; WX 175 ; N uni1DAA ; G 1390 +U 7595 ; WX 367 ; N uni1DAB ; G 1391 +U 7596 ; WX 613 ; N uni1DAC ; G 1392 +U 7597 ; WX 613 ; N uni1DAD ; G 1393 +U 7598 ; WX 407 ; N uni1DAE ; G 1394 +U 7599 ; WX 404 ; N uni1DAF ; G 1395 +U 7600 ; WX 399 ; N uni1DB0 ; G 1396 +U 7601 ; WX 385 ; N uni1DB1 ; G 1397 +U 7602 ; WX 385 ; N uni1DB2 ; G 1398 +U 7603 ; WX 328 ; N uni1DB3 ; G 1399 +U 7604 ; WX 211 ; N uni1DB4 ; G 1400 +U 7605 ; WX 247 ; N uni1DB5 ; G 1401 +U 7606 ; WX 399 ; N uni1DB6 ; G 1402 +U 7607 ; WX 389 ; N uni1DB7 ; G 1403 +U 7608 ; WX 368 ; N uni1DB8 ; G 1404 +U 7609 ; WX 376 ; N uni1DB9 ; G 1405 +U 7610 ; WX 373 ; N uni1DBA ; G 1406 +U 7611 ; WX 331 ; N uni1DBB ; G 1407 +U 7612 ; WX 331 ; N uni1DBC ; G 1408 +U 7613 ; WX 331 ; N uni1DBD ; G 1409 +U 7614 ; WX 364 ; N uni1DBE ; G 1410 +U 7615 ; WX 385 ; N uni1DBF ; G 1411 +U 7620 ; WX 0 ; N uni1DC4 ; G 1412 +U 7621 ; WX 0 ; N uni1DC5 ; G 1413 +U 7622 ; WX 0 ; N uni1DC6 ; G 1414 +U 7623 ; WX 0 ; N uni1DC7 ; G 1415 +U 7624 ; WX 0 ; N uni1DC8 ; G 1416 +U 7625 ; WX 0 ; N uni1DC9 ; G 1417 +U 7680 ; WX 722 ; N uni1E00 ; G 1418 +U 7681 ; WX 596 ; N uni1E01 ; G 1419 +U 7682 ; WX 735 ; N uni1E02 ; G 1420 +U 7683 ; WX 640 ; N uni1E03 ; G 1421 +U 7684 ; WX 735 ; N uni1E04 ; G 1422 +U 7685 ; WX 640 ; N uni1E05 ; G 1423 +U 7686 ; WX 735 ; N uni1E06 ; G 1424 +U 7687 ; WX 640 ; N uni1E07 ; G 1425 +U 7688 ; WX 765 ; N uni1E08 ; G 1426 +U 7689 ; WX 560 ; N uni1E09 ; G 1427 +U 7690 ; WX 802 ; N uni1E0A ; G 1428 +U 7691 ; WX 640 ; N uni1E0B ; G 1429 +U 7692 ; WX 802 ; N uni1E0C ; G 1430 +U 7693 ; WX 640 ; N uni1E0D ; G 1431 +U 7694 ; WX 802 ; N uni1E0E ; G 1432 +U 7695 ; WX 640 ; N uni1E0F ; G 1433 +U 7696 ; WX 802 ; N uni1E10 ; G 1434 +U 7697 ; WX 640 ; N uni1E11 ; G 1435 +U 7698 ; WX 802 ; N uni1E12 ; G 1436 +U 7699 ; WX 640 ; N uni1E13 ; G 1437 +U 7700 ; WX 730 ; N uni1E14 ; G 1438 +U 7701 ; WX 592 ; N uni1E15 ; G 1439 +U 7702 ; WX 730 ; N uni1E16 ; G 1440 +U 7703 ; WX 592 ; N uni1E17 ; G 1441 +U 7704 ; WX 730 ; N uni1E18 ; G 1442 +U 7705 ; WX 592 ; N uni1E19 ; G 1443 +U 7706 ; WX 730 ; N uni1E1A ; G 1444 +U 7707 ; WX 592 ; N uni1E1B ; G 1445 +U 7708 ; WX 730 ; N uni1E1C ; G 1446 +U 7709 ; WX 592 ; N uni1E1D ; G 1447 +U 7710 ; WX 694 ; N uni1E1E ; G 1448 +U 7711 ; WX 370 ; N uni1E1F ; G 1449 +U 7712 ; WX 799 ; N uni1E20 ; G 1450 +U 7713 ; WX 640 ; N uni1E21 ; G 1451 +U 7714 ; WX 872 ; N uni1E22 ; G 1452 +U 7715 ; WX 644 ; N uni1E23 ; G 1453 +U 7716 ; WX 872 ; N uni1E24 ; G 1454 +U 7717 ; WX 644 ; N uni1E25 ; G 1455 +U 7718 ; WX 872 ; N uni1E26 ; G 1456 +U 7719 ; WX 644 ; N uni1E27 ; G 1457 +U 7720 ; WX 872 ; N uni1E28 ; G 1458 +U 7721 ; WX 644 ; N uni1E29 ; G 1459 +U 7722 ; WX 872 ; N uni1E2A ; G 1460 +U 7723 ; WX 644 ; N uni1E2B ; G 1461 +U 7724 ; WX 395 ; N uni1E2C ; G 1462 +U 7725 ; WX 320 ; N uni1E2D ; G 1463 +U 7726 ; WX 395 ; N uni1E2E ; G 1464 +U 7727 ; WX 320 ; N uni1E2F ; G 1465 +U 7728 ; WX 747 ; N uni1E30 ; G 1466 +U 7729 ; WX 606 ; N uni1E31 ; G 1467 +U 7730 ; WX 747 ; N uni1E32 ; G 1468 +U 7731 ; WX 606 ; N uni1E33 ; G 1469 +U 7732 ; WX 747 ; N uni1E34 ; G 1470 +U 7733 ; WX 606 ; N uni1E35 ; G 1471 +U 7734 ; WX 664 ; N uni1E36 ; G 1472 +U 7735 ; WX 320 ; N uni1E37 ; G 1473 +U 7736 ; WX 664 ; N uni1E38 ; G 1474 +U 7737 ; WX 320 ; N uni1E39 ; G 1475 +U 7738 ; WX 664 ; N uni1E3A ; G 1476 +U 7739 ; WX 320 ; N uni1E3B ; G 1477 +U 7740 ; WX 664 ; N uni1E3C ; G 1478 +U 7741 ; WX 320 ; N uni1E3D ; G 1479 +U 7742 ; WX 1024 ; N uni1E3E ; G 1480 +U 7743 ; WX 948 ; N uni1E3F ; G 1481 +U 7744 ; WX 1024 ; N uni1E40 ; G 1482 +U 7745 ; WX 948 ; N uni1E41 ; G 1483 +U 7746 ; WX 1024 ; N uni1E42 ; G 1484 +U 7747 ; WX 948 ; N uni1E43 ; G 1485 +U 7748 ; WX 875 ; N uni1E44 ; G 1486 +U 7749 ; WX 644 ; N uni1E45 ; G 1487 +U 7750 ; WX 875 ; N uni1E46 ; G 1488 +U 7751 ; WX 644 ; N uni1E47 ; G 1489 +U 7752 ; WX 875 ; N uni1E48 ; G 1490 +U 7753 ; WX 644 ; N uni1E49 ; G 1491 +U 7754 ; WX 875 ; N uni1E4A ; G 1492 +U 7755 ; WX 644 ; N uni1E4B ; G 1493 +U 7756 ; WX 820 ; N uni1E4C ; G 1494 +U 7757 ; WX 602 ; N uni1E4D ; G 1495 +U 7758 ; WX 820 ; N uni1E4E ; G 1496 +U 7759 ; WX 602 ; N uni1E4F ; G 1497 +U 7760 ; WX 820 ; N uni1E50 ; G 1498 +U 7761 ; WX 602 ; N uni1E51 ; G 1499 +U 7762 ; WX 820 ; N uni1E52 ; G 1500 +U 7763 ; WX 602 ; N uni1E53 ; G 1501 +U 7764 ; WX 673 ; N uni1E54 ; G 1502 +U 7765 ; WX 640 ; N uni1E55 ; G 1503 +U 7766 ; WX 673 ; N uni1E56 ; G 1504 +U 7767 ; WX 640 ; N uni1E57 ; G 1505 +U 7768 ; WX 753 ; N uni1E58 ; G 1506 +U 7769 ; WX 478 ; N uni1E59 ; G 1507 +U 7770 ; WX 753 ; N uni1E5A ; G 1508 +U 7771 ; WX 478 ; N uni1E5B ; G 1509 +U 7772 ; WX 753 ; N uni1E5C ; G 1510 +U 7773 ; WX 478 ; N uni1E5D ; G 1511 +U 7774 ; WX 753 ; N uni1E5E ; G 1512 +U 7775 ; WX 478 ; N uni1E5F ; G 1513 +U 7776 ; WX 685 ; N uni1E60 ; G 1514 +U 7777 ; WX 513 ; N uni1E61 ; G 1515 +U 7778 ; WX 685 ; N uni1E62 ; G 1516 +U 7779 ; WX 513 ; N uni1E63 ; G 1517 +U 7780 ; WX 685 ; N uni1E64 ; G 1518 +U 7781 ; WX 513 ; N uni1E65 ; G 1519 +U 7782 ; WX 685 ; N uni1E66 ; G 1520 +U 7783 ; WX 521 ; N uni1E67 ; G 1521 +U 7784 ; WX 685 ; N uni1E68 ; G 1522 +U 7785 ; WX 513 ; N uni1E69 ; G 1523 +U 7786 ; WX 667 ; N uni1E6A ; G 1524 +U 7787 ; WX 402 ; N uni1E6B ; G 1525 +U 7788 ; WX 667 ; N uni1E6C ; G 1526 +U 7789 ; WX 402 ; N uni1E6D ; G 1527 +U 7790 ; WX 667 ; N uni1E6E ; G 1528 +U 7791 ; WX 402 ; N uni1E6F ; G 1529 +U 7792 ; WX 667 ; N uni1E70 ; G 1530 +U 7793 ; WX 402 ; N uni1E71 ; G 1531 +U 7794 ; WX 843 ; N uni1E72 ; G 1532 +U 7795 ; WX 644 ; N uni1E73 ; G 1533 +U 7796 ; WX 843 ; N uni1E74 ; G 1534 +U 7797 ; WX 644 ; N uni1E75 ; G 1535 +U 7798 ; WX 843 ; N uni1E76 ; G 1536 +U 7799 ; WX 644 ; N uni1E77 ; G 1537 +U 7800 ; WX 843 ; N uni1E78 ; G 1538 +U 7801 ; WX 644 ; N uni1E79 ; G 1539 +U 7802 ; WX 843 ; N uni1E7A ; G 1540 +U 7803 ; WX 644 ; N uni1E7B ; G 1541 +U 7804 ; WX 722 ; N uni1E7C ; G 1542 +U 7805 ; WX 565 ; N uni1E7D ; G 1543 +U 7806 ; WX 722 ; N uni1E7E ; G 1544 +U 7807 ; WX 565 ; N uni1E7F ; G 1545 +U 7808 ; WX 1028 ; N Wgrave ; G 1546 +U 7809 ; WX 856 ; N wgrave ; G 1547 +U 7810 ; WX 1028 ; N Wacute ; G 1548 +U 7811 ; WX 856 ; N wacute ; G 1549 +U 7812 ; WX 1028 ; N Wdieresis ; G 1550 +U 7813 ; WX 856 ; N wdieresis ; G 1551 +U 7814 ; WX 1028 ; N uni1E86 ; G 1552 +U 7815 ; WX 856 ; N uni1E87 ; G 1553 +U 7816 ; WX 1028 ; N uni1E88 ; G 1554 +U 7817 ; WX 856 ; N uni1E89 ; G 1555 +U 7818 ; WX 712 ; N uni1E8A ; G 1556 +U 7819 ; WX 564 ; N uni1E8B ; G 1557 +U 7820 ; WX 712 ; N uni1E8C ; G 1558 +U 7821 ; WX 564 ; N uni1E8D ; G 1559 +U 7822 ; WX 660 ; N uni1E8E ; G 1560 +U 7823 ; WX 565 ; N uni1E8F ; G 1561 +U 7824 ; WX 695 ; N uni1E90 ; G 1562 +U 7825 ; WX 527 ; N uni1E91 ; G 1563 +U 7826 ; WX 695 ; N uni1E92 ; G 1564 +U 7827 ; WX 527 ; N uni1E93 ; G 1565 +U 7828 ; WX 695 ; N uni1E94 ; G 1566 +U 7829 ; WX 527 ; N uni1E95 ; G 1567 +U 7830 ; WX 644 ; N uni1E96 ; G 1568 +U 7831 ; WX 402 ; N uni1E97 ; G 1569 +U 7832 ; WX 856 ; N uni1E98 ; G 1570 +U 7833 ; WX 565 ; N uni1E99 ; G 1571 +U 7834 ; WX 903 ; N uni1E9A ; G 1572 +U 7835 ; WX 370 ; N uni1E9B ; G 1573 +U 7836 ; WX 370 ; N uni1E9C ; G 1574 +U 7837 ; WX 370 ; N uni1E9D ; G 1575 +U 7838 ; WX 829 ; N uni1E9E ; G 1576 +U 7839 ; WX 602 ; N uni1E9F ; G 1577 +U 7840 ; WX 722 ; N uni1EA0 ; G 1578 +U 7841 ; WX 596 ; N uni1EA1 ; G 1579 +U 7842 ; WX 722 ; N uni1EA2 ; G 1580 +U 7843 ; WX 596 ; N uni1EA3 ; G 1581 +U 7844 ; WX 722 ; N uni1EA4 ; G 1582 +U 7845 ; WX 613 ; N uni1EA5 ; G 1583 +U 7846 ; WX 722 ; N uni1EA6 ; G 1584 +U 7847 ; WX 613 ; N uni1EA7 ; G 1585 +U 7848 ; WX 722 ; N uni1EA8 ; G 1586 +U 7849 ; WX 613 ; N uni1EA9 ; G 1587 +U 7850 ; WX 722 ; N uni1EAA ; G 1588 +U 7851 ; WX 613 ; N uni1EAB ; G 1589 +U 7852 ; WX 722 ; N uni1EAC ; G 1590 +U 7853 ; WX 596 ; N uni1EAD ; G 1591 +U 7854 ; WX 722 ; N uni1EAE ; G 1592 +U 7855 ; WX 596 ; N uni1EAF ; G 1593 +U 7856 ; WX 722 ; N uni1EB0 ; G 1594 +U 7857 ; WX 596 ; N uni1EB1 ; G 1595 +U 7858 ; WX 722 ; N uni1EB2 ; G 1596 +U 7859 ; WX 596 ; N uni1EB3 ; G 1597 +U 7860 ; WX 722 ; N uni1EB4 ; G 1598 +U 7861 ; WX 596 ; N uni1EB5 ; G 1599 +U 7862 ; WX 722 ; N uni1EB6 ; G 1600 +U 7863 ; WX 596 ; N uni1EB7 ; G 1601 +U 7864 ; WX 730 ; N uni1EB8 ; G 1602 +U 7865 ; WX 592 ; N uni1EB9 ; G 1603 +U 7866 ; WX 730 ; N uni1EBA ; G 1604 +U 7867 ; WX 592 ; N uni1EBB ; G 1605 +U 7868 ; WX 730 ; N uni1EBC ; G 1606 +U 7869 ; WX 592 ; N uni1EBD ; G 1607 +U 7870 ; WX 730 ; N uni1ebe ; G 1608 +U 7871 ; WX 615 ; N uni1ebF ; G 1609 +U 7872 ; WX 730 ; N uni1EC0 ; G 1610 +U 7873 ; WX 615 ; N uni1EC1 ; G 1611 +U 7874 ; WX 730 ; N uni1EC2 ; G 1612 +U 7875 ; WX 615 ; N uni1EC3 ; G 1613 +U 7876 ; WX 730 ; N uni1EC4 ; G 1614 +U 7877 ; WX 615 ; N uni1EC5 ; G 1615 +U 7878 ; WX 730 ; N uni1EC6 ; G 1616 +U 7879 ; WX 592 ; N uni1EC7 ; G 1617 +U 7880 ; WX 395 ; N uni1EC8 ; G 1618 +U 7881 ; WX 320 ; N uni1EC9 ; G 1619 +U 7882 ; WX 395 ; N uni1ECA ; G 1620 +U 7883 ; WX 320 ; N uni1ECB ; G 1621 +U 7884 ; WX 820 ; N uni1ECC ; G 1622 +U 7885 ; WX 602 ; N uni1ECD ; G 1623 +U 7886 ; WX 820 ; N uni1ECE ; G 1624 +U 7887 ; WX 602 ; N uni1ECF ; G 1625 +U 7888 ; WX 820 ; N uni1ED0 ; G 1626 +U 7889 ; WX 612 ; N uni1ED1 ; G 1627 +U 7890 ; WX 820 ; N uni1ED2 ; G 1628 +U 7891 ; WX 612 ; N uni1ED3 ; G 1629 +U 7892 ; WX 820 ; N uni1ED4 ; G 1630 +U 7893 ; WX 612 ; N uni1ED5 ; G 1631 +U 7894 ; WX 820 ; N uni1ED6 ; G 1632 +U 7895 ; WX 612 ; N uni1ED7 ; G 1633 +U 7896 ; WX 820 ; N uni1ED8 ; G 1634 +U 7897 ; WX 602 ; N uni1ED9 ; G 1635 +U 7898 ; WX 820 ; N uni1EDA ; G 1636 +U 7899 ; WX 602 ; N uni1EDB ; G 1637 +U 7900 ; WX 820 ; N uni1EDC ; G 1638 +U 7901 ; WX 602 ; N uni1EDD ; G 1639 +U 7902 ; WX 820 ; N uni1EDE ; G 1640 +U 7903 ; WX 602 ; N uni1EDF ; G 1641 +U 7904 ; WX 820 ; N uni1EE0 ; G 1642 +U 7905 ; WX 602 ; N uni1EE1 ; G 1643 +U 7906 ; WX 820 ; N uni1EE2 ; G 1644 +U 7907 ; WX 602 ; N uni1EE3 ; G 1645 +U 7908 ; WX 843 ; N uni1EE4 ; G 1646 +U 7909 ; WX 644 ; N uni1EE5 ; G 1647 +U 7910 ; WX 843 ; N uni1EE6 ; G 1648 +U 7911 ; WX 644 ; N uni1EE7 ; G 1649 +U 7912 ; WX 843 ; N uni1EE8 ; G 1650 +U 7913 ; WX 644 ; N uni1EE9 ; G 1651 +U 7914 ; WX 843 ; N uni1EEA ; G 1652 +U 7915 ; WX 644 ; N uni1EEB ; G 1653 +U 7916 ; WX 843 ; N uni1EEC ; G 1654 +U 7917 ; WX 644 ; N uni1EED ; G 1655 +U 7918 ; WX 843 ; N uni1EEE ; G 1656 +U 7919 ; WX 644 ; N uni1EEF ; G 1657 +U 7920 ; WX 843 ; N uni1EF0 ; G 1658 +U 7921 ; WX 644 ; N uni1EF1 ; G 1659 +U 7922 ; WX 660 ; N Ygrave ; G 1660 +U 7923 ; WX 565 ; N ygrave ; G 1661 +U 7924 ; WX 660 ; N uni1EF4 ; G 1662 +U 7925 ; WX 565 ; N uni1EF5 ; G 1663 +U 7926 ; WX 660 ; N uni1EF6 ; G 1664 +U 7927 ; WX 565 ; N uni1EF7 ; G 1665 +U 7928 ; WX 660 ; N uni1EF8 ; G 1666 +U 7929 ; WX 565 ; N uni1EF9 ; G 1667 +U 7930 ; WX 949 ; N uni1EFA ; G 1668 +U 7931 ; WX 581 ; N uni1EFB ; G 1669 +U 7936 ; WX 675 ; N uni1F00 ; G 1670 +U 7937 ; WX 675 ; N uni1F01 ; G 1671 +U 7938 ; WX 675 ; N uni1F02 ; G 1672 +U 7939 ; WX 675 ; N uni1F03 ; G 1673 +U 7940 ; WX 675 ; N uni1F04 ; G 1674 +U 7941 ; WX 675 ; N uni1F05 ; G 1675 +U 7942 ; WX 675 ; N uni1F06 ; G 1676 +U 7943 ; WX 675 ; N uni1F07 ; G 1677 +U 7944 ; WX 722 ; N uni1F08 ; G 1678 +U 7945 ; WX 722 ; N uni1F09 ; G 1679 +U 7946 ; WX 869 ; N uni1F0A ; G 1680 +U 7947 ; WX 869 ; N uni1F0B ; G 1681 +U 7948 ; WX 734 ; N uni1F0C ; G 1682 +U 7949 ; WX 763 ; N uni1F0D ; G 1683 +U 7950 ; WX 722 ; N uni1F0E ; G 1684 +U 7951 ; WX 722 ; N uni1F0F ; G 1685 +U 7952 ; WX 537 ; N uni1F10 ; G 1686 +U 7953 ; WX 537 ; N uni1F11 ; G 1687 +U 7954 ; WX 537 ; N uni1F12 ; G 1688 +U 7955 ; WX 537 ; N uni1F13 ; G 1689 +U 7956 ; WX 537 ; N uni1F14 ; G 1690 +U 7957 ; WX 537 ; N uni1F15 ; G 1691 +U 7960 ; WX 853 ; N uni1F18 ; G 1692 +U 7961 ; WX 841 ; N uni1F19 ; G 1693 +U 7962 ; WX 1067 ; N uni1F1A ; G 1694 +U 7963 ; WX 1077 ; N uni1F1B ; G 1695 +U 7964 ; WX 1008 ; N uni1F1C ; G 1696 +U 7965 ; WX 1035 ; N uni1F1D ; G 1697 +U 7968 ; WX 599 ; N uni1F20 ; G 1698 +U 7969 ; WX 599 ; N uni1F21 ; G 1699 +U 7970 ; WX 599 ; N uni1F22 ; G 1700 +U 7971 ; WX 599 ; N uni1F23 ; G 1701 +U 7972 ; WX 599 ; N uni1F24 ; G 1702 +U 7973 ; WX 599 ; N uni1F25 ; G 1703 +U 7974 ; WX 599 ; N uni1F26 ; G 1704 +U 7975 ; WX 599 ; N uni1F27 ; G 1705 +U 7976 ; WX 998 ; N uni1F28 ; G 1706 +U 7977 ; WX 992 ; N uni1F29 ; G 1707 +U 7978 ; WX 1212 ; N uni1F2A ; G 1708 +U 7979 ; WX 1224 ; N uni1F2B ; G 1709 +U 7980 ; WX 1159 ; N uni1F2C ; G 1710 +U 7981 ; WX 1183 ; N uni1F2D ; G 1711 +U 7982 ; WX 1098 ; N uni1F2E ; G 1712 +U 7983 ; WX 1095 ; N uni1F2F ; G 1713 +U 7984 ; WX 392 ; N uni1F30 ; G 1714 +U 7985 ; WX 392 ; N uni1F31 ; G 1715 +U 7986 ; WX 392 ; N uni1F32 ; G 1716 +U 7987 ; WX 392 ; N uni1F33 ; G 1717 +U 7988 ; WX 392 ; N uni1F34 ; G 1718 +U 7989 ; WX 392 ; N uni1F35 ; G 1719 +U 7990 ; WX 392 ; N uni1F36 ; G 1720 +U 7991 ; WX 392 ; N uni1F37 ; G 1721 +U 7992 ; WX 521 ; N uni1F38 ; G 1722 +U 7993 ; WX 512 ; N uni1F39 ; G 1723 +U 7994 ; WX 735 ; N uni1F3A ; G 1724 +U 7995 ; WX 738 ; N uni1F3B ; G 1725 +U 7996 ; WX 679 ; N uni1F3C ; G 1726 +U 7997 ; WX 706 ; N uni1F3D ; G 1727 +U 7998 ; WX 624 ; N uni1F3E ; G 1728 +U 7999 ; WX 615 ; N uni1F3F ; G 1729 +U 8000 ; WX 602 ; N uni1F40 ; G 1730 +U 8001 ; WX 602 ; N uni1F41 ; G 1731 +U 8002 ; WX 602 ; N uni1F42 ; G 1732 +U 8003 ; WX 602 ; N uni1F43 ; G 1733 +U 8004 ; WX 602 ; N uni1F44 ; G 1734 +U 8005 ; WX 602 ; N uni1F45 ; G 1735 +U 8008 ; WX 820 ; N uni1F48 ; G 1736 +U 8009 ; WX 859 ; N uni1F49 ; G 1737 +U 8010 ; WX 1120 ; N uni1F4A ; G 1738 +U 8011 ; WX 1127 ; N uni1F4B ; G 1739 +U 8012 ; WX 937 ; N uni1F4C ; G 1740 +U 8013 ; WX 964 ; N uni1F4D ; G 1741 +U 8016 ; WX 608 ; N uni1F50 ; G 1742 +U 8017 ; WX 608 ; N uni1F51 ; G 1743 +U 8018 ; WX 608 ; N uni1F52 ; G 1744 +U 8019 ; WX 608 ; N uni1F53 ; G 1745 +U 8020 ; WX 608 ; N uni1F54 ; G 1746 +U 8021 ; WX 608 ; N uni1F55 ; G 1747 +U 8022 ; WX 608 ; N uni1F56 ; G 1748 +U 8023 ; WX 608 ; N uni1F57 ; G 1749 +U 8025 ; WX 851 ; N uni1F59 ; G 1750 +U 8027 ; WX 1079 ; N uni1F5B ; G 1751 +U 8029 ; WX 1044 ; N uni1F5D ; G 1752 +U 8031 ; WX 953 ; N uni1F5F ; G 1753 +U 8032 ; WX 815 ; N uni1F60 ; G 1754 +U 8033 ; WX 815 ; N uni1F61 ; G 1755 +U 8034 ; WX 815 ; N uni1F62 ; G 1756 +U 8035 ; WX 815 ; N uni1F63 ; G 1757 +U 8036 ; WX 815 ; N uni1F64 ; G 1758 +U 8037 ; WX 815 ; N uni1F65 ; G 1759 +U 8038 ; WX 815 ; N uni1F66 ; G 1760 +U 8039 ; WX 815 ; N uni1F67 ; G 1761 +U 8040 ; WX 829 ; N uni1F68 ; G 1762 +U 8041 ; WX 870 ; N uni1F69 ; G 1763 +U 8042 ; WX 1131 ; N uni1F6A ; G 1764 +U 8043 ; WX 1137 ; N uni1F6B ; G 1765 +U 8044 ; WX 946 ; N uni1F6C ; G 1766 +U 8045 ; WX 976 ; N uni1F6D ; G 1767 +U 8046 ; WX 938 ; N uni1F6E ; G 1768 +U 8047 ; WX 970 ; N uni1F6F ; G 1769 +U 8048 ; WX 675 ; N uni1F70 ; G 1770 +U 8049 ; WX 675 ; N uni1F71 ; G 1771 +U 8050 ; WX 537 ; N uni1F72 ; G 1772 +U 8051 ; WX 537 ; N uni1F73 ; G 1773 +U 8052 ; WX 599 ; N uni1F74 ; G 1774 +U 8053 ; WX 599 ; N uni1F75 ; G 1775 +U 8054 ; WX 392 ; N uni1F76 ; G 1776 +U 8055 ; WX 392 ; N uni1F77 ; G 1777 +U 8056 ; WX 602 ; N uni1F78 ; G 1778 +U 8057 ; WX 602 ; N uni1F79 ; G 1779 +U 8058 ; WX 608 ; N uni1F7A ; G 1780 +U 8059 ; WX 608 ; N uni1F7B ; G 1781 +U 8060 ; WX 815 ; N uni1F7C ; G 1782 +U 8061 ; WX 815 ; N uni1F7D ; G 1783 +U 8064 ; WX 675 ; N uni1F80 ; G 1784 +U 8065 ; WX 675 ; N uni1F81 ; G 1785 +U 8066 ; WX 675 ; N uni1F82 ; G 1786 +U 8067 ; WX 675 ; N uni1F83 ; G 1787 +U 8068 ; WX 675 ; N uni1F84 ; G 1788 +U 8069 ; WX 675 ; N uni1F85 ; G 1789 +U 8070 ; WX 675 ; N uni1F86 ; G 1790 +U 8071 ; WX 675 ; N uni1F87 ; G 1791 +U 8072 ; WX 722 ; N uni1F88 ; G 1792 +U 8073 ; WX 722 ; N uni1F89 ; G 1793 +U 8074 ; WX 869 ; N uni1F8A ; G 1794 +U 8075 ; WX 869 ; N uni1F8B ; G 1795 +U 8076 ; WX 734 ; N uni1F8C ; G 1796 +U 8077 ; WX 763 ; N uni1F8D ; G 1797 +U 8078 ; WX 722 ; N uni1F8E ; G 1798 +U 8079 ; WX 722 ; N uni1F8F ; G 1799 +U 8080 ; WX 599 ; N uni1F90 ; G 1800 +U 8081 ; WX 599 ; N uni1F91 ; G 1801 +U 8082 ; WX 599 ; N uni1F92 ; G 1802 +U 8083 ; WX 599 ; N uni1F93 ; G 1803 +U 8084 ; WX 599 ; N uni1F94 ; G 1804 +U 8085 ; WX 599 ; N uni1F95 ; G 1805 +U 8086 ; WX 599 ; N uni1F96 ; G 1806 +U 8087 ; WX 599 ; N uni1F97 ; G 1807 +U 8088 ; WX 998 ; N uni1F98 ; G 1808 +U 8089 ; WX 992 ; N uni1F99 ; G 1809 +U 8090 ; WX 1212 ; N uni1F9A ; G 1810 +U 8091 ; WX 1224 ; N uni1F9B ; G 1811 +U 8092 ; WX 1159 ; N uni1F9C ; G 1812 +U 8093 ; WX 1183 ; N uni1F9D ; G 1813 +U 8094 ; WX 1098 ; N uni1F9E ; G 1814 +U 8095 ; WX 1095 ; N uni1F9F ; G 1815 +U 8096 ; WX 815 ; N uni1FA0 ; G 1816 +U 8097 ; WX 815 ; N uni1FA1 ; G 1817 +U 8098 ; WX 815 ; N uni1FA2 ; G 1818 +U 8099 ; WX 815 ; N uni1FA3 ; G 1819 +U 8100 ; WX 815 ; N uni1FA4 ; G 1820 +U 8101 ; WX 815 ; N uni1FA5 ; G 1821 +U 8102 ; WX 815 ; N uni1FA6 ; G 1822 +U 8103 ; WX 815 ; N uni1FA7 ; G 1823 +U 8104 ; WX 829 ; N uni1FA8 ; G 1824 +U 8105 ; WX 870 ; N uni1FA9 ; G 1825 +U 8106 ; WX 1131 ; N uni1FAA ; G 1826 +U 8107 ; WX 1137 ; N uni1FAB ; G 1827 +U 8108 ; WX 946 ; N uni1FAC ; G 1828 +U 8109 ; WX 976 ; N uni1FAD ; G 1829 +U 8110 ; WX 938 ; N uni1FAE ; G 1830 +U 8111 ; WX 970 ; N uni1FAF ; G 1831 +U 8112 ; WX 675 ; N uni1FB0 ; G 1832 +U 8113 ; WX 675 ; N uni1FB1 ; G 1833 +U 8114 ; WX 675 ; N uni1FB2 ; G 1834 +U 8115 ; WX 675 ; N uni1FB3 ; G 1835 +U 8116 ; WX 675 ; N uni1FB4 ; G 1836 +U 8118 ; WX 675 ; N uni1FB6 ; G 1837 +U 8119 ; WX 675 ; N uni1FB7 ; G 1838 +U 8120 ; WX 722 ; N uni1FB8 ; G 1839 +U 8121 ; WX 722 ; N uni1FB9 ; G 1840 +U 8122 ; WX 722 ; N uni1FBA ; G 1841 +U 8123 ; WX 722 ; N uni1FBB ; G 1842 +U 8124 ; WX 722 ; N uni1FBC ; G 1843 +U 8125 ; WX 500 ; N uni1FBD ; G 1844 +U 8126 ; WX 500 ; N uni1FBE ; G 1845 +U 8127 ; WX 500 ; N uni1FBF ; G 1846 +U 8128 ; WX 500 ; N uni1FC0 ; G 1847 +U 8129 ; WX 500 ; N uni1FC1 ; G 1848 +U 8130 ; WX 599 ; N uni1FC2 ; G 1849 +U 8131 ; WX 599 ; N uni1FC3 ; G 1850 +U 8132 ; WX 599 ; N uni1FC4 ; G 1851 +U 8134 ; WX 599 ; N uni1FC6 ; G 1852 +U 8135 ; WX 599 ; N uni1FC7 ; G 1853 +U 8136 ; WX 912 ; N uni1FC8 ; G 1854 +U 8137 ; WX 900 ; N uni1FC9 ; G 1855 +U 8138 ; WX 1063 ; N uni1FCA ; G 1856 +U 8139 ; WX 1039 ; N uni1FCB ; G 1857 +U 8140 ; WX 872 ; N uni1FCC ; G 1858 +U 8141 ; WX 500 ; N uni1FCD ; G 1859 +U 8142 ; WX 500 ; N uni1FCE ; G 1860 +U 8143 ; WX 500 ; N uni1FCF ; G 1861 +U 8144 ; WX 392 ; N uni1FD0 ; G 1862 +U 8145 ; WX 392 ; N uni1FD1 ; G 1863 +U 8146 ; WX 392 ; N uni1FD2 ; G 1864 +U 8147 ; WX 392 ; N uni1FD3 ; G 1865 +U 8150 ; WX 392 ; N uni1FD6 ; G 1866 +U 8151 ; WX 392 ; N uni1FD7 ; G 1867 +U 8152 ; WX 395 ; N uni1FD8 ; G 1868 +U 8153 ; WX 395 ; N uni1FD9 ; G 1869 +U 8154 ; WX 588 ; N uni1FDA ; G 1870 +U 8155 ; WX 562 ; N uni1FDB ; G 1871 +U 8157 ; WX 500 ; N uni1FDD ; G 1872 +U 8158 ; WX 500 ; N uni1FDE ; G 1873 +U 8159 ; WX 500 ; N uni1FDF ; G 1874 +U 8160 ; WX 608 ; N uni1FE0 ; G 1875 +U 8161 ; WX 608 ; N uni1FE1 ; G 1876 +U 8162 ; WX 608 ; N uni1FE2 ; G 1877 +U 8163 ; WX 608 ; N uni1FE3 ; G 1878 +U 8164 ; WX 588 ; N uni1FE4 ; G 1879 +U 8165 ; WX 588 ; N uni1FE5 ; G 1880 +U 8166 ; WX 608 ; N uni1FE6 ; G 1881 +U 8167 ; WX 608 ; N uni1FE7 ; G 1882 +U 8168 ; WX 660 ; N uni1FE8 ; G 1883 +U 8169 ; WX 660 ; N uni1FE9 ; G 1884 +U 8170 ; WX 921 ; N uni1FEA ; G 1885 +U 8171 ; WX 897 ; N uni1FEB ; G 1886 +U 8172 ; WX 790 ; N uni1FEC ; G 1887 +U 8173 ; WX 500 ; N uni1FED ; G 1888 +U 8174 ; WX 500 ; N uni1FEE ; G 1889 +U 8175 ; WX 500 ; N uni1FEF ; G 1890 +U 8178 ; WX 815 ; N uni1FF2 ; G 1891 +U 8179 ; WX 815 ; N uni1FF3 ; G 1892 +U 8180 ; WX 815 ; N uni1FF4 ; G 1893 +U 8182 ; WX 815 ; N uni1FF6 ; G 1894 +U 8183 ; WX 815 ; N uni1FF7 ; G 1895 +U 8184 ; WX 961 ; N uni1FF8 ; G 1896 +U 8185 ; WX 835 ; N uni1FF9 ; G 1897 +U 8186 ; WX 984 ; N uni1FFA ; G 1898 +U 8187 ; WX 853 ; N uni1FFB ; G 1899 +U 8188 ; WX 829 ; N uni1FFC ; G 1900 +U 8189 ; WX 500 ; N uni1FFD ; G 1901 +U 8190 ; WX 500 ; N uni1FFE ; G 1902 +U 8192 ; WX 500 ; N uni2000 ; G 1903 +U 8193 ; WX 1000 ; N uni2001 ; G 1904 +U 8194 ; WX 500 ; N uni2002 ; G 1905 +U 8195 ; WX 1000 ; N uni2003 ; G 1906 +U 8196 ; WX 330 ; N uni2004 ; G 1907 +U 8197 ; WX 250 ; N uni2005 ; G 1908 +U 8198 ; WX 167 ; N uni2006 ; G 1909 +U 8199 ; WX 636 ; N uni2007 ; G 1910 +U 8200 ; WX 318 ; N uni2008 ; G 1911 +U 8201 ; WX 200 ; N uni2009 ; G 1912 +U 8202 ; WX 100 ; N uni200A ; G 1913 +U 8203 ; WX 0 ; N uni200B ; G 1914 +U 8204 ; WX 0 ; N uni200C ; G 1915 +U 8205 ; WX 0 ; N uni200D ; G 1916 +U 8206 ; WX 0 ; N uni200E ; G 1917 +U 8207 ; WX 0 ; N uni200F ; G 1918 +U 8208 ; WX 338 ; N uni2010 ; G 1919 +U 8209 ; WX 338 ; N uni2011 ; G 1920 +U 8210 ; WX 636 ; N figuredash ; G 1921 +U 8211 ; WX 500 ; N endash ; G 1922 +U 8212 ; WX 1000 ; N emdash ; G 1923 +U 8213 ; WX 1000 ; N uni2015 ; G 1924 +U 8214 ; WX 500 ; N uni2016 ; G 1925 +U 8215 ; WX 500 ; N underscoredbl ; G 1926 +U 8216 ; WX 318 ; N quoteleft ; G 1927 +U 8217 ; WX 318 ; N quoteright ; G 1928 +U 8218 ; WX 318 ; N quotesinglbase ; G 1929 +U 8219 ; WX 318 ; N quotereversed ; G 1930 +U 8220 ; WX 511 ; N quotedblleft ; G 1931 +U 8221 ; WX 511 ; N quotedblright ; G 1932 +U 8222 ; WX 518 ; N quotedblbase ; G 1933 +U 8223 ; WX 511 ; N uni201F ; G 1934 +U 8224 ; WX 500 ; N dagger ; G 1935 +U 8225 ; WX 500 ; N daggerdbl ; G 1936 +U 8226 ; WX 590 ; N bullet ; G 1937 +U 8227 ; WX 590 ; N uni2023 ; G 1938 +U 8228 ; WX 334 ; N onedotenleader ; G 1939 +U 8229 ; WX 667 ; N twodotenleader ; G 1940 +U 8230 ; WX 1000 ; N ellipsis ; G 1941 +U 8234 ; WX 0 ; N uni202A ; G 1942 +U 8235 ; WX 0 ; N uni202B ; G 1943 +U 8236 ; WX 0 ; N uni202C ; G 1944 +U 8237 ; WX 0 ; N uni202D ; G 1945 +U 8238 ; WX 0 ; N uni202E ; G 1946 +U 8239 ; WX 200 ; N uni202F ; G 1947 +U 8240 ; WX 1342 ; N perthousand ; G 1948 +U 8241 ; WX 1734 ; N uni2031 ; G 1949 +U 8242 ; WX 227 ; N minute ; G 1950 +U 8243 ; WX 374 ; N second ; G 1951 +U 8244 ; WX 520 ; N uni2034 ; G 1952 +U 8245 ; WX 227 ; N uni2035 ; G 1953 +U 8246 ; WX 374 ; N uni2036 ; G 1954 +U 8247 ; WX 520 ; N uni2037 ; G 1955 +U 8248 ; WX 339 ; N uni2038 ; G 1956 +U 8249 ; WX 400 ; N guilsinglleft ; G 1957 +U 8250 ; WX 400 ; N guilsinglright ; G 1958 +U 8252 ; WX 527 ; N exclamdbl ; G 1959 +U 8253 ; WX 536 ; N uni203D ; G 1960 +U 8254 ; WX 500 ; N uni203E ; G 1961 +U 8258 ; WX 1000 ; N uni2042 ; G 1962 +U 8260 ; WX 167 ; N fraction ; G 1963 +U 8261 ; WX 390 ; N uni2045 ; G 1964 +U 8262 ; WX 390 ; N uni2046 ; G 1965 +U 8263 ; WX 976 ; N uni2047 ; G 1966 +U 8264 ; WX 753 ; N uni2048 ; G 1967 +U 8265 ; WX 753 ; N uni2049 ; G 1968 +U 8267 ; WX 636 ; N uni204B ; G 1969 +U 8268 ; WX 500 ; N uni204C ; G 1970 +U 8269 ; WX 500 ; N uni204D ; G 1971 +U 8270 ; WX 500 ; N uni204E ; G 1972 +U 8271 ; WX 337 ; N uni204F ; G 1973 +U 8273 ; WX 500 ; N uni2051 ; G 1974 +U 8274 ; WX 450 ; N uni2052 ; G 1975 +U 8275 ; WX 1000 ; N uni2053 ; G 1976 +U 8279 ; WX 663 ; N uni2057 ; G 1977 +U 8287 ; WX 222 ; N uni205F ; G 1978 +U 8288 ; WX 0 ; N uni2060 ; G 1979 +U 8289 ; WX 0 ; N uni2061 ; G 1980 +U 8290 ; WX 0 ; N uni2062 ; G 1981 +U 8291 ; WX 0 ; N uni2063 ; G 1982 +U 8292 ; WX 0 ; N uni2064 ; G 1983 +U 8298 ; WX 0 ; N uni206A ; G 1984 +U 8299 ; WX 0 ; N uni206B ; G 1985 +U 8300 ; WX 0 ; N uni206C ; G 1986 +U 8301 ; WX 0 ; N uni206D ; G 1987 +U 8302 ; WX 0 ; N uni206E ; G 1988 +U 8303 ; WX 0 ; N uni206F ; G 1989 +U 8304 ; WX 401 ; N uni2070 ; G 1990 +U 8305 ; WX 201 ; N uni2071 ; G 1991 +U 8308 ; WX 401 ; N uni2074 ; G 1992 +U 8309 ; WX 401 ; N uni2075 ; G 1993 +U 8310 ; WX 401 ; N uni2076 ; G 1994 +U 8311 ; WX 401 ; N uni2077 ; G 1995 +U 8312 ; WX 401 ; N uni2078 ; G 1996 +U 8313 ; WX 401 ; N uni2079 ; G 1997 +U 8314 ; WX 528 ; N uni207A ; G 1998 +U 8315 ; WX 528 ; N uni207B ; G 1999 +U 8316 ; WX 528 ; N uni207C ; G 2000 +U 8317 ; WX 246 ; N uni207D ; G 2001 +U 8318 ; WX 246 ; N uni207E ; G 2002 +U 8319 ; WX 433 ; N uni207F ; G 2003 +U 8320 ; WX 401 ; N uni2080 ; G 2004 +U 8321 ; WX 401 ; N uni2081 ; G 2005 +U 8322 ; WX 401 ; N uni2082 ; G 2006 +U 8323 ; WX 401 ; N uni2083 ; G 2007 +U 8324 ; WX 401 ; N uni2084 ; G 2008 +U 8325 ; WX 401 ; N uni2085 ; G 2009 +U 8326 ; WX 401 ; N uni2086 ; G 2010 +U 8327 ; WX 401 ; N uni2087 ; G 2011 +U 8328 ; WX 401 ; N uni2088 ; G 2012 +U 8329 ; WX 401 ; N uni2089 ; G 2013 +U 8330 ; WX 528 ; N uni208A ; G 2014 +U 8331 ; WX 528 ; N uni208B ; G 2015 +U 8332 ; WX 528 ; N uni208C ; G 2016 +U 8333 ; WX 246 ; N uni208D ; G 2017 +U 8334 ; WX 246 ; N uni208E ; G 2018 +U 8336 ; WX 386 ; N uni2090 ; G 2019 +U 8337 ; WX 387 ; N uni2091 ; G 2020 +U 8338 ; WX 385 ; N uni2092 ; G 2021 +U 8339 ; WX 424 ; N uni2093 ; G 2022 +U 8340 ; WX 387 ; N uni2094 ; G 2023 +U 8341 ; WX 433 ; N uni2095 ; G 2024 +U 8342 ; WX 365 ; N uni2096 ; G 2025 +U 8343 ; WX 243 ; N uni2097 ; G 2026 +U 8344 ; WX 613 ; N uni2098 ; G 2027 +U 8345 ; WX 433 ; N uni2099 ; G 2028 +U 8346 ; WX 400 ; N uni209A ; G 2029 +U 8347 ; WX 337 ; N uni209B ; G 2030 +U 8348 ; WX 247 ; N uni209C ; G 2031 +U 8358 ; WX 636 ; N uni20A6 ; G 2032 +U 8364 ; WX 636 ; N Euro ; G 2033 +U 8367 ; WX 1057 ; N uni20AF ; G 2034 +U 8369 ; WX 706 ; N uni20B1 ; G 2035 +U 8372 ; WX 780 ; N uni20B4 ; G 2036 +U 8373 ; WX 636 ; N uni20B5 ; G 2037 +U 8376 ; WX 636 ; N uni20B8 ; G 2038 +U 8377 ; WX 636 ; N uni20B9 ; G 2039 +U 8378 ; WX 636 ; N uni20BA ; G 2040 +U 8381 ; WX 636 ; N uni20BD ; G 2041 +U 8450 ; WX 796 ; N uni2102 ; G 2042 +U 8451 ; WX 1119 ; N uni2103 ; G 2043 +U 8457 ; WX 1047 ; N uni2109 ; G 2044 +U 8461 ; WX 945 ; N uni210D ; G 2045 +U 8462 ; WX 644 ; N uni210E ; G 2046 +U 8463 ; WX 644 ; N uni210F ; G 2047 +U 8469 ; WX 914 ; N uni2115 ; G 2048 +U 8470 ; WX 946 ; N uni2116 ; G 2049 +U 8473 ; WX 752 ; N uni2119 ; G 2050 +U 8474 ; WX 871 ; N uni211A ; G 2051 +U 8477 ; WX 831 ; N uni211D ; G 2052 +U 8482 ; WX 1000 ; N trademark ; G 2053 +U 8484 ; WX 730 ; N uni2124 ; G 2054 +U 8486 ; WX 829 ; N uni2126 ; G 2055 +U 8487 ; WX 829 ; N uni2127 ; G 2056 +U 8490 ; WX 747 ; N uni212A ; G 2057 +U 8491 ; WX 722 ; N uni212B ; G 2058 +U 8498 ; WX 694 ; N uni2132 ; G 2059 +U 8508 ; WX 732 ; N uni213C ; G 2060 +U 8509 ; WX 660 ; N uni213D ; G 2061 +U 8510 ; WX 710 ; N uni213E ; G 2062 +U 8511 ; WX 944 ; N uni213F ; G 2063 +U 8512 ; WX 714 ; N uni2140 ; G 2064 +U 8513 ; WX 775 ; N uni2141 ; G 2065 +U 8514 ; WX 557 ; N uni2142 ; G 2066 +U 8515 ; WX 557 ; N uni2143 ; G 2067 +U 8516 ; WX 611 ; N uni2144 ; G 2068 +U 8517 ; WX 867 ; N uni2145 ; G 2069 +U 8518 ; WX 699 ; N uni2146 ; G 2070 +U 8519 ; WX 636 ; N uni2147 ; G 2071 +U 8520 ; WX 380 ; N uni2148 ; G 2072 +U 8521 ; WX 362 ; N uni2149 ; G 2073 +U 8523 ; WX 890 ; N uni214B ; G 2074 +U 8526 ; WX 514 ; N uni214E ; G 2075 +U 8528 ; WX 969 ; N uni2150 ; G 2076 +U 8529 ; WX 969 ; N uni2151 ; G 2077 +U 8530 ; WX 1370 ; N uni2152 ; G 2078 +U 8531 ; WX 969 ; N onethird ; G 2079 +U 8532 ; WX 969 ; N twothirds ; G 2080 +U 8533 ; WX 969 ; N uni2155 ; G 2081 +U 8534 ; WX 969 ; N uni2156 ; G 2082 +U 8535 ; WX 969 ; N uni2157 ; G 2083 +U 8536 ; WX 969 ; N uni2158 ; G 2084 +U 8537 ; WX 969 ; N uni2159 ; G 2085 +U 8538 ; WX 969 ; N uni215A ; G 2086 +U 8539 ; WX 969 ; N oneeighth ; G 2087 +U 8540 ; WX 969 ; N threeeighths ; G 2088 +U 8541 ; WX 969 ; N fiveeighths ; G 2089 +U 8542 ; WX 969 ; N seveneighths ; G 2090 +U 8543 ; WX 568 ; N uni215F ; G 2091 +U 8544 ; WX 395 ; N uni2160 ; G 2092 +U 8545 ; WX 680 ; N uni2161 ; G 2093 +U 8546 ; WX 964 ; N uni2162 ; G 2094 +U 8547 ; WX 999 ; N uni2163 ; G 2095 +U 8548 ; WX 722 ; N uni2164 ; G 2096 +U 8549 ; WX 1006 ; N uni2165 ; G 2097 +U 8550 ; WX 1291 ; N uni2166 ; G 2098 +U 8551 ; WX 1575 ; N uni2167 ; G 2099 +U 8552 ; WX 965 ; N uni2168 ; G 2100 +U 8553 ; WX 712 ; N uni2169 ; G 2101 +U 8554 ; WX 969 ; N uni216A ; G 2102 +U 8555 ; WX 1253 ; N uni216B ; G 2103 +U 8556 ; WX 664 ; N uni216C ; G 2104 +U 8557 ; WX 765 ; N uni216D ; G 2105 +U 8558 ; WX 802 ; N uni216E ; G 2106 +U 8559 ; WX 1024 ; N uni216F ; G 2107 +U 8560 ; WX 320 ; N uni2170 ; G 2108 +U 8561 ; WX 640 ; N uni2171 ; G 2109 +U 8562 ; WX 959 ; N uni2172 ; G 2110 +U 8563 ; WX 885 ; N uni2173 ; G 2111 +U 8564 ; WX 565 ; N uni2174 ; G 2112 +U 8565 ; WX 885 ; N uni2175 ; G 2113 +U 8566 ; WX 1205 ; N uni2176 ; G 2114 +U 8567 ; WX 1524 ; N uni2177 ; G 2115 +U 8568 ; WX 884 ; N uni2178 ; G 2116 +U 8569 ; WX 564 ; N uni2179 ; G 2117 +U 8570 ; WX 884 ; N uni217A ; G 2118 +U 8571 ; WX 1204 ; N uni217B ; G 2119 +U 8572 ; WX 320 ; N uni217C ; G 2120 +U 8573 ; WX 560 ; N uni217D ; G 2121 +U 8574 ; WX 640 ; N uni217E ; G 2122 +U 8575 ; WX 948 ; N uni217F ; G 2123 +U 8576 ; WX 1206 ; N uni2180 ; G 2124 +U 8577 ; WX 802 ; N uni2181 ; G 2125 +U 8578 ; WX 1206 ; N uni2182 ; G 2126 +U 8579 ; WX 765 ; N uni2183 ; G 2127 +U 8580 ; WX 560 ; N uni2184 ; G 2128 +U 8581 ; WX 765 ; N uni2185 ; G 2129 +U 8585 ; WX 969 ; N uni2189 ; G 2130 +U 8592 ; WX 838 ; N arrowleft ; G 2131 +U 8593 ; WX 838 ; N arrowup ; G 2132 +U 8594 ; WX 838 ; N arrowright ; G 2133 +U 8595 ; WX 838 ; N arrowdown ; G 2134 +U 8596 ; WX 838 ; N arrowboth ; G 2135 +U 8597 ; WX 838 ; N arrowupdn ; G 2136 +U 8598 ; WX 838 ; N uni2196 ; G 2137 +U 8599 ; WX 838 ; N uni2197 ; G 2138 +U 8600 ; WX 838 ; N uni2198 ; G 2139 +U 8601 ; WX 838 ; N uni2199 ; G 2140 +U 8602 ; WX 838 ; N uni219A ; G 2141 +U 8603 ; WX 838 ; N uni219B ; G 2142 +U 8604 ; WX 838 ; N uni219C ; G 2143 +U 8605 ; WX 838 ; N uni219D ; G 2144 +U 8606 ; WX 838 ; N uni219E ; G 2145 +U 8607 ; WX 838 ; N uni219F ; G 2146 +U 8608 ; WX 838 ; N uni21A0 ; G 2147 +U 8609 ; WX 838 ; N uni21A1 ; G 2148 +U 8610 ; WX 838 ; N uni21A2 ; G 2149 +U 8611 ; WX 838 ; N uni21A3 ; G 2150 +U 8612 ; WX 838 ; N uni21A4 ; G 2151 +U 8613 ; WX 838 ; N uni21A5 ; G 2152 +U 8614 ; WX 838 ; N uni21A6 ; G 2153 +U 8615 ; WX 838 ; N uni21A7 ; G 2154 +U 8616 ; WX 838 ; N arrowupdnbse ; G 2155 +U 8617 ; WX 838 ; N uni21A9 ; G 2156 +U 8618 ; WX 838 ; N uni21AA ; G 2157 +U 8619 ; WX 838 ; N uni21AB ; G 2158 +U 8620 ; WX 838 ; N uni21AC ; G 2159 +U 8621 ; WX 838 ; N uni21AD ; G 2160 +U 8622 ; WX 838 ; N uni21AE ; G 2161 +U 8623 ; WX 838 ; N uni21AF ; G 2162 +U 8624 ; WX 838 ; N uni21B0 ; G 2163 +U 8625 ; WX 838 ; N uni21B1 ; G 2164 +U 8626 ; WX 838 ; N uni21B2 ; G 2165 +U 8627 ; WX 838 ; N uni21B3 ; G 2166 +U 8628 ; WX 838 ; N uni21B4 ; G 2167 +U 8629 ; WX 838 ; N carriagereturn ; G 2168 +U 8630 ; WX 838 ; N uni21B6 ; G 2169 +U 8631 ; WX 838 ; N uni21B7 ; G 2170 +U 8632 ; WX 838 ; N uni21B8 ; G 2171 +U 8633 ; WX 838 ; N uni21B9 ; G 2172 +U 8634 ; WX 838 ; N uni21BA ; G 2173 +U 8635 ; WX 838 ; N uni21BB ; G 2174 +U 8636 ; WX 838 ; N uni21BC ; G 2175 +U 8637 ; WX 838 ; N uni21BD ; G 2176 +U 8638 ; WX 838 ; N uni21BE ; G 2177 +U 8639 ; WX 838 ; N uni21BF ; G 2178 +U 8640 ; WX 838 ; N uni21C0 ; G 2179 +U 8641 ; WX 838 ; N uni21C1 ; G 2180 +U 8642 ; WX 838 ; N uni21C2 ; G 2181 +U 8643 ; WX 838 ; N uni21C3 ; G 2182 +U 8644 ; WX 838 ; N uni21C4 ; G 2183 +U 8645 ; WX 838 ; N uni21C5 ; G 2184 +U 8646 ; WX 838 ; N uni21C6 ; G 2185 +U 8647 ; WX 838 ; N uni21C7 ; G 2186 +U 8648 ; WX 838 ; N uni21C8 ; G 2187 +U 8649 ; WX 838 ; N uni21C9 ; G 2188 +U 8650 ; WX 838 ; N uni21CA ; G 2189 +U 8651 ; WX 838 ; N uni21CB ; G 2190 +U 8652 ; WX 838 ; N uni21CC ; G 2191 +U 8653 ; WX 838 ; N uni21CD ; G 2192 +U 8654 ; WX 838 ; N uni21CE ; G 2193 +U 8655 ; WX 838 ; N uni21CF ; G 2194 +U 8656 ; WX 838 ; N arrowdblleft ; G 2195 +U 8657 ; WX 838 ; N arrowdblup ; G 2196 +U 8658 ; WX 838 ; N arrowdblright ; G 2197 +U 8659 ; WX 838 ; N arrowdbldown ; G 2198 +U 8660 ; WX 838 ; N arrowdblboth ; G 2199 +U 8661 ; WX 838 ; N uni21D5 ; G 2200 +U 8662 ; WX 838 ; N uni21D6 ; G 2201 +U 8663 ; WX 838 ; N uni21D7 ; G 2202 +U 8664 ; WX 838 ; N uni21D8 ; G 2203 +U 8665 ; WX 838 ; N uni21D9 ; G 2204 +U 8666 ; WX 838 ; N uni21DA ; G 2205 +U 8667 ; WX 838 ; N uni21DB ; G 2206 +U 8668 ; WX 838 ; N uni21DC ; G 2207 +U 8669 ; WX 838 ; N uni21DD ; G 2208 +U 8670 ; WX 838 ; N uni21DE ; G 2209 +U 8671 ; WX 838 ; N uni21DF ; G 2210 +U 8672 ; WX 838 ; N uni21E0 ; G 2211 +U 8673 ; WX 838 ; N uni21E1 ; G 2212 +U 8674 ; WX 838 ; N uni21E2 ; G 2213 +U 8675 ; WX 838 ; N uni21E3 ; G 2214 +U 8676 ; WX 838 ; N uni21E4 ; G 2215 +U 8677 ; WX 838 ; N uni21E5 ; G 2216 +U 8678 ; WX 838 ; N uni21E6 ; G 2217 +U 8679 ; WX 838 ; N uni21E7 ; G 2218 +U 8680 ; WX 838 ; N uni21E8 ; G 2219 +U 8681 ; WX 838 ; N uni21E9 ; G 2220 +U 8682 ; WX 838 ; N uni21EA ; G 2221 +U 8683 ; WX 838 ; N uni21EB ; G 2222 +U 8684 ; WX 838 ; N uni21EC ; G 2223 +U 8685 ; WX 838 ; N uni21ED ; G 2224 +U 8686 ; WX 838 ; N uni21EE ; G 2225 +U 8687 ; WX 838 ; N uni21EF ; G 2226 +U 8688 ; WX 838 ; N uni21F0 ; G 2227 +U 8689 ; WX 838 ; N uni21F1 ; G 2228 +U 8690 ; WX 838 ; N uni21F2 ; G 2229 +U 8691 ; WX 838 ; N uni21F3 ; G 2230 +U 8692 ; WX 838 ; N uni21F4 ; G 2231 +U 8693 ; WX 838 ; N uni21F5 ; G 2232 +U 8694 ; WX 838 ; N uni21F6 ; G 2233 +U 8695 ; WX 838 ; N uni21F7 ; G 2234 +U 8696 ; WX 838 ; N uni21F8 ; G 2235 +U 8697 ; WX 838 ; N uni21F9 ; G 2236 +U 8698 ; WX 838 ; N uni21FA ; G 2237 +U 8699 ; WX 838 ; N uni21FB ; G 2238 +U 8700 ; WX 838 ; N uni21FC ; G 2239 +U 8701 ; WX 838 ; N uni21FD ; G 2240 +U 8702 ; WX 838 ; N uni21FE ; G 2241 +U 8703 ; WX 838 ; N uni21FF ; G 2242 +U 8704 ; WX 604 ; N universal ; G 2243 +U 8706 ; WX 517 ; N partialdiff ; G 2244 +U 8707 ; WX 542 ; N existential ; G 2245 +U 8708 ; WX 542 ; N uni2204 ; G 2246 +U 8710 ; WX 698 ; N increment ; G 2247 +U 8711 ; WX 698 ; N gradient ; G 2248 +U 8712 ; WX 740 ; N element ; G 2249 +U 8713 ; WX 740 ; N notelement ; G 2250 +U 8715 ; WX 740 ; N suchthat ; G 2251 +U 8716 ; WX 740 ; N uni220C ; G 2252 +U 8719 ; WX 796 ; N product ; G 2253 +U 8720 ; WX 796 ; N uni2210 ; G 2254 +U 8721 ; WX 714 ; N summation ; G 2255 +U 8722 ; WX 838 ; N minus ; G 2256 +U 8723 ; WX 838 ; N uni2213 ; G 2257 +U 8724 ; WX 838 ; N uni2214 ; G 2258 +U 8725 ; WX 337 ; N uni2215 ; G 2259 +U 8727 ; WX 680 ; N asteriskmath ; G 2260 +U 8728 ; WX 490 ; N uni2218 ; G 2261 +U 8729 ; WX 490 ; N uni2219 ; G 2262 +U 8730 ; WX 637 ; N radical ; G 2263 +U 8731 ; WX 637 ; N uni221B ; G 2264 +U 8732 ; WX 637 ; N uni221C ; G 2265 +U 8733 ; WX 677 ; N proportional ; G 2266 +U 8734 ; WX 833 ; N infinity ; G 2267 +U 8735 ; WX 838 ; N orthogonal ; G 2268 +U 8736 ; WX 838 ; N angle ; G 2269 +U 8739 ; WX 291 ; N uni2223 ; G 2270 +U 8740 ; WX 479 ; N uni2224 ; G 2271 +U 8741 ; WX 462 ; N uni2225 ; G 2272 +U 8742 ; WX 634 ; N uni2226 ; G 2273 +U 8743 ; WX 732 ; N logicaland ; G 2274 +U 8744 ; WX 732 ; N logicalor ; G 2275 +U 8745 ; WX 838 ; N intersection ; G 2276 +U 8746 ; WX 838 ; N union ; G 2277 +U 8747 ; WX 521 ; N integral ; G 2278 +U 8748 ; WX 852 ; N uni222C ; G 2279 +U 8749 ; WX 1182 ; N uni222D ; G 2280 +U 8760 ; WX 838 ; N uni2238 ; G 2281 +U 8761 ; WX 838 ; N uni2239 ; G 2282 +U 8762 ; WX 838 ; N uni223A ; G 2283 +U 8763 ; WX 838 ; N uni223B ; G 2284 +U 8764 ; WX 838 ; N similar ; G 2285 +U 8765 ; WX 838 ; N uni223D ; G 2286 +U 8770 ; WX 838 ; N uni2242 ; G 2287 +U 8771 ; WX 838 ; N uni2243 ; G 2288 +U 8776 ; WX 838 ; N approxequal ; G 2289 +U 8784 ; WX 838 ; N uni2250 ; G 2290 +U 8785 ; WX 838 ; N uni2251 ; G 2291 +U 8786 ; WX 838 ; N uni2252 ; G 2292 +U 8787 ; WX 838 ; N uni2253 ; G 2293 +U 8788 ; WX 1033 ; N uni2254 ; G 2294 +U 8789 ; WX 1033 ; N uni2255 ; G 2295 +U 8800 ; WX 838 ; N notequal ; G 2296 +U 8801 ; WX 838 ; N equivalence ; G 2297 +U 8804 ; WX 838 ; N lessequal ; G 2298 +U 8805 ; WX 838 ; N greaterequal ; G 2299 +U 8834 ; WX 838 ; N propersubset ; G 2300 +U 8835 ; WX 838 ; N propersuperset ; G 2301 +U 8836 ; WX 838 ; N notsubset ; G 2302 +U 8837 ; WX 838 ; N uni2285 ; G 2303 +U 8838 ; WX 838 ; N reflexsubset ; G 2304 +U 8839 ; WX 838 ; N reflexsuperset ; G 2305 +U 8844 ; WX 838 ; N uni228C ; G 2306 +U 8845 ; WX 838 ; N uni228D ; G 2307 +U 8846 ; WX 838 ; N uni228E ; G 2308 +U 8847 ; WX 846 ; N uni228F ; G 2309 +U 8848 ; WX 846 ; N uni2290 ; G 2310 +U 8849 ; WX 846 ; N uni2291 ; G 2311 +U 8850 ; WX 846 ; N uni2292 ; G 2312 +U 8851 ; WX 838 ; N uni2293 ; G 2313 +U 8852 ; WX 838 ; N uni2294 ; G 2314 +U 8853 ; WX 838 ; N circleplus ; G 2315 +U 8854 ; WX 838 ; N uni2296 ; G 2316 +U 8855 ; WX 838 ; N circlemultiply ; G 2317 +U 8856 ; WX 838 ; N uni2298 ; G 2318 +U 8857 ; WX 838 ; N uni2299 ; G 2319 +U 8858 ; WX 838 ; N uni229A ; G 2320 +U 8859 ; WX 838 ; N uni229B ; G 2321 +U 8860 ; WX 838 ; N uni229C ; G 2322 +U 8861 ; WX 838 ; N uni229D ; G 2323 +U 8862 ; WX 838 ; N uni229E ; G 2324 +U 8863 ; WX 838 ; N uni229F ; G 2325 +U 8864 ; WX 838 ; N uni22A0 ; G 2326 +U 8865 ; WX 838 ; N uni22A1 ; G 2327 +U 8866 ; WX 860 ; N uni22A2 ; G 2328 +U 8867 ; WX 860 ; N uni22A3 ; G 2329 +U 8868 ; WX 940 ; N uni22A4 ; G 2330 +U 8869 ; WX 940 ; N perpendicular ; G 2331 +U 8870 ; WX 567 ; N uni22A6 ; G 2332 +U 8871 ; WX 567 ; N uni22A7 ; G 2333 +U 8872 ; WX 860 ; N uni22A8 ; G 2334 +U 8873 ; WX 860 ; N uni22A9 ; G 2335 +U 8874 ; WX 860 ; N uni22AA ; G 2336 +U 8875 ; WX 1031 ; N uni22AB ; G 2337 +U 8876 ; WX 860 ; N uni22AC ; G 2338 +U 8877 ; WX 860 ; N uni22AD ; G 2339 +U 8878 ; WX 860 ; N uni22AE ; G 2340 +U 8879 ; WX 1031 ; N uni22AF ; G 2341 +U 8900 ; WX 626 ; N uni22C4 ; G 2342 +U 8901 ; WX 342 ; N dotmath ; G 2343 +U 8962 ; WX 764 ; N house ; G 2344 +U 8968 ; WX 390 ; N uni2308 ; G 2345 +U 8969 ; WX 390 ; N uni2309 ; G 2346 +U 8970 ; WX 390 ; N uni230A ; G 2347 +U 8971 ; WX 390 ; N uni230B ; G 2348 +U 8976 ; WX 838 ; N revlogicalnot ; G 2349 +U 8977 ; WX 513 ; N uni2311 ; G 2350 +U 8984 ; WX 1000 ; N uni2318 ; G 2351 +U 8985 ; WX 838 ; N uni2319 ; G 2352 +U 8992 ; WX 521 ; N integraltp ; G 2353 +U 8993 ; WX 521 ; N integralbt ; G 2354 +U 8997 ; WX 1000 ; N uni2325 ; G 2355 +U 9000 ; WX 1443 ; N uni2328 ; G 2356 +U 9085 ; WX 919 ; N uni237D ; G 2357 +U 9115 ; WX 500 ; N uni239B ; G 2358 +U 9116 ; WX 500 ; N uni239C ; G 2359 +U 9117 ; WX 500 ; N uni239D ; G 2360 +U 9118 ; WX 500 ; N uni239E ; G 2361 +U 9119 ; WX 500 ; N uni239F ; G 2362 +U 9120 ; WX 500 ; N uni23A0 ; G 2363 +U 9121 ; WX 500 ; N uni23A1 ; G 2364 +U 9122 ; WX 500 ; N uni23A2 ; G 2365 +U 9123 ; WX 500 ; N uni23A3 ; G 2366 +U 9124 ; WX 500 ; N uni23A4 ; G 2367 +U 9125 ; WX 500 ; N uni23A5 ; G 2368 +U 9126 ; WX 500 ; N uni23A6 ; G 2369 +U 9127 ; WX 750 ; N uni23A7 ; G 2370 +U 9128 ; WX 750 ; N uni23A8 ; G 2371 +U 9129 ; WX 750 ; N uni23A9 ; G 2372 +U 9130 ; WX 750 ; N uni23AA ; G 2373 +U 9131 ; WX 750 ; N uni23AB ; G 2374 +U 9132 ; WX 750 ; N uni23AC ; G 2375 +U 9133 ; WX 750 ; N uni23AD ; G 2376 +U 9134 ; WX 521 ; N uni23AE ; G 2377 +U 9143 ; WX 637 ; N uni23B7 ; G 2378 +U 9167 ; WX 945 ; N uni23CF ; G 2379 +U 9251 ; WX 764 ; N uni2423 ; G 2380 +U 9472 ; WX 602 ; N SF100000 ; G 2381 +U 9473 ; WX 602 ; N uni2501 ; G 2382 +U 9474 ; WX 602 ; N SF110000 ; G 2383 +U 9475 ; WX 602 ; N uni2503 ; G 2384 +U 9476 ; WX 602 ; N uni2504 ; G 2385 +U 9477 ; WX 602 ; N uni2505 ; G 2386 +U 9478 ; WX 602 ; N uni2506 ; G 2387 +U 9479 ; WX 602 ; N uni2507 ; G 2388 +U 9480 ; WX 602 ; N uni2508 ; G 2389 +U 9481 ; WX 602 ; N uni2509 ; G 2390 +U 9482 ; WX 602 ; N uni250A ; G 2391 +U 9483 ; WX 602 ; N uni250B ; G 2392 +U 9484 ; WX 602 ; N SF010000 ; G 2393 +U 9485 ; WX 602 ; N uni250D ; G 2394 +U 9486 ; WX 602 ; N uni250E ; G 2395 +U 9487 ; WX 602 ; N uni250F ; G 2396 +U 9488 ; WX 602 ; N SF030000 ; G 2397 +U 9489 ; WX 602 ; N uni2511 ; G 2398 +U 9490 ; WX 602 ; N uni2512 ; G 2399 +U 9491 ; WX 602 ; N uni2513 ; G 2400 +U 9492 ; WX 602 ; N SF020000 ; G 2401 +U 9493 ; WX 602 ; N uni2515 ; G 2402 +U 9494 ; WX 602 ; N uni2516 ; G 2403 +U 9495 ; WX 602 ; N uni2517 ; G 2404 +U 9496 ; WX 602 ; N SF040000 ; G 2405 +U 9497 ; WX 602 ; N uni2519 ; G 2406 +U 9498 ; WX 602 ; N uni251A ; G 2407 +U 9499 ; WX 602 ; N uni251B ; G 2408 +U 9500 ; WX 602 ; N SF080000 ; G 2409 +U 9501 ; WX 602 ; N uni251D ; G 2410 +U 9502 ; WX 602 ; N uni251E ; G 2411 +U 9503 ; WX 602 ; N uni251F ; G 2412 +U 9504 ; WX 602 ; N uni2520 ; G 2413 +U 9505 ; WX 602 ; N uni2521 ; G 2414 +U 9506 ; WX 602 ; N uni2522 ; G 2415 +U 9507 ; WX 602 ; N uni2523 ; G 2416 +U 9508 ; WX 602 ; N SF090000 ; G 2417 +U 9509 ; WX 602 ; N uni2525 ; G 2418 +U 9510 ; WX 602 ; N uni2526 ; G 2419 +U 9511 ; WX 602 ; N uni2527 ; G 2420 +U 9512 ; WX 602 ; N uni2528 ; G 2421 +U 9513 ; WX 602 ; N uni2529 ; G 2422 +U 9514 ; WX 602 ; N uni252A ; G 2423 +U 9515 ; WX 602 ; N uni252B ; G 2424 +U 9516 ; WX 602 ; N SF060000 ; G 2425 +U 9517 ; WX 602 ; N uni252D ; G 2426 +U 9518 ; WX 602 ; N uni252E ; G 2427 +U 9519 ; WX 602 ; N uni252F ; G 2428 +U 9520 ; WX 602 ; N uni2530 ; G 2429 +U 9521 ; WX 602 ; N uni2531 ; G 2430 +U 9522 ; WX 602 ; N uni2532 ; G 2431 +U 9523 ; WX 602 ; N uni2533 ; G 2432 +U 9524 ; WX 602 ; N SF070000 ; G 2433 +U 9525 ; WX 602 ; N uni2535 ; G 2434 +U 9526 ; WX 602 ; N uni2536 ; G 2435 +U 9527 ; WX 602 ; N uni2537 ; G 2436 +U 9528 ; WX 602 ; N uni2538 ; G 2437 +U 9529 ; WX 602 ; N uni2539 ; G 2438 +U 9530 ; WX 602 ; N uni253A ; G 2439 +U 9531 ; WX 602 ; N uni253B ; G 2440 +U 9532 ; WX 602 ; N SF050000 ; G 2441 +U 9533 ; WX 602 ; N uni253D ; G 2442 +U 9534 ; WX 602 ; N uni253E ; G 2443 +U 9535 ; WX 602 ; N uni253F ; G 2444 +U 9536 ; WX 602 ; N uni2540 ; G 2445 +U 9537 ; WX 602 ; N uni2541 ; G 2446 +U 9538 ; WX 602 ; N uni2542 ; G 2447 +U 9539 ; WX 602 ; N uni2543 ; G 2448 +U 9540 ; WX 602 ; N uni2544 ; G 2449 +U 9541 ; WX 602 ; N uni2545 ; G 2450 +U 9542 ; WX 602 ; N uni2546 ; G 2451 +U 9543 ; WX 602 ; N uni2547 ; G 2452 +U 9544 ; WX 602 ; N uni2548 ; G 2453 +U 9545 ; WX 602 ; N uni2549 ; G 2454 +U 9546 ; WX 602 ; N uni254A ; G 2455 +U 9547 ; WX 602 ; N uni254B ; G 2456 +U 9548 ; WX 602 ; N uni254C ; G 2457 +U 9549 ; WX 602 ; N uni254D ; G 2458 +U 9550 ; WX 602 ; N uni254E ; G 2459 +U 9551 ; WX 602 ; N uni254F ; G 2460 +U 9552 ; WX 602 ; N SF430000 ; G 2461 +U 9553 ; WX 602 ; N SF240000 ; G 2462 +U 9554 ; WX 602 ; N SF510000 ; G 2463 +U 9555 ; WX 602 ; N SF520000 ; G 2464 +U 9556 ; WX 602 ; N SF390000 ; G 2465 +U 9557 ; WX 602 ; N SF220000 ; G 2466 +U 9558 ; WX 602 ; N SF210000 ; G 2467 +U 9559 ; WX 602 ; N SF250000 ; G 2468 +U 9560 ; WX 602 ; N SF500000 ; G 2469 +U 9561 ; WX 602 ; N SF490000 ; G 2470 +U 9562 ; WX 602 ; N SF380000 ; G 2471 +U 9563 ; WX 602 ; N SF280000 ; G 2472 +U 9564 ; WX 602 ; N SF270000 ; G 2473 +U 9565 ; WX 602 ; N SF260000 ; G 2474 +U 9566 ; WX 602 ; N SF360000 ; G 2475 +U 9567 ; WX 602 ; N SF370000 ; G 2476 +U 9568 ; WX 602 ; N SF420000 ; G 2477 +U 9569 ; WX 602 ; N SF190000 ; G 2478 +U 9570 ; WX 602 ; N SF200000 ; G 2479 +U 9571 ; WX 602 ; N SF230000 ; G 2480 +U 9572 ; WX 602 ; N SF470000 ; G 2481 +U 9573 ; WX 602 ; N SF480000 ; G 2482 +U 9574 ; WX 602 ; N SF410000 ; G 2483 +U 9575 ; WX 602 ; N SF450000 ; G 2484 +U 9576 ; WX 602 ; N SF460000 ; G 2485 +U 9577 ; WX 602 ; N SF400000 ; G 2486 +U 9578 ; WX 602 ; N SF540000 ; G 2487 +U 9579 ; WX 602 ; N SF530000 ; G 2488 +U 9580 ; WX 602 ; N SF440000 ; G 2489 +U 9581 ; WX 602 ; N uni256D ; G 2490 +U 9582 ; WX 602 ; N uni256E ; G 2491 +U 9583 ; WX 602 ; N uni256F ; G 2492 +U 9584 ; WX 602 ; N uni2570 ; G 2493 +U 9585 ; WX 602 ; N uni2571 ; G 2494 +U 9586 ; WX 602 ; N uni2572 ; G 2495 +U 9587 ; WX 602 ; N uni2573 ; G 2496 +U 9588 ; WX 602 ; N uni2574 ; G 2497 +U 9589 ; WX 602 ; N uni2575 ; G 2498 +U 9590 ; WX 602 ; N uni2576 ; G 2499 +U 9591 ; WX 602 ; N uni2577 ; G 2500 +U 9592 ; WX 602 ; N uni2578 ; G 2501 +U 9593 ; WX 602 ; N uni2579 ; G 2502 +U 9594 ; WX 602 ; N uni257A ; G 2503 +U 9595 ; WX 602 ; N uni257B ; G 2504 +U 9596 ; WX 602 ; N uni257C ; G 2505 +U 9597 ; WX 602 ; N uni257D ; G 2506 +U 9598 ; WX 602 ; N uni257E ; G 2507 +U 9599 ; WX 602 ; N uni257F ; G 2508 +U 9600 ; WX 769 ; N upblock ; G 2509 +U 9601 ; WX 769 ; N uni2581 ; G 2510 +U 9602 ; WX 769 ; N uni2582 ; G 2511 +U 9603 ; WX 769 ; N uni2583 ; G 2512 +U 9604 ; WX 769 ; N dnblock ; G 2513 +U 9605 ; WX 769 ; N uni2585 ; G 2514 +U 9606 ; WX 769 ; N uni2586 ; G 2515 +U 9607 ; WX 769 ; N uni2587 ; G 2516 +U 9608 ; WX 769 ; N block ; G 2517 +U 9609 ; WX 769 ; N uni2589 ; G 2518 +U 9610 ; WX 769 ; N uni258A ; G 2519 +U 9611 ; WX 769 ; N uni258B ; G 2520 +U 9612 ; WX 769 ; N lfblock ; G 2521 +U 9613 ; WX 769 ; N uni258D ; G 2522 +U 9614 ; WX 769 ; N uni258E ; G 2523 +U 9615 ; WX 769 ; N uni258F ; G 2524 +U 9616 ; WX 769 ; N rtblock ; G 2525 +U 9617 ; WX 769 ; N ltshade ; G 2526 +U 9618 ; WX 769 ; N shade ; G 2527 +U 9619 ; WX 769 ; N dkshade ; G 2528 +U 9620 ; WX 769 ; N uni2594 ; G 2529 +U 9621 ; WX 769 ; N uni2595 ; G 2530 +U 9622 ; WX 769 ; N uni2596 ; G 2531 +U 9623 ; WX 769 ; N uni2597 ; G 2532 +U 9624 ; WX 769 ; N uni2598 ; G 2533 +U 9625 ; WX 769 ; N uni2599 ; G 2534 +U 9626 ; WX 769 ; N uni259A ; G 2535 +U 9627 ; WX 769 ; N uni259B ; G 2536 +U 9628 ; WX 769 ; N uni259C ; G 2537 +U 9629 ; WX 769 ; N uni259D ; G 2538 +U 9630 ; WX 769 ; N uni259E ; G 2539 +U 9631 ; WX 769 ; N uni259F ; G 2540 +U 9632 ; WX 945 ; N filledbox ; G 2541 +U 9633 ; WX 945 ; N H22073 ; G 2542 +U 9634 ; WX 945 ; N uni25A2 ; G 2543 +U 9635 ; WX 945 ; N uni25A3 ; G 2544 +U 9636 ; WX 945 ; N uni25A4 ; G 2545 +U 9637 ; WX 945 ; N uni25A5 ; G 2546 +U 9638 ; WX 945 ; N uni25A6 ; G 2547 +U 9639 ; WX 945 ; N uni25A7 ; G 2548 +U 9640 ; WX 945 ; N uni25A8 ; G 2549 +U 9641 ; WX 945 ; N uni25A9 ; G 2550 +U 9642 ; WX 678 ; N H18543 ; G 2551 +U 9643 ; WX 678 ; N H18551 ; G 2552 +U 9644 ; WX 945 ; N filledrect ; G 2553 +U 9645 ; WX 945 ; N uni25AD ; G 2554 +U 9646 ; WX 550 ; N uni25AE ; G 2555 +U 9647 ; WX 550 ; N uni25AF ; G 2556 +U 9648 ; WX 769 ; N uni25B0 ; G 2557 +U 9649 ; WX 769 ; N uni25B1 ; G 2558 +U 9650 ; WX 769 ; N triagup ; G 2559 +U 9651 ; WX 769 ; N uni25B3 ; G 2560 +U 9652 ; WX 502 ; N uni25B4 ; G 2561 +U 9653 ; WX 502 ; N uni25B5 ; G 2562 +U 9654 ; WX 769 ; N uni25B6 ; G 2563 +U 9655 ; WX 769 ; N uni25B7 ; G 2564 +U 9656 ; WX 502 ; N uni25B8 ; G 2565 +U 9657 ; WX 502 ; N uni25B9 ; G 2566 +U 9658 ; WX 769 ; N triagrt ; G 2567 +U 9659 ; WX 769 ; N uni25BB ; G 2568 +U 9660 ; WX 769 ; N triagdn ; G 2569 +U 9661 ; WX 769 ; N uni25BD ; G 2570 +U 9662 ; WX 502 ; N uni25BE ; G 2571 +U 9663 ; WX 502 ; N uni25BF ; G 2572 +U 9664 ; WX 769 ; N uni25C0 ; G 2573 +U 9665 ; WX 769 ; N uni25C1 ; G 2574 +U 9666 ; WX 502 ; N uni25C2 ; G 2575 +U 9667 ; WX 502 ; N uni25C3 ; G 2576 +U 9668 ; WX 769 ; N triaglf ; G 2577 +U 9669 ; WX 769 ; N uni25C5 ; G 2578 +U 9670 ; WX 769 ; N uni25C6 ; G 2579 +U 9671 ; WX 769 ; N uni25C7 ; G 2580 +U 9672 ; WX 769 ; N uni25C8 ; G 2581 +U 9673 ; WX 873 ; N uni25C9 ; G 2582 +U 9674 ; WX 494 ; N lozenge ; G 2583 +U 9675 ; WX 873 ; N circle ; G 2584 +U 9676 ; WX 873 ; N uni25CC ; G 2585 +U 9677 ; WX 873 ; N uni25CD ; G 2586 +U 9678 ; WX 873 ; N uni25CE ; G 2587 +U 9679 ; WX 873 ; N H18533 ; G 2588 +U 9680 ; WX 873 ; N uni25D0 ; G 2589 +U 9681 ; WX 873 ; N uni25D1 ; G 2590 +U 9682 ; WX 873 ; N uni25D2 ; G 2591 +U 9683 ; WX 873 ; N uni25D3 ; G 2592 +U 9684 ; WX 873 ; N uni25D4 ; G 2593 +U 9685 ; WX 873 ; N uni25D5 ; G 2594 +U 9686 ; WX 527 ; N uni25D6 ; G 2595 +U 9687 ; WX 527 ; N uni25D7 ; G 2596 +U 9688 ; WX 791 ; N invbullet ; G 2597 +U 9689 ; WX 970 ; N invcircle ; G 2598 +U 9690 ; WX 970 ; N uni25DA ; G 2599 +U 9691 ; WX 970 ; N uni25DB ; G 2600 +U 9692 ; WX 387 ; N uni25DC ; G 2601 +U 9693 ; WX 387 ; N uni25DD ; G 2602 +U 9694 ; WX 387 ; N uni25DE ; G 2603 +U 9695 ; WX 387 ; N uni25DF ; G 2604 +U 9696 ; WX 873 ; N uni25E0 ; G 2605 +U 9697 ; WX 873 ; N uni25E1 ; G 2606 +U 9698 ; WX 769 ; N uni25E2 ; G 2607 +U 9699 ; WX 769 ; N uni25E3 ; G 2608 +U 9700 ; WX 769 ; N uni25E4 ; G 2609 +U 9701 ; WX 769 ; N uni25E5 ; G 2610 +U 9702 ; WX 590 ; N openbullet ; G 2611 +U 9703 ; WX 945 ; N uni25E7 ; G 2612 +U 9704 ; WX 945 ; N uni25E8 ; G 2613 +U 9705 ; WX 945 ; N uni25E9 ; G 2614 +U 9706 ; WX 945 ; N uni25EA ; G 2615 +U 9707 ; WX 945 ; N uni25EB ; G 2616 +U 9708 ; WX 769 ; N uni25EC ; G 2617 +U 9709 ; WX 769 ; N uni25ED ; G 2618 +U 9710 ; WX 769 ; N uni25EE ; G 2619 +U 9711 ; WX 1119 ; N uni25EF ; G 2620 +U 9712 ; WX 945 ; N uni25F0 ; G 2621 +U 9713 ; WX 945 ; N uni25F1 ; G 2622 +U 9714 ; WX 945 ; N uni25F2 ; G 2623 +U 9715 ; WX 945 ; N uni25F3 ; G 2624 +U 9716 ; WX 873 ; N uni25F4 ; G 2625 +U 9717 ; WX 873 ; N uni25F5 ; G 2626 +U 9718 ; WX 873 ; N uni25F6 ; G 2627 +U 9719 ; WX 873 ; N uni25F7 ; G 2628 +U 9720 ; WX 769 ; N uni25F8 ; G 2629 +U 9721 ; WX 769 ; N uni25F9 ; G 2630 +U 9722 ; WX 769 ; N uni25FA ; G 2631 +U 9723 ; WX 830 ; N uni25FB ; G 2632 +U 9724 ; WX 830 ; N uni25FC ; G 2633 +U 9725 ; WX 732 ; N uni25FD ; G 2634 +U 9726 ; WX 732 ; N uni25FE ; G 2635 +U 9727 ; WX 769 ; N uni25FF ; G 2636 +U 9728 ; WX 896 ; N uni2600 ; G 2637 +U 9784 ; WX 896 ; N uni2638 ; G 2638 +U 9785 ; WX 896 ; N uni2639 ; G 2639 +U 9786 ; WX 896 ; N smileface ; G 2640 +U 9787 ; WX 896 ; N invsmileface ; G 2641 +U 9788 ; WX 896 ; N sun ; G 2642 +U 9791 ; WX 614 ; N uni263F ; G 2643 +U 9792 ; WX 731 ; N female ; G 2644 +U 9793 ; WX 731 ; N uni2641 ; G 2645 +U 9794 ; WX 896 ; N male ; G 2646 +U 9795 ; WX 896 ; N uni2643 ; G 2647 +U 9796 ; WX 896 ; N uni2644 ; G 2648 +U 9797 ; WX 896 ; N uni2645 ; G 2649 +U 9798 ; WX 896 ; N uni2646 ; G 2650 +U 9799 ; WX 896 ; N uni2647 ; G 2651 +U 9824 ; WX 896 ; N spade ; G 2652 +U 9825 ; WX 896 ; N uni2661 ; G 2653 +U 9826 ; WX 896 ; N uni2662 ; G 2654 +U 9827 ; WX 896 ; N club ; G 2655 +U 9828 ; WX 896 ; N uni2664 ; G 2656 +U 9829 ; WX 896 ; N heart ; G 2657 +U 9830 ; WX 896 ; N diamond ; G 2658 +U 9831 ; WX 896 ; N uni2667 ; G 2659 +U 9833 ; WX 472 ; N uni2669 ; G 2660 +U 9834 ; WX 638 ; N musicalnote ; G 2661 +U 9835 ; WX 896 ; N musicalnotedbl ; G 2662 +U 9836 ; WX 896 ; N uni266C ; G 2663 +U 9837 ; WX 472 ; N uni266D ; G 2664 +U 9838 ; WX 357 ; N uni266E ; G 2665 +U 9839 ; WX 484 ; N uni266F ; G 2666 +U 10145 ; WX 838 ; N uni27A1 ; G 2667 +U 10181 ; WX 390 ; N uni27C5 ; G 2668 +U 10182 ; WX 390 ; N uni27C6 ; G 2669 +U 10208 ; WX 494 ; N uni27E0 ; G 2670 +U 10216 ; WX 390 ; N uni27E8 ; G 2671 +U 10217 ; WX 390 ; N uni27E9 ; G 2672 +U 10224 ; WX 838 ; N uni27F0 ; G 2673 +U 10225 ; WX 838 ; N uni27F1 ; G 2674 +U 10226 ; WX 838 ; N uni27F2 ; G 2675 +U 10227 ; WX 838 ; N uni27F3 ; G 2676 +U 10228 ; WX 1033 ; N uni27F4 ; G 2677 +U 10229 ; WX 1434 ; N uni27F5 ; G 2678 +U 10230 ; WX 1434 ; N uni27F6 ; G 2679 +U 10231 ; WX 1434 ; N uni27F7 ; G 2680 +U 10232 ; WX 1434 ; N uni27F8 ; G 2681 +U 10233 ; WX 1434 ; N uni27F9 ; G 2682 +U 10234 ; WX 1434 ; N uni27FA ; G 2683 +U 10235 ; WX 1434 ; N uni27FB ; G 2684 +U 10236 ; WX 1434 ; N uni27FC ; G 2685 +U 10237 ; WX 1434 ; N uni27FD ; G 2686 +U 10238 ; WX 1434 ; N uni27FE ; G 2687 +U 10239 ; WX 1434 ; N uni27FF ; G 2688 +U 10240 ; WX 732 ; N uni2800 ; G 2689 +U 10241 ; WX 732 ; N uni2801 ; G 2690 +U 10242 ; WX 732 ; N uni2802 ; G 2691 +U 10243 ; WX 732 ; N uni2803 ; G 2692 +U 10244 ; WX 732 ; N uni2804 ; G 2693 +U 10245 ; WX 732 ; N uni2805 ; G 2694 +U 10246 ; WX 732 ; N uni2806 ; G 2695 +U 10247 ; WX 732 ; N uni2807 ; G 2696 +U 10248 ; WX 732 ; N uni2808 ; G 2697 +U 10249 ; WX 732 ; N uni2809 ; G 2698 +U 10250 ; WX 732 ; N uni280A ; G 2699 +U 10251 ; WX 732 ; N uni280B ; G 2700 +U 10252 ; WX 732 ; N uni280C ; G 2701 +U 10253 ; WX 732 ; N uni280D ; G 2702 +U 10254 ; WX 732 ; N uni280E ; G 2703 +U 10255 ; WX 732 ; N uni280F ; G 2704 +U 10256 ; WX 732 ; N uni2810 ; G 2705 +U 10257 ; WX 732 ; N uni2811 ; G 2706 +U 10258 ; WX 732 ; N uni2812 ; G 2707 +U 10259 ; WX 732 ; N uni2813 ; G 2708 +U 10260 ; WX 732 ; N uni2814 ; G 2709 +U 10261 ; WX 732 ; N uni2815 ; G 2710 +U 10262 ; WX 732 ; N uni2816 ; G 2711 +U 10263 ; WX 732 ; N uni2817 ; G 2712 +U 10264 ; WX 732 ; N uni2818 ; G 2713 +U 10265 ; WX 732 ; N uni2819 ; G 2714 +U 10266 ; WX 732 ; N uni281A ; G 2715 +U 10267 ; WX 732 ; N uni281B ; G 2716 +U 10268 ; WX 732 ; N uni281C ; G 2717 +U 10269 ; WX 732 ; N uni281D ; G 2718 +U 10270 ; WX 732 ; N uni281E ; G 2719 +U 10271 ; WX 732 ; N uni281F ; G 2720 +U 10272 ; WX 732 ; N uni2820 ; G 2721 +U 10273 ; WX 732 ; N uni2821 ; G 2722 +U 10274 ; WX 732 ; N uni2822 ; G 2723 +U 10275 ; WX 732 ; N uni2823 ; G 2724 +U 10276 ; WX 732 ; N uni2824 ; G 2725 +U 10277 ; WX 732 ; N uni2825 ; G 2726 +U 10278 ; WX 732 ; N uni2826 ; G 2727 +U 10279 ; WX 732 ; N uni2827 ; G 2728 +U 10280 ; WX 732 ; N uni2828 ; G 2729 +U 10281 ; WX 732 ; N uni2829 ; G 2730 +U 10282 ; WX 732 ; N uni282A ; G 2731 +U 10283 ; WX 732 ; N uni282B ; G 2732 +U 10284 ; WX 732 ; N uni282C ; G 2733 +U 10285 ; WX 732 ; N uni282D ; G 2734 +U 10286 ; WX 732 ; N uni282E ; G 2735 +U 10287 ; WX 732 ; N uni282F ; G 2736 +U 10288 ; WX 732 ; N uni2830 ; G 2737 +U 10289 ; WX 732 ; N uni2831 ; G 2738 +U 10290 ; WX 732 ; N uni2832 ; G 2739 +U 10291 ; WX 732 ; N uni2833 ; G 2740 +U 10292 ; WX 732 ; N uni2834 ; G 2741 +U 10293 ; WX 732 ; N uni2835 ; G 2742 +U 10294 ; WX 732 ; N uni2836 ; G 2743 +U 10295 ; WX 732 ; N uni2837 ; G 2744 +U 10296 ; WX 732 ; N uni2838 ; G 2745 +U 10297 ; WX 732 ; N uni2839 ; G 2746 +U 10298 ; WX 732 ; N uni283A ; G 2747 +U 10299 ; WX 732 ; N uni283B ; G 2748 +U 10300 ; WX 732 ; N uni283C ; G 2749 +U 10301 ; WX 732 ; N uni283D ; G 2750 +U 10302 ; WX 732 ; N uni283E ; G 2751 +U 10303 ; WX 732 ; N uni283F ; G 2752 +U 10304 ; WX 732 ; N uni2840 ; G 2753 +U 10305 ; WX 732 ; N uni2841 ; G 2754 +U 10306 ; WX 732 ; N uni2842 ; G 2755 +U 10307 ; WX 732 ; N uni2843 ; G 2756 +U 10308 ; WX 732 ; N uni2844 ; G 2757 +U 10309 ; WX 732 ; N uni2845 ; G 2758 +U 10310 ; WX 732 ; N uni2846 ; G 2759 +U 10311 ; WX 732 ; N uni2847 ; G 2760 +U 10312 ; WX 732 ; N uni2848 ; G 2761 +U 10313 ; WX 732 ; N uni2849 ; G 2762 +U 10314 ; WX 732 ; N uni284A ; G 2763 +U 10315 ; WX 732 ; N uni284B ; G 2764 +U 10316 ; WX 732 ; N uni284C ; G 2765 +U 10317 ; WX 732 ; N uni284D ; G 2766 +U 10318 ; WX 732 ; N uni284E ; G 2767 +U 10319 ; WX 732 ; N uni284F ; G 2768 +U 10320 ; WX 732 ; N uni2850 ; G 2769 +U 10321 ; WX 732 ; N uni2851 ; G 2770 +U 10322 ; WX 732 ; N uni2852 ; G 2771 +U 10323 ; WX 732 ; N uni2853 ; G 2772 +U 10324 ; WX 732 ; N uni2854 ; G 2773 +U 10325 ; WX 732 ; N uni2855 ; G 2774 +U 10326 ; WX 732 ; N uni2856 ; G 2775 +U 10327 ; WX 732 ; N uni2857 ; G 2776 +U 10328 ; WX 732 ; N uni2858 ; G 2777 +U 10329 ; WX 732 ; N uni2859 ; G 2778 +U 10330 ; WX 732 ; N uni285A ; G 2779 +U 10331 ; WX 732 ; N uni285B ; G 2780 +U 10332 ; WX 732 ; N uni285C ; G 2781 +U 10333 ; WX 732 ; N uni285D ; G 2782 +U 10334 ; WX 732 ; N uni285E ; G 2783 +U 10335 ; WX 732 ; N uni285F ; G 2784 +U 10336 ; WX 732 ; N uni2860 ; G 2785 +U 10337 ; WX 732 ; N uni2861 ; G 2786 +U 10338 ; WX 732 ; N uni2862 ; G 2787 +U 10339 ; WX 732 ; N uni2863 ; G 2788 +U 10340 ; WX 732 ; N uni2864 ; G 2789 +U 10341 ; WX 732 ; N uni2865 ; G 2790 +U 10342 ; WX 732 ; N uni2866 ; G 2791 +U 10343 ; WX 732 ; N uni2867 ; G 2792 +U 10344 ; WX 732 ; N uni2868 ; G 2793 +U 10345 ; WX 732 ; N uni2869 ; G 2794 +U 10346 ; WX 732 ; N uni286A ; G 2795 +U 10347 ; WX 732 ; N uni286B ; G 2796 +U 10348 ; WX 732 ; N uni286C ; G 2797 +U 10349 ; WX 732 ; N uni286D ; G 2798 +U 10350 ; WX 732 ; N uni286E ; G 2799 +U 10351 ; WX 732 ; N uni286F ; G 2800 +U 10352 ; WX 732 ; N uni2870 ; G 2801 +U 10353 ; WX 732 ; N uni2871 ; G 2802 +U 10354 ; WX 732 ; N uni2872 ; G 2803 +U 10355 ; WX 732 ; N uni2873 ; G 2804 +U 10356 ; WX 732 ; N uni2874 ; G 2805 +U 10357 ; WX 732 ; N uni2875 ; G 2806 +U 10358 ; WX 732 ; N uni2876 ; G 2807 +U 10359 ; WX 732 ; N uni2877 ; G 2808 +U 10360 ; WX 732 ; N uni2878 ; G 2809 +U 10361 ; WX 732 ; N uni2879 ; G 2810 +U 10362 ; WX 732 ; N uni287A ; G 2811 +U 10363 ; WX 732 ; N uni287B ; G 2812 +U 10364 ; WX 732 ; N uni287C ; G 2813 +U 10365 ; WX 732 ; N uni287D ; G 2814 +U 10366 ; WX 732 ; N uni287E ; G 2815 +U 10367 ; WX 732 ; N uni287F ; G 2816 +U 10368 ; WX 732 ; N uni2880 ; G 2817 +U 10369 ; WX 732 ; N uni2881 ; G 2818 +U 10370 ; WX 732 ; N uni2882 ; G 2819 +U 10371 ; WX 732 ; N uni2883 ; G 2820 +U 10372 ; WX 732 ; N uni2884 ; G 2821 +U 10373 ; WX 732 ; N uni2885 ; G 2822 +U 10374 ; WX 732 ; N uni2886 ; G 2823 +U 10375 ; WX 732 ; N uni2887 ; G 2824 +U 10376 ; WX 732 ; N uni2888 ; G 2825 +U 10377 ; WX 732 ; N uni2889 ; G 2826 +U 10378 ; WX 732 ; N uni288A ; G 2827 +U 10379 ; WX 732 ; N uni288B ; G 2828 +U 10380 ; WX 732 ; N uni288C ; G 2829 +U 10381 ; WX 732 ; N uni288D ; G 2830 +U 10382 ; WX 732 ; N uni288E ; G 2831 +U 10383 ; WX 732 ; N uni288F ; G 2832 +U 10384 ; WX 732 ; N uni2890 ; G 2833 +U 10385 ; WX 732 ; N uni2891 ; G 2834 +U 10386 ; WX 732 ; N uni2892 ; G 2835 +U 10387 ; WX 732 ; N uni2893 ; G 2836 +U 10388 ; WX 732 ; N uni2894 ; G 2837 +U 10389 ; WX 732 ; N uni2895 ; G 2838 +U 10390 ; WX 732 ; N uni2896 ; G 2839 +U 10391 ; WX 732 ; N uni2897 ; G 2840 +U 10392 ; WX 732 ; N uni2898 ; G 2841 +U 10393 ; WX 732 ; N uni2899 ; G 2842 +U 10394 ; WX 732 ; N uni289A ; G 2843 +U 10395 ; WX 732 ; N uni289B ; G 2844 +U 10396 ; WX 732 ; N uni289C ; G 2845 +U 10397 ; WX 732 ; N uni289D ; G 2846 +U 10398 ; WX 732 ; N uni289E ; G 2847 +U 10399 ; WX 732 ; N uni289F ; G 2848 +U 10400 ; WX 732 ; N uni28A0 ; G 2849 +U 10401 ; WX 732 ; N uni28A1 ; G 2850 +U 10402 ; WX 732 ; N uni28A2 ; G 2851 +U 10403 ; WX 732 ; N uni28A3 ; G 2852 +U 10404 ; WX 732 ; N uni28A4 ; G 2853 +U 10405 ; WX 732 ; N uni28A5 ; G 2854 +U 10406 ; WX 732 ; N uni28A6 ; G 2855 +U 10407 ; WX 732 ; N uni28A7 ; G 2856 +U 10408 ; WX 732 ; N uni28A8 ; G 2857 +U 10409 ; WX 732 ; N uni28A9 ; G 2858 +U 10410 ; WX 732 ; N uni28AA ; G 2859 +U 10411 ; WX 732 ; N uni28AB ; G 2860 +U 10412 ; WX 732 ; N uni28AC ; G 2861 +U 10413 ; WX 732 ; N uni28AD ; G 2862 +U 10414 ; WX 732 ; N uni28AE ; G 2863 +U 10415 ; WX 732 ; N uni28AF ; G 2864 +U 10416 ; WX 732 ; N uni28B0 ; G 2865 +U 10417 ; WX 732 ; N uni28B1 ; G 2866 +U 10418 ; WX 732 ; N uni28B2 ; G 2867 +U 10419 ; WX 732 ; N uni28B3 ; G 2868 +U 10420 ; WX 732 ; N uni28B4 ; G 2869 +U 10421 ; WX 732 ; N uni28B5 ; G 2870 +U 10422 ; WX 732 ; N uni28B6 ; G 2871 +U 10423 ; WX 732 ; N uni28B7 ; G 2872 +U 10424 ; WX 732 ; N uni28B8 ; G 2873 +U 10425 ; WX 732 ; N uni28B9 ; G 2874 +U 10426 ; WX 732 ; N uni28BA ; G 2875 +U 10427 ; WX 732 ; N uni28BB ; G 2876 +U 10428 ; WX 732 ; N uni28BC ; G 2877 +U 10429 ; WX 732 ; N uni28BD ; G 2878 +U 10430 ; WX 732 ; N uni28BE ; G 2879 +U 10431 ; WX 732 ; N uni28BF ; G 2880 +U 10432 ; WX 732 ; N uni28C0 ; G 2881 +U 10433 ; WX 732 ; N uni28C1 ; G 2882 +U 10434 ; WX 732 ; N uni28C2 ; G 2883 +U 10435 ; WX 732 ; N uni28C3 ; G 2884 +U 10436 ; WX 732 ; N uni28C4 ; G 2885 +U 10437 ; WX 732 ; N uni28C5 ; G 2886 +U 10438 ; WX 732 ; N uni28C6 ; G 2887 +U 10439 ; WX 732 ; N uni28C7 ; G 2888 +U 10440 ; WX 732 ; N uni28C8 ; G 2889 +U 10441 ; WX 732 ; N uni28C9 ; G 2890 +U 10442 ; WX 732 ; N uni28CA ; G 2891 +U 10443 ; WX 732 ; N uni28CB ; G 2892 +U 10444 ; WX 732 ; N uni28CC ; G 2893 +U 10445 ; WX 732 ; N uni28CD ; G 2894 +U 10446 ; WX 732 ; N uni28CE ; G 2895 +U 10447 ; WX 732 ; N uni28CF ; G 2896 +U 10448 ; WX 732 ; N uni28D0 ; G 2897 +U 10449 ; WX 732 ; N uni28D1 ; G 2898 +U 10450 ; WX 732 ; N uni28D2 ; G 2899 +U 10451 ; WX 732 ; N uni28D3 ; G 2900 +U 10452 ; WX 732 ; N uni28D4 ; G 2901 +U 10453 ; WX 732 ; N uni28D5 ; G 2902 +U 10454 ; WX 732 ; N uni28D6 ; G 2903 +U 10455 ; WX 732 ; N uni28D7 ; G 2904 +U 10456 ; WX 732 ; N uni28D8 ; G 2905 +U 10457 ; WX 732 ; N uni28D9 ; G 2906 +U 10458 ; WX 732 ; N uni28DA ; G 2907 +U 10459 ; WX 732 ; N uni28DB ; G 2908 +U 10460 ; WX 732 ; N uni28DC ; G 2909 +U 10461 ; WX 732 ; N uni28DD ; G 2910 +U 10462 ; WX 732 ; N uni28DE ; G 2911 +U 10463 ; WX 732 ; N uni28DF ; G 2912 +U 10464 ; WX 732 ; N uni28E0 ; G 2913 +U 10465 ; WX 732 ; N uni28E1 ; G 2914 +U 10466 ; WX 732 ; N uni28E2 ; G 2915 +U 10467 ; WX 732 ; N uni28E3 ; G 2916 +U 10468 ; WX 732 ; N uni28E4 ; G 2917 +U 10469 ; WX 732 ; N uni28E5 ; G 2918 +U 10470 ; WX 732 ; N uni28E6 ; G 2919 +U 10471 ; WX 732 ; N uni28E7 ; G 2920 +U 10472 ; WX 732 ; N uni28E8 ; G 2921 +U 10473 ; WX 732 ; N uni28E9 ; G 2922 +U 10474 ; WX 732 ; N uni28EA ; G 2923 +U 10475 ; WX 732 ; N uni28EB ; G 2924 +U 10476 ; WX 732 ; N uni28EC ; G 2925 +U 10477 ; WX 732 ; N uni28ED ; G 2926 +U 10478 ; WX 732 ; N uni28EE ; G 2927 +U 10479 ; WX 732 ; N uni28EF ; G 2928 +U 10480 ; WX 732 ; N uni28F0 ; G 2929 +U 10481 ; WX 732 ; N uni28F1 ; G 2930 +U 10482 ; WX 732 ; N uni28F2 ; G 2931 +U 10483 ; WX 732 ; N uni28F3 ; G 2932 +U 10484 ; WX 732 ; N uni28F4 ; G 2933 +U 10485 ; WX 732 ; N uni28F5 ; G 2934 +U 10486 ; WX 732 ; N uni28F6 ; G 2935 +U 10487 ; WX 732 ; N uni28F7 ; G 2936 +U 10488 ; WX 732 ; N uni28F8 ; G 2937 +U 10489 ; WX 732 ; N uni28F9 ; G 2938 +U 10490 ; WX 732 ; N uni28FA ; G 2939 +U 10491 ; WX 732 ; N uni28FB ; G 2940 +U 10492 ; WX 732 ; N uni28FC ; G 2941 +U 10493 ; WX 732 ; N uni28FD ; G 2942 +U 10494 ; WX 732 ; N uni28FE ; G 2943 +U 10495 ; WX 732 ; N uni28FF ; G 2944 +U 10496 ; WX 838 ; N uni2900 ; G 2945 +U 10497 ; WX 838 ; N uni2901 ; G 2946 +U 10498 ; WX 838 ; N uni2902 ; G 2947 +U 10499 ; WX 838 ; N uni2903 ; G 2948 +U 10500 ; WX 838 ; N uni2904 ; G 2949 +U 10501 ; WX 838 ; N uni2905 ; G 2950 +U 10502 ; WX 838 ; N uni2906 ; G 2951 +U 10503 ; WX 838 ; N uni2907 ; G 2952 +U 10504 ; WX 838 ; N uni2908 ; G 2953 +U 10505 ; WX 838 ; N uni2909 ; G 2954 +U 10506 ; WX 838 ; N uni290A ; G 2955 +U 10507 ; WX 838 ; N uni290B ; G 2956 +U 10508 ; WX 838 ; N uni290C ; G 2957 +U 10509 ; WX 838 ; N uni290D ; G 2958 +U 10510 ; WX 838 ; N uni290E ; G 2959 +U 10511 ; WX 838 ; N uni290F ; G 2960 +U 10512 ; WX 838 ; N uni2910 ; G 2961 +U 10513 ; WX 838 ; N uni2911 ; G 2962 +U 10514 ; WX 838 ; N uni2912 ; G 2963 +U 10515 ; WX 838 ; N uni2913 ; G 2964 +U 10516 ; WX 838 ; N uni2914 ; G 2965 +U 10517 ; WX 838 ; N uni2915 ; G 2966 +U 10518 ; WX 838 ; N uni2916 ; G 2967 +U 10519 ; WX 838 ; N uni2917 ; G 2968 +U 10520 ; WX 838 ; N uni2918 ; G 2969 +U 10521 ; WX 838 ; N uni2919 ; G 2970 +U 10522 ; WX 838 ; N uni291A ; G 2971 +U 10523 ; WX 838 ; N uni291B ; G 2972 +U 10524 ; WX 838 ; N uni291C ; G 2973 +U 10525 ; WX 838 ; N uni291D ; G 2974 +U 10526 ; WX 838 ; N uni291E ; G 2975 +U 10527 ; WX 838 ; N uni291F ; G 2976 +U 10528 ; WX 838 ; N uni2920 ; G 2977 +U 10529 ; WX 838 ; N uni2921 ; G 2978 +U 10530 ; WX 838 ; N uni2922 ; G 2979 +U 10531 ; WX 838 ; N uni2923 ; G 2980 +U 10532 ; WX 838 ; N uni2924 ; G 2981 +U 10533 ; WX 838 ; N uni2925 ; G 2982 +U 10534 ; WX 838 ; N uni2926 ; G 2983 +U 10535 ; WX 838 ; N uni2927 ; G 2984 +U 10536 ; WX 838 ; N uni2928 ; G 2985 +U 10537 ; WX 838 ; N uni2929 ; G 2986 +U 10538 ; WX 838 ; N uni292A ; G 2987 +U 10539 ; WX 838 ; N uni292B ; G 2988 +U 10540 ; WX 838 ; N uni292C ; G 2989 +U 10541 ; WX 838 ; N uni292D ; G 2990 +U 10542 ; WX 838 ; N uni292E ; G 2991 +U 10543 ; WX 838 ; N uni292F ; G 2992 +U 10544 ; WX 838 ; N uni2930 ; G 2993 +U 10545 ; WX 838 ; N uni2931 ; G 2994 +U 10546 ; WX 838 ; N uni2932 ; G 2995 +U 10547 ; WX 838 ; N uni2933 ; G 2996 +U 10548 ; WX 838 ; N uni2934 ; G 2997 +U 10549 ; WX 838 ; N uni2935 ; G 2998 +U 10550 ; WX 838 ; N uni2936 ; G 2999 +U 10551 ; WX 838 ; N uni2937 ; G 3000 +U 10552 ; WX 838 ; N uni2938 ; G 3001 +U 10553 ; WX 838 ; N uni2939 ; G 3002 +U 10554 ; WX 838 ; N uni293A ; G 3003 +U 10555 ; WX 838 ; N uni293B ; G 3004 +U 10556 ; WX 838 ; N uni293C ; G 3005 +U 10557 ; WX 838 ; N uni293D ; G 3006 +U 10558 ; WX 838 ; N uni293E ; G 3007 +U 10559 ; WX 838 ; N uni293F ; G 3008 +U 10560 ; WX 838 ; N uni2940 ; G 3009 +U 10561 ; WX 838 ; N uni2941 ; G 3010 +U 10562 ; WX 838 ; N uni2942 ; G 3011 +U 10563 ; WX 838 ; N uni2943 ; G 3012 +U 10564 ; WX 838 ; N uni2944 ; G 3013 +U 10565 ; WX 838 ; N uni2945 ; G 3014 +U 10566 ; WX 838 ; N uni2946 ; G 3015 +U 10567 ; WX 838 ; N uni2947 ; G 3016 +U 10568 ; WX 838 ; N uni2948 ; G 3017 +U 10569 ; WX 838 ; N uni2949 ; G 3018 +U 10570 ; WX 838 ; N uni294A ; G 3019 +U 10571 ; WX 838 ; N uni294B ; G 3020 +U 10572 ; WX 838 ; N uni294C ; G 3021 +U 10573 ; WX 838 ; N uni294D ; G 3022 +U 10574 ; WX 838 ; N uni294E ; G 3023 +U 10575 ; WX 838 ; N uni294F ; G 3024 +U 10576 ; WX 838 ; N uni2950 ; G 3025 +U 10577 ; WX 838 ; N uni2951 ; G 3026 +U 10578 ; WX 838 ; N uni2952 ; G 3027 +U 10579 ; WX 838 ; N uni2953 ; G 3028 +U 10580 ; WX 838 ; N uni2954 ; G 3029 +U 10581 ; WX 838 ; N uni2955 ; G 3030 +U 10582 ; WX 838 ; N uni2956 ; G 3031 +U 10583 ; WX 838 ; N uni2957 ; G 3032 +U 10584 ; WX 838 ; N uni2958 ; G 3033 +U 10585 ; WX 838 ; N uni2959 ; G 3034 +U 10586 ; WX 838 ; N uni295A ; G 3035 +U 10587 ; WX 838 ; N uni295B ; G 3036 +U 10588 ; WX 838 ; N uni295C ; G 3037 +U 10589 ; WX 838 ; N uni295D ; G 3038 +U 10590 ; WX 838 ; N uni295E ; G 3039 +U 10591 ; WX 838 ; N uni295F ; G 3040 +U 10592 ; WX 838 ; N uni2960 ; G 3041 +U 10593 ; WX 838 ; N uni2961 ; G 3042 +U 10594 ; WX 838 ; N uni2962 ; G 3043 +U 10595 ; WX 838 ; N uni2963 ; G 3044 +U 10596 ; WX 838 ; N uni2964 ; G 3045 +U 10597 ; WX 838 ; N uni2965 ; G 3046 +U 10598 ; WX 838 ; N uni2966 ; G 3047 +U 10599 ; WX 838 ; N uni2967 ; G 3048 +U 10600 ; WX 838 ; N uni2968 ; G 3049 +U 10601 ; WX 838 ; N uni2969 ; G 3050 +U 10602 ; WX 838 ; N uni296A ; G 3051 +U 10603 ; WX 838 ; N uni296B ; G 3052 +U 10604 ; WX 838 ; N uni296C ; G 3053 +U 10605 ; WX 838 ; N uni296D ; G 3054 +U 10606 ; WX 838 ; N uni296E ; G 3055 +U 10607 ; WX 838 ; N uni296F ; G 3056 +U 10608 ; WX 838 ; N uni2970 ; G 3057 +U 10609 ; WX 838 ; N uni2971 ; G 3058 +U 10610 ; WX 838 ; N uni2972 ; G 3059 +U 10611 ; WX 838 ; N uni2973 ; G 3060 +U 10612 ; WX 838 ; N uni2974 ; G 3061 +U 10613 ; WX 838 ; N uni2975 ; G 3062 +U 10614 ; WX 838 ; N uni2976 ; G 3063 +U 10615 ; WX 981 ; N uni2977 ; G 3064 +U 10616 ; WX 838 ; N uni2978 ; G 3065 +U 10617 ; WX 838 ; N uni2979 ; G 3066 +U 10618 ; WX 984 ; N uni297A ; G 3067 +U 10619 ; WX 838 ; N uni297B ; G 3068 +U 10620 ; WX 838 ; N uni297C ; G 3069 +U 10621 ; WX 838 ; N uni297D ; G 3070 +U 10622 ; WX 838 ; N uni297E ; G 3071 +U 10623 ; WX 838 ; N uni297F ; G 3072 +U 10731 ; WX 494 ; N uni29EB ; G 3073 +U 10764 ; WX 1513 ; N uni2A0C ; G 3074 +U 10765 ; WX 521 ; N uni2A0D ; G 3075 +U 10766 ; WX 521 ; N uni2A0E ; G 3076 +U 10799 ; WX 838 ; N uni2A2F ; G 3077 +U 10858 ; WX 838 ; N uni2A6A ; G 3078 +U 10859 ; WX 838 ; N uni2A6B ; G 3079 +U 11008 ; WX 838 ; N uni2B00 ; G 3080 +U 11009 ; WX 838 ; N uni2B01 ; G 3081 +U 11010 ; WX 838 ; N uni2B02 ; G 3082 +U 11011 ; WX 838 ; N uni2B03 ; G 3083 +U 11012 ; WX 838 ; N uni2B04 ; G 3084 +U 11013 ; WX 838 ; N uni2B05 ; G 3085 +U 11014 ; WX 838 ; N uni2B06 ; G 3086 +U 11015 ; WX 838 ; N uni2B07 ; G 3087 +U 11016 ; WX 838 ; N uni2B08 ; G 3088 +U 11017 ; WX 838 ; N uni2B09 ; G 3089 +U 11018 ; WX 838 ; N uni2B0A ; G 3090 +U 11019 ; WX 838 ; N uni2B0B ; G 3091 +U 11020 ; WX 838 ; N uni2B0C ; G 3092 +U 11021 ; WX 838 ; N uni2B0D ; G 3093 +U 11022 ; WX 838 ; N uni2B0E ; G 3094 +U 11023 ; WX 838 ; N uni2B0F ; G 3095 +U 11024 ; WX 838 ; N uni2B10 ; G 3096 +U 11025 ; WX 838 ; N uni2B11 ; G 3097 +U 11026 ; WX 945 ; N uni2B12 ; G 3098 +U 11027 ; WX 945 ; N uni2B13 ; G 3099 +U 11028 ; WX 945 ; N uni2B14 ; G 3100 +U 11029 ; WX 945 ; N uni2B15 ; G 3101 +U 11030 ; WX 769 ; N uni2B16 ; G 3102 +U 11031 ; WX 769 ; N uni2B17 ; G 3103 +U 11032 ; WX 769 ; N uni2B18 ; G 3104 +U 11033 ; WX 769 ; N uni2B19 ; G 3105 +U 11034 ; WX 945 ; N uni2B1A ; G 3106 +U 11360 ; WX 664 ; N uni2C60 ; G 3107 +U 11361 ; WX 320 ; N uni2C61 ; G 3108 +U 11363 ; WX 673 ; N uni2C63 ; G 3109 +U 11364 ; WX 753 ; N uni2C64 ; G 3110 +U 11367 ; WX 872 ; N uni2C67 ; G 3111 +U 11368 ; WX 644 ; N uni2C68 ; G 3112 +U 11369 ; WX 747 ; N uni2C69 ; G 3113 +U 11370 ; WX 606 ; N uni2C6A ; G 3114 +U 11371 ; WX 695 ; N uni2C6B ; G 3115 +U 11372 ; WX 527 ; N uni2C6C ; G 3116 +U 11373 ; WX 782 ; N uni2C6D ; G 3117 +U 11374 ; WX 1024 ; N uni2C6E ; G 3118 +U 11375 ; WX 722 ; N uni2C6F ; G 3119 +U 11376 ; WX 782 ; N uni2C70 ; G 3120 +U 11377 ; WX 663 ; N uni2C71 ; G 3121 +U 11378 ; WX 1130 ; N uni2C72 ; G 3122 +U 11379 ; WX 939 ; N uni2C73 ; G 3123 +U 11381 ; WX 740 ; N uni2C75 ; G 3124 +U 11382 ; WX 556 ; N uni2C76 ; G 3125 +U 11383 ; WX 700 ; N uni2C77 ; G 3126 +U 11385 ; WX 501 ; N uni2C79 ; G 3127 +U 11386 ; WX 602 ; N uni2C7A ; G 3128 +U 11387 ; WX 553 ; N uni2C7B ; G 3129 +U 11388 ; WX 264 ; N uni2C7C ; G 3130 +U 11389 ; WX 455 ; N uni2C7D ; G 3131 +U 11390 ; WX 685 ; N uni2C7E ; G 3132 +U 11391 ; WX 695 ; N uni2C7F ; G 3133 +U 11520 ; WX 773 ; N uni2D00 ; G 3134 +U 11521 ; WX 635 ; N uni2D01 ; G 3135 +U 11522 ; WX 633 ; N uni2D02 ; G 3136 +U 11523 ; WX 658 ; N uni2D03 ; G 3137 +U 11524 ; WX 631 ; N uni2D04 ; G 3138 +U 11525 ; WX 962 ; N uni2D05 ; G 3139 +U 11526 ; WX 756 ; N uni2D06 ; G 3140 +U 11527 ; WX 960 ; N uni2D07 ; G 3141 +U 11528 ; WX 617 ; N uni2D08 ; G 3142 +U 11529 ; WX 646 ; N uni2D09 ; G 3143 +U 11530 ; WX 962 ; N uni2D0A ; G 3144 +U 11531 ; WX 632 ; N uni2D0B ; G 3145 +U 11532 ; WX 646 ; N uni2D0C ; G 3146 +U 11533 ; WX 962 ; N uni2D0D ; G 3147 +U 11534 ; WX 645 ; N uni2D0E ; G 3148 +U 11535 ; WX 866 ; N uni2D0F ; G 3149 +U 11536 ; WX 961 ; N uni2D10 ; G 3150 +U 11537 ; WX 645 ; N uni2D11 ; G 3151 +U 11538 ; WX 645 ; N uni2D12 ; G 3152 +U 11539 ; WX 959 ; N uni2D13 ; G 3153 +U 11540 ; WX 945 ; N uni2D14 ; G 3154 +U 11541 ; WX 863 ; N uni2D15 ; G 3155 +U 11542 ; WX 644 ; N uni2D16 ; G 3156 +U 11543 ; WX 646 ; N uni2D17 ; G 3157 +U 11544 ; WX 645 ; N uni2D18 ; G 3158 +U 11545 ; WX 649 ; N uni2D19 ; G 3159 +U 11546 ; WX 688 ; N uni2D1A ; G 3160 +U 11547 ; WX 634 ; N uni2D1B ; G 3161 +U 11548 ; WX 982 ; N uni2D1C ; G 3162 +U 11549 ; WX 681 ; N uni2D1D ; G 3163 +U 11550 ; WX 676 ; N uni2D1E ; G 3164 +U 11551 ; WX 852 ; N uni2D1F ; G 3165 +U 11552 ; WX 957 ; N uni2D20 ; G 3166 +U 11553 ; WX 632 ; N uni2D21 ; G 3167 +U 11554 ; WX 645 ; N uni2D22 ; G 3168 +U 11555 ; WX 646 ; N uni2D23 ; G 3169 +U 11556 ; WX 749 ; N uni2D24 ; G 3170 +U 11557 ; WX 914 ; N uni2D25 ; G 3171 +U 11800 ; WX 536 ; N uni2E18 ; G 3172 +U 11807 ; WX 838 ; N uni2E1F ; G 3173 +U 11810 ; WX 390 ; N uni2E22 ; G 3174 +U 11811 ; WX 390 ; N uni2E23 ; G 3175 +U 11812 ; WX 390 ; N uni2E24 ; G 3176 +U 11813 ; WX 390 ; N uni2E25 ; G 3177 +U 11822 ; WX 536 ; N uni2E2E ; G 3178 +U 42564 ; WX 685 ; N uniA644 ; G 3179 +U 42565 ; WX 513 ; N uniA645 ; G 3180 +U 42566 ; WX 395 ; N uniA646 ; G 3181 +U 42567 ; WX 392 ; N uniA647 ; G 3182 +U 42576 ; WX 1104 ; N uniA650 ; G 3183 +U 42577 ; WX 888 ; N uniA651 ; G 3184 +U 42580 ; WX 1193 ; N uniA654 ; G 3185 +U 42581 ; WX 871 ; N uniA655 ; G 3186 +U 42582 ; WX 1140 ; N uniA656 ; G 3187 +U 42583 ; WX 899 ; N uniA657 ; G 3188 +U 42648 ; WX 1416 ; N uniA698 ; G 3189 +U 42649 ; WX 999 ; N uniA699 ; G 3190 +U 42760 ; WX 493 ; N uniA708 ; G 3191 +U 42761 ; WX 493 ; N uniA709 ; G 3192 +U 42762 ; WX 493 ; N uniA70A ; G 3193 +U 42763 ; WX 493 ; N uniA70B ; G 3194 +U 42764 ; WX 493 ; N uniA70C ; G 3195 +U 42765 ; WX 493 ; N uniA70D ; G 3196 +U 42766 ; WX 493 ; N uniA70E ; G 3197 +U 42767 ; WX 493 ; N uniA70F ; G 3198 +U 42768 ; WX 493 ; N uniA710 ; G 3199 +U 42769 ; WX 493 ; N uniA711 ; G 3200 +U 42770 ; WX 493 ; N uniA712 ; G 3201 +U 42771 ; WX 493 ; N uniA713 ; G 3202 +U 42772 ; WX 493 ; N uniA714 ; G 3203 +U 42773 ; WX 493 ; N uniA715 ; G 3204 +U 42774 ; WX 493 ; N uniA716 ; G 3205 +U 42779 ; WX 369 ; N uniA71B ; G 3206 +U 42780 ; WX 369 ; N uniA71C ; G 3207 +U 42781 ; WX 253 ; N uniA71D ; G 3208 +U 42782 ; WX 253 ; N uniA71E ; G 3209 +U 42783 ; WX 253 ; N uniA71F ; G 3210 +U 42790 ; WX 872 ; N uniA726 ; G 3211 +U 42791 ; WX 634 ; N uniA727 ; G 3212 +U 42792 ; WX 843 ; N uniA728 ; G 3213 +U 42793 ; WX 754 ; N uniA729 ; G 3214 +U 42794 ; WX 612 ; N uniA72A ; G 3215 +U 42795 ; WX 560 ; N uniA72B ; G 3216 +U 42796 ; WX 548 ; N uniA72C ; G 3217 +U 42797 ; WX 531 ; N uniA72D ; G 3218 +U 42798 ; WX 629 ; N uniA72E ; G 3219 +U 42799 ; WX 610 ; N uniA72F ; G 3220 +U 42800 ; WX 514 ; N uniA730 ; G 3221 +U 42801 ; WX 513 ; N uniA731 ; G 3222 +U 42802 ; WX 1195 ; N uniA732 ; G 3223 +U 42803 ; WX 944 ; N uniA733 ; G 3224 +U 42804 ; WX 1226 ; N uniA734 ; G 3225 +U 42805 ; WX 950 ; N uniA735 ; G 3226 +U 42806 ; WX 1149 ; N uniA736 ; G 3227 +U 42807 ; WX 934 ; N uniA737 ; G 3228 +U 42808 ; WX 968 ; N uniA738 ; G 3229 +U 42809 ; WX 784 ; N uniA739 ; G 3230 +U 42810 ; WX 968 ; N uniA73A ; G 3231 +U 42811 ; WX 784 ; N uniA73B ; G 3232 +U 42812 ; WX 962 ; N uniA73C ; G 3233 +U 42813 ; WX 824 ; N uniA73D ; G 3234 +U 42814 ; WX 765 ; N uniA73E ; G 3235 +U 42815 ; WX 560 ; N uniA73F ; G 3236 +U 42816 ; WX 774 ; N uniA740 ; G 3237 +U 42817 ; WX 625 ; N uniA741 ; G 3238 +U 42822 ; WX 787 ; N uniA746 ; G 3239 +U 42823 ; WX 434 ; N uniA747 ; G 3240 +U 42826 ; WX 932 ; N uniA74A ; G 3241 +U 42827 ; WX 711 ; N uniA74B ; G 3242 +U 42830 ; WX 1416 ; N uniA74E ; G 3243 +U 42831 ; WX 999 ; N uniA74F ; G 3244 +U 42856 ; WX 707 ; N uniA768 ; G 3245 +U 42857 ; WX 610 ; N uniA769 ; G 3246 +U 42875 ; WX 612 ; N uniA77B ; G 3247 +U 42876 ; WX 478 ; N uniA77C ; G 3248 +U 42880 ; WX 664 ; N uniA780 ; G 3249 +U 42881 ; WX 320 ; N uniA781 ; G 3250 +U 42882 ; WX 843 ; N uniA782 ; G 3251 +U 42883 ; WX 644 ; N uniA783 ; G 3252 +U 42884 ; WX 612 ; N uniA784 ; G 3253 +U 42885 ; WX 478 ; N uniA785 ; G 3254 +U 42886 ; WX 765 ; N uniA786 ; G 3255 +U 42887 ; WX 560 ; N uniA787 ; G 3256 +U 42891 ; WX 402 ; N uniA78B ; G 3257 +U 42892 ; WX 275 ; N uniA78C ; G 3258 +U 42893 ; WX 773 ; N uniA78D ; G 3259 +U 42896 ; WX 875 ; N uniA790 ; G 3260 +U 42897 ; WX 644 ; N uniA791 ; G 3261 +U 42922 ; WX 872 ; N uniA7AA ; G 3262 +U 43000 ; WX 549 ; N uniA7F8 ; G 3263 +U 43001 ; WX 623 ; N uniA7F9 ; G 3264 +U 43002 ; WX 957 ; N uniA7FA ; G 3265 +U 43003 ; WX 694 ; N uniA7FB ; G 3266 +U 43004 ; WX 673 ; N uniA7FC ; G 3267 +U 43005 ; WX 1024 ; N uniA7FD ; G 3268 +U 43006 ; WX 395 ; N uniA7FE ; G 3269 +U 43007 ; WX 1201 ; N uniA7FF ; G 3270 +U 62464 ; WX 654 ; N uniF400 ; G 3271 +U 62465 ; WX 665 ; N uniF401 ; G 3272 +U 62466 ; WX 714 ; N uniF402 ; G 3273 +U 62467 ; WX 947 ; N uniF403 ; G 3274 +U 62468 ; WX 665 ; N uniF404 ; G 3275 +U 62469 ; WX 659 ; N uniF405 ; G 3276 +U 62470 ; WX 725 ; N uniF406 ; G 3277 +U 62471 ; WX 986 ; N uniF407 ; G 3278 +U 62472 ; WX 665 ; N uniF408 ; G 3279 +U 62473 ; WX 665 ; N uniF409 ; G 3280 +U 62474 ; WX 1257 ; N uniF40A ; G 3281 +U 62475 ; WX 683 ; N uniF40B ; G 3282 +U 62476 ; WX 682 ; N uniF40C ; G 3283 +U 62477 ; WX 953 ; N uniF40D ; G 3284 +U 62478 ; WX 665 ; N uniF40E ; G 3285 +U 62479 ; WX 682 ; N uniF40F ; G 3286 +U 62480 ; WX 999 ; N uniF410 ; G 3287 +U 62481 ; WX 746 ; N uniF411 ; G 3288 +U 62482 ; WX 798 ; N uniF412 ; G 3289 +U 62483 ; WX 748 ; N uniF413 ; G 3290 +U 62484 ; WX 944 ; N uniF414 ; G 3291 +U 62485 ; WX 681 ; N uniF415 ; G 3292 +U 62486 ; WX 936 ; N uniF416 ; G 3293 +U 62487 ; WX 680 ; N uniF417 ; G 3294 +U 62488 ; WX 688 ; N uniF418 ; G 3295 +U 62489 ; WX 682 ; N uniF419 ; G 3296 +U 62490 ; WX 729 ; N uniF41A ; G 3297 +U 62491 ; WX 682 ; N uniF41B ; G 3298 +U 62492 ; WX 688 ; N uniF41C ; G 3299 +U 62493 ; WX 666 ; N uniF41D ; G 3300 +U 62494 ; WX 729 ; N uniF41E ; G 3301 +U 62495 ; WX 884 ; N uniF41F ; G 3302 +U 62496 ; WX 665 ; N uniF420 ; G 3303 +U 62497 ; WX 706 ; N uniF421 ; G 3304 +U 62498 ; WX 666 ; N uniF422 ; G 3305 +U 62499 ; WX 665 ; N uniF423 ; G 3306 +U 62500 ; WX 665 ; N uniF424 ; G 3307 +U 62501 ; WX 722 ; N uniF425 ; G 3308 +U 62502 ; WX 961 ; N uniF426 ; G 3309 +U 62504 ; WX 904 ; N uniF428 ; G 3310 +U 63173 ; WX 602 ; N uniF6C5 ; G 3311 +U 63185 ; WX 500 ; N cyrBreve ; G 3312 +U 63188 ; WX 500 ; N cyrbreve ; G 3313 +U 64256 ; WX 710 ; N uniFB00 ; G 3314 +U 64257 ; WX 667 ; N fi ; G 3315 +U 64258 ; WX 667 ; N fl ; G 3316 +U 64259 ; WX 1028 ; N uniFB03 ; G 3317 +U 64260 ; WX 1030 ; N uniFB04 ; G 3318 +U 64261 ; WX 771 ; N uniFB05 ; G 3319 +U 64262 ; WX 933 ; N uniFB06 ; G 3320 +U 65024 ; WX 0 ; N uniFE00 ; G 3321 +U 65025 ; WX 0 ; N uniFE01 ; G 3322 +U 65026 ; WX 0 ; N uniFE02 ; G 3323 +U 65027 ; WX 0 ; N uniFE03 ; G 3324 +U 65028 ; WX 0 ; N uniFE04 ; G 3325 +U 65029 ; WX 0 ; N uniFE05 ; G 3326 +U 65030 ; WX 0 ; N uniFE06 ; G 3327 +U 65031 ; WX 0 ; N uniFE07 ; G 3328 +U 65032 ; WX 0 ; N uniFE08 ; G 3329 +U 65033 ; WX 0 ; N uniFE09 ; G 3330 +U 65034 ; WX 0 ; N uniFE0A ; G 3331 +U 65035 ; WX 0 ; N uniFE0B ; G 3332 +U 65036 ; WX 0 ; N uniFE0C ; G 3333 +U 65037 ; WX 0 ; N uniFE0D ; G 3334 +U 65038 ; WX 0 ; N uniFE0E ; G 3335 +U 65039 ; WX 0 ; N uniFE0F ; G 3336 +U 65529 ; WX 0 ; N uniFFF9 ; G 3337 +U 65530 ; WX 0 ; N uniFFFA ; G 3338 +U 65531 ; WX 0 ; N uniFFFB ; G 3339 +U 65532 ; WX 0 ; N uniFFFC ; G 3340 +U 65533 ; WX 1025 ; N uniFFFD ; G 3341 +EndCharMetrics +StartKernData +StartKernPairs 1367 + +KPX dollar seven -112 +KPX dollar nine -102 +KPX dollar colon -83 +KPX dollar less -83 +KPX dollar I -36 +KPX dollar W -36 +KPX dollar Y -83 +KPX dollar Z -92 +KPX dollar backslash -83 +KPX dollar questiondown -83 +KPX dollar Aacute -83 +KPX dollar Hcircumflex -112 +KPX dollar hcircumflex -36 +KPX dollar Hbar -112 +KPX dollar hbar -36 +KPX dollar Kcommaaccent -83 +KPX dollar kcommaaccent -92 +KPX dollar kgreenlandic -83 +KPX dollar Lacute -83 +KPX dollar lacute -83 +KPX dollar uni01DC -112 +KPX dollar uni01DD -36 +KPX dollar uni01F4 -83 + +KPX percent ampersand 38 +KPX percent asterisk 38 +KPX percent two 38 +KPX percent less -36 +KPX percent Egrave 38 +KPX percent Ecircumflex 38 +KPX percent Igrave 38 +KPX percent Icircumflex 38 +KPX percent Thorn 38 +KPX percent agrave 38 +KPX percent acircumflex 38 +KPX percent adieresis 38 +KPX percent Dcaron 38 +KPX percent Dcroat 38 +KPX percent Emacron 38 +KPX percent Ebreve 38 +KPX percent kgreenlandic -36 +KPX percent lacute -36 +KPX percent uni01AC 38 +KPX percent uni01AE 38 +KPX percent uni01F0 38 +KPX percent uni01F4 -36 + + +KPX quotesingle nine -36 + + +KPX parenright dollar -178 +KPX parenright D -139 +KPX parenright H -112 +KPX parenright R -112 +KPX parenright cent -139 +KPX parenright sterling -139 +KPX parenright currency -139 +KPX parenright yen -139 +KPX parenright brokenbar -139 +KPX parenright section -139 +KPX parenright dieresis -139 +KPX parenright ordfeminine -112 +KPX parenright guillemotleft -112 +KPX parenright logicalnot -112 +KPX parenright sfthyphen -112 +KPX parenright acute -112 +KPX parenright mu -112 +KPX parenright paragraph -112 +KPX parenright periodcentered -112 +KPX parenright cedilla -112 +KPX parenright ordmasculine -112 +KPX parenright Acircumflex -178 +KPX parenright Atilde -139 +KPX parenright Adieresis -178 +KPX parenright Aring -139 +KPX parenright AE -178 +KPX parenright Ccedilla -139 +KPX parenright Otilde -112 +KPX parenright multiply -112 +KPX parenright Ugrave -112 +KPX parenright Ucircumflex -112 +KPX parenright Yacute -112 +KPX parenright dcaron -112 +KPX parenright dmacron -112 +KPX parenright emacron -112 +KPX parenright ebreve -112 +KPX parenright uni01A5 -139 +KPX parenright uni01AD -112 +KPX parenright Uhorn -112 +KPX parenright uni01F1 -112 + +KPX asterisk less -36 +KPX asterisk lacute -36 + + +KPX period dollar -83 +KPX period ampersand -55 +KPX period two -55 +KPX period eight -73 +KPX period colon -73 +KPX period less -55 +KPX period H -55 +KPX period R -55 +KPX period X -45 +KPX period backslash -131 +KPX period ordfeminine -55 +KPX period guillemotleft -55 +KPX period logicalnot -55 +KPX period sfthyphen -55 +KPX period acute -55 +KPX period mu -55 +KPX period paragraph -55 +KPX period periodcentered -55 +KPX period cedilla -55 +KPX period ordmasculine -36 +KPX period guillemotright -45 +KPX period onequarter -45 +KPX period onehalf -45 +KPX period threequarters -45 +KPX period questiondown -131 +KPX period Aacute -131 +KPX period Egrave -55 +KPX period Icircumflex -55 +KPX period Yacute -55 +KPX period Ebreve -55 +KPX period ebreve -55 +KPX period Idot -73 +KPX period dotlessi -45 +KPX period lacute -55 + +KPX slash seven -167 +KPX slash eight -112 +KPX slash nine -243 +KPX slash colon -178 +KPX slash less -131 +KPX slash backslash -36 +KPX slash questiondown -36 +KPX slash Aacute -36 +KPX slash Hbar -167 +KPX slash Idot -112 +KPX slash lacute -131 + + +KPX two nine -36 +KPX two semicolon -36 + +KPX three dollar -188 +KPX three eight -36 +KPX three D -92 +KPX three H -92 +KPX three R -83 +KPX three V -55 +KPX three cent -92 +KPX three sterling -92 +KPX three currency -92 +KPX three yen -92 +KPX three brokenbar -92 +KPX three section -92 +KPX three dieresis -92 +KPX three ordfeminine -92 +KPX three guillemotleft -92 +KPX three logicalnot -92 +KPX three sfthyphen -92 +KPX three acute -83 +KPX three mu -83 +KPX three paragraph -83 +KPX three periodcentered -83 +KPX three cedilla -83 +KPX three ordmasculine -83 +KPX three Yacute -92 +KPX three ebreve -83 +KPX three gdotaccent -55 +KPX three gcommaaccent -55 +KPX three Idot -36 + + +KPX five seven -36 +KPX five nine -73 +KPX five colon -45 +KPX five less -63 +KPX five D 47 +KPX five backslash -36 +KPX five cent 47 +KPX five sterling 47 +KPX five currency 47 +KPX five yen 47 +KPX five brokenbar 47 +KPX five section 47 +KPX five dieresis 47 +KPX five ordmasculine 38 +KPX five questiondown -36 +KPX five Aacute -36 +KPX five Hbar -36 +KPX five lacute -63 + +KPX six six -36 +KPX six Gdotaccent -36 +KPX six Gcommaaccent -36 + +KPX seven dollar -112 +KPX seven seven 38 +KPX seven D -159 +KPX seven F -159 +KPX seven H -159 +KPX seven R -159 +KPX seven V -149 +KPX seven Z -73 +KPX seven cent -59 +KPX seven sterling -159 +KPX seven currency -59 +KPX seven yen -59 +KPX seven brokenbar -59 +KPX seven section -59 +KPX seven dieresis -159 +KPX seven copyright -159 +KPX seven ordfeminine -99 +KPX seven guillemotleft -159 +KPX seven logicalnot -99 +KPX seven sfthyphen -99 +KPX seven acute -79 +KPX seven mu -159 +KPX seven paragraph -79 +KPX seven periodcentered -79 +KPX seven cedilla -79 +KPX seven ordmasculine -159 +KPX seven Eacute -159 +KPX seven Idieresis -159 +KPX seven Yacute -159 +KPX seven ebreve -159 +KPX seven gdotaccent -149 +KPX seven gcommaaccent -149 +KPX seven Hbar 38 + +KPX eight dollar -63 +KPX eight hyphen -55 + +KPX nine dollar -139 +KPX nine two -36 +KPX nine D -188 +KPX nine H -188 +KPX nine L -36 +KPX nine R -188 +KPX nine X -131 +KPX nine backslash -83 +KPX nine cent -188 +KPX nine sterling -188 +KPX nine currency -188 +KPX nine yen -188 +KPX nine brokenbar -188 +KPX nine section -188 +KPX nine dieresis -188 +KPX nine ordfeminine -188 +KPX nine guillemotleft -188 +KPX nine logicalnot -188 +KPX nine sfthyphen -188 +KPX nine acute -188 +KPX nine mu -188 +KPX nine paragraph -188 +KPX nine periodcentered -188 +KPX nine cedilla -188 +KPX nine ordmasculine -188 +KPX nine guillemotright -131 +KPX nine onequarter -131 +KPX nine onehalf -131 +KPX nine threequarters -131 +KPX nine questiondown -83 +KPX nine Aacute -83 +KPX nine Yacute -188 +KPX nine Ebreve -36 +KPX nine ebreve -188 +KPX nine dotlessi -131 + +KPX colon dollar -102 +KPX colon D -178 +KPX colon H -167 +KPX colon L -36 +KPX colon R -139 +KPX colon U -92 +KPX colon X -83 +KPX colon backslash -45 +KPX colon cent -178 +KPX colon sterling -178 +KPX colon currency -178 +KPX colon yen -178 +KPX colon brokenbar -178 +KPX colon section -178 +KPX colon dieresis -139 +KPX colon ordfeminine -167 +KPX colon guillemotleft -167 +KPX colon logicalnot -167 +KPX colon sfthyphen -167 +KPX colon acute -139 +KPX colon mu -139 +KPX colon paragraph -139 +KPX colon periodcentered -139 +KPX colon cedilla -139 +KPX colon ordmasculine -139 +KPX colon guillemotright -83 +KPX colon onequarter -83 +KPX colon onehalf -83 +KPX colon threequarters -83 +KPX colon questiondown -45 +KPX colon Aacute -45 +KPX colon Yacute -167 +KPX colon ebreve -139 +KPX colon edotaccent -92 +KPX colon ecaron -92 +KPX colon dotlessi -83 + +KPX semicolon dollar -73 +KPX semicolon ampersand -36 +KPX semicolon two -36 +KPX semicolon Egrave -36 +KPX semicolon Icircumflex -36 +KPX semicolon Ebreve -36 + +KPX less dollar -159 +KPX less ampersand -36 +KPX less D -159 +KPX less H -178 +KPX less L -36 +KPX less R -178 +KPX less X -178 +KPX less cent -159 +KPX less sterling -159 +KPX less currency -159 +KPX less yen -159 +KPX less brokenbar -159 +KPX less section -159 +KPX less dieresis -196 +KPX less ordfeminine -178 +KPX less guillemotleft -178 +KPX less logicalnot -178 +KPX less sfthyphen -178 +KPX less acute -178 +KPX less mu -178 +KPX less paragraph -178 +KPX less periodcentered -178 +KPX less cedilla -178 +KPX less ordmasculine -178 +KPX less guillemotright -178 +KPX less onequarter -178 +KPX less onehalf -178 +KPX less threequarters -178 +KPX less Egrave -36 +KPX less Icircumflex -36 +KPX less Yacute -178 +KPX less ebreve -215 +KPX less dotlessi -178 + + + + + + + + + + + + + + + + + + + + + +KPX Acircumflex seven -112 +KPX Acircumflex nine -102 +KPX Acircumflex colon -83 +KPX Acircumflex less -83 +KPX Acircumflex I -36 +KPX Acircumflex W -36 +KPX Acircumflex Y -83 +KPX Acircumflex Z -92 +KPX Acircumflex backslash -83 +KPX Acircumflex questiondown -83 +KPX Acircumflex Aacute -83 +KPX Acircumflex Hcircumflex -112 +KPX Acircumflex hcircumflex -36 +KPX Acircumflex Hbar -112 +KPX Acircumflex hbar -36 +KPX Acircumflex Kcommaaccent -83 +KPX Acircumflex kcommaaccent -92 +KPX Acircumflex kgreenlandic -83 +KPX Acircumflex Lacute -83 +KPX Acircumflex lacute -83 +KPX Acircumflex uni01DC -112 +KPX Acircumflex uni01DD -36 +KPX Acircumflex uni01F4 -83 + +KPX Adieresis seven -112 +KPX Adieresis nine -102 +KPX Adieresis colon -83 +KPX Adieresis less -83 +KPX Adieresis I -36 +KPX Adieresis W -36 +KPX Adieresis Y -83 +KPX Adieresis Z -92 +KPX Adieresis backslash -83 +KPX Adieresis questiondown -83 +KPX Adieresis Aacute -83 +KPX Adieresis Hcircumflex -112 +KPX Adieresis hcircumflex -36 +KPX Adieresis Hbar -112 +KPX Adieresis hbar -36 +KPX Adieresis Kcommaaccent -83 +KPX Adieresis kcommaaccent -92 +KPX Adieresis kgreenlandic -83 +KPX Adieresis Lacute -83 +KPX Adieresis lacute -83 +KPX Adieresis uni01DC -112 +KPX Adieresis uni01DD -36 +KPX Adieresis uni01F4 -83 + +KPX AE seven -112 +KPX AE nine -102 +KPX AE colon -83 +KPX AE less -83 +KPX AE I -36 +KPX AE W -36 +KPX AE Y -83 +KPX AE Z -92 +KPX AE backslash -83 +KPX AE questiondown -83 +KPX AE Aacute -83 +KPX AE Hcircumflex -112 +KPX AE hcircumflex -36 +KPX AE Hbar -112 +KPX AE hbar -36 +KPX AE Kcommaaccent -83 +KPX AE kcommaaccent -92 +KPX AE kgreenlandic -83 +KPX AE Lacute -83 +KPX AE lacute -83 +KPX AE uni01DC -112 +KPX AE uni01DD -36 +KPX AE uni01F4 -83 + + + + + +KPX Eth nine -36 + +KPX Ograve nine -36 + + +KPX agrave less -36 +KPX agrave lacute -36 + +KPX ucircumflex seven -167 +KPX ucircumflex eight -112 +KPX ucircumflex nine -243 +KPX ucircumflex colon -178 +KPX ucircumflex less -131 +KPX ucircumflex backslash -36 +KPX ucircumflex questiondown -36 +KPX ucircumflex Aacute -36 +KPX ucircumflex Hbar -167 +KPX ucircumflex Idot -112 +KPX ucircumflex lacute -131 + +KPX ydieresis seven -167 +KPX ydieresis eight -112 +KPX ydieresis nine -243 +KPX ydieresis colon -178 +KPX ydieresis less -131 +KPX ydieresis backslash -36 +KPX ydieresis questiondown -36 +KPX ydieresis Aacute -36 +KPX ydieresis Hbar -167 +KPX ydieresis Idot -112 +KPX ydieresis lacute -131 + +KPX Abreve O -227 + +KPX abreve seven -167 +KPX abreve eight -36 +KPX abreve nine -243 +KPX abreve colon -178 +KPX abreve less -206 +KPX abreve backslash -36 +KPX abreve questiondown -36 +KPX abreve Aacute -36 +KPX abreve Hbar -167 +KPX abreve Idot -36 +KPX abreve lacute -206 + + + +KPX Edotaccent seven -36 +KPX Edotaccent nine -73 +KPX Edotaccent colon -45 +KPX Edotaccent less -63 +KPX Edotaccent D 47 +KPX Edotaccent backslash -36 +KPX Edotaccent cent 47 +KPX Edotaccent sterling 47 +KPX Edotaccent currency 47 +KPX Edotaccent yen 47 +KPX Edotaccent brokenbar 47 +KPX Edotaccent section 47 +KPX Edotaccent dieresis 47 +KPX Edotaccent ordmasculine 38 +KPX Edotaccent questiondown -36 +KPX Edotaccent Aacute -36 +KPX Edotaccent Hbar -36 +KPX Edotaccent lacute -63 + + +KPX Ecaron seven -36 +KPX Ecaron nine -73 +KPX Ecaron colon -45 +KPX Ecaron less -63 +KPX Ecaron D 47 +KPX Ecaron backslash -36 +KPX Ecaron cent 47 +KPX Ecaron sterling 47 +KPX Ecaron currency 47 +KPX Ecaron yen 47 +KPX Ecaron brokenbar 47 +KPX Ecaron section 47 +KPX Ecaron dieresis 47 +KPX Ecaron ordmasculine 38 +KPX Ecaron questiondown -36 +KPX Ecaron Aacute -36 +KPX Ecaron Hbar -36 +KPX Ecaron lacute -63 + + +KPX Gdotaccent six -36 +KPX Gdotaccent Gdotaccent -36 +KPX Gdotaccent Gcommaaccent -36 + +KPX Gcommaaccent six -36 +KPX Gcommaaccent Gdotaccent -36 +KPX Gcommaaccent Gcommaaccent -36 + +KPX Hbar dollar -112 +KPX Hbar seven 38 +KPX Hbar D -159 +KPX Hbar F -159 +KPX Hbar H -159 +KPX Hbar R -159 +KPX Hbar V -149 +KPX Hbar Z -73 +KPX Hbar cent -159 +KPX Hbar sterling -159 +KPX Hbar currency -159 +KPX Hbar yen -159 +KPX Hbar brokenbar -159 +KPX Hbar section -159 +KPX Hbar dieresis -159 +KPX Hbar copyright -159 +KPX Hbar ordfeminine -159 +KPX Hbar guillemotleft -159 +KPX Hbar logicalnot -159 +KPX Hbar sfthyphen -159 +KPX Hbar acute -159 +KPX Hbar mu -159 +KPX Hbar paragraph -159 +KPX Hbar periodcentered -159 +KPX Hbar cedilla -159 +KPX Hbar ordmasculine -159 +KPX Hbar Eacute -159 +KPX Hbar Idieresis -159 +KPX Hbar Yacute -159 +KPX Hbar ebreve -159 +KPX Hbar gdotaccent -149 +KPX Hbar gcommaaccent -149 +KPX Hbar Hbar 38 + +KPX Idot dollar -63 +KPX Idot hyphen -55 + +KPX kcommaaccent D 110 +KPX kcommaaccent F 85 +KPX kcommaaccent G 97 +KPX kcommaaccent H 86 +KPX kcommaaccent I 220 +KPX kcommaaccent J 97 +KPX kcommaaccent L 220 +KPX kcommaaccent M 218 +KPX kcommaaccent P 125 +KPX kcommaaccent Q 125 +KPX kcommaaccent R 85 +KPX kcommaaccent S 140 +KPX kcommaaccent T 97 +KPX kcommaaccent U 125 +KPX kcommaaccent V 155 +KPX kcommaaccent W 235 +KPX kcommaaccent X 144 +KPX kcommaaccent Y 205 +KPX kcommaaccent Z 166 +KPX kcommaaccent bracketleft 174 +KPX kcommaaccent backslash 205 +KPX kcommaaccent bracketright 179 +KPX kcommaaccent kcommaaccent 261 + +KPX lacute dollar -159 +KPX lacute ampersand -36 +KPX lacute D -159 +KPX lacute H -178 +KPX lacute L -36 +KPX lacute R -178 +KPX lacute X -178 +KPX lacute cent -159 +KPX lacute sterling -159 +KPX lacute currency -159 +KPX lacute yen -159 +KPX lacute brokenbar -159 +KPX lacute section -159 +KPX lacute dieresis -196 +KPX lacute ordfeminine -178 +KPX lacute guillemotleft -178 +KPX lacute logicalnot -178 +KPX lacute sfthyphen -178 +KPX lacute acute -178 +KPX lacute mu -178 +KPX lacute paragraph -178 +KPX lacute periodcentered -178 +KPX lacute cedilla -178 +KPX lacute ordmasculine -178 +KPX lacute guillemotright -178 +KPX lacute onequarter -178 +KPX lacute onehalf -178 +KPX lacute threequarters -178 +KPX lacute Egrave -36 +KPX lacute Icircumflex -36 +KPX lacute Yacute -178 +KPX lacute ebreve -215 +KPX lacute dotlessi -178 + + +KPX uni027D dollar -264 +KPX uni027D hyphen 47 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/Helvetica-Bold.afm b/dompdf/vendor/dompdf/dompdf/lib/fonts/Helvetica-Bold.afm new file mode 100644 index 0000000..92fa6aa --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/Helvetica-Bold.afm @@ -0,0 +1,2829 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:43:52 1997 +Comment UniqueID 43052 +Comment VMusage 37169 48194 +FontName Helvetica-Bold +FullName Helvetica Bold +FamilyName Helvetica +Weight Bold +ItalicAngle 0 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -170 -228 1003 962 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 718 +XHeight 532 +Ascender 718 +Descender -207 +StdHW 118 +StdVW 140 +StartCharMetrics 317 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 160 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 90 0 244 718 ; +C 34 ; WX 474 ; N quotedbl ; B 98 447 376 718 ; +C 35 ; WX 556 ; N numbersign ; B 18 0 538 698 ; +C 36 ; WX 556 ; N dollar ; B 30 -115 523 775 ; +C 37 ; WX 889 ; N percent ; B 28 -19 861 710 ; +C 38 ; WX 722 ; N ampersand ; B 54 -19 701 718 ; +C 146 ; WX 278 ; N quoteright ; B 69 445 209 718 ; +C 40 ; WX 333 ; N parenleft ; B 35 -208 314 734 ; +C 41 ; WX 333 ; N parenright ; B 19 -208 298 734 ; +C 42 ; WX 389 ; N asterisk ; B 27 387 362 718 ; +C 43 ; WX 584 ; N plus ; B 40 0 544 506 ; +C 44 ; WX 278 ; N comma ; B 64 -168 214 146 ; +C 45 ; WX 333 ; N hyphen ; B 27 215 306 345 ; +C 173 ; WX 333 ; N hyphen ; B 44 232 289 322 ; +C 46 ; WX 278 ; N period ; B 64 0 214 146 ; +C 47 ; WX 278 ; N slash ; B -33 -19 311 737 ; +C 48 ; WX 556 ; N zero ; B 32 -19 524 710 ; +C 49 ; WX 556 ; N one ; B 69 0 378 710 ; +C 50 ; WX 556 ; N two ; B 26 0 511 710 ; +C 51 ; WX 556 ; N three ; B 27 -19 516 710 ; +C 52 ; WX 556 ; N four ; B 27 0 526 710 ; +C 53 ; WX 556 ; N five ; B 27 -19 516 698 ; +C 54 ; WX 556 ; N six ; B 31 -19 520 710 ; +C 55 ; WX 556 ; N seven ; B 25 0 528 698 ; +C 56 ; WX 556 ; N eight ; B 32 -19 524 710 ; +C 57 ; WX 556 ; N nine ; B 30 -19 522 710 ; +C 58 ; WX 333 ; N colon ; B 92 0 242 512 ; +C 59 ; WX 333 ; N semicolon ; B 92 -168 242 512 ; +C 60 ; WX 584 ; N less ; B 38 -8 546 514 ; +C 61 ; WX 584 ; N equal ; B 40 87 544 419 ; +C 62 ; WX 584 ; N greater ; B 38 -8 546 514 ; +C 63 ; WX 611 ; N question ; B 60 0 556 727 ; +C 64 ; WX 975 ; N at ; B 118 -19 856 737 ; +C 65 ; WX 722 ; N A ; B 20 0 702 718 ; +C 66 ; WX 722 ; N B ; B 76 0 669 718 ; +C 67 ; WX 722 ; N C ; B 44 -19 684 737 ; +C 68 ; WX 722 ; N D ; B 76 0 685 718 ; +C 69 ; WX 667 ; N E ; B 76 0 621 718 ; +C 70 ; WX 611 ; N F ; B 76 0 587 718 ; +C 71 ; WX 778 ; N G ; B 44 -19 713 737 ; +C 72 ; WX 722 ; N H ; B 71 0 651 718 ; +C 73 ; WX 278 ; N I ; B 64 0 214 718 ; +C 74 ; WX 556 ; N J ; B 22 -18 484 718 ; +C 75 ; WX 722 ; N K ; B 87 0 722 718 ; +C 76 ; WX 611 ; N L ; B 76 0 583 718 ; +C 77 ; WX 833 ; N M ; B 69 0 765 718 ; +C 78 ; WX 722 ; N N ; B 69 0 654 718 ; +C 79 ; WX 778 ; N O ; B 44 -19 734 737 ; +C 80 ; WX 667 ; N P ; B 76 0 627 718 ; +C 81 ; WX 778 ; N Q ; B 44 -52 737 737 ; +C 82 ; WX 722 ; N R ; B 76 0 677 718 ; +C 83 ; WX 667 ; N S ; B 39 -19 629 737 ; +C 84 ; WX 611 ; N T ; B 14 0 598 718 ; +C 85 ; WX 722 ; N U ; B 72 -19 651 718 ; +C 86 ; WX 667 ; N V ; B 19 0 648 718 ; +C 87 ; WX 944 ; N W ; B 16 0 929 718 ; +C 88 ; WX 667 ; N X ; B 14 0 653 718 ; +C 89 ; WX 667 ; N Y ; B 15 0 653 718 ; +C 90 ; WX 611 ; N Z ; B 25 0 586 718 ; +C 91 ; WX 333 ; N bracketleft ; B 63 -196 309 722 ; +C 92 ; WX 278 ; N backslash ; B -33 -19 311 737 ; +C 93 ; WX 333 ; N bracketright ; B 24 -196 270 722 ; +C 94 ; WX 584 ; N asciicircum ; B 62 323 522 698 ; +C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ; +C 145 ; WX 278 ; N quoteleft ; B 69 454 209 727 ; +C 97 ; WX 556 ; N a ; B 29 -14 527 546 ; +C 98 ; WX 611 ; N b ; B 61 -14 578 718 ; +C 99 ; WX 556 ; N c ; B 34 -14 524 546 ; +C 100 ; WX 611 ; N d ; B 34 -14 551 718 ; +C 101 ; WX 556 ; N e ; B 23 -14 528 546 ; +C 102 ; WX 333 ; N f ; B 10 0 318 727 ; L i fi ; L l fl ; +C 103 ; WX 611 ; N g ; B 40 -217 553 546 ; +C 104 ; WX 611 ; N h ; B 65 0 546 718 ; +C 105 ; WX 278 ; N i ; B 69 0 209 725 ; +C 106 ; WX 278 ; N j ; B 3 -214 209 725 ; +C 107 ; WX 556 ; N k ; B 69 0 562 718 ; +C 108 ; WX 278 ; N l ; B 69 0 209 718 ; +C 109 ; WX 889 ; N m ; B 64 0 826 546 ; +C 110 ; WX 611 ; N n ; B 65 0 546 546 ; +C 111 ; WX 611 ; N o ; B 34 -14 578 546 ; +C 112 ; WX 611 ; N p ; B 62 -207 578 546 ; +C 113 ; WX 611 ; N q ; B 34 -207 552 546 ; +C 114 ; WX 389 ; N r ; B 64 0 373 546 ; +C 115 ; WX 556 ; N s ; B 30 -14 519 546 ; +C 116 ; WX 333 ; N t ; B 10 -6 309 676 ; +C 117 ; WX 611 ; N u ; B 66 -14 545 532 ; +C 118 ; WX 556 ; N v ; B 13 0 543 532 ; +C 119 ; WX 778 ; N w ; B 10 0 769 532 ; +C 120 ; WX 556 ; N x ; B 15 0 541 532 ; +C 121 ; WX 556 ; N y ; B 10 -214 539 532 ; +C 122 ; WX 500 ; N z ; B 20 0 480 532 ; +C 123 ; WX 389 ; N braceleft ; B 48 -196 365 722 ; +C 124 ; WX 280 ; N bar ; B 84 -225 196 775 ; +C 125 ; WX 389 ; N braceright ; B 24 -196 341 722 ; +C 126 ; WX 584 ; N asciitilde ; B 61 163 523 343 ; +C 161 ; WX 333 ; N exclamdown ; B 90 -186 244 532 ; +C 162 ; WX 556 ; N cent ; B 34 -118 524 628 ; +C 163 ; WX 556 ; N sterling ; B 28 -16 541 718 ; +C -1 ; WX 167 ; N fraction ; B -170 -19 336 710 ; +C 165 ; WX 556 ; N yen ; B -9 0 565 698 ; +C 131 ; WX 556 ; N florin ; B -10 -210 516 737 ; +C 167 ; WX 556 ; N section ; B 34 -184 522 727 ; +C 164 ; WX 556 ; N currency ; B -3 76 559 636 ; +C 39 ; WX 238 ; N quotesingle ; B 70 447 168 718 ; +C 147 ; WX 500 ; N quotedblleft ; B 64 454 436 727 ; +C 171 ; WX 556 ; N guillemotleft ; B 88 76 468 484 ; +C 139 ; WX 333 ; N guilsinglleft ; B 83 76 250 484 ; +C 155 ; WX 333 ; N guilsinglright ; B 83 76 250 484 ; +C -1 ; WX 611 ; N fi ; B 10 0 542 727 ; +C -1 ; WX 611 ; N fl ; B 10 0 542 727 ; +C 150 ; WX 556 ; N endash ; B 0 227 556 333 ; +C 134 ; WX 556 ; N dagger ; B 36 -171 520 718 ; +C 135 ; WX 556 ; N daggerdbl ; B 36 -171 520 718 ; +C 183 ; WX 278 ; N periodcentered ; B 58 172 220 334 ; +C 182 ; WX 556 ; N paragraph ; B -8 -191 539 700 ; +C 149 ; WX 350 ; N bullet ; B 10 194 340 524 ; +C 130 ; WX 278 ; N quotesinglbase ; B 69 -146 209 127 ; +C 132 ; WX 500 ; N quotedblbase ; B 64 -146 436 127 ; +C 148 ; WX 500 ; N quotedblright ; B 64 445 436 718 ; +C 187 ; WX 556 ; N guillemotright ; B 88 76 468 484 ; +C 133 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ; +C 137 ; WX 1000 ; N perthousand ; B -3 -19 1003 710 ; +C 191 ; WX 611 ; N questiondown ; B 55 -195 551 532 ; +C 96 ; WX 333 ; N grave ; B -23 604 225 750 ; +C 180 ; WX 333 ; N acute ; B 108 604 356 750 ; +C 136 ; WX 333 ; N circumflex ; B -10 604 343 750 ; +C 152 ; WX 333 ; N tilde ; B -17 610 350 737 ; +C 175 ; WX 333 ; N macron ; B -6 604 339 678 ; +C -1 ; WX 333 ; N breve ; B -2 604 335 750 ; +C -1 ; WX 333 ; N dotaccent ; B 104 614 230 729 ; +C 168 ; WX 333 ; N dieresis ; B 6 614 327 729 ; +C -1 ; WX 333 ; N ring ; B 59 568 275 776 ; +C 184 ; WX 333 ; N cedilla ; B 6 -228 245 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B 9 604 486 750 ; +C -1 ; WX 333 ; N ogonek ; B 71 -228 304 0 ; +C -1 ; WX 333 ; N caron ; B -10 604 343 750 ; +C 151 ; WX 1000 ; N emdash ; B 0 227 1000 333 ; +C 198 ; WX 1000 ; N AE ; B 5 0 954 718 ; +C 170 ; WX 370 ; N ordfeminine ; B 22 401 347 737 ; +C -1 ; WX 611 ; N Lslash ; B -20 0 583 718 ; +C 216 ; WX 778 ; N Oslash ; B 33 -27 744 745 ; +C 140 ; WX 1000 ; N OE ; B 37 -19 961 737 ; +C 186 ; WX 365 ; N ordmasculine ; B 6 401 360 737 ; +C 230 ; WX 889 ; N ae ; B 29 -14 858 546 ; +C -1 ; WX 278 ; N dotlessi ; B 69 0 209 532 ; +C -1 ; WX 278 ; N lslash ; B -18 0 296 718 ; +C 248 ; WX 611 ; N oslash ; B 22 -29 589 560 ; +C 156 ; WX 944 ; N oe ; B 34 -14 912 546 ; +C 223 ; WX 611 ; N germandbls ; B 69 -14 579 731 ; +C 207 ; WX 278 ; N Idieresis ; B -21 0 300 915 ; +C 233 ; WX 556 ; N eacute ; B 23 -14 528 750 ; +C -1 ; WX 556 ; N abreve ; B 29 -14 527 750 ; +C -1 ; WX 611 ; N uhungarumlaut ; B 66 -14 625 750 ; +C -1 ; WX 556 ; N ecaron ; B 23 -14 528 750 ; +C 159 ; WX 667 ; N Ydieresis ; B 15 0 653 915 ; +C 247 ; WX 584 ; N divide ; B 40 -42 544 548 ; +C 221 ; WX 667 ; N Yacute ; B 15 0 653 936 ; +C 194 ; WX 722 ; N Acircumflex ; B 20 0 702 936 ; +C 225 ; WX 556 ; N aacute ; B 29 -14 527 750 ; +C 219 ; WX 722 ; N Ucircumflex ; B 72 -19 651 936 ; +C 253 ; WX 556 ; N yacute ; B 10 -214 539 750 ; +C -1 ; WX 556 ; N scommaaccent ; B 30 -228 519 546 ; +C 234 ; WX 556 ; N ecircumflex ; B 23 -14 528 750 ; +C -1 ; WX 722 ; N Uring ; B 72 -19 651 962 ; +C 220 ; WX 722 ; N Udieresis ; B 72 -19 651 915 ; +C -1 ; WX 556 ; N aogonek ; B 29 -224 545 546 ; +C 218 ; WX 722 ; N Uacute ; B 72 -19 651 936 ; +C -1 ; WX 611 ; N uogonek ; B 66 -228 545 532 ; +C 203 ; WX 667 ; N Edieresis ; B 76 0 621 915 ; +C -1 ; WX 722 ; N Dcroat ; B -5 0 685 718 ; +C -1 ; WX 250 ; N commaaccent ; B 64 -228 199 -50 ; +C 169 ; WX 737 ; N copyright ; B -11 -19 749 737 ; +C -1 ; WX 667 ; N Emacron ; B 76 0 621 864 ; +C -1 ; WX 556 ; N ccaron ; B 34 -14 524 750 ; +C 229 ; WX 556 ; N aring ; B 29 -14 527 776 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 654 718 ; +C -1 ; WX 278 ; N lacute ; B 69 0 329 936 ; +C 224 ; WX 556 ; N agrave ; B 29 -14 527 750 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 14 -228 598 718 ; +C -1 ; WX 722 ; N Cacute ; B 44 -19 684 936 ; +C 227 ; WX 556 ; N atilde ; B 29 -14 527 737 ; +C -1 ; WX 667 ; N Edotaccent ; B 76 0 621 915 ; +C 154 ; WX 556 ; N scaron ; B 30 -14 519 750 ; +C -1 ; WX 556 ; N scedilla ; B 30 -228 519 546 ; +C 237 ; WX 278 ; N iacute ; B 69 0 329 750 ; +C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; +C -1 ; WX 722 ; N Rcaron ; B 76 0 677 936 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 44 -228 713 737 ; +C 251 ; WX 611 ; N ucircumflex ; B 66 -14 545 750 ; +C 226 ; WX 556 ; N acircumflex ; B 29 -14 527 750 ; +C -1 ; WX 722 ; N Amacron ; B 20 0 702 864 ; +C -1 ; WX 389 ; N rcaron ; B 18 0 373 750 ; +C 231 ; WX 556 ; N ccedilla ; B 34 -228 524 546 ; +C -1 ; WX 611 ; N Zdotaccent ; B 25 0 586 915 ; +C 222 ; WX 667 ; N Thorn ; B 76 0 627 718 ; +C -1 ; WX 778 ; N Omacron ; B 44 -19 734 864 ; +C -1 ; WX 722 ; N Racute ; B 76 0 677 936 ; +C -1 ; WX 667 ; N Sacute ; B 39 -19 629 936 ; +C -1 ; WX 743 ; N dcaron ; B 34 -14 750 718 ; +C -1 ; WX 722 ; N Umacron ; B 72 -19 651 864 ; +C -1 ; WX 611 ; N uring ; B 66 -14 545 776 ; +C 179 ; WX 333 ; N threesuperior ; B 8 271 326 710 ; +C 210 ; WX 778 ; N Ograve ; B 44 -19 734 936 ; +C 192 ; WX 722 ; N Agrave ; B 20 0 702 936 ; +C -1 ; WX 722 ; N Abreve ; B 20 0 702 936 ; +C 215 ; WX 584 ; N multiply ; B 40 1 545 505 ; +C 250 ; WX 611 ; N uacute ; B 66 -14 545 750 ; +C -1 ; WX 611 ; N Tcaron ; B 14 0 598 936 ; +C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; +C 255 ; WX 556 ; N ydieresis ; B 10 -214 539 729 ; +C -1 ; WX 722 ; N Nacute ; B 69 0 654 936 ; +C 238 ; WX 278 ; N icircumflex ; B -37 0 316 750 ; +C 202 ; WX 667 ; N Ecircumflex ; B 76 0 621 936 ; +C 228 ; WX 556 ; N adieresis ; B 29 -14 527 729 ; +C 235 ; WX 556 ; N edieresis ; B 23 -14 528 729 ; +C -1 ; WX 556 ; N cacute ; B 34 -14 524 750 ; +C -1 ; WX 611 ; N nacute ; B 65 0 546 750 ; +C -1 ; WX 611 ; N umacron ; B 66 -14 545 678 ; +C -1 ; WX 722 ; N Ncaron ; B 69 0 654 936 ; +C 205 ; WX 278 ; N Iacute ; B 64 0 329 936 ; +C 177 ; WX 584 ; N plusminus ; B 40 0 544 506 ; +C 166 ; WX 280 ; N brokenbar ; B 84 -150 196 700 ; +C 174 ; WX 737 ; N registered ; B -11 -19 748 737 ; +C -1 ; WX 778 ; N Gbreve ; B 44 -19 713 936 ; +C -1 ; WX 278 ; N Idotaccent ; B 64 0 214 915 ; +C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; +C 200 ; WX 667 ; N Egrave ; B 76 0 621 936 ; +C -1 ; WX 389 ; N racute ; B 64 0 384 750 ; +C -1 ; WX 611 ; N omacron ; B 34 -14 578 678 ; +C -1 ; WX 611 ; N Zacute ; B 25 0 586 936 ; +C 142 ; WX 611 ; N Zcaron ; B 25 0 586 936 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; +C 208 ; WX 722 ; N Eth ; B -5 0 685 718 ; +C 199 ; WX 722 ; N Ccedilla ; B 44 -228 684 737 ; +C -1 ; WX 278 ; N lcommaaccent ; B 69 -228 213 718 ; +C -1 ; WX 389 ; N tcaron ; B 10 -6 421 878 ; +C -1 ; WX 556 ; N eogonek ; B 23 -228 528 546 ; +C -1 ; WX 722 ; N Uogonek ; B 72 -228 651 718 ; +C 193 ; WX 722 ; N Aacute ; B 20 0 702 936 ; +C 196 ; WX 722 ; N Adieresis ; B 20 0 702 915 ; +C 232 ; WX 556 ; N egrave ; B 23 -14 528 750 ; +C -1 ; WX 500 ; N zacute ; B 20 0 480 750 ; +C -1 ; WX 278 ; N iogonek ; B 16 -224 249 725 ; +C 211 ; WX 778 ; N Oacute ; B 44 -19 734 936 ; +C 243 ; WX 611 ; N oacute ; B 34 -14 578 750 ; +C -1 ; WX 556 ; N amacron ; B 29 -14 527 678 ; +C -1 ; WX 556 ; N sacute ; B 30 -14 519 750 ; +C 239 ; WX 278 ; N idieresis ; B -21 0 300 729 ; +C 212 ; WX 778 ; N Ocircumflex ; B 44 -19 734 936 ; +C 217 ; WX 722 ; N Ugrave ; B 72 -19 651 936 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 611 ; N thorn ; B 62 -208 578 718 ; +C 178 ; WX 333 ; N twosuperior ; B 9 283 324 710 ; +C 214 ; WX 778 ; N Odieresis ; B 44 -19 734 915 ; +C 181 ; WX 611 ; N mu ; B 66 -207 545 532 ; +C 236 ; WX 278 ; N igrave ; B -50 0 209 750 ; +C -1 ; WX 611 ; N ohungarumlaut ; B 34 -14 625 750 ; +C -1 ; WX 667 ; N Eogonek ; B 76 -224 639 718 ; +C -1 ; WX 611 ; N dcroat ; B 34 -14 650 718 ; +C 190 ; WX 834 ; N threequarters ; B 16 -19 799 710 ; +C -1 ; WX 667 ; N Scedilla ; B 39 -228 629 737 ; +C -1 ; WX 400 ; N lcaron ; B 69 0 408 718 ; +C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 722 718 ; +C -1 ; WX 611 ; N Lacute ; B 76 0 583 936 ; +C 153 ; WX 1000 ; N trademark ; B 44 306 956 718 ; +C -1 ; WX 556 ; N edotaccent ; B 23 -14 528 729 ; +C 204 ; WX 278 ; N Igrave ; B -50 0 214 936 ; +C -1 ; WX 278 ; N Imacron ; B -33 0 312 864 ; +C -1 ; WX 611 ; N Lcaron ; B 76 0 583 718 ; +C 189 ; WX 834 ; N onehalf ; B 26 -19 794 710 ; +C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; +C 244 ; WX 611 ; N ocircumflex ; B 34 -14 578 750 ; +C 241 ; WX 611 ; N ntilde ; B 65 0 546 737 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 72 -19 681 936 ; +C 201 ; WX 667 ; N Eacute ; B 76 0 621 936 ; +C -1 ; WX 556 ; N emacron ; B 23 -14 528 678 ; +C -1 ; WX 611 ; N gbreve ; B 40 -217 553 750 ; +C 188 ; WX 834 ; N onequarter ; B 26 -19 766 710 ; +C 138 ; WX 667 ; N Scaron ; B 39 -19 629 936 ; +C -1 ; WX 667 ; N Scommaaccent ; B 39 -228 629 737 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 44 -19 734 936 ; +C 176 ; WX 400 ; N degree ; B 57 426 343 712 ; +C 242 ; WX 611 ; N ograve ; B 34 -14 578 750 ; +C -1 ; WX 722 ; N Ccaron ; B 44 -19 684 936 ; +C 249 ; WX 611 ; N ugrave ; B 66 -14 545 750 ; +C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; +C -1 ; WX 722 ; N Dcaron ; B 76 0 685 936 ; +C -1 ; WX 389 ; N rcommaaccent ; B 64 -228 373 546 ; +C 209 ; WX 722 ; N Ntilde ; B 69 0 654 923 ; +C 245 ; WX 611 ; N otilde ; B 34 -14 578 737 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 677 718 ; +C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 583 718 ; +C 195 ; WX 722 ; N Atilde ; B 20 0 702 923 ; +C -1 ; WX 722 ; N Aogonek ; B 20 -224 742 718 ; +C 197 ; WX 722 ; N Aring ; B 20 0 702 962 ; +C 213 ; WX 778 ; N Otilde ; B 44 -19 734 923 ; +C -1 ; WX 500 ; N zdotaccent ; B 20 0 480 729 ; +C -1 ; WX 667 ; N Ecaron ; B 76 0 621 936 ; +C -1 ; WX 278 ; N Iogonek ; B -11 -228 222 718 ; +C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 562 718 ; +C -1 ; WX 584 ; N minus ; B 40 197 544 309 ; +C 206 ; WX 278 ; N Icircumflex ; B -37 0 316 936 ; +C -1 ; WX 611 ; N ncaron ; B 65 0 546 750 ; +C -1 ; WX 333 ; N tcommaaccent ; B 10 -228 309 676 ; +C 172 ; WX 584 ; N logicalnot ; B 40 108 544 419 ; +C 246 ; WX 611 ; N odieresis ; B 34 -14 578 729 ; +C 252 ; WX 611 ; N udieresis ; B 66 -14 545 729 ; +C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; +C -1 ; WX 611 ; N gcommaaccent ; B 40 -217 553 850 ; +C 240 ; WX 611 ; N eth ; B 34 -14 578 737 ; +C 158 ; WX 500 ; N zcaron ; B 20 0 480 750 ; +C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 546 546 ; +C 185 ; WX 333 ; N onesuperior ; B 26 283 237 710 ; +C -1 ; WX 278 ; N imacron ; B -8 0 285 678 ; +C 128 ; WX 556 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2481 +KPX A C -40 +KPX A Cacute -40 +KPX A Ccaron -40 +KPX A Ccedilla -40 +KPX A G -50 +KPX A Gbreve -50 +KPX A Gcommaaccent -50 +KPX A O -40 +KPX A Oacute -40 +KPX A Ocircumflex -40 +KPX A Odieresis -40 +KPX A Ograve -40 +KPX A Ohungarumlaut -40 +KPX A Omacron -40 +KPX A Oslash -40 +KPX A Otilde -40 +KPX A Q -40 +KPX A T -90 +KPX A Tcaron -90 +KPX A Tcommaaccent -90 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -80 +KPX A W -60 +KPX A Y -110 +KPX A Yacute -110 +KPX A Ydieresis -110 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -40 +KPX A w -30 +KPX A y -30 +KPX A yacute -30 +KPX A ydieresis -30 +KPX Aacute C -40 +KPX Aacute Cacute -40 +KPX Aacute Ccaron -40 +KPX Aacute Ccedilla -40 +KPX Aacute G -50 +KPX Aacute Gbreve -50 +KPX Aacute Gcommaaccent -50 +KPX Aacute O -40 +KPX Aacute Oacute -40 +KPX Aacute Ocircumflex -40 +KPX Aacute Odieresis -40 +KPX Aacute Ograve -40 +KPX Aacute Ohungarumlaut -40 +KPX Aacute Omacron -40 +KPX Aacute Oslash -40 +KPX Aacute Otilde -40 +KPX Aacute Q -40 +KPX Aacute T -90 +KPX Aacute Tcaron -90 +KPX Aacute Tcommaaccent -90 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -80 +KPX Aacute W -60 +KPX Aacute Y -110 +KPX Aacute Yacute -110 +KPX Aacute Ydieresis -110 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -40 +KPX Aacute w -30 +KPX Aacute y -30 +KPX Aacute yacute -30 +KPX Aacute ydieresis -30 +KPX Abreve C -40 +KPX Abreve Cacute -40 +KPX Abreve Ccaron -40 +KPX Abreve Ccedilla -40 +KPX Abreve G -50 +KPX Abreve Gbreve -50 +KPX Abreve Gcommaaccent -50 +KPX Abreve O -40 +KPX Abreve Oacute -40 +KPX Abreve Ocircumflex -40 +KPX Abreve Odieresis -40 +KPX Abreve Ograve -40 +KPX Abreve Ohungarumlaut -40 +KPX Abreve Omacron -40 +KPX Abreve Oslash -40 +KPX Abreve Otilde -40 +KPX Abreve Q -40 +KPX Abreve T -90 +KPX Abreve Tcaron -90 +KPX Abreve Tcommaaccent -90 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -80 +KPX Abreve W -60 +KPX Abreve Y -110 +KPX Abreve Yacute -110 +KPX Abreve Ydieresis -110 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -40 +KPX Abreve w -30 +KPX Abreve y -30 +KPX Abreve yacute -30 +KPX Abreve ydieresis -30 +KPX Acircumflex C -40 +KPX Acircumflex Cacute -40 +KPX Acircumflex Ccaron -40 +KPX Acircumflex Ccedilla -40 +KPX Acircumflex G -50 +KPX Acircumflex Gbreve -50 +KPX Acircumflex Gcommaaccent -50 +KPX Acircumflex O -40 +KPX Acircumflex Oacute -40 +KPX Acircumflex Ocircumflex -40 +KPX Acircumflex Odieresis -40 +KPX Acircumflex Ograve -40 +KPX Acircumflex Ohungarumlaut -40 +KPX Acircumflex Omacron -40 +KPX Acircumflex Oslash -40 +KPX Acircumflex Otilde -40 +KPX Acircumflex Q -40 +KPX Acircumflex T -90 +KPX Acircumflex Tcaron -90 +KPX Acircumflex Tcommaaccent -90 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -80 +KPX Acircumflex W -60 +KPX Acircumflex Y -110 +KPX Acircumflex Yacute -110 +KPX Acircumflex Ydieresis -110 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -40 +KPX Acircumflex w -30 +KPX Acircumflex y -30 +KPX Acircumflex yacute -30 +KPX Acircumflex ydieresis -30 +KPX Adieresis C -40 +KPX Adieresis Cacute -40 +KPX Adieresis Ccaron -40 +KPX Adieresis Ccedilla -40 +KPX Adieresis G -50 +KPX Adieresis Gbreve -50 +KPX Adieresis Gcommaaccent -50 +KPX Adieresis O -40 +KPX Adieresis Oacute -40 +KPX Adieresis Ocircumflex -40 +KPX Adieresis Odieresis -40 +KPX Adieresis Ograve -40 +KPX Adieresis Ohungarumlaut -40 +KPX Adieresis Omacron -40 +KPX Adieresis Oslash -40 +KPX Adieresis Otilde -40 +KPX Adieresis Q -40 +KPX Adieresis T -90 +KPX Adieresis Tcaron -90 +KPX Adieresis Tcommaaccent -90 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -80 +KPX Adieresis W -60 +KPX Adieresis Y -110 +KPX Adieresis Yacute -110 +KPX Adieresis Ydieresis -110 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -40 +KPX Adieresis w -30 +KPX Adieresis y -30 +KPX Adieresis yacute -30 +KPX Adieresis ydieresis -30 +KPX Agrave C -40 +KPX Agrave Cacute -40 +KPX Agrave Ccaron -40 +KPX Agrave Ccedilla -40 +KPX Agrave G -50 +KPX Agrave Gbreve -50 +KPX Agrave Gcommaaccent -50 +KPX Agrave O -40 +KPX Agrave Oacute -40 +KPX Agrave Ocircumflex -40 +KPX Agrave Odieresis -40 +KPX Agrave Ograve -40 +KPX Agrave Ohungarumlaut -40 +KPX Agrave Omacron -40 +KPX Agrave Oslash -40 +KPX Agrave Otilde -40 +KPX Agrave Q -40 +KPX Agrave T -90 +KPX Agrave Tcaron -90 +KPX Agrave Tcommaaccent -90 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -80 +KPX Agrave W -60 +KPX Agrave Y -110 +KPX Agrave Yacute -110 +KPX Agrave Ydieresis -110 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -40 +KPX Agrave w -30 +KPX Agrave y -30 +KPX Agrave yacute -30 +KPX Agrave ydieresis -30 +KPX Amacron C -40 +KPX Amacron Cacute -40 +KPX Amacron Ccaron -40 +KPX Amacron Ccedilla -40 +KPX Amacron G -50 +KPX Amacron Gbreve -50 +KPX Amacron Gcommaaccent -50 +KPX Amacron O -40 +KPX Amacron Oacute -40 +KPX Amacron Ocircumflex -40 +KPX Amacron Odieresis -40 +KPX Amacron Ograve -40 +KPX Amacron Ohungarumlaut -40 +KPX Amacron Omacron -40 +KPX Amacron Oslash -40 +KPX Amacron Otilde -40 +KPX Amacron Q -40 +KPX Amacron T -90 +KPX Amacron Tcaron -90 +KPX Amacron Tcommaaccent -90 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -80 +KPX Amacron W -60 +KPX Amacron Y -110 +KPX Amacron Yacute -110 +KPX Amacron Ydieresis -110 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -40 +KPX Amacron w -30 +KPX Amacron y -30 +KPX Amacron yacute -30 +KPX Amacron ydieresis -30 +KPX Aogonek C -40 +KPX Aogonek Cacute -40 +KPX Aogonek Ccaron -40 +KPX Aogonek Ccedilla -40 +KPX Aogonek G -50 +KPX Aogonek Gbreve -50 +KPX Aogonek Gcommaaccent -50 +KPX Aogonek O -40 +KPX Aogonek Oacute -40 +KPX Aogonek Ocircumflex -40 +KPX Aogonek Odieresis -40 +KPX Aogonek Ograve -40 +KPX Aogonek Ohungarumlaut -40 +KPX Aogonek Omacron -40 +KPX Aogonek Oslash -40 +KPX Aogonek Otilde -40 +KPX Aogonek Q -40 +KPX Aogonek T -90 +KPX Aogonek Tcaron -90 +KPX Aogonek Tcommaaccent -90 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -80 +KPX Aogonek W -60 +KPX Aogonek Y -110 +KPX Aogonek Yacute -110 +KPX Aogonek Ydieresis -110 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -40 +KPX Aogonek w -30 +KPX Aogonek y -30 +KPX Aogonek yacute -30 +KPX Aogonek ydieresis -30 +KPX Aring C -40 +KPX Aring Cacute -40 +KPX Aring Ccaron -40 +KPX Aring Ccedilla -40 +KPX Aring G -50 +KPX Aring Gbreve -50 +KPX Aring Gcommaaccent -50 +KPX Aring O -40 +KPX Aring Oacute -40 +KPX Aring Ocircumflex -40 +KPX Aring Odieresis -40 +KPX Aring Ograve -40 +KPX Aring Ohungarumlaut -40 +KPX Aring Omacron -40 +KPX Aring Oslash -40 +KPX Aring Otilde -40 +KPX Aring Q -40 +KPX Aring T -90 +KPX Aring Tcaron -90 +KPX Aring Tcommaaccent -90 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -80 +KPX Aring W -60 +KPX Aring Y -110 +KPX Aring Yacute -110 +KPX Aring Ydieresis -110 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -40 +KPX Aring w -30 +KPX Aring y -30 +KPX Aring yacute -30 +KPX Aring ydieresis -30 +KPX Atilde C -40 +KPX Atilde Cacute -40 +KPX Atilde Ccaron -40 +KPX Atilde Ccedilla -40 +KPX Atilde G -50 +KPX Atilde Gbreve -50 +KPX Atilde Gcommaaccent -50 +KPX Atilde O -40 +KPX Atilde Oacute -40 +KPX Atilde Ocircumflex -40 +KPX Atilde Odieresis -40 +KPX Atilde Ograve -40 +KPX Atilde Ohungarumlaut -40 +KPX Atilde Omacron -40 +KPX Atilde Oslash -40 +KPX Atilde Otilde -40 +KPX Atilde Q -40 +KPX Atilde T -90 +KPX Atilde Tcaron -90 +KPX Atilde Tcommaaccent -90 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -80 +KPX Atilde W -60 +KPX Atilde Y -110 +KPX Atilde Yacute -110 +KPX Atilde Ydieresis -110 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -40 +KPX Atilde w -30 +KPX Atilde y -30 +KPX Atilde yacute -30 +KPX Atilde ydieresis -30 +KPX B A -30 +KPX B Aacute -30 +KPX B Abreve -30 +KPX B Acircumflex -30 +KPX B Adieresis -30 +KPX B Agrave -30 +KPX B Amacron -30 +KPX B Aogonek -30 +KPX B Aring -30 +KPX B Atilde -30 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -40 +KPX D W -40 +KPX D Y -70 +KPX D Yacute -70 +KPX D Ydieresis -70 +KPX D comma -30 +KPX D period -30 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -40 +KPX Dcaron W -40 +KPX Dcaron Y -70 +KPX Dcaron Yacute -70 +KPX Dcaron Ydieresis -70 +KPX Dcaron comma -30 +KPX Dcaron period -30 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -40 +KPX Dcroat W -40 +KPX Dcroat Y -70 +KPX Dcroat Yacute -70 +KPX Dcroat Ydieresis -70 +KPX Dcroat comma -30 +KPX Dcroat period -30 +KPX F A -80 +KPX F Aacute -80 +KPX F Abreve -80 +KPX F Acircumflex -80 +KPX F Adieresis -80 +KPX F Agrave -80 +KPX F Amacron -80 +KPX F Aogonek -80 +KPX F Aring -80 +KPX F Atilde -80 +KPX F a -20 +KPX F aacute -20 +KPX F abreve -20 +KPX F acircumflex -20 +KPX F adieresis -20 +KPX F agrave -20 +KPX F amacron -20 +KPX F aogonek -20 +KPX F aring -20 +KPX F atilde -20 +KPX F comma -100 +KPX F period -100 +KPX J A -20 +KPX J Aacute -20 +KPX J Abreve -20 +KPX J Acircumflex -20 +KPX J Adieresis -20 +KPX J Agrave -20 +KPX J Amacron -20 +KPX J Aogonek -20 +KPX J Aring -20 +KPX J Atilde -20 +KPX J comma -20 +KPX J period -20 +KPX J u -20 +KPX J uacute -20 +KPX J ucircumflex -20 +KPX J udieresis -20 +KPX J ugrave -20 +KPX J uhungarumlaut -20 +KPX J umacron -20 +KPX J uogonek -20 +KPX J uring -20 +KPX K O -30 +KPX K Oacute -30 +KPX K Ocircumflex -30 +KPX K Odieresis -30 +KPX K Ograve -30 +KPX K Ohungarumlaut -30 +KPX K Omacron -30 +KPX K Oslash -30 +KPX K Otilde -30 +KPX K e -15 +KPX K eacute -15 +KPX K ecaron -15 +KPX K ecircumflex -15 +KPX K edieresis -15 +KPX K edotaccent -15 +KPX K egrave -15 +KPX K emacron -15 +KPX K eogonek -15 +KPX K o -35 +KPX K oacute -35 +KPX K ocircumflex -35 +KPX K odieresis -35 +KPX K ograve -35 +KPX K ohungarumlaut -35 +KPX K omacron -35 +KPX K oslash -35 +KPX K otilde -35 +KPX K u -30 +KPX K uacute -30 +KPX K ucircumflex -30 +KPX K udieresis -30 +KPX K ugrave -30 +KPX K uhungarumlaut -30 +KPX K umacron -30 +KPX K uogonek -30 +KPX K uring -30 +KPX K y -40 +KPX K yacute -40 +KPX K ydieresis -40 +KPX Kcommaaccent O -30 +KPX Kcommaaccent Oacute -30 +KPX Kcommaaccent Ocircumflex -30 +KPX Kcommaaccent Odieresis -30 +KPX Kcommaaccent Ograve -30 +KPX Kcommaaccent Ohungarumlaut -30 +KPX Kcommaaccent Omacron -30 +KPX Kcommaaccent Oslash -30 +KPX Kcommaaccent Otilde -30 +KPX Kcommaaccent e -15 +KPX Kcommaaccent eacute -15 +KPX Kcommaaccent ecaron -15 +KPX Kcommaaccent ecircumflex -15 +KPX Kcommaaccent edieresis -15 +KPX Kcommaaccent edotaccent -15 +KPX Kcommaaccent egrave -15 +KPX Kcommaaccent emacron -15 +KPX Kcommaaccent eogonek -15 +KPX Kcommaaccent o -35 +KPX Kcommaaccent oacute -35 +KPX Kcommaaccent ocircumflex -35 +KPX Kcommaaccent odieresis -35 +KPX Kcommaaccent ograve -35 +KPX Kcommaaccent ohungarumlaut -35 +KPX Kcommaaccent omacron -35 +KPX Kcommaaccent oslash -35 +KPX Kcommaaccent otilde -35 +KPX Kcommaaccent u -30 +KPX Kcommaaccent uacute -30 +KPX Kcommaaccent ucircumflex -30 +KPX Kcommaaccent udieresis -30 +KPX Kcommaaccent ugrave -30 +KPX Kcommaaccent uhungarumlaut -30 +KPX Kcommaaccent umacron -30 +KPX Kcommaaccent uogonek -30 +KPX Kcommaaccent uring -30 +KPX Kcommaaccent y -40 +KPX Kcommaaccent yacute -40 +KPX Kcommaaccent ydieresis -40 +KPX L T -90 +KPX L Tcaron -90 +KPX L Tcommaaccent -90 +KPX L V -110 +KPX L W -80 +KPX L Y -120 +KPX L Yacute -120 +KPX L Ydieresis -120 +KPX L quotedblright -140 +KPX L quoteright -140 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -90 +KPX Lacute Tcaron -90 +KPX Lacute Tcommaaccent -90 +KPX Lacute V -110 +KPX Lacute W -80 +KPX Lacute Y -120 +KPX Lacute Yacute -120 +KPX Lacute Ydieresis -120 +KPX Lacute quotedblright -140 +KPX Lacute quoteright -140 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcommaaccent T -90 +KPX Lcommaaccent Tcaron -90 +KPX Lcommaaccent Tcommaaccent -90 +KPX Lcommaaccent V -110 +KPX Lcommaaccent W -80 +KPX Lcommaaccent Y -120 +KPX Lcommaaccent Yacute -120 +KPX Lcommaaccent Ydieresis -120 +KPX Lcommaaccent quotedblright -140 +KPX Lcommaaccent quoteright -140 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -90 +KPX Lslash Tcaron -90 +KPX Lslash Tcommaaccent -90 +KPX Lslash V -110 +KPX Lslash W -80 +KPX Lslash Y -120 +KPX Lslash Yacute -120 +KPX Lslash Ydieresis -120 +KPX Lslash quotedblright -140 +KPX Lslash quoteright -140 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX O A -50 +KPX O Aacute -50 +KPX O Abreve -50 +KPX O Acircumflex -50 +KPX O Adieresis -50 +KPX O Agrave -50 +KPX O Amacron -50 +KPX O Aogonek -50 +KPX O Aring -50 +KPX O Atilde -50 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -50 +KPX O X -50 +KPX O Y -70 +KPX O Yacute -70 +KPX O Ydieresis -70 +KPX O comma -40 +KPX O period -40 +KPX Oacute A -50 +KPX Oacute Aacute -50 +KPX Oacute Abreve -50 +KPX Oacute Acircumflex -50 +KPX Oacute Adieresis -50 +KPX Oacute Agrave -50 +KPX Oacute Amacron -50 +KPX Oacute Aogonek -50 +KPX Oacute Aring -50 +KPX Oacute Atilde -50 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -50 +KPX Oacute X -50 +KPX Oacute Y -70 +KPX Oacute Yacute -70 +KPX Oacute Ydieresis -70 +KPX Oacute comma -40 +KPX Oacute period -40 +KPX Ocircumflex A -50 +KPX Ocircumflex Aacute -50 +KPX Ocircumflex Abreve -50 +KPX Ocircumflex Acircumflex -50 +KPX Ocircumflex Adieresis -50 +KPX Ocircumflex Agrave -50 +KPX Ocircumflex Amacron -50 +KPX Ocircumflex Aogonek -50 +KPX Ocircumflex Aring -50 +KPX Ocircumflex Atilde -50 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -50 +KPX Ocircumflex X -50 +KPX Ocircumflex Y -70 +KPX Ocircumflex Yacute -70 +KPX Ocircumflex Ydieresis -70 +KPX Ocircumflex comma -40 +KPX Ocircumflex period -40 +KPX Odieresis A -50 +KPX Odieresis Aacute -50 +KPX Odieresis Abreve -50 +KPX Odieresis Acircumflex -50 +KPX Odieresis Adieresis -50 +KPX Odieresis Agrave -50 +KPX Odieresis Amacron -50 +KPX Odieresis Aogonek -50 +KPX Odieresis Aring -50 +KPX Odieresis Atilde -50 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -50 +KPX Odieresis X -50 +KPX Odieresis Y -70 +KPX Odieresis Yacute -70 +KPX Odieresis Ydieresis -70 +KPX Odieresis comma -40 +KPX Odieresis period -40 +KPX Ograve A -50 +KPX Ograve Aacute -50 +KPX Ograve Abreve -50 +KPX Ograve Acircumflex -50 +KPX Ograve Adieresis -50 +KPX Ograve Agrave -50 +KPX Ograve Amacron -50 +KPX Ograve Aogonek -50 +KPX Ograve Aring -50 +KPX Ograve Atilde -50 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -50 +KPX Ograve X -50 +KPX Ograve Y -70 +KPX Ograve Yacute -70 +KPX Ograve Ydieresis -70 +KPX Ograve comma -40 +KPX Ograve period -40 +KPX Ohungarumlaut A -50 +KPX Ohungarumlaut Aacute -50 +KPX Ohungarumlaut Abreve -50 +KPX Ohungarumlaut Acircumflex -50 +KPX Ohungarumlaut Adieresis -50 +KPX Ohungarumlaut Agrave -50 +KPX Ohungarumlaut Amacron -50 +KPX Ohungarumlaut Aogonek -50 +KPX Ohungarumlaut Aring -50 +KPX Ohungarumlaut Atilde -50 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -50 +KPX Ohungarumlaut X -50 +KPX Ohungarumlaut Y -70 +KPX Ohungarumlaut Yacute -70 +KPX Ohungarumlaut Ydieresis -70 +KPX Ohungarumlaut comma -40 +KPX Ohungarumlaut period -40 +KPX Omacron A -50 +KPX Omacron Aacute -50 +KPX Omacron Abreve -50 +KPX Omacron Acircumflex -50 +KPX Omacron Adieresis -50 +KPX Omacron Agrave -50 +KPX Omacron Amacron -50 +KPX Omacron Aogonek -50 +KPX Omacron Aring -50 +KPX Omacron Atilde -50 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -50 +KPX Omacron X -50 +KPX Omacron Y -70 +KPX Omacron Yacute -70 +KPX Omacron Ydieresis -70 +KPX Omacron comma -40 +KPX Omacron period -40 +KPX Oslash A -50 +KPX Oslash Aacute -50 +KPX Oslash Abreve -50 +KPX Oslash Acircumflex -50 +KPX Oslash Adieresis -50 +KPX Oslash Agrave -50 +KPX Oslash Amacron -50 +KPX Oslash Aogonek -50 +KPX Oslash Aring -50 +KPX Oslash Atilde -50 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -50 +KPX Oslash X -50 +KPX Oslash Y -70 +KPX Oslash Yacute -70 +KPX Oslash Ydieresis -70 +KPX Oslash comma -40 +KPX Oslash period -40 +KPX Otilde A -50 +KPX Otilde Aacute -50 +KPX Otilde Abreve -50 +KPX Otilde Acircumflex -50 +KPX Otilde Adieresis -50 +KPX Otilde Agrave -50 +KPX Otilde Amacron -50 +KPX Otilde Aogonek -50 +KPX Otilde Aring -50 +KPX Otilde Atilde -50 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -50 +KPX Otilde X -50 +KPX Otilde Y -70 +KPX Otilde Yacute -70 +KPX Otilde Ydieresis -70 +KPX Otilde comma -40 +KPX Otilde period -40 +KPX P A -100 +KPX P Aacute -100 +KPX P Abreve -100 +KPX P Acircumflex -100 +KPX P Adieresis -100 +KPX P Agrave -100 +KPX P Amacron -100 +KPX P Aogonek -100 +KPX P Aring -100 +KPX P Atilde -100 +KPX P a -30 +KPX P aacute -30 +KPX P abreve -30 +KPX P acircumflex -30 +KPX P adieresis -30 +KPX P agrave -30 +KPX P amacron -30 +KPX P aogonek -30 +KPX P aring -30 +KPX P atilde -30 +KPX P comma -120 +KPX P e -30 +KPX P eacute -30 +KPX P ecaron -30 +KPX P ecircumflex -30 +KPX P edieresis -30 +KPX P edotaccent -30 +KPX P egrave -30 +KPX P emacron -30 +KPX P eogonek -30 +KPX P o -40 +KPX P oacute -40 +KPX P ocircumflex -40 +KPX P odieresis -40 +KPX P ograve -40 +KPX P ohungarumlaut -40 +KPX P omacron -40 +KPX P oslash -40 +KPX P otilde -40 +KPX P period -120 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX Q comma 20 +KPX Q period 20 +KPX R O -20 +KPX R Oacute -20 +KPX R Ocircumflex -20 +KPX R Odieresis -20 +KPX R Ograve -20 +KPX R Ohungarumlaut -20 +KPX R Omacron -20 +KPX R Oslash -20 +KPX R Otilde -20 +KPX R T -20 +KPX R Tcaron -20 +KPX R Tcommaaccent -20 +KPX R U -20 +KPX R Uacute -20 +KPX R Ucircumflex -20 +KPX R Udieresis -20 +KPX R Ugrave -20 +KPX R Uhungarumlaut -20 +KPX R Umacron -20 +KPX R Uogonek -20 +KPX R Uring -20 +KPX R V -50 +KPX R W -40 +KPX R Y -50 +KPX R Yacute -50 +KPX R Ydieresis -50 +KPX Racute O -20 +KPX Racute Oacute -20 +KPX Racute Ocircumflex -20 +KPX Racute Odieresis -20 +KPX Racute Ograve -20 +KPX Racute Ohungarumlaut -20 +KPX Racute Omacron -20 +KPX Racute Oslash -20 +KPX Racute Otilde -20 +KPX Racute T -20 +KPX Racute Tcaron -20 +KPX Racute Tcommaaccent -20 +KPX Racute U -20 +KPX Racute Uacute -20 +KPX Racute Ucircumflex -20 +KPX Racute Udieresis -20 +KPX Racute Ugrave -20 +KPX Racute Uhungarumlaut -20 +KPX Racute Umacron -20 +KPX Racute Uogonek -20 +KPX Racute Uring -20 +KPX Racute V -50 +KPX Racute W -40 +KPX Racute Y -50 +KPX Racute Yacute -50 +KPX Racute Ydieresis -50 +KPX Rcaron O -20 +KPX Rcaron Oacute -20 +KPX Rcaron Ocircumflex -20 +KPX Rcaron Odieresis -20 +KPX Rcaron Ograve -20 +KPX Rcaron Ohungarumlaut -20 +KPX Rcaron Omacron -20 +KPX Rcaron Oslash -20 +KPX Rcaron Otilde -20 +KPX Rcaron T -20 +KPX Rcaron Tcaron -20 +KPX Rcaron Tcommaaccent -20 +KPX Rcaron U -20 +KPX Rcaron Uacute -20 +KPX Rcaron Ucircumflex -20 +KPX Rcaron Udieresis -20 +KPX Rcaron Ugrave -20 +KPX Rcaron Uhungarumlaut -20 +KPX Rcaron Umacron -20 +KPX Rcaron Uogonek -20 +KPX Rcaron Uring -20 +KPX Rcaron V -50 +KPX Rcaron W -40 +KPX Rcaron Y -50 +KPX Rcaron Yacute -50 +KPX Rcaron Ydieresis -50 +KPX Rcommaaccent O -20 +KPX Rcommaaccent Oacute -20 +KPX Rcommaaccent Ocircumflex -20 +KPX Rcommaaccent Odieresis -20 +KPX Rcommaaccent Ograve -20 +KPX Rcommaaccent Ohungarumlaut -20 +KPX Rcommaaccent Omacron -20 +KPX Rcommaaccent Oslash -20 +KPX Rcommaaccent Otilde -20 +KPX Rcommaaccent T -20 +KPX Rcommaaccent Tcaron -20 +KPX Rcommaaccent Tcommaaccent -20 +KPX Rcommaaccent U -20 +KPX Rcommaaccent Uacute -20 +KPX Rcommaaccent Ucircumflex -20 +KPX Rcommaaccent Udieresis -20 +KPX Rcommaaccent Ugrave -20 +KPX Rcommaaccent Uhungarumlaut -20 +KPX Rcommaaccent Umacron -20 +KPX Rcommaaccent Uogonek -20 +KPX Rcommaaccent Uring -20 +KPX Rcommaaccent V -50 +KPX Rcommaaccent W -40 +KPX Rcommaaccent Y -50 +KPX Rcommaaccent Yacute -50 +KPX Rcommaaccent Ydieresis -50 +KPX T A -90 +KPX T Aacute -90 +KPX T Abreve -90 +KPX T Acircumflex -90 +KPX T Adieresis -90 +KPX T Agrave -90 +KPX T Amacron -90 +KPX T Aogonek -90 +KPX T Aring -90 +KPX T Atilde -90 +KPX T O -40 +KPX T Oacute -40 +KPX T Ocircumflex -40 +KPX T Odieresis -40 +KPX T Ograve -40 +KPX T Ohungarumlaut -40 +KPX T Omacron -40 +KPX T Oslash -40 +KPX T Otilde -40 +KPX T a -80 +KPX T aacute -80 +KPX T abreve -80 +KPX T acircumflex -80 +KPX T adieresis -80 +KPX T agrave -80 +KPX T amacron -80 +KPX T aogonek -80 +KPX T aring -80 +KPX T atilde -80 +KPX T colon -40 +KPX T comma -80 +KPX T e -60 +KPX T eacute -60 +KPX T ecaron -60 +KPX T ecircumflex -60 +KPX T edieresis -60 +KPX T edotaccent -60 +KPX T egrave -60 +KPX T emacron -60 +KPX T eogonek -60 +KPX T hyphen -120 +KPX T o -80 +KPX T oacute -80 +KPX T ocircumflex -80 +KPX T odieresis -80 +KPX T ograve -80 +KPX T ohungarumlaut -80 +KPX T omacron -80 +KPX T oslash -80 +KPX T otilde -80 +KPX T period -80 +KPX T r -80 +KPX T racute -80 +KPX T rcommaaccent -80 +KPX T semicolon -40 +KPX T u -90 +KPX T uacute -90 +KPX T ucircumflex -90 +KPX T udieresis -90 +KPX T ugrave -90 +KPX T uhungarumlaut -90 +KPX T umacron -90 +KPX T uogonek -90 +KPX T uring -90 +KPX T w -60 +KPX T y -60 +KPX T yacute -60 +KPX T ydieresis -60 +KPX Tcaron A -90 +KPX Tcaron Aacute -90 +KPX Tcaron Abreve -90 +KPX Tcaron Acircumflex -90 +KPX Tcaron Adieresis -90 +KPX Tcaron Agrave -90 +KPX Tcaron Amacron -90 +KPX Tcaron Aogonek -90 +KPX Tcaron Aring -90 +KPX Tcaron Atilde -90 +KPX Tcaron O -40 +KPX Tcaron Oacute -40 +KPX Tcaron Ocircumflex -40 +KPX Tcaron Odieresis -40 +KPX Tcaron Ograve -40 +KPX Tcaron Ohungarumlaut -40 +KPX Tcaron Omacron -40 +KPX Tcaron Oslash -40 +KPX Tcaron Otilde -40 +KPX Tcaron a -80 +KPX Tcaron aacute -80 +KPX Tcaron abreve -80 +KPX Tcaron acircumflex -80 +KPX Tcaron adieresis -80 +KPX Tcaron agrave -80 +KPX Tcaron amacron -80 +KPX Tcaron aogonek -80 +KPX Tcaron aring -80 +KPX Tcaron atilde -80 +KPX Tcaron colon -40 +KPX Tcaron comma -80 +KPX Tcaron e -60 +KPX Tcaron eacute -60 +KPX Tcaron ecaron -60 +KPX Tcaron ecircumflex -60 +KPX Tcaron edieresis -60 +KPX Tcaron edotaccent -60 +KPX Tcaron egrave -60 +KPX Tcaron emacron -60 +KPX Tcaron eogonek -60 +KPX Tcaron hyphen -120 +KPX Tcaron o -80 +KPX Tcaron oacute -80 +KPX Tcaron ocircumflex -80 +KPX Tcaron odieresis -80 +KPX Tcaron ograve -80 +KPX Tcaron ohungarumlaut -80 +KPX Tcaron omacron -80 +KPX Tcaron oslash -80 +KPX Tcaron otilde -80 +KPX Tcaron period -80 +KPX Tcaron r -80 +KPX Tcaron racute -80 +KPX Tcaron rcommaaccent -80 +KPX Tcaron semicolon -40 +KPX Tcaron u -90 +KPX Tcaron uacute -90 +KPX Tcaron ucircumflex -90 +KPX Tcaron udieresis -90 +KPX Tcaron ugrave -90 +KPX Tcaron uhungarumlaut -90 +KPX Tcaron umacron -90 +KPX Tcaron uogonek -90 +KPX Tcaron uring -90 +KPX Tcaron w -60 +KPX Tcaron y -60 +KPX Tcaron yacute -60 +KPX Tcaron ydieresis -60 +KPX Tcommaaccent A -90 +KPX Tcommaaccent Aacute -90 +KPX Tcommaaccent Abreve -90 +KPX Tcommaaccent Acircumflex -90 +KPX Tcommaaccent Adieresis -90 +KPX Tcommaaccent Agrave -90 +KPX Tcommaaccent Amacron -90 +KPX Tcommaaccent Aogonek -90 +KPX Tcommaaccent Aring -90 +KPX Tcommaaccent Atilde -90 +KPX Tcommaaccent O -40 +KPX Tcommaaccent Oacute -40 +KPX Tcommaaccent Ocircumflex -40 +KPX Tcommaaccent Odieresis -40 +KPX Tcommaaccent Ograve -40 +KPX Tcommaaccent Ohungarumlaut -40 +KPX Tcommaaccent Omacron -40 +KPX Tcommaaccent Oslash -40 +KPX Tcommaaccent Otilde -40 +KPX Tcommaaccent a -80 +KPX Tcommaaccent aacute -80 +KPX Tcommaaccent abreve -80 +KPX Tcommaaccent acircumflex -80 +KPX Tcommaaccent adieresis -80 +KPX Tcommaaccent agrave -80 +KPX Tcommaaccent amacron -80 +KPX Tcommaaccent aogonek -80 +KPX Tcommaaccent aring -80 +KPX Tcommaaccent atilde -80 +KPX Tcommaaccent colon -40 +KPX Tcommaaccent comma -80 +KPX Tcommaaccent e -60 +KPX Tcommaaccent eacute -60 +KPX Tcommaaccent ecaron -60 +KPX Tcommaaccent ecircumflex -60 +KPX Tcommaaccent edieresis -60 +KPX Tcommaaccent edotaccent -60 +KPX Tcommaaccent egrave -60 +KPX Tcommaaccent emacron -60 +KPX Tcommaaccent eogonek -60 +KPX Tcommaaccent hyphen -120 +KPX Tcommaaccent o -80 +KPX Tcommaaccent oacute -80 +KPX Tcommaaccent ocircumflex -80 +KPX Tcommaaccent odieresis -80 +KPX Tcommaaccent ograve -80 +KPX Tcommaaccent ohungarumlaut -80 +KPX Tcommaaccent omacron -80 +KPX Tcommaaccent oslash -80 +KPX Tcommaaccent otilde -80 +KPX Tcommaaccent period -80 +KPX Tcommaaccent r -80 +KPX Tcommaaccent racute -80 +KPX Tcommaaccent rcommaaccent -80 +KPX Tcommaaccent semicolon -40 +KPX Tcommaaccent u -90 +KPX Tcommaaccent uacute -90 +KPX Tcommaaccent ucircumflex -90 +KPX Tcommaaccent udieresis -90 +KPX Tcommaaccent ugrave -90 +KPX Tcommaaccent uhungarumlaut -90 +KPX Tcommaaccent umacron -90 +KPX Tcommaaccent uogonek -90 +KPX Tcommaaccent uring -90 +KPX Tcommaaccent w -60 +KPX Tcommaaccent y -60 +KPX Tcommaaccent yacute -60 +KPX Tcommaaccent ydieresis -60 +KPX U A -50 +KPX U Aacute -50 +KPX U Abreve -50 +KPX U Acircumflex -50 +KPX U Adieresis -50 +KPX U Agrave -50 +KPX U Amacron -50 +KPX U Aogonek -50 +KPX U Aring -50 +KPX U Atilde -50 +KPX U comma -30 +KPX U period -30 +KPX Uacute A -50 +KPX Uacute Aacute -50 +KPX Uacute Abreve -50 +KPX Uacute Acircumflex -50 +KPX Uacute Adieresis -50 +KPX Uacute Agrave -50 +KPX Uacute Amacron -50 +KPX Uacute Aogonek -50 +KPX Uacute Aring -50 +KPX Uacute Atilde -50 +KPX Uacute comma -30 +KPX Uacute period -30 +KPX Ucircumflex A -50 +KPX Ucircumflex Aacute -50 +KPX Ucircumflex Abreve -50 +KPX Ucircumflex Acircumflex -50 +KPX Ucircumflex Adieresis -50 +KPX Ucircumflex Agrave -50 +KPX Ucircumflex Amacron -50 +KPX Ucircumflex Aogonek -50 +KPX Ucircumflex Aring -50 +KPX Ucircumflex Atilde -50 +KPX Ucircumflex comma -30 +KPX Ucircumflex period -30 +KPX Udieresis A -50 +KPX Udieresis Aacute -50 +KPX Udieresis Abreve -50 +KPX Udieresis Acircumflex -50 +KPX Udieresis Adieresis -50 +KPX Udieresis Agrave -50 +KPX Udieresis Amacron -50 +KPX Udieresis Aogonek -50 +KPX Udieresis Aring -50 +KPX Udieresis Atilde -50 +KPX Udieresis comma -30 +KPX Udieresis period -30 +KPX Ugrave A -50 +KPX Ugrave Aacute -50 +KPX Ugrave Abreve -50 +KPX Ugrave Acircumflex -50 +KPX Ugrave Adieresis -50 +KPX Ugrave Agrave -50 +KPX Ugrave Amacron -50 +KPX Ugrave Aogonek -50 +KPX Ugrave Aring -50 +KPX Ugrave Atilde -50 +KPX Ugrave comma -30 +KPX Ugrave period -30 +KPX Uhungarumlaut A -50 +KPX Uhungarumlaut Aacute -50 +KPX Uhungarumlaut Abreve -50 +KPX Uhungarumlaut Acircumflex -50 +KPX Uhungarumlaut Adieresis -50 +KPX Uhungarumlaut Agrave -50 +KPX Uhungarumlaut Amacron -50 +KPX Uhungarumlaut Aogonek -50 +KPX Uhungarumlaut Aring -50 +KPX Uhungarumlaut Atilde -50 +KPX Uhungarumlaut comma -30 +KPX Uhungarumlaut period -30 +KPX Umacron A -50 +KPX Umacron Aacute -50 +KPX Umacron Abreve -50 +KPX Umacron Acircumflex -50 +KPX Umacron Adieresis -50 +KPX Umacron Agrave -50 +KPX Umacron Amacron -50 +KPX Umacron Aogonek -50 +KPX Umacron Aring -50 +KPX Umacron Atilde -50 +KPX Umacron comma -30 +KPX Umacron period -30 +KPX Uogonek A -50 +KPX Uogonek Aacute -50 +KPX Uogonek Abreve -50 +KPX Uogonek Acircumflex -50 +KPX Uogonek Adieresis -50 +KPX Uogonek Agrave -50 +KPX Uogonek Amacron -50 +KPX Uogonek Aogonek -50 +KPX Uogonek Aring -50 +KPX Uogonek Atilde -50 +KPX Uogonek comma -30 +KPX Uogonek period -30 +KPX Uring A -50 +KPX Uring Aacute -50 +KPX Uring Abreve -50 +KPX Uring Acircumflex -50 +KPX Uring Adieresis -50 +KPX Uring Agrave -50 +KPX Uring Amacron -50 +KPX Uring Aogonek -50 +KPX Uring Aring -50 +KPX Uring Atilde -50 +KPX Uring comma -30 +KPX Uring period -30 +KPX V A -80 +KPX V Aacute -80 +KPX V Abreve -80 +KPX V Acircumflex -80 +KPX V Adieresis -80 +KPX V Agrave -80 +KPX V Amacron -80 +KPX V Aogonek -80 +KPX V Aring -80 +KPX V Atilde -80 +KPX V G -50 +KPX V Gbreve -50 +KPX V Gcommaaccent -50 +KPX V O -50 +KPX V Oacute -50 +KPX V Ocircumflex -50 +KPX V Odieresis -50 +KPX V Ograve -50 +KPX V Ohungarumlaut -50 +KPX V Omacron -50 +KPX V Oslash -50 +KPX V Otilde -50 +KPX V a -60 +KPX V aacute -60 +KPX V abreve -60 +KPX V acircumflex -60 +KPX V adieresis -60 +KPX V agrave -60 +KPX V amacron -60 +KPX V aogonek -60 +KPX V aring -60 +KPX V atilde -60 +KPX V colon -40 +KPX V comma -120 +KPX V e -50 +KPX V eacute -50 +KPX V ecaron -50 +KPX V ecircumflex -50 +KPX V edieresis -50 +KPX V edotaccent -50 +KPX V egrave -50 +KPX V emacron -50 +KPX V eogonek -50 +KPX V hyphen -80 +KPX V o -90 +KPX V oacute -90 +KPX V ocircumflex -90 +KPX V odieresis -90 +KPX V ograve -90 +KPX V ohungarumlaut -90 +KPX V omacron -90 +KPX V oslash -90 +KPX V otilde -90 +KPX V period -120 +KPX V semicolon -40 +KPX V u -60 +KPX V uacute -60 +KPX V ucircumflex -60 +KPX V udieresis -60 +KPX V ugrave -60 +KPX V uhungarumlaut -60 +KPX V umacron -60 +KPX V uogonek -60 +KPX V uring -60 +KPX W A -60 +KPX W Aacute -60 +KPX W Abreve -60 +KPX W Acircumflex -60 +KPX W Adieresis -60 +KPX W Agrave -60 +KPX W Amacron -60 +KPX W Aogonek -60 +KPX W Aring -60 +KPX W Atilde -60 +KPX W O -20 +KPX W Oacute -20 +KPX W Ocircumflex -20 +KPX W Odieresis -20 +KPX W Ograve -20 +KPX W Ohungarumlaut -20 +KPX W Omacron -20 +KPX W Oslash -20 +KPX W Otilde -20 +KPX W a -40 +KPX W aacute -40 +KPX W abreve -40 +KPX W acircumflex -40 +KPX W adieresis -40 +KPX W agrave -40 +KPX W amacron -40 +KPX W aogonek -40 +KPX W aring -40 +KPX W atilde -40 +KPX W colon -10 +KPX W comma -80 +KPX W e -35 +KPX W eacute -35 +KPX W ecaron -35 +KPX W ecircumflex -35 +KPX W edieresis -35 +KPX W edotaccent -35 +KPX W egrave -35 +KPX W emacron -35 +KPX W eogonek -35 +KPX W hyphen -40 +KPX W o -60 +KPX W oacute -60 +KPX W ocircumflex -60 +KPX W odieresis -60 +KPX W ograve -60 +KPX W ohungarumlaut -60 +KPX W omacron -60 +KPX W oslash -60 +KPX W otilde -60 +KPX W period -80 +KPX W semicolon -10 +KPX W u -45 +KPX W uacute -45 +KPX W ucircumflex -45 +KPX W udieresis -45 +KPX W ugrave -45 +KPX W uhungarumlaut -45 +KPX W umacron -45 +KPX W uogonek -45 +KPX W uring -45 +KPX W y -20 +KPX W yacute -20 +KPX W ydieresis -20 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -70 +KPX Y Oacute -70 +KPX Y Ocircumflex -70 +KPX Y Odieresis -70 +KPX Y Ograve -70 +KPX Y Ohungarumlaut -70 +KPX Y Omacron -70 +KPX Y Oslash -70 +KPX Y Otilde -70 +KPX Y a -90 +KPX Y aacute -90 +KPX Y abreve -90 +KPX Y acircumflex -90 +KPX Y adieresis -90 +KPX Y agrave -90 +KPX Y amacron -90 +KPX Y aogonek -90 +KPX Y aring -90 +KPX Y atilde -90 +KPX Y colon -50 +KPX Y comma -100 +KPX Y e -80 +KPX Y eacute -80 +KPX Y ecaron -80 +KPX Y ecircumflex -80 +KPX Y edieresis -80 +KPX Y edotaccent -80 +KPX Y egrave -80 +KPX Y emacron -80 +KPX Y eogonek -80 +KPX Y o -100 +KPX Y oacute -100 +KPX Y ocircumflex -100 +KPX Y odieresis -100 +KPX Y ograve -100 +KPX Y ohungarumlaut -100 +KPX Y omacron -100 +KPX Y oslash -100 +KPX Y otilde -100 +KPX Y period -100 +KPX Y semicolon -50 +KPX Y u -100 +KPX Y uacute -100 +KPX Y ucircumflex -100 +KPX Y udieresis -100 +KPX Y ugrave -100 +KPX Y uhungarumlaut -100 +KPX Y umacron -100 +KPX Y uogonek -100 +KPX Y uring -100 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -70 +KPX Yacute Oacute -70 +KPX Yacute Ocircumflex -70 +KPX Yacute Odieresis -70 +KPX Yacute Ograve -70 +KPX Yacute Ohungarumlaut -70 +KPX Yacute Omacron -70 +KPX Yacute Oslash -70 +KPX Yacute Otilde -70 +KPX Yacute a -90 +KPX Yacute aacute -90 +KPX Yacute abreve -90 +KPX Yacute acircumflex -90 +KPX Yacute adieresis -90 +KPX Yacute agrave -90 +KPX Yacute amacron -90 +KPX Yacute aogonek -90 +KPX Yacute aring -90 +KPX Yacute atilde -90 +KPX Yacute colon -50 +KPX Yacute comma -100 +KPX Yacute e -80 +KPX Yacute eacute -80 +KPX Yacute ecaron -80 +KPX Yacute ecircumflex -80 +KPX Yacute edieresis -80 +KPX Yacute edotaccent -80 +KPX Yacute egrave -80 +KPX Yacute emacron -80 +KPX Yacute eogonek -80 +KPX Yacute o -100 +KPX Yacute oacute -100 +KPX Yacute ocircumflex -100 +KPX Yacute odieresis -100 +KPX Yacute ograve -100 +KPX Yacute ohungarumlaut -100 +KPX Yacute omacron -100 +KPX Yacute oslash -100 +KPX Yacute otilde -100 +KPX Yacute period -100 +KPX Yacute semicolon -50 +KPX Yacute u -100 +KPX Yacute uacute -100 +KPX Yacute ucircumflex -100 +KPX Yacute udieresis -100 +KPX Yacute ugrave -100 +KPX Yacute uhungarumlaut -100 +KPX Yacute umacron -100 +KPX Yacute uogonek -100 +KPX Yacute uring -100 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -70 +KPX Ydieresis Oacute -70 +KPX Ydieresis Ocircumflex -70 +KPX Ydieresis Odieresis -70 +KPX Ydieresis Ograve -70 +KPX Ydieresis Ohungarumlaut -70 +KPX Ydieresis Omacron -70 +KPX Ydieresis Oslash -70 +KPX Ydieresis Otilde -70 +KPX Ydieresis a -90 +KPX Ydieresis aacute -90 +KPX Ydieresis abreve -90 +KPX Ydieresis acircumflex -90 +KPX Ydieresis adieresis -90 +KPX Ydieresis agrave -90 +KPX Ydieresis amacron -90 +KPX Ydieresis aogonek -90 +KPX Ydieresis aring -90 +KPX Ydieresis atilde -90 +KPX Ydieresis colon -50 +KPX Ydieresis comma -100 +KPX Ydieresis e -80 +KPX Ydieresis eacute -80 +KPX Ydieresis ecaron -80 +KPX Ydieresis ecircumflex -80 +KPX Ydieresis edieresis -80 +KPX Ydieresis edotaccent -80 +KPX Ydieresis egrave -80 +KPX Ydieresis emacron -80 +KPX Ydieresis eogonek -80 +KPX Ydieresis o -100 +KPX Ydieresis oacute -100 +KPX Ydieresis ocircumflex -100 +KPX Ydieresis odieresis -100 +KPX Ydieresis ograve -100 +KPX Ydieresis ohungarumlaut -100 +KPX Ydieresis omacron -100 +KPX Ydieresis oslash -100 +KPX Ydieresis otilde -100 +KPX Ydieresis period -100 +KPX Ydieresis semicolon -50 +KPX Ydieresis u -100 +KPX Ydieresis uacute -100 +KPX Ydieresis ucircumflex -100 +KPX Ydieresis udieresis -100 +KPX Ydieresis ugrave -100 +KPX Ydieresis uhungarumlaut -100 +KPX Ydieresis umacron -100 +KPX Ydieresis uogonek -100 +KPX Ydieresis uring -100 +KPX a g -10 +KPX a gbreve -10 +KPX a gcommaaccent -10 +KPX a v -15 +KPX a w -15 +KPX a y -20 +KPX a yacute -20 +KPX a ydieresis -20 +KPX aacute g -10 +KPX aacute gbreve -10 +KPX aacute gcommaaccent -10 +KPX aacute v -15 +KPX aacute w -15 +KPX aacute y -20 +KPX aacute yacute -20 +KPX aacute ydieresis -20 +KPX abreve g -10 +KPX abreve gbreve -10 +KPX abreve gcommaaccent -10 +KPX abreve v -15 +KPX abreve w -15 +KPX abreve y -20 +KPX abreve yacute -20 +KPX abreve ydieresis -20 +KPX acircumflex g -10 +KPX acircumflex gbreve -10 +KPX acircumflex gcommaaccent -10 +KPX acircumflex v -15 +KPX acircumflex w -15 +KPX acircumflex y -20 +KPX acircumflex yacute -20 +KPX acircumflex ydieresis -20 +KPX adieresis g -10 +KPX adieresis gbreve -10 +KPX adieresis gcommaaccent -10 +KPX adieresis v -15 +KPX adieresis w -15 +KPX adieresis y -20 +KPX adieresis yacute -20 +KPX adieresis ydieresis -20 +KPX agrave g -10 +KPX agrave gbreve -10 +KPX agrave gcommaaccent -10 +KPX agrave v -15 +KPX agrave w -15 +KPX agrave y -20 +KPX agrave yacute -20 +KPX agrave ydieresis -20 +KPX amacron g -10 +KPX amacron gbreve -10 +KPX amacron gcommaaccent -10 +KPX amacron v -15 +KPX amacron w -15 +KPX amacron y -20 +KPX amacron yacute -20 +KPX amacron ydieresis -20 +KPX aogonek g -10 +KPX aogonek gbreve -10 +KPX aogonek gcommaaccent -10 +KPX aogonek v -15 +KPX aogonek w -15 +KPX aogonek y -20 +KPX aogonek yacute -20 +KPX aogonek ydieresis -20 +KPX aring g -10 +KPX aring gbreve -10 +KPX aring gcommaaccent -10 +KPX aring v -15 +KPX aring w -15 +KPX aring y -20 +KPX aring yacute -20 +KPX aring ydieresis -20 +KPX atilde g -10 +KPX atilde gbreve -10 +KPX atilde gcommaaccent -10 +KPX atilde v -15 +KPX atilde w -15 +KPX atilde y -20 +KPX atilde yacute -20 +KPX atilde ydieresis -20 +KPX b l -10 +KPX b lacute -10 +KPX b lcommaaccent -10 +KPX b lslash -10 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -20 +KPX b y -20 +KPX b yacute -20 +KPX b ydieresis -20 +KPX c h -10 +KPX c k -20 +KPX c kcommaaccent -20 +KPX c l -20 +KPX c lacute -20 +KPX c lcommaaccent -20 +KPX c lslash -20 +KPX c y -10 +KPX c yacute -10 +KPX c ydieresis -10 +KPX cacute h -10 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX cacute l -20 +KPX cacute lacute -20 +KPX cacute lcommaaccent -20 +KPX cacute lslash -20 +KPX cacute y -10 +KPX cacute yacute -10 +KPX cacute ydieresis -10 +KPX ccaron h -10 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccaron l -20 +KPX ccaron lacute -20 +KPX ccaron lcommaaccent -20 +KPX ccaron lslash -20 +KPX ccaron y -10 +KPX ccaron yacute -10 +KPX ccaron ydieresis -10 +KPX ccedilla h -10 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX ccedilla l -20 +KPX ccedilla lacute -20 +KPX ccedilla lcommaaccent -20 +KPX ccedilla lslash -20 +KPX ccedilla y -10 +KPX ccedilla yacute -10 +KPX ccedilla ydieresis -10 +KPX colon space -40 +KPX comma quotedblright -120 +KPX comma quoteright -120 +KPX comma space -40 +KPX d d -10 +KPX d dcroat -10 +KPX d v -15 +KPX d w -15 +KPX d y -15 +KPX d yacute -15 +KPX d ydieresis -15 +KPX dcroat d -10 +KPX dcroat dcroat -10 +KPX dcroat v -15 +KPX dcroat w -15 +KPX dcroat y -15 +KPX dcroat yacute -15 +KPX dcroat ydieresis -15 +KPX e comma 10 +KPX e period 20 +KPX e v -15 +KPX e w -15 +KPX e x -15 +KPX e y -15 +KPX e yacute -15 +KPX e ydieresis -15 +KPX eacute comma 10 +KPX eacute period 20 +KPX eacute v -15 +KPX eacute w -15 +KPX eacute x -15 +KPX eacute y -15 +KPX eacute yacute -15 +KPX eacute ydieresis -15 +KPX ecaron comma 10 +KPX ecaron period 20 +KPX ecaron v -15 +KPX ecaron w -15 +KPX ecaron x -15 +KPX ecaron y -15 +KPX ecaron yacute -15 +KPX ecaron ydieresis -15 +KPX ecircumflex comma 10 +KPX ecircumflex period 20 +KPX ecircumflex v -15 +KPX ecircumflex w -15 +KPX ecircumflex x -15 +KPX ecircumflex y -15 +KPX ecircumflex yacute -15 +KPX ecircumflex ydieresis -15 +KPX edieresis comma 10 +KPX edieresis period 20 +KPX edieresis v -15 +KPX edieresis w -15 +KPX edieresis x -15 +KPX edieresis y -15 +KPX edieresis yacute -15 +KPX edieresis ydieresis -15 +KPX edotaccent comma 10 +KPX edotaccent period 20 +KPX edotaccent v -15 +KPX edotaccent w -15 +KPX edotaccent x -15 +KPX edotaccent y -15 +KPX edotaccent yacute -15 +KPX edotaccent ydieresis -15 +KPX egrave comma 10 +KPX egrave period 20 +KPX egrave v -15 +KPX egrave w -15 +KPX egrave x -15 +KPX egrave y -15 +KPX egrave yacute -15 +KPX egrave ydieresis -15 +KPX emacron comma 10 +KPX emacron period 20 +KPX emacron v -15 +KPX emacron w -15 +KPX emacron x -15 +KPX emacron y -15 +KPX emacron yacute -15 +KPX emacron ydieresis -15 +KPX eogonek comma 10 +KPX eogonek period 20 +KPX eogonek v -15 +KPX eogonek w -15 +KPX eogonek x -15 +KPX eogonek y -15 +KPX eogonek yacute -15 +KPX eogonek ydieresis -15 +KPX f comma -10 +KPX f e -10 +KPX f eacute -10 +KPX f ecaron -10 +KPX f ecircumflex -10 +KPX f edieresis -10 +KPX f edotaccent -10 +KPX f egrave -10 +KPX f emacron -10 +KPX f eogonek -10 +KPX f o -20 +KPX f oacute -20 +KPX f ocircumflex -20 +KPX f odieresis -20 +KPX f ograve -20 +KPX f ohungarumlaut -20 +KPX f omacron -20 +KPX f oslash -20 +KPX f otilde -20 +KPX f period -10 +KPX f quotedblright 30 +KPX f quoteright 30 +KPX g e 10 +KPX g eacute 10 +KPX g ecaron 10 +KPX g ecircumflex 10 +KPX g edieresis 10 +KPX g edotaccent 10 +KPX g egrave 10 +KPX g emacron 10 +KPX g eogonek 10 +KPX g g -10 +KPX g gbreve -10 +KPX g gcommaaccent -10 +KPX gbreve e 10 +KPX gbreve eacute 10 +KPX gbreve ecaron 10 +KPX gbreve ecircumflex 10 +KPX gbreve edieresis 10 +KPX gbreve edotaccent 10 +KPX gbreve egrave 10 +KPX gbreve emacron 10 +KPX gbreve eogonek 10 +KPX gbreve g -10 +KPX gbreve gbreve -10 +KPX gbreve gcommaaccent -10 +KPX gcommaaccent e 10 +KPX gcommaaccent eacute 10 +KPX gcommaaccent ecaron 10 +KPX gcommaaccent ecircumflex 10 +KPX gcommaaccent edieresis 10 +KPX gcommaaccent edotaccent 10 +KPX gcommaaccent egrave 10 +KPX gcommaaccent emacron 10 +KPX gcommaaccent eogonek 10 +KPX gcommaaccent g -10 +KPX gcommaaccent gbreve -10 +KPX gcommaaccent gcommaaccent -10 +KPX h y -20 +KPX h yacute -20 +KPX h ydieresis -20 +KPX k o -15 +KPX k oacute -15 +KPX k ocircumflex -15 +KPX k odieresis -15 +KPX k ograve -15 +KPX k ohungarumlaut -15 +KPX k omacron -15 +KPX k oslash -15 +KPX k otilde -15 +KPX kcommaaccent o -15 +KPX kcommaaccent oacute -15 +KPX kcommaaccent ocircumflex -15 +KPX kcommaaccent odieresis -15 +KPX kcommaaccent ograve -15 +KPX kcommaaccent ohungarumlaut -15 +KPX kcommaaccent omacron -15 +KPX kcommaaccent oslash -15 +KPX kcommaaccent otilde -15 +KPX l w -15 +KPX l y -15 +KPX l yacute -15 +KPX l ydieresis -15 +KPX lacute w -15 +KPX lacute y -15 +KPX lacute yacute -15 +KPX lacute ydieresis -15 +KPX lcommaaccent w -15 +KPX lcommaaccent y -15 +KPX lcommaaccent yacute -15 +KPX lcommaaccent ydieresis -15 +KPX lslash w -15 +KPX lslash y -15 +KPX lslash yacute -15 +KPX lslash ydieresis -15 +KPX m u -20 +KPX m uacute -20 +KPX m ucircumflex -20 +KPX m udieresis -20 +KPX m ugrave -20 +KPX m uhungarumlaut -20 +KPX m umacron -20 +KPX m uogonek -20 +KPX m uring -20 +KPX m y -30 +KPX m yacute -30 +KPX m ydieresis -30 +KPX n u -10 +KPX n uacute -10 +KPX n ucircumflex -10 +KPX n udieresis -10 +KPX n ugrave -10 +KPX n uhungarumlaut -10 +KPX n umacron -10 +KPX n uogonek -10 +KPX n uring -10 +KPX n v -40 +KPX n y -20 +KPX n yacute -20 +KPX n ydieresis -20 +KPX nacute u -10 +KPX nacute uacute -10 +KPX nacute ucircumflex -10 +KPX nacute udieresis -10 +KPX nacute ugrave -10 +KPX nacute uhungarumlaut -10 +KPX nacute umacron -10 +KPX nacute uogonek -10 +KPX nacute uring -10 +KPX nacute v -40 +KPX nacute y -20 +KPX nacute yacute -20 +KPX nacute ydieresis -20 +KPX ncaron u -10 +KPX ncaron uacute -10 +KPX ncaron ucircumflex -10 +KPX ncaron udieresis -10 +KPX ncaron ugrave -10 +KPX ncaron uhungarumlaut -10 +KPX ncaron umacron -10 +KPX ncaron uogonek -10 +KPX ncaron uring -10 +KPX ncaron v -40 +KPX ncaron y -20 +KPX ncaron yacute -20 +KPX ncaron ydieresis -20 +KPX ncommaaccent u -10 +KPX ncommaaccent uacute -10 +KPX ncommaaccent ucircumflex -10 +KPX ncommaaccent udieresis -10 +KPX ncommaaccent ugrave -10 +KPX ncommaaccent uhungarumlaut -10 +KPX ncommaaccent umacron -10 +KPX ncommaaccent uogonek -10 +KPX ncommaaccent uring -10 +KPX ncommaaccent v -40 +KPX ncommaaccent y -20 +KPX ncommaaccent yacute -20 +KPX ncommaaccent ydieresis -20 +KPX ntilde u -10 +KPX ntilde uacute -10 +KPX ntilde ucircumflex -10 +KPX ntilde udieresis -10 +KPX ntilde ugrave -10 +KPX ntilde uhungarumlaut -10 +KPX ntilde umacron -10 +KPX ntilde uogonek -10 +KPX ntilde uring -10 +KPX ntilde v -40 +KPX ntilde y -20 +KPX ntilde yacute -20 +KPX ntilde ydieresis -20 +KPX o v -20 +KPX o w -15 +KPX o x -30 +KPX o y -20 +KPX o yacute -20 +KPX o ydieresis -20 +KPX oacute v -20 +KPX oacute w -15 +KPX oacute x -30 +KPX oacute y -20 +KPX oacute yacute -20 +KPX oacute ydieresis -20 +KPX ocircumflex v -20 +KPX ocircumflex w -15 +KPX ocircumflex x -30 +KPX ocircumflex y -20 +KPX ocircumflex yacute -20 +KPX ocircumflex ydieresis -20 +KPX odieresis v -20 +KPX odieresis w -15 +KPX odieresis x -30 +KPX odieresis y -20 +KPX odieresis yacute -20 +KPX odieresis ydieresis -20 +KPX ograve v -20 +KPX ograve w -15 +KPX ograve x -30 +KPX ograve y -20 +KPX ograve yacute -20 +KPX ograve ydieresis -20 +KPX ohungarumlaut v -20 +KPX ohungarumlaut w -15 +KPX ohungarumlaut x -30 +KPX ohungarumlaut y -20 +KPX ohungarumlaut yacute -20 +KPX ohungarumlaut ydieresis -20 +KPX omacron v -20 +KPX omacron w -15 +KPX omacron x -30 +KPX omacron y -20 +KPX omacron yacute -20 +KPX omacron ydieresis -20 +KPX oslash v -20 +KPX oslash w -15 +KPX oslash x -30 +KPX oslash y -20 +KPX oslash yacute -20 +KPX oslash ydieresis -20 +KPX otilde v -20 +KPX otilde w -15 +KPX otilde x -30 +KPX otilde y -20 +KPX otilde yacute -20 +KPX otilde ydieresis -20 +KPX p y -15 +KPX p yacute -15 +KPX p ydieresis -15 +KPX period quotedblright -120 +KPX period quoteright -120 +KPX period space -40 +KPX quotedblright space -80 +KPX quoteleft quoteleft -46 +KPX quoteright d -80 +KPX quoteright dcroat -80 +KPX quoteright l -20 +KPX quoteright lacute -20 +KPX quoteright lcommaaccent -20 +KPX quoteright lslash -20 +KPX quoteright quoteright -46 +KPX quoteright r -40 +KPX quoteright racute -40 +KPX quoteright rcaron -40 +KPX quoteright rcommaaccent -40 +KPX quoteright s -60 +KPX quoteright sacute -60 +KPX quoteright scaron -60 +KPX quoteright scedilla -60 +KPX quoteright scommaaccent -60 +KPX quoteright space -80 +KPX quoteright v -20 +KPX r c -20 +KPX r cacute -20 +KPX r ccaron -20 +KPX r ccedilla -20 +KPX r comma -60 +KPX r d -20 +KPX r dcroat -20 +KPX r g -15 +KPX r gbreve -15 +KPX r gcommaaccent -15 +KPX r hyphen -20 +KPX r o -20 +KPX r oacute -20 +KPX r ocircumflex -20 +KPX r odieresis -20 +KPX r ograve -20 +KPX r ohungarumlaut -20 +KPX r omacron -20 +KPX r oslash -20 +KPX r otilde -20 +KPX r period -60 +KPX r q -20 +KPX r s -15 +KPX r sacute -15 +KPX r scaron -15 +KPX r scedilla -15 +KPX r scommaaccent -15 +KPX r t 20 +KPX r tcommaaccent 20 +KPX r v 10 +KPX r y 10 +KPX r yacute 10 +KPX r ydieresis 10 +KPX racute c -20 +KPX racute cacute -20 +KPX racute ccaron -20 +KPX racute ccedilla -20 +KPX racute comma -60 +KPX racute d -20 +KPX racute dcroat -20 +KPX racute g -15 +KPX racute gbreve -15 +KPX racute gcommaaccent -15 +KPX racute hyphen -20 +KPX racute o -20 +KPX racute oacute -20 +KPX racute ocircumflex -20 +KPX racute odieresis -20 +KPX racute ograve -20 +KPX racute ohungarumlaut -20 +KPX racute omacron -20 +KPX racute oslash -20 +KPX racute otilde -20 +KPX racute period -60 +KPX racute q -20 +KPX racute s -15 +KPX racute sacute -15 +KPX racute scaron -15 +KPX racute scedilla -15 +KPX racute scommaaccent -15 +KPX racute t 20 +KPX racute tcommaaccent 20 +KPX racute v 10 +KPX racute y 10 +KPX racute yacute 10 +KPX racute ydieresis 10 +KPX rcaron c -20 +KPX rcaron cacute -20 +KPX rcaron ccaron -20 +KPX rcaron ccedilla -20 +KPX rcaron comma -60 +KPX rcaron d -20 +KPX rcaron dcroat -20 +KPX rcaron g -15 +KPX rcaron gbreve -15 +KPX rcaron gcommaaccent -15 +KPX rcaron hyphen -20 +KPX rcaron o -20 +KPX rcaron oacute -20 +KPX rcaron ocircumflex -20 +KPX rcaron odieresis -20 +KPX rcaron ograve -20 +KPX rcaron ohungarumlaut -20 +KPX rcaron omacron -20 +KPX rcaron oslash -20 +KPX rcaron otilde -20 +KPX rcaron period -60 +KPX rcaron q -20 +KPX rcaron s -15 +KPX rcaron sacute -15 +KPX rcaron scaron -15 +KPX rcaron scedilla -15 +KPX rcaron scommaaccent -15 +KPX rcaron t 20 +KPX rcaron tcommaaccent 20 +KPX rcaron v 10 +KPX rcaron y 10 +KPX rcaron yacute 10 +KPX rcaron ydieresis 10 +KPX rcommaaccent c -20 +KPX rcommaaccent cacute -20 +KPX rcommaaccent ccaron -20 +KPX rcommaaccent ccedilla -20 +KPX rcommaaccent comma -60 +KPX rcommaaccent d -20 +KPX rcommaaccent dcroat -20 +KPX rcommaaccent g -15 +KPX rcommaaccent gbreve -15 +KPX rcommaaccent gcommaaccent -15 +KPX rcommaaccent hyphen -20 +KPX rcommaaccent o -20 +KPX rcommaaccent oacute -20 +KPX rcommaaccent ocircumflex -20 +KPX rcommaaccent odieresis -20 +KPX rcommaaccent ograve -20 +KPX rcommaaccent ohungarumlaut -20 +KPX rcommaaccent omacron -20 +KPX rcommaaccent oslash -20 +KPX rcommaaccent otilde -20 +KPX rcommaaccent period -60 +KPX rcommaaccent q -20 +KPX rcommaaccent s -15 +KPX rcommaaccent sacute -15 +KPX rcommaaccent scaron -15 +KPX rcommaaccent scedilla -15 +KPX rcommaaccent scommaaccent -15 +KPX rcommaaccent t 20 +KPX rcommaaccent tcommaaccent 20 +KPX rcommaaccent v 10 +KPX rcommaaccent y 10 +KPX rcommaaccent yacute 10 +KPX rcommaaccent ydieresis 10 +KPX s w -15 +KPX sacute w -15 +KPX scaron w -15 +KPX scedilla w -15 +KPX scommaaccent w -15 +KPX semicolon space -40 +KPX space T -100 +KPX space Tcaron -100 +KPX space Tcommaaccent -100 +KPX space V -80 +KPX space W -80 +KPX space Y -120 +KPX space Yacute -120 +KPX space Ydieresis -120 +KPX space quotedblleft -80 +KPX space quoteleft -60 +KPX v a -20 +KPX v aacute -20 +KPX v abreve -20 +KPX v acircumflex -20 +KPX v adieresis -20 +KPX v agrave -20 +KPX v amacron -20 +KPX v aogonek -20 +KPX v aring -20 +KPX v atilde -20 +KPX v comma -80 +KPX v o -30 +KPX v oacute -30 +KPX v ocircumflex -30 +KPX v odieresis -30 +KPX v ograve -30 +KPX v ohungarumlaut -30 +KPX v omacron -30 +KPX v oslash -30 +KPX v otilde -30 +KPX v period -80 +KPX w comma -40 +KPX w o -20 +KPX w oacute -20 +KPX w ocircumflex -20 +KPX w odieresis -20 +KPX w ograve -20 +KPX w ohungarumlaut -20 +KPX w omacron -20 +KPX w oslash -20 +KPX w otilde -20 +KPX w period -40 +KPX x e -10 +KPX x eacute -10 +KPX x ecaron -10 +KPX x ecircumflex -10 +KPX x edieresis -10 +KPX x edotaccent -10 +KPX x egrave -10 +KPX x emacron -10 +KPX x eogonek -10 +KPX y a -30 +KPX y aacute -30 +KPX y abreve -30 +KPX y acircumflex -30 +KPX y adieresis -30 +KPX y agrave -30 +KPX y amacron -30 +KPX y aogonek -30 +KPX y aring -30 +KPX y atilde -30 +KPX y comma -80 +KPX y e -10 +KPX y eacute -10 +KPX y ecaron -10 +KPX y ecircumflex -10 +KPX y edieresis -10 +KPX y edotaccent -10 +KPX y egrave -10 +KPX y emacron -10 +KPX y eogonek -10 +KPX y o -25 +KPX y oacute -25 +KPX y ocircumflex -25 +KPX y odieresis -25 +KPX y ograve -25 +KPX y ohungarumlaut -25 +KPX y omacron -25 +KPX y oslash -25 +KPX y otilde -25 +KPX y period -80 +KPX yacute a -30 +KPX yacute aacute -30 +KPX yacute abreve -30 +KPX yacute acircumflex -30 +KPX yacute adieresis -30 +KPX yacute agrave -30 +KPX yacute amacron -30 +KPX yacute aogonek -30 +KPX yacute aring -30 +KPX yacute atilde -30 +KPX yacute comma -80 +KPX yacute e -10 +KPX yacute eacute -10 +KPX yacute ecaron -10 +KPX yacute ecircumflex -10 +KPX yacute edieresis -10 +KPX yacute edotaccent -10 +KPX yacute egrave -10 +KPX yacute emacron -10 +KPX yacute eogonek -10 +KPX yacute o -25 +KPX yacute oacute -25 +KPX yacute ocircumflex -25 +KPX yacute odieresis -25 +KPX yacute ograve -25 +KPX yacute ohungarumlaut -25 +KPX yacute omacron -25 +KPX yacute oslash -25 +KPX yacute otilde -25 +KPX yacute period -80 +KPX ydieresis a -30 +KPX ydieresis aacute -30 +KPX ydieresis abreve -30 +KPX ydieresis acircumflex -30 +KPX ydieresis adieresis -30 +KPX ydieresis agrave -30 +KPX ydieresis amacron -30 +KPX ydieresis aogonek -30 +KPX ydieresis aring -30 +KPX ydieresis atilde -30 +KPX ydieresis comma -80 +KPX ydieresis e -10 +KPX ydieresis eacute -10 +KPX ydieresis ecaron -10 +KPX ydieresis ecircumflex -10 +KPX ydieresis edieresis -10 +KPX ydieresis edotaccent -10 +KPX ydieresis egrave -10 +KPX ydieresis emacron -10 +KPX ydieresis eogonek -10 +KPX ydieresis o -25 +KPX ydieresis oacute -25 +KPX ydieresis ocircumflex -25 +KPX ydieresis odieresis -25 +KPX ydieresis ograve -25 +KPX ydieresis ohungarumlaut -25 +KPX ydieresis omacron -25 +KPX ydieresis oslash -25 +KPX ydieresis otilde -25 +KPX ydieresis period -80 +KPX z e 10 +KPX z eacute 10 +KPX z ecaron 10 +KPX z ecircumflex 10 +KPX z edieresis 10 +KPX z edotaccent 10 +KPX z egrave 10 +KPX z emacron 10 +KPX z eogonek 10 +KPX zacute e 10 +KPX zacute eacute 10 +KPX zacute ecaron 10 +KPX zacute ecircumflex 10 +KPX zacute edieresis 10 +KPX zacute edotaccent 10 +KPX zacute egrave 10 +KPX zacute emacron 10 +KPX zacute eogonek 10 +KPX zcaron e 10 +KPX zcaron eacute 10 +KPX zcaron ecaron 10 +KPX zcaron ecircumflex 10 +KPX zcaron edieresis 10 +KPX zcaron edotaccent 10 +KPX zcaron egrave 10 +KPX zcaron emacron 10 +KPX zcaron eogonek 10 +KPX zdotaccent e 10 +KPX zdotaccent eacute 10 +KPX zdotaccent ecaron 10 +KPX zdotaccent ecircumflex 10 +KPX zdotaccent edieresis 10 +KPX zdotaccent edotaccent 10 +KPX zdotaccent egrave 10 +KPX zdotaccent emacron 10 +KPX zdotaccent eogonek 10 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/Helvetica-BoldOblique.afm b/dompdf/vendor/dompdf/dompdf/lib/fonts/Helvetica-BoldOblique.afm new file mode 100644 index 0000000..e98a0bb --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/Helvetica-BoldOblique.afm @@ -0,0 +1,2829 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:45:12 1997 +Comment UniqueID 43053 +Comment VMusage 14482 68586 +FontName Helvetica-BoldOblique +FullName Helvetica Bold Oblique +FamilyName Helvetica +Weight Bold +ItalicAngle -12 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -174 -228 1114 962 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 718 +XHeight 532 +Ascender 718 +Descender -207 +StdHW 118 +StdVW 140 +StartCharMetrics 317 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 160 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 94 0 397 718 ; +C 34 ; WX 474 ; N quotedbl ; B 193 447 529 718 ; +C 35 ; WX 556 ; N numbersign ; B 60 0 644 698 ; +C 36 ; WX 556 ; N dollar ; B 67 -115 622 775 ; +C 37 ; WX 889 ; N percent ; B 136 -19 901 710 ; +C 38 ; WX 722 ; N ampersand ; B 89 -19 732 718 ; +C 146 ; WX 278 ; N quoteright ; B 167 445 362 718 ; +C 40 ; WX 333 ; N parenleft ; B 76 -208 470 734 ; +C 41 ; WX 333 ; N parenright ; B -25 -208 369 734 ; +C 42 ; WX 389 ; N asterisk ; B 146 387 481 718 ; +C 43 ; WX 584 ; N plus ; B 82 0 610 506 ; +C 44 ; WX 278 ; N comma ; B 28 -168 245 146 ; +C 45 ; WX 333 ; N hyphen ; B 73 215 379 345 ; +C 173 ; WX 333 ; N hyphen ; B 44 232 289 322 ; +C 46 ; WX 278 ; N period ; B 64 0 245 146 ; +C 47 ; WX 278 ; N slash ; B -37 -19 468 737 ; +C 48 ; WX 556 ; N zero ; B 86 -19 617 710 ; +C 49 ; WX 556 ; N one ; B 173 0 529 710 ; +C 50 ; WX 556 ; N two ; B 26 0 619 710 ; +C 51 ; WX 556 ; N three ; B 65 -19 608 710 ; +C 52 ; WX 556 ; N four ; B 60 0 598 710 ; +C 53 ; WX 556 ; N five ; B 64 -19 636 698 ; +C 54 ; WX 556 ; N six ; B 85 -19 619 710 ; +C 55 ; WX 556 ; N seven ; B 125 0 676 698 ; +C 56 ; WX 556 ; N eight ; B 69 -19 616 710 ; +C 57 ; WX 556 ; N nine ; B 78 -19 615 710 ; +C 58 ; WX 333 ; N colon ; B 92 0 351 512 ; +C 59 ; WX 333 ; N semicolon ; B 56 -168 351 512 ; +C 60 ; WX 584 ; N less ; B 82 -8 655 514 ; +C 61 ; WX 584 ; N equal ; B 58 87 633 419 ; +C 62 ; WX 584 ; N greater ; B 36 -8 609 514 ; +C 63 ; WX 611 ; N question ; B 165 0 671 727 ; +C 64 ; WX 975 ; N at ; B 186 -19 954 737 ; +C 65 ; WX 722 ; N A ; B 20 0 702 718 ; +C 66 ; WX 722 ; N B ; B 76 0 764 718 ; +C 67 ; WX 722 ; N C ; B 107 -19 789 737 ; +C 68 ; WX 722 ; N D ; B 76 0 777 718 ; +C 69 ; WX 667 ; N E ; B 76 0 757 718 ; +C 70 ; WX 611 ; N F ; B 76 0 740 718 ; +C 71 ; WX 778 ; N G ; B 108 -19 817 737 ; +C 72 ; WX 722 ; N H ; B 71 0 804 718 ; +C 73 ; WX 278 ; N I ; B 64 0 367 718 ; +C 74 ; WX 556 ; N J ; B 60 -18 637 718 ; +C 75 ; WX 722 ; N K ; B 87 0 858 718 ; +C 76 ; WX 611 ; N L ; B 76 0 611 718 ; +C 77 ; WX 833 ; N M ; B 69 0 918 718 ; +C 78 ; WX 722 ; N N ; B 69 0 807 718 ; +C 79 ; WX 778 ; N O ; B 107 -19 823 737 ; +C 80 ; WX 667 ; N P ; B 76 0 738 718 ; +C 81 ; WX 778 ; N Q ; B 107 -52 823 737 ; +C 82 ; WX 722 ; N R ; B 76 0 778 718 ; +C 83 ; WX 667 ; N S ; B 81 -19 718 737 ; +C 84 ; WX 611 ; N T ; B 140 0 751 718 ; +C 85 ; WX 722 ; N U ; B 116 -19 804 718 ; +C 86 ; WX 667 ; N V ; B 172 0 801 718 ; +C 87 ; WX 944 ; N W ; B 169 0 1082 718 ; +C 88 ; WX 667 ; N X ; B 14 0 791 718 ; +C 89 ; WX 667 ; N Y ; B 168 0 806 718 ; +C 90 ; WX 611 ; N Z ; B 25 0 737 718 ; +C 91 ; WX 333 ; N bracketleft ; B 21 -196 462 722 ; +C 92 ; WX 278 ; N backslash ; B 124 -19 307 737 ; +C 93 ; WX 333 ; N bracketright ; B -18 -196 423 722 ; +C 94 ; WX 584 ; N asciicircum ; B 131 323 591 698 ; +C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ; +C 145 ; WX 278 ; N quoteleft ; B 165 454 361 727 ; +C 97 ; WX 556 ; N a ; B 55 -14 583 546 ; +C 98 ; WX 611 ; N b ; B 61 -14 645 718 ; +C 99 ; WX 556 ; N c ; B 79 -14 599 546 ; +C 100 ; WX 611 ; N d ; B 82 -14 704 718 ; +C 101 ; WX 556 ; N e ; B 70 -14 593 546 ; +C 102 ; WX 333 ; N f ; B 87 0 469 727 ; L i fi ; L l fl ; +C 103 ; WX 611 ; N g ; B 38 -217 666 546 ; +C 104 ; WX 611 ; N h ; B 65 0 629 718 ; +C 105 ; WX 278 ; N i ; B 69 0 363 725 ; +C 106 ; WX 278 ; N j ; B -42 -214 363 725 ; +C 107 ; WX 556 ; N k ; B 69 0 670 718 ; +C 108 ; WX 278 ; N l ; B 69 0 362 718 ; +C 109 ; WX 889 ; N m ; B 64 0 909 546 ; +C 110 ; WX 611 ; N n ; B 65 0 629 546 ; +C 111 ; WX 611 ; N o ; B 82 -14 643 546 ; +C 112 ; WX 611 ; N p ; B 18 -207 645 546 ; +C 113 ; WX 611 ; N q ; B 80 -207 665 546 ; +C 114 ; WX 389 ; N r ; B 64 0 489 546 ; +C 115 ; WX 556 ; N s ; B 63 -14 584 546 ; +C 116 ; WX 333 ; N t ; B 100 -6 422 676 ; +C 117 ; WX 611 ; N u ; B 98 -14 658 532 ; +C 118 ; WX 556 ; N v ; B 126 0 656 532 ; +C 119 ; WX 778 ; N w ; B 123 0 882 532 ; +C 120 ; WX 556 ; N x ; B 15 0 648 532 ; +C 121 ; WX 556 ; N y ; B 42 -214 652 532 ; +C 122 ; WX 500 ; N z ; B 20 0 583 532 ; +C 123 ; WX 389 ; N braceleft ; B 94 -196 518 722 ; +C 124 ; WX 280 ; N bar ; B 36 -225 361 775 ; +C 125 ; WX 389 ; N braceright ; B -18 -196 407 722 ; +C 126 ; WX 584 ; N asciitilde ; B 115 163 577 343 ; +C 161 ; WX 333 ; N exclamdown ; B 50 -186 353 532 ; +C 162 ; WX 556 ; N cent ; B 79 -118 599 628 ; +C 163 ; WX 556 ; N sterling ; B 50 -16 635 718 ; +C -1 ; WX 167 ; N fraction ; B -174 -19 487 710 ; +C 165 ; WX 556 ; N yen ; B 60 0 713 698 ; +C 131 ; WX 556 ; N florin ; B -50 -210 669 737 ; +C 167 ; WX 556 ; N section ; B 61 -184 598 727 ; +C 164 ; WX 556 ; N currency ; B 27 76 680 636 ; +C 39 ; WX 238 ; N quotesingle ; B 165 447 321 718 ; +C 147 ; WX 500 ; N quotedblleft ; B 160 454 588 727 ; +C 171 ; WX 556 ; N guillemotleft ; B 135 76 571 484 ; +C 139 ; WX 333 ; N guilsinglleft ; B 130 76 353 484 ; +C 155 ; WX 333 ; N guilsinglright ; B 99 76 322 484 ; +C -1 ; WX 611 ; N fi ; B 87 0 696 727 ; +C -1 ; WX 611 ; N fl ; B 87 0 695 727 ; +C 150 ; WX 556 ; N endash ; B 48 227 627 333 ; +C 134 ; WX 556 ; N dagger ; B 118 -171 626 718 ; +C 135 ; WX 556 ; N daggerdbl ; B 46 -171 628 718 ; +C 183 ; WX 278 ; N periodcentered ; B 110 172 276 334 ; +C 182 ; WX 556 ; N paragraph ; B 98 -191 688 700 ; +C 149 ; WX 350 ; N bullet ; B 83 194 420 524 ; +C 130 ; WX 278 ; N quotesinglbase ; B 41 -146 236 127 ; +C 132 ; WX 500 ; N quotedblbase ; B 36 -146 463 127 ; +C 148 ; WX 500 ; N quotedblright ; B 162 445 589 718 ; +C 187 ; WX 556 ; N guillemotright ; B 104 76 540 484 ; +C 133 ; WX 1000 ; N ellipsis ; B 92 0 939 146 ; +C 137 ; WX 1000 ; N perthousand ; B 76 -19 1038 710 ; +C 191 ; WX 611 ; N questiondown ; B 53 -195 559 532 ; +C 96 ; WX 333 ; N grave ; B 136 604 353 750 ; +C 180 ; WX 333 ; N acute ; B 236 604 515 750 ; +C 136 ; WX 333 ; N circumflex ; B 118 604 471 750 ; +C 152 ; WX 333 ; N tilde ; B 113 610 507 737 ; +C 175 ; WX 333 ; N macron ; B 122 604 483 678 ; +C -1 ; WX 333 ; N breve ; B 156 604 494 750 ; +C -1 ; WX 333 ; N dotaccent ; B 235 614 385 729 ; +C 168 ; WX 333 ; N dieresis ; B 137 614 482 729 ; +C -1 ; WX 333 ; N ring ; B 200 568 420 776 ; +C 184 ; WX 333 ; N cedilla ; B -37 -228 220 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B 137 604 645 750 ; +C -1 ; WX 333 ; N ogonek ; B 41 -228 264 0 ; +C -1 ; WX 333 ; N caron ; B 149 604 502 750 ; +C 151 ; WX 1000 ; N emdash ; B 48 227 1071 333 ; +C 198 ; WX 1000 ; N AE ; B 5 0 1100 718 ; +C 170 ; WX 370 ; N ordfeminine ; B 125 401 465 737 ; +C -1 ; WX 611 ; N Lslash ; B 34 0 611 718 ; +C 216 ; WX 778 ; N Oslash ; B 35 -27 894 745 ; +C 140 ; WX 1000 ; N OE ; B 99 -19 1114 737 ; +C 186 ; WX 365 ; N ordmasculine ; B 123 401 485 737 ; +C 230 ; WX 889 ; N ae ; B 56 -14 923 546 ; +C -1 ; WX 278 ; N dotlessi ; B 69 0 322 532 ; +C -1 ; WX 278 ; N lslash ; B 40 0 407 718 ; +C 248 ; WX 611 ; N oslash ; B 22 -29 701 560 ; +C 156 ; WX 944 ; N oe ; B 82 -14 977 546 ; +C 223 ; WX 611 ; N germandbls ; B 69 -14 657 731 ; +C 207 ; WX 278 ; N Idieresis ; B 64 0 494 915 ; +C 233 ; WX 556 ; N eacute ; B 70 -14 627 750 ; +C -1 ; WX 556 ; N abreve ; B 55 -14 606 750 ; +C -1 ; WX 611 ; N uhungarumlaut ; B 98 -14 784 750 ; +C -1 ; WX 556 ; N ecaron ; B 70 -14 614 750 ; +C 159 ; WX 667 ; N Ydieresis ; B 168 0 806 915 ; +C 247 ; WX 584 ; N divide ; B 82 -42 610 548 ; +C 221 ; WX 667 ; N Yacute ; B 168 0 806 936 ; +C 194 ; WX 722 ; N Acircumflex ; B 20 0 706 936 ; +C 225 ; WX 556 ; N aacute ; B 55 -14 627 750 ; +C 219 ; WX 722 ; N Ucircumflex ; B 116 -19 804 936 ; +C 253 ; WX 556 ; N yacute ; B 42 -214 652 750 ; +C -1 ; WX 556 ; N scommaaccent ; B 63 -228 584 546 ; +C 234 ; WX 556 ; N ecircumflex ; B 70 -14 593 750 ; +C -1 ; WX 722 ; N Uring ; B 116 -19 804 962 ; +C 220 ; WX 722 ; N Udieresis ; B 116 -19 804 915 ; +C -1 ; WX 556 ; N aogonek ; B 55 -224 583 546 ; +C 218 ; WX 722 ; N Uacute ; B 116 -19 804 936 ; +C -1 ; WX 611 ; N uogonek ; B 98 -228 658 532 ; +C 203 ; WX 667 ; N Edieresis ; B 76 0 757 915 ; +C -1 ; WX 722 ; N Dcroat ; B 62 0 777 718 ; +C -1 ; WX 250 ; N commaaccent ; B 16 -228 188 -50 ; +C 169 ; WX 737 ; N copyright ; B 56 -19 835 737 ; +C -1 ; WX 667 ; N Emacron ; B 76 0 757 864 ; +C -1 ; WX 556 ; N ccaron ; B 79 -14 614 750 ; +C 229 ; WX 556 ; N aring ; B 55 -14 583 776 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 807 718 ; +C -1 ; WX 278 ; N lacute ; B 69 0 528 936 ; +C 224 ; WX 556 ; N agrave ; B 55 -14 583 750 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 140 -228 751 718 ; +C -1 ; WX 722 ; N Cacute ; B 107 -19 789 936 ; +C 227 ; WX 556 ; N atilde ; B 55 -14 619 737 ; +C -1 ; WX 667 ; N Edotaccent ; B 76 0 757 915 ; +C 154 ; WX 556 ; N scaron ; B 63 -14 614 750 ; +C -1 ; WX 556 ; N scedilla ; B 63 -228 584 546 ; +C 237 ; WX 278 ; N iacute ; B 69 0 488 750 ; +C -1 ; WX 494 ; N lozenge ; B 90 0 564 745 ; +C -1 ; WX 722 ; N Rcaron ; B 76 0 778 936 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 108 -228 817 737 ; +C 251 ; WX 611 ; N ucircumflex ; B 98 -14 658 750 ; +C 226 ; WX 556 ; N acircumflex ; B 55 -14 583 750 ; +C -1 ; WX 722 ; N Amacron ; B 20 0 718 864 ; +C -1 ; WX 389 ; N rcaron ; B 64 0 530 750 ; +C 231 ; WX 556 ; N ccedilla ; B 79 -228 599 546 ; +C -1 ; WX 611 ; N Zdotaccent ; B 25 0 737 915 ; +C 222 ; WX 667 ; N Thorn ; B 76 0 716 718 ; +C -1 ; WX 778 ; N Omacron ; B 107 -19 823 864 ; +C -1 ; WX 722 ; N Racute ; B 76 0 778 936 ; +C -1 ; WX 667 ; N Sacute ; B 81 -19 722 936 ; +C -1 ; WX 743 ; N dcaron ; B 82 -14 903 718 ; +C -1 ; WX 722 ; N Umacron ; B 116 -19 804 864 ; +C -1 ; WX 611 ; N uring ; B 98 -14 658 776 ; +C 179 ; WX 333 ; N threesuperior ; B 91 271 441 710 ; +C 210 ; WX 778 ; N Ograve ; B 107 -19 823 936 ; +C 192 ; WX 722 ; N Agrave ; B 20 0 702 936 ; +C -1 ; WX 722 ; N Abreve ; B 20 0 729 936 ; +C 215 ; WX 584 ; N multiply ; B 57 1 635 505 ; +C 250 ; WX 611 ; N uacute ; B 98 -14 658 750 ; +C -1 ; WX 611 ; N Tcaron ; B 140 0 751 936 ; +C -1 ; WX 494 ; N partialdiff ; B 43 -21 585 750 ; +C 255 ; WX 556 ; N ydieresis ; B 42 -214 652 729 ; +C -1 ; WX 722 ; N Nacute ; B 69 0 807 936 ; +C 238 ; WX 278 ; N icircumflex ; B 69 0 444 750 ; +C 202 ; WX 667 ; N Ecircumflex ; B 76 0 757 936 ; +C 228 ; WX 556 ; N adieresis ; B 55 -14 594 729 ; +C 235 ; WX 556 ; N edieresis ; B 70 -14 594 729 ; +C -1 ; WX 556 ; N cacute ; B 79 -14 627 750 ; +C -1 ; WX 611 ; N nacute ; B 65 0 654 750 ; +C -1 ; WX 611 ; N umacron ; B 98 -14 658 678 ; +C -1 ; WX 722 ; N Ncaron ; B 69 0 807 936 ; +C 205 ; WX 278 ; N Iacute ; B 64 0 528 936 ; +C 177 ; WX 584 ; N plusminus ; B 40 0 625 506 ; +C 166 ; WX 280 ; N brokenbar ; B 52 -150 345 700 ; +C 174 ; WX 737 ; N registered ; B 55 -19 834 737 ; +C -1 ; WX 778 ; N Gbreve ; B 108 -19 817 936 ; +C -1 ; WX 278 ; N Idotaccent ; B 64 0 397 915 ; +C -1 ; WX 600 ; N summation ; B 14 -10 670 706 ; +C 200 ; WX 667 ; N Egrave ; B 76 0 757 936 ; +C -1 ; WX 389 ; N racute ; B 64 0 543 750 ; +C -1 ; WX 611 ; N omacron ; B 82 -14 643 678 ; +C -1 ; WX 611 ; N Zacute ; B 25 0 737 936 ; +C 142 ; WX 611 ; N Zcaron ; B 25 0 737 936 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 629 704 ; +C 208 ; WX 722 ; N Eth ; B 62 0 777 718 ; +C 199 ; WX 722 ; N Ccedilla ; B 107 -228 789 737 ; +C -1 ; WX 278 ; N lcommaaccent ; B 30 -228 362 718 ; +C -1 ; WX 389 ; N tcaron ; B 100 -6 608 878 ; +C -1 ; WX 556 ; N eogonek ; B 70 -228 593 546 ; +C -1 ; WX 722 ; N Uogonek ; B 116 -228 804 718 ; +C 193 ; WX 722 ; N Aacute ; B 20 0 750 936 ; +C 196 ; WX 722 ; N Adieresis ; B 20 0 716 915 ; +C 232 ; WX 556 ; N egrave ; B 70 -14 593 750 ; +C -1 ; WX 500 ; N zacute ; B 20 0 599 750 ; +C -1 ; WX 278 ; N iogonek ; B -14 -224 363 725 ; +C 211 ; WX 778 ; N Oacute ; B 107 -19 823 936 ; +C 243 ; WX 611 ; N oacute ; B 82 -14 654 750 ; +C -1 ; WX 556 ; N amacron ; B 55 -14 595 678 ; +C -1 ; WX 556 ; N sacute ; B 63 -14 627 750 ; +C 239 ; WX 278 ; N idieresis ; B 69 0 455 729 ; +C 212 ; WX 778 ; N Ocircumflex ; B 107 -19 823 936 ; +C 217 ; WX 722 ; N Ugrave ; B 116 -19 804 936 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 611 ; N thorn ; B 18 -208 645 718 ; +C 178 ; WX 333 ; N twosuperior ; B 69 283 449 710 ; +C 214 ; WX 778 ; N Odieresis ; B 107 -19 823 915 ; +C 181 ; WX 611 ; N mu ; B 22 -207 658 532 ; +C 236 ; WX 278 ; N igrave ; B 69 0 326 750 ; +C -1 ; WX 611 ; N ohungarumlaut ; B 82 -14 784 750 ; +C -1 ; WX 667 ; N Eogonek ; B 76 -224 757 718 ; +C -1 ; WX 611 ; N dcroat ; B 82 -14 789 718 ; +C 190 ; WX 834 ; N threequarters ; B 99 -19 839 710 ; +C -1 ; WX 667 ; N Scedilla ; B 81 -228 718 737 ; +C -1 ; WX 400 ; N lcaron ; B 69 0 561 718 ; +C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 858 718 ; +C -1 ; WX 611 ; N Lacute ; B 76 0 611 936 ; +C 153 ; WX 1000 ; N trademark ; B 179 306 1109 718 ; +C -1 ; WX 556 ; N edotaccent ; B 70 -14 593 729 ; +C 204 ; WX 278 ; N Igrave ; B 64 0 367 936 ; +C -1 ; WX 278 ; N Imacron ; B 64 0 496 864 ; +C -1 ; WX 611 ; N Lcaron ; B 76 0 643 718 ; +C 189 ; WX 834 ; N onehalf ; B 132 -19 858 710 ; +C -1 ; WX 549 ; N lessequal ; B 29 0 676 704 ; +C 244 ; WX 611 ; N ocircumflex ; B 82 -14 643 750 ; +C 241 ; WX 611 ; N ntilde ; B 65 0 646 737 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 116 -19 880 936 ; +C 201 ; WX 667 ; N Eacute ; B 76 0 757 936 ; +C -1 ; WX 556 ; N emacron ; B 70 -14 595 678 ; +C -1 ; WX 611 ; N gbreve ; B 38 -217 666 750 ; +C 188 ; WX 834 ; N onequarter ; B 132 -19 806 710 ; +C 138 ; WX 667 ; N Scaron ; B 81 -19 718 936 ; +C -1 ; WX 667 ; N Scommaaccent ; B 81 -228 718 737 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 107 -19 908 936 ; +C 176 ; WX 400 ; N degree ; B 175 426 467 712 ; +C 242 ; WX 611 ; N ograve ; B 82 -14 643 750 ; +C -1 ; WX 722 ; N Ccaron ; B 107 -19 789 936 ; +C 249 ; WX 611 ; N ugrave ; B 98 -14 658 750 ; +C -1 ; WX 549 ; N radical ; B 112 -46 689 850 ; +C -1 ; WX 722 ; N Dcaron ; B 76 0 777 936 ; +C -1 ; WX 389 ; N rcommaaccent ; B 26 -228 489 546 ; +C 209 ; WX 722 ; N Ntilde ; B 69 0 807 923 ; +C 245 ; WX 611 ; N otilde ; B 82 -14 646 737 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 778 718 ; +C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 611 718 ; +C 195 ; WX 722 ; N Atilde ; B 20 0 741 923 ; +C -1 ; WX 722 ; N Aogonek ; B 20 -224 702 718 ; +C 197 ; WX 722 ; N Aring ; B 20 0 702 962 ; +C 213 ; WX 778 ; N Otilde ; B 107 -19 823 923 ; +C -1 ; WX 500 ; N zdotaccent ; B 20 0 583 729 ; +C -1 ; WX 667 ; N Ecaron ; B 76 0 757 936 ; +C -1 ; WX 278 ; N Iogonek ; B -41 -228 367 718 ; +C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 670 718 ; +C -1 ; WX 584 ; N minus ; B 82 197 610 309 ; +C 206 ; WX 278 ; N Icircumflex ; B 64 0 484 936 ; +C -1 ; WX 611 ; N ncaron ; B 65 0 641 750 ; +C -1 ; WX 333 ; N tcommaaccent ; B 58 -228 422 676 ; +C 172 ; WX 584 ; N logicalnot ; B 105 108 633 419 ; +C 246 ; WX 611 ; N odieresis ; B 82 -14 643 729 ; +C 252 ; WX 611 ; N udieresis ; B 98 -14 658 729 ; +C -1 ; WX 549 ; N notequal ; B 32 -49 630 570 ; +C -1 ; WX 611 ; N gcommaaccent ; B 38 -217 666 850 ; +C 240 ; WX 611 ; N eth ; B 82 -14 670 737 ; +C 158 ; WX 500 ; N zcaron ; B 20 0 586 750 ; +C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 629 546 ; +C 185 ; WX 333 ; N onesuperior ; B 148 283 388 710 ; +C -1 ; WX 278 ; N imacron ; B 69 0 429 678 ; +C 128 ; WX 556 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2481 +KPX A C -40 +KPX A Cacute -40 +KPX A Ccaron -40 +KPX A Ccedilla -40 +KPX A G -50 +KPX A Gbreve -50 +KPX A Gcommaaccent -50 +KPX A O -40 +KPX A Oacute -40 +KPX A Ocircumflex -40 +KPX A Odieresis -40 +KPX A Ograve -40 +KPX A Ohungarumlaut -40 +KPX A Omacron -40 +KPX A Oslash -40 +KPX A Otilde -40 +KPX A Q -40 +KPX A T -90 +KPX A Tcaron -90 +KPX A Tcommaaccent -90 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -80 +KPX A W -60 +KPX A Y -110 +KPX A Yacute -110 +KPX A Ydieresis -110 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -40 +KPX A w -30 +KPX A y -30 +KPX A yacute -30 +KPX A ydieresis -30 +KPX Aacute C -40 +KPX Aacute Cacute -40 +KPX Aacute Ccaron -40 +KPX Aacute Ccedilla -40 +KPX Aacute G -50 +KPX Aacute Gbreve -50 +KPX Aacute Gcommaaccent -50 +KPX Aacute O -40 +KPX Aacute Oacute -40 +KPX Aacute Ocircumflex -40 +KPX Aacute Odieresis -40 +KPX Aacute Ograve -40 +KPX Aacute Ohungarumlaut -40 +KPX Aacute Omacron -40 +KPX Aacute Oslash -40 +KPX Aacute Otilde -40 +KPX Aacute Q -40 +KPX Aacute T -90 +KPX Aacute Tcaron -90 +KPX Aacute Tcommaaccent -90 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -80 +KPX Aacute W -60 +KPX Aacute Y -110 +KPX Aacute Yacute -110 +KPX Aacute Ydieresis -110 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -40 +KPX Aacute w -30 +KPX Aacute y -30 +KPX Aacute yacute -30 +KPX Aacute ydieresis -30 +KPX Abreve C -40 +KPX Abreve Cacute -40 +KPX Abreve Ccaron -40 +KPX Abreve Ccedilla -40 +KPX Abreve G -50 +KPX Abreve Gbreve -50 +KPX Abreve Gcommaaccent -50 +KPX Abreve O -40 +KPX Abreve Oacute -40 +KPX Abreve Ocircumflex -40 +KPX Abreve Odieresis -40 +KPX Abreve Ograve -40 +KPX Abreve Ohungarumlaut -40 +KPX Abreve Omacron -40 +KPX Abreve Oslash -40 +KPX Abreve Otilde -40 +KPX Abreve Q -40 +KPX Abreve T -90 +KPX Abreve Tcaron -90 +KPX Abreve Tcommaaccent -90 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -80 +KPX Abreve W -60 +KPX Abreve Y -110 +KPX Abreve Yacute -110 +KPX Abreve Ydieresis -110 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -40 +KPX Abreve w -30 +KPX Abreve y -30 +KPX Abreve yacute -30 +KPX Abreve ydieresis -30 +KPX Acircumflex C -40 +KPX Acircumflex Cacute -40 +KPX Acircumflex Ccaron -40 +KPX Acircumflex Ccedilla -40 +KPX Acircumflex G -50 +KPX Acircumflex Gbreve -50 +KPX Acircumflex Gcommaaccent -50 +KPX Acircumflex O -40 +KPX Acircumflex Oacute -40 +KPX Acircumflex Ocircumflex -40 +KPX Acircumflex Odieresis -40 +KPX Acircumflex Ograve -40 +KPX Acircumflex Ohungarumlaut -40 +KPX Acircumflex Omacron -40 +KPX Acircumflex Oslash -40 +KPX Acircumflex Otilde -40 +KPX Acircumflex Q -40 +KPX Acircumflex T -90 +KPX Acircumflex Tcaron -90 +KPX Acircumflex Tcommaaccent -90 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -80 +KPX Acircumflex W -60 +KPX Acircumflex Y -110 +KPX Acircumflex Yacute -110 +KPX Acircumflex Ydieresis -110 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -40 +KPX Acircumflex w -30 +KPX Acircumflex y -30 +KPX Acircumflex yacute -30 +KPX Acircumflex ydieresis -30 +KPX Adieresis C -40 +KPX Adieresis Cacute -40 +KPX Adieresis Ccaron -40 +KPX Adieresis Ccedilla -40 +KPX Adieresis G -50 +KPX Adieresis Gbreve -50 +KPX Adieresis Gcommaaccent -50 +KPX Adieresis O -40 +KPX Adieresis Oacute -40 +KPX Adieresis Ocircumflex -40 +KPX Adieresis Odieresis -40 +KPX Adieresis Ograve -40 +KPX Adieresis Ohungarumlaut -40 +KPX Adieresis Omacron -40 +KPX Adieresis Oslash -40 +KPX Adieresis Otilde -40 +KPX Adieresis Q -40 +KPX Adieresis T -90 +KPX Adieresis Tcaron -90 +KPX Adieresis Tcommaaccent -90 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -80 +KPX Adieresis W -60 +KPX Adieresis Y -110 +KPX Adieresis Yacute -110 +KPX Adieresis Ydieresis -110 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -40 +KPX Adieresis w -30 +KPX Adieresis y -30 +KPX Adieresis yacute -30 +KPX Adieresis ydieresis -30 +KPX Agrave C -40 +KPX Agrave Cacute -40 +KPX Agrave Ccaron -40 +KPX Agrave Ccedilla -40 +KPX Agrave G -50 +KPX Agrave Gbreve -50 +KPX Agrave Gcommaaccent -50 +KPX Agrave O -40 +KPX Agrave Oacute -40 +KPX Agrave Ocircumflex -40 +KPX Agrave Odieresis -40 +KPX Agrave Ograve -40 +KPX Agrave Ohungarumlaut -40 +KPX Agrave Omacron -40 +KPX Agrave Oslash -40 +KPX Agrave Otilde -40 +KPX Agrave Q -40 +KPX Agrave T -90 +KPX Agrave Tcaron -90 +KPX Agrave Tcommaaccent -90 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -80 +KPX Agrave W -60 +KPX Agrave Y -110 +KPX Agrave Yacute -110 +KPX Agrave Ydieresis -110 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -40 +KPX Agrave w -30 +KPX Agrave y -30 +KPX Agrave yacute -30 +KPX Agrave ydieresis -30 +KPX Amacron C -40 +KPX Amacron Cacute -40 +KPX Amacron Ccaron -40 +KPX Amacron Ccedilla -40 +KPX Amacron G -50 +KPX Amacron Gbreve -50 +KPX Amacron Gcommaaccent -50 +KPX Amacron O -40 +KPX Amacron Oacute -40 +KPX Amacron Ocircumflex -40 +KPX Amacron Odieresis -40 +KPX Amacron Ograve -40 +KPX Amacron Ohungarumlaut -40 +KPX Amacron Omacron -40 +KPX Amacron Oslash -40 +KPX Amacron Otilde -40 +KPX Amacron Q -40 +KPX Amacron T -90 +KPX Amacron Tcaron -90 +KPX Amacron Tcommaaccent -90 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -80 +KPX Amacron W -60 +KPX Amacron Y -110 +KPX Amacron Yacute -110 +KPX Amacron Ydieresis -110 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -40 +KPX Amacron w -30 +KPX Amacron y -30 +KPX Amacron yacute -30 +KPX Amacron ydieresis -30 +KPX Aogonek C -40 +KPX Aogonek Cacute -40 +KPX Aogonek Ccaron -40 +KPX Aogonek Ccedilla -40 +KPX Aogonek G -50 +KPX Aogonek Gbreve -50 +KPX Aogonek Gcommaaccent -50 +KPX Aogonek O -40 +KPX Aogonek Oacute -40 +KPX Aogonek Ocircumflex -40 +KPX Aogonek Odieresis -40 +KPX Aogonek Ograve -40 +KPX Aogonek Ohungarumlaut -40 +KPX Aogonek Omacron -40 +KPX Aogonek Oslash -40 +KPX Aogonek Otilde -40 +KPX Aogonek Q -40 +KPX Aogonek T -90 +KPX Aogonek Tcaron -90 +KPX Aogonek Tcommaaccent -90 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -80 +KPX Aogonek W -60 +KPX Aogonek Y -110 +KPX Aogonek Yacute -110 +KPX Aogonek Ydieresis -110 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -40 +KPX Aogonek w -30 +KPX Aogonek y -30 +KPX Aogonek yacute -30 +KPX Aogonek ydieresis -30 +KPX Aring C -40 +KPX Aring Cacute -40 +KPX Aring Ccaron -40 +KPX Aring Ccedilla -40 +KPX Aring G -50 +KPX Aring Gbreve -50 +KPX Aring Gcommaaccent -50 +KPX Aring O -40 +KPX Aring Oacute -40 +KPX Aring Ocircumflex -40 +KPX Aring Odieresis -40 +KPX Aring Ograve -40 +KPX Aring Ohungarumlaut -40 +KPX Aring Omacron -40 +KPX Aring Oslash -40 +KPX Aring Otilde -40 +KPX Aring Q -40 +KPX Aring T -90 +KPX Aring Tcaron -90 +KPX Aring Tcommaaccent -90 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -80 +KPX Aring W -60 +KPX Aring Y -110 +KPX Aring Yacute -110 +KPX Aring Ydieresis -110 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -40 +KPX Aring w -30 +KPX Aring y -30 +KPX Aring yacute -30 +KPX Aring ydieresis -30 +KPX Atilde C -40 +KPX Atilde Cacute -40 +KPX Atilde Ccaron -40 +KPX Atilde Ccedilla -40 +KPX Atilde G -50 +KPX Atilde Gbreve -50 +KPX Atilde Gcommaaccent -50 +KPX Atilde O -40 +KPX Atilde Oacute -40 +KPX Atilde Ocircumflex -40 +KPX Atilde Odieresis -40 +KPX Atilde Ograve -40 +KPX Atilde Ohungarumlaut -40 +KPX Atilde Omacron -40 +KPX Atilde Oslash -40 +KPX Atilde Otilde -40 +KPX Atilde Q -40 +KPX Atilde T -90 +KPX Atilde Tcaron -90 +KPX Atilde Tcommaaccent -90 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -80 +KPX Atilde W -60 +KPX Atilde Y -110 +KPX Atilde Yacute -110 +KPX Atilde Ydieresis -110 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -40 +KPX Atilde w -30 +KPX Atilde y -30 +KPX Atilde yacute -30 +KPX Atilde ydieresis -30 +KPX B A -30 +KPX B Aacute -30 +KPX B Abreve -30 +KPX B Acircumflex -30 +KPX B Adieresis -30 +KPX B Agrave -30 +KPX B Amacron -30 +KPX B Aogonek -30 +KPX B Aring -30 +KPX B Atilde -30 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -40 +KPX D W -40 +KPX D Y -70 +KPX D Yacute -70 +KPX D Ydieresis -70 +KPX D comma -30 +KPX D period -30 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -40 +KPX Dcaron W -40 +KPX Dcaron Y -70 +KPX Dcaron Yacute -70 +KPX Dcaron Ydieresis -70 +KPX Dcaron comma -30 +KPX Dcaron period -30 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -40 +KPX Dcroat W -40 +KPX Dcroat Y -70 +KPX Dcroat Yacute -70 +KPX Dcroat Ydieresis -70 +KPX Dcroat comma -30 +KPX Dcroat period -30 +KPX F A -80 +KPX F Aacute -80 +KPX F Abreve -80 +KPX F Acircumflex -80 +KPX F Adieresis -80 +KPX F Agrave -80 +KPX F Amacron -80 +KPX F Aogonek -80 +KPX F Aring -80 +KPX F Atilde -80 +KPX F a -20 +KPX F aacute -20 +KPX F abreve -20 +KPX F acircumflex -20 +KPX F adieresis -20 +KPX F agrave -20 +KPX F amacron -20 +KPX F aogonek -20 +KPX F aring -20 +KPX F atilde -20 +KPX F comma -100 +KPX F period -100 +KPX J A -20 +KPX J Aacute -20 +KPX J Abreve -20 +KPX J Acircumflex -20 +KPX J Adieresis -20 +KPX J Agrave -20 +KPX J Amacron -20 +KPX J Aogonek -20 +KPX J Aring -20 +KPX J Atilde -20 +KPX J comma -20 +KPX J period -20 +KPX J u -20 +KPX J uacute -20 +KPX J ucircumflex -20 +KPX J udieresis -20 +KPX J ugrave -20 +KPX J uhungarumlaut -20 +KPX J umacron -20 +KPX J uogonek -20 +KPX J uring -20 +KPX K O -30 +KPX K Oacute -30 +KPX K Ocircumflex -30 +KPX K Odieresis -30 +KPX K Ograve -30 +KPX K Ohungarumlaut -30 +KPX K Omacron -30 +KPX K Oslash -30 +KPX K Otilde -30 +KPX K e -15 +KPX K eacute -15 +KPX K ecaron -15 +KPX K ecircumflex -15 +KPX K edieresis -15 +KPX K edotaccent -15 +KPX K egrave -15 +KPX K emacron -15 +KPX K eogonek -15 +KPX K o -35 +KPX K oacute -35 +KPX K ocircumflex -35 +KPX K odieresis -35 +KPX K ograve -35 +KPX K ohungarumlaut -35 +KPX K omacron -35 +KPX K oslash -35 +KPX K otilde -35 +KPX K u -30 +KPX K uacute -30 +KPX K ucircumflex -30 +KPX K udieresis -30 +KPX K ugrave -30 +KPX K uhungarumlaut -30 +KPX K umacron -30 +KPX K uogonek -30 +KPX K uring -30 +KPX K y -40 +KPX K yacute -40 +KPX K ydieresis -40 +KPX Kcommaaccent O -30 +KPX Kcommaaccent Oacute -30 +KPX Kcommaaccent Ocircumflex -30 +KPX Kcommaaccent Odieresis -30 +KPX Kcommaaccent Ograve -30 +KPX Kcommaaccent Ohungarumlaut -30 +KPX Kcommaaccent Omacron -30 +KPX Kcommaaccent Oslash -30 +KPX Kcommaaccent Otilde -30 +KPX Kcommaaccent e -15 +KPX Kcommaaccent eacute -15 +KPX Kcommaaccent ecaron -15 +KPX Kcommaaccent ecircumflex -15 +KPX Kcommaaccent edieresis -15 +KPX Kcommaaccent edotaccent -15 +KPX Kcommaaccent egrave -15 +KPX Kcommaaccent emacron -15 +KPX Kcommaaccent eogonek -15 +KPX Kcommaaccent o -35 +KPX Kcommaaccent oacute -35 +KPX Kcommaaccent ocircumflex -35 +KPX Kcommaaccent odieresis -35 +KPX Kcommaaccent ograve -35 +KPX Kcommaaccent ohungarumlaut -35 +KPX Kcommaaccent omacron -35 +KPX Kcommaaccent oslash -35 +KPX Kcommaaccent otilde -35 +KPX Kcommaaccent u -30 +KPX Kcommaaccent uacute -30 +KPX Kcommaaccent ucircumflex -30 +KPX Kcommaaccent udieresis -30 +KPX Kcommaaccent ugrave -30 +KPX Kcommaaccent uhungarumlaut -30 +KPX Kcommaaccent umacron -30 +KPX Kcommaaccent uogonek -30 +KPX Kcommaaccent uring -30 +KPX Kcommaaccent y -40 +KPX Kcommaaccent yacute -40 +KPX Kcommaaccent ydieresis -40 +KPX L T -90 +KPX L Tcaron -90 +KPX L Tcommaaccent -90 +KPX L V -110 +KPX L W -80 +KPX L Y -120 +KPX L Yacute -120 +KPX L Ydieresis -120 +KPX L quotedblright -140 +KPX L quoteright -140 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -90 +KPX Lacute Tcaron -90 +KPX Lacute Tcommaaccent -90 +KPX Lacute V -110 +KPX Lacute W -80 +KPX Lacute Y -120 +KPX Lacute Yacute -120 +KPX Lacute Ydieresis -120 +KPX Lacute quotedblright -140 +KPX Lacute quoteright -140 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcommaaccent T -90 +KPX Lcommaaccent Tcaron -90 +KPX Lcommaaccent Tcommaaccent -90 +KPX Lcommaaccent V -110 +KPX Lcommaaccent W -80 +KPX Lcommaaccent Y -120 +KPX Lcommaaccent Yacute -120 +KPX Lcommaaccent Ydieresis -120 +KPX Lcommaaccent quotedblright -140 +KPX Lcommaaccent quoteright -140 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -90 +KPX Lslash Tcaron -90 +KPX Lslash Tcommaaccent -90 +KPX Lslash V -110 +KPX Lslash W -80 +KPX Lslash Y -120 +KPX Lslash Yacute -120 +KPX Lslash Ydieresis -120 +KPX Lslash quotedblright -140 +KPX Lslash quoteright -140 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX O A -50 +KPX O Aacute -50 +KPX O Abreve -50 +KPX O Acircumflex -50 +KPX O Adieresis -50 +KPX O Agrave -50 +KPX O Amacron -50 +KPX O Aogonek -50 +KPX O Aring -50 +KPX O Atilde -50 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -50 +KPX O X -50 +KPX O Y -70 +KPX O Yacute -70 +KPX O Ydieresis -70 +KPX O comma -40 +KPX O period -40 +KPX Oacute A -50 +KPX Oacute Aacute -50 +KPX Oacute Abreve -50 +KPX Oacute Acircumflex -50 +KPX Oacute Adieresis -50 +KPX Oacute Agrave -50 +KPX Oacute Amacron -50 +KPX Oacute Aogonek -50 +KPX Oacute Aring -50 +KPX Oacute Atilde -50 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -50 +KPX Oacute X -50 +KPX Oacute Y -70 +KPX Oacute Yacute -70 +KPX Oacute Ydieresis -70 +KPX Oacute comma -40 +KPX Oacute period -40 +KPX Ocircumflex A -50 +KPX Ocircumflex Aacute -50 +KPX Ocircumflex Abreve -50 +KPX Ocircumflex Acircumflex -50 +KPX Ocircumflex Adieresis -50 +KPX Ocircumflex Agrave -50 +KPX Ocircumflex Amacron -50 +KPX Ocircumflex Aogonek -50 +KPX Ocircumflex Aring -50 +KPX Ocircumflex Atilde -50 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -50 +KPX Ocircumflex X -50 +KPX Ocircumflex Y -70 +KPX Ocircumflex Yacute -70 +KPX Ocircumflex Ydieresis -70 +KPX Ocircumflex comma -40 +KPX Ocircumflex period -40 +KPX Odieresis A -50 +KPX Odieresis Aacute -50 +KPX Odieresis Abreve -50 +KPX Odieresis Acircumflex -50 +KPX Odieresis Adieresis -50 +KPX Odieresis Agrave -50 +KPX Odieresis Amacron -50 +KPX Odieresis Aogonek -50 +KPX Odieresis Aring -50 +KPX Odieresis Atilde -50 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -50 +KPX Odieresis X -50 +KPX Odieresis Y -70 +KPX Odieresis Yacute -70 +KPX Odieresis Ydieresis -70 +KPX Odieresis comma -40 +KPX Odieresis period -40 +KPX Ograve A -50 +KPX Ograve Aacute -50 +KPX Ograve Abreve -50 +KPX Ograve Acircumflex -50 +KPX Ograve Adieresis -50 +KPX Ograve Agrave -50 +KPX Ograve Amacron -50 +KPX Ograve Aogonek -50 +KPX Ograve Aring -50 +KPX Ograve Atilde -50 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -50 +KPX Ograve X -50 +KPX Ograve Y -70 +KPX Ograve Yacute -70 +KPX Ograve Ydieresis -70 +KPX Ograve comma -40 +KPX Ograve period -40 +KPX Ohungarumlaut A -50 +KPX Ohungarumlaut Aacute -50 +KPX Ohungarumlaut Abreve -50 +KPX Ohungarumlaut Acircumflex -50 +KPX Ohungarumlaut Adieresis -50 +KPX Ohungarumlaut Agrave -50 +KPX Ohungarumlaut Amacron -50 +KPX Ohungarumlaut Aogonek -50 +KPX Ohungarumlaut Aring -50 +KPX Ohungarumlaut Atilde -50 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -50 +KPX Ohungarumlaut X -50 +KPX Ohungarumlaut Y -70 +KPX Ohungarumlaut Yacute -70 +KPX Ohungarumlaut Ydieresis -70 +KPX Ohungarumlaut comma -40 +KPX Ohungarumlaut period -40 +KPX Omacron A -50 +KPX Omacron Aacute -50 +KPX Omacron Abreve -50 +KPX Omacron Acircumflex -50 +KPX Omacron Adieresis -50 +KPX Omacron Agrave -50 +KPX Omacron Amacron -50 +KPX Omacron Aogonek -50 +KPX Omacron Aring -50 +KPX Omacron Atilde -50 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -50 +KPX Omacron X -50 +KPX Omacron Y -70 +KPX Omacron Yacute -70 +KPX Omacron Ydieresis -70 +KPX Omacron comma -40 +KPX Omacron period -40 +KPX Oslash A -50 +KPX Oslash Aacute -50 +KPX Oslash Abreve -50 +KPX Oslash Acircumflex -50 +KPX Oslash Adieresis -50 +KPX Oslash Agrave -50 +KPX Oslash Amacron -50 +KPX Oslash Aogonek -50 +KPX Oslash Aring -50 +KPX Oslash Atilde -50 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -50 +KPX Oslash X -50 +KPX Oslash Y -70 +KPX Oslash Yacute -70 +KPX Oslash Ydieresis -70 +KPX Oslash comma -40 +KPX Oslash period -40 +KPX Otilde A -50 +KPX Otilde Aacute -50 +KPX Otilde Abreve -50 +KPX Otilde Acircumflex -50 +KPX Otilde Adieresis -50 +KPX Otilde Agrave -50 +KPX Otilde Amacron -50 +KPX Otilde Aogonek -50 +KPX Otilde Aring -50 +KPX Otilde Atilde -50 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -50 +KPX Otilde X -50 +KPX Otilde Y -70 +KPX Otilde Yacute -70 +KPX Otilde Ydieresis -70 +KPX Otilde comma -40 +KPX Otilde period -40 +KPX P A -100 +KPX P Aacute -100 +KPX P Abreve -100 +KPX P Acircumflex -100 +KPX P Adieresis -100 +KPX P Agrave -100 +KPX P Amacron -100 +KPX P Aogonek -100 +KPX P Aring -100 +KPX P Atilde -100 +KPX P a -30 +KPX P aacute -30 +KPX P abreve -30 +KPX P acircumflex -30 +KPX P adieresis -30 +KPX P agrave -30 +KPX P amacron -30 +KPX P aogonek -30 +KPX P aring -30 +KPX P atilde -30 +KPX P comma -120 +KPX P e -30 +KPX P eacute -30 +KPX P ecaron -30 +KPX P ecircumflex -30 +KPX P edieresis -30 +KPX P edotaccent -30 +KPX P egrave -30 +KPX P emacron -30 +KPX P eogonek -30 +KPX P o -40 +KPX P oacute -40 +KPX P ocircumflex -40 +KPX P odieresis -40 +KPX P ograve -40 +KPX P ohungarumlaut -40 +KPX P omacron -40 +KPX P oslash -40 +KPX P otilde -40 +KPX P period -120 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX Q comma 20 +KPX Q period 20 +KPX R O -20 +KPX R Oacute -20 +KPX R Ocircumflex -20 +KPX R Odieresis -20 +KPX R Ograve -20 +KPX R Ohungarumlaut -20 +KPX R Omacron -20 +KPX R Oslash -20 +KPX R Otilde -20 +KPX R T -20 +KPX R Tcaron -20 +KPX R Tcommaaccent -20 +KPX R U -20 +KPX R Uacute -20 +KPX R Ucircumflex -20 +KPX R Udieresis -20 +KPX R Ugrave -20 +KPX R Uhungarumlaut -20 +KPX R Umacron -20 +KPX R Uogonek -20 +KPX R Uring -20 +KPX R V -50 +KPX R W -40 +KPX R Y -50 +KPX R Yacute -50 +KPX R Ydieresis -50 +KPX Racute O -20 +KPX Racute Oacute -20 +KPX Racute Ocircumflex -20 +KPX Racute Odieresis -20 +KPX Racute Ograve -20 +KPX Racute Ohungarumlaut -20 +KPX Racute Omacron -20 +KPX Racute Oslash -20 +KPX Racute Otilde -20 +KPX Racute T -20 +KPX Racute Tcaron -20 +KPX Racute Tcommaaccent -20 +KPX Racute U -20 +KPX Racute Uacute -20 +KPX Racute Ucircumflex -20 +KPX Racute Udieresis -20 +KPX Racute Ugrave -20 +KPX Racute Uhungarumlaut -20 +KPX Racute Umacron -20 +KPX Racute Uogonek -20 +KPX Racute Uring -20 +KPX Racute V -50 +KPX Racute W -40 +KPX Racute Y -50 +KPX Racute Yacute -50 +KPX Racute Ydieresis -50 +KPX Rcaron O -20 +KPX Rcaron Oacute -20 +KPX Rcaron Ocircumflex -20 +KPX Rcaron Odieresis -20 +KPX Rcaron Ograve -20 +KPX Rcaron Ohungarumlaut -20 +KPX Rcaron Omacron -20 +KPX Rcaron Oslash -20 +KPX Rcaron Otilde -20 +KPX Rcaron T -20 +KPX Rcaron Tcaron -20 +KPX Rcaron Tcommaaccent -20 +KPX Rcaron U -20 +KPX Rcaron Uacute -20 +KPX Rcaron Ucircumflex -20 +KPX Rcaron Udieresis -20 +KPX Rcaron Ugrave -20 +KPX Rcaron Uhungarumlaut -20 +KPX Rcaron Umacron -20 +KPX Rcaron Uogonek -20 +KPX Rcaron Uring -20 +KPX Rcaron V -50 +KPX Rcaron W -40 +KPX Rcaron Y -50 +KPX Rcaron Yacute -50 +KPX Rcaron Ydieresis -50 +KPX Rcommaaccent O -20 +KPX Rcommaaccent Oacute -20 +KPX Rcommaaccent Ocircumflex -20 +KPX Rcommaaccent Odieresis -20 +KPX Rcommaaccent Ograve -20 +KPX Rcommaaccent Ohungarumlaut -20 +KPX Rcommaaccent Omacron -20 +KPX Rcommaaccent Oslash -20 +KPX Rcommaaccent Otilde -20 +KPX Rcommaaccent T -20 +KPX Rcommaaccent Tcaron -20 +KPX Rcommaaccent Tcommaaccent -20 +KPX Rcommaaccent U -20 +KPX Rcommaaccent Uacute -20 +KPX Rcommaaccent Ucircumflex -20 +KPX Rcommaaccent Udieresis -20 +KPX Rcommaaccent Ugrave -20 +KPX Rcommaaccent Uhungarumlaut -20 +KPX Rcommaaccent Umacron -20 +KPX Rcommaaccent Uogonek -20 +KPX Rcommaaccent Uring -20 +KPX Rcommaaccent V -50 +KPX Rcommaaccent W -40 +KPX Rcommaaccent Y -50 +KPX Rcommaaccent Yacute -50 +KPX Rcommaaccent Ydieresis -50 +KPX T A -90 +KPX T Aacute -90 +KPX T Abreve -90 +KPX T Acircumflex -90 +KPX T Adieresis -90 +KPX T Agrave -90 +KPX T Amacron -90 +KPX T Aogonek -90 +KPX T Aring -90 +KPX T Atilde -90 +KPX T O -40 +KPX T Oacute -40 +KPX T Ocircumflex -40 +KPX T Odieresis -40 +KPX T Ograve -40 +KPX T Ohungarumlaut -40 +KPX T Omacron -40 +KPX T Oslash -40 +KPX T Otilde -40 +KPX T a -80 +KPX T aacute -80 +KPX T abreve -80 +KPX T acircumflex -80 +KPX T adieresis -80 +KPX T agrave -80 +KPX T amacron -80 +KPX T aogonek -80 +KPX T aring -80 +KPX T atilde -80 +KPX T colon -40 +KPX T comma -80 +KPX T e -60 +KPX T eacute -60 +KPX T ecaron -60 +KPX T ecircumflex -60 +KPX T edieresis -60 +KPX T edotaccent -60 +KPX T egrave -60 +KPX T emacron -60 +KPX T eogonek -60 +KPX T hyphen -120 +KPX T o -80 +KPX T oacute -80 +KPX T ocircumflex -80 +KPX T odieresis -80 +KPX T ograve -80 +KPX T ohungarumlaut -80 +KPX T omacron -80 +KPX T oslash -80 +KPX T otilde -80 +KPX T period -80 +KPX T r -80 +KPX T racute -80 +KPX T rcommaaccent -80 +KPX T semicolon -40 +KPX T u -90 +KPX T uacute -90 +KPX T ucircumflex -90 +KPX T udieresis -90 +KPX T ugrave -90 +KPX T uhungarumlaut -90 +KPX T umacron -90 +KPX T uogonek -90 +KPX T uring -90 +KPX T w -60 +KPX T y -60 +KPX T yacute -60 +KPX T ydieresis -60 +KPX Tcaron A -90 +KPX Tcaron Aacute -90 +KPX Tcaron Abreve -90 +KPX Tcaron Acircumflex -90 +KPX Tcaron Adieresis -90 +KPX Tcaron Agrave -90 +KPX Tcaron Amacron -90 +KPX Tcaron Aogonek -90 +KPX Tcaron Aring -90 +KPX Tcaron Atilde -90 +KPX Tcaron O -40 +KPX Tcaron Oacute -40 +KPX Tcaron Ocircumflex -40 +KPX Tcaron Odieresis -40 +KPX Tcaron Ograve -40 +KPX Tcaron Ohungarumlaut -40 +KPX Tcaron Omacron -40 +KPX Tcaron Oslash -40 +KPX Tcaron Otilde -40 +KPX Tcaron a -80 +KPX Tcaron aacute -80 +KPX Tcaron abreve -80 +KPX Tcaron acircumflex -80 +KPX Tcaron adieresis -80 +KPX Tcaron agrave -80 +KPX Tcaron amacron -80 +KPX Tcaron aogonek -80 +KPX Tcaron aring -80 +KPX Tcaron atilde -80 +KPX Tcaron colon -40 +KPX Tcaron comma -80 +KPX Tcaron e -60 +KPX Tcaron eacute -60 +KPX Tcaron ecaron -60 +KPX Tcaron ecircumflex -60 +KPX Tcaron edieresis -60 +KPX Tcaron edotaccent -60 +KPX Tcaron egrave -60 +KPX Tcaron emacron -60 +KPX Tcaron eogonek -60 +KPX Tcaron hyphen -120 +KPX Tcaron o -80 +KPX Tcaron oacute -80 +KPX Tcaron ocircumflex -80 +KPX Tcaron odieresis -80 +KPX Tcaron ograve -80 +KPX Tcaron ohungarumlaut -80 +KPX Tcaron omacron -80 +KPX Tcaron oslash -80 +KPX Tcaron otilde -80 +KPX Tcaron period -80 +KPX Tcaron r -80 +KPX Tcaron racute -80 +KPX Tcaron rcommaaccent -80 +KPX Tcaron semicolon -40 +KPX Tcaron u -90 +KPX Tcaron uacute -90 +KPX Tcaron ucircumflex -90 +KPX Tcaron udieresis -90 +KPX Tcaron ugrave -90 +KPX Tcaron uhungarumlaut -90 +KPX Tcaron umacron -90 +KPX Tcaron uogonek -90 +KPX Tcaron uring -90 +KPX Tcaron w -60 +KPX Tcaron y -60 +KPX Tcaron yacute -60 +KPX Tcaron ydieresis -60 +KPX Tcommaaccent A -90 +KPX Tcommaaccent Aacute -90 +KPX Tcommaaccent Abreve -90 +KPX Tcommaaccent Acircumflex -90 +KPX Tcommaaccent Adieresis -90 +KPX Tcommaaccent Agrave -90 +KPX Tcommaaccent Amacron -90 +KPX Tcommaaccent Aogonek -90 +KPX Tcommaaccent Aring -90 +KPX Tcommaaccent Atilde -90 +KPX Tcommaaccent O -40 +KPX Tcommaaccent Oacute -40 +KPX Tcommaaccent Ocircumflex -40 +KPX Tcommaaccent Odieresis -40 +KPX Tcommaaccent Ograve -40 +KPX Tcommaaccent Ohungarumlaut -40 +KPX Tcommaaccent Omacron -40 +KPX Tcommaaccent Oslash -40 +KPX Tcommaaccent Otilde -40 +KPX Tcommaaccent a -80 +KPX Tcommaaccent aacute -80 +KPX Tcommaaccent abreve -80 +KPX Tcommaaccent acircumflex -80 +KPX Tcommaaccent adieresis -80 +KPX Tcommaaccent agrave -80 +KPX Tcommaaccent amacron -80 +KPX Tcommaaccent aogonek -80 +KPX Tcommaaccent aring -80 +KPX Tcommaaccent atilde -80 +KPX Tcommaaccent colon -40 +KPX Tcommaaccent comma -80 +KPX Tcommaaccent e -60 +KPX Tcommaaccent eacute -60 +KPX Tcommaaccent ecaron -60 +KPX Tcommaaccent ecircumflex -60 +KPX Tcommaaccent edieresis -60 +KPX Tcommaaccent edotaccent -60 +KPX Tcommaaccent egrave -60 +KPX Tcommaaccent emacron -60 +KPX Tcommaaccent eogonek -60 +KPX Tcommaaccent hyphen -120 +KPX Tcommaaccent o -80 +KPX Tcommaaccent oacute -80 +KPX Tcommaaccent ocircumflex -80 +KPX Tcommaaccent odieresis -80 +KPX Tcommaaccent ograve -80 +KPX Tcommaaccent ohungarumlaut -80 +KPX Tcommaaccent omacron -80 +KPX Tcommaaccent oslash -80 +KPX Tcommaaccent otilde -80 +KPX Tcommaaccent period -80 +KPX Tcommaaccent r -80 +KPX Tcommaaccent racute -80 +KPX Tcommaaccent rcommaaccent -80 +KPX Tcommaaccent semicolon -40 +KPX Tcommaaccent u -90 +KPX Tcommaaccent uacute -90 +KPX Tcommaaccent ucircumflex -90 +KPX Tcommaaccent udieresis -90 +KPX Tcommaaccent ugrave -90 +KPX Tcommaaccent uhungarumlaut -90 +KPX Tcommaaccent umacron -90 +KPX Tcommaaccent uogonek -90 +KPX Tcommaaccent uring -90 +KPX Tcommaaccent w -60 +KPX Tcommaaccent y -60 +KPX Tcommaaccent yacute -60 +KPX Tcommaaccent ydieresis -60 +KPX U A -50 +KPX U Aacute -50 +KPX U Abreve -50 +KPX U Acircumflex -50 +KPX U Adieresis -50 +KPX U Agrave -50 +KPX U Amacron -50 +KPX U Aogonek -50 +KPX U Aring -50 +KPX U Atilde -50 +KPX U comma -30 +KPX U period -30 +KPX Uacute A -50 +KPX Uacute Aacute -50 +KPX Uacute Abreve -50 +KPX Uacute Acircumflex -50 +KPX Uacute Adieresis -50 +KPX Uacute Agrave -50 +KPX Uacute Amacron -50 +KPX Uacute Aogonek -50 +KPX Uacute Aring -50 +KPX Uacute Atilde -50 +KPX Uacute comma -30 +KPX Uacute period -30 +KPX Ucircumflex A -50 +KPX Ucircumflex Aacute -50 +KPX Ucircumflex Abreve -50 +KPX Ucircumflex Acircumflex -50 +KPX Ucircumflex Adieresis -50 +KPX Ucircumflex Agrave -50 +KPX Ucircumflex Amacron -50 +KPX Ucircumflex Aogonek -50 +KPX Ucircumflex Aring -50 +KPX Ucircumflex Atilde -50 +KPX Ucircumflex comma -30 +KPX Ucircumflex period -30 +KPX Udieresis A -50 +KPX Udieresis Aacute -50 +KPX Udieresis Abreve -50 +KPX Udieresis Acircumflex -50 +KPX Udieresis Adieresis -50 +KPX Udieresis Agrave -50 +KPX Udieresis Amacron -50 +KPX Udieresis Aogonek -50 +KPX Udieresis Aring -50 +KPX Udieresis Atilde -50 +KPX Udieresis comma -30 +KPX Udieresis period -30 +KPX Ugrave A -50 +KPX Ugrave Aacute -50 +KPX Ugrave Abreve -50 +KPX Ugrave Acircumflex -50 +KPX Ugrave Adieresis -50 +KPX Ugrave Agrave -50 +KPX Ugrave Amacron -50 +KPX Ugrave Aogonek -50 +KPX Ugrave Aring -50 +KPX Ugrave Atilde -50 +KPX Ugrave comma -30 +KPX Ugrave period -30 +KPX Uhungarumlaut A -50 +KPX Uhungarumlaut Aacute -50 +KPX Uhungarumlaut Abreve -50 +KPX Uhungarumlaut Acircumflex -50 +KPX Uhungarumlaut Adieresis -50 +KPX Uhungarumlaut Agrave -50 +KPX Uhungarumlaut Amacron -50 +KPX Uhungarumlaut Aogonek -50 +KPX Uhungarumlaut Aring -50 +KPX Uhungarumlaut Atilde -50 +KPX Uhungarumlaut comma -30 +KPX Uhungarumlaut period -30 +KPX Umacron A -50 +KPX Umacron Aacute -50 +KPX Umacron Abreve -50 +KPX Umacron Acircumflex -50 +KPX Umacron Adieresis -50 +KPX Umacron Agrave -50 +KPX Umacron Amacron -50 +KPX Umacron Aogonek -50 +KPX Umacron Aring -50 +KPX Umacron Atilde -50 +KPX Umacron comma -30 +KPX Umacron period -30 +KPX Uogonek A -50 +KPX Uogonek Aacute -50 +KPX Uogonek Abreve -50 +KPX Uogonek Acircumflex -50 +KPX Uogonek Adieresis -50 +KPX Uogonek Agrave -50 +KPX Uogonek Amacron -50 +KPX Uogonek Aogonek -50 +KPX Uogonek Aring -50 +KPX Uogonek Atilde -50 +KPX Uogonek comma -30 +KPX Uogonek period -30 +KPX Uring A -50 +KPX Uring Aacute -50 +KPX Uring Abreve -50 +KPX Uring Acircumflex -50 +KPX Uring Adieresis -50 +KPX Uring Agrave -50 +KPX Uring Amacron -50 +KPX Uring Aogonek -50 +KPX Uring Aring -50 +KPX Uring Atilde -50 +KPX Uring comma -30 +KPX Uring period -30 +KPX V A -80 +KPX V Aacute -80 +KPX V Abreve -80 +KPX V Acircumflex -80 +KPX V Adieresis -80 +KPX V Agrave -80 +KPX V Amacron -80 +KPX V Aogonek -80 +KPX V Aring -80 +KPX V Atilde -80 +KPX V G -50 +KPX V Gbreve -50 +KPX V Gcommaaccent -50 +KPX V O -50 +KPX V Oacute -50 +KPX V Ocircumflex -50 +KPX V Odieresis -50 +KPX V Ograve -50 +KPX V Ohungarumlaut -50 +KPX V Omacron -50 +KPX V Oslash -50 +KPX V Otilde -50 +KPX V a -60 +KPX V aacute -60 +KPX V abreve -60 +KPX V acircumflex -60 +KPX V adieresis -60 +KPX V agrave -60 +KPX V amacron -60 +KPX V aogonek -60 +KPX V aring -60 +KPX V atilde -60 +KPX V colon -40 +KPX V comma -120 +KPX V e -50 +KPX V eacute -50 +KPX V ecaron -50 +KPX V ecircumflex -50 +KPX V edieresis -50 +KPX V edotaccent -50 +KPX V egrave -50 +KPX V emacron -50 +KPX V eogonek -50 +KPX V hyphen -80 +KPX V o -90 +KPX V oacute -90 +KPX V ocircumflex -90 +KPX V odieresis -90 +KPX V ograve -90 +KPX V ohungarumlaut -90 +KPX V omacron -90 +KPX V oslash -90 +KPX V otilde -90 +KPX V period -120 +KPX V semicolon -40 +KPX V u -60 +KPX V uacute -60 +KPX V ucircumflex -60 +KPX V udieresis -60 +KPX V ugrave -60 +KPX V uhungarumlaut -60 +KPX V umacron -60 +KPX V uogonek -60 +KPX V uring -60 +KPX W A -60 +KPX W Aacute -60 +KPX W Abreve -60 +KPX W Acircumflex -60 +KPX W Adieresis -60 +KPX W Agrave -60 +KPX W Amacron -60 +KPX W Aogonek -60 +KPX W Aring -60 +KPX W Atilde -60 +KPX W O -20 +KPX W Oacute -20 +KPX W Ocircumflex -20 +KPX W Odieresis -20 +KPX W Ograve -20 +KPX W Ohungarumlaut -20 +KPX W Omacron -20 +KPX W Oslash -20 +KPX W Otilde -20 +KPX W a -40 +KPX W aacute -40 +KPX W abreve -40 +KPX W acircumflex -40 +KPX W adieresis -40 +KPX W agrave -40 +KPX W amacron -40 +KPX W aogonek -40 +KPX W aring -40 +KPX W atilde -40 +KPX W colon -10 +KPX W comma -80 +KPX W e -35 +KPX W eacute -35 +KPX W ecaron -35 +KPX W ecircumflex -35 +KPX W edieresis -35 +KPX W edotaccent -35 +KPX W egrave -35 +KPX W emacron -35 +KPX W eogonek -35 +KPX W hyphen -40 +KPX W o -60 +KPX W oacute -60 +KPX W ocircumflex -60 +KPX W odieresis -60 +KPX W ograve -60 +KPX W ohungarumlaut -60 +KPX W omacron -60 +KPX W oslash -60 +KPX W otilde -60 +KPX W period -80 +KPX W semicolon -10 +KPX W u -45 +KPX W uacute -45 +KPX W ucircumflex -45 +KPX W udieresis -45 +KPX W ugrave -45 +KPX W uhungarumlaut -45 +KPX W umacron -45 +KPX W uogonek -45 +KPX W uring -45 +KPX W y -20 +KPX W yacute -20 +KPX W ydieresis -20 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -70 +KPX Y Oacute -70 +KPX Y Ocircumflex -70 +KPX Y Odieresis -70 +KPX Y Ograve -70 +KPX Y Ohungarumlaut -70 +KPX Y Omacron -70 +KPX Y Oslash -70 +KPX Y Otilde -70 +KPX Y a -90 +KPX Y aacute -90 +KPX Y abreve -90 +KPX Y acircumflex -90 +KPX Y adieresis -90 +KPX Y agrave -90 +KPX Y amacron -90 +KPX Y aogonek -90 +KPX Y aring -90 +KPX Y atilde -90 +KPX Y colon -50 +KPX Y comma -100 +KPX Y e -80 +KPX Y eacute -80 +KPX Y ecaron -80 +KPX Y ecircumflex -80 +KPX Y edieresis -80 +KPX Y edotaccent -80 +KPX Y egrave -80 +KPX Y emacron -80 +KPX Y eogonek -80 +KPX Y o -100 +KPX Y oacute -100 +KPX Y ocircumflex -100 +KPX Y odieresis -100 +KPX Y ograve -100 +KPX Y ohungarumlaut -100 +KPX Y omacron -100 +KPX Y oslash -100 +KPX Y otilde -100 +KPX Y period -100 +KPX Y semicolon -50 +KPX Y u -100 +KPX Y uacute -100 +KPX Y ucircumflex -100 +KPX Y udieresis -100 +KPX Y ugrave -100 +KPX Y uhungarumlaut -100 +KPX Y umacron -100 +KPX Y uogonek -100 +KPX Y uring -100 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -70 +KPX Yacute Oacute -70 +KPX Yacute Ocircumflex -70 +KPX Yacute Odieresis -70 +KPX Yacute Ograve -70 +KPX Yacute Ohungarumlaut -70 +KPX Yacute Omacron -70 +KPX Yacute Oslash -70 +KPX Yacute Otilde -70 +KPX Yacute a -90 +KPX Yacute aacute -90 +KPX Yacute abreve -90 +KPX Yacute acircumflex -90 +KPX Yacute adieresis -90 +KPX Yacute agrave -90 +KPX Yacute amacron -90 +KPX Yacute aogonek -90 +KPX Yacute aring -90 +KPX Yacute atilde -90 +KPX Yacute colon -50 +KPX Yacute comma -100 +KPX Yacute e -80 +KPX Yacute eacute -80 +KPX Yacute ecaron -80 +KPX Yacute ecircumflex -80 +KPX Yacute edieresis -80 +KPX Yacute edotaccent -80 +KPX Yacute egrave -80 +KPX Yacute emacron -80 +KPX Yacute eogonek -80 +KPX Yacute o -100 +KPX Yacute oacute -100 +KPX Yacute ocircumflex -100 +KPX Yacute odieresis -100 +KPX Yacute ograve -100 +KPX Yacute ohungarumlaut -100 +KPX Yacute omacron -100 +KPX Yacute oslash -100 +KPX Yacute otilde -100 +KPX Yacute period -100 +KPX Yacute semicolon -50 +KPX Yacute u -100 +KPX Yacute uacute -100 +KPX Yacute ucircumflex -100 +KPX Yacute udieresis -100 +KPX Yacute ugrave -100 +KPX Yacute uhungarumlaut -100 +KPX Yacute umacron -100 +KPX Yacute uogonek -100 +KPX Yacute uring -100 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -70 +KPX Ydieresis Oacute -70 +KPX Ydieresis Ocircumflex -70 +KPX Ydieresis Odieresis -70 +KPX Ydieresis Ograve -70 +KPX Ydieresis Ohungarumlaut -70 +KPX Ydieresis Omacron -70 +KPX Ydieresis Oslash -70 +KPX Ydieresis Otilde -70 +KPX Ydieresis a -90 +KPX Ydieresis aacute -90 +KPX Ydieresis abreve -90 +KPX Ydieresis acircumflex -90 +KPX Ydieresis adieresis -90 +KPX Ydieresis agrave -90 +KPX Ydieresis amacron -90 +KPX Ydieresis aogonek -90 +KPX Ydieresis aring -90 +KPX Ydieresis atilde -90 +KPX Ydieresis colon -50 +KPX Ydieresis comma -100 +KPX Ydieresis e -80 +KPX Ydieresis eacute -80 +KPX Ydieresis ecaron -80 +KPX Ydieresis ecircumflex -80 +KPX Ydieresis edieresis -80 +KPX Ydieresis edotaccent -80 +KPX Ydieresis egrave -80 +KPX Ydieresis emacron -80 +KPX Ydieresis eogonek -80 +KPX Ydieresis o -100 +KPX Ydieresis oacute -100 +KPX Ydieresis ocircumflex -100 +KPX Ydieresis odieresis -100 +KPX Ydieresis ograve -100 +KPX Ydieresis ohungarumlaut -100 +KPX Ydieresis omacron -100 +KPX Ydieresis oslash -100 +KPX Ydieresis otilde -100 +KPX Ydieresis period -100 +KPX Ydieresis semicolon -50 +KPX Ydieresis u -100 +KPX Ydieresis uacute -100 +KPX Ydieresis ucircumflex -100 +KPX Ydieresis udieresis -100 +KPX Ydieresis ugrave -100 +KPX Ydieresis uhungarumlaut -100 +KPX Ydieresis umacron -100 +KPX Ydieresis uogonek -100 +KPX Ydieresis uring -100 +KPX a g -10 +KPX a gbreve -10 +KPX a gcommaaccent -10 +KPX a v -15 +KPX a w -15 +KPX a y -20 +KPX a yacute -20 +KPX a ydieresis -20 +KPX aacute g -10 +KPX aacute gbreve -10 +KPX aacute gcommaaccent -10 +KPX aacute v -15 +KPX aacute w -15 +KPX aacute y -20 +KPX aacute yacute -20 +KPX aacute ydieresis -20 +KPX abreve g -10 +KPX abreve gbreve -10 +KPX abreve gcommaaccent -10 +KPX abreve v -15 +KPX abreve w -15 +KPX abreve y -20 +KPX abreve yacute -20 +KPX abreve ydieresis -20 +KPX acircumflex g -10 +KPX acircumflex gbreve -10 +KPX acircumflex gcommaaccent -10 +KPX acircumflex v -15 +KPX acircumflex w -15 +KPX acircumflex y -20 +KPX acircumflex yacute -20 +KPX acircumflex ydieresis -20 +KPX adieresis g -10 +KPX adieresis gbreve -10 +KPX adieresis gcommaaccent -10 +KPX adieresis v -15 +KPX adieresis w -15 +KPX adieresis y -20 +KPX adieresis yacute -20 +KPX adieresis ydieresis -20 +KPX agrave g -10 +KPX agrave gbreve -10 +KPX agrave gcommaaccent -10 +KPX agrave v -15 +KPX agrave w -15 +KPX agrave y -20 +KPX agrave yacute -20 +KPX agrave ydieresis -20 +KPX amacron g -10 +KPX amacron gbreve -10 +KPX amacron gcommaaccent -10 +KPX amacron v -15 +KPX amacron w -15 +KPX amacron y -20 +KPX amacron yacute -20 +KPX amacron ydieresis -20 +KPX aogonek g -10 +KPX aogonek gbreve -10 +KPX aogonek gcommaaccent -10 +KPX aogonek v -15 +KPX aogonek w -15 +KPX aogonek y -20 +KPX aogonek yacute -20 +KPX aogonek ydieresis -20 +KPX aring g -10 +KPX aring gbreve -10 +KPX aring gcommaaccent -10 +KPX aring v -15 +KPX aring w -15 +KPX aring y -20 +KPX aring yacute -20 +KPX aring ydieresis -20 +KPX atilde g -10 +KPX atilde gbreve -10 +KPX atilde gcommaaccent -10 +KPX atilde v -15 +KPX atilde w -15 +KPX atilde y -20 +KPX atilde yacute -20 +KPX atilde ydieresis -20 +KPX b l -10 +KPX b lacute -10 +KPX b lcommaaccent -10 +KPX b lslash -10 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -20 +KPX b y -20 +KPX b yacute -20 +KPX b ydieresis -20 +KPX c h -10 +KPX c k -20 +KPX c kcommaaccent -20 +KPX c l -20 +KPX c lacute -20 +KPX c lcommaaccent -20 +KPX c lslash -20 +KPX c y -10 +KPX c yacute -10 +KPX c ydieresis -10 +KPX cacute h -10 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX cacute l -20 +KPX cacute lacute -20 +KPX cacute lcommaaccent -20 +KPX cacute lslash -20 +KPX cacute y -10 +KPX cacute yacute -10 +KPX cacute ydieresis -10 +KPX ccaron h -10 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccaron l -20 +KPX ccaron lacute -20 +KPX ccaron lcommaaccent -20 +KPX ccaron lslash -20 +KPX ccaron y -10 +KPX ccaron yacute -10 +KPX ccaron ydieresis -10 +KPX ccedilla h -10 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX ccedilla l -20 +KPX ccedilla lacute -20 +KPX ccedilla lcommaaccent -20 +KPX ccedilla lslash -20 +KPX ccedilla y -10 +KPX ccedilla yacute -10 +KPX ccedilla ydieresis -10 +KPX colon space -40 +KPX comma quotedblright -120 +KPX comma quoteright -120 +KPX comma space -40 +KPX d d -10 +KPX d dcroat -10 +KPX d v -15 +KPX d w -15 +KPX d y -15 +KPX d yacute -15 +KPX d ydieresis -15 +KPX dcroat d -10 +KPX dcroat dcroat -10 +KPX dcroat v -15 +KPX dcroat w -15 +KPX dcroat y -15 +KPX dcroat yacute -15 +KPX dcroat ydieresis -15 +KPX e comma 10 +KPX e period 20 +KPX e v -15 +KPX e w -15 +KPX e x -15 +KPX e y -15 +KPX e yacute -15 +KPX e ydieresis -15 +KPX eacute comma 10 +KPX eacute period 20 +KPX eacute v -15 +KPX eacute w -15 +KPX eacute x -15 +KPX eacute y -15 +KPX eacute yacute -15 +KPX eacute ydieresis -15 +KPX ecaron comma 10 +KPX ecaron period 20 +KPX ecaron v -15 +KPX ecaron w -15 +KPX ecaron x -15 +KPX ecaron y -15 +KPX ecaron yacute -15 +KPX ecaron ydieresis -15 +KPX ecircumflex comma 10 +KPX ecircumflex period 20 +KPX ecircumflex v -15 +KPX ecircumflex w -15 +KPX ecircumflex x -15 +KPX ecircumflex y -15 +KPX ecircumflex yacute -15 +KPX ecircumflex ydieresis -15 +KPX edieresis comma 10 +KPX edieresis period 20 +KPX edieresis v -15 +KPX edieresis w -15 +KPX edieresis x -15 +KPX edieresis y -15 +KPX edieresis yacute -15 +KPX edieresis ydieresis -15 +KPX edotaccent comma 10 +KPX edotaccent period 20 +KPX edotaccent v -15 +KPX edotaccent w -15 +KPX edotaccent x -15 +KPX edotaccent y -15 +KPX edotaccent yacute -15 +KPX edotaccent ydieresis -15 +KPX egrave comma 10 +KPX egrave period 20 +KPX egrave v -15 +KPX egrave w -15 +KPX egrave x -15 +KPX egrave y -15 +KPX egrave yacute -15 +KPX egrave ydieresis -15 +KPX emacron comma 10 +KPX emacron period 20 +KPX emacron v -15 +KPX emacron w -15 +KPX emacron x -15 +KPX emacron y -15 +KPX emacron yacute -15 +KPX emacron ydieresis -15 +KPX eogonek comma 10 +KPX eogonek period 20 +KPX eogonek v -15 +KPX eogonek w -15 +KPX eogonek x -15 +KPX eogonek y -15 +KPX eogonek yacute -15 +KPX eogonek ydieresis -15 +KPX f comma -10 +KPX f e -10 +KPX f eacute -10 +KPX f ecaron -10 +KPX f ecircumflex -10 +KPX f edieresis -10 +KPX f edotaccent -10 +KPX f egrave -10 +KPX f emacron -10 +KPX f eogonek -10 +KPX f o -20 +KPX f oacute -20 +KPX f ocircumflex -20 +KPX f odieresis -20 +KPX f ograve -20 +KPX f ohungarumlaut -20 +KPX f omacron -20 +KPX f oslash -20 +KPX f otilde -20 +KPX f period -10 +KPX f quotedblright 30 +KPX f quoteright 30 +KPX g e 10 +KPX g eacute 10 +KPX g ecaron 10 +KPX g ecircumflex 10 +KPX g edieresis 10 +KPX g edotaccent 10 +KPX g egrave 10 +KPX g emacron 10 +KPX g eogonek 10 +KPX g g -10 +KPX g gbreve -10 +KPX g gcommaaccent -10 +KPX gbreve e 10 +KPX gbreve eacute 10 +KPX gbreve ecaron 10 +KPX gbreve ecircumflex 10 +KPX gbreve edieresis 10 +KPX gbreve edotaccent 10 +KPX gbreve egrave 10 +KPX gbreve emacron 10 +KPX gbreve eogonek 10 +KPX gbreve g -10 +KPX gbreve gbreve -10 +KPX gbreve gcommaaccent -10 +KPX gcommaaccent e 10 +KPX gcommaaccent eacute 10 +KPX gcommaaccent ecaron 10 +KPX gcommaaccent ecircumflex 10 +KPX gcommaaccent edieresis 10 +KPX gcommaaccent edotaccent 10 +KPX gcommaaccent egrave 10 +KPX gcommaaccent emacron 10 +KPX gcommaaccent eogonek 10 +KPX gcommaaccent g -10 +KPX gcommaaccent gbreve -10 +KPX gcommaaccent gcommaaccent -10 +KPX h y -20 +KPX h yacute -20 +KPX h ydieresis -20 +KPX k o -15 +KPX k oacute -15 +KPX k ocircumflex -15 +KPX k odieresis -15 +KPX k ograve -15 +KPX k ohungarumlaut -15 +KPX k omacron -15 +KPX k oslash -15 +KPX k otilde -15 +KPX kcommaaccent o -15 +KPX kcommaaccent oacute -15 +KPX kcommaaccent ocircumflex -15 +KPX kcommaaccent odieresis -15 +KPX kcommaaccent ograve -15 +KPX kcommaaccent ohungarumlaut -15 +KPX kcommaaccent omacron -15 +KPX kcommaaccent oslash -15 +KPX kcommaaccent otilde -15 +KPX l w -15 +KPX l y -15 +KPX l yacute -15 +KPX l ydieresis -15 +KPX lacute w -15 +KPX lacute y -15 +KPX lacute yacute -15 +KPX lacute ydieresis -15 +KPX lcommaaccent w -15 +KPX lcommaaccent y -15 +KPX lcommaaccent yacute -15 +KPX lcommaaccent ydieresis -15 +KPX lslash w -15 +KPX lslash y -15 +KPX lslash yacute -15 +KPX lslash ydieresis -15 +KPX m u -20 +KPX m uacute -20 +KPX m ucircumflex -20 +KPX m udieresis -20 +KPX m ugrave -20 +KPX m uhungarumlaut -20 +KPX m umacron -20 +KPX m uogonek -20 +KPX m uring -20 +KPX m y -30 +KPX m yacute -30 +KPX m ydieresis -30 +KPX n u -10 +KPX n uacute -10 +KPX n ucircumflex -10 +KPX n udieresis -10 +KPX n ugrave -10 +KPX n uhungarumlaut -10 +KPX n umacron -10 +KPX n uogonek -10 +KPX n uring -10 +KPX n v -40 +KPX n y -20 +KPX n yacute -20 +KPX n ydieresis -20 +KPX nacute u -10 +KPX nacute uacute -10 +KPX nacute ucircumflex -10 +KPX nacute udieresis -10 +KPX nacute ugrave -10 +KPX nacute uhungarumlaut -10 +KPX nacute umacron -10 +KPX nacute uogonek -10 +KPX nacute uring -10 +KPX nacute v -40 +KPX nacute y -20 +KPX nacute yacute -20 +KPX nacute ydieresis -20 +KPX ncaron u -10 +KPX ncaron uacute -10 +KPX ncaron ucircumflex -10 +KPX ncaron udieresis -10 +KPX ncaron ugrave -10 +KPX ncaron uhungarumlaut -10 +KPX ncaron umacron -10 +KPX ncaron uogonek -10 +KPX ncaron uring -10 +KPX ncaron v -40 +KPX ncaron y -20 +KPX ncaron yacute -20 +KPX ncaron ydieresis -20 +KPX ncommaaccent u -10 +KPX ncommaaccent uacute -10 +KPX ncommaaccent ucircumflex -10 +KPX ncommaaccent udieresis -10 +KPX ncommaaccent ugrave -10 +KPX ncommaaccent uhungarumlaut -10 +KPX ncommaaccent umacron -10 +KPX ncommaaccent uogonek -10 +KPX ncommaaccent uring -10 +KPX ncommaaccent v -40 +KPX ncommaaccent y -20 +KPX ncommaaccent yacute -20 +KPX ncommaaccent ydieresis -20 +KPX ntilde u -10 +KPX ntilde uacute -10 +KPX ntilde ucircumflex -10 +KPX ntilde udieresis -10 +KPX ntilde ugrave -10 +KPX ntilde uhungarumlaut -10 +KPX ntilde umacron -10 +KPX ntilde uogonek -10 +KPX ntilde uring -10 +KPX ntilde v -40 +KPX ntilde y -20 +KPX ntilde yacute -20 +KPX ntilde ydieresis -20 +KPX o v -20 +KPX o w -15 +KPX o x -30 +KPX o y -20 +KPX o yacute -20 +KPX o ydieresis -20 +KPX oacute v -20 +KPX oacute w -15 +KPX oacute x -30 +KPX oacute y -20 +KPX oacute yacute -20 +KPX oacute ydieresis -20 +KPX ocircumflex v -20 +KPX ocircumflex w -15 +KPX ocircumflex x -30 +KPX ocircumflex y -20 +KPX ocircumflex yacute -20 +KPX ocircumflex ydieresis -20 +KPX odieresis v -20 +KPX odieresis w -15 +KPX odieresis x -30 +KPX odieresis y -20 +KPX odieresis yacute -20 +KPX odieresis ydieresis -20 +KPX ograve v -20 +KPX ograve w -15 +KPX ograve x -30 +KPX ograve y -20 +KPX ograve yacute -20 +KPX ograve ydieresis -20 +KPX ohungarumlaut v -20 +KPX ohungarumlaut w -15 +KPX ohungarumlaut x -30 +KPX ohungarumlaut y -20 +KPX ohungarumlaut yacute -20 +KPX ohungarumlaut ydieresis -20 +KPX omacron v -20 +KPX omacron w -15 +KPX omacron x -30 +KPX omacron y -20 +KPX omacron yacute -20 +KPX omacron ydieresis -20 +KPX oslash v -20 +KPX oslash w -15 +KPX oslash x -30 +KPX oslash y -20 +KPX oslash yacute -20 +KPX oslash ydieresis -20 +KPX otilde v -20 +KPX otilde w -15 +KPX otilde x -30 +KPX otilde y -20 +KPX otilde yacute -20 +KPX otilde ydieresis -20 +KPX p y -15 +KPX p yacute -15 +KPX p ydieresis -15 +KPX period quotedblright -120 +KPX period quoteright -120 +KPX period space -40 +KPX quotedblright space -80 +KPX quoteleft quoteleft -46 +KPX quoteright d -80 +KPX quoteright dcroat -80 +KPX quoteright l -20 +KPX quoteright lacute -20 +KPX quoteright lcommaaccent -20 +KPX quoteright lslash -20 +KPX quoteright quoteright -46 +KPX quoteright r -40 +KPX quoteright racute -40 +KPX quoteright rcaron -40 +KPX quoteright rcommaaccent -40 +KPX quoteright s -60 +KPX quoteright sacute -60 +KPX quoteright scaron -60 +KPX quoteright scedilla -60 +KPX quoteright scommaaccent -60 +KPX quoteright space -80 +KPX quoteright v -20 +KPX r c -20 +KPX r cacute -20 +KPX r ccaron -20 +KPX r ccedilla -20 +KPX r comma -60 +KPX r d -20 +KPX r dcroat -20 +KPX r g -15 +KPX r gbreve -15 +KPX r gcommaaccent -15 +KPX r hyphen -20 +KPX r o -20 +KPX r oacute -20 +KPX r ocircumflex -20 +KPX r odieresis -20 +KPX r ograve -20 +KPX r ohungarumlaut -20 +KPX r omacron -20 +KPX r oslash -20 +KPX r otilde -20 +KPX r period -60 +KPX r q -20 +KPX r s -15 +KPX r sacute -15 +KPX r scaron -15 +KPX r scedilla -15 +KPX r scommaaccent -15 +KPX r t 20 +KPX r tcommaaccent 20 +KPX r v 10 +KPX r y 10 +KPX r yacute 10 +KPX r ydieresis 10 +KPX racute c -20 +KPX racute cacute -20 +KPX racute ccaron -20 +KPX racute ccedilla -20 +KPX racute comma -60 +KPX racute d -20 +KPX racute dcroat -20 +KPX racute g -15 +KPX racute gbreve -15 +KPX racute gcommaaccent -15 +KPX racute hyphen -20 +KPX racute o -20 +KPX racute oacute -20 +KPX racute ocircumflex -20 +KPX racute odieresis -20 +KPX racute ograve -20 +KPX racute ohungarumlaut -20 +KPX racute omacron -20 +KPX racute oslash -20 +KPX racute otilde -20 +KPX racute period -60 +KPX racute q -20 +KPX racute s -15 +KPX racute sacute -15 +KPX racute scaron -15 +KPX racute scedilla -15 +KPX racute scommaaccent -15 +KPX racute t 20 +KPX racute tcommaaccent 20 +KPX racute v 10 +KPX racute y 10 +KPX racute yacute 10 +KPX racute ydieresis 10 +KPX rcaron c -20 +KPX rcaron cacute -20 +KPX rcaron ccaron -20 +KPX rcaron ccedilla -20 +KPX rcaron comma -60 +KPX rcaron d -20 +KPX rcaron dcroat -20 +KPX rcaron g -15 +KPX rcaron gbreve -15 +KPX rcaron gcommaaccent -15 +KPX rcaron hyphen -20 +KPX rcaron o -20 +KPX rcaron oacute -20 +KPX rcaron ocircumflex -20 +KPX rcaron odieresis -20 +KPX rcaron ograve -20 +KPX rcaron ohungarumlaut -20 +KPX rcaron omacron -20 +KPX rcaron oslash -20 +KPX rcaron otilde -20 +KPX rcaron period -60 +KPX rcaron q -20 +KPX rcaron s -15 +KPX rcaron sacute -15 +KPX rcaron scaron -15 +KPX rcaron scedilla -15 +KPX rcaron scommaaccent -15 +KPX rcaron t 20 +KPX rcaron tcommaaccent 20 +KPX rcaron v 10 +KPX rcaron y 10 +KPX rcaron yacute 10 +KPX rcaron ydieresis 10 +KPX rcommaaccent c -20 +KPX rcommaaccent cacute -20 +KPX rcommaaccent ccaron -20 +KPX rcommaaccent ccedilla -20 +KPX rcommaaccent comma -60 +KPX rcommaaccent d -20 +KPX rcommaaccent dcroat -20 +KPX rcommaaccent g -15 +KPX rcommaaccent gbreve -15 +KPX rcommaaccent gcommaaccent -15 +KPX rcommaaccent hyphen -20 +KPX rcommaaccent o -20 +KPX rcommaaccent oacute -20 +KPX rcommaaccent ocircumflex -20 +KPX rcommaaccent odieresis -20 +KPX rcommaaccent ograve -20 +KPX rcommaaccent ohungarumlaut -20 +KPX rcommaaccent omacron -20 +KPX rcommaaccent oslash -20 +KPX rcommaaccent otilde -20 +KPX rcommaaccent period -60 +KPX rcommaaccent q -20 +KPX rcommaaccent s -15 +KPX rcommaaccent sacute -15 +KPX rcommaaccent scaron -15 +KPX rcommaaccent scedilla -15 +KPX rcommaaccent scommaaccent -15 +KPX rcommaaccent t 20 +KPX rcommaaccent tcommaaccent 20 +KPX rcommaaccent v 10 +KPX rcommaaccent y 10 +KPX rcommaaccent yacute 10 +KPX rcommaaccent ydieresis 10 +KPX s w -15 +KPX sacute w -15 +KPX scaron w -15 +KPX scedilla w -15 +KPX scommaaccent w -15 +KPX semicolon space -40 +KPX space T -100 +KPX space Tcaron -100 +KPX space Tcommaaccent -100 +KPX space V -80 +KPX space W -80 +KPX space Y -120 +KPX space Yacute -120 +KPX space Ydieresis -120 +KPX space quotedblleft -80 +KPX space quoteleft -60 +KPX v a -20 +KPX v aacute -20 +KPX v abreve -20 +KPX v acircumflex -20 +KPX v adieresis -20 +KPX v agrave -20 +KPX v amacron -20 +KPX v aogonek -20 +KPX v aring -20 +KPX v atilde -20 +KPX v comma -80 +KPX v o -30 +KPX v oacute -30 +KPX v ocircumflex -30 +KPX v odieresis -30 +KPX v ograve -30 +KPX v ohungarumlaut -30 +KPX v omacron -30 +KPX v oslash -30 +KPX v otilde -30 +KPX v period -80 +KPX w comma -40 +KPX w o -20 +KPX w oacute -20 +KPX w ocircumflex -20 +KPX w odieresis -20 +KPX w ograve -20 +KPX w ohungarumlaut -20 +KPX w omacron -20 +KPX w oslash -20 +KPX w otilde -20 +KPX w period -40 +KPX x e -10 +KPX x eacute -10 +KPX x ecaron -10 +KPX x ecircumflex -10 +KPX x edieresis -10 +KPX x edotaccent -10 +KPX x egrave -10 +KPX x emacron -10 +KPX x eogonek -10 +KPX y a -30 +KPX y aacute -30 +KPX y abreve -30 +KPX y acircumflex -30 +KPX y adieresis -30 +KPX y agrave -30 +KPX y amacron -30 +KPX y aogonek -30 +KPX y aring -30 +KPX y atilde -30 +KPX y comma -80 +KPX y e -10 +KPX y eacute -10 +KPX y ecaron -10 +KPX y ecircumflex -10 +KPX y edieresis -10 +KPX y edotaccent -10 +KPX y egrave -10 +KPX y emacron -10 +KPX y eogonek -10 +KPX y o -25 +KPX y oacute -25 +KPX y ocircumflex -25 +KPX y odieresis -25 +KPX y ograve -25 +KPX y ohungarumlaut -25 +KPX y omacron -25 +KPX y oslash -25 +KPX y otilde -25 +KPX y period -80 +KPX yacute a -30 +KPX yacute aacute -30 +KPX yacute abreve -30 +KPX yacute acircumflex -30 +KPX yacute adieresis -30 +KPX yacute agrave -30 +KPX yacute amacron -30 +KPX yacute aogonek -30 +KPX yacute aring -30 +KPX yacute atilde -30 +KPX yacute comma -80 +KPX yacute e -10 +KPX yacute eacute -10 +KPX yacute ecaron -10 +KPX yacute ecircumflex -10 +KPX yacute edieresis -10 +KPX yacute edotaccent -10 +KPX yacute egrave -10 +KPX yacute emacron -10 +KPX yacute eogonek -10 +KPX yacute o -25 +KPX yacute oacute -25 +KPX yacute ocircumflex -25 +KPX yacute odieresis -25 +KPX yacute ograve -25 +KPX yacute ohungarumlaut -25 +KPX yacute omacron -25 +KPX yacute oslash -25 +KPX yacute otilde -25 +KPX yacute period -80 +KPX ydieresis a -30 +KPX ydieresis aacute -30 +KPX ydieresis abreve -30 +KPX ydieresis acircumflex -30 +KPX ydieresis adieresis -30 +KPX ydieresis agrave -30 +KPX ydieresis amacron -30 +KPX ydieresis aogonek -30 +KPX ydieresis aring -30 +KPX ydieresis atilde -30 +KPX ydieresis comma -80 +KPX ydieresis e -10 +KPX ydieresis eacute -10 +KPX ydieresis ecaron -10 +KPX ydieresis ecircumflex -10 +KPX ydieresis edieresis -10 +KPX ydieresis edotaccent -10 +KPX ydieresis egrave -10 +KPX ydieresis emacron -10 +KPX ydieresis eogonek -10 +KPX ydieresis o -25 +KPX ydieresis oacute -25 +KPX ydieresis ocircumflex -25 +KPX ydieresis odieresis -25 +KPX ydieresis ograve -25 +KPX ydieresis ohungarumlaut -25 +KPX ydieresis omacron -25 +KPX ydieresis oslash -25 +KPX ydieresis otilde -25 +KPX ydieresis period -80 +KPX z e 10 +KPX z eacute 10 +KPX z ecaron 10 +KPX z ecircumflex 10 +KPX z edieresis 10 +KPX z edotaccent 10 +KPX z egrave 10 +KPX z emacron 10 +KPX z eogonek 10 +KPX zacute e 10 +KPX zacute eacute 10 +KPX zacute ecaron 10 +KPX zacute ecircumflex 10 +KPX zacute edieresis 10 +KPX zacute edotaccent 10 +KPX zacute egrave 10 +KPX zacute emacron 10 +KPX zacute eogonek 10 +KPX zcaron e 10 +KPX zcaron eacute 10 +KPX zcaron ecaron 10 +KPX zcaron ecircumflex 10 +KPX zcaron edieresis 10 +KPX zcaron edotaccent 10 +KPX zcaron egrave 10 +KPX zcaron emacron 10 +KPX zcaron eogonek 10 +KPX zdotaccent e 10 +KPX zdotaccent eacute 10 +KPX zdotaccent ecaron 10 +KPX zdotaccent ecircumflex 10 +KPX zdotaccent edieresis 10 +KPX zdotaccent edotaccent 10 +KPX zdotaccent egrave 10 +KPX zdotaccent emacron 10 +KPX zdotaccent eogonek 10 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/Helvetica-Oblique.afm b/dompdf/vendor/dompdf/dompdf/lib/fonts/Helvetica-Oblique.afm new file mode 100644 index 0000000..e7beaf0 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/Helvetica-Oblique.afm @@ -0,0 +1,3053 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:44:31 1997 +Comment UniqueID 43055 +Comment VMusage 14960 69346 +FontName Helvetica-Oblique +FullName Helvetica Oblique +FamilyName Helvetica +Weight Medium +ItalicAngle -12 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -170 -225 1116 931 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 718 +XHeight 523 +Ascender 718 +Descender -207 +StdHW 76 +StdVW 88 +StartCharMetrics 317 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 160 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 278 ; N exclam ; B 90 0 340 718 ; +C 34 ; WX 355 ; N quotedbl ; B 168 463 438 718 ; +C 35 ; WX 556 ; N numbersign ; B 73 0 631 688 ; +C 36 ; WX 556 ; N dollar ; B 69 -115 617 775 ; +C 37 ; WX 889 ; N percent ; B 147 -19 889 703 ; +C 38 ; WX 667 ; N ampersand ; B 77 -15 647 718 ; +C 146 ; WX 222 ; N quoteright ; B 151 463 310 718 ; +C 40 ; WX 333 ; N parenleft ; B 108 -207 454 733 ; +C 41 ; WX 333 ; N parenright ; B -9 -207 337 733 ; +C 42 ; WX 389 ; N asterisk ; B 165 431 475 718 ; +C 43 ; WX 584 ; N plus ; B 85 0 606 505 ; +C 44 ; WX 278 ; N comma ; B 56 -147 214 106 ; +C 45 ; WX 333 ; N hyphen ; B 93 232 357 322 ; +C 173 ; WX 333 ; N hyphen ; B 44 232 289 322 ; +C 46 ; WX 278 ; N period ; B 87 0 214 106 ; +C 47 ; WX 278 ; N slash ; B -21 -19 452 737 ; +C 48 ; WX 556 ; N zero ; B 93 -19 608 703 ; +C 49 ; WX 556 ; N one ; B 207 0 508 703 ; +C 50 ; WX 556 ; N two ; B 26 0 617 703 ; +C 51 ; WX 556 ; N three ; B 75 -19 610 703 ; +C 52 ; WX 556 ; N four ; B 61 0 576 703 ; +C 53 ; WX 556 ; N five ; B 68 -19 621 688 ; +C 54 ; WX 556 ; N six ; B 91 -19 615 703 ; +C 55 ; WX 556 ; N seven ; B 137 0 669 688 ; +C 56 ; WX 556 ; N eight ; B 74 -19 607 703 ; +C 57 ; WX 556 ; N nine ; B 82 -19 609 703 ; +C 58 ; WX 278 ; N colon ; B 87 0 301 516 ; +C 59 ; WX 278 ; N semicolon ; B 56 -147 301 516 ; +C 60 ; WX 584 ; N less ; B 94 11 641 495 ; +C 61 ; WX 584 ; N equal ; B 63 115 628 390 ; +C 62 ; WX 584 ; N greater ; B 50 11 597 495 ; +C 63 ; WX 556 ; N question ; B 161 0 610 727 ; +C 64 ; WX 1015 ; N at ; B 215 -19 965 737 ; +C 65 ; WX 667 ; N A ; B 14 0 654 718 ; +C 66 ; WX 667 ; N B ; B 74 0 712 718 ; +C 67 ; WX 722 ; N C ; B 108 -19 782 737 ; +C 68 ; WX 722 ; N D ; B 81 0 764 718 ; +C 69 ; WX 667 ; N E ; B 86 0 762 718 ; +C 70 ; WX 611 ; N F ; B 86 0 736 718 ; +C 71 ; WX 778 ; N G ; B 111 -19 799 737 ; +C 72 ; WX 722 ; N H ; B 77 0 799 718 ; +C 73 ; WX 278 ; N I ; B 91 0 341 718 ; +C 74 ; WX 500 ; N J ; B 47 -19 581 718 ; +C 75 ; WX 667 ; N K ; B 76 0 808 718 ; +C 76 ; WX 556 ; N L ; B 76 0 555 718 ; +C 77 ; WX 833 ; N M ; B 73 0 914 718 ; +C 78 ; WX 722 ; N N ; B 76 0 799 718 ; +C 79 ; WX 778 ; N O ; B 105 -19 826 737 ; +C 80 ; WX 667 ; N P ; B 86 0 737 718 ; +C 81 ; WX 778 ; N Q ; B 105 -56 826 737 ; +C 82 ; WX 722 ; N R ; B 88 0 773 718 ; +C 83 ; WX 667 ; N S ; B 90 -19 713 737 ; +C 84 ; WX 611 ; N T ; B 148 0 750 718 ; +C 85 ; WX 722 ; N U ; B 123 -19 797 718 ; +C 86 ; WX 667 ; N V ; B 173 0 800 718 ; +C 87 ; WX 944 ; N W ; B 169 0 1081 718 ; +C 88 ; WX 667 ; N X ; B 19 0 790 718 ; +C 89 ; WX 667 ; N Y ; B 167 0 806 718 ; +C 90 ; WX 611 ; N Z ; B 23 0 741 718 ; +C 91 ; WX 278 ; N bracketleft ; B 21 -196 403 722 ; +C 92 ; WX 278 ; N backslash ; B 140 -19 291 737 ; +C 93 ; WX 278 ; N bracketright ; B -14 -196 368 722 ; +C 94 ; WX 469 ; N asciicircum ; B 42 264 539 688 ; +C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ; +C 145 ; WX 222 ; N quoteleft ; B 165 470 323 725 ; +C 97 ; WX 556 ; N a ; B 61 -15 559 538 ; +C 98 ; WX 556 ; N b ; B 58 -15 584 718 ; +C 99 ; WX 500 ; N c ; B 74 -15 553 538 ; +C 100 ; WX 556 ; N d ; B 84 -15 652 718 ; +C 101 ; WX 556 ; N e ; B 84 -15 578 538 ; +C 102 ; WX 278 ; N f ; B 86 0 416 728 ; L i fi ; L l fl ; +C 103 ; WX 556 ; N g ; B 42 -220 610 538 ; +C 104 ; WX 556 ; N h ; B 65 0 573 718 ; +C 105 ; WX 222 ; N i ; B 67 0 308 718 ; +C 106 ; WX 222 ; N j ; B -60 -210 308 718 ; +C 107 ; WX 500 ; N k ; B 67 0 600 718 ; +C 108 ; WX 222 ; N l ; B 67 0 308 718 ; +C 109 ; WX 833 ; N m ; B 65 0 852 538 ; +C 110 ; WX 556 ; N n ; B 65 0 573 538 ; +C 111 ; WX 556 ; N o ; B 83 -14 585 538 ; +C 112 ; WX 556 ; N p ; B 14 -207 584 538 ; +C 113 ; WX 556 ; N q ; B 84 -207 605 538 ; +C 114 ; WX 333 ; N r ; B 77 0 446 538 ; +C 115 ; WX 500 ; N s ; B 63 -15 529 538 ; +C 116 ; WX 278 ; N t ; B 102 -7 368 669 ; +C 117 ; WX 556 ; N u ; B 94 -15 600 523 ; +C 118 ; WX 500 ; N v ; B 119 0 603 523 ; +C 119 ; WX 722 ; N w ; B 125 0 820 523 ; +C 120 ; WX 500 ; N x ; B 11 0 594 523 ; +C 121 ; WX 500 ; N y ; B 15 -214 600 523 ; +C 122 ; WX 500 ; N z ; B 31 0 571 523 ; +C 123 ; WX 334 ; N braceleft ; B 92 -196 445 722 ; +C 124 ; WX 260 ; N bar ; B 46 -225 332 775 ; +C 125 ; WX 334 ; N braceright ; B 0 -196 354 722 ; +C 126 ; WX 584 ; N asciitilde ; B 111 180 580 326 ; +C 161 ; WX 333 ; N exclamdown ; B 77 -195 326 523 ; +C 162 ; WX 556 ; N cent ; B 95 -115 584 623 ; +C 163 ; WX 556 ; N sterling ; B 49 -16 634 718 ; +C -1 ; WX 167 ; N fraction ; B -170 -19 482 703 ; +C 165 ; WX 556 ; N yen ; B 81 0 699 688 ; +C 131 ; WX 556 ; N florin ; B -52 -207 654 737 ; +C 167 ; WX 556 ; N section ; B 76 -191 584 737 ; +C 164 ; WX 556 ; N currency ; B 60 99 646 603 ; +C 39 ; WX 191 ; N quotesingle ; B 157 463 285 718 ; +C 147 ; WX 333 ; N quotedblleft ; B 138 470 461 725 ; +C 171 ; WX 556 ; N guillemotleft ; B 146 108 554 446 ; +C 139 ; WX 333 ; N guilsinglleft ; B 137 108 340 446 ; +C 155 ; WX 333 ; N guilsinglright ; B 111 108 314 446 ; +C -1 ; WX 500 ; N fi ; B 86 0 587 728 ; +C -1 ; WX 500 ; N fl ; B 86 0 585 728 ; +C 150 ; WX 556 ; N endash ; B 51 240 623 313 ; +C 134 ; WX 556 ; N dagger ; B 135 -159 622 718 ; +C 135 ; WX 556 ; N daggerdbl ; B 52 -159 623 718 ; +C 183 ; WX 278 ; N periodcentered ; B 129 190 257 315 ; +C 182 ; WX 537 ; N paragraph ; B 126 -173 650 718 ; +C 149 ; WX 350 ; N bullet ; B 91 202 413 517 ; +C 130 ; WX 222 ; N quotesinglbase ; B 21 -149 180 106 ; +C 132 ; WX 333 ; N quotedblbase ; B -6 -149 318 106 ; +C 148 ; WX 333 ; N quotedblright ; B 124 463 448 718 ; +C 187 ; WX 556 ; N guillemotright ; B 120 108 528 446 ; +C 133 ; WX 1000 ; N ellipsis ; B 115 0 908 106 ; +C 137 ; WX 1000 ; N perthousand ; B 88 -19 1029 703 ; +C 191 ; WX 611 ; N questiondown ; B 85 -201 534 525 ; +C 96 ; WX 333 ; N grave ; B 170 593 337 734 ; +C 180 ; WX 333 ; N acute ; B 248 593 475 734 ; +C 136 ; WX 333 ; N circumflex ; B 147 593 438 734 ; +C 152 ; WX 333 ; N tilde ; B 125 606 490 722 ; +C 175 ; WX 333 ; N macron ; B 143 627 468 684 ; +C -1 ; WX 333 ; N breve ; B 167 595 476 731 ; +C -1 ; WX 333 ; N dotaccent ; B 249 604 362 706 ; +C 168 ; WX 333 ; N dieresis ; B 168 604 443 706 ; +C -1 ; WX 333 ; N ring ; B 214 572 402 756 ; +C 184 ; WX 333 ; N cedilla ; B 2 -225 232 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B 157 593 565 734 ; +C -1 ; WX 333 ; N ogonek ; B 43 -225 249 0 ; +C -1 ; WX 333 ; N caron ; B 177 593 468 734 ; +C 151 ; WX 1000 ; N emdash ; B 51 240 1067 313 ; +C 198 ; WX 1000 ; N AE ; B 8 0 1097 718 ; +C 170 ; WX 370 ; N ordfeminine ; B 127 405 449 737 ; +C -1 ; WX 556 ; N Lslash ; B 41 0 555 718 ; +C 216 ; WX 778 ; N Oslash ; B 43 -19 890 737 ; +C 140 ; WX 1000 ; N OE ; B 98 -19 1116 737 ; +C 186 ; WX 365 ; N ordmasculine ; B 141 405 468 737 ; +C 230 ; WX 889 ; N ae ; B 61 -15 909 538 ; +C -1 ; WX 278 ; N dotlessi ; B 95 0 294 523 ; +C -1 ; WX 222 ; N lslash ; B 41 0 347 718 ; +C 248 ; WX 611 ; N oslash ; B 29 -22 647 545 ; +C 156 ; WX 944 ; N oe ; B 83 -15 964 538 ; +C 223 ; WX 611 ; N germandbls ; B 67 -15 658 728 ; +C 207 ; WX 278 ; N Idieresis ; B 91 0 458 901 ; +C 233 ; WX 556 ; N eacute ; B 84 -15 587 734 ; +C -1 ; WX 556 ; N abreve ; B 61 -15 578 731 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 94 -15 677 734 ; +C -1 ; WX 556 ; N ecaron ; B 84 -15 580 734 ; +C 159 ; WX 667 ; N Ydieresis ; B 167 0 806 901 ; +C 247 ; WX 584 ; N divide ; B 85 -19 606 524 ; +C 221 ; WX 667 ; N Yacute ; B 167 0 806 929 ; +C 194 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ; +C 225 ; WX 556 ; N aacute ; B 61 -15 587 734 ; +C 219 ; WX 722 ; N Ucircumflex ; B 123 -19 797 929 ; +C 253 ; WX 500 ; N yacute ; B 15 -214 600 734 ; +C -1 ; WX 500 ; N scommaaccent ; B 63 -225 529 538 ; +C 234 ; WX 556 ; N ecircumflex ; B 84 -15 578 734 ; +C -1 ; WX 722 ; N Uring ; B 123 -19 797 931 ; +C 220 ; WX 722 ; N Udieresis ; B 123 -19 797 901 ; +C -1 ; WX 556 ; N aogonek ; B 61 -220 559 538 ; +C 218 ; WX 722 ; N Uacute ; B 123 -19 797 929 ; +C -1 ; WX 556 ; N uogonek ; B 94 -225 600 523 ; +C 203 ; WX 667 ; N Edieresis ; B 86 0 762 901 ; +C -1 ; WX 722 ; N Dcroat ; B 69 0 764 718 ; +C -1 ; WX 250 ; N commaaccent ; B 39 -225 172 -40 ; +C 169 ; WX 737 ; N copyright ; B 54 -19 837 737 ; +C -1 ; WX 667 ; N Emacron ; B 86 0 762 879 ; +C -1 ; WX 500 ; N ccaron ; B 74 -15 553 734 ; +C 229 ; WX 556 ; N aring ; B 61 -15 559 756 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 799 718 ; +C -1 ; WX 222 ; N lacute ; B 67 0 461 929 ; +C 224 ; WX 556 ; N agrave ; B 61 -15 559 734 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 148 -225 750 718 ; +C -1 ; WX 722 ; N Cacute ; B 108 -19 782 929 ; +C 227 ; WX 556 ; N atilde ; B 61 -15 592 722 ; +C -1 ; WX 667 ; N Edotaccent ; B 86 0 762 901 ; +C 154 ; WX 500 ; N scaron ; B 63 -15 552 734 ; +C -1 ; WX 500 ; N scedilla ; B 63 -225 529 538 ; +C 237 ; WX 278 ; N iacute ; B 95 0 448 734 ; +C -1 ; WX 471 ; N lozenge ; B 88 0 540 728 ; +C -1 ; WX 722 ; N Rcaron ; B 88 0 773 929 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 111 -225 799 737 ; +C 251 ; WX 556 ; N ucircumflex ; B 94 -15 600 734 ; +C 226 ; WX 556 ; N acircumflex ; B 61 -15 559 734 ; +C -1 ; WX 667 ; N Amacron ; B 14 0 677 879 ; +C -1 ; WX 333 ; N rcaron ; B 77 0 508 734 ; +C 231 ; WX 500 ; N ccedilla ; B 74 -225 553 538 ; +C -1 ; WX 611 ; N Zdotaccent ; B 23 0 741 901 ; +C 222 ; WX 667 ; N Thorn ; B 86 0 712 718 ; +C -1 ; WX 778 ; N Omacron ; B 105 -19 826 879 ; +C -1 ; WX 722 ; N Racute ; B 88 0 773 929 ; +C -1 ; WX 667 ; N Sacute ; B 90 -19 713 929 ; +C -1 ; WX 643 ; N dcaron ; B 84 -15 808 718 ; +C -1 ; WX 722 ; N Umacron ; B 123 -19 797 879 ; +C -1 ; WX 556 ; N uring ; B 94 -15 600 756 ; +C 179 ; WX 333 ; N threesuperior ; B 90 270 436 703 ; +C 210 ; WX 778 ; N Ograve ; B 105 -19 826 929 ; +C 192 ; WX 667 ; N Agrave ; B 14 0 654 929 ; +C -1 ; WX 667 ; N Abreve ; B 14 0 685 926 ; +C 215 ; WX 584 ; N multiply ; B 50 0 642 506 ; +C 250 ; WX 556 ; N uacute ; B 94 -15 600 734 ; +C -1 ; WX 611 ; N Tcaron ; B 148 0 750 929 ; +C -1 ; WX 476 ; N partialdiff ; B 41 -38 550 714 ; +C 255 ; WX 500 ; N ydieresis ; B 15 -214 600 706 ; +C -1 ; WX 722 ; N Nacute ; B 76 0 799 929 ; +C 238 ; WX 278 ; N icircumflex ; B 95 0 411 734 ; +C 202 ; WX 667 ; N Ecircumflex ; B 86 0 762 929 ; +C 228 ; WX 556 ; N adieresis ; B 61 -15 559 706 ; +C 235 ; WX 556 ; N edieresis ; B 84 -15 578 706 ; +C -1 ; WX 500 ; N cacute ; B 74 -15 559 734 ; +C -1 ; WX 556 ; N nacute ; B 65 0 587 734 ; +C -1 ; WX 556 ; N umacron ; B 94 -15 600 684 ; +C -1 ; WX 722 ; N Ncaron ; B 76 0 799 929 ; +C 205 ; WX 278 ; N Iacute ; B 91 0 489 929 ; +C 177 ; WX 584 ; N plusminus ; B 39 0 618 506 ; +C 166 ; WX 260 ; N brokenbar ; B 62 -150 316 700 ; +C 174 ; WX 737 ; N registered ; B 54 -19 837 737 ; +C -1 ; WX 778 ; N Gbreve ; B 111 -19 799 926 ; +C -1 ; WX 278 ; N Idotaccent ; B 91 0 377 901 ; +C -1 ; WX 600 ; N summation ; B 15 -10 671 706 ; +C 200 ; WX 667 ; N Egrave ; B 86 0 762 929 ; +C -1 ; WX 333 ; N racute ; B 77 0 475 734 ; +C -1 ; WX 556 ; N omacron ; B 83 -14 585 684 ; +C -1 ; WX 611 ; N Zacute ; B 23 0 741 929 ; +C 142 ; WX 611 ; N Zcaron ; B 23 0 741 929 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 620 674 ; +C 208 ; WX 722 ; N Eth ; B 69 0 764 718 ; +C 199 ; WX 722 ; N Ccedilla ; B 108 -225 782 737 ; +C -1 ; WX 222 ; N lcommaaccent ; B 25 -225 308 718 ; +C -1 ; WX 317 ; N tcaron ; B 102 -7 501 808 ; +C -1 ; WX 556 ; N eogonek ; B 84 -225 578 538 ; +C -1 ; WX 722 ; N Uogonek ; B 123 -225 797 718 ; +C 193 ; WX 667 ; N Aacute ; B 14 0 683 929 ; +C 196 ; WX 667 ; N Adieresis ; B 14 0 654 901 ; +C 232 ; WX 556 ; N egrave ; B 84 -15 578 734 ; +C -1 ; WX 500 ; N zacute ; B 31 0 571 734 ; +C -1 ; WX 222 ; N iogonek ; B -61 -225 308 718 ; +C 211 ; WX 778 ; N Oacute ; B 105 -19 826 929 ; +C 243 ; WX 556 ; N oacute ; B 83 -14 587 734 ; +C -1 ; WX 556 ; N amacron ; B 61 -15 580 684 ; +C -1 ; WX 500 ; N sacute ; B 63 -15 559 734 ; +C 239 ; WX 278 ; N idieresis ; B 95 0 416 706 ; +C 212 ; WX 778 ; N Ocircumflex ; B 105 -19 826 929 ; +C 217 ; WX 722 ; N Ugrave ; B 123 -19 797 929 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 556 ; N thorn ; B 14 -207 584 718 ; +C 178 ; WX 333 ; N twosuperior ; B 64 281 449 703 ; +C 214 ; WX 778 ; N Odieresis ; B 105 -19 826 901 ; +C 181 ; WX 556 ; N mu ; B 24 -207 600 523 ; +C 236 ; WX 278 ; N igrave ; B 95 0 310 734 ; +C -1 ; WX 556 ; N ohungarumlaut ; B 83 -14 677 734 ; +C -1 ; WX 667 ; N Eogonek ; B 86 -220 762 718 ; +C -1 ; WX 556 ; N dcroat ; B 84 -15 689 718 ; +C 190 ; WX 834 ; N threequarters ; B 130 -19 861 703 ; +C -1 ; WX 667 ; N Scedilla ; B 90 -225 713 737 ; +C -1 ; WX 299 ; N lcaron ; B 67 0 464 718 ; +C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 808 718 ; +C -1 ; WX 556 ; N Lacute ; B 76 0 555 929 ; +C 153 ; WX 1000 ; N trademark ; B 186 306 1056 718 ; +C -1 ; WX 556 ; N edotaccent ; B 84 -15 578 706 ; +C 204 ; WX 278 ; N Igrave ; B 91 0 351 929 ; +C -1 ; WX 278 ; N Imacron ; B 91 0 483 879 ; +C -1 ; WX 556 ; N Lcaron ; B 76 0 570 718 ; +C 189 ; WX 834 ; N onehalf ; B 114 -19 839 703 ; +C -1 ; WX 549 ; N lessequal ; B 26 0 666 674 ; +C 244 ; WX 556 ; N ocircumflex ; B 83 -14 585 734 ; +C 241 ; WX 556 ; N ntilde ; B 65 0 592 722 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 123 -19 801 929 ; +C 201 ; WX 667 ; N Eacute ; B 86 0 762 929 ; +C -1 ; WX 556 ; N emacron ; B 84 -15 580 684 ; +C -1 ; WX 556 ; N gbreve ; B 42 -220 610 731 ; +C 188 ; WX 834 ; N onequarter ; B 150 -19 802 703 ; +C 138 ; WX 667 ; N Scaron ; B 90 -19 713 929 ; +C -1 ; WX 667 ; N Scommaaccent ; B 90 -225 713 737 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 105 -19 829 929 ; +C 176 ; WX 400 ; N degree ; B 169 411 468 703 ; +C 242 ; WX 556 ; N ograve ; B 83 -14 585 734 ; +C -1 ; WX 722 ; N Ccaron ; B 108 -19 782 929 ; +C 249 ; WX 556 ; N ugrave ; B 94 -15 600 734 ; +C -1 ; WX 453 ; N radical ; B 79 -80 617 762 ; +C -1 ; WX 722 ; N Dcaron ; B 81 0 764 929 ; +C -1 ; WX 333 ; N rcommaaccent ; B 30 -225 446 538 ; +C 209 ; WX 722 ; N Ntilde ; B 76 0 799 917 ; +C 245 ; WX 556 ; N otilde ; B 83 -14 602 722 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 773 718 ; +C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 555 718 ; +C 195 ; WX 667 ; N Atilde ; B 14 0 699 917 ; +C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ; +C 197 ; WX 667 ; N Aring ; B 14 0 654 931 ; +C 213 ; WX 778 ; N Otilde ; B 105 -19 826 917 ; +C -1 ; WX 500 ; N zdotaccent ; B 31 0 571 706 ; +C -1 ; WX 667 ; N Ecaron ; B 86 0 762 929 ; +C -1 ; WX 278 ; N Iogonek ; B -33 -225 341 718 ; +C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 600 718 ; +C -1 ; WX 584 ; N minus ; B 85 216 606 289 ; +C 206 ; WX 278 ; N Icircumflex ; B 91 0 452 929 ; +C -1 ; WX 556 ; N ncaron ; B 65 0 580 734 ; +C -1 ; WX 278 ; N tcommaaccent ; B 63 -225 368 669 ; +C 172 ; WX 584 ; N logicalnot ; B 106 108 628 390 ; +C 246 ; WX 556 ; N odieresis ; B 83 -14 585 706 ; +C 252 ; WX 556 ; N udieresis ; B 94 -15 600 706 ; +C -1 ; WX 549 ; N notequal ; B 34 -35 623 551 ; +C -1 ; WX 556 ; N gcommaaccent ; B 42 -220 610 822 ; +C 240 ; WX 556 ; N eth ; B 81 -15 617 737 ; +C 158 ; WX 500 ; N zcaron ; B 31 0 571 734 ; +C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 573 538 ; +C 185 ; WX 333 ; N onesuperior ; B 166 281 371 703 ; +C -1 ; WX 278 ; N imacron ; B 95 0 417 684 ; +C 128 ; WX 556 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2705 +KPX A C -30 +KPX A Cacute -30 +KPX A Ccaron -30 +KPX A Ccedilla -30 +KPX A G -30 +KPX A Gbreve -30 +KPX A Gcommaaccent -30 +KPX A O -30 +KPX A Oacute -30 +KPX A Ocircumflex -30 +KPX A Odieresis -30 +KPX A Ograve -30 +KPX A Ohungarumlaut -30 +KPX A Omacron -30 +KPX A Oslash -30 +KPX A Otilde -30 +KPX A Q -30 +KPX A T -120 +KPX A Tcaron -120 +KPX A Tcommaaccent -120 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -70 +KPX A W -50 +KPX A Y -100 +KPX A Yacute -100 +KPX A Ydieresis -100 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -40 +KPX A w -40 +KPX A y -40 +KPX A yacute -40 +KPX A ydieresis -40 +KPX Aacute C -30 +KPX Aacute Cacute -30 +KPX Aacute Ccaron -30 +KPX Aacute Ccedilla -30 +KPX Aacute G -30 +KPX Aacute Gbreve -30 +KPX Aacute Gcommaaccent -30 +KPX Aacute O -30 +KPX Aacute Oacute -30 +KPX Aacute Ocircumflex -30 +KPX Aacute Odieresis -30 +KPX Aacute Ograve -30 +KPX Aacute Ohungarumlaut -30 +KPX Aacute Omacron -30 +KPX Aacute Oslash -30 +KPX Aacute Otilde -30 +KPX Aacute Q -30 +KPX Aacute T -120 +KPX Aacute Tcaron -120 +KPX Aacute Tcommaaccent -120 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -70 +KPX Aacute W -50 +KPX Aacute Y -100 +KPX Aacute Yacute -100 +KPX Aacute Ydieresis -100 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -40 +KPX Aacute w -40 +KPX Aacute y -40 +KPX Aacute yacute -40 +KPX Aacute ydieresis -40 +KPX Abreve C -30 +KPX Abreve Cacute -30 +KPX Abreve Ccaron -30 +KPX Abreve Ccedilla -30 +KPX Abreve G -30 +KPX Abreve Gbreve -30 +KPX Abreve Gcommaaccent -30 +KPX Abreve O -30 +KPX Abreve Oacute -30 +KPX Abreve Ocircumflex -30 +KPX Abreve Odieresis -30 +KPX Abreve Ograve -30 +KPX Abreve Ohungarumlaut -30 +KPX Abreve Omacron -30 +KPX Abreve Oslash -30 +KPX Abreve Otilde -30 +KPX Abreve Q -30 +KPX Abreve T -120 +KPX Abreve Tcaron -120 +KPX Abreve Tcommaaccent -120 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -70 +KPX Abreve W -50 +KPX Abreve Y -100 +KPX Abreve Yacute -100 +KPX Abreve Ydieresis -100 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -40 +KPX Abreve w -40 +KPX Abreve y -40 +KPX Abreve yacute -40 +KPX Abreve ydieresis -40 +KPX Acircumflex C -30 +KPX Acircumflex Cacute -30 +KPX Acircumflex Ccaron -30 +KPX Acircumflex Ccedilla -30 +KPX Acircumflex G -30 +KPX Acircumflex Gbreve -30 +KPX Acircumflex Gcommaaccent -30 +KPX Acircumflex O -30 +KPX Acircumflex Oacute -30 +KPX Acircumflex Ocircumflex -30 +KPX Acircumflex Odieresis -30 +KPX Acircumflex Ograve -30 +KPX Acircumflex Ohungarumlaut -30 +KPX Acircumflex Omacron -30 +KPX Acircumflex Oslash -30 +KPX Acircumflex Otilde -30 +KPX Acircumflex Q -30 +KPX Acircumflex T -120 +KPX Acircumflex Tcaron -120 +KPX Acircumflex Tcommaaccent -120 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -70 +KPX Acircumflex W -50 +KPX Acircumflex Y -100 +KPX Acircumflex Yacute -100 +KPX Acircumflex Ydieresis -100 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -40 +KPX Acircumflex w -40 +KPX Acircumflex y -40 +KPX Acircumflex yacute -40 +KPX Acircumflex ydieresis -40 +KPX Adieresis C -30 +KPX Adieresis Cacute -30 +KPX Adieresis Ccaron -30 +KPX Adieresis Ccedilla -30 +KPX Adieresis G -30 +KPX Adieresis Gbreve -30 +KPX Adieresis Gcommaaccent -30 +KPX Adieresis O -30 +KPX Adieresis Oacute -30 +KPX Adieresis Ocircumflex -30 +KPX Adieresis Odieresis -30 +KPX Adieresis Ograve -30 +KPX Adieresis Ohungarumlaut -30 +KPX Adieresis Omacron -30 +KPX Adieresis Oslash -30 +KPX Adieresis Otilde -30 +KPX Adieresis Q -30 +KPX Adieresis T -120 +KPX Adieresis Tcaron -120 +KPX Adieresis Tcommaaccent -120 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -70 +KPX Adieresis W -50 +KPX Adieresis Y -100 +KPX Adieresis Yacute -100 +KPX Adieresis Ydieresis -100 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -40 +KPX Adieresis w -40 +KPX Adieresis y -40 +KPX Adieresis yacute -40 +KPX Adieresis ydieresis -40 +KPX Agrave C -30 +KPX Agrave Cacute -30 +KPX Agrave Ccaron -30 +KPX Agrave Ccedilla -30 +KPX Agrave G -30 +KPX Agrave Gbreve -30 +KPX Agrave Gcommaaccent -30 +KPX Agrave O -30 +KPX Agrave Oacute -30 +KPX Agrave Ocircumflex -30 +KPX Agrave Odieresis -30 +KPX Agrave Ograve -30 +KPX Agrave Ohungarumlaut -30 +KPX Agrave Omacron -30 +KPX Agrave Oslash -30 +KPX Agrave Otilde -30 +KPX Agrave Q -30 +KPX Agrave T -120 +KPX Agrave Tcaron -120 +KPX Agrave Tcommaaccent -120 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -70 +KPX Agrave W -50 +KPX Agrave Y -100 +KPX Agrave Yacute -100 +KPX Agrave Ydieresis -100 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -40 +KPX Agrave w -40 +KPX Agrave y -40 +KPX Agrave yacute -40 +KPX Agrave ydieresis -40 +KPX Amacron C -30 +KPX Amacron Cacute -30 +KPX Amacron Ccaron -30 +KPX Amacron Ccedilla -30 +KPX Amacron G -30 +KPX Amacron Gbreve -30 +KPX Amacron Gcommaaccent -30 +KPX Amacron O -30 +KPX Amacron Oacute -30 +KPX Amacron Ocircumflex -30 +KPX Amacron Odieresis -30 +KPX Amacron Ograve -30 +KPX Amacron Ohungarumlaut -30 +KPX Amacron Omacron -30 +KPX Amacron Oslash -30 +KPX Amacron Otilde -30 +KPX Amacron Q -30 +KPX Amacron T -120 +KPX Amacron Tcaron -120 +KPX Amacron Tcommaaccent -120 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -70 +KPX Amacron W -50 +KPX Amacron Y -100 +KPX Amacron Yacute -100 +KPX Amacron Ydieresis -100 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -40 +KPX Amacron w -40 +KPX Amacron y -40 +KPX Amacron yacute -40 +KPX Amacron ydieresis -40 +KPX Aogonek C -30 +KPX Aogonek Cacute -30 +KPX Aogonek Ccaron -30 +KPX Aogonek Ccedilla -30 +KPX Aogonek G -30 +KPX Aogonek Gbreve -30 +KPX Aogonek Gcommaaccent -30 +KPX Aogonek O -30 +KPX Aogonek Oacute -30 +KPX Aogonek Ocircumflex -30 +KPX Aogonek Odieresis -30 +KPX Aogonek Ograve -30 +KPX Aogonek Ohungarumlaut -30 +KPX Aogonek Omacron -30 +KPX Aogonek Oslash -30 +KPX Aogonek Otilde -30 +KPX Aogonek Q -30 +KPX Aogonek T -120 +KPX Aogonek Tcaron -120 +KPX Aogonek Tcommaaccent -120 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -70 +KPX Aogonek W -50 +KPX Aogonek Y -100 +KPX Aogonek Yacute -100 +KPX Aogonek Ydieresis -100 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -40 +KPX Aogonek w -40 +KPX Aogonek y -40 +KPX Aogonek yacute -40 +KPX Aogonek ydieresis -40 +KPX Aring C -30 +KPX Aring Cacute -30 +KPX Aring Ccaron -30 +KPX Aring Ccedilla -30 +KPX Aring G -30 +KPX Aring Gbreve -30 +KPX Aring Gcommaaccent -30 +KPX Aring O -30 +KPX Aring Oacute -30 +KPX Aring Ocircumflex -30 +KPX Aring Odieresis -30 +KPX Aring Ograve -30 +KPX Aring Ohungarumlaut -30 +KPX Aring Omacron -30 +KPX Aring Oslash -30 +KPX Aring Otilde -30 +KPX Aring Q -30 +KPX Aring T -120 +KPX Aring Tcaron -120 +KPX Aring Tcommaaccent -120 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -70 +KPX Aring W -50 +KPX Aring Y -100 +KPX Aring Yacute -100 +KPX Aring Ydieresis -100 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -40 +KPX Aring w -40 +KPX Aring y -40 +KPX Aring yacute -40 +KPX Aring ydieresis -40 +KPX Atilde C -30 +KPX Atilde Cacute -30 +KPX Atilde Ccaron -30 +KPX Atilde Ccedilla -30 +KPX Atilde G -30 +KPX Atilde Gbreve -30 +KPX Atilde Gcommaaccent -30 +KPX Atilde O -30 +KPX Atilde Oacute -30 +KPX Atilde Ocircumflex -30 +KPX Atilde Odieresis -30 +KPX Atilde Ograve -30 +KPX Atilde Ohungarumlaut -30 +KPX Atilde Omacron -30 +KPX Atilde Oslash -30 +KPX Atilde Otilde -30 +KPX Atilde Q -30 +KPX Atilde T -120 +KPX Atilde Tcaron -120 +KPX Atilde Tcommaaccent -120 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -70 +KPX Atilde W -50 +KPX Atilde Y -100 +KPX Atilde Yacute -100 +KPX Atilde Ydieresis -100 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -40 +KPX Atilde w -40 +KPX Atilde y -40 +KPX Atilde yacute -40 +KPX Atilde ydieresis -40 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX B comma -20 +KPX B period -20 +KPX C comma -30 +KPX C period -30 +KPX Cacute comma -30 +KPX Cacute period -30 +KPX Ccaron comma -30 +KPX Ccaron period -30 +KPX Ccedilla comma -30 +KPX Ccedilla period -30 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -70 +KPX D W -40 +KPX D Y -90 +KPX D Yacute -90 +KPX D Ydieresis -90 +KPX D comma -70 +KPX D period -70 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -70 +KPX Dcaron W -40 +KPX Dcaron Y -90 +KPX Dcaron Yacute -90 +KPX Dcaron Ydieresis -90 +KPX Dcaron comma -70 +KPX Dcaron period -70 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -70 +KPX Dcroat W -40 +KPX Dcroat Y -90 +KPX Dcroat Yacute -90 +KPX Dcroat Ydieresis -90 +KPX Dcroat comma -70 +KPX Dcroat period -70 +KPX F A -80 +KPX F Aacute -80 +KPX F Abreve -80 +KPX F Acircumflex -80 +KPX F Adieresis -80 +KPX F Agrave -80 +KPX F Amacron -80 +KPX F Aogonek -80 +KPX F Aring -80 +KPX F Atilde -80 +KPX F a -50 +KPX F aacute -50 +KPX F abreve -50 +KPX F acircumflex -50 +KPX F adieresis -50 +KPX F agrave -50 +KPX F amacron -50 +KPX F aogonek -50 +KPX F aring -50 +KPX F atilde -50 +KPX F comma -150 +KPX F e -30 +KPX F eacute -30 +KPX F ecaron -30 +KPX F ecircumflex -30 +KPX F edieresis -30 +KPX F edotaccent -30 +KPX F egrave -30 +KPX F emacron -30 +KPX F eogonek -30 +KPX F o -30 +KPX F oacute -30 +KPX F ocircumflex -30 +KPX F odieresis -30 +KPX F ograve -30 +KPX F ohungarumlaut -30 +KPX F omacron -30 +KPX F oslash -30 +KPX F otilde -30 +KPX F period -150 +KPX F r -45 +KPX F racute -45 +KPX F rcaron -45 +KPX F rcommaaccent -45 +KPX J A -20 +KPX J Aacute -20 +KPX J Abreve -20 +KPX J Acircumflex -20 +KPX J Adieresis -20 +KPX J Agrave -20 +KPX J Amacron -20 +KPX J Aogonek -20 +KPX J Aring -20 +KPX J Atilde -20 +KPX J a -20 +KPX J aacute -20 +KPX J abreve -20 +KPX J acircumflex -20 +KPX J adieresis -20 +KPX J agrave -20 +KPX J amacron -20 +KPX J aogonek -20 +KPX J aring -20 +KPX J atilde -20 +KPX J comma -30 +KPX J period -30 +KPX J u -20 +KPX J uacute -20 +KPX J ucircumflex -20 +KPX J udieresis -20 +KPX J ugrave -20 +KPX J uhungarumlaut -20 +KPX J umacron -20 +KPX J uogonek -20 +KPX J uring -20 +KPX K O -50 +KPX K Oacute -50 +KPX K Ocircumflex -50 +KPX K Odieresis -50 +KPX K Ograve -50 +KPX K Ohungarumlaut -50 +KPX K Omacron -50 +KPX K Oslash -50 +KPX K Otilde -50 +KPX K e -40 +KPX K eacute -40 +KPX K ecaron -40 +KPX K ecircumflex -40 +KPX K edieresis -40 +KPX K edotaccent -40 +KPX K egrave -40 +KPX K emacron -40 +KPX K eogonek -40 +KPX K o -40 +KPX K oacute -40 +KPX K ocircumflex -40 +KPX K odieresis -40 +KPX K ograve -40 +KPX K ohungarumlaut -40 +KPX K omacron -40 +KPX K oslash -40 +KPX K otilde -40 +KPX K u -30 +KPX K uacute -30 +KPX K ucircumflex -30 +KPX K udieresis -30 +KPX K ugrave -30 +KPX K uhungarumlaut -30 +KPX K umacron -30 +KPX K uogonek -30 +KPX K uring -30 +KPX K y -50 +KPX K yacute -50 +KPX K ydieresis -50 +KPX Kcommaaccent O -50 +KPX Kcommaaccent Oacute -50 +KPX Kcommaaccent Ocircumflex -50 +KPX Kcommaaccent Odieresis -50 +KPX Kcommaaccent Ograve -50 +KPX Kcommaaccent Ohungarumlaut -50 +KPX Kcommaaccent Omacron -50 +KPX Kcommaaccent Oslash -50 +KPX Kcommaaccent Otilde -50 +KPX Kcommaaccent e -40 +KPX Kcommaaccent eacute -40 +KPX Kcommaaccent ecaron -40 +KPX Kcommaaccent ecircumflex -40 +KPX Kcommaaccent edieresis -40 +KPX Kcommaaccent edotaccent -40 +KPX Kcommaaccent egrave -40 +KPX Kcommaaccent emacron -40 +KPX Kcommaaccent eogonek -40 +KPX Kcommaaccent o -40 +KPX Kcommaaccent oacute -40 +KPX Kcommaaccent ocircumflex -40 +KPX Kcommaaccent odieresis -40 +KPX Kcommaaccent ograve -40 +KPX Kcommaaccent ohungarumlaut -40 +KPX Kcommaaccent omacron -40 +KPX Kcommaaccent oslash -40 +KPX Kcommaaccent otilde -40 +KPX Kcommaaccent u -30 +KPX Kcommaaccent uacute -30 +KPX Kcommaaccent ucircumflex -30 +KPX Kcommaaccent udieresis -30 +KPX Kcommaaccent ugrave -30 +KPX Kcommaaccent uhungarumlaut -30 +KPX Kcommaaccent umacron -30 +KPX Kcommaaccent uogonek -30 +KPX Kcommaaccent uring -30 +KPX Kcommaaccent y -50 +KPX Kcommaaccent yacute -50 +KPX Kcommaaccent ydieresis -50 +KPX L T -110 +KPX L Tcaron -110 +KPX L Tcommaaccent -110 +KPX L V -110 +KPX L W -70 +KPX L Y -140 +KPX L Yacute -140 +KPX L Ydieresis -140 +KPX L quotedblright -140 +KPX L quoteright -160 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -110 +KPX Lacute Tcaron -110 +KPX Lacute Tcommaaccent -110 +KPX Lacute V -110 +KPX Lacute W -70 +KPX Lacute Y -140 +KPX Lacute Yacute -140 +KPX Lacute Ydieresis -140 +KPX Lacute quotedblright -140 +KPX Lacute quoteright -160 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcaron T -110 +KPX Lcaron Tcaron -110 +KPX Lcaron Tcommaaccent -110 +KPX Lcaron V -110 +KPX Lcaron W -70 +KPX Lcaron Y -140 +KPX Lcaron Yacute -140 +KPX Lcaron Ydieresis -140 +KPX Lcaron quotedblright -140 +KPX Lcaron quoteright -160 +KPX Lcaron y -30 +KPX Lcaron yacute -30 +KPX Lcaron ydieresis -30 +KPX Lcommaaccent T -110 +KPX Lcommaaccent Tcaron -110 +KPX Lcommaaccent Tcommaaccent -110 +KPX Lcommaaccent V -110 +KPX Lcommaaccent W -70 +KPX Lcommaaccent Y -140 +KPX Lcommaaccent Yacute -140 +KPX Lcommaaccent Ydieresis -140 +KPX Lcommaaccent quotedblright -140 +KPX Lcommaaccent quoteright -160 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -110 +KPX Lslash Tcaron -110 +KPX Lslash Tcommaaccent -110 +KPX Lslash V -110 +KPX Lslash W -70 +KPX Lslash Y -140 +KPX Lslash Yacute -140 +KPX Lslash Ydieresis -140 +KPX Lslash quotedblright -140 +KPX Lslash quoteright -160 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX O A -20 +KPX O Aacute -20 +KPX O Abreve -20 +KPX O Acircumflex -20 +KPX O Adieresis -20 +KPX O Agrave -20 +KPX O Amacron -20 +KPX O Aogonek -20 +KPX O Aring -20 +KPX O Atilde -20 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -30 +KPX O X -60 +KPX O Y -70 +KPX O Yacute -70 +KPX O Ydieresis -70 +KPX O comma -40 +KPX O period -40 +KPX Oacute A -20 +KPX Oacute Aacute -20 +KPX Oacute Abreve -20 +KPX Oacute Acircumflex -20 +KPX Oacute Adieresis -20 +KPX Oacute Agrave -20 +KPX Oacute Amacron -20 +KPX Oacute Aogonek -20 +KPX Oacute Aring -20 +KPX Oacute Atilde -20 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -30 +KPX Oacute X -60 +KPX Oacute Y -70 +KPX Oacute Yacute -70 +KPX Oacute Ydieresis -70 +KPX Oacute comma -40 +KPX Oacute period -40 +KPX Ocircumflex A -20 +KPX Ocircumflex Aacute -20 +KPX Ocircumflex Abreve -20 +KPX Ocircumflex Acircumflex -20 +KPX Ocircumflex Adieresis -20 +KPX Ocircumflex Agrave -20 +KPX Ocircumflex Amacron -20 +KPX Ocircumflex Aogonek -20 +KPX Ocircumflex Aring -20 +KPX Ocircumflex Atilde -20 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -30 +KPX Ocircumflex X -60 +KPX Ocircumflex Y -70 +KPX Ocircumflex Yacute -70 +KPX Ocircumflex Ydieresis -70 +KPX Ocircumflex comma -40 +KPX Ocircumflex period -40 +KPX Odieresis A -20 +KPX Odieresis Aacute -20 +KPX Odieresis Abreve -20 +KPX Odieresis Acircumflex -20 +KPX Odieresis Adieresis -20 +KPX Odieresis Agrave -20 +KPX Odieresis Amacron -20 +KPX Odieresis Aogonek -20 +KPX Odieresis Aring -20 +KPX Odieresis Atilde -20 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -30 +KPX Odieresis X -60 +KPX Odieresis Y -70 +KPX Odieresis Yacute -70 +KPX Odieresis Ydieresis -70 +KPX Odieresis comma -40 +KPX Odieresis period -40 +KPX Ograve A -20 +KPX Ograve Aacute -20 +KPX Ograve Abreve -20 +KPX Ograve Acircumflex -20 +KPX Ograve Adieresis -20 +KPX Ograve Agrave -20 +KPX Ograve Amacron -20 +KPX Ograve Aogonek -20 +KPX Ograve Aring -20 +KPX Ograve Atilde -20 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -30 +KPX Ograve X -60 +KPX Ograve Y -70 +KPX Ograve Yacute -70 +KPX Ograve Ydieresis -70 +KPX Ograve comma -40 +KPX Ograve period -40 +KPX Ohungarumlaut A -20 +KPX Ohungarumlaut Aacute -20 +KPX Ohungarumlaut Abreve -20 +KPX Ohungarumlaut Acircumflex -20 +KPX Ohungarumlaut Adieresis -20 +KPX Ohungarumlaut Agrave -20 +KPX Ohungarumlaut Amacron -20 +KPX Ohungarumlaut Aogonek -20 +KPX Ohungarumlaut Aring -20 +KPX Ohungarumlaut Atilde -20 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -30 +KPX Ohungarumlaut X -60 +KPX Ohungarumlaut Y -70 +KPX Ohungarumlaut Yacute -70 +KPX Ohungarumlaut Ydieresis -70 +KPX Ohungarumlaut comma -40 +KPX Ohungarumlaut period -40 +KPX Omacron A -20 +KPX Omacron Aacute -20 +KPX Omacron Abreve -20 +KPX Omacron Acircumflex -20 +KPX Omacron Adieresis -20 +KPX Omacron Agrave -20 +KPX Omacron Amacron -20 +KPX Omacron Aogonek -20 +KPX Omacron Aring -20 +KPX Omacron Atilde -20 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -30 +KPX Omacron X -60 +KPX Omacron Y -70 +KPX Omacron Yacute -70 +KPX Omacron Ydieresis -70 +KPX Omacron comma -40 +KPX Omacron period -40 +KPX Oslash A -20 +KPX Oslash Aacute -20 +KPX Oslash Abreve -20 +KPX Oslash Acircumflex -20 +KPX Oslash Adieresis -20 +KPX Oslash Agrave -20 +KPX Oslash Amacron -20 +KPX Oslash Aogonek -20 +KPX Oslash Aring -20 +KPX Oslash Atilde -20 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -30 +KPX Oslash X -60 +KPX Oslash Y -70 +KPX Oslash Yacute -70 +KPX Oslash Ydieresis -70 +KPX Oslash comma -40 +KPX Oslash period -40 +KPX Otilde A -20 +KPX Otilde Aacute -20 +KPX Otilde Abreve -20 +KPX Otilde Acircumflex -20 +KPX Otilde Adieresis -20 +KPX Otilde Agrave -20 +KPX Otilde Amacron -20 +KPX Otilde Aogonek -20 +KPX Otilde Aring -20 +KPX Otilde Atilde -20 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -30 +KPX Otilde X -60 +KPX Otilde Y -70 +KPX Otilde Yacute -70 +KPX Otilde Ydieresis -70 +KPX Otilde comma -40 +KPX Otilde period -40 +KPX P A -120 +KPX P Aacute -120 +KPX P Abreve -120 +KPX P Acircumflex -120 +KPX P Adieresis -120 +KPX P Agrave -120 +KPX P Amacron -120 +KPX P Aogonek -120 +KPX P Aring -120 +KPX P Atilde -120 +KPX P a -40 +KPX P aacute -40 +KPX P abreve -40 +KPX P acircumflex -40 +KPX P adieresis -40 +KPX P agrave -40 +KPX P amacron -40 +KPX P aogonek -40 +KPX P aring -40 +KPX P atilde -40 +KPX P comma -180 +KPX P e -50 +KPX P eacute -50 +KPX P ecaron -50 +KPX P ecircumflex -50 +KPX P edieresis -50 +KPX P edotaccent -50 +KPX P egrave -50 +KPX P emacron -50 +KPX P eogonek -50 +KPX P o -50 +KPX P oacute -50 +KPX P ocircumflex -50 +KPX P odieresis -50 +KPX P ograve -50 +KPX P ohungarumlaut -50 +KPX P omacron -50 +KPX P oslash -50 +KPX P otilde -50 +KPX P period -180 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX R O -20 +KPX R Oacute -20 +KPX R Ocircumflex -20 +KPX R Odieresis -20 +KPX R Ograve -20 +KPX R Ohungarumlaut -20 +KPX R Omacron -20 +KPX R Oslash -20 +KPX R Otilde -20 +KPX R T -30 +KPX R Tcaron -30 +KPX R Tcommaaccent -30 +KPX R U -40 +KPX R Uacute -40 +KPX R Ucircumflex -40 +KPX R Udieresis -40 +KPX R Ugrave -40 +KPX R Uhungarumlaut -40 +KPX R Umacron -40 +KPX R Uogonek -40 +KPX R Uring -40 +KPX R V -50 +KPX R W -30 +KPX R Y -50 +KPX R Yacute -50 +KPX R Ydieresis -50 +KPX Racute O -20 +KPX Racute Oacute -20 +KPX Racute Ocircumflex -20 +KPX Racute Odieresis -20 +KPX Racute Ograve -20 +KPX Racute Ohungarumlaut -20 +KPX Racute Omacron -20 +KPX Racute Oslash -20 +KPX Racute Otilde -20 +KPX Racute T -30 +KPX Racute Tcaron -30 +KPX Racute Tcommaaccent -30 +KPX Racute U -40 +KPX Racute Uacute -40 +KPX Racute Ucircumflex -40 +KPX Racute Udieresis -40 +KPX Racute Ugrave -40 +KPX Racute Uhungarumlaut -40 +KPX Racute Umacron -40 +KPX Racute Uogonek -40 +KPX Racute Uring -40 +KPX Racute V -50 +KPX Racute W -30 +KPX Racute Y -50 +KPX Racute Yacute -50 +KPX Racute Ydieresis -50 +KPX Rcaron O -20 +KPX Rcaron Oacute -20 +KPX Rcaron Ocircumflex -20 +KPX Rcaron Odieresis -20 +KPX Rcaron Ograve -20 +KPX Rcaron Ohungarumlaut -20 +KPX Rcaron Omacron -20 +KPX Rcaron Oslash -20 +KPX Rcaron Otilde -20 +KPX Rcaron T -30 +KPX Rcaron Tcaron -30 +KPX Rcaron Tcommaaccent -30 +KPX Rcaron U -40 +KPX Rcaron Uacute -40 +KPX Rcaron Ucircumflex -40 +KPX Rcaron Udieresis -40 +KPX Rcaron Ugrave -40 +KPX Rcaron Uhungarumlaut -40 +KPX Rcaron Umacron -40 +KPX Rcaron Uogonek -40 +KPX Rcaron Uring -40 +KPX Rcaron V -50 +KPX Rcaron W -30 +KPX Rcaron Y -50 +KPX Rcaron Yacute -50 +KPX Rcaron Ydieresis -50 +KPX Rcommaaccent O -20 +KPX Rcommaaccent Oacute -20 +KPX Rcommaaccent Ocircumflex -20 +KPX Rcommaaccent Odieresis -20 +KPX Rcommaaccent Ograve -20 +KPX Rcommaaccent Ohungarumlaut -20 +KPX Rcommaaccent Omacron -20 +KPX Rcommaaccent Oslash -20 +KPX Rcommaaccent Otilde -20 +KPX Rcommaaccent T -30 +KPX Rcommaaccent Tcaron -30 +KPX Rcommaaccent Tcommaaccent -30 +KPX Rcommaaccent U -40 +KPX Rcommaaccent Uacute -40 +KPX Rcommaaccent Ucircumflex -40 +KPX Rcommaaccent Udieresis -40 +KPX Rcommaaccent Ugrave -40 +KPX Rcommaaccent Uhungarumlaut -40 +KPX Rcommaaccent Umacron -40 +KPX Rcommaaccent Uogonek -40 +KPX Rcommaaccent Uring -40 +KPX Rcommaaccent V -50 +KPX Rcommaaccent W -30 +KPX Rcommaaccent Y -50 +KPX Rcommaaccent Yacute -50 +KPX Rcommaaccent Ydieresis -50 +KPX S comma -20 +KPX S period -20 +KPX Sacute comma -20 +KPX Sacute period -20 +KPX Scaron comma -20 +KPX Scaron period -20 +KPX Scedilla comma -20 +KPX Scedilla period -20 +KPX Scommaaccent comma -20 +KPX Scommaaccent period -20 +KPX T A -120 +KPX T Aacute -120 +KPX T Abreve -120 +KPX T Acircumflex -120 +KPX T Adieresis -120 +KPX T Agrave -120 +KPX T Amacron -120 +KPX T Aogonek -120 +KPX T Aring -120 +KPX T Atilde -120 +KPX T O -40 +KPX T Oacute -40 +KPX T Ocircumflex -40 +KPX T Odieresis -40 +KPX T Ograve -40 +KPX T Ohungarumlaut -40 +KPX T Omacron -40 +KPX T Oslash -40 +KPX T Otilde -40 +KPX T a -120 +KPX T aacute -120 +KPX T abreve -60 +KPX T acircumflex -120 +KPX T adieresis -120 +KPX T agrave -120 +KPX T amacron -60 +KPX T aogonek -120 +KPX T aring -120 +KPX T atilde -60 +KPX T colon -20 +KPX T comma -120 +KPX T e -120 +KPX T eacute -120 +KPX T ecaron -120 +KPX T ecircumflex -120 +KPX T edieresis -120 +KPX T edotaccent -120 +KPX T egrave -60 +KPX T emacron -60 +KPX T eogonek -120 +KPX T hyphen -140 +KPX T o -120 +KPX T oacute -120 +KPX T ocircumflex -120 +KPX T odieresis -120 +KPX T ograve -120 +KPX T ohungarumlaut -120 +KPX T omacron -60 +KPX T oslash -120 +KPX T otilde -60 +KPX T period -120 +KPX T r -120 +KPX T racute -120 +KPX T rcaron -120 +KPX T rcommaaccent -120 +KPX T semicolon -20 +KPX T u -120 +KPX T uacute -120 +KPX T ucircumflex -120 +KPX T udieresis -120 +KPX T ugrave -120 +KPX T uhungarumlaut -120 +KPX T umacron -60 +KPX T uogonek -120 +KPX T uring -120 +KPX T w -120 +KPX T y -120 +KPX T yacute -120 +KPX T ydieresis -60 +KPX Tcaron A -120 +KPX Tcaron Aacute -120 +KPX Tcaron Abreve -120 +KPX Tcaron Acircumflex -120 +KPX Tcaron Adieresis -120 +KPX Tcaron Agrave -120 +KPX Tcaron Amacron -120 +KPX Tcaron Aogonek -120 +KPX Tcaron Aring -120 +KPX Tcaron Atilde -120 +KPX Tcaron O -40 +KPX Tcaron Oacute -40 +KPX Tcaron Ocircumflex -40 +KPX Tcaron Odieresis -40 +KPX Tcaron Ograve -40 +KPX Tcaron Ohungarumlaut -40 +KPX Tcaron Omacron -40 +KPX Tcaron Oslash -40 +KPX Tcaron Otilde -40 +KPX Tcaron a -120 +KPX Tcaron aacute -120 +KPX Tcaron abreve -60 +KPX Tcaron acircumflex -120 +KPX Tcaron adieresis -120 +KPX Tcaron agrave -120 +KPX Tcaron amacron -60 +KPX Tcaron aogonek -120 +KPX Tcaron aring -120 +KPX Tcaron atilde -60 +KPX Tcaron colon -20 +KPX Tcaron comma -120 +KPX Tcaron e -120 +KPX Tcaron eacute -120 +KPX Tcaron ecaron -120 +KPX Tcaron ecircumflex -120 +KPX Tcaron edieresis -120 +KPX Tcaron edotaccent -120 +KPX Tcaron egrave -60 +KPX Tcaron emacron -60 +KPX Tcaron eogonek -120 +KPX Tcaron hyphen -140 +KPX Tcaron o -120 +KPX Tcaron oacute -120 +KPX Tcaron ocircumflex -120 +KPX Tcaron odieresis -120 +KPX Tcaron ograve -120 +KPX Tcaron ohungarumlaut -120 +KPX Tcaron omacron -60 +KPX Tcaron oslash -120 +KPX Tcaron otilde -60 +KPX Tcaron period -120 +KPX Tcaron r -120 +KPX Tcaron racute -120 +KPX Tcaron rcaron -120 +KPX Tcaron rcommaaccent -120 +KPX Tcaron semicolon -20 +KPX Tcaron u -120 +KPX Tcaron uacute -120 +KPX Tcaron ucircumflex -120 +KPX Tcaron udieresis -120 +KPX Tcaron ugrave -120 +KPX Tcaron uhungarumlaut -120 +KPX Tcaron umacron -60 +KPX Tcaron uogonek -120 +KPX Tcaron uring -120 +KPX Tcaron w -120 +KPX Tcaron y -120 +KPX Tcaron yacute -120 +KPX Tcaron ydieresis -60 +KPX Tcommaaccent A -120 +KPX Tcommaaccent Aacute -120 +KPX Tcommaaccent Abreve -120 +KPX Tcommaaccent Acircumflex -120 +KPX Tcommaaccent Adieresis -120 +KPX Tcommaaccent Agrave -120 +KPX Tcommaaccent Amacron -120 +KPX Tcommaaccent Aogonek -120 +KPX Tcommaaccent Aring -120 +KPX Tcommaaccent Atilde -120 +KPX Tcommaaccent O -40 +KPX Tcommaaccent Oacute -40 +KPX Tcommaaccent Ocircumflex -40 +KPX Tcommaaccent Odieresis -40 +KPX Tcommaaccent Ograve -40 +KPX Tcommaaccent Ohungarumlaut -40 +KPX Tcommaaccent Omacron -40 +KPX Tcommaaccent Oslash -40 +KPX Tcommaaccent Otilde -40 +KPX Tcommaaccent a -120 +KPX Tcommaaccent aacute -120 +KPX Tcommaaccent abreve -60 +KPX Tcommaaccent acircumflex -120 +KPX Tcommaaccent adieresis -120 +KPX Tcommaaccent agrave -120 +KPX Tcommaaccent amacron -60 +KPX Tcommaaccent aogonek -120 +KPX Tcommaaccent aring -120 +KPX Tcommaaccent atilde -60 +KPX Tcommaaccent colon -20 +KPX Tcommaaccent comma -120 +KPX Tcommaaccent e -120 +KPX Tcommaaccent eacute -120 +KPX Tcommaaccent ecaron -120 +KPX Tcommaaccent ecircumflex -120 +KPX Tcommaaccent edieresis -120 +KPX Tcommaaccent edotaccent -120 +KPX Tcommaaccent egrave -60 +KPX Tcommaaccent emacron -60 +KPX Tcommaaccent eogonek -120 +KPX Tcommaaccent hyphen -140 +KPX Tcommaaccent o -120 +KPX Tcommaaccent oacute -120 +KPX Tcommaaccent ocircumflex -120 +KPX Tcommaaccent odieresis -120 +KPX Tcommaaccent ograve -120 +KPX Tcommaaccent ohungarumlaut -120 +KPX Tcommaaccent omacron -60 +KPX Tcommaaccent oslash -120 +KPX Tcommaaccent otilde -60 +KPX Tcommaaccent period -120 +KPX Tcommaaccent r -120 +KPX Tcommaaccent racute -120 +KPX Tcommaaccent rcaron -120 +KPX Tcommaaccent rcommaaccent -120 +KPX Tcommaaccent semicolon -20 +KPX Tcommaaccent u -120 +KPX Tcommaaccent uacute -120 +KPX Tcommaaccent ucircumflex -120 +KPX Tcommaaccent udieresis -120 +KPX Tcommaaccent ugrave -120 +KPX Tcommaaccent uhungarumlaut -120 +KPX Tcommaaccent umacron -60 +KPX Tcommaaccent uogonek -120 +KPX Tcommaaccent uring -120 +KPX Tcommaaccent w -120 +KPX Tcommaaccent y -120 +KPX Tcommaaccent yacute -120 +KPX Tcommaaccent ydieresis -60 +KPX U A -40 +KPX U Aacute -40 +KPX U Abreve -40 +KPX U Acircumflex -40 +KPX U Adieresis -40 +KPX U Agrave -40 +KPX U Amacron -40 +KPX U Aogonek -40 +KPX U Aring -40 +KPX U Atilde -40 +KPX U comma -40 +KPX U period -40 +KPX Uacute A -40 +KPX Uacute Aacute -40 +KPX Uacute Abreve -40 +KPX Uacute Acircumflex -40 +KPX Uacute Adieresis -40 +KPX Uacute Agrave -40 +KPX Uacute Amacron -40 +KPX Uacute Aogonek -40 +KPX Uacute Aring -40 +KPX Uacute Atilde -40 +KPX Uacute comma -40 +KPX Uacute period -40 +KPX Ucircumflex A -40 +KPX Ucircumflex Aacute -40 +KPX Ucircumflex Abreve -40 +KPX Ucircumflex Acircumflex -40 +KPX Ucircumflex Adieresis -40 +KPX Ucircumflex Agrave -40 +KPX Ucircumflex Amacron -40 +KPX Ucircumflex Aogonek -40 +KPX Ucircumflex Aring -40 +KPX Ucircumflex Atilde -40 +KPX Ucircumflex comma -40 +KPX Ucircumflex period -40 +KPX Udieresis A -40 +KPX Udieresis Aacute -40 +KPX Udieresis Abreve -40 +KPX Udieresis Acircumflex -40 +KPX Udieresis Adieresis -40 +KPX Udieresis Agrave -40 +KPX Udieresis Amacron -40 +KPX Udieresis Aogonek -40 +KPX Udieresis Aring -40 +KPX Udieresis Atilde -40 +KPX Udieresis comma -40 +KPX Udieresis period -40 +KPX Ugrave A -40 +KPX Ugrave Aacute -40 +KPX Ugrave Abreve -40 +KPX Ugrave Acircumflex -40 +KPX Ugrave Adieresis -40 +KPX Ugrave Agrave -40 +KPX Ugrave Amacron -40 +KPX Ugrave Aogonek -40 +KPX Ugrave Aring -40 +KPX Ugrave Atilde -40 +KPX Ugrave comma -40 +KPX Ugrave period -40 +KPX Uhungarumlaut A -40 +KPX Uhungarumlaut Aacute -40 +KPX Uhungarumlaut Abreve -40 +KPX Uhungarumlaut Acircumflex -40 +KPX Uhungarumlaut Adieresis -40 +KPX Uhungarumlaut Agrave -40 +KPX Uhungarumlaut Amacron -40 +KPX Uhungarumlaut Aogonek -40 +KPX Uhungarumlaut Aring -40 +KPX Uhungarumlaut Atilde -40 +KPX Uhungarumlaut comma -40 +KPX Uhungarumlaut period -40 +KPX Umacron A -40 +KPX Umacron Aacute -40 +KPX Umacron Abreve -40 +KPX Umacron Acircumflex -40 +KPX Umacron Adieresis -40 +KPX Umacron Agrave -40 +KPX Umacron Amacron -40 +KPX Umacron Aogonek -40 +KPX Umacron Aring -40 +KPX Umacron Atilde -40 +KPX Umacron comma -40 +KPX Umacron period -40 +KPX Uogonek A -40 +KPX Uogonek Aacute -40 +KPX Uogonek Abreve -40 +KPX Uogonek Acircumflex -40 +KPX Uogonek Adieresis -40 +KPX Uogonek Agrave -40 +KPX Uogonek Amacron -40 +KPX Uogonek Aogonek -40 +KPX Uogonek Aring -40 +KPX Uogonek Atilde -40 +KPX Uogonek comma -40 +KPX Uogonek period -40 +KPX Uring A -40 +KPX Uring Aacute -40 +KPX Uring Abreve -40 +KPX Uring Acircumflex -40 +KPX Uring Adieresis -40 +KPX Uring Agrave -40 +KPX Uring Amacron -40 +KPX Uring Aogonek -40 +KPX Uring Aring -40 +KPX Uring Atilde -40 +KPX Uring comma -40 +KPX Uring period -40 +KPX V A -80 +KPX V Aacute -80 +KPX V Abreve -80 +KPX V Acircumflex -80 +KPX V Adieresis -80 +KPX V Agrave -80 +KPX V Amacron -80 +KPX V Aogonek -80 +KPX V Aring -80 +KPX V Atilde -80 +KPX V G -40 +KPX V Gbreve -40 +KPX V Gcommaaccent -40 +KPX V O -40 +KPX V Oacute -40 +KPX V Ocircumflex -40 +KPX V Odieresis -40 +KPX V Ograve -40 +KPX V Ohungarumlaut -40 +KPX V Omacron -40 +KPX V Oslash -40 +KPX V Otilde -40 +KPX V a -70 +KPX V aacute -70 +KPX V abreve -70 +KPX V acircumflex -70 +KPX V adieresis -70 +KPX V agrave -70 +KPX V amacron -70 +KPX V aogonek -70 +KPX V aring -70 +KPX V atilde -70 +KPX V colon -40 +KPX V comma -125 +KPX V e -80 +KPX V eacute -80 +KPX V ecaron -80 +KPX V ecircumflex -80 +KPX V edieresis -80 +KPX V edotaccent -80 +KPX V egrave -80 +KPX V emacron -80 +KPX V eogonek -80 +KPX V hyphen -80 +KPX V o -80 +KPX V oacute -80 +KPX V ocircumflex -80 +KPX V odieresis -80 +KPX V ograve -80 +KPX V ohungarumlaut -80 +KPX V omacron -80 +KPX V oslash -80 +KPX V otilde -80 +KPX V period -125 +KPX V semicolon -40 +KPX V u -70 +KPX V uacute -70 +KPX V ucircumflex -70 +KPX V udieresis -70 +KPX V ugrave -70 +KPX V uhungarumlaut -70 +KPX V umacron -70 +KPX V uogonek -70 +KPX V uring -70 +KPX W A -50 +KPX W Aacute -50 +KPX W Abreve -50 +KPX W Acircumflex -50 +KPX W Adieresis -50 +KPX W Agrave -50 +KPX W Amacron -50 +KPX W Aogonek -50 +KPX W Aring -50 +KPX W Atilde -50 +KPX W O -20 +KPX W Oacute -20 +KPX W Ocircumflex -20 +KPX W Odieresis -20 +KPX W Ograve -20 +KPX W Ohungarumlaut -20 +KPX W Omacron -20 +KPX W Oslash -20 +KPX W Otilde -20 +KPX W a -40 +KPX W aacute -40 +KPX W abreve -40 +KPX W acircumflex -40 +KPX W adieresis -40 +KPX W agrave -40 +KPX W amacron -40 +KPX W aogonek -40 +KPX W aring -40 +KPX W atilde -40 +KPX W comma -80 +KPX W e -30 +KPX W eacute -30 +KPX W ecaron -30 +KPX W ecircumflex -30 +KPX W edieresis -30 +KPX W edotaccent -30 +KPX W egrave -30 +KPX W emacron -30 +KPX W eogonek -30 +KPX W hyphen -40 +KPX W o -30 +KPX W oacute -30 +KPX W ocircumflex -30 +KPX W odieresis -30 +KPX W ograve -30 +KPX W ohungarumlaut -30 +KPX W omacron -30 +KPX W oslash -30 +KPX W otilde -30 +KPX W period -80 +KPX W u -30 +KPX W uacute -30 +KPX W ucircumflex -30 +KPX W udieresis -30 +KPX W ugrave -30 +KPX W uhungarumlaut -30 +KPX W umacron -30 +KPX W uogonek -30 +KPX W uring -30 +KPX W y -20 +KPX W yacute -20 +KPX W ydieresis -20 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -85 +KPX Y Oacute -85 +KPX Y Ocircumflex -85 +KPX Y Odieresis -85 +KPX Y Ograve -85 +KPX Y Ohungarumlaut -85 +KPX Y Omacron -85 +KPX Y Oslash -85 +KPX Y Otilde -85 +KPX Y a -140 +KPX Y aacute -140 +KPX Y abreve -70 +KPX Y acircumflex -140 +KPX Y adieresis -140 +KPX Y agrave -140 +KPX Y amacron -70 +KPX Y aogonek -140 +KPX Y aring -140 +KPX Y atilde -140 +KPX Y colon -60 +KPX Y comma -140 +KPX Y e -140 +KPX Y eacute -140 +KPX Y ecaron -140 +KPX Y ecircumflex -140 +KPX Y edieresis -140 +KPX Y edotaccent -140 +KPX Y egrave -140 +KPX Y emacron -70 +KPX Y eogonek -140 +KPX Y hyphen -140 +KPX Y i -20 +KPX Y iacute -20 +KPX Y iogonek -20 +KPX Y o -140 +KPX Y oacute -140 +KPX Y ocircumflex -140 +KPX Y odieresis -140 +KPX Y ograve -140 +KPX Y ohungarumlaut -140 +KPX Y omacron -140 +KPX Y oslash -140 +KPX Y otilde -140 +KPX Y period -140 +KPX Y semicolon -60 +KPX Y u -110 +KPX Y uacute -110 +KPX Y ucircumflex -110 +KPX Y udieresis -110 +KPX Y ugrave -110 +KPX Y uhungarumlaut -110 +KPX Y umacron -110 +KPX Y uogonek -110 +KPX Y uring -110 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -85 +KPX Yacute Oacute -85 +KPX Yacute Ocircumflex -85 +KPX Yacute Odieresis -85 +KPX Yacute Ograve -85 +KPX Yacute Ohungarumlaut -85 +KPX Yacute Omacron -85 +KPX Yacute Oslash -85 +KPX Yacute Otilde -85 +KPX Yacute a -140 +KPX Yacute aacute -140 +KPX Yacute abreve -70 +KPX Yacute acircumflex -140 +KPX Yacute adieresis -140 +KPX Yacute agrave -140 +KPX Yacute amacron -70 +KPX Yacute aogonek -140 +KPX Yacute aring -140 +KPX Yacute atilde -70 +KPX Yacute colon -60 +KPX Yacute comma -140 +KPX Yacute e -140 +KPX Yacute eacute -140 +KPX Yacute ecaron -140 +KPX Yacute ecircumflex -140 +KPX Yacute edieresis -140 +KPX Yacute edotaccent -140 +KPX Yacute egrave -140 +KPX Yacute emacron -70 +KPX Yacute eogonek -140 +KPX Yacute hyphen -140 +KPX Yacute i -20 +KPX Yacute iacute -20 +KPX Yacute iogonek -20 +KPX Yacute o -140 +KPX Yacute oacute -140 +KPX Yacute ocircumflex -140 +KPX Yacute odieresis -140 +KPX Yacute ograve -140 +KPX Yacute ohungarumlaut -140 +KPX Yacute omacron -70 +KPX Yacute oslash -140 +KPX Yacute otilde -140 +KPX Yacute period -140 +KPX Yacute semicolon -60 +KPX Yacute u -110 +KPX Yacute uacute -110 +KPX Yacute ucircumflex -110 +KPX Yacute udieresis -110 +KPX Yacute ugrave -110 +KPX Yacute uhungarumlaut -110 +KPX Yacute umacron -110 +KPX Yacute uogonek -110 +KPX Yacute uring -110 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -85 +KPX Ydieresis Oacute -85 +KPX Ydieresis Ocircumflex -85 +KPX Ydieresis Odieresis -85 +KPX Ydieresis Ograve -85 +KPX Ydieresis Ohungarumlaut -85 +KPX Ydieresis Omacron -85 +KPX Ydieresis Oslash -85 +KPX Ydieresis Otilde -85 +KPX Ydieresis a -140 +KPX Ydieresis aacute -140 +KPX Ydieresis abreve -70 +KPX Ydieresis acircumflex -140 +KPX Ydieresis adieresis -140 +KPX Ydieresis agrave -140 +KPX Ydieresis amacron -70 +KPX Ydieresis aogonek -140 +KPX Ydieresis aring -140 +KPX Ydieresis atilde -70 +KPX Ydieresis colon -60 +KPX Ydieresis comma -140 +KPX Ydieresis e -140 +KPX Ydieresis eacute -140 +KPX Ydieresis ecaron -140 +KPX Ydieresis ecircumflex -140 +KPX Ydieresis edieresis -140 +KPX Ydieresis edotaccent -140 +KPX Ydieresis egrave -140 +KPX Ydieresis emacron -70 +KPX Ydieresis eogonek -140 +KPX Ydieresis hyphen -140 +KPX Ydieresis i -20 +KPX Ydieresis iacute -20 +KPX Ydieresis iogonek -20 +KPX Ydieresis o -140 +KPX Ydieresis oacute -140 +KPX Ydieresis ocircumflex -140 +KPX Ydieresis odieresis -140 +KPX Ydieresis ograve -140 +KPX Ydieresis ohungarumlaut -140 +KPX Ydieresis omacron -140 +KPX Ydieresis oslash -140 +KPX Ydieresis otilde -140 +KPX Ydieresis period -140 +KPX Ydieresis semicolon -60 +KPX Ydieresis u -110 +KPX Ydieresis uacute -110 +KPX Ydieresis ucircumflex -110 +KPX Ydieresis udieresis -110 +KPX Ydieresis ugrave -110 +KPX Ydieresis uhungarumlaut -110 +KPX Ydieresis umacron -110 +KPX Ydieresis uogonek -110 +KPX Ydieresis uring -110 +KPX a v -20 +KPX a w -20 +KPX a y -30 +KPX a yacute -30 +KPX a ydieresis -30 +KPX aacute v -20 +KPX aacute w -20 +KPX aacute y -30 +KPX aacute yacute -30 +KPX aacute ydieresis -30 +KPX abreve v -20 +KPX abreve w -20 +KPX abreve y -30 +KPX abreve yacute -30 +KPX abreve ydieresis -30 +KPX acircumflex v -20 +KPX acircumflex w -20 +KPX acircumflex y -30 +KPX acircumflex yacute -30 +KPX acircumflex ydieresis -30 +KPX adieresis v -20 +KPX adieresis w -20 +KPX adieresis y -30 +KPX adieresis yacute -30 +KPX adieresis ydieresis -30 +KPX agrave v -20 +KPX agrave w -20 +KPX agrave y -30 +KPX agrave yacute -30 +KPX agrave ydieresis -30 +KPX amacron v -20 +KPX amacron w -20 +KPX amacron y -30 +KPX amacron yacute -30 +KPX amacron ydieresis -30 +KPX aogonek v -20 +KPX aogonek w -20 +KPX aogonek y -30 +KPX aogonek yacute -30 +KPX aogonek ydieresis -30 +KPX aring v -20 +KPX aring w -20 +KPX aring y -30 +KPX aring yacute -30 +KPX aring ydieresis -30 +KPX atilde v -20 +KPX atilde w -20 +KPX atilde y -30 +KPX atilde yacute -30 +KPX atilde ydieresis -30 +KPX b b -10 +KPX b comma -40 +KPX b l -20 +KPX b lacute -20 +KPX b lcommaaccent -20 +KPX b lslash -20 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -20 +KPX b y -20 +KPX b yacute -20 +KPX b ydieresis -20 +KPX c comma -15 +KPX c k -20 +KPX c kcommaaccent -20 +KPX cacute comma -15 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX ccaron comma -15 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccedilla comma -15 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX colon space -50 +KPX comma quotedblright -100 +KPX comma quoteright -100 +KPX e comma -15 +KPX e period -15 +KPX e v -30 +KPX e w -20 +KPX e x -30 +KPX e y -20 +KPX e yacute -20 +KPX e ydieresis -20 +KPX eacute comma -15 +KPX eacute period -15 +KPX eacute v -30 +KPX eacute w -20 +KPX eacute x -30 +KPX eacute y -20 +KPX eacute yacute -20 +KPX eacute ydieresis -20 +KPX ecaron comma -15 +KPX ecaron period -15 +KPX ecaron v -30 +KPX ecaron w -20 +KPX ecaron x -30 +KPX ecaron y -20 +KPX ecaron yacute -20 +KPX ecaron ydieresis -20 +KPX ecircumflex comma -15 +KPX ecircumflex period -15 +KPX ecircumflex v -30 +KPX ecircumflex w -20 +KPX ecircumflex x -30 +KPX ecircumflex y -20 +KPX ecircumflex yacute -20 +KPX ecircumflex ydieresis -20 +KPX edieresis comma -15 +KPX edieresis period -15 +KPX edieresis v -30 +KPX edieresis w -20 +KPX edieresis x -30 +KPX edieresis y -20 +KPX edieresis yacute -20 +KPX edieresis ydieresis -20 +KPX edotaccent comma -15 +KPX edotaccent period -15 +KPX edotaccent v -30 +KPX edotaccent w -20 +KPX edotaccent x -30 +KPX edotaccent y -20 +KPX edotaccent yacute -20 +KPX edotaccent ydieresis -20 +KPX egrave comma -15 +KPX egrave period -15 +KPX egrave v -30 +KPX egrave w -20 +KPX egrave x -30 +KPX egrave y -20 +KPX egrave yacute -20 +KPX egrave ydieresis -20 +KPX emacron comma -15 +KPX emacron period -15 +KPX emacron v -30 +KPX emacron w -20 +KPX emacron x -30 +KPX emacron y -20 +KPX emacron yacute -20 +KPX emacron ydieresis -20 +KPX eogonek comma -15 +KPX eogonek period -15 +KPX eogonek v -30 +KPX eogonek w -20 +KPX eogonek x -30 +KPX eogonek y -20 +KPX eogonek yacute -20 +KPX eogonek ydieresis -20 +KPX f a -30 +KPX f aacute -30 +KPX f abreve -30 +KPX f acircumflex -30 +KPX f adieresis -30 +KPX f agrave -30 +KPX f amacron -30 +KPX f aogonek -30 +KPX f aring -30 +KPX f atilde -30 +KPX f comma -30 +KPX f dotlessi -28 +KPX f e -30 +KPX f eacute -30 +KPX f ecaron -30 +KPX f ecircumflex -30 +KPX f edieresis -30 +KPX f edotaccent -30 +KPX f egrave -30 +KPX f emacron -30 +KPX f eogonek -30 +KPX f o -30 +KPX f oacute -30 +KPX f ocircumflex -30 +KPX f odieresis -30 +KPX f ograve -30 +KPX f ohungarumlaut -30 +KPX f omacron -30 +KPX f oslash -30 +KPX f otilde -30 +KPX f period -30 +KPX f quotedblright 60 +KPX f quoteright 50 +KPX g r -10 +KPX g racute -10 +KPX g rcaron -10 +KPX g rcommaaccent -10 +KPX gbreve r -10 +KPX gbreve racute -10 +KPX gbreve rcaron -10 +KPX gbreve rcommaaccent -10 +KPX gcommaaccent r -10 +KPX gcommaaccent racute -10 +KPX gcommaaccent rcaron -10 +KPX gcommaaccent rcommaaccent -10 +KPX h y -30 +KPX h yacute -30 +KPX h ydieresis -30 +KPX k e -20 +KPX k eacute -20 +KPX k ecaron -20 +KPX k ecircumflex -20 +KPX k edieresis -20 +KPX k edotaccent -20 +KPX k egrave -20 +KPX k emacron -20 +KPX k eogonek -20 +KPX k o -20 +KPX k oacute -20 +KPX k ocircumflex -20 +KPX k odieresis -20 +KPX k ograve -20 +KPX k ohungarumlaut -20 +KPX k omacron -20 +KPX k oslash -20 +KPX k otilde -20 +KPX kcommaaccent e -20 +KPX kcommaaccent eacute -20 +KPX kcommaaccent ecaron -20 +KPX kcommaaccent ecircumflex -20 +KPX kcommaaccent edieresis -20 +KPX kcommaaccent edotaccent -20 +KPX kcommaaccent egrave -20 +KPX kcommaaccent emacron -20 +KPX kcommaaccent eogonek -20 +KPX kcommaaccent o -20 +KPX kcommaaccent oacute -20 +KPX kcommaaccent ocircumflex -20 +KPX kcommaaccent odieresis -20 +KPX kcommaaccent ograve -20 +KPX kcommaaccent ohungarumlaut -20 +KPX kcommaaccent omacron -20 +KPX kcommaaccent oslash -20 +KPX kcommaaccent otilde -20 +KPX m u -10 +KPX m uacute -10 +KPX m ucircumflex -10 +KPX m udieresis -10 +KPX m ugrave -10 +KPX m uhungarumlaut -10 +KPX m umacron -10 +KPX m uogonek -10 +KPX m uring -10 +KPX m y -15 +KPX m yacute -15 +KPX m ydieresis -15 +KPX n u -10 +KPX n uacute -10 +KPX n ucircumflex -10 +KPX n udieresis -10 +KPX n ugrave -10 +KPX n uhungarumlaut -10 +KPX n umacron -10 +KPX n uogonek -10 +KPX n uring -10 +KPX n v -20 +KPX n y -15 +KPX n yacute -15 +KPX n ydieresis -15 +KPX nacute u -10 +KPX nacute uacute -10 +KPX nacute ucircumflex -10 +KPX nacute udieresis -10 +KPX nacute ugrave -10 +KPX nacute uhungarumlaut -10 +KPX nacute umacron -10 +KPX nacute uogonek -10 +KPX nacute uring -10 +KPX nacute v -20 +KPX nacute y -15 +KPX nacute yacute -15 +KPX nacute ydieresis -15 +KPX ncaron u -10 +KPX ncaron uacute -10 +KPX ncaron ucircumflex -10 +KPX ncaron udieresis -10 +KPX ncaron ugrave -10 +KPX ncaron uhungarumlaut -10 +KPX ncaron umacron -10 +KPX ncaron uogonek -10 +KPX ncaron uring -10 +KPX ncaron v -20 +KPX ncaron y -15 +KPX ncaron yacute -15 +KPX ncaron ydieresis -15 +KPX ncommaaccent u -10 +KPX ncommaaccent uacute -10 +KPX ncommaaccent ucircumflex -10 +KPX ncommaaccent udieresis -10 +KPX ncommaaccent ugrave -10 +KPX ncommaaccent uhungarumlaut -10 +KPX ncommaaccent umacron -10 +KPX ncommaaccent uogonek -10 +KPX ncommaaccent uring -10 +KPX ncommaaccent v -20 +KPX ncommaaccent y -15 +KPX ncommaaccent yacute -15 +KPX ncommaaccent ydieresis -15 +KPX ntilde u -10 +KPX ntilde uacute -10 +KPX ntilde ucircumflex -10 +KPX ntilde udieresis -10 +KPX ntilde ugrave -10 +KPX ntilde uhungarumlaut -10 +KPX ntilde umacron -10 +KPX ntilde uogonek -10 +KPX ntilde uring -10 +KPX ntilde v -20 +KPX ntilde y -15 +KPX ntilde yacute -15 +KPX ntilde ydieresis -15 +KPX o comma -40 +KPX o period -40 +KPX o v -15 +KPX o w -15 +KPX o x -30 +KPX o y -30 +KPX o yacute -30 +KPX o ydieresis -30 +KPX oacute comma -40 +KPX oacute period -40 +KPX oacute v -15 +KPX oacute w -15 +KPX oacute x -30 +KPX oacute y -30 +KPX oacute yacute -30 +KPX oacute ydieresis -30 +KPX ocircumflex comma -40 +KPX ocircumflex period -40 +KPX ocircumflex v -15 +KPX ocircumflex w -15 +KPX ocircumflex x -30 +KPX ocircumflex y -30 +KPX ocircumflex yacute -30 +KPX ocircumflex ydieresis -30 +KPX odieresis comma -40 +KPX odieresis period -40 +KPX odieresis v -15 +KPX odieresis w -15 +KPX odieresis x -30 +KPX odieresis y -30 +KPX odieresis yacute -30 +KPX odieresis ydieresis -30 +KPX ograve comma -40 +KPX ograve period -40 +KPX ograve v -15 +KPX ograve w -15 +KPX ograve x -30 +KPX ograve y -30 +KPX ograve yacute -30 +KPX ograve ydieresis -30 +KPX ohungarumlaut comma -40 +KPX ohungarumlaut period -40 +KPX ohungarumlaut v -15 +KPX ohungarumlaut w -15 +KPX ohungarumlaut x -30 +KPX ohungarumlaut y -30 +KPX ohungarumlaut yacute -30 +KPX ohungarumlaut ydieresis -30 +KPX omacron comma -40 +KPX omacron period -40 +KPX omacron v -15 +KPX omacron w -15 +KPX omacron x -30 +KPX omacron y -30 +KPX omacron yacute -30 +KPX omacron ydieresis -30 +KPX oslash a -55 +KPX oslash aacute -55 +KPX oslash abreve -55 +KPX oslash acircumflex -55 +KPX oslash adieresis -55 +KPX oslash agrave -55 +KPX oslash amacron -55 +KPX oslash aogonek -55 +KPX oslash aring -55 +KPX oslash atilde -55 +KPX oslash b -55 +KPX oslash c -55 +KPX oslash cacute -55 +KPX oslash ccaron -55 +KPX oslash ccedilla -55 +KPX oslash comma -95 +KPX oslash d -55 +KPX oslash dcroat -55 +KPX oslash e -55 +KPX oslash eacute -55 +KPX oslash ecaron -55 +KPX oslash ecircumflex -55 +KPX oslash edieresis -55 +KPX oslash edotaccent -55 +KPX oslash egrave -55 +KPX oslash emacron -55 +KPX oslash eogonek -55 +KPX oslash f -55 +KPX oslash g -55 +KPX oslash gbreve -55 +KPX oslash gcommaaccent -55 +KPX oslash h -55 +KPX oslash i -55 +KPX oslash iacute -55 +KPX oslash icircumflex -55 +KPX oslash idieresis -55 +KPX oslash igrave -55 +KPX oslash imacron -55 +KPX oslash iogonek -55 +KPX oslash j -55 +KPX oslash k -55 +KPX oslash kcommaaccent -55 +KPX oslash l -55 +KPX oslash lacute -55 +KPX oslash lcommaaccent -55 +KPX oslash lslash -55 +KPX oslash m -55 +KPX oslash n -55 +KPX oslash nacute -55 +KPX oslash ncaron -55 +KPX oslash ncommaaccent -55 +KPX oslash ntilde -55 +KPX oslash o -55 +KPX oslash oacute -55 +KPX oslash ocircumflex -55 +KPX oslash odieresis -55 +KPX oslash ograve -55 +KPX oslash ohungarumlaut -55 +KPX oslash omacron -55 +KPX oslash oslash -55 +KPX oslash otilde -55 +KPX oslash p -55 +KPX oslash period -95 +KPX oslash q -55 +KPX oslash r -55 +KPX oslash racute -55 +KPX oslash rcaron -55 +KPX oslash rcommaaccent -55 +KPX oslash s -55 +KPX oslash sacute -55 +KPX oslash scaron -55 +KPX oslash scedilla -55 +KPX oslash scommaaccent -55 +KPX oslash t -55 +KPX oslash tcommaaccent -55 +KPX oslash u -55 +KPX oslash uacute -55 +KPX oslash ucircumflex -55 +KPX oslash udieresis -55 +KPX oslash ugrave -55 +KPX oslash uhungarumlaut -55 +KPX oslash umacron -55 +KPX oslash uogonek -55 +KPX oslash uring -55 +KPX oslash v -70 +KPX oslash w -70 +KPX oslash x -85 +KPX oslash y -70 +KPX oslash yacute -70 +KPX oslash ydieresis -70 +KPX oslash z -55 +KPX oslash zacute -55 +KPX oslash zcaron -55 +KPX oslash zdotaccent -55 +KPX otilde comma -40 +KPX otilde period -40 +KPX otilde v -15 +KPX otilde w -15 +KPX otilde x -30 +KPX otilde y -30 +KPX otilde yacute -30 +KPX otilde ydieresis -30 +KPX p comma -35 +KPX p period -35 +KPX p y -30 +KPX p yacute -30 +KPX p ydieresis -30 +KPX period quotedblright -100 +KPX period quoteright -100 +KPX period space -60 +KPX quotedblright space -40 +KPX quoteleft quoteleft -57 +KPX quoteright d -50 +KPX quoteright dcroat -50 +KPX quoteright quoteright -57 +KPX quoteright r -50 +KPX quoteright racute -50 +KPX quoteright rcaron -50 +KPX quoteright rcommaaccent -50 +KPX quoteright s -50 +KPX quoteright sacute -50 +KPX quoteright scaron -50 +KPX quoteright scedilla -50 +KPX quoteright scommaaccent -50 +KPX quoteright space -70 +KPX r a -10 +KPX r aacute -10 +KPX r abreve -10 +KPX r acircumflex -10 +KPX r adieresis -10 +KPX r agrave -10 +KPX r amacron -10 +KPX r aogonek -10 +KPX r aring -10 +KPX r atilde -10 +KPX r colon 30 +KPX r comma -50 +KPX r i 15 +KPX r iacute 15 +KPX r icircumflex 15 +KPX r idieresis 15 +KPX r igrave 15 +KPX r imacron 15 +KPX r iogonek 15 +KPX r k 15 +KPX r kcommaaccent 15 +KPX r l 15 +KPX r lacute 15 +KPX r lcommaaccent 15 +KPX r lslash 15 +KPX r m 25 +KPX r n 25 +KPX r nacute 25 +KPX r ncaron 25 +KPX r ncommaaccent 25 +KPX r ntilde 25 +KPX r p 30 +KPX r period -50 +KPX r semicolon 30 +KPX r t 40 +KPX r tcommaaccent 40 +KPX r u 15 +KPX r uacute 15 +KPX r ucircumflex 15 +KPX r udieresis 15 +KPX r ugrave 15 +KPX r uhungarumlaut 15 +KPX r umacron 15 +KPX r uogonek 15 +KPX r uring 15 +KPX r v 30 +KPX r y 30 +KPX r yacute 30 +KPX r ydieresis 30 +KPX racute a -10 +KPX racute aacute -10 +KPX racute abreve -10 +KPX racute acircumflex -10 +KPX racute adieresis -10 +KPX racute agrave -10 +KPX racute amacron -10 +KPX racute aogonek -10 +KPX racute aring -10 +KPX racute atilde -10 +KPX racute colon 30 +KPX racute comma -50 +KPX racute i 15 +KPX racute iacute 15 +KPX racute icircumflex 15 +KPX racute idieresis 15 +KPX racute igrave 15 +KPX racute imacron 15 +KPX racute iogonek 15 +KPX racute k 15 +KPX racute kcommaaccent 15 +KPX racute l 15 +KPX racute lacute 15 +KPX racute lcommaaccent 15 +KPX racute lslash 15 +KPX racute m 25 +KPX racute n 25 +KPX racute nacute 25 +KPX racute ncaron 25 +KPX racute ncommaaccent 25 +KPX racute ntilde 25 +KPX racute p 30 +KPX racute period -50 +KPX racute semicolon 30 +KPX racute t 40 +KPX racute tcommaaccent 40 +KPX racute u 15 +KPX racute uacute 15 +KPX racute ucircumflex 15 +KPX racute udieresis 15 +KPX racute ugrave 15 +KPX racute uhungarumlaut 15 +KPX racute umacron 15 +KPX racute uogonek 15 +KPX racute uring 15 +KPX racute v 30 +KPX racute y 30 +KPX racute yacute 30 +KPX racute ydieresis 30 +KPX rcaron a -10 +KPX rcaron aacute -10 +KPX rcaron abreve -10 +KPX rcaron acircumflex -10 +KPX rcaron adieresis -10 +KPX rcaron agrave -10 +KPX rcaron amacron -10 +KPX rcaron aogonek -10 +KPX rcaron aring -10 +KPX rcaron atilde -10 +KPX rcaron colon 30 +KPX rcaron comma -50 +KPX rcaron i 15 +KPX rcaron iacute 15 +KPX rcaron icircumflex 15 +KPX rcaron idieresis 15 +KPX rcaron igrave 15 +KPX rcaron imacron 15 +KPX rcaron iogonek 15 +KPX rcaron k 15 +KPX rcaron kcommaaccent 15 +KPX rcaron l 15 +KPX rcaron lacute 15 +KPX rcaron lcommaaccent 15 +KPX rcaron lslash 15 +KPX rcaron m 25 +KPX rcaron n 25 +KPX rcaron nacute 25 +KPX rcaron ncaron 25 +KPX rcaron ncommaaccent 25 +KPX rcaron ntilde 25 +KPX rcaron p 30 +KPX rcaron period -50 +KPX rcaron semicolon 30 +KPX rcaron t 40 +KPX rcaron tcommaaccent 40 +KPX rcaron u 15 +KPX rcaron uacute 15 +KPX rcaron ucircumflex 15 +KPX rcaron udieresis 15 +KPX rcaron ugrave 15 +KPX rcaron uhungarumlaut 15 +KPX rcaron umacron 15 +KPX rcaron uogonek 15 +KPX rcaron uring 15 +KPX rcaron v 30 +KPX rcaron y 30 +KPX rcaron yacute 30 +KPX rcaron ydieresis 30 +KPX rcommaaccent a -10 +KPX rcommaaccent aacute -10 +KPX rcommaaccent abreve -10 +KPX rcommaaccent acircumflex -10 +KPX rcommaaccent adieresis -10 +KPX rcommaaccent agrave -10 +KPX rcommaaccent amacron -10 +KPX rcommaaccent aogonek -10 +KPX rcommaaccent aring -10 +KPX rcommaaccent atilde -10 +KPX rcommaaccent colon 30 +KPX rcommaaccent comma -50 +KPX rcommaaccent i 15 +KPX rcommaaccent iacute 15 +KPX rcommaaccent icircumflex 15 +KPX rcommaaccent idieresis 15 +KPX rcommaaccent igrave 15 +KPX rcommaaccent imacron 15 +KPX rcommaaccent iogonek 15 +KPX rcommaaccent k 15 +KPX rcommaaccent kcommaaccent 15 +KPX rcommaaccent l 15 +KPX rcommaaccent lacute 15 +KPX rcommaaccent lcommaaccent 15 +KPX rcommaaccent lslash 15 +KPX rcommaaccent m 25 +KPX rcommaaccent n 25 +KPX rcommaaccent nacute 25 +KPX rcommaaccent ncaron 25 +KPX rcommaaccent ncommaaccent 25 +KPX rcommaaccent ntilde 25 +KPX rcommaaccent p 30 +KPX rcommaaccent period -50 +KPX rcommaaccent semicolon 30 +KPX rcommaaccent t 40 +KPX rcommaaccent tcommaaccent 40 +KPX rcommaaccent u 15 +KPX rcommaaccent uacute 15 +KPX rcommaaccent ucircumflex 15 +KPX rcommaaccent udieresis 15 +KPX rcommaaccent ugrave 15 +KPX rcommaaccent uhungarumlaut 15 +KPX rcommaaccent umacron 15 +KPX rcommaaccent uogonek 15 +KPX rcommaaccent uring 15 +KPX rcommaaccent v 30 +KPX rcommaaccent y 30 +KPX rcommaaccent yacute 30 +KPX rcommaaccent ydieresis 30 +KPX s comma -15 +KPX s period -15 +KPX s w -30 +KPX sacute comma -15 +KPX sacute period -15 +KPX sacute w -30 +KPX scaron comma -15 +KPX scaron period -15 +KPX scaron w -30 +KPX scedilla comma -15 +KPX scedilla period -15 +KPX scedilla w -30 +KPX scommaaccent comma -15 +KPX scommaaccent period -15 +KPX scommaaccent w -30 +KPX semicolon space -50 +KPX space T -50 +KPX space Tcaron -50 +KPX space Tcommaaccent -50 +KPX space V -50 +KPX space W -40 +KPX space Y -90 +KPX space Yacute -90 +KPX space Ydieresis -90 +KPX space quotedblleft -30 +KPX space quoteleft -60 +KPX v a -25 +KPX v aacute -25 +KPX v abreve -25 +KPX v acircumflex -25 +KPX v adieresis -25 +KPX v agrave -25 +KPX v amacron -25 +KPX v aogonek -25 +KPX v aring -25 +KPX v atilde -25 +KPX v comma -80 +KPX v e -25 +KPX v eacute -25 +KPX v ecaron -25 +KPX v ecircumflex -25 +KPX v edieresis -25 +KPX v edotaccent -25 +KPX v egrave -25 +KPX v emacron -25 +KPX v eogonek -25 +KPX v o -25 +KPX v oacute -25 +KPX v ocircumflex -25 +KPX v odieresis -25 +KPX v ograve -25 +KPX v ohungarumlaut -25 +KPX v omacron -25 +KPX v oslash -25 +KPX v otilde -25 +KPX v period -80 +KPX w a -15 +KPX w aacute -15 +KPX w abreve -15 +KPX w acircumflex -15 +KPX w adieresis -15 +KPX w agrave -15 +KPX w amacron -15 +KPX w aogonek -15 +KPX w aring -15 +KPX w atilde -15 +KPX w comma -60 +KPX w e -10 +KPX w eacute -10 +KPX w ecaron -10 +KPX w ecircumflex -10 +KPX w edieresis -10 +KPX w edotaccent -10 +KPX w egrave -10 +KPX w emacron -10 +KPX w eogonek -10 +KPX w o -10 +KPX w oacute -10 +KPX w ocircumflex -10 +KPX w odieresis -10 +KPX w ograve -10 +KPX w ohungarumlaut -10 +KPX w omacron -10 +KPX w oslash -10 +KPX w otilde -10 +KPX w period -60 +KPX x e -30 +KPX x eacute -30 +KPX x ecaron -30 +KPX x ecircumflex -30 +KPX x edieresis -30 +KPX x edotaccent -30 +KPX x egrave -30 +KPX x emacron -30 +KPX x eogonek -30 +KPX y a -20 +KPX y aacute -20 +KPX y abreve -20 +KPX y acircumflex -20 +KPX y adieresis -20 +KPX y agrave -20 +KPX y amacron -20 +KPX y aogonek -20 +KPX y aring -20 +KPX y atilde -20 +KPX y comma -100 +KPX y e -20 +KPX y eacute -20 +KPX y ecaron -20 +KPX y ecircumflex -20 +KPX y edieresis -20 +KPX y edotaccent -20 +KPX y egrave -20 +KPX y emacron -20 +KPX y eogonek -20 +KPX y o -20 +KPX y oacute -20 +KPX y ocircumflex -20 +KPX y odieresis -20 +KPX y ograve -20 +KPX y ohungarumlaut -20 +KPX y omacron -20 +KPX y oslash -20 +KPX y otilde -20 +KPX y period -100 +KPX yacute a -20 +KPX yacute aacute -20 +KPX yacute abreve -20 +KPX yacute acircumflex -20 +KPX yacute adieresis -20 +KPX yacute agrave -20 +KPX yacute amacron -20 +KPX yacute aogonek -20 +KPX yacute aring -20 +KPX yacute atilde -20 +KPX yacute comma -100 +KPX yacute e -20 +KPX yacute eacute -20 +KPX yacute ecaron -20 +KPX yacute ecircumflex -20 +KPX yacute edieresis -20 +KPX yacute edotaccent -20 +KPX yacute egrave -20 +KPX yacute emacron -20 +KPX yacute eogonek -20 +KPX yacute o -20 +KPX yacute oacute -20 +KPX yacute ocircumflex -20 +KPX yacute odieresis -20 +KPX yacute ograve -20 +KPX yacute ohungarumlaut -20 +KPX yacute omacron -20 +KPX yacute oslash -20 +KPX yacute otilde -20 +KPX yacute period -100 +KPX ydieresis a -20 +KPX ydieresis aacute -20 +KPX ydieresis abreve -20 +KPX ydieresis acircumflex -20 +KPX ydieresis adieresis -20 +KPX ydieresis agrave -20 +KPX ydieresis amacron -20 +KPX ydieresis aogonek -20 +KPX ydieresis aring -20 +KPX ydieresis atilde -20 +KPX ydieresis comma -100 +KPX ydieresis e -20 +KPX ydieresis eacute -20 +KPX ydieresis ecaron -20 +KPX ydieresis ecircumflex -20 +KPX ydieresis edieresis -20 +KPX ydieresis edotaccent -20 +KPX ydieresis egrave -20 +KPX ydieresis emacron -20 +KPX ydieresis eogonek -20 +KPX ydieresis o -20 +KPX ydieresis oacute -20 +KPX ydieresis ocircumflex -20 +KPX ydieresis odieresis -20 +KPX ydieresis ograve -20 +KPX ydieresis ohungarumlaut -20 +KPX ydieresis omacron -20 +KPX ydieresis oslash -20 +KPX ydieresis otilde -20 +KPX ydieresis period -100 +KPX z e -15 +KPX z eacute -15 +KPX z ecaron -15 +KPX z ecircumflex -15 +KPX z edieresis -15 +KPX z edotaccent -15 +KPX z egrave -15 +KPX z emacron -15 +KPX z eogonek -15 +KPX z o -15 +KPX z oacute -15 +KPX z ocircumflex -15 +KPX z odieresis -15 +KPX z ograve -15 +KPX z ohungarumlaut -15 +KPX z omacron -15 +KPX z oslash -15 +KPX z otilde -15 +KPX zacute e -15 +KPX zacute eacute -15 +KPX zacute ecaron -15 +KPX zacute ecircumflex -15 +KPX zacute edieresis -15 +KPX zacute edotaccent -15 +KPX zacute egrave -15 +KPX zacute emacron -15 +KPX zacute eogonek -15 +KPX zacute o -15 +KPX zacute oacute -15 +KPX zacute ocircumflex -15 +KPX zacute odieresis -15 +KPX zacute ograve -15 +KPX zacute ohungarumlaut -15 +KPX zacute omacron -15 +KPX zacute oslash -15 +KPX zacute otilde -15 +KPX zcaron e -15 +KPX zcaron eacute -15 +KPX zcaron ecaron -15 +KPX zcaron ecircumflex -15 +KPX zcaron edieresis -15 +KPX zcaron edotaccent -15 +KPX zcaron egrave -15 +KPX zcaron emacron -15 +KPX zcaron eogonek -15 +KPX zcaron o -15 +KPX zcaron oacute -15 +KPX zcaron ocircumflex -15 +KPX zcaron odieresis -15 +KPX zcaron ograve -15 +KPX zcaron ohungarumlaut -15 +KPX zcaron omacron -15 +KPX zcaron oslash -15 +KPX zcaron otilde -15 +KPX zdotaccent e -15 +KPX zdotaccent eacute -15 +KPX zdotaccent ecaron -15 +KPX zdotaccent ecircumflex -15 +KPX zdotaccent edieresis -15 +KPX zdotaccent edotaccent -15 +KPX zdotaccent egrave -15 +KPX zdotaccent emacron -15 +KPX zdotaccent eogonek -15 +KPX zdotaccent o -15 +KPX zdotaccent oacute -15 +KPX zdotaccent ocircumflex -15 +KPX zdotaccent odieresis -15 +KPX zdotaccent ograve -15 +KPX zdotaccent ohungarumlaut -15 +KPX zdotaccent omacron -15 +KPX zdotaccent oslash -15 +KPX zdotaccent otilde -15 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/Helvetica.afm b/dompdf/vendor/dompdf/dompdf/lib/fonts/Helvetica.afm new file mode 100644 index 0000000..35a15b1 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/Helvetica.afm @@ -0,0 +1,3053 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:38:23 1997 +Comment UniqueID 43054 +Comment VMusage 37069 48094 +FontName Helvetica +FullName Helvetica +FamilyName Helvetica +Weight Medium +ItalicAngle 0 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -166 -225 1000 931 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 718 +XHeight 523 +Ascender 718 +Descender -207 +StdHW 76 +StdVW 88 +StartCharMetrics 317 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 160 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 278 ; N exclam ; B 90 0 187 718 ; +C 34 ; WX 355 ; N quotedbl ; B 70 463 285 718 ; +C 35 ; WX 556 ; N numbersign ; B 28 0 529 688 ; +C 36 ; WX 556 ; N dollar ; B 32 -115 520 775 ; +C 37 ; WX 889 ; N percent ; B 39 -19 850 703 ; +C 38 ; WX 667 ; N ampersand ; B 44 -15 645 718 ; +C 146 ; WX 222 ; N quoteright ; B 53 463 157 718 ; +C 40 ; WX 333 ; N parenleft ; B 68 -207 299 733 ; +C 41 ; WX 333 ; N parenright ; B 34 -207 265 733 ; +C 42 ; WX 389 ; N asterisk ; B 39 431 349 718 ; +C 43 ; WX 584 ; N plus ; B 39 0 545 505 ; +C 44 ; WX 278 ; N comma ; B 87 -147 191 106 ; +C 45 ; WX 333 ; N hyphen ; B 44 232 289 322 ; +C 173 ; WX 333 ; N hyphen ; B 44 232 289 322 ; +C 46 ; WX 278 ; N period ; B 87 0 191 106 ; +C 47 ; WX 278 ; N slash ; B -17 -19 295 737 ; +C 48 ; WX 556 ; N zero ; B 37 -19 519 703 ; +C 49 ; WX 556 ; N one ; B 101 0 359 703 ; +C 50 ; WX 556 ; N two ; B 26 0 507 703 ; +C 51 ; WX 556 ; N three ; B 34 -19 522 703 ; +C 52 ; WX 556 ; N four ; B 25 0 523 703 ; +C 53 ; WX 556 ; N five ; B 32 -19 514 688 ; +C 54 ; WX 556 ; N six ; B 38 -19 518 703 ; +C 55 ; WX 556 ; N seven ; B 37 0 523 688 ; +C 56 ; WX 556 ; N eight ; B 38 -19 517 703 ; +C 57 ; WX 556 ; N nine ; B 42 -19 514 703 ; +C 58 ; WX 278 ; N colon ; B 87 0 191 516 ; +C 59 ; WX 278 ; N semicolon ; B 87 -147 191 516 ; +C 60 ; WX 584 ; N less ; B 48 11 536 495 ; +C 61 ; WX 584 ; N equal ; B 39 115 545 390 ; +C 62 ; WX 584 ; N greater ; B 48 11 536 495 ; +C 63 ; WX 556 ; N question ; B 56 0 492 727 ; +C 64 ; WX 1015 ; N at ; B 147 -19 868 737 ; +C 65 ; WX 667 ; N A ; B 14 0 654 718 ; +C 66 ; WX 667 ; N B ; B 74 0 627 718 ; +C 67 ; WX 722 ; N C ; B 44 -19 681 737 ; +C 68 ; WX 722 ; N D ; B 81 0 674 718 ; +C 69 ; WX 667 ; N E ; B 86 0 616 718 ; +C 70 ; WX 611 ; N F ; B 86 0 583 718 ; +C 71 ; WX 778 ; N G ; B 48 -19 704 737 ; +C 72 ; WX 722 ; N H ; B 77 0 646 718 ; +C 73 ; WX 278 ; N I ; B 91 0 188 718 ; +C 74 ; WX 500 ; N J ; B 17 -19 428 718 ; +C 75 ; WX 667 ; N K ; B 76 0 663 718 ; +C 76 ; WX 556 ; N L ; B 76 0 537 718 ; +C 77 ; WX 833 ; N M ; B 73 0 761 718 ; +C 78 ; WX 722 ; N N ; B 76 0 646 718 ; +C 79 ; WX 778 ; N O ; B 39 -19 739 737 ; +C 80 ; WX 667 ; N P ; B 86 0 622 718 ; +C 81 ; WX 778 ; N Q ; B 39 -56 739 737 ; +C 82 ; WX 722 ; N R ; B 88 0 684 718 ; +C 83 ; WX 667 ; N S ; B 49 -19 620 737 ; +C 84 ; WX 611 ; N T ; B 14 0 597 718 ; +C 85 ; WX 722 ; N U ; B 79 -19 644 718 ; +C 86 ; WX 667 ; N V ; B 20 0 647 718 ; +C 87 ; WX 944 ; N W ; B 16 0 928 718 ; +C 88 ; WX 667 ; N X ; B 19 0 648 718 ; +C 89 ; WX 667 ; N Y ; B 14 0 653 718 ; +C 90 ; WX 611 ; N Z ; B 23 0 588 718 ; +C 91 ; WX 278 ; N bracketleft ; B 63 -196 250 722 ; +C 92 ; WX 278 ; N backslash ; B -17 -19 295 737 ; +C 93 ; WX 278 ; N bracketright ; B 28 -196 215 722 ; +C 94 ; WX 469 ; N asciicircum ; B -14 264 483 688 ; +C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ; +C 145 ; WX 222 ; N quoteleft ; B 65 470 169 725 ; +C 97 ; WX 556 ; N a ; B 36 -15 530 538 ; +C 98 ; WX 556 ; N b ; B 58 -15 517 718 ; +C 99 ; WX 500 ; N c ; B 30 -15 477 538 ; +C 100 ; WX 556 ; N d ; B 35 -15 499 718 ; +C 101 ; WX 556 ; N e ; B 40 -15 516 538 ; +C 102 ; WX 278 ; N f ; B 14 0 262 728 ; L i fi ; L l fl ; +C 103 ; WX 556 ; N g ; B 40 -220 499 538 ; +C 104 ; WX 556 ; N h ; B 65 0 491 718 ; +C 105 ; WX 222 ; N i ; B 67 0 155 718 ; +C 106 ; WX 222 ; N j ; B -16 -210 155 718 ; +C 107 ; WX 500 ; N k ; B 67 0 501 718 ; +C 108 ; WX 222 ; N l ; B 67 0 155 718 ; +C 109 ; WX 833 ; N m ; B 65 0 769 538 ; +C 110 ; WX 556 ; N n ; B 65 0 491 538 ; +C 111 ; WX 556 ; N o ; B 35 -14 521 538 ; +C 112 ; WX 556 ; N p ; B 58 -207 517 538 ; +C 113 ; WX 556 ; N q ; B 35 -207 494 538 ; +C 114 ; WX 333 ; N r ; B 77 0 332 538 ; +C 115 ; WX 500 ; N s ; B 32 -15 464 538 ; +C 116 ; WX 278 ; N t ; B 14 -7 257 669 ; +C 117 ; WX 556 ; N u ; B 68 -15 489 523 ; +C 118 ; WX 500 ; N v ; B 8 0 492 523 ; +C 119 ; WX 722 ; N w ; B 14 0 709 523 ; +C 120 ; WX 500 ; N x ; B 11 0 490 523 ; +C 121 ; WX 500 ; N y ; B 11 -214 489 523 ; +C 122 ; WX 500 ; N z ; B 31 0 469 523 ; +C 123 ; WX 334 ; N braceleft ; B 42 -196 292 722 ; +C 124 ; WX 260 ; N bar ; B 94 -225 167 775 ; +C 125 ; WX 334 ; N braceright ; B 42 -196 292 722 ; +C 126 ; WX 584 ; N asciitilde ; B 61 180 523 326 ; +C 161 ; WX 333 ; N exclamdown ; B 118 -195 215 523 ; +C 162 ; WX 556 ; N cent ; B 51 -115 513 623 ; +C 163 ; WX 556 ; N sterling ; B 33 -16 539 718 ; +C -1 ; WX 167 ; N fraction ; B -166 -19 333 703 ; +C 165 ; WX 556 ; N yen ; B 3 0 553 688 ; +C 131 ; WX 556 ; N florin ; B -11 -207 501 737 ; +C 167 ; WX 556 ; N section ; B 43 -191 512 737 ; +C 164 ; WX 556 ; N currency ; B 28 99 528 603 ; +C 39 ; WX 191 ; N quotesingle ; B 59 463 132 718 ; +C 147 ; WX 333 ; N quotedblleft ; B 38 470 307 725 ; +C 171 ; WX 556 ; N guillemotleft ; B 97 108 459 446 ; +C 139 ; WX 333 ; N guilsinglleft ; B 88 108 245 446 ; +C 155 ; WX 333 ; N guilsinglright ; B 88 108 245 446 ; +C -1 ; WX 500 ; N fi ; B 14 0 434 728 ; +C -1 ; WX 500 ; N fl ; B 14 0 432 728 ; +C 150 ; WX 556 ; N endash ; B 0 240 556 313 ; +C 134 ; WX 556 ; N dagger ; B 43 -159 514 718 ; +C 135 ; WX 556 ; N daggerdbl ; B 43 -159 514 718 ; +C 183 ; WX 278 ; N periodcentered ; B 77 190 202 315 ; +C 182 ; WX 537 ; N paragraph ; B 18 -173 497 718 ; +C 149 ; WX 350 ; N bullet ; B 18 202 333 517 ; +C 130 ; WX 222 ; N quotesinglbase ; B 53 -149 157 106 ; +C 132 ; WX 333 ; N quotedblbase ; B 26 -149 295 106 ; +C 148 ; WX 333 ; N quotedblright ; B 26 463 295 718 ; +C 187 ; WX 556 ; N guillemotright ; B 97 108 459 446 ; +C 133 ; WX 1000 ; N ellipsis ; B 115 0 885 106 ; +C 137 ; WX 1000 ; N perthousand ; B 7 -19 994 703 ; +C 191 ; WX 611 ; N questiondown ; B 91 -201 527 525 ; +C 96 ; WX 333 ; N grave ; B 14 593 211 734 ; +C 180 ; WX 333 ; N acute ; B 122 593 319 734 ; +C 136 ; WX 333 ; N circumflex ; B 21 593 312 734 ; +C 152 ; WX 333 ; N tilde ; B -4 606 337 722 ; +C 175 ; WX 333 ; N macron ; B 10 627 323 684 ; +C -1 ; WX 333 ; N breve ; B 13 595 321 731 ; +C -1 ; WX 333 ; N dotaccent ; B 121 604 212 706 ; +C 168 ; WX 333 ; N dieresis ; B 40 604 293 706 ; +C -1 ; WX 333 ; N ring ; B 75 572 259 756 ; +C 184 ; WX 333 ; N cedilla ; B 45 -225 259 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B 31 593 409 734 ; +C -1 ; WX 333 ; N ogonek ; B 73 -225 287 0 ; +C -1 ; WX 333 ; N caron ; B 21 593 312 734 ; +C 151 ; WX 1000 ; N emdash ; B 0 240 1000 313 ; +C 198 ; WX 1000 ; N AE ; B 8 0 951 718 ; +C 170 ; WX 370 ; N ordfeminine ; B 24 405 346 737 ; +C -1 ; WX 556 ; N Lslash ; B -20 0 537 718 ; +C 216 ; WX 778 ; N Oslash ; B 39 -19 740 737 ; +C 140 ; WX 1000 ; N OE ; B 36 -19 965 737 ; +C 186 ; WX 365 ; N ordmasculine ; B 25 405 341 737 ; +C 230 ; WX 889 ; N ae ; B 36 -15 847 538 ; +C -1 ; WX 278 ; N dotlessi ; B 95 0 183 523 ; +C -1 ; WX 222 ; N lslash ; B -20 0 242 718 ; +C 248 ; WX 611 ; N oslash ; B 28 -22 537 545 ; +C 156 ; WX 944 ; N oe ; B 35 -15 902 538 ; +C 223 ; WX 611 ; N germandbls ; B 67 -15 571 728 ; +C 207 ; WX 278 ; N Idieresis ; B 13 0 266 901 ; +C 233 ; WX 556 ; N eacute ; B 40 -15 516 734 ; +C -1 ; WX 556 ; N abreve ; B 36 -15 530 731 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 68 -15 521 734 ; +C -1 ; WX 556 ; N ecaron ; B 40 -15 516 734 ; +C 159 ; WX 667 ; N Ydieresis ; B 14 0 653 901 ; +C 247 ; WX 584 ; N divide ; B 39 -19 545 524 ; +C 221 ; WX 667 ; N Yacute ; B 14 0 653 929 ; +C 194 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ; +C 225 ; WX 556 ; N aacute ; B 36 -15 530 734 ; +C 219 ; WX 722 ; N Ucircumflex ; B 79 -19 644 929 ; +C 253 ; WX 500 ; N yacute ; B 11 -214 489 734 ; +C -1 ; WX 500 ; N scommaaccent ; B 32 -225 464 538 ; +C 234 ; WX 556 ; N ecircumflex ; B 40 -15 516 734 ; +C -1 ; WX 722 ; N Uring ; B 79 -19 644 931 ; +C 220 ; WX 722 ; N Udieresis ; B 79 -19 644 901 ; +C -1 ; WX 556 ; N aogonek ; B 36 -220 547 538 ; +C 218 ; WX 722 ; N Uacute ; B 79 -19 644 929 ; +C -1 ; WX 556 ; N uogonek ; B 68 -225 519 523 ; +C 203 ; WX 667 ; N Edieresis ; B 86 0 616 901 ; +C -1 ; WX 722 ; N Dcroat ; B 0 0 674 718 ; +C -1 ; WX 250 ; N commaaccent ; B 87 -225 181 -40 ; +C 169 ; WX 737 ; N copyright ; B -14 -19 752 737 ; +C -1 ; WX 667 ; N Emacron ; B 86 0 616 879 ; +C -1 ; WX 500 ; N ccaron ; B 30 -15 477 734 ; +C 229 ; WX 556 ; N aring ; B 36 -15 530 756 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 646 718 ; +C -1 ; WX 222 ; N lacute ; B 67 0 264 929 ; +C 224 ; WX 556 ; N agrave ; B 36 -15 530 734 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 14 -225 597 718 ; +C -1 ; WX 722 ; N Cacute ; B 44 -19 681 929 ; +C 227 ; WX 556 ; N atilde ; B 36 -15 530 722 ; +C -1 ; WX 667 ; N Edotaccent ; B 86 0 616 901 ; +C 154 ; WX 500 ; N scaron ; B 32 -15 464 734 ; +C -1 ; WX 500 ; N scedilla ; B 32 -225 464 538 ; +C 237 ; WX 278 ; N iacute ; B 95 0 292 734 ; +C -1 ; WX 471 ; N lozenge ; B 10 0 462 728 ; +C -1 ; WX 722 ; N Rcaron ; B 88 0 684 929 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 48 -225 704 737 ; +C 251 ; WX 556 ; N ucircumflex ; B 68 -15 489 734 ; +C 226 ; WX 556 ; N acircumflex ; B 36 -15 530 734 ; +C -1 ; WX 667 ; N Amacron ; B 14 0 654 879 ; +C -1 ; WX 333 ; N rcaron ; B 61 0 352 734 ; +C 231 ; WX 500 ; N ccedilla ; B 30 -225 477 538 ; +C -1 ; WX 611 ; N Zdotaccent ; B 23 0 588 901 ; +C 222 ; WX 667 ; N Thorn ; B 86 0 622 718 ; +C -1 ; WX 778 ; N Omacron ; B 39 -19 739 879 ; +C -1 ; WX 722 ; N Racute ; B 88 0 684 929 ; +C -1 ; WX 667 ; N Sacute ; B 49 -19 620 929 ; +C -1 ; WX 643 ; N dcaron ; B 35 -15 655 718 ; +C -1 ; WX 722 ; N Umacron ; B 79 -19 644 879 ; +C -1 ; WX 556 ; N uring ; B 68 -15 489 756 ; +C 179 ; WX 333 ; N threesuperior ; B 5 270 325 703 ; +C 210 ; WX 778 ; N Ograve ; B 39 -19 739 929 ; +C 192 ; WX 667 ; N Agrave ; B 14 0 654 929 ; +C -1 ; WX 667 ; N Abreve ; B 14 0 654 926 ; +C 215 ; WX 584 ; N multiply ; B 39 0 545 506 ; +C 250 ; WX 556 ; N uacute ; B 68 -15 489 734 ; +C -1 ; WX 611 ; N Tcaron ; B 14 0 597 929 ; +C -1 ; WX 476 ; N partialdiff ; B 13 -38 463 714 ; +C 255 ; WX 500 ; N ydieresis ; B 11 -214 489 706 ; +C -1 ; WX 722 ; N Nacute ; B 76 0 646 929 ; +C 238 ; WX 278 ; N icircumflex ; B -6 0 285 734 ; +C 202 ; WX 667 ; N Ecircumflex ; B 86 0 616 929 ; +C 228 ; WX 556 ; N adieresis ; B 36 -15 530 706 ; +C 235 ; WX 556 ; N edieresis ; B 40 -15 516 706 ; +C -1 ; WX 500 ; N cacute ; B 30 -15 477 734 ; +C -1 ; WX 556 ; N nacute ; B 65 0 491 734 ; +C -1 ; WX 556 ; N umacron ; B 68 -15 489 684 ; +C -1 ; WX 722 ; N Ncaron ; B 76 0 646 929 ; +C 205 ; WX 278 ; N Iacute ; B 91 0 292 929 ; +C 177 ; WX 584 ; N plusminus ; B 39 0 545 506 ; +C 166 ; WX 260 ; N brokenbar ; B 94 -150 167 700 ; +C 174 ; WX 737 ; N registered ; B -14 -19 752 737 ; +C -1 ; WX 778 ; N Gbreve ; B 48 -19 704 926 ; +C -1 ; WX 278 ; N Idotaccent ; B 91 0 188 901 ; +C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ; +C 200 ; WX 667 ; N Egrave ; B 86 0 616 929 ; +C -1 ; WX 333 ; N racute ; B 77 0 332 734 ; +C -1 ; WX 556 ; N omacron ; B 35 -14 521 684 ; +C -1 ; WX 611 ; N Zacute ; B 23 0 588 929 ; +C 142 ; WX 611 ; N Zcaron ; B 23 0 588 929 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 674 ; +C 208 ; WX 722 ; N Eth ; B 0 0 674 718 ; +C 199 ; WX 722 ; N Ccedilla ; B 44 -225 681 737 ; +C -1 ; WX 222 ; N lcommaaccent ; B 67 -225 167 718 ; +C -1 ; WX 317 ; N tcaron ; B 14 -7 329 808 ; +C -1 ; WX 556 ; N eogonek ; B 40 -225 516 538 ; +C -1 ; WX 722 ; N Uogonek ; B 79 -225 644 718 ; +C 193 ; WX 667 ; N Aacute ; B 14 0 654 929 ; +C 196 ; WX 667 ; N Adieresis ; B 14 0 654 901 ; +C 232 ; WX 556 ; N egrave ; B 40 -15 516 734 ; +C -1 ; WX 500 ; N zacute ; B 31 0 469 734 ; +C -1 ; WX 222 ; N iogonek ; B -31 -225 183 718 ; +C 211 ; WX 778 ; N Oacute ; B 39 -19 739 929 ; +C 243 ; WX 556 ; N oacute ; B 35 -14 521 734 ; +C -1 ; WX 556 ; N amacron ; B 36 -15 530 684 ; +C -1 ; WX 500 ; N sacute ; B 32 -15 464 734 ; +C 239 ; WX 278 ; N idieresis ; B 13 0 266 706 ; +C 212 ; WX 778 ; N Ocircumflex ; B 39 -19 739 929 ; +C 217 ; WX 722 ; N Ugrave ; B 79 -19 644 929 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 556 ; N thorn ; B 58 -207 517 718 ; +C 178 ; WX 333 ; N twosuperior ; B 4 281 323 703 ; +C 214 ; WX 778 ; N Odieresis ; B 39 -19 739 901 ; +C 181 ; WX 556 ; N mu ; B 68 -207 489 523 ; +C 236 ; WX 278 ; N igrave ; B -13 0 184 734 ; +C -1 ; WX 556 ; N ohungarumlaut ; B 35 -14 521 734 ; +C -1 ; WX 667 ; N Eogonek ; B 86 -220 633 718 ; +C -1 ; WX 556 ; N dcroat ; B 35 -15 550 718 ; +C 190 ; WX 834 ; N threequarters ; B 45 -19 810 703 ; +C -1 ; WX 667 ; N Scedilla ; B 49 -225 620 737 ; +C -1 ; WX 299 ; N lcaron ; B 67 0 311 718 ; +C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 663 718 ; +C -1 ; WX 556 ; N Lacute ; B 76 0 537 929 ; +C 153 ; WX 1000 ; N trademark ; B 46 306 903 718 ; +C -1 ; WX 556 ; N edotaccent ; B 40 -15 516 706 ; +C 204 ; WX 278 ; N Igrave ; B -13 0 188 929 ; +C -1 ; WX 278 ; N Imacron ; B -17 0 296 879 ; +C -1 ; WX 556 ; N Lcaron ; B 76 0 537 718 ; +C 189 ; WX 834 ; N onehalf ; B 43 -19 773 703 ; +C -1 ; WX 549 ; N lessequal ; B 26 0 523 674 ; +C 244 ; WX 556 ; N ocircumflex ; B 35 -14 521 734 ; +C 241 ; WX 556 ; N ntilde ; B 65 0 491 722 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 79 -19 644 929 ; +C 201 ; WX 667 ; N Eacute ; B 86 0 616 929 ; +C -1 ; WX 556 ; N emacron ; B 40 -15 516 684 ; +C -1 ; WX 556 ; N gbreve ; B 40 -220 499 731 ; +C 188 ; WX 834 ; N onequarter ; B 73 -19 756 703 ; +C 138 ; WX 667 ; N Scaron ; B 49 -19 620 929 ; +C -1 ; WX 667 ; N Scommaaccent ; B 49 -225 620 737 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 39 -19 739 929 ; +C 176 ; WX 400 ; N degree ; B 54 411 346 703 ; +C 242 ; WX 556 ; N ograve ; B 35 -14 521 734 ; +C -1 ; WX 722 ; N Ccaron ; B 44 -19 681 929 ; +C 249 ; WX 556 ; N ugrave ; B 68 -15 489 734 ; +C -1 ; WX 453 ; N radical ; B -4 -80 458 762 ; +C -1 ; WX 722 ; N Dcaron ; B 81 0 674 929 ; +C -1 ; WX 333 ; N rcommaaccent ; B 77 -225 332 538 ; +C 209 ; WX 722 ; N Ntilde ; B 76 0 646 917 ; +C 245 ; WX 556 ; N otilde ; B 35 -14 521 722 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 684 718 ; +C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 537 718 ; +C 195 ; WX 667 ; N Atilde ; B 14 0 654 917 ; +C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ; +C 197 ; WX 667 ; N Aring ; B 14 0 654 931 ; +C 213 ; WX 778 ; N Otilde ; B 39 -19 739 917 ; +C -1 ; WX 500 ; N zdotaccent ; B 31 0 469 706 ; +C -1 ; WX 667 ; N Ecaron ; B 86 0 616 929 ; +C -1 ; WX 278 ; N Iogonek ; B -3 -225 211 718 ; +C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 501 718 ; +C -1 ; WX 584 ; N minus ; B 39 216 545 289 ; +C 206 ; WX 278 ; N Icircumflex ; B -6 0 285 929 ; +C -1 ; WX 556 ; N ncaron ; B 65 0 491 734 ; +C -1 ; WX 278 ; N tcommaaccent ; B 14 -225 257 669 ; +C 172 ; WX 584 ; N logicalnot ; B 39 108 545 390 ; +C 246 ; WX 556 ; N odieresis ; B 35 -14 521 706 ; +C 252 ; WX 556 ; N udieresis ; B 68 -15 489 706 ; +C -1 ; WX 549 ; N notequal ; B 12 -35 537 551 ; +C -1 ; WX 556 ; N gcommaaccent ; B 40 -220 499 822 ; +C 240 ; WX 556 ; N eth ; B 35 -15 522 737 ; +C 158 ; WX 500 ; N zcaron ; B 31 0 469 734 ; +C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 491 538 ; +C 185 ; WX 333 ; N onesuperior ; B 43 281 222 703 ; +C -1 ; WX 278 ; N imacron ; B 5 0 272 684 ; +C 128 ; WX 556 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2705 +KPX A C -30 +KPX A Cacute -30 +KPX A Ccaron -30 +KPX A Ccedilla -30 +KPX A G -30 +KPX A Gbreve -30 +KPX A Gcommaaccent -30 +KPX A O -30 +KPX A Oacute -30 +KPX A Ocircumflex -30 +KPX A Odieresis -30 +KPX A Ograve -30 +KPX A Ohungarumlaut -30 +KPX A Omacron -30 +KPX A Oslash -30 +KPX A Otilde -30 +KPX A Q -30 +KPX A T -120 +KPX A Tcaron -120 +KPX A Tcommaaccent -120 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -70 +KPX A W -50 +KPX A Y -100 +KPX A Yacute -100 +KPX A Ydieresis -100 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -40 +KPX A w -40 +KPX A y -40 +KPX A yacute -40 +KPX A ydieresis -40 +KPX Aacute C -30 +KPX Aacute Cacute -30 +KPX Aacute Ccaron -30 +KPX Aacute Ccedilla -30 +KPX Aacute G -30 +KPX Aacute Gbreve -30 +KPX Aacute Gcommaaccent -30 +KPX Aacute O -30 +KPX Aacute Oacute -30 +KPX Aacute Ocircumflex -30 +KPX Aacute Odieresis -30 +KPX Aacute Ograve -30 +KPX Aacute Ohungarumlaut -30 +KPX Aacute Omacron -30 +KPX Aacute Oslash -30 +KPX Aacute Otilde -30 +KPX Aacute Q -30 +KPX Aacute T -120 +KPX Aacute Tcaron -120 +KPX Aacute Tcommaaccent -120 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -70 +KPX Aacute W -50 +KPX Aacute Y -100 +KPX Aacute Yacute -100 +KPX Aacute Ydieresis -100 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -40 +KPX Aacute w -40 +KPX Aacute y -40 +KPX Aacute yacute -40 +KPX Aacute ydieresis -40 +KPX Abreve C -30 +KPX Abreve Cacute -30 +KPX Abreve Ccaron -30 +KPX Abreve Ccedilla -30 +KPX Abreve G -30 +KPX Abreve Gbreve -30 +KPX Abreve Gcommaaccent -30 +KPX Abreve O -30 +KPX Abreve Oacute -30 +KPX Abreve Ocircumflex -30 +KPX Abreve Odieresis -30 +KPX Abreve Ograve -30 +KPX Abreve Ohungarumlaut -30 +KPX Abreve Omacron -30 +KPX Abreve Oslash -30 +KPX Abreve Otilde -30 +KPX Abreve Q -30 +KPX Abreve T -120 +KPX Abreve Tcaron -120 +KPX Abreve Tcommaaccent -120 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -70 +KPX Abreve W -50 +KPX Abreve Y -100 +KPX Abreve Yacute -100 +KPX Abreve Ydieresis -100 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -40 +KPX Abreve w -40 +KPX Abreve y -40 +KPX Abreve yacute -40 +KPX Abreve ydieresis -40 +KPX Acircumflex C -30 +KPX Acircumflex Cacute -30 +KPX Acircumflex Ccaron -30 +KPX Acircumflex Ccedilla -30 +KPX Acircumflex G -30 +KPX Acircumflex Gbreve -30 +KPX Acircumflex Gcommaaccent -30 +KPX Acircumflex O -30 +KPX Acircumflex Oacute -30 +KPX Acircumflex Ocircumflex -30 +KPX Acircumflex Odieresis -30 +KPX Acircumflex Ograve -30 +KPX Acircumflex Ohungarumlaut -30 +KPX Acircumflex Omacron -30 +KPX Acircumflex Oslash -30 +KPX Acircumflex Otilde -30 +KPX Acircumflex Q -30 +KPX Acircumflex T -120 +KPX Acircumflex Tcaron -120 +KPX Acircumflex Tcommaaccent -120 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -70 +KPX Acircumflex W -50 +KPX Acircumflex Y -100 +KPX Acircumflex Yacute -100 +KPX Acircumflex Ydieresis -100 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -40 +KPX Acircumflex w -40 +KPX Acircumflex y -40 +KPX Acircumflex yacute -40 +KPX Acircumflex ydieresis -40 +KPX Adieresis C -30 +KPX Adieresis Cacute -30 +KPX Adieresis Ccaron -30 +KPX Adieresis Ccedilla -30 +KPX Adieresis G -30 +KPX Adieresis Gbreve -30 +KPX Adieresis Gcommaaccent -30 +KPX Adieresis O -30 +KPX Adieresis Oacute -30 +KPX Adieresis Ocircumflex -30 +KPX Adieresis Odieresis -30 +KPX Adieresis Ograve -30 +KPX Adieresis Ohungarumlaut -30 +KPX Adieresis Omacron -30 +KPX Adieresis Oslash -30 +KPX Adieresis Otilde -30 +KPX Adieresis Q -30 +KPX Adieresis T -120 +KPX Adieresis Tcaron -120 +KPX Adieresis Tcommaaccent -120 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -70 +KPX Adieresis W -50 +KPX Adieresis Y -100 +KPX Adieresis Yacute -100 +KPX Adieresis Ydieresis -100 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -40 +KPX Adieresis w -40 +KPX Adieresis y -40 +KPX Adieresis yacute -40 +KPX Adieresis ydieresis -40 +KPX Agrave C -30 +KPX Agrave Cacute -30 +KPX Agrave Ccaron -30 +KPX Agrave Ccedilla -30 +KPX Agrave G -30 +KPX Agrave Gbreve -30 +KPX Agrave Gcommaaccent -30 +KPX Agrave O -30 +KPX Agrave Oacute -30 +KPX Agrave Ocircumflex -30 +KPX Agrave Odieresis -30 +KPX Agrave Ograve -30 +KPX Agrave Ohungarumlaut -30 +KPX Agrave Omacron -30 +KPX Agrave Oslash -30 +KPX Agrave Otilde -30 +KPX Agrave Q -30 +KPX Agrave T -120 +KPX Agrave Tcaron -120 +KPX Agrave Tcommaaccent -120 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -70 +KPX Agrave W -50 +KPX Agrave Y -100 +KPX Agrave Yacute -100 +KPX Agrave Ydieresis -100 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -40 +KPX Agrave w -40 +KPX Agrave y -40 +KPX Agrave yacute -40 +KPX Agrave ydieresis -40 +KPX Amacron C -30 +KPX Amacron Cacute -30 +KPX Amacron Ccaron -30 +KPX Amacron Ccedilla -30 +KPX Amacron G -30 +KPX Amacron Gbreve -30 +KPX Amacron Gcommaaccent -30 +KPX Amacron O -30 +KPX Amacron Oacute -30 +KPX Amacron Ocircumflex -30 +KPX Amacron Odieresis -30 +KPX Amacron Ograve -30 +KPX Amacron Ohungarumlaut -30 +KPX Amacron Omacron -30 +KPX Amacron Oslash -30 +KPX Amacron Otilde -30 +KPX Amacron Q -30 +KPX Amacron T -120 +KPX Amacron Tcaron -120 +KPX Amacron Tcommaaccent -120 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -70 +KPX Amacron W -50 +KPX Amacron Y -100 +KPX Amacron Yacute -100 +KPX Amacron Ydieresis -100 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -40 +KPX Amacron w -40 +KPX Amacron y -40 +KPX Amacron yacute -40 +KPX Amacron ydieresis -40 +KPX Aogonek C -30 +KPX Aogonek Cacute -30 +KPX Aogonek Ccaron -30 +KPX Aogonek Ccedilla -30 +KPX Aogonek G -30 +KPX Aogonek Gbreve -30 +KPX Aogonek Gcommaaccent -30 +KPX Aogonek O -30 +KPX Aogonek Oacute -30 +KPX Aogonek Ocircumflex -30 +KPX Aogonek Odieresis -30 +KPX Aogonek Ograve -30 +KPX Aogonek Ohungarumlaut -30 +KPX Aogonek Omacron -30 +KPX Aogonek Oslash -30 +KPX Aogonek Otilde -30 +KPX Aogonek Q -30 +KPX Aogonek T -120 +KPX Aogonek Tcaron -120 +KPX Aogonek Tcommaaccent -120 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -70 +KPX Aogonek W -50 +KPX Aogonek Y -100 +KPX Aogonek Yacute -100 +KPX Aogonek Ydieresis -100 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -40 +KPX Aogonek w -40 +KPX Aogonek y -40 +KPX Aogonek yacute -40 +KPX Aogonek ydieresis -40 +KPX Aring C -30 +KPX Aring Cacute -30 +KPX Aring Ccaron -30 +KPX Aring Ccedilla -30 +KPX Aring G -30 +KPX Aring Gbreve -30 +KPX Aring Gcommaaccent -30 +KPX Aring O -30 +KPX Aring Oacute -30 +KPX Aring Ocircumflex -30 +KPX Aring Odieresis -30 +KPX Aring Ograve -30 +KPX Aring Ohungarumlaut -30 +KPX Aring Omacron -30 +KPX Aring Oslash -30 +KPX Aring Otilde -30 +KPX Aring Q -30 +KPX Aring T -120 +KPX Aring Tcaron -120 +KPX Aring Tcommaaccent -120 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -70 +KPX Aring W -50 +KPX Aring Y -100 +KPX Aring Yacute -100 +KPX Aring Ydieresis -100 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -40 +KPX Aring w -40 +KPX Aring y -40 +KPX Aring yacute -40 +KPX Aring ydieresis -40 +KPX Atilde C -30 +KPX Atilde Cacute -30 +KPX Atilde Ccaron -30 +KPX Atilde Ccedilla -30 +KPX Atilde G -30 +KPX Atilde Gbreve -30 +KPX Atilde Gcommaaccent -30 +KPX Atilde O -30 +KPX Atilde Oacute -30 +KPX Atilde Ocircumflex -30 +KPX Atilde Odieresis -30 +KPX Atilde Ograve -30 +KPX Atilde Ohungarumlaut -30 +KPX Atilde Omacron -30 +KPX Atilde Oslash -30 +KPX Atilde Otilde -30 +KPX Atilde Q -30 +KPX Atilde T -120 +KPX Atilde Tcaron -120 +KPX Atilde Tcommaaccent -120 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -70 +KPX Atilde W -50 +KPX Atilde Y -100 +KPX Atilde Yacute -100 +KPX Atilde Ydieresis -100 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -40 +KPX Atilde w -40 +KPX Atilde y -40 +KPX Atilde yacute -40 +KPX Atilde ydieresis -40 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX B comma -20 +KPX B period -20 +KPX C comma -30 +KPX C period -30 +KPX Cacute comma -30 +KPX Cacute period -30 +KPX Ccaron comma -30 +KPX Ccaron period -30 +KPX Ccedilla comma -30 +KPX Ccedilla period -30 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -70 +KPX D W -40 +KPX D Y -90 +KPX D Yacute -90 +KPX D Ydieresis -90 +KPX D comma -70 +KPX D period -70 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -70 +KPX Dcaron W -40 +KPX Dcaron Y -90 +KPX Dcaron Yacute -90 +KPX Dcaron Ydieresis -90 +KPX Dcaron comma -70 +KPX Dcaron period -70 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -70 +KPX Dcroat W -40 +KPX Dcroat Y -90 +KPX Dcroat Yacute -90 +KPX Dcroat Ydieresis -90 +KPX Dcroat comma -70 +KPX Dcroat period -70 +KPX F A -80 +KPX F Aacute -80 +KPX F Abreve -80 +KPX F Acircumflex -80 +KPX F Adieresis -80 +KPX F Agrave -80 +KPX F Amacron -80 +KPX F Aogonek -80 +KPX F Aring -80 +KPX F Atilde -80 +KPX F a -50 +KPX F aacute -50 +KPX F abreve -50 +KPX F acircumflex -50 +KPX F adieresis -50 +KPX F agrave -50 +KPX F amacron -50 +KPX F aogonek -50 +KPX F aring -50 +KPX F atilde -50 +KPX F comma -150 +KPX F e -30 +KPX F eacute -30 +KPX F ecaron -30 +KPX F ecircumflex -30 +KPX F edieresis -30 +KPX F edotaccent -30 +KPX F egrave -30 +KPX F emacron -30 +KPX F eogonek -30 +KPX F o -30 +KPX F oacute -30 +KPX F ocircumflex -30 +KPX F odieresis -30 +KPX F ograve -30 +KPX F ohungarumlaut -30 +KPX F omacron -30 +KPX F oslash -30 +KPX F otilde -30 +KPX F period -150 +KPX F r -45 +KPX F racute -45 +KPX F rcaron -45 +KPX F rcommaaccent -45 +KPX J A -20 +KPX J Aacute -20 +KPX J Abreve -20 +KPX J Acircumflex -20 +KPX J Adieresis -20 +KPX J Agrave -20 +KPX J Amacron -20 +KPX J Aogonek -20 +KPX J Aring -20 +KPX J Atilde -20 +KPX J a -20 +KPX J aacute -20 +KPX J abreve -20 +KPX J acircumflex -20 +KPX J adieresis -20 +KPX J agrave -20 +KPX J amacron -20 +KPX J aogonek -20 +KPX J aring -20 +KPX J atilde -20 +KPX J comma -30 +KPX J period -30 +KPX J u -20 +KPX J uacute -20 +KPX J ucircumflex -20 +KPX J udieresis -20 +KPX J ugrave -20 +KPX J uhungarumlaut -20 +KPX J umacron -20 +KPX J uogonek -20 +KPX J uring -20 +KPX K O -50 +KPX K Oacute -50 +KPX K Ocircumflex -50 +KPX K Odieresis -50 +KPX K Ograve -50 +KPX K Ohungarumlaut -50 +KPX K Omacron -50 +KPX K Oslash -50 +KPX K Otilde -50 +KPX K e -40 +KPX K eacute -40 +KPX K ecaron -40 +KPX K ecircumflex -40 +KPX K edieresis -40 +KPX K edotaccent -40 +KPX K egrave -40 +KPX K emacron -40 +KPX K eogonek -40 +KPX K o -40 +KPX K oacute -40 +KPX K ocircumflex -40 +KPX K odieresis -40 +KPX K ograve -40 +KPX K ohungarumlaut -40 +KPX K omacron -40 +KPX K oslash -40 +KPX K otilde -40 +KPX K u -30 +KPX K uacute -30 +KPX K ucircumflex -30 +KPX K udieresis -30 +KPX K ugrave -30 +KPX K uhungarumlaut -30 +KPX K umacron -30 +KPX K uogonek -30 +KPX K uring -30 +KPX K y -50 +KPX K yacute -50 +KPX K ydieresis -50 +KPX Kcommaaccent O -50 +KPX Kcommaaccent Oacute -50 +KPX Kcommaaccent Ocircumflex -50 +KPX Kcommaaccent Odieresis -50 +KPX Kcommaaccent Ograve -50 +KPX Kcommaaccent Ohungarumlaut -50 +KPX Kcommaaccent Omacron -50 +KPX Kcommaaccent Oslash -50 +KPX Kcommaaccent Otilde -50 +KPX Kcommaaccent e -40 +KPX Kcommaaccent eacute -40 +KPX Kcommaaccent ecaron -40 +KPX Kcommaaccent ecircumflex -40 +KPX Kcommaaccent edieresis -40 +KPX Kcommaaccent edotaccent -40 +KPX Kcommaaccent egrave -40 +KPX Kcommaaccent emacron -40 +KPX Kcommaaccent eogonek -40 +KPX Kcommaaccent o -40 +KPX Kcommaaccent oacute -40 +KPX Kcommaaccent ocircumflex -40 +KPX Kcommaaccent odieresis -40 +KPX Kcommaaccent ograve -40 +KPX Kcommaaccent ohungarumlaut -40 +KPX Kcommaaccent omacron -40 +KPX Kcommaaccent oslash -40 +KPX Kcommaaccent otilde -40 +KPX Kcommaaccent u -30 +KPX Kcommaaccent uacute -30 +KPX Kcommaaccent ucircumflex -30 +KPX Kcommaaccent udieresis -30 +KPX Kcommaaccent ugrave -30 +KPX Kcommaaccent uhungarumlaut -30 +KPX Kcommaaccent umacron -30 +KPX Kcommaaccent uogonek -30 +KPX Kcommaaccent uring -30 +KPX Kcommaaccent y -50 +KPX Kcommaaccent yacute -50 +KPX Kcommaaccent ydieresis -50 +KPX L T -110 +KPX L Tcaron -110 +KPX L Tcommaaccent -110 +KPX L V -110 +KPX L W -70 +KPX L Y -140 +KPX L Yacute -140 +KPX L Ydieresis -140 +KPX L quotedblright -140 +KPX L quoteright -160 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -110 +KPX Lacute Tcaron -110 +KPX Lacute Tcommaaccent -110 +KPX Lacute V -110 +KPX Lacute W -70 +KPX Lacute Y -140 +KPX Lacute Yacute -140 +KPX Lacute Ydieresis -140 +KPX Lacute quotedblright -140 +KPX Lacute quoteright -160 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcaron T -110 +KPX Lcaron Tcaron -110 +KPX Lcaron Tcommaaccent -110 +KPX Lcaron V -110 +KPX Lcaron W -70 +KPX Lcaron Y -140 +KPX Lcaron Yacute -140 +KPX Lcaron Ydieresis -140 +KPX Lcaron quotedblright -140 +KPX Lcaron quoteright -160 +KPX Lcaron y -30 +KPX Lcaron yacute -30 +KPX Lcaron ydieresis -30 +KPX Lcommaaccent T -110 +KPX Lcommaaccent Tcaron -110 +KPX Lcommaaccent Tcommaaccent -110 +KPX Lcommaaccent V -110 +KPX Lcommaaccent W -70 +KPX Lcommaaccent Y -140 +KPX Lcommaaccent Yacute -140 +KPX Lcommaaccent Ydieresis -140 +KPX Lcommaaccent quotedblright -140 +KPX Lcommaaccent quoteright -160 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -110 +KPX Lslash Tcaron -110 +KPX Lslash Tcommaaccent -110 +KPX Lslash V -110 +KPX Lslash W -70 +KPX Lslash Y -140 +KPX Lslash Yacute -140 +KPX Lslash Ydieresis -140 +KPX Lslash quotedblright -140 +KPX Lslash quoteright -160 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX O A -20 +KPX O Aacute -20 +KPX O Abreve -20 +KPX O Acircumflex -20 +KPX O Adieresis -20 +KPX O Agrave -20 +KPX O Amacron -20 +KPX O Aogonek -20 +KPX O Aring -20 +KPX O Atilde -20 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -30 +KPX O X -60 +KPX O Y -70 +KPX O Yacute -70 +KPX O Ydieresis -70 +KPX O comma -40 +KPX O period -40 +KPX Oacute A -20 +KPX Oacute Aacute -20 +KPX Oacute Abreve -20 +KPX Oacute Acircumflex -20 +KPX Oacute Adieresis -20 +KPX Oacute Agrave -20 +KPX Oacute Amacron -20 +KPX Oacute Aogonek -20 +KPX Oacute Aring -20 +KPX Oacute Atilde -20 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -30 +KPX Oacute X -60 +KPX Oacute Y -70 +KPX Oacute Yacute -70 +KPX Oacute Ydieresis -70 +KPX Oacute comma -40 +KPX Oacute period -40 +KPX Ocircumflex A -20 +KPX Ocircumflex Aacute -20 +KPX Ocircumflex Abreve -20 +KPX Ocircumflex Acircumflex -20 +KPX Ocircumflex Adieresis -20 +KPX Ocircumflex Agrave -20 +KPX Ocircumflex Amacron -20 +KPX Ocircumflex Aogonek -20 +KPX Ocircumflex Aring -20 +KPX Ocircumflex Atilde -20 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -30 +KPX Ocircumflex X -60 +KPX Ocircumflex Y -70 +KPX Ocircumflex Yacute -70 +KPX Ocircumflex Ydieresis -70 +KPX Ocircumflex comma -40 +KPX Ocircumflex period -40 +KPX Odieresis A -20 +KPX Odieresis Aacute -20 +KPX Odieresis Abreve -20 +KPX Odieresis Acircumflex -20 +KPX Odieresis Adieresis -20 +KPX Odieresis Agrave -20 +KPX Odieresis Amacron -20 +KPX Odieresis Aogonek -20 +KPX Odieresis Aring -20 +KPX Odieresis Atilde -20 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -30 +KPX Odieresis X -60 +KPX Odieresis Y -70 +KPX Odieresis Yacute -70 +KPX Odieresis Ydieresis -70 +KPX Odieresis comma -40 +KPX Odieresis period -40 +KPX Ograve A -20 +KPX Ograve Aacute -20 +KPX Ograve Abreve -20 +KPX Ograve Acircumflex -20 +KPX Ograve Adieresis -20 +KPX Ograve Agrave -20 +KPX Ograve Amacron -20 +KPX Ograve Aogonek -20 +KPX Ograve Aring -20 +KPX Ograve Atilde -20 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -30 +KPX Ograve X -60 +KPX Ograve Y -70 +KPX Ograve Yacute -70 +KPX Ograve Ydieresis -70 +KPX Ograve comma -40 +KPX Ograve period -40 +KPX Ohungarumlaut A -20 +KPX Ohungarumlaut Aacute -20 +KPX Ohungarumlaut Abreve -20 +KPX Ohungarumlaut Acircumflex -20 +KPX Ohungarumlaut Adieresis -20 +KPX Ohungarumlaut Agrave -20 +KPX Ohungarumlaut Amacron -20 +KPX Ohungarumlaut Aogonek -20 +KPX Ohungarumlaut Aring -20 +KPX Ohungarumlaut Atilde -20 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -30 +KPX Ohungarumlaut X -60 +KPX Ohungarumlaut Y -70 +KPX Ohungarumlaut Yacute -70 +KPX Ohungarumlaut Ydieresis -70 +KPX Ohungarumlaut comma -40 +KPX Ohungarumlaut period -40 +KPX Omacron A -20 +KPX Omacron Aacute -20 +KPX Omacron Abreve -20 +KPX Omacron Acircumflex -20 +KPX Omacron Adieresis -20 +KPX Omacron Agrave -20 +KPX Omacron Amacron -20 +KPX Omacron Aogonek -20 +KPX Omacron Aring -20 +KPX Omacron Atilde -20 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -30 +KPX Omacron X -60 +KPX Omacron Y -70 +KPX Omacron Yacute -70 +KPX Omacron Ydieresis -70 +KPX Omacron comma -40 +KPX Omacron period -40 +KPX Oslash A -20 +KPX Oslash Aacute -20 +KPX Oslash Abreve -20 +KPX Oslash Acircumflex -20 +KPX Oslash Adieresis -20 +KPX Oslash Agrave -20 +KPX Oslash Amacron -20 +KPX Oslash Aogonek -20 +KPX Oslash Aring -20 +KPX Oslash Atilde -20 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -30 +KPX Oslash X -60 +KPX Oslash Y -70 +KPX Oslash Yacute -70 +KPX Oslash Ydieresis -70 +KPX Oslash comma -40 +KPX Oslash period -40 +KPX Otilde A -20 +KPX Otilde Aacute -20 +KPX Otilde Abreve -20 +KPX Otilde Acircumflex -20 +KPX Otilde Adieresis -20 +KPX Otilde Agrave -20 +KPX Otilde Amacron -20 +KPX Otilde Aogonek -20 +KPX Otilde Aring -20 +KPX Otilde Atilde -20 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -30 +KPX Otilde X -60 +KPX Otilde Y -70 +KPX Otilde Yacute -70 +KPX Otilde Ydieresis -70 +KPX Otilde comma -40 +KPX Otilde period -40 +KPX P A -120 +KPX P Aacute -120 +KPX P Abreve -120 +KPX P Acircumflex -120 +KPX P Adieresis -120 +KPX P Agrave -120 +KPX P Amacron -120 +KPX P Aogonek -120 +KPX P Aring -120 +KPX P Atilde -120 +KPX P a -40 +KPX P aacute -40 +KPX P abreve -40 +KPX P acircumflex -40 +KPX P adieresis -40 +KPX P agrave -40 +KPX P amacron -40 +KPX P aogonek -40 +KPX P aring -40 +KPX P atilde -40 +KPX P comma -180 +KPX P e -50 +KPX P eacute -50 +KPX P ecaron -50 +KPX P ecircumflex -50 +KPX P edieresis -50 +KPX P edotaccent -50 +KPX P egrave -50 +KPX P emacron -50 +KPX P eogonek -50 +KPX P o -50 +KPX P oacute -50 +KPX P ocircumflex -50 +KPX P odieresis -50 +KPX P ograve -50 +KPX P ohungarumlaut -50 +KPX P omacron -50 +KPX P oslash -50 +KPX P otilde -50 +KPX P period -180 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX R O -20 +KPX R Oacute -20 +KPX R Ocircumflex -20 +KPX R Odieresis -20 +KPX R Ograve -20 +KPX R Ohungarumlaut -20 +KPX R Omacron -20 +KPX R Oslash -20 +KPX R Otilde -20 +KPX R T -30 +KPX R Tcaron -30 +KPX R Tcommaaccent -30 +KPX R U -40 +KPX R Uacute -40 +KPX R Ucircumflex -40 +KPX R Udieresis -40 +KPX R Ugrave -40 +KPX R Uhungarumlaut -40 +KPX R Umacron -40 +KPX R Uogonek -40 +KPX R Uring -40 +KPX R V -50 +KPX R W -30 +KPX R Y -50 +KPX R Yacute -50 +KPX R Ydieresis -50 +KPX Racute O -20 +KPX Racute Oacute -20 +KPX Racute Ocircumflex -20 +KPX Racute Odieresis -20 +KPX Racute Ograve -20 +KPX Racute Ohungarumlaut -20 +KPX Racute Omacron -20 +KPX Racute Oslash -20 +KPX Racute Otilde -20 +KPX Racute T -30 +KPX Racute Tcaron -30 +KPX Racute Tcommaaccent -30 +KPX Racute U -40 +KPX Racute Uacute -40 +KPX Racute Ucircumflex -40 +KPX Racute Udieresis -40 +KPX Racute Ugrave -40 +KPX Racute Uhungarumlaut -40 +KPX Racute Umacron -40 +KPX Racute Uogonek -40 +KPX Racute Uring -40 +KPX Racute V -50 +KPX Racute W -30 +KPX Racute Y -50 +KPX Racute Yacute -50 +KPX Racute Ydieresis -50 +KPX Rcaron O -20 +KPX Rcaron Oacute -20 +KPX Rcaron Ocircumflex -20 +KPX Rcaron Odieresis -20 +KPX Rcaron Ograve -20 +KPX Rcaron Ohungarumlaut -20 +KPX Rcaron Omacron -20 +KPX Rcaron Oslash -20 +KPX Rcaron Otilde -20 +KPX Rcaron T -30 +KPX Rcaron Tcaron -30 +KPX Rcaron Tcommaaccent -30 +KPX Rcaron U -40 +KPX Rcaron Uacute -40 +KPX Rcaron Ucircumflex -40 +KPX Rcaron Udieresis -40 +KPX Rcaron Ugrave -40 +KPX Rcaron Uhungarumlaut -40 +KPX Rcaron Umacron -40 +KPX Rcaron Uogonek -40 +KPX Rcaron Uring -40 +KPX Rcaron V -50 +KPX Rcaron W -30 +KPX Rcaron Y -50 +KPX Rcaron Yacute -50 +KPX Rcaron Ydieresis -50 +KPX Rcommaaccent O -20 +KPX Rcommaaccent Oacute -20 +KPX Rcommaaccent Ocircumflex -20 +KPX Rcommaaccent Odieresis -20 +KPX Rcommaaccent Ograve -20 +KPX Rcommaaccent Ohungarumlaut -20 +KPX Rcommaaccent Omacron -20 +KPX Rcommaaccent Oslash -20 +KPX Rcommaaccent Otilde -20 +KPX Rcommaaccent T -30 +KPX Rcommaaccent Tcaron -30 +KPX Rcommaaccent Tcommaaccent -30 +KPX Rcommaaccent U -40 +KPX Rcommaaccent Uacute -40 +KPX Rcommaaccent Ucircumflex -40 +KPX Rcommaaccent Udieresis -40 +KPX Rcommaaccent Ugrave -40 +KPX Rcommaaccent Uhungarumlaut -40 +KPX Rcommaaccent Umacron -40 +KPX Rcommaaccent Uogonek -40 +KPX Rcommaaccent Uring -40 +KPX Rcommaaccent V -50 +KPX Rcommaaccent W -30 +KPX Rcommaaccent Y -50 +KPX Rcommaaccent Yacute -50 +KPX Rcommaaccent Ydieresis -50 +KPX S comma -20 +KPX S period -20 +KPX Sacute comma -20 +KPX Sacute period -20 +KPX Scaron comma -20 +KPX Scaron period -20 +KPX Scedilla comma -20 +KPX Scedilla period -20 +KPX Scommaaccent comma -20 +KPX Scommaaccent period -20 +KPX T A -120 +KPX T Aacute -120 +KPX T Abreve -120 +KPX T Acircumflex -120 +KPX T Adieresis -120 +KPX T Agrave -120 +KPX T Amacron -120 +KPX T Aogonek -120 +KPX T Aring -120 +KPX T Atilde -120 +KPX T O -40 +KPX T Oacute -40 +KPX T Ocircumflex -40 +KPX T Odieresis -40 +KPX T Ograve -40 +KPX T Ohungarumlaut -40 +KPX T Omacron -40 +KPX T Oslash -40 +KPX T Otilde -40 +KPX T a -120 +KPX T aacute -120 +KPX T abreve -60 +KPX T acircumflex -120 +KPX T adieresis -120 +KPX T agrave -120 +KPX T amacron -60 +KPX T aogonek -120 +KPX T aring -120 +KPX T atilde -60 +KPX T colon -20 +KPX T comma -120 +KPX T e -120 +KPX T eacute -120 +KPX T ecaron -120 +KPX T ecircumflex -120 +KPX T edieresis -120 +KPX T edotaccent -120 +KPX T egrave -60 +KPX T emacron -60 +KPX T eogonek -120 +KPX T hyphen -140 +KPX T o -120 +KPX T oacute -120 +KPX T ocircumflex -120 +KPX T odieresis -120 +KPX T ograve -120 +KPX T ohungarumlaut -120 +KPX T omacron -60 +KPX T oslash -120 +KPX T otilde -60 +KPX T period -120 +KPX T r -120 +KPX T racute -120 +KPX T rcaron -120 +KPX T rcommaaccent -120 +KPX T semicolon -20 +KPX T u -120 +KPX T uacute -120 +KPX T ucircumflex -120 +KPX T udieresis -120 +KPX T ugrave -120 +KPX T uhungarumlaut -120 +KPX T umacron -60 +KPX T uogonek -120 +KPX T uring -120 +KPX T w -120 +KPX T y -120 +KPX T yacute -120 +KPX T ydieresis -60 +KPX Tcaron A -120 +KPX Tcaron Aacute -120 +KPX Tcaron Abreve -120 +KPX Tcaron Acircumflex -120 +KPX Tcaron Adieresis -120 +KPX Tcaron Agrave -120 +KPX Tcaron Amacron -120 +KPX Tcaron Aogonek -120 +KPX Tcaron Aring -120 +KPX Tcaron Atilde -120 +KPX Tcaron O -40 +KPX Tcaron Oacute -40 +KPX Tcaron Ocircumflex -40 +KPX Tcaron Odieresis -40 +KPX Tcaron Ograve -40 +KPX Tcaron Ohungarumlaut -40 +KPX Tcaron Omacron -40 +KPX Tcaron Oslash -40 +KPX Tcaron Otilde -40 +KPX Tcaron a -120 +KPX Tcaron aacute -120 +KPX Tcaron abreve -60 +KPX Tcaron acircumflex -120 +KPX Tcaron adieresis -120 +KPX Tcaron agrave -120 +KPX Tcaron amacron -60 +KPX Tcaron aogonek -120 +KPX Tcaron aring -120 +KPX Tcaron atilde -60 +KPX Tcaron colon -20 +KPX Tcaron comma -120 +KPX Tcaron e -120 +KPX Tcaron eacute -120 +KPX Tcaron ecaron -120 +KPX Tcaron ecircumflex -120 +KPX Tcaron edieresis -120 +KPX Tcaron edotaccent -120 +KPX Tcaron egrave -60 +KPX Tcaron emacron -60 +KPX Tcaron eogonek -120 +KPX Tcaron hyphen -140 +KPX Tcaron o -120 +KPX Tcaron oacute -120 +KPX Tcaron ocircumflex -120 +KPX Tcaron odieresis -120 +KPX Tcaron ograve -120 +KPX Tcaron ohungarumlaut -120 +KPX Tcaron omacron -60 +KPX Tcaron oslash -120 +KPX Tcaron otilde -60 +KPX Tcaron period -120 +KPX Tcaron r -120 +KPX Tcaron racute -120 +KPX Tcaron rcaron -120 +KPX Tcaron rcommaaccent -120 +KPX Tcaron semicolon -20 +KPX Tcaron u -120 +KPX Tcaron uacute -120 +KPX Tcaron ucircumflex -120 +KPX Tcaron udieresis -120 +KPX Tcaron ugrave -120 +KPX Tcaron uhungarumlaut -120 +KPX Tcaron umacron -60 +KPX Tcaron uogonek -120 +KPX Tcaron uring -120 +KPX Tcaron w -120 +KPX Tcaron y -120 +KPX Tcaron yacute -120 +KPX Tcaron ydieresis -60 +KPX Tcommaaccent A -120 +KPX Tcommaaccent Aacute -120 +KPX Tcommaaccent Abreve -120 +KPX Tcommaaccent Acircumflex -120 +KPX Tcommaaccent Adieresis -120 +KPX Tcommaaccent Agrave -120 +KPX Tcommaaccent Amacron -120 +KPX Tcommaaccent Aogonek -120 +KPX Tcommaaccent Aring -120 +KPX Tcommaaccent Atilde -120 +KPX Tcommaaccent O -40 +KPX Tcommaaccent Oacute -40 +KPX Tcommaaccent Ocircumflex -40 +KPX Tcommaaccent Odieresis -40 +KPX Tcommaaccent Ograve -40 +KPX Tcommaaccent Ohungarumlaut -40 +KPX Tcommaaccent Omacron -40 +KPX Tcommaaccent Oslash -40 +KPX Tcommaaccent Otilde -40 +KPX Tcommaaccent a -120 +KPX Tcommaaccent aacute -120 +KPX Tcommaaccent abreve -60 +KPX Tcommaaccent acircumflex -120 +KPX Tcommaaccent adieresis -120 +KPX Tcommaaccent agrave -120 +KPX Tcommaaccent amacron -60 +KPX Tcommaaccent aogonek -120 +KPX Tcommaaccent aring -120 +KPX Tcommaaccent atilde -60 +KPX Tcommaaccent colon -20 +KPX Tcommaaccent comma -120 +KPX Tcommaaccent e -120 +KPX Tcommaaccent eacute -120 +KPX Tcommaaccent ecaron -120 +KPX Tcommaaccent ecircumflex -120 +KPX Tcommaaccent edieresis -120 +KPX Tcommaaccent edotaccent -120 +KPX Tcommaaccent egrave -60 +KPX Tcommaaccent emacron -60 +KPX Tcommaaccent eogonek -120 +KPX Tcommaaccent hyphen -140 +KPX Tcommaaccent o -120 +KPX Tcommaaccent oacute -120 +KPX Tcommaaccent ocircumflex -120 +KPX Tcommaaccent odieresis -120 +KPX Tcommaaccent ograve -120 +KPX Tcommaaccent ohungarumlaut -120 +KPX Tcommaaccent omacron -60 +KPX Tcommaaccent oslash -120 +KPX Tcommaaccent otilde -60 +KPX Tcommaaccent period -120 +KPX Tcommaaccent r -120 +KPX Tcommaaccent racute -120 +KPX Tcommaaccent rcaron -120 +KPX Tcommaaccent rcommaaccent -120 +KPX Tcommaaccent semicolon -20 +KPX Tcommaaccent u -120 +KPX Tcommaaccent uacute -120 +KPX Tcommaaccent ucircumflex -120 +KPX Tcommaaccent udieresis -120 +KPX Tcommaaccent ugrave -120 +KPX Tcommaaccent uhungarumlaut -120 +KPX Tcommaaccent umacron -60 +KPX Tcommaaccent uogonek -120 +KPX Tcommaaccent uring -120 +KPX Tcommaaccent w -120 +KPX Tcommaaccent y -120 +KPX Tcommaaccent yacute -120 +KPX Tcommaaccent ydieresis -60 +KPX U A -40 +KPX U Aacute -40 +KPX U Abreve -40 +KPX U Acircumflex -40 +KPX U Adieresis -40 +KPX U Agrave -40 +KPX U Amacron -40 +KPX U Aogonek -40 +KPX U Aring -40 +KPX U Atilde -40 +KPX U comma -40 +KPX U period -40 +KPX Uacute A -40 +KPX Uacute Aacute -40 +KPX Uacute Abreve -40 +KPX Uacute Acircumflex -40 +KPX Uacute Adieresis -40 +KPX Uacute Agrave -40 +KPX Uacute Amacron -40 +KPX Uacute Aogonek -40 +KPX Uacute Aring -40 +KPX Uacute Atilde -40 +KPX Uacute comma -40 +KPX Uacute period -40 +KPX Ucircumflex A -40 +KPX Ucircumflex Aacute -40 +KPX Ucircumflex Abreve -40 +KPX Ucircumflex Acircumflex -40 +KPX Ucircumflex Adieresis -40 +KPX Ucircumflex Agrave -40 +KPX Ucircumflex Amacron -40 +KPX Ucircumflex Aogonek -40 +KPX Ucircumflex Aring -40 +KPX Ucircumflex Atilde -40 +KPX Ucircumflex comma -40 +KPX Ucircumflex period -40 +KPX Udieresis A -40 +KPX Udieresis Aacute -40 +KPX Udieresis Abreve -40 +KPX Udieresis Acircumflex -40 +KPX Udieresis Adieresis -40 +KPX Udieresis Agrave -40 +KPX Udieresis Amacron -40 +KPX Udieresis Aogonek -40 +KPX Udieresis Aring -40 +KPX Udieresis Atilde -40 +KPX Udieresis comma -40 +KPX Udieresis period -40 +KPX Ugrave A -40 +KPX Ugrave Aacute -40 +KPX Ugrave Abreve -40 +KPX Ugrave Acircumflex -40 +KPX Ugrave Adieresis -40 +KPX Ugrave Agrave -40 +KPX Ugrave Amacron -40 +KPX Ugrave Aogonek -40 +KPX Ugrave Aring -40 +KPX Ugrave Atilde -40 +KPX Ugrave comma -40 +KPX Ugrave period -40 +KPX Uhungarumlaut A -40 +KPX Uhungarumlaut Aacute -40 +KPX Uhungarumlaut Abreve -40 +KPX Uhungarumlaut Acircumflex -40 +KPX Uhungarumlaut Adieresis -40 +KPX Uhungarumlaut Agrave -40 +KPX Uhungarumlaut Amacron -40 +KPX Uhungarumlaut Aogonek -40 +KPX Uhungarumlaut Aring -40 +KPX Uhungarumlaut Atilde -40 +KPX Uhungarumlaut comma -40 +KPX Uhungarumlaut period -40 +KPX Umacron A -40 +KPX Umacron Aacute -40 +KPX Umacron Abreve -40 +KPX Umacron Acircumflex -40 +KPX Umacron Adieresis -40 +KPX Umacron Agrave -40 +KPX Umacron Amacron -40 +KPX Umacron Aogonek -40 +KPX Umacron Aring -40 +KPX Umacron Atilde -40 +KPX Umacron comma -40 +KPX Umacron period -40 +KPX Uogonek A -40 +KPX Uogonek Aacute -40 +KPX Uogonek Abreve -40 +KPX Uogonek Acircumflex -40 +KPX Uogonek Adieresis -40 +KPX Uogonek Agrave -40 +KPX Uogonek Amacron -40 +KPX Uogonek Aogonek -40 +KPX Uogonek Aring -40 +KPX Uogonek Atilde -40 +KPX Uogonek comma -40 +KPX Uogonek period -40 +KPX Uring A -40 +KPX Uring Aacute -40 +KPX Uring Abreve -40 +KPX Uring Acircumflex -40 +KPX Uring Adieresis -40 +KPX Uring Agrave -40 +KPX Uring Amacron -40 +KPX Uring Aogonek -40 +KPX Uring Aring -40 +KPX Uring Atilde -40 +KPX Uring comma -40 +KPX Uring period -40 +KPX V A -80 +KPX V Aacute -80 +KPX V Abreve -80 +KPX V Acircumflex -80 +KPX V Adieresis -80 +KPX V Agrave -80 +KPX V Amacron -80 +KPX V Aogonek -80 +KPX V Aring -80 +KPX V Atilde -80 +KPX V G -40 +KPX V Gbreve -40 +KPX V Gcommaaccent -40 +KPX V O -40 +KPX V Oacute -40 +KPX V Ocircumflex -40 +KPX V Odieresis -40 +KPX V Ograve -40 +KPX V Ohungarumlaut -40 +KPX V Omacron -40 +KPX V Oslash -40 +KPX V Otilde -40 +KPX V a -70 +KPX V aacute -70 +KPX V abreve -70 +KPX V acircumflex -70 +KPX V adieresis -70 +KPX V agrave -70 +KPX V amacron -70 +KPX V aogonek -70 +KPX V aring -70 +KPX V atilde -70 +KPX V colon -40 +KPX V comma -125 +KPX V e -80 +KPX V eacute -80 +KPX V ecaron -80 +KPX V ecircumflex -80 +KPX V edieresis -80 +KPX V edotaccent -80 +KPX V egrave -80 +KPX V emacron -80 +KPX V eogonek -80 +KPX V hyphen -80 +KPX V o -80 +KPX V oacute -80 +KPX V ocircumflex -80 +KPX V odieresis -80 +KPX V ograve -80 +KPX V ohungarumlaut -80 +KPX V omacron -80 +KPX V oslash -80 +KPX V otilde -80 +KPX V period -125 +KPX V semicolon -40 +KPX V u -70 +KPX V uacute -70 +KPX V ucircumflex -70 +KPX V udieresis -70 +KPX V ugrave -70 +KPX V uhungarumlaut -70 +KPX V umacron -70 +KPX V uogonek -70 +KPX V uring -70 +KPX W A -50 +KPX W Aacute -50 +KPX W Abreve -50 +KPX W Acircumflex -50 +KPX W Adieresis -50 +KPX W Agrave -50 +KPX W Amacron -50 +KPX W Aogonek -50 +KPX W Aring -50 +KPX W Atilde -50 +KPX W O -20 +KPX W Oacute -20 +KPX W Ocircumflex -20 +KPX W Odieresis -20 +KPX W Ograve -20 +KPX W Ohungarumlaut -20 +KPX W Omacron -20 +KPX W Oslash -20 +KPX W Otilde -20 +KPX W a -40 +KPX W aacute -40 +KPX W abreve -40 +KPX W acircumflex -40 +KPX W adieresis -40 +KPX W agrave -40 +KPX W amacron -40 +KPX W aogonek -40 +KPX W aring -40 +KPX W atilde -40 +KPX W comma -80 +KPX W e -30 +KPX W eacute -30 +KPX W ecaron -30 +KPX W ecircumflex -30 +KPX W edieresis -30 +KPX W edotaccent -30 +KPX W egrave -30 +KPX W emacron -30 +KPX W eogonek -30 +KPX W hyphen -40 +KPX W o -30 +KPX W oacute -30 +KPX W ocircumflex -30 +KPX W odieresis -30 +KPX W ograve -30 +KPX W ohungarumlaut -30 +KPX W omacron -30 +KPX W oslash -30 +KPX W otilde -30 +KPX W period -80 +KPX W u -30 +KPX W uacute -30 +KPX W ucircumflex -30 +KPX W udieresis -30 +KPX W ugrave -30 +KPX W uhungarumlaut -30 +KPX W umacron -30 +KPX W uogonek -30 +KPX W uring -30 +KPX W y -20 +KPX W yacute -20 +KPX W ydieresis -20 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -85 +KPX Y Oacute -85 +KPX Y Ocircumflex -85 +KPX Y Odieresis -85 +KPX Y Ograve -85 +KPX Y Ohungarumlaut -85 +KPX Y Omacron -85 +KPX Y Oslash -85 +KPX Y Otilde -85 +KPX Y a -140 +KPX Y aacute -140 +KPX Y abreve -70 +KPX Y acircumflex -140 +KPX Y adieresis -140 +KPX Y agrave -140 +KPX Y amacron -70 +KPX Y aogonek -140 +KPX Y aring -140 +KPX Y atilde -140 +KPX Y colon -60 +KPX Y comma -140 +KPX Y e -140 +KPX Y eacute -140 +KPX Y ecaron -140 +KPX Y ecircumflex -140 +KPX Y edieresis -140 +KPX Y edotaccent -140 +KPX Y egrave -140 +KPX Y emacron -70 +KPX Y eogonek -140 +KPX Y hyphen -140 +KPX Y i -20 +KPX Y iacute -20 +KPX Y iogonek -20 +KPX Y o -140 +KPX Y oacute -140 +KPX Y ocircumflex -140 +KPX Y odieresis -140 +KPX Y ograve -140 +KPX Y ohungarumlaut -140 +KPX Y omacron -140 +KPX Y oslash -140 +KPX Y otilde -140 +KPX Y period -140 +KPX Y semicolon -60 +KPX Y u -110 +KPX Y uacute -110 +KPX Y ucircumflex -110 +KPX Y udieresis -110 +KPX Y ugrave -110 +KPX Y uhungarumlaut -110 +KPX Y umacron -110 +KPX Y uogonek -110 +KPX Y uring -110 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -85 +KPX Yacute Oacute -85 +KPX Yacute Ocircumflex -85 +KPX Yacute Odieresis -85 +KPX Yacute Ograve -85 +KPX Yacute Ohungarumlaut -85 +KPX Yacute Omacron -85 +KPX Yacute Oslash -85 +KPX Yacute Otilde -85 +KPX Yacute a -140 +KPX Yacute aacute -140 +KPX Yacute abreve -70 +KPX Yacute acircumflex -140 +KPX Yacute adieresis -140 +KPX Yacute agrave -140 +KPX Yacute amacron -70 +KPX Yacute aogonek -140 +KPX Yacute aring -140 +KPX Yacute atilde -70 +KPX Yacute colon -60 +KPX Yacute comma -140 +KPX Yacute e -140 +KPX Yacute eacute -140 +KPX Yacute ecaron -140 +KPX Yacute ecircumflex -140 +KPX Yacute edieresis -140 +KPX Yacute edotaccent -140 +KPX Yacute egrave -140 +KPX Yacute emacron -70 +KPX Yacute eogonek -140 +KPX Yacute hyphen -140 +KPX Yacute i -20 +KPX Yacute iacute -20 +KPX Yacute iogonek -20 +KPX Yacute o -140 +KPX Yacute oacute -140 +KPX Yacute ocircumflex -140 +KPX Yacute odieresis -140 +KPX Yacute ograve -140 +KPX Yacute ohungarumlaut -140 +KPX Yacute omacron -70 +KPX Yacute oslash -140 +KPX Yacute otilde -140 +KPX Yacute period -140 +KPX Yacute semicolon -60 +KPX Yacute u -110 +KPX Yacute uacute -110 +KPX Yacute ucircumflex -110 +KPX Yacute udieresis -110 +KPX Yacute ugrave -110 +KPX Yacute uhungarumlaut -110 +KPX Yacute umacron -110 +KPX Yacute uogonek -110 +KPX Yacute uring -110 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -85 +KPX Ydieresis Oacute -85 +KPX Ydieresis Ocircumflex -85 +KPX Ydieresis Odieresis -85 +KPX Ydieresis Ograve -85 +KPX Ydieresis Ohungarumlaut -85 +KPX Ydieresis Omacron -85 +KPX Ydieresis Oslash -85 +KPX Ydieresis Otilde -85 +KPX Ydieresis a -140 +KPX Ydieresis aacute -140 +KPX Ydieresis abreve -70 +KPX Ydieresis acircumflex -140 +KPX Ydieresis adieresis -140 +KPX Ydieresis agrave -140 +KPX Ydieresis amacron -70 +KPX Ydieresis aogonek -140 +KPX Ydieresis aring -140 +KPX Ydieresis atilde -70 +KPX Ydieresis colon -60 +KPX Ydieresis comma -140 +KPX Ydieresis e -140 +KPX Ydieresis eacute -140 +KPX Ydieresis ecaron -140 +KPX Ydieresis ecircumflex -140 +KPX Ydieresis edieresis -140 +KPX Ydieresis edotaccent -140 +KPX Ydieresis egrave -140 +KPX Ydieresis emacron -70 +KPX Ydieresis eogonek -140 +KPX Ydieresis hyphen -140 +KPX Ydieresis i -20 +KPX Ydieresis iacute -20 +KPX Ydieresis iogonek -20 +KPX Ydieresis o -140 +KPX Ydieresis oacute -140 +KPX Ydieresis ocircumflex -140 +KPX Ydieresis odieresis -140 +KPX Ydieresis ograve -140 +KPX Ydieresis ohungarumlaut -140 +KPX Ydieresis omacron -140 +KPX Ydieresis oslash -140 +KPX Ydieresis otilde -140 +KPX Ydieresis period -140 +KPX Ydieresis semicolon -60 +KPX Ydieresis u -110 +KPX Ydieresis uacute -110 +KPX Ydieresis ucircumflex -110 +KPX Ydieresis udieresis -110 +KPX Ydieresis ugrave -110 +KPX Ydieresis uhungarumlaut -110 +KPX Ydieresis umacron -110 +KPX Ydieresis uogonek -110 +KPX Ydieresis uring -110 +KPX a v -20 +KPX a w -20 +KPX a y -30 +KPX a yacute -30 +KPX a ydieresis -30 +KPX aacute v -20 +KPX aacute w -20 +KPX aacute y -30 +KPX aacute yacute -30 +KPX aacute ydieresis -30 +KPX abreve v -20 +KPX abreve w -20 +KPX abreve y -30 +KPX abreve yacute -30 +KPX abreve ydieresis -30 +KPX acircumflex v -20 +KPX acircumflex w -20 +KPX acircumflex y -30 +KPX acircumflex yacute -30 +KPX acircumflex ydieresis -30 +KPX adieresis v -20 +KPX adieresis w -20 +KPX adieresis y -30 +KPX adieresis yacute -30 +KPX adieresis ydieresis -30 +KPX agrave v -20 +KPX agrave w -20 +KPX agrave y -30 +KPX agrave yacute -30 +KPX agrave ydieresis -30 +KPX amacron v -20 +KPX amacron w -20 +KPX amacron y -30 +KPX amacron yacute -30 +KPX amacron ydieresis -30 +KPX aogonek v -20 +KPX aogonek w -20 +KPX aogonek y -30 +KPX aogonek yacute -30 +KPX aogonek ydieresis -30 +KPX aring v -20 +KPX aring w -20 +KPX aring y -30 +KPX aring yacute -30 +KPX aring ydieresis -30 +KPX atilde v -20 +KPX atilde w -20 +KPX atilde y -30 +KPX atilde yacute -30 +KPX atilde ydieresis -30 +KPX b b -10 +KPX b comma -40 +KPX b l -20 +KPX b lacute -20 +KPX b lcommaaccent -20 +KPX b lslash -20 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -20 +KPX b y -20 +KPX b yacute -20 +KPX b ydieresis -20 +KPX c comma -15 +KPX c k -20 +KPX c kcommaaccent -20 +KPX cacute comma -15 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX ccaron comma -15 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccedilla comma -15 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX colon space -50 +KPX comma quotedblright -100 +KPX comma quoteright -100 +KPX e comma -15 +KPX e period -15 +KPX e v -30 +KPX e w -20 +KPX e x -30 +KPX e y -20 +KPX e yacute -20 +KPX e ydieresis -20 +KPX eacute comma -15 +KPX eacute period -15 +KPX eacute v -30 +KPX eacute w -20 +KPX eacute x -30 +KPX eacute y -20 +KPX eacute yacute -20 +KPX eacute ydieresis -20 +KPX ecaron comma -15 +KPX ecaron period -15 +KPX ecaron v -30 +KPX ecaron w -20 +KPX ecaron x -30 +KPX ecaron y -20 +KPX ecaron yacute -20 +KPX ecaron ydieresis -20 +KPX ecircumflex comma -15 +KPX ecircumflex period -15 +KPX ecircumflex v -30 +KPX ecircumflex w -20 +KPX ecircumflex x -30 +KPX ecircumflex y -20 +KPX ecircumflex yacute -20 +KPX ecircumflex ydieresis -20 +KPX edieresis comma -15 +KPX edieresis period -15 +KPX edieresis v -30 +KPX edieresis w -20 +KPX edieresis x -30 +KPX edieresis y -20 +KPX edieresis yacute -20 +KPX edieresis ydieresis -20 +KPX edotaccent comma -15 +KPX edotaccent period -15 +KPX edotaccent v -30 +KPX edotaccent w -20 +KPX edotaccent x -30 +KPX edotaccent y -20 +KPX edotaccent yacute -20 +KPX edotaccent ydieresis -20 +KPX egrave comma -15 +KPX egrave period -15 +KPX egrave v -30 +KPX egrave w -20 +KPX egrave x -30 +KPX egrave y -20 +KPX egrave yacute -20 +KPX egrave ydieresis -20 +KPX emacron comma -15 +KPX emacron period -15 +KPX emacron v -30 +KPX emacron w -20 +KPX emacron x -30 +KPX emacron y -20 +KPX emacron yacute -20 +KPX emacron ydieresis -20 +KPX eogonek comma -15 +KPX eogonek period -15 +KPX eogonek v -30 +KPX eogonek w -20 +KPX eogonek x -30 +KPX eogonek y -20 +KPX eogonek yacute -20 +KPX eogonek ydieresis -20 +KPX f a -30 +KPX f aacute -30 +KPX f abreve -30 +KPX f acircumflex -30 +KPX f adieresis -30 +KPX f agrave -30 +KPX f amacron -30 +KPX f aogonek -30 +KPX f aring -30 +KPX f atilde -30 +KPX f comma -30 +KPX f dotlessi -28 +KPX f e -30 +KPX f eacute -30 +KPX f ecaron -30 +KPX f ecircumflex -30 +KPX f edieresis -30 +KPX f edotaccent -30 +KPX f egrave -30 +KPX f emacron -30 +KPX f eogonek -30 +KPX f o -30 +KPX f oacute -30 +KPX f ocircumflex -30 +KPX f odieresis -30 +KPX f ograve -30 +KPX f ohungarumlaut -30 +KPX f omacron -30 +KPX f oslash -30 +KPX f otilde -30 +KPX f period -30 +KPX f quotedblright 60 +KPX f quoteright 50 +KPX g r -10 +KPX g racute -10 +KPX g rcaron -10 +KPX g rcommaaccent -10 +KPX gbreve r -10 +KPX gbreve racute -10 +KPX gbreve rcaron -10 +KPX gbreve rcommaaccent -10 +KPX gcommaaccent r -10 +KPX gcommaaccent racute -10 +KPX gcommaaccent rcaron -10 +KPX gcommaaccent rcommaaccent -10 +KPX h y -30 +KPX h yacute -30 +KPX h ydieresis -30 +KPX k e -20 +KPX k eacute -20 +KPX k ecaron -20 +KPX k ecircumflex -20 +KPX k edieresis -20 +KPX k edotaccent -20 +KPX k egrave -20 +KPX k emacron -20 +KPX k eogonek -20 +KPX k o -20 +KPX k oacute -20 +KPX k ocircumflex -20 +KPX k odieresis -20 +KPX k ograve -20 +KPX k ohungarumlaut -20 +KPX k omacron -20 +KPX k oslash -20 +KPX k otilde -20 +KPX kcommaaccent e -20 +KPX kcommaaccent eacute -20 +KPX kcommaaccent ecaron -20 +KPX kcommaaccent ecircumflex -20 +KPX kcommaaccent edieresis -20 +KPX kcommaaccent edotaccent -20 +KPX kcommaaccent egrave -20 +KPX kcommaaccent emacron -20 +KPX kcommaaccent eogonek -20 +KPX kcommaaccent o -20 +KPX kcommaaccent oacute -20 +KPX kcommaaccent ocircumflex -20 +KPX kcommaaccent odieresis -20 +KPX kcommaaccent ograve -20 +KPX kcommaaccent ohungarumlaut -20 +KPX kcommaaccent omacron -20 +KPX kcommaaccent oslash -20 +KPX kcommaaccent otilde -20 +KPX m u -10 +KPX m uacute -10 +KPX m ucircumflex -10 +KPX m udieresis -10 +KPX m ugrave -10 +KPX m uhungarumlaut -10 +KPX m umacron -10 +KPX m uogonek -10 +KPX m uring -10 +KPX m y -15 +KPX m yacute -15 +KPX m ydieresis -15 +KPX n u -10 +KPX n uacute -10 +KPX n ucircumflex -10 +KPX n udieresis -10 +KPX n ugrave -10 +KPX n uhungarumlaut -10 +KPX n umacron -10 +KPX n uogonek -10 +KPX n uring -10 +KPX n v -20 +KPX n y -15 +KPX n yacute -15 +KPX n ydieresis -15 +KPX nacute u -10 +KPX nacute uacute -10 +KPX nacute ucircumflex -10 +KPX nacute udieresis -10 +KPX nacute ugrave -10 +KPX nacute uhungarumlaut -10 +KPX nacute umacron -10 +KPX nacute uogonek -10 +KPX nacute uring -10 +KPX nacute v -20 +KPX nacute y -15 +KPX nacute yacute -15 +KPX nacute ydieresis -15 +KPX ncaron u -10 +KPX ncaron uacute -10 +KPX ncaron ucircumflex -10 +KPX ncaron udieresis -10 +KPX ncaron ugrave -10 +KPX ncaron uhungarumlaut -10 +KPX ncaron umacron -10 +KPX ncaron uogonek -10 +KPX ncaron uring -10 +KPX ncaron v -20 +KPX ncaron y -15 +KPX ncaron yacute -15 +KPX ncaron ydieresis -15 +KPX ncommaaccent u -10 +KPX ncommaaccent uacute -10 +KPX ncommaaccent ucircumflex -10 +KPX ncommaaccent udieresis -10 +KPX ncommaaccent ugrave -10 +KPX ncommaaccent uhungarumlaut -10 +KPX ncommaaccent umacron -10 +KPX ncommaaccent uogonek -10 +KPX ncommaaccent uring -10 +KPX ncommaaccent v -20 +KPX ncommaaccent y -15 +KPX ncommaaccent yacute -15 +KPX ncommaaccent ydieresis -15 +KPX ntilde u -10 +KPX ntilde uacute -10 +KPX ntilde ucircumflex -10 +KPX ntilde udieresis -10 +KPX ntilde ugrave -10 +KPX ntilde uhungarumlaut -10 +KPX ntilde umacron -10 +KPX ntilde uogonek -10 +KPX ntilde uring -10 +KPX ntilde v -20 +KPX ntilde y -15 +KPX ntilde yacute -15 +KPX ntilde ydieresis -15 +KPX o comma -40 +KPX o period -40 +KPX o v -15 +KPX o w -15 +KPX o x -30 +KPX o y -30 +KPX o yacute -30 +KPX o ydieresis -30 +KPX oacute comma -40 +KPX oacute period -40 +KPX oacute v -15 +KPX oacute w -15 +KPX oacute x -30 +KPX oacute y -30 +KPX oacute yacute -30 +KPX oacute ydieresis -30 +KPX ocircumflex comma -40 +KPX ocircumflex period -40 +KPX ocircumflex v -15 +KPX ocircumflex w -15 +KPX ocircumflex x -30 +KPX ocircumflex y -30 +KPX ocircumflex yacute -30 +KPX ocircumflex ydieresis -30 +KPX odieresis comma -40 +KPX odieresis period -40 +KPX odieresis v -15 +KPX odieresis w -15 +KPX odieresis x -30 +KPX odieresis y -30 +KPX odieresis yacute -30 +KPX odieresis ydieresis -30 +KPX ograve comma -40 +KPX ograve period -40 +KPX ograve v -15 +KPX ograve w -15 +KPX ograve x -30 +KPX ograve y -30 +KPX ograve yacute -30 +KPX ograve ydieresis -30 +KPX ohungarumlaut comma -40 +KPX ohungarumlaut period -40 +KPX ohungarumlaut v -15 +KPX ohungarumlaut w -15 +KPX ohungarumlaut x -30 +KPX ohungarumlaut y -30 +KPX ohungarumlaut yacute -30 +KPX ohungarumlaut ydieresis -30 +KPX omacron comma -40 +KPX omacron period -40 +KPX omacron v -15 +KPX omacron w -15 +KPX omacron x -30 +KPX omacron y -30 +KPX omacron yacute -30 +KPX omacron ydieresis -30 +KPX oslash a -55 +KPX oslash aacute -55 +KPX oslash abreve -55 +KPX oslash acircumflex -55 +KPX oslash adieresis -55 +KPX oslash agrave -55 +KPX oslash amacron -55 +KPX oslash aogonek -55 +KPX oslash aring -55 +KPX oslash atilde -55 +KPX oslash b -55 +KPX oslash c -55 +KPX oslash cacute -55 +KPX oslash ccaron -55 +KPX oslash ccedilla -55 +KPX oslash comma -95 +KPX oslash d -55 +KPX oslash dcroat -55 +KPX oslash e -55 +KPX oslash eacute -55 +KPX oslash ecaron -55 +KPX oslash ecircumflex -55 +KPX oslash edieresis -55 +KPX oslash edotaccent -55 +KPX oslash egrave -55 +KPX oslash emacron -55 +KPX oslash eogonek -55 +KPX oslash f -55 +KPX oslash g -55 +KPX oslash gbreve -55 +KPX oslash gcommaaccent -55 +KPX oslash h -55 +KPX oslash i -55 +KPX oslash iacute -55 +KPX oslash icircumflex -55 +KPX oslash idieresis -55 +KPX oslash igrave -55 +KPX oslash imacron -55 +KPX oslash iogonek -55 +KPX oslash j -55 +KPX oslash k -55 +KPX oslash kcommaaccent -55 +KPX oslash l -55 +KPX oslash lacute -55 +KPX oslash lcommaaccent -55 +KPX oslash lslash -55 +KPX oslash m -55 +KPX oslash n -55 +KPX oslash nacute -55 +KPX oslash ncaron -55 +KPX oslash ncommaaccent -55 +KPX oslash ntilde -55 +KPX oslash o -55 +KPX oslash oacute -55 +KPX oslash ocircumflex -55 +KPX oslash odieresis -55 +KPX oslash ograve -55 +KPX oslash ohungarumlaut -55 +KPX oslash omacron -55 +KPX oslash oslash -55 +KPX oslash otilde -55 +KPX oslash p -55 +KPX oslash period -95 +KPX oslash q -55 +KPX oslash r -55 +KPX oslash racute -55 +KPX oslash rcaron -55 +KPX oslash rcommaaccent -55 +KPX oslash s -55 +KPX oslash sacute -55 +KPX oslash scaron -55 +KPX oslash scedilla -55 +KPX oslash scommaaccent -55 +KPX oslash t -55 +KPX oslash tcommaaccent -55 +KPX oslash u -55 +KPX oslash uacute -55 +KPX oslash ucircumflex -55 +KPX oslash udieresis -55 +KPX oslash ugrave -55 +KPX oslash uhungarumlaut -55 +KPX oslash umacron -55 +KPX oslash uogonek -55 +KPX oslash uring -55 +KPX oslash v -70 +KPX oslash w -70 +KPX oslash x -85 +KPX oslash y -70 +KPX oslash yacute -70 +KPX oslash ydieresis -70 +KPX oslash z -55 +KPX oslash zacute -55 +KPX oslash zcaron -55 +KPX oslash zdotaccent -55 +KPX otilde comma -40 +KPX otilde period -40 +KPX otilde v -15 +KPX otilde w -15 +KPX otilde x -30 +KPX otilde y -30 +KPX otilde yacute -30 +KPX otilde ydieresis -30 +KPX p comma -35 +KPX p period -35 +KPX p y -30 +KPX p yacute -30 +KPX p ydieresis -30 +KPX period quotedblright -100 +KPX period quoteright -100 +KPX period space -60 +KPX quotedblright space -40 +KPX quoteleft quoteleft -57 +KPX quoteright d -50 +KPX quoteright dcroat -50 +KPX quoteright quoteright -57 +KPX quoteright r -50 +KPX quoteright racute -50 +KPX quoteright rcaron -50 +KPX quoteright rcommaaccent -50 +KPX quoteright s -50 +KPX quoteright sacute -50 +KPX quoteright scaron -50 +KPX quoteright scedilla -50 +KPX quoteright scommaaccent -50 +KPX quoteright space -70 +KPX r a -10 +KPX r aacute -10 +KPX r abreve -10 +KPX r acircumflex -10 +KPX r adieresis -10 +KPX r agrave -10 +KPX r amacron -10 +KPX r aogonek -10 +KPX r aring -10 +KPX r atilde -10 +KPX r colon 30 +KPX r comma -50 +KPX r i 15 +KPX r iacute 15 +KPX r icircumflex 15 +KPX r idieresis 15 +KPX r igrave 15 +KPX r imacron 15 +KPX r iogonek 15 +KPX r k 15 +KPX r kcommaaccent 15 +KPX r l 15 +KPX r lacute 15 +KPX r lcommaaccent 15 +KPX r lslash 15 +KPX r m 25 +KPX r n 25 +KPX r nacute 25 +KPX r ncaron 25 +KPX r ncommaaccent 25 +KPX r ntilde 25 +KPX r p 30 +KPX r period -50 +KPX r semicolon 30 +KPX r t 40 +KPX r tcommaaccent 40 +KPX r u 15 +KPX r uacute 15 +KPX r ucircumflex 15 +KPX r udieresis 15 +KPX r ugrave 15 +KPX r uhungarumlaut 15 +KPX r umacron 15 +KPX r uogonek 15 +KPX r uring 15 +KPX r v 30 +KPX r y 30 +KPX r yacute 30 +KPX r ydieresis 30 +KPX racute a -10 +KPX racute aacute -10 +KPX racute abreve -10 +KPX racute acircumflex -10 +KPX racute adieresis -10 +KPX racute agrave -10 +KPX racute amacron -10 +KPX racute aogonek -10 +KPX racute aring -10 +KPX racute atilde -10 +KPX racute colon 30 +KPX racute comma -50 +KPX racute i 15 +KPX racute iacute 15 +KPX racute icircumflex 15 +KPX racute idieresis 15 +KPX racute igrave 15 +KPX racute imacron 15 +KPX racute iogonek 15 +KPX racute k 15 +KPX racute kcommaaccent 15 +KPX racute l 15 +KPX racute lacute 15 +KPX racute lcommaaccent 15 +KPX racute lslash 15 +KPX racute m 25 +KPX racute n 25 +KPX racute nacute 25 +KPX racute ncaron 25 +KPX racute ncommaaccent 25 +KPX racute ntilde 25 +KPX racute p 30 +KPX racute period -50 +KPX racute semicolon 30 +KPX racute t 40 +KPX racute tcommaaccent 40 +KPX racute u 15 +KPX racute uacute 15 +KPX racute ucircumflex 15 +KPX racute udieresis 15 +KPX racute ugrave 15 +KPX racute uhungarumlaut 15 +KPX racute umacron 15 +KPX racute uogonek 15 +KPX racute uring 15 +KPX racute v 30 +KPX racute y 30 +KPX racute yacute 30 +KPX racute ydieresis 30 +KPX rcaron a -10 +KPX rcaron aacute -10 +KPX rcaron abreve -10 +KPX rcaron acircumflex -10 +KPX rcaron adieresis -10 +KPX rcaron agrave -10 +KPX rcaron amacron -10 +KPX rcaron aogonek -10 +KPX rcaron aring -10 +KPX rcaron atilde -10 +KPX rcaron colon 30 +KPX rcaron comma -50 +KPX rcaron i 15 +KPX rcaron iacute 15 +KPX rcaron icircumflex 15 +KPX rcaron idieresis 15 +KPX rcaron igrave 15 +KPX rcaron imacron 15 +KPX rcaron iogonek 15 +KPX rcaron k 15 +KPX rcaron kcommaaccent 15 +KPX rcaron l 15 +KPX rcaron lacute 15 +KPX rcaron lcommaaccent 15 +KPX rcaron lslash 15 +KPX rcaron m 25 +KPX rcaron n 25 +KPX rcaron nacute 25 +KPX rcaron ncaron 25 +KPX rcaron ncommaaccent 25 +KPX rcaron ntilde 25 +KPX rcaron p 30 +KPX rcaron period -50 +KPX rcaron semicolon 30 +KPX rcaron t 40 +KPX rcaron tcommaaccent 40 +KPX rcaron u 15 +KPX rcaron uacute 15 +KPX rcaron ucircumflex 15 +KPX rcaron udieresis 15 +KPX rcaron ugrave 15 +KPX rcaron uhungarumlaut 15 +KPX rcaron umacron 15 +KPX rcaron uogonek 15 +KPX rcaron uring 15 +KPX rcaron v 30 +KPX rcaron y 30 +KPX rcaron yacute 30 +KPX rcaron ydieresis 30 +KPX rcommaaccent a -10 +KPX rcommaaccent aacute -10 +KPX rcommaaccent abreve -10 +KPX rcommaaccent acircumflex -10 +KPX rcommaaccent adieresis -10 +KPX rcommaaccent agrave -10 +KPX rcommaaccent amacron -10 +KPX rcommaaccent aogonek -10 +KPX rcommaaccent aring -10 +KPX rcommaaccent atilde -10 +KPX rcommaaccent colon 30 +KPX rcommaaccent comma -50 +KPX rcommaaccent i 15 +KPX rcommaaccent iacute 15 +KPX rcommaaccent icircumflex 15 +KPX rcommaaccent idieresis 15 +KPX rcommaaccent igrave 15 +KPX rcommaaccent imacron 15 +KPX rcommaaccent iogonek 15 +KPX rcommaaccent k 15 +KPX rcommaaccent kcommaaccent 15 +KPX rcommaaccent l 15 +KPX rcommaaccent lacute 15 +KPX rcommaaccent lcommaaccent 15 +KPX rcommaaccent lslash 15 +KPX rcommaaccent m 25 +KPX rcommaaccent n 25 +KPX rcommaaccent nacute 25 +KPX rcommaaccent ncaron 25 +KPX rcommaaccent ncommaaccent 25 +KPX rcommaaccent ntilde 25 +KPX rcommaaccent p 30 +KPX rcommaaccent period -50 +KPX rcommaaccent semicolon 30 +KPX rcommaaccent t 40 +KPX rcommaaccent tcommaaccent 40 +KPX rcommaaccent u 15 +KPX rcommaaccent uacute 15 +KPX rcommaaccent ucircumflex 15 +KPX rcommaaccent udieresis 15 +KPX rcommaaccent ugrave 15 +KPX rcommaaccent uhungarumlaut 15 +KPX rcommaaccent umacron 15 +KPX rcommaaccent uogonek 15 +KPX rcommaaccent uring 15 +KPX rcommaaccent v 30 +KPX rcommaaccent y 30 +KPX rcommaaccent yacute 30 +KPX rcommaaccent ydieresis 30 +KPX s comma -15 +KPX s period -15 +KPX s w -30 +KPX sacute comma -15 +KPX sacute period -15 +KPX sacute w -30 +KPX scaron comma -15 +KPX scaron period -15 +KPX scaron w -30 +KPX scedilla comma -15 +KPX scedilla period -15 +KPX scedilla w -30 +KPX scommaaccent comma -15 +KPX scommaaccent period -15 +KPX scommaaccent w -30 +KPX semicolon space -50 +KPX space T -50 +KPX space Tcaron -50 +KPX space Tcommaaccent -50 +KPX space V -50 +KPX space W -40 +KPX space Y -90 +KPX space Yacute -90 +KPX space Ydieresis -90 +KPX space quotedblleft -30 +KPX space quoteleft -60 +KPX v a -25 +KPX v aacute -25 +KPX v abreve -25 +KPX v acircumflex -25 +KPX v adieresis -25 +KPX v agrave -25 +KPX v amacron -25 +KPX v aogonek -25 +KPX v aring -25 +KPX v atilde -25 +KPX v comma -80 +KPX v e -25 +KPX v eacute -25 +KPX v ecaron -25 +KPX v ecircumflex -25 +KPX v edieresis -25 +KPX v edotaccent -25 +KPX v egrave -25 +KPX v emacron -25 +KPX v eogonek -25 +KPX v o -25 +KPX v oacute -25 +KPX v ocircumflex -25 +KPX v odieresis -25 +KPX v ograve -25 +KPX v ohungarumlaut -25 +KPX v omacron -25 +KPX v oslash -25 +KPX v otilde -25 +KPX v period -80 +KPX w a -15 +KPX w aacute -15 +KPX w abreve -15 +KPX w acircumflex -15 +KPX w adieresis -15 +KPX w agrave -15 +KPX w amacron -15 +KPX w aogonek -15 +KPX w aring -15 +KPX w atilde -15 +KPX w comma -60 +KPX w e -10 +KPX w eacute -10 +KPX w ecaron -10 +KPX w ecircumflex -10 +KPX w edieresis -10 +KPX w edotaccent -10 +KPX w egrave -10 +KPX w emacron -10 +KPX w eogonek -10 +KPX w o -10 +KPX w oacute -10 +KPX w ocircumflex -10 +KPX w odieresis -10 +KPX w ograve -10 +KPX w ohungarumlaut -10 +KPX w omacron -10 +KPX w oslash -10 +KPX w otilde -10 +KPX w period -60 +KPX x e -30 +KPX x eacute -30 +KPX x ecaron -30 +KPX x ecircumflex -30 +KPX x edieresis -30 +KPX x edotaccent -30 +KPX x egrave -30 +KPX x emacron -30 +KPX x eogonek -30 +KPX y a -20 +KPX y aacute -20 +KPX y abreve -20 +KPX y acircumflex -20 +KPX y adieresis -20 +KPX y agrave -20 +KPX y amacron -20 +KPX y aogonek -20 +KPX y aring -20 +KPX y atilde -20 +KPX y comma -100 +KPX y e -20 +KPX y eacute -20 +KPX y ecaron -20 +KPX y ecircumflex -20 +KPX y edieresis -20 +KPX y edotaccent -20 +KPX y egrave -20 +KPX y emacron -20 +KPX y eogonek -20 +KPX y o -20 +KPX y oacute -20 +KPX y ocircumflex -20 +KPX y odieresis -20 +KPX y ograve -20 +KPX y ohungarumlaut -20 +KPX y omacron -20 +KPX y oslash -20 +KPX y otilde -20 +KPX y period -100 +KPX yacute a -20 +KPX yacute aacute -20 +KPX yacute abreve -20 +KPX yacute acircumflex -20 +KPX yacute adieresis -20 +KPX yacute agrave -20 +KPX yacute amacron -20 +KPX yacute aogonek -20 +KPX yacute aring -20 +KPX yacute atilde -20 +KPX yacute comma -100 +KPX yacute e -20 +KPX yacute eacute -20 +KPX yacute ecaron -20 +KPX yacute ecircumflex -20 +KPX yacute edieresis -20 +KPX yacute edotaccent -20 +KPX yacute egrave -20 +KPX yacute emacron -20 +KPX yacute eogonek -20 +KPX yacute o -20 +KPX yacute oacute -20 +KPX yacute ocircumflex -20 +KPX yacute odieresis -20 +KPX yacute ograve -20 +KPX yacute ohungarumlaut -20 +KPX yacute omacron -20 +KPX yacute oslash -20 +KPX yacute otilde -20 +KPX yacute period -100 +KPX ydieresis a -20 +KPX ydieresis aacute -20 +KPX ydieresis abreve -20 +KPX ydieresis acircumflex -20 +KPX ydieresis adieresis -20 +KPX ydieresis agrave -20 +KPX ydieresis amacron -20 +KPX ydieresis aogonek -20 +KPX ydieresis aring -20 +KPX ydieresis atilde -20 +KPX ydieresis comma -100 +KPX ydieresis e -20 +KPX ydieresis eacute -20 +KPX ydieresis ecaron -20 +KPX ydieresis ecircumflex -20 +KPX ydieresis edieresis -20 +KPX ydieresis edotaccent -20 +KPX ydieresis egrave -20 +KPX ydieresis emacron -20 +KPX ydieresis eogonek -20 +KPX ydieresis o -20 +KPX ydieresis oacute -20 +KPX ydieresis ocircumflex -20 +KPX ydieresis odieresis -20 +KPX ydieresis ograve -20 +KPX ydieresis ohungarumlaut -20 +KPX ydieresis omacron -20 +KPX ydieresis oslash -20 +KPX ydieresis otilde -20 +KPX ydieresis period -100 +KPX z e -15 +KPX z eacute -15 +KPX z ecaron -15 +KPX z ecircumflex -15 +KPX z edieresis -15 +KPX z edotaccent -15 +KPX z egrave -15 +KPX z emacron -15 +KPX z eogonek -15 +KPX z o -15 +KPX z oacute -15 +KPX z ocircumflex -15 +KPX z odieresis -15 +KPX z ograve -15 +KPX z ohungarumlaut -15 +KPX z omacron -15 +KPX z oslash -15 +KPX z otilde -15 +KPX zacute e -15 +KPX zacute eacute -15 +KPX zacute ecaron -15 +KPX zacute ecircumflex -15 +KPX zacute edieresis -15 +KPX zacute edotaccent -15 +KPX zacute egrave -15 +KPX zacute emacron -15 +KPX zacute eogonek -15 +KPX zacute o -15 +KPX zacute oacute -15 +KPX zacute ocircumflex -15 +KPX zacute odieresis -15 +KPX zacute ograve -15 +KPX zacute ohungarumlaut -15 +KPX zacute omacron -15 +KPX zacute oslash -15 +KPX zacute otilde -15 +KPX zcaron e -15 +KPX zcaron eacute -15 +KPX zcaron ecaron -15 +KPX zcaron ecircumflex -15 +KPX zcaron edieresis -15 +KPX zcaron edotaccent -15 +KPX zcaron egrave -15 +KPX zcaron emacron -15 +KPX zcaron eogonek -15 +KPX zcaron o -15 +KPX zcaron oacute -15 +KPX zcaron ocircumflex -15 +KPX zcaron odieresis -15 +KPX zcaron ograve -15 +KPX zcaron ohungarumlaut -15 +KPX zcaron omacron -15 +KPX zcaron oslash -15 +KPX zcaron otilde -15 +KPX zdotaccent e -15 +KPX zdotaccent eacute -15 +KPX zdotaccent ecaron -15 +KPX zdotaccent ecircumflex -15 +KPX zdotaccent edieresis -15 +KPX zdotaccent edotaccent -15 +KPX zdotaccent egrave -15 +KPX zdotaccent emacron -15 +KPX zdotaccent eogonek -15 +KPX zdotaccent o -15 +KPX zdotaccent oacute -15 +KPX zdotaccent ocircumflex -15 +KPX zdotaccent odieresis -15 +KPX zdotaccent ograve -15 +KPX zdotaccent ohungarumlaut -15 +KPX zdotaccent omacron -15 +KPX zdotaccent oslash -15 +KPX zdotaccent otilde -15 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/Symbol.afm b/dompdf/vendor/dompdf/dompdf/lib/fonts/Symbol.afm new file mode 100644 index 0000000..524cfb6 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/Symbol.afm @@ -0,0 +1,213 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved. +Comment Creation Date: Thu May 1 15:12:25 1997 +Comment UniqueID 43064 +Comment VMusage 30820 39997 +FontName Symbol +FullName Symbol +FamilyName Symbol +Weight Medium +ItalicAngle 0 +IsFixedPitch false +CharacterSet Special +FontBBox -180 -293 1090 1010 +UnderlinePosition -100 +UnderlineThickness 50 +Version 001.008 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved. +EncodingScheme FontSpecific +StdHW 92 +StdVW 85 +StartCharMetrics 190 +C 32 ; WX 250 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 128 -17 240 672 ; +C 34 ; WX 713 ; N universal ; B 31 0 681 705 ; +C 35 ; WX 500 ; N numbersign ; B 20 -16 481 673 ; +C 36 ; WX 549 ; N existential ; B 25 0 478 707 ; +C 37 ; WX 833 ; N percent ; B 63 -36 771 655 ; +C 38 ; WX 778 ; N ampersand ; B 41 -18 750 661 ; +C 39 ; WX 439 ; N suchthat ; B 48 -17 414 500 ; +C 40 ; WX 333 ; N parenleft ; B 53 -191 300 673 ; +C 41 ; WX 333 ; N parenright ; B 30 -191 277 673 ; +C 42 ; WX 500 ; N asteriskmath ; B 65 134 427 551 ; +C 43 ; WX 549 ; N plus ; B 10 0 539 533 ; +C 44 ; WX 250 ; N comma ; B 56 -152 194 104 ; +C 45 ; WX 549 ; N minus ; B 11 233 535 288 ; +C 46 ; WX 250 ; N period ; B 69 -17 181 95 ; +C 47 ; WX 278 ; N slash ; B 0 -18 254 646 ; +C 48 ; WX 500 ; N zero ; B 24 -14 476 685 ; +C 49 ; WX 500 ; N one ; B 117 0 390 673 ; +C 50 ; WX 500 ; N two ; B 25 0 475 685 ; +C 51 ; WX 500 ; N three ; B 43 -14 435 685 ; +C 52 ; WX 500 ; N four ; B 15 0 469 685 ; +C 53 ; WX 500 ; N five ; B 32 -14 445 690 ; +C 54 ; WX 500 ; N six ; B 34 -14 468 685 ; +C 55 ; WX 500 ; N seven ; B 24 -16 448 673 ; +C 56 ; WX 500 ; N eight ; B 56 -14 445 685 ; +C 57 ; WX 500 ; N nine ; B 30 -18 459 685 ; +C 58 ; WX 278 ; N colon ; B 81 -17 193 460 ; +C 59 ; WX 278 ; N semicolon ; B 83 -152 221 460 ; +C 60 ; WX 549 ; N less ; B 26 0 523 522 ; +C 61 ; WX 549 ; N equal ; B 11 141 537 390 ; +C 62 ; WX 549 ; N greater ; B 26 0 523 522 ; +C 63 ; WX 444 ; N question ; B 70 -17 412 686 ; +C 64 ; WX 549 ; N congruent ; B 11 0 537 475 ; +C 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ; +C 66 ; WX 667 ; N Beta ; B 29 0 592 673 ; +C 67 ; WX 722 ; N Chi ; B -9 0 704 673 ; +C 68 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ; +C 70 ; WX 763 ; N Phi ; B 26 0 741 673 ; +C 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ; +C 72 ; WX 722 ; N Eta ; B 39 0 729 673 ; +C 73 ; WX 333 ; N Iota ; B 32 0 316 673 ; +C 74 ; WX 631 ; N theta1 ; B 18 -18 623 689 ; +C 75 ; WX 722 ; N Kappa ; B 35 0 722 673 ; +C 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ; +C 77 ; WX 889 ; N Mu ; B 28 0 887 673 ; +C 78 ; WX 722 ; N Nu ; B 29 -8 720 673 ; +C 79 ; WX 722 ; N Omicron ; B 41 -17 715 685 ; +C 80 ; WX 768 ; N Pi ; B 25 0 745 673 ; +C 81 ; WX 741 ; N Theta ; B 41 -17 715 685 ; +C 82 ; WX 556 ; N Rho ; B 28 0 563 673 ; +C 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ; +C 84 ; WX 611 ; N Tau ; B 33 0 607 673 ; +C 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ; +C 86 ; WX 439 ; N sigma1 ; B 40 -233 436 500 ; +C 87 ; WX 768 ; N Omega ; B 34 0 736 688 ; +C 88 ; WX 645 ; N Xi ; B 40 0 599 673 ; +C 89 ; WX 795 ; N Psi ; B 15 0 781 684 ; +C 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ; +C 91 ; WX 333 ; N bracketleft ; B 86 -155 299 674 ; +C 92 ; WX 863 ; N therefore ; B 163 0 701 487 ; +C 93 ; WX 333 ; N bracketright ; B 33 -155 246 674 ; +C 94 ; WX 658 ; N perpendicular ; B 15 0 652 674 ; +C 95 ; WX 500 ; N underscore ; B -2 -125 502 -75 ; +C 96 ; WX 500 ; N radicalex ; B 480 881 1090 917 ; +C 97 ; WX 631 ; N alpha ; B 41 -18 622 500 ; +C 98 ; WX 549 ; N beta ; B 61 -223 515 741 ; +C 99 ; WX 549 ; N chi ; B 12 -231 522 499 ; +C 100 ; WX 494 ; N delta ; B 40 -19 481 740 ; +C 101 ; WX 439 ; N epsilon ; B 22 -19 427 502 ; +C 102 ; WX 521 ; N phi ; B 28 -224 492 673 ; +C 103 ; WX 411 ; N gamma ; B 5 -225 484 499 ; +C 104 ; WX 603 ; N eta ; B 0 -202 527 514 ; +C 105 ; WX 329 ; N iota ; B 0 -17 301 503 ; +C 106 ; WX 603 ; N phi1 ; B 36 -224 587 499 ; +C 107 ; WX 549 ; N kappa ; B 33 0 558 501 ; +C 108 ; WX 549 ; N lambda ; B 24 -17 548 739 ; +C 109 ; WX 576 ; N mu ; B 33 -223 567 500 ; +C 110 ; WX 521 ; N nu ; B -9 -16 475 507 ; +C 111 ; WX 549 ; N omicron ; B 35 -19 501 499 ; +C 112 ; WX 549 ; N pi ; B 10 -19 530 487 ; +C 113 ; WX 521 ; N theta ; B 43 -17 485 690 ; +C 114 ; WX 549 ; N rho ; B 50 -230 490 499 ; +C 115 ; WX 603 ; N sigma ; B 30 -21 588 500 ; +C 116 ; WX 439 ; N tau ; B 10 -19 418 500 ; +C 117 ; WX 576 ; N upsilon ; B 7 -18 535 507 ; +C 118 ; WX 713 ; N omega1 ; B 12 -18 671 583 ; +C 119 ; WX 686 ; N omega ; B 42 -17 684 500 ; +C 120 ; WX 493 ; N xi ; B 27 -224 469 766 ; +C 121 ; WX 686 ; N psi ; B 12 -228 701 500 ; +C 122 ; WX 494 ; N zeta ; B 60 -225 467 756 ; +C 123 ; WX 480 ; N braceleft ; B 58 -183 397 673 ; +C 124 ; WX 200 ; N bar ; B 65 -293 135 707 ; +C 125 ; WX 480 ; N braceright ; B 79 -183 418 673 ; +C 126 ; WX 549 ; N similar ; B 17 203 529 307 ; +C 160 ; WX 750 ; N Euro ; B 20 -12 714 685 ; +C 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 685 ; +C 162 ; WX 247 ; N minute ; B 27 459 228 735 ; +C 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ; +C 164 ; WX 167 ; N fraction ; B -180 -12 340 677 ; +C 165 ; WX 713 ; N infinity ; B 26 124 688 404 ; +C 166 ; WX 500 ; N florin ; B 2 -193 494 686 ; +C 167 ; WX 753 ; N club ; B 86 -26 660 533 ; +C 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ; +C 169 ; WX 753 ; N heart ; B 117 -33 631 532 ; +C 170 ; WX 753 ; N spade ; B 113 -36 629 548 ; +C 171 ; WX 1042 ; N arrowboth ; B 24 -15 1024 511 ; +C 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ; +C 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ; +C 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ; +C 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ; +C 176 ; WX 400 ; N degree ; B 50 385 350 685 ; +C 177 ; WX 549 ; N plusminus ; B 10 0 539 645 ; +C 178 ; WX 411 ; N second ; B 20 459 413 737 ; +C 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ; +C 180 ; WX 549 ; N multiply ; B 17 8 533 524 ; +C 181 ; WX 713 ; N proportional ; B 27 123 639 404 ; +C 182 ; WX 494 ; N partialdiff ; B 26 -20 462 746 ; +C 183 ; WX 460 ; N bullet ; B 50 113 410 473 ; +C 184 ; WX 549 ; N divide ; B 10 71 536 456 ; +C 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ; +C 186 ; WX 549 ; N equivalence ; B 14 82 538 443 ; +C 187 ; WX 549 ; N approxequal ; B 14 135 527 394 ; +C 188 ; WX 1000 ; N ellipsis ; B 111 -17 889 95 ; +C 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ; +C 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ; +C 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ; +C 192 ; WX 823 ; N aleph ; B 175 -18 661 658 ; +C 193 ; WX 686 ; N Ifraktur ; B 10 -53 578 740 ; +C 194 ; WX 795 ; N Rfraktur ; B 26 -15 759 734 ; +C 195 ; WX 987 ; N weierstrass ; B 159 -211 870 573 ; +C 196 ; WX 768 ; N circlemultiply ; B 43 -17 733 673 ; +C 197 ; WX 768 ; N circleplus ; B 43 -15 733 675 ; +C 198 ; WX 823 ; N emptyset ; B 39 -24 781 719 ; +C 199 ; WX 768 ; N intersection ; B 40 0 732 509 ; +C 200 ; WX 768 ; N union ; B 40 -17 732 492 ; +C 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ; +C 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ; +C 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ; +C 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ; +C 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ; +C 206 ; WX 713 ; N element ; B 45 0 505 468 ; +C 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ; +C 208 ; WX 768 ; N angle ; B 26 0 738 673 ; +C 209 ; WX 713 ; N gradient ; B 36 -19 681 718 ; +C 210 ; WX 790 ; N registerserif ; B 50 -17 740 673 ; +C 211 ; WX 790 ; N copyrightserif ; B 51 -15 741 675 ; +C 212 ; WX 890 ; N trademarkserif ; B 18 293 855 673 ; +C 213 ; WX 823 ; N product ; B 25 -101 803 751 ; +C 214 ; WX 549 ; N radical ; B 10 -38 515 917 ; +C 215 ; WX 250 ; N dotmath ; B 69 210 169 310 ; +C 216 ; WX 713 ; N logicalnot ; B 15 0 680 288 ; +C 217 ; WX 603 ; N logicaland ; B 23 0 583 454 ; +C 218 ; WX 603 ; N logicalor ; B 30 0 578 477 ; +C 219 ; WX 1042 ; N arrowdblboth ; B 27 -20 1023 510 ; +C 220 ; WX 987 ; N arrowdblleft ; B 30 -15 939 513 ; +C 221 ; WX 603 ; N arrowdblup ; B 39 2 567 911 ; +C 222 ; WX 987 ; N arrowdblright ; B 45 -20 954 508 ; +C 223 ; WX 603 ; N arrowdbldown ; B 44 -19 572 890 ; +C 224 ; WX 494 ; N lozenge ; B 18 0 466 745 ; +C 225 ; WX 329 ; N angleleft ; B 25 -198 306 746 ; +C 226 ; WX 790 ; N registersans ; B 50 -20 740 670 ; +C 227 ; WX 790 ; N copyrightsans ; B 49 -15 739 675 ; +C 228 ; WX 786 ; N trademarksans ; B 5 293 725 673 ; +C 229 ; WX 713 ; N summation ; B 14 -108 695 752 ; +C 230 ; WX 384 ; N parenlefttp ; B 24 -293 436 926 ; +C 231 ; WX 384 ; N parenleftex ; B 24 -85 108 925 ; +C 232 ; WX 384 ; N parenleftbt ; B 24 -293 436 926 ; +C 233 ; WX 384 ; N bracketlefttp ; B 0 -80 349 926 ; +C 234 ; WX 384 ; N bracketleftex ; B 0 -79 77 925 ; +C 235 ; WX 384 ; N bracketleftbt ; B 0 -80 349 926 ; +C 236 ; WX 494 ; N bracelefttp ; B 209 -85 445 925 ; +C 237 ; WX 494 ; N braceleftmid ; B 20 -85 284 935 ; +C 238 ; WX 494 ; N braceleftbt ; B 209 -75 445 935 ; +C 239 ; WX 494 ; N braceex ; B 209 -85 284 935 ; +C 241 ; WX 329 ; N angleright ; B 21 -198 302 746 ; +C 242 ; WX 274 ; N integral ; B 2 -107 291 916 ; +C 243 ; WX 686 ; N integraltp ; B 308 -88 675 920 ; +C 244 ; WX 686 ; N integralex ; B 308 -88 378 975 ; +C 245 ; WX 686 ; N integralbt ; B 11 -87 378 921 ; +C 246 ; WX 384 ; N parenrighttp ; B 54 -293 466 926 ; +C 247 ; WX 384 ; N parenrightex ; B 382 -85 466 925 ; +C 248 ; WX 384 ; N parenrightbt ; B 54 -293 466 926 ; +C 249 ; WX 384 ; N bracketrighttp ; B 22 -80 371 926 ; +C 250 ; WX 384 ; N bracketrightex ; B 294 -79 371 925 ; +C 251 ; WX 384 ; N bracketrightbt ; B 22 -80 371 926 ; +C 252 ; WX 494 ; N bracerighttp ; B 48 -85 284 925 ; +C 253 ; WX 494 ; N bracerightmid ; B 209 -85 473 935 ; +C 254 ; WX 494 ; N bracerightbt ; B 48 -75 284 935 ; +C -1 ; WX 790 ; N apple ; B 56 -3 733 808 ; +EndCharMetrics +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/Times-Bold.afm b/dompdf/vendor/dompdf/dompdf/lib/fonts/Times-Bold.afm new file mode 100644 index 0000000..86a3421 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/Times-Bold.afm @@ -0,0 +1,2590 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:52:56 1997 +Comment UniqueID 43065 +Comment VMusage 41636 52661 +FontName Times-Bold +FullName Times Bold +FamilyName Times +Weight Bold +ItalicAngle 0 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -168 -218 1000 935 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 676 +XHeight 461 +Ascender 683 +Descender -217 +StdHW 44 +StdVW 139 +StartCharMetrics 317 +C 32 ; WX 250 ; N space ; B 0 0 0 0 ; +C 160 ; WX 250 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 81 -13 251 691 ; +C 34 ; WX 555 ; N quotedbl ; B 83 404 472 691 ; +C 35 ; WX 500 ; N numbersign ; B 4 0 496 700 ; +C 36 ; WX 500 ; N dollar ; B 29 -99 472 750 ; +C 37 ; WX 1000 ; N percent ; B 124 -14 877 692 ; +C 38 ; WX 833 ; N ampersand ; B 62 -16 787 691 ; +C 146 ; WX 333 ; N quoteright ; B 79 356 263 691 ; +C 40 ; WX 333 ; N parenleft ; B 46 -168 306 694 ; +C 41 ; WX 333 ; N parenright ; B 27 -168 287 694 ; +C 42 ; WX 500 ; N asterisk ; B 56 255 447 691 ; +C 43 ; WX 570 ; N plus ; B 33 0 537 506 ; +C 44 ; WX 250 ; N comma ; B 39 -180 223 155 ; +C 45 ; WX 333 ; N hyphen ; B 44 171 287 287 ; +C 173 ; WX 333 ; N hyphen ; B 44 171 287 287 ; +C 46 ; WX 250 ; N period ; B 41 -13 210 156 ; +C 47 ; WX 278 ; N slash ; B -24 -19 302 691 ; +C 48 ; WX 500 ; N zero ; B 24 -13 476 688 ; +C 49 ; WX 500 ; N one ; B 65 0 442 688 ; +C 50 ; WX 500 ; N two ; B 17 0 478 688 ; +C 51 ; WX 500 ; N three ; B 16 -14 468 688 ; +C 52 ; WX 500 ; N four ; B 19 0 475 688 ; +C 53 ; WX 500 ; N five ; B 22 -8 470 676 ; +C 54 ; WX 500 ; N six ; B 28 -13 475 688 ; +C 55 ; WX 500 ; N seven ; B 17 0 477 676 ; +C 56 ; WX 500 ; N eight ; B 28 -13 472 688 ; +C 57 ; WX 500 ; N nine ; B 26 -13 473 688 ; +C 58 ; WX 333 ; N colon ; B 82 -13 251 472 ; +C 59 ; WX 333 ; N semicolon ; B 82 -180 266 472 ; +C 60 ; WX 570 ; N less ; B 31 -8 539 514 ; +C 61 ; WX 570 ; N equal ; B 33 107 537 399 ; +C 62 ; WX 570 ; N greater ; B 31 -8 539 514 ; +C 63 ; WX 500 ; N question ; B 57 -13 445 689 ; +C 64 ; WX 930 ; N at ; B 108 -19 822 691 ; +C 65 ; WX 722 ; N A ; B 9 0 689 690 ; +C 66 ; WX 667 ; N B ; B 16 0 619 676 ; +C 67 ; WX 722 ; N C ; B 49 -19 687 691 ; +C 68 ; WX 722 ; N D ; B 14 0 690 676 ; +C 69 ; WX 667 ; N E ; B 16 0 641 676 ; +C 70 ; WX 611 ; N F ; B 16 0 583 676 ; +C 71 ; WX 778 ; N G ; B 37 -19 755 691 ; +C 72 ; WX 778 ; N H ; B 21 0 759 676 ; +C 73 ; WX 389 ; N I ; B 20 0 370 676 ; +C 74 ; WX 500 ; N J ; B 3 -96 479 676 ; +C 75 ; WX 778 ; N K ; B 30 0 769 676 ; +C 76 ; WX 667 ; N L ; B 19 0 638 676 ; +C 77 ; WX 944 ; N M ; B 14 0 921 676 ; +C 78 ; WX 722 ; N N ; B 16 -18 701 676 ; +C 79 ; WX 778 ; N O ; B 35 -19 743 691 ; +C 80 ; WX 611 ; N P ; B 16 0 600 676 ; +C 81 ; WX 778 ; N Q ; B 35 -176 743 691 ; +C 82 ; WX 722 ; N R ; B 26 0 715 676 ; +C 83 ; WX 556 ; N S ; B 35 -19 513 692 ; +C 84 ; WX 667 ; N T ; B 31 0 636 676 ; +C 85 ; WX 722 ; N U ; B 16 -19 701 676 ; +C 86 ; WX 722 ; N V ; B 16 -18 701 676 ; +C 87 ; WX 1000 ; N W ; B 19 -15 981 676 ; +C 88 ; WX 722 ; N X ; B 16 0 699 676 ; +C 89 ; WX 722 ; N Y ; B 15 0 699 676 ; +C 90 ; WX 667 ; N Z ; B 28 0 634 676 ; +C 91 ; WX 333 ; N bracketleft ; B 67 -149 301 678 ; +C 92 ; WX 278 ; N backslash ; B -25 -19 303 691 ; +C 93 ; WX 333 ; N bracketright ; B 32 -149 266 678 ; +C 94 ; WX 581 ; N asciicircum ; B 73 311 509 676 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 145 ; WX 333 ; N quoteleft ; B 70 356 254 691 ; +C 97 ; WX 500 ; N a ; B 25 -14 488 473 ; +C 98 ; WX 556 ; N b ; B 17 -14 521 676 ; +C 99 ; WX 444 ; N c ; B 25 -14 430 473 ; +C 100 ; WX 556 ; N d ; B 25 -14 534 676 ; +C 101 ; WX 444 ; N e ; B 25 -14 426 473 ; +C 102 ; WX 333 ; N f ; B 14 0 389 691 ; L i fi ; L l fl ; +C 103 ; WX 500 ; N g ; B 28 -206 483 473 ; +C 104 ; WX 556 ; N h ; B 16 0 534 676 ; +C 105 ; WX 278 ; N i ; B 16 0 255 691 ; +C 106 ; WX 333 ; N j ; B -57 -203 263 691 ; +C 107 ; WX 556 ; N k ; B 22 0 543 676 ; +C 108 ; WX 278 ; N l ; B 16 0 255 676 ; +C 109 ; WX 833 ; N m ; B 16 0 814 473 ; +C 110 ; WX 556 ; N n ; B 21 0 539 473 ; +C 111 ; WX 500 ; N o ; B 25 -14 476 473 ; +C 112 ; WX 556 ; N p ; B 19 -205 524 473 ; +C 113 ; WX 556 ; N q ; B 34 -205 536 473 ; +C 114 ; WX 444 ; N r ; B 29 0 434 473 ; +C 115 ; WX 389 ; N s ; B 25 -14 361 473 ; +C 116 ; WX 333 ; N t ; B 20 -12 332 630 ; +C 117 ; WX 556 ; N u ; B 16 -14 537 461 ; +C 118 ; WX 500 ; N v ; B 21 -14 485 461 ; +C 119 ; WX 722 ; N w ; B 23 -14 707 461 ; +C 120 ; WX 500 ; N x ; B 12 0 484 461 ; +C 121 ; WX 500 ; N y ; B 16 -205 480 461 ; +C 122 ; WX 444 ; N z ; B 21 0 420 461 ; +C 123 ; WX 394 ; N braceleft ; B 22 -175 340 698 ; +C 124 ; WX 220 ; N bar ; B 66 -218 154 782 ; +C 125 ; WX 394 ; N braceright ; B 54 -175 372 698 ; +C 126 ; WX 520 ; N asciitilde ; B 29 173 491 333 ; +C 161 ; WX 333 ; N exclamdown ; B 82 -203 252 501 ; +C 162 ; WX 500 ; N cent ; B 53 -140 458 588 ; +C 163 ; WX 500 ; N sterling ; B 21 -14 477 684 ; +C -1 ; WX 167 ; N fraction ; B -168 -12 329 688 ; +C 165 ; WX 500 ; N yen ; B -64 0 547 676 ; +C 131 ; WX 500 ; N florin ; B 0 -155 498 706 ; +C 167 ; WX 500 ; N section ; B 57 -132 443 691 ; +C 164 ; WX 500 ; N currency ; B -26 61 526 613 ; +C 39 ; WX 278 ; N quotesingle ; B 75 404 204 691 ; +C 147 ; WX 500 ; N quotedblleft ; B 32 356 486 691 ; +C 171 ; WX 500 ; N guillemotleft ; B 23 36 473 415 ; +C 139 ; WX 333 ; N guilsinglleft ; B 51 36 305 415 ; +C 155 ; WX 333 ; N guilsinglright ; B 28 36 282 415 ; +C -1 ; WX 556 ; N fi ; B 14 0 536 691 ; +C -1 ; WX 556 ; N fl ; B 14 0 536 691 ; +C 150 ; WX 500 ; N endash ; B 0 181 500 271 ; +C 134 ; WX 500 ; N dagger ; B 47 -134 453 691 ; +C 135 ; WX 500 ; N daggerdbl ; B 45 -132 456 691 ; +C 183 ; WX 250 ; N periodcentered ; B 41 248 210 417 ; +C 182 ; WX 540 ; N paragraph ; B 0 -186 519 676 ; +C 149 ; WX 350 ; N bullet ; B 35 198 315 478 ; +C 130 ; WX 333 ; N quotesinglbase ; B 79 -180 263 155 ; +C 132 ; WX 500 ; N quotedblbase ; B 14 -180 468 155 ; +C 148 ; WX 500 ; N quotedblright ; B 14 356 468 691 ; +C 187 ; WX 500 ; N guillemotright ; B 27 36 477 415 ; +C 133 ; WX 1000 ; N ellipsis ; B 82 -13 917 156 ; +C 137 ; WX 1000 ; N perthousand ; B 7 -29 995 706 ; +C 191 ; WX 500 ; N questiondown ; B 55 -201 443 501 ; +C 96 ; WX 333 ; N grave ; B 8 528 246 713 ; +C 180 ; WX 333 ; N acute ; B 86 528 324 713 ; +C 136 ; WX 333 ; N circumflex ; B -2 528 335 704 ; +C 152 ; WX 333 ; N tilde ; B -16 547 349 674 ; +C 175 ; WX 333 ; N macron ; B 1 565 331 637 ; +C -1 ; WX 333 ; N breve ; B 15 528 318 691 ; +C -1 ; WX 333 ; N dotaccent ; B 103 536 258 691 ; +C 168 ; WX 333 ; N dieresis ; B -2 537 335 667 ; +C -1 ; WX 333 ; N ring ; B 60 527 273 740 ; +C 184 ; WX 333 ; N cedilla ; B 68 -218 294 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B -13 528 425 713 ; +C -1 ; WX 333 ; N ogonek ; B 90 -193 319 24 ; +C -1 ; WX 333 ; N caron ; B -2 528 335 704 ; +C 151 ; WX 1000 ; N emdash ; B 0 181 1000 271 ; +C 198 ; WX 1000 ; N AE ; B 4 0 951 676 ; +C 170 ; WX 300 ; N ordfeminine ; B -1 397 301 688 ; +C -1 ; WX 667 ; N Lslash ; B 19 0 638 676 ; +C 216 ; WX 778 ; N Oslash ; B 35 -74 743 737 ; +C 140 ; WX 1000 ; N OE ; B 22 -5 981 684 ; +C 186 ; WX 330 ; N ordmasculine ; B 18 397 312 688 ; +C 230 ; WX 722 ; N ae ; B 33 -14 693 473 ; +C -1 ; WX 278 ; N dotlessi ; B 16 0 255 461 ; +C -1 ; WX 278 ; N lslash ; B -22 0 303 676 ; +C 248 ; WX 500 ; N oslash ; B 25 -92 476 549 ; +C 156 ; WX 722 ; N oe ; B 22 -14 696 473 ; +C 223 ; WX 556 ; N germandbls ; B 19 -12 517 691 ; +C 207 ; WX 389 ; N Idieresis ; B 20 0 370 877 ; +C 233 ; WX 444 ; N eacute ; B 25 -14 426 713 ; +C -1 ; WX 500 ; N abreve ; B 25 -14 488 691 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 16 -14 557 713 ; +C -1 ; WX 444 ; N ecaron ; B 25 -14 426 704 ; +C 159 ; WX 722 ; N Ydieresis ; B 15 0 699 877 ; +C 247 ; WX 570 ; N divide ; B 33 -31 537 537 ; +C 221 ; WX 722 ; N Yacute ; B 15 0 699 923 ; +C 194 ; WX 722 ; N Acircumflex ; B 9 0 689 914 ; +C 225 ; WX 500 ; N aacute ; B 25 -14 488 713 ; +C 219 ; WX 722 ; N Ucircumflex ; B 16 -19 701 914 ; +C 253 ; WX 500 ; N yacute ; B 16 -205 480 713 ; +C -1 ; WX 389 ; N scommaaccent ; B 25 -218 361 473 ; +C 234 ; WX 444 ; N ecircumflex ; B 25 -14 426 704 ; +C -1 ; WX 722 ; N Uring ; B 16 -19 701 935 ; +C 220 ; WX 722 ; N Udieresis ; B 16 -19 701 877 ; +C -1 ; WX 500 ; N aogonek ; B 25 -193 504 473 ; +C 218 ; WX 722 ; N Uacute ; B 16 -19 701 923 ; +C -1 ; WX 556 ; N uogonek ; B 16 -193 539 461 ; +C 203 ; WX 667 ; N Edieresis ; B 16 0 641 877 ; +C -1 ; WX 722 ; N Dcroat ; B 6 0 690 676 ; +C -1 ; WX 250 ; N commaaccent ; B 47 -218 203 -50 ; +C 169 ; WX 747 ; N copyright ; B 26 -19 721 691 ; +C -1 ; WX 667 ; N Emacron ; B 16 0 641 847 ; +C -1 ; WX 444 ; N ccaron ; B 25 -14 430 704 ; +C 229 ; WX 500 ; N aring ; B 25 -14 488 740 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 16 -188 701 676 ; +C -1 ; WX 278 ; N lacute ; B 16 0 297 923 ; +C 224 ; WX 500 ; N agrave ; B 25 -14 488 713 ; +C -1 ; WX 667 ; N Tcommaaccent ; B 31 -218 636 676 ; +C -1 ; WX 722 ; N Cacute ; B 49 -19 687 923 ; +C 227 ; WX 500 ; N atilde ; B 25 -14 488 674 ; +C -1 ; WX 667 ; N Edotaccent ; B 16 0 641 901 ; +C 154 ; WX 389 ; N scaron ; B 25 -14 363 704 ; +C -1 ; WX 389 ; N scedilla ; B 25 -218 361 473 ; +C 237 ; WX 278 ; N iacute ; B 16 0 289 713 ; +C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; +C -1 ; WX 722 ; N Rcaron ; B 26 0 715 914 ; +C -1 ; WX 778 ; N Gcommaaccent ; B 37 -218 755 691 ; +C 251 ; WX 556 ; N ucircumflex ; B 16 -14 537 704 ; +C 226 ; WX 500 ; N acircumflex ; B 25 -14 488 704 ; +C -1 ; WX 722 ; N Amacron ; B 9 0 689 847 ; +C -1 ; WX 444 ; N rcaron ; B 29 0 434 704 ; +C 231 ; WX 444 ; N ccedilla ; B 25 -218 430 473 ; +C -1 ; WX 667 ; N Zdotaccent ; B 28 0 634 901 ; +C 222 ; WX 611 ; N Thorn ; B 16 0 600 676 ; +C -1 ; WX 778 ; N Omacron ; B 35 -19 743 847 ; +C -1 ; WX 722 ; N Racute ; B 26 0 715 923 ; +C -1 ; WX 556 ; N Sacute ; B 35 -19 513 923 ; +C -1 ; WX 672 ; N dcaron ; B 25 -14 681 682 ; +C -1 ; WX 722 ; N Umacron ; B 16 -19 701 847 ; +C -1 ; WX 556 ; N uring ; B 16 -14 537 740 ; +C 179 ; WX 300 ; N threesuperior ; B 3 268 297 688 ; +C 210 ; WX 778 ; N Ograve ; B 35 -19 743 923 ; +C 192 ; WX 722 ; N Agrave ; B 9 0 689 923 ; +C -1 ; WX 722 ; N Abreve ; B 9 0 689 901 ; +C 215 ; WX 570 ; N multiply ; B 48 16 522 490 ; +C 250 ; WX 556 ; N uacute ; B 16 -14 537 713 ; +C -1 ; WX 667 ; N Tcaron ; B 31 0 636 914 ; +C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; +C 255 ; WX 500 ; N ydieresis ; B 16 -205 480 667 ; +C -1 ; WX 722 ; N Nacute ; B 16 -18 701 923 ; +C 238 ; WX 278 ; N icircumflex ; B -37 0 300 704 ; +C 202 ; WX 667 ; N Ecircumflex ; B 16 0 641 914 ; +C 228 ; WX 500 ; N adieresis ; B 25 -14 488 667 ; +C 235 ; WX 444 ; N edieresis ; B 25 -14 426 667 ; +C -1 ; WX 444 ; N cacute ; B 25 -14 430 713 ; +C -1 ; WX 556 ; N nacute ; B 21 0 539 713 ; +C -1 ; WX 556 ; N umacron ; B 16 -14 537 637 ; +C -1 ; WX 722 ; N Ncaron ; B 16 -18 701 914 ; +C 205 ; WX 389 ; N Iacute ; B 20 0 370 923 ; +C 177 ; WX 570 ; N plusminus ; B 33 0 537 506 ; +C 166 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ; +C 174 ; WX 747 ; N registered ; B 26 -19 721 691 ; +C -1 ; WX 778 ; N Gbreve ; B 37 -19 755 901 ; +C -1 ; WX 389 ; N Idotaccent ; B 20 0 370 901 ; +C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; +C 200 ; WX 667 ; N Egrave ; B 16 0 641 923 ; +C -1 ; WX 444 ; N racute ; B 29 0 434 713 ; +C -1 ; WX 500 ; N omacron ; B 25 -14 476 637 ; +C -1 ; WX 667 ; N Zacute ; B 28 0 634 923 ; +C 142 ; WX 667 ; N Zcaron ; B 28 0 634 914 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; +C 208 ; WX 722 ; N Eth ; B 6 0 690 676 ; +C 199 ; WX 722 ; N Ccedilla ; B 49 -218 687 691 ; +C -1 ; WX 278 ; N lcommaaccent ; B 16 -218 255 676 ; +C -1 ; WX 416 ; N tcaron ; B 20 -12 425 815 ; +C -1 ; WX 444 ; N eogonek ; B 25 -193 426 473 ; +C -1 ; WX 722 ; N Uogonek ; B 16 -193 701 676 ; +C 193 ; WX 722 ; N Aacute ; B 9 0 689 923 ; +C 196 ; WX 722 ; N Adieresis ; B 9 0 689 877 ; +C 232 ; WX 444 ; N egrave ; B 25 -14 426 713 ; +C -1 ; WX 444 ; N zacute ; B 21 0 420 713 ; +C -1 ; WX 278 ; N iogonek ; B 16 -193 274 691 ; +C 211 ; WX 778 ; N Oacute ; B 35 -19 743 923 ; +C 243 ; WX 500 ; N oacute ; B 25 -14 476 713 ; +C -1 ; WX 500 ; N amacron ; B 25 -14 488 637 ; +C -1 ; WX 389 ; N sacute ; B 25 -14 361 713 ; +C 239 ; WX 278 ; N idieresis ; B -37 0 300 667 ; +C 212 ; WX 778 ; N Ocircumflex ; B 35 -19 743 914 ; +C 217 ; WX 722 ; N Ugrave ; B 16 -19 701 923 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 556 ; N thorn ; B 19 -205 524 676 ; +C 178 ; WX 300 ; N twosuperior ; B 0 275 300 688 ; +C 214 ; WX 778 ; N Odieresis ; B 35 -19 743 877 ; +C 181 ; WX 556 ; N mu ; B 33 -206 536 461 ; +C 236 ; WX 278 ; N igrave ; B -27 0 255 713 ; +C -1 ; WX 500 ; N ohungarumlaut ; B 25 -14 529 713 ; +C -1 ; WX 667 ; N Eogonek ; B 16 -193 644 676 ; +C -1 ; WX 556 ; N dcroat ; B 25 -14 534 676 ; +C 190 ; WX 750 ; N threequarters ; B 23 -12 733 688 ; +C -1 ; WX 556 ; N Scedilla ; B 35 -218 513 692 ; +C -1 ; WX 394 ; N lcaron ; B 16 0 412 682 ; +C -1 ; WX 778 ; N Kcommaaccent ; B 30 -218 769 676 ; +C -1 ; WX 667 ; N Lacute ; B 19 0 638 923 ; +C 153 ; WX 1000 ; N trademark ; B 24 271 977 676 ; +C -1 ; WX 444 ; N edotaccent ; B 25 -14 426 691 ; +C 204 ; WX 389 ; N Igrave ; B 20 0 370 923 ; +C -1 ; WX 389 ; N Imacron ; B 20 0 370 847 ; +C -1 ; WX 667 ; N Lcaron ; B 19 0 652 682 ; +C 189 ; WX 750 ; N onehalf ; B -7 -12 775 688 ; +C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; +C 244 ; WX 500 ; N ocircumflex ; B 25 -14 476 704 ; +C 241 ; WX 556 ; N ntilde ; B 21 0 539 674 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 16 -19 701 923 ; +C 201 ; WX 667 ; N Eacute ; B 16 0 641 923 ; +C -1 ; WX 444 ; N emacron ; B 25 -14 426 637 ; +C -1 ; WX 500 ; N gbreve ; B 28 -206 483 691 ; +C 188 ; WX 750 ; N onequarter ; B 28 -12 743 688 ; +C 138 ; WX 556 ; N Scaron ; B 35 -19 513 914 ; +C -1 ; WX 556 ; N Scommaaccent ; B 35 -218 513 692 ; +C -1 ; WX 778 ; N Ohungarumlaut ; B 35 -19 743 923 ; +C 176 ; WX 400 ; N degree ; B 57 402 343 688 ; +C 242 ; WX 500 ; N ograve ; B 25 -14 476 713 ; +C -1 ; WX 722 ; N Ccaron ; B 49 -19 687 914 ; +C 249 ; WX 556 ; N ugrave ; B 16 -14 537 713 ; +C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; +C -1 ; WX 722 ; N Dcaron ; B 14 0 690 914 ; +C -1 ; WX 444 ; N rcommaaccent ; B 29 -218 434 473 ; +C 209 ; WX 722 ; N Ntilde ; B 16 -18 701 884 ; +C 245 ; WX 500 ; N otilde ; B 25 -14 476 674 ; +C -1 ; WX 722 ; N Rcommaaccent ; B 26 -218 715 676 ; +C -1 ; WX 667 ; N Lcommaaccent ; B 19 -218 638 676 ; +C 195 ; WX 722 ; N Atilde ; B 9 0 689 884 ; +C -1 ; WX 722 ; N Aogonek ; B 9 -193 699 690 ; +C 197 ; WX 722 ; N Aring ; B 9 0 689 935 ; +C 213 ; WX 778 ; N Otilde ; B 35 -19 743 884 ; +C -1 ; WX 444 ; N zdotaccent ; B 21 0 420 691 ; +C -1 ; WX 667 ; N Ecaron ; B 16 0 641 914 ; +C -1 ; WX 389 ; N Iogonek ; B 20 -193 370 676 ; +C -1 ; WX 556 ; N kcommaaccent ; B 22 -218 543 676 ; +C -1 ; WX 570 ; N minus ; B 33 209 537 297 ; +C 206 ; WX 389 ; N Icircumflex ; B 20 0 370 914 ; +C -1 ; WX 556 ; N ncaron ; B 21 0 539 704 ; +C -1 ; WX 333 ; N tcommaaccent ; B 20 -218 332 630 ; +C 172 ; WX 570 ; N logicalnot ; B 33 108 537 399 ; +C 246 ; WX 500 ; N odieresis ; B 25 -14 476 667 ; +C 252 ; WX 556 ; N udieresis ; B 16 -14 537 667 ; +C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; +C -1 ; WX 500 ; N gcommaaccent ; B 28 -206 483 829 ; +C 240 ; WX 500 ; N eth ; B 25 -14 476 691 ; +C 158 ; WX 444 ; N zcaron ; B 21 0 420 704 ; +C -1 ; WX 556 ; N ncommaaccent ; B 21 -218 539 473 ; +C 185 ; WX 300 ; N onesuperior ; B 28 275 273 688 ; +C -1 ; WX 278 ; N imacron ; B -8 0 272 637 ; +C 128 ; WX 500 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2242 +KPX A C -55 +KPX A Cacute -55 +KPX A Ccaron -55 +KPX A Ccedilla -55 +KPX A G -55 +KPX A Gbreve -55 +KPX A Gcommaaccent -55 +KPX A O -45 +KPX A Oacute -45 +KPX A Ocircumflex -45 +KPX A Odieresis -45 +KPX A Ograve -45 +KPX A Ohungarumlaut -45 +KPX A Omacron -45 +KPX A Oslash -45 +KPX A Otilde -45 +KPX A Q -45 +KPX A T -95 +KPX A Tcaron -95 +KPX A Tcommaaccent -95 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -145 +KPX A W -130 +KPX A Y -100 +KPX A Yacute -100 +KPX A Ydieresis -100 +KPX A p -25 +KPX A quoteright -74 +KPX A u -50 +KPX A uacute -50 +KPX A ucircumflex -50 +KPX A udieresis -50 +KPX A ugrave -50 +KPX A uhungarumlaut -50 +KPX A umacron -50 +KPX A uogonek -50 +KPX A uring -50 +KPX A v -100 +KPX A w -90 +KPX A y -74 +KPX A yacute -74 +KPX A ydieresis -74 +KPX Aacute C -55 +KPX Aacute Cacute -55 +KPX Aacute Ccaron -55 +KPX Aacute Ccedilla -55 +KPX Aacute G -55 +KPX Aacute Gbreve -55 +KPX Aacute Gcommaaccent -55 +KPX Aacute O -45 +KPX Aacute Oacute -45 +KPX Aacute Ocircumflex -45 +KPX Aacute Odieresis -45 +KPX Aacute Ograve -45 +KPX Aacute Ohungarumlaut -45 +KPX Aacute Omacron -45 +KPX Aacute Oslash -45 +KPX Aacute Otilde -45 +KPX Aacute Q -45 +KPX Aacute T -95 +KPX Aacute Tcaron -95 +KPX Aacute Tcommaaccent -95 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -145 +KPX Aacute W -130 +KPX Aacute Y -100 +KPX Aacute Yacute -100 +KPX Aacute Ydieresis -100 +KPX Aacute p -25 +KPX Aacute quoteright -74 +KPX Aacute u -50 +KPX Aacute uacute -50 +KPX Aacute ucircumflex -50 +KPX Aacute udieresis -50 +KPX Aacute ugrave -50 +KPX Aacute uhungarumlaut -50 +KPX Aacute umacron -50 +KPX Aacute uogonek -50 +KPX Aacute uring -50 +KPX Aacute v -100 +KPX Aacute w -90 +KPX Aacute y -74 +KPX Aacute yacute -74 +KPX Aacute ydieresis -74 +KPX Abreve C -55 +KPX Abreve Cacute -55 +KPX Abreve Ccaron -55 +KPX Abreve Ccedilla -55 +KPX Abreve G -55 +KPX Abreve Gbreve -55 +KPX Abreve Gcommaaccent -55 +KPX Abreve O -45 +KPX Abreve Oacute -45 +KPX Abreve Ocircumflex -45 +KPX Abreve Odieresis -45 +KPX Abreve Ograve -45 +KPX Abreve Ohungarumlaut -45 +KPX Abreve Omacron -45 +KPX Abreve Oslash -45 +KPX Abreve Otilde -45 +KPX Abreve Q -45 +KPX Abreve T -95 +KPX Abreve Tcaron -95 +KPX Abreve Tcommaaccent -95 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -145 +KPX Abreve W -130 +KPX Abreve Y -100 +KPX Abreve Yacute -100 +KPX Abreve Ydieresis -100 +KPX Abreve p -25 +KPX Abreve quoteright -74 +KPX Abreve u -50 +KPX Abreve uacute -50 +KPX Abreve ucircumflex -50 +KPX Abreve udieresis -50 +KPX Abreve ugrave -50 +KPX Abreve uhungarumlaut -50 +KPX Abreve umacron -50 +KPX Abreve uogonek -50 +KPX Abreve uring -50 +KPX Abreve v -100 +KPX Abreve w -90 +KPX Abreve y -74 +KPX Abreve yacute -74 +KPX Abreve ydieresis -74 +KPX Acircumflex C -55 +KPX Acircumflex Cacute -55 +KPX Acircumflex Ccaron -55 +KPX Acircumflex Ccedilla -55 +KPX Acircumflex G -55 +KPX Acircumflex Gbreve -55 +KPX Acircumflex Gcommaaccent -55 +KPX Acircumflex O -45 +KPX Acircumflex Oacute -45 +KPX Acircumflex Ocircumflex -45 +KPX Acircumflex Odieresis -45 +KPX Acircumflex Ograve -45 +KPX Acircumflex Ohungarumlaut -45 +KPX Acircumflex Omacron -45 +KPX Acircumflex Oslash -45 +KPX Acircumflex Otilde -45 +KPX Acircumflex Q -45 +KPX Acircumflex T -95 +KPX Acircumflex Tcaron -95 +KPX Acircumflex Tcommaaccent -95 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -145 +KPX Acircumflex W -130 +KPX Acircumflex Y -100 +KPX Acircumflex Yacute -100 +KPX Acircumflex Ydieresis -100 +KPX Acircumflex p -25 +KPX Acircumflex quoteright -74 +KPX Acircumflex u -50 +KPX Acircumflex uacute -50 +KPX Acircumflex ucircumflex -50 +KPX Acircumflex udieresis -50 +KPX Acircumflex ugrave -50 +KPX Acircumflex uhungarumlaut -50 +KPX Acircumflex umacron -50 +KPX Acircumflex uogonek -50 +KPX Acircumflex uring -50 +KPX Acircumflex v -100 +KPX Acircumflex w -90 +KPX Acircumflex y -74 +KPX Acircumflex yacute -74 +KPX Acircumflex ydieresis -74 +KPX Adieresis C -55 +KPX Adieresis Cacute -55 +KPX Adieresis Ccaron -55 +KPX Adieresis Ccedilla -55 +KPX Adieresis G -55 +KPX Adieresis Gbreve -55 +KPX Adieresis Gcommaaccent -55 +KPX Adieresis O -45 +KPX Adieresis Oacute -45 +KPX Adieresis Ocircumflex -45 +KPX Adieresis Odieresis -45 +KPX Adieresis Ograve -45 +KPX Adieresis Ohungarumlaut -45 +KPX Adieresis Omacron -45 +KPX Adieresis Oslash -45 +KPX Adieresis Otilde -45 +KPX Adieresis Q -45 +KPX Adieresis T -95 +KPX Adieresis Tcaron -95 +KPX Adieresis Tcommaaccent -95 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -145 +KPX Adieresis W -130 +KPX Adieresis Y -100 +KPX Adieresis Yacute -100 +KPX Adieresis Ydieresis -100 +KPX Adieresis p -25 +KPX Adieresis quoteright -74 +KPX Adieresis u -50 +KPX Adieresis uacute -50 +KPX Adieresis ucircumflex -50 +KPX Adieresis udieresis -50 +KPX Adieresis ugrave -50 +KPX Adieresis uhungarumlaut -50 +KPX Adieresis umacron -50 +KPX Adieresis uogonek -50 +KPX Adieresis uring -50 +KPX Adieresis v -100 +KPX Adieresis w -90 +KPX Adieresis y -74 +KPX Adieresis yacute -74 +KPX Adieresis ydieresis -74 +KPX Agrave C -55 +KPX Agrave Cacute -55 +KPX Agrave Ccaron -55 +KPX Agrave Ccedilla -55 +KPX Agrave G -55 +KPX Agrave Gbreve -55 +KPX Agrave Gcommaaccent -55 +KPX Agrave O -45 +KPX Agrave Oacute -45 +KPX Agrave Ocircumflex -45 +KPX Agrave Odieresis -45 +KPX Agrave Ograve -45 +KPX Agrave Ohungarumlaut -45 +KPX Agrave Omacron -45 +KPX Agrave Oslash -45 +KPX Agrave Otilde -45 +KPX Agrave Q -45 +KPX Agrave T -95 +KPX Agrave Tcaron -95 +KPX Agrave Tcommaaccent -95 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -145 +KPX Agrave W -130 +KPX Agrave Y -100 +KPX Agrave Yacute -100 +KPX Agrave Ydieresis -100 +KPX Agrave p -25 +KPX Agrave quoteright -74 +KPX Agrave u -50 +KPX Agrave uacute -50 +KPX Agrave ucircumflex -50 +KPX Agrave udieresis -50 +KPX Agrave ugrave -50 +KPX Agrave uhungarumlaut -50 +KPX Agrave umacron -50 +KPX Agrave uogonek -50 +KPX Agrave uring -50 +KPX Agrave v -100 +KPX Agrave w -90 +KPX Agrave y -74 +KPX Agrave yacute -74 +KPX Agrave ydieresis -74 +KPX Amacron C -55 +KPX Amacron Cacute -55 +KPX Amacron Ccaron -55 +KPX Amacron Ccedilla -55 +KPX Amacron G -55 +KPX Amacron Gbreve -55 +KPX Amacron Gcommaaccent -55 +KPX Amacron O -45 +KPX Amacron Oacute -45 +KPX Amacron Ocircumflex -45 +KPX Amacron Odieresis -45 +KPX Amacron Ograve -45 +KPX Amacron Ohungarumlaut -45 +KPX Amacron Omacron -45 +KPX Amacron Oslash -45 +KPX Amacron Otilde -45 +KPX Amacron Q -45 +KPX Amacron T -95 +KPX Amacron Tcaron -95 +KPX Amacron Tcommaaccent -95 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -145 +KPX Amacron W -130 +KPX Amacron Y -100 +KPX Amacron Yacute -100 +KPX Amacron Ydieresis -100 +KPX Amacron p -25 +KPX Amacron quoteright -74 +KPX Amacron u -50 +KPX Amacron uacute -50 +KPX Amacron ucircumflex -50 +KPX Amacron udieresis -50 +KPX Amacron ugrave -50 +KPX Amacron uhungarumlaut -50 +KPX Amacron umacron -50 +KPX Amacron uogonek -50 +KPX Amacron uring -50 +KPX Amacron v -100 +KPX Amacron w -90 +KPX Amacron y -74 +KPX Amacron yacute -74 +KPX Amacron ydieresis -74 +KPX Aogonek C -55 +KPX Aogonek Cacute -55 +KPX Aogonek Ccaron -55 +KPX Aogonek Ccedilla -55 +KPX Aogonek G -55 +KPX Aogonek Gbreve -55 +KPX Aogonek Gcommaaccent -55 +KPX Aogonek O -45 +KPX Aogonek Oacute -45 +KPX Aogonek Ocircumflex -45 +KPX Aogonek Odieresis -45 +KPX Aogonek Ograve -45 +KPX Aogonek Ohungarumlaut -45 +KPX Aogonek Omacron -45 +KPX Aogonek Oslash -45 +KPX Aogonek Otilde -45 +KPX Aogonek Q -45 +KPX Aogonek T -95 +KPX Aogonek Tcaron -95 +KPX Aogonek Tcommaaccent -95 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -145 +KPX Aogonek W -130 +KPX Aogonek Y -100 +KPX Aogonek Yacute -100 +KPX Aogonek Ydieresis -100 +KPX Aogonek p -25 +KPX Aogonek quoteright -74 +KPX Aogonek u -50 +KPX Aogonek uacute -50 +KPX Aogonek ucircumflex -50 +KPX Aogonek udieresis -50 +KPX Aogonek ugrave -50 +KPX Aogonek uhungarumlaut -50 +KPX Aogonek umacron -50 +KPX Aogonek uogonek -50 +KPX Aogonek uring -50 +KPX Aogonek v -100 +KPX Aogonek w -90 +KPX Aogonek y -34 +KPX Aogonek yacute -34 +KPX Aogonek ydieresis -34 +KPX Aring C -55 +KPX Aring Cacute -55 +KPX Aring Ccaron -55 +KPX Aring Ccedilla -55 +KPX Aring G -55 +KPX Aring Gbreve -55 +KPX Aring Gcommaaccent -55 +KPX Aring O -45 +KPX Aring Oacute -45 +KPX Aring Ocircumflex -45 +KPX Aring Odieresis -45 +KPX Aring Ograve -45 +KPX Aring Ohungarumlaut -45 +KPX Aring Omacron -45 +KPX Aring Oslash -45 +KPX Aring Otilde -45 +KPX Aring Q -45 +KPX Aring T -95 +KPX Aring Tcaron -95 +KPX Aring Tcommaaccent -95 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -145 +KPX Aring W -130 +KPX Aring Y -100 +KPX Aring Yacute -100 +KPX Aring Ydieresis -100 +KPX Aring p -25 +KPX Aring quoteright -74 +KPX Aring u -50 +KPX Aring uacute -50 +KPX Aring ucircumflex -50 +KPX Aring udieresis -50 +KPX Aring ugrave -50 +KPX Aring uhungarumlaut -50 +KPX Aring umacron -50 +KPX Aring uogonek -50 +KPX Aring uring -50 +KPX Aring v -100 +KPX Aring w -90 +KPX Aring y -74 +KPX Aring yacute -74 +KPX Aring ydieresis -74 +KPX Atilde C -55 +KPX Atilde Cacute -55 +KPX Atilde Ccaron -55 +KPX Atilde Ccedilla -55 +KPX Atilde G -55 +KPX Atilde Gbreve -55 +KPX Atilde Gcommaaccent -55 +KPX Atilde O -45 +KPX Atilde Oacute -45 +KPX Atilde Ocircumflex -45 +KPX Atilde Odieresis -45 +KPX Atilde Ograve -45 +KPX Atilde Ohungarumlaut -45 +KPX Atilde Omacron -45 +KPX Atilde Oslash -45 +KPX Atilde Otilde -45 +KPX Atilde Q -45 +KPX Atilde T -95 +KPX Atilde Tcaron -95 +KPX Atilde Tcommaaccent -95 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -145 +KPX Atilde W -130 +KPX Atilde Y -100 +KPX Atilde Yacute -100 +KPX Atilde Ydieresis -100 +KPX Atilde p -25 +KPX Atilde quoteright -74 +KPX Atilde u -50 +KPX Atilde uacute -50 +KPX Atilde ucircumflex -50 +KPX Atilde udieresis -50 +KPX Atilde ugrave -50 +KPX Atilde uhungarumlaut -50 +KPX Atilde umacron -50 +KPX Atilde uogonek -50 +KPX Atilde uring -50 +KPX Atilde v -100 +KPX Atilde w -90 +KPX Atilde y -74 +KPX Atilde yacute -74 +KPX Atilde ydieresis -74 +KPX B A -30 +KPX B Aacute -30 +KPX B Abreve -30 +KPX B Acircumflex -30 +KPX B Adieresis -30 +KPX B Agrave -30 +KPX B Amacron -30 +KPX B Aogonek -30 +KPX B Aring -30 +KPX B Atilde -30 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -35 +KPX D Aacute -35 +KPX D Abreve -35 +KPX D Acircumflex -35 +KPX D Adieresis -35 +KPX D Agrave -35 +KPX D Amacron -35 +KPX D Aogonek -35 +KPX D Aring -35 +KPX D Atilde -35 +KPX D V -40 +KPX D W -40 +KPX D Y -40 +KPX D Yacute -40 +KPX D Ydieresis -40 +KPX D period -20 +KPX Dcaron A -35 +KPX Dcaron Aacute -35 +KPX Dcaron Abreve -35 +KPX Dcaron Acircumflex -35 +KPX Dcaron Adieresis -35 +KPX Dcaron Agrave -35 +KPX Dcaron Amacron -35 +KPX Dcaron Aogonek -35 +KPX Dcaron Aring -35 +KPX Dcaron Atilde -35 +KPX Dcaron V -40 +KPX Dcaron W -40 +KPX Dcaron Y -40 +KPX Dcaron Yacute -40 +KPX Dcaron Ydieresis -40 +KPX Dcaron period -20 +KPX Dcroat A -35 +KPX Dcroat Aacute -35 +KPX Dcroat Abreve -35 +KPX Dcroat Acircumflex -35 +KPX Dcroat Adieresis -35 +KPX Dcroat Agrave -35 +KPX Dcroat Amacron -35 +KPX Dcroat Aogonek -35 +KPX Dcroat Aring -35 +KPX Dcroat Atilde -35 +KPX Dcroat V -40 +KPX Dcroat W -40 +KPX Dcroat Y -40 +KPX Dcroat Yacute -40 +KPX Dcroat Ydieresis -40 +KPX Dcroat period -20 +KPX F A -90 +KPX F Aacute -90 +KPX F Abreve -90 +KPX F Acircumflex -90 +KPX F Adieresis -90 +KPX F Agrave -90 +KPX F Amacron -90 +KPX F Aogonek -90 +KPX F Aring -90 +KPX F Atilde -90 +KPX F a -25 +KPX F aacute -25 +KPX F abreve -25 +KPX F acircumflex -25 +KPX F adieresis -25 +KPX F agrave -25 +KPX F amacron -25 +KPX F aogonek -25 +KPX F aring -25 +KPX F atilde -25 +KPX F comma -92 +KPX F e -25 +KPX F eacute -25 +KPX F ecaron -25 +KPX F ecircumflex -25 +KPX F edieresis -25 +KPX F edotaccent -25 +KPX F egrave -25 +KPX F emacron -25 +KPX F eogonek -25 +KPX F o -25 +KPX F oacute -25 +KPX F ocircumflex -25 +KPX F odieresis -25 +KPX F ograve -25 +KPX F ohungarumlaut -25 +KPX F omacron -25 +KPX F oslash -25 +KPX F otilde -25 +KPX F period -110 +KPX J A -30 +KPX J Aacute -30 +KPX J Abreve -30 +KPX J Acircumflex -30 +KPX J Adieresis -30 +KPX J Agrave -30 +KPX J Amacron -30 +KPX J Aogonek -30 +KPX J Aring -30 +KPX J Atilde -30 +KPX J a -15 +KPX J aacute -15 +KPX J abreve -15 +KPX J acircumflex -15 +KPX J adieresis -15 +KPX J agrave -15 +KPX J amacron -15 +KPX J aogonek -15 +KPX J aring -15 +KPX J atilde -15 +KPX J e -15 +KPX J eacute -15 +KPX J ecaron -15 +KPX J ecircumflex -15 +KPX J edieresis -15 +KPX J edotaccent -15 +KPX J egrave -15 +KPX J emacron -15 +KPX J eogonek -15 +KPX J o -15 +KPX J oacute -15 +KPX J ocircumflex -15 +KPX J odieresis -15 +KPX J ograve -15 +KPX J ohungarumlaut -15 +KPX J omacron -15 +KPX J oslash -15 +KPX J otilde -15 +KPX J period -20 +KPX J u -15 +KPX J uacute -15 +KPX J ucircumflex -15 +KPX J udieresis -15 +KPX J ugrave -15 +KPX J uhungarumlaut -15 +KPX J umacron -15 +KPX J uogonek -15 +KPX J uring -15 +KPX K O -30 +KPX K Oacute -30 +KPX K Ocircumflex -30 +KPX K Odieresis -30 +KPX K Ograve -30 +KPX K Ohungarumlaut -30 +KPX K Omacron -30 +KPX K Oslash -30 +KPX K Otilde -30 +KPX K e -25 +KPX K eacute -25 +KPX K ecaron -25 +KPX K ecircumflex -25 +KPX K edieresis -25 +KPX K edotaccent -25 +KPX K egrave -25 +KPX K emacron -25 +KPX K eogonek -25 +KPX K o -25 +KPX K oacute -25 +KPX K ocircumflex -25 +KPX K odieresis -25 +KPX K ograve -25 +KPX K ohungarumlaut -25 +KPX K omacron -25 +KPX K oslash -25 +KPX K otilde -25 +KPX K u -15 +KPX K uacute -15 +KPX K ucircumflex -15 +KPX K udieresis -15 +KPX K ugrave -15 +KPX K uhungarumlaut -15 +KPX K umacron -15 +KPX K uogonek -15 +KPX K uring -15 +KPX K y -45 +KPX K yacute -45 +KPX K ydieresis -45 +KPX Kcommaaccent O -30 +KPX Kcommaaccent Oacute -30 +KPX Kcommaaccent Ocircumflex -30 +KPX Kcommaaccent Odieresis -30 +KPX Kcommaaccent Ograve -30 +KPX Kcommaaccent Ohungarumlaut -30 +KPX Kcommaaccent Omacron -30 +KPX Kcommaaccent Oslash -30 +KPX Kcommaaccent Otilde -30 +KPX Kcommaaccent e -25 +KPX Kcommaaccent eacute -25 +KPX Kcommaaccent ecaron -25 +KPX Kcommaaccent ecircumflex -25 +KPX Kcommaaccent edieresis -25 +KPX Kcommaaccent edotaccent -25 +KPX Kcommaaccent egrave -25 +KPX Kcommaaccent emacron -25 +KPX Kcommaaccent eogonek -25 +KPX Kcommaaccent o -25 +KPX Kcommaaccent oacute -25 +KPX Kcommaaccent ocircumflex -25 +KPX Kcommaaccent odieresis -25 +KPX Kcommaaccent ograve -25 +KPX Kcommaaccent ohungarumlaut -25 +KPX Kcommaaccent omacron -25 +KPX Kcommaaccent oslash -25 +KPX Kcommaaccent otilde -25 +KPX Kcommaaccent u -15 +KPX Kcommaaccent uacute -15 +KPX Kcommaaccent ucircumflex -15 +KPX Kcommaaccent udieresis -15 +KPX Kcommaaccent ugrave -15 +KPX Kcommaaccent uhungarumlaut -15 +KPX Kcommaaccent umacron -15 +KPX Kcommaaccent uogonek -15 +KPX Kcommaaccent uring -15 +KPX Kcommaaccent y -45 +KPX Kcommaaccent yacute -45 +KPX Kcommaaccent ydieresis -45 +KPX L T -92 +KPX L Tcaron -92 +KPX L Tcommaaccent -92 +KPX L V -92 +KPX L W -92 +KPX L Y -92 +KPX L Yacute -92 +KPX L Ydieresis -92 +KPX L quotedblright -20 +KPX L quoteright -110 +KPX L y -55 +KPX L yacute -55 +KPX L ydieresis -55 +KPX Lacute T -92 +KPX Lacute Tcaron -92 +KPX Lacute Tcommaaccent -92 +KPX Lacute V -92 +KPX Lacute W -92 +KPX Lacute Y -92 +KPX Lacute Yacute -92 +KPX Lacute Ydieresis -92 +KPX Lacute quotedblright -20 +KPX Lacute quoteright -110 +KPX Lacute y -55 +KPX Lacute yacute -55 +KPX Lacute ydieresis -55 +KPX Lcommaaccent T -92 +KPX Lcommaaccent Tcaron -92 +KPX Lcommaaccent Tcommaaccent -92 +KPX Lcommaaccent V -92 +KPX Lcommaaccent W -92 +KPX Lcommaaccent Y -92 +KPX Lcommaaccent Yacute -92 +KPX Lcommaaccent Ydieresis -92 +KPX Lcommaaccent quotedblright -20 +KPX Lcommaaccent quoteright -110 +KPX Lcommaaccent y -55 +KPX Lcommaaccent yacute -55 +KPX Lcommaaccent ydieresis -55 +KPX Lslash T -92 +KPX Lslash Tcaron -92 +KPX Lslash Tcommaaccent -92 +KPX Lslash V -92 +KPX Lslash W -92 +KPX Lslash Y -92 +KPX Lslash Yacute -92 +KPX Lslash Ydieresis -92 +KPX Lslash quotedblright -20 +KPX Lslash quoteright -110 +KPX Lslash y -55 +KPX Lslash yacute -55 +KPX Lslash ydieresis -55 +KPX N A -20 +KPX N Aacute -20 +KPX N Abreve -20 +KPX N Acircumflex -20 +KPX N Adieresis -20 +KPX N Agrave -20 +KPX N Amacron -20 +KPX N Aogonek -20 +KPX N Aring -20 +KPX N Atilde -20 +KPX Nacute A -20 +KPX Nacute Aacute -20 +KPX Nacute Abreve -20 +KPX Nacute Acircumflex -20 +KPX Nacute Adieresis -20 +KPX Nacute Agrave -20 +KPX Nacute Amacron -20 +KPX Nacute Aogonek -20 +KPX Nacute Aring -20 +KPX Nacute Atilde -20 +KPX Ncaron A -20 +KPX Ncaron Aacute -20 +KPX Ncaron Abreve -20 +KPX Ncaron Acircumflex -20 +KPX Ncaron Adieresis -20 +KPX Ncaron Agrave -20 +KPX Ncaron Amacron -20 +KPX Ncaron Aogonek -20 +KPX Ncaron Aring -20 +KPX Ncaron Atilde -20 +KPX Ncommaaccent A -20 +KPX Ncommaaccent Aacute -20 +KPX Ncommaaccent Abreve -20 +KPX Ncommaaccent Acircumflex -20 +KPX Ncommaaccent Adieresis -20 +KPX Ncommaaccent Agrave -20 +KPX Ncommaaccent Amacron -20 +KPX Ncommaaccent Aogonek -20 +KPX Ncommaaccent Aring -20 +KPX Ncommaaccent Atilde -20 +KPX Ntilde A -20 +KPX Ntilde Aacute -20 +KPX Ntilde Abreve -20 +KPX Ntilde Acircumflex -20 +KPX Ntilde Adieresis -20 +KPX Ntilde Agrave -20 +KPX Ntilde Amacron -20 +KPX Ntilde Aogonek -20 +KPX Ntilde Aring -20 +KPX Ntilde Atilde -20 +KPX O A -40 +KPX O Aacute -40 +KPX O Abreve -40 +KPX O Acircumflex -40 +KPX O Adieresis -40 +KPX O Agrave -40 +KPX O Amacron -40 +KPX O Aogonek -40 +KPX O Aring -40 +KPX O Atilde -40 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -50 +KPX O X -40 +KPX O Y -50 +KPX O Yacute -50 +KPX O Ydieresis -50 +KPX Oacute A -40 +KPX Oacute Aacute -40 +KPX Oacute Abreve -40 +KPX Oacute Acircumflex -40 +KPX Oacute Adieresis -40 +KPX Oacute Agrave -40 +KPX Oacute Amacron -40 +KPX Oacute Aogonek -40 +KPX Oacute Aring -40 +KPX Oacute Atilde -40 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -50 +KPX Oacute X -40 +KPX Oacute Y -50 +KPX Oacute Yacute -50 +KPX Oacute Ydieresis -50 +KPX Ocircumflex A -40 +KPX Ocircumflex Aacute -40 +KPX Ocircumflex Abreve -40 +KPX Ocircumflex Acircumflex -40 +KPX Ocircumflex Adieresis -40 +KPX Ocircumflex Agrave -40 +KPX Ocircumflex Amacron -40 +KPX Ocircumflex Aogonek -40 +KPX Ocircumflex Aring -40 +KPX Ocircumflex Atilde -40 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -50 +KPX Ocircumflex X -40 +KPX Ocircumflex Y -50 +KPX Ocircumflex Yacute -50 +KPX Ocircumflex Ydieresis -50 +KPX Odieresis A -40 +KPX Odieresis Aacute -40 +KPX Odieresis Abreve -40 +KPX Odieresis Acircumflex -40 +KPX Odieresis Adieresis -40 +KPX Odieresis Agrave -40 +KPX Odieresis Amacron -40 +KPX Odieresis Aogonek -40 +KPX Odieresis Aring -40 +KPX Odieresis Atilde -40 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -50 +KPX Odieresis X -40 +KPX Odieresis Y -50 +KPX Odieresis Yacute -50 +KPX Odieresis Ydieresis -50 +KPX Ograve A -40 +KPX Ograve Aacute -40 +KPX Ograve Abreve -40 +KPX Ograve Acircumflex -40 +KPX Ograve Adieresis -40 +KPX Ograve Agrave -40 +KPX Ograve Amacron -40 +KPX Ograve Aogonek -40 +KPX Ograve Aring -40 +KPX Ograve Atilde -40 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -50 +KPX Ograve X -40 +KPX Ograve Y -50 +KPX Ograve Yacute -50 +KPX Ograve Ydieresis -50 +KPX Ohungarumlaut A -40 +KPX Ohungarumlaut Aacute -40 +KPX Ohungarumlaut Abreve -40 +KPX Ohungarumlaut Acircumflex -40 +KPX Ohungarumlaut Adieresis -40 +KPX Ohungarumlaut Agrave -40 +KPX Ohungarumlaut Amacron -40 +KPX Ohungarumlaut Aogonek -40 +KPX Ohungarumlaut Aring -40 +KPX Ohungarumlaut Atilde -40 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -50 +KPX Ohungarumlaut X -40 +KPX Ohungarumlaut Y -50 +KPX Ohungarumlaut Yacute -50 +KPX Ohungarumlaut Ydieresis -50 +KPX Omacron A -40 +KPX Omacron Aacute -40 +KPX Omacron Abreve -40 +KPX Omacron Acircumflex -40 +KPX Omacron Adieresis -40 +KPX Omacron Agrave -40 +KPX Omacron Amacron -40 +KPX Omacron Aogonek -40 +KPX Omacron Aring -40 +KPX Omacron Atilde -40 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -50 +KPX Omacron X -40 +KPX Omacron Y -50 +KPX Omacron Yacute -50 +KPX Omacron Ydieresis -50 +KPX Oslash A -40 +KPX Oslash Aacute -40 +KPX Oslash Abreve -40 +KPX Oslash Acircumflex -40 +KPX Oslash Adieresis -40 +KPX Oslash Agrave -40 +KPX Oslash Amacron -40 +KPX Oslash Aogonek -40 +KPX Oslash Aring -40 +KPX Oslash Atilde -40 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -50 +KPX Oslash X -40 +KPX Oslash Y -50 +KPX Oslash Yacute -50 +KPX Oslash Ydieresis -50 +KPX Otilde A -40 +KPX Otilde Aacute -40 +KPX Otilde Abreve -40 +KPX Otilde Acircumflex -40 +KPX Otilde Adieresis -40 +KPX Otilde Agrave -40 +KPX Otilde Amacron -40 +KPX Otilde Aogonek -40 +KPX Otilde Aring -40 +KPX Otilde Atilde -40 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -50 +KPX Otilde X -40 +KPX Otilde Y -50 +KPX Otilde Yacute -50 +KPX Otilde Ydieresis -50 +KPX P A -74 +KPX P Aacute -74 +KPX P Abreve -74 +KPX P Acircumflex -74 +KPX P Adieresis -74 +KPX P Agrave -74 +KPX P Amacron -74 +KPX P Aogonek -74 +KPX P Aring -74 +KPX P Atilde -74 +KPX P a -10 +KPX P aacute -10 +KPX P abreve -10 +KPX P acircumflex -10 +KPX P adieresis -10 +KPX P agrave -10 +KPX P amacron -10 +KPX P aogonek -10 +KPX P aring -10 +KPX P atilde -10 +KPX P comma -92 +KPX P e -20 +KPX P eacute -20 +KPX P ecaron -20 +KPX P ecircumflex -20 +KPX P edieresis -20 +KPX P edotaccent -20 +KPX P egrave -20 +KPX P emacron -20 +KPX P eogonek -20 +KPX P o -20 +KPX P oacute -20 +KPX P ocircumflex -20 +KPX P odieresis -20 +KPX P ograve -20 +KPX P ohungarumlaut -20 +KPX P omacron -20 +KPX P oslash -20 +KPX P otilde -20 +KPX P period -110 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX Q period -20 +KPX R O -30 +KPX R Oacute -30 +KPX R Ocircumflex -30 +KPX R Odieresis -30 +KPX R Ograve -30 +KPX R Ohungarumlaut -30 +KPX R Omacron -30 +KPX R Oslash -30 +KPX R Otilde -30 +KPX R T -40 +KPX R Tcaron -40 +KPX R Tcommaaccent -40 +KPX R U -30 +KPX R Uacute -30 +KPX R Ucircumflex -30 +KPX R Udieresis -30 +KPX R Ugrave -30 +KPX R Uhungarumlaut -30 +KPX R Umacron -30 +KPX R Uogonek -30 +KPX R Uring -30 +KPX R V -55 +KPX R W -35 +KPX R Y -35 +KPX R Yacute -35 +KPX R Ydieresis -35 +KPX Racute O -30 +KPX Racute Oacute -30 +KPX Racute Ocircumflex -30 +KPX Racute Odieresis -30 +KPX Racute Ograve -30 +KPX Racute Ohungarumlaut -30 +KPX Racute Omacron -30 +KPX Racute Oslash -30 +KPX Racute Otilde -30 +KPX Racute T -40 +KPX Racute Tcaron -40 +KPX Racute Tcommaaccent -40 +KPX Racute U -30 +KPX Racute Uacute -30 +KPX Racute Ucircumflex -30 +KPX Racute Udieresis -30 +KPX Racute Ugrave -30 +KPX Racute Uhungarumlaut -30 +KPX Racute Umacron -30 +KPX Racute Uogonek -30 +KPX Racute Uring -30 +KPX Racute V -55 +KPX Racute W -35 +KPX Racute Y -35 +KPX Racute Yacute -35 +KPX Racute Ydieresis -35 +KPX Rcaron O -30 +KPX Rcaron Oacute -30 +KPX Rcaron Ocircumflex -30 +KPX Rcaron Odieresis -30 +KPX Rcaron Ograve -30 +KPX Rcaron Ohungarumlaut -30 +KPX Rcaron Omacron -30 +KPX Rcaron Oslash -30 +KPX Rcaron Otilde -30 +KPX Rcaron T -40 +KPX Rcaron Tcaron -40 +KPX Rcaron Tcommaaccent -40 +KPX Rcaron U -30 +KPX Rcaron Uacute -30 +KPX Rcaron Ucircumflex -30 +KPX Rcaron Udieresis -30 +KPX Rcaron Ugrave -30 +KPX Rcaron Uhungarumlaut -30 +KPX Rcaron Umacron -30 +KPX Rcaron Uogonek -30 +KPX Rcaron Uring -30 +KPX Rcaron V -55 +KPX Rcaron W -35 +KPX Rcaron Y -35 +KPX Rcaron Yacute -35 +KPX Rcaron Ydieresis -35 +KPX Rcommaaccent O -30 +KPX Rcommaaccent Oacute -30 +KPX Rcommaaccent Ocircumflex -30 +KPX Rcommaaccent Odieresis -30 +KPX Rcommaaccent Ograve -30 +KPX Rcommaaccent Ohungarumlaut -30 +KPX Rcommaaccent Omacron -30 +KPX Rcommaaccent Oslash -30 +KPX Rcommaaccent Otilde -30 +KPX Rcommaaccent T -40 +KPX Rcommaaccent Tcaron -40 +KPX Rcommaaccent Tcommaaccent -40 +KPX Rcommaaccent U -30 +KPX Rcommaaccent Uacute -30 +KPX Rcommaaccent Ucircumflex -30 +KPX Rcommaaccent Udieresis -30 +KPX Rcommaaccent Ugrave -30 +KPX Rcommaaccent Uhungarumlaut -30 +KPX Rcommaaccent Umacron -30 +KPX Rcommaaccent Uogonek -30 +KPX Rcommaaccent Uring -30 +KPX Rcommaaccent V -55 +KPX Rcommaaccent W -35 +KPX Rcommaaccent Y -35 +KPX Rcommaaccent Yacute -35 +KPX Rcommaaccent Ydieresis -35 +KPX T A -90 +KPX T Aacute -90 +KPX T Abreve -90 +KPX T Acircumflex -90 +KPX T Adieresis -90 +KPX T Agrave -90 +KPX T Amacron -90 +KPX T Aogonek -90 +KPX T Aring -90 +KPX T Atilde -90 +KPX T O -18 +KPX T Oacute -18 +KPX T Ocircumflex -18 +KPX T Odieresis -18 +KPX T Ograve -18 +KPX T Ohungarumlaut -18 +KPX T Omacron -18 +KPX T Oslash -18 +KPX T Otilde -18 +KPX T a -92 +KPX T aacute -92 +KPX T abreve -52 +KPX T acircumflex -52 +KPX T adieresis -52 +KPX T agrave -52 +KPX T amacron -52 +KPX T aogonek -92 +KPX T aring -92 +KPX T atilde -52 +KPX T colon -74 +KPX T comma -74 +KPX T e -92 +KPX T eacute -92 +KPX T ecaron -92 +KPX T ecircumflex -92 +KPX T edieresis -52 +KPX T edotaccent -92 +KPX T egrave -52 +KPX T emacron -52 +KPX T eogonek -92 +KPX T hyphen -92 +KPX T i -18 +KPX T iacute -18 +KPX T iogonek -18 +KPX T o -92 +KPX T oacute -92 +KPX T ocircumflex -92 +KPX T odieresis -92 +KPX T ograve -92 +KPX T ohungarumlaut -92 +KPX T omacron -92 +KPX T oslash -92 +KPX T otilde -92 +KPX T period -90 +KPX T r -74 +KPX T racute -74 +KPX T rcaron -74 +KPX T rcommaaccent -74 +KPX T semicolon -74 +KPX T u -92 +KPX T uacute -92 +KPX T ucircumflex -92 +KPX T udieresis -92 +KPX T ugrave -92 +KPX T uhungarumlaut -92 +KPX T umacron -92 +KPX T uogonek -92 +KPX T uring -92 +KPX T w -74 +KPX T y -34 +KPX T yacute -34 +KPX T ydieresis -34 +KPX Tcaron A -90 +KPX Tcaron Aacute -90 +KPX Tcaron Abreve -90 +KPX Tcaron Acircumflex -90 +KPX Tcaron Adieresis -90 +KPX Tcaron Agrave -90 +KPX Tcaron Amacron -90 +KPX Tcaron Aogonek -90 +KPX Tcaron Aring -90 +KPX Tcaron Atilde -90 +KPX Tcaron O -18 +KPX Tcaron Oacute -18 +KPX Tcaron Ocircumflex -18 +KPX Tcaron Odieresis -18 +KPX Tcaron Ograve -18 +KPX Tcaron Ohungarumlaut -18 +KPX Tcaron Omacron -18 +KPX Tcaron Oslash -18 +KPX Tcaron Otilde -18 +KPX Tcaron a -92 +KPX Tcaron aacute -92 +KPX Tcaron abreve -52 +KPX Tcaron acircumflex -52 +KPX Tcaron adieresis -52 +KPX Tcaron agrave -52 +KPX Tcaron amacron -52 +KPX Tcaron aogonek -92 +KPX Tcaron aring -92 +KPX Tcaron atilde -52 +KPX Tcaron colon -74 +KPX Tcaron comma -74 +KPX Tcaron e -92 +KPX Tcaron eacute -92 +KPX Tcaron ecaron -92 +KPX Tcaron ecircumflex -92 +KPX Tcaron edieresis -52 +KPX Tcaron edotaccent -92 +KPX Tcaron egrave -52 +KPX Tcaron emacron -52 +KPX Tcaron eogonek -92 +KPX Tcaron hyphen -92 +KPX Tcaron i -18 +KPX Tcaron iacute -18 +KPX Tcaron iogonek -18 +KPX Tcaron o -92 +KPX Tcaron oacute -92 +KPX Tcaron ocircumflex -92 +KPX Tcaron odieresis -92 +KPX Tcaron ograve -92 +KPX Tcaron ohungarumlaut -92 +KPX Tcaron omacron -92 +KPX Tcaron oslash -92 +KPX Tcaron otilde -92 +KPX Tcaron period -90 +KPX Tcaron r -74 +KPX Tcaron racute -74 +KPX Tcaron rcaron -74 +KPX Tcaron rcommaaccent -74 +KPX Tcaron semicolon -74 +KPX Tcaron u -92 +KPX Tcaron uacute -92 +KPX Tcaron ucircumflex -92 +KPX Tcaron udieresis -92 +KPX Tcaron ugrave -92 +KPX Tcaron uhungarumlaut -92 +KPX Tcaron umacron -92 +KPX Tcaron uogonek -92 +KPX Tcaron uring -92 +KPX Tcaron w -74 +KPX Tcaron y -34 +KPX Tcaron yacute -34 +KPX Tcaron ydieresis -34 +KPX Tcommaaccent A -90 +KPX Tcommaaccent Aacute -90 +KPX Tcommaaccent Abreve -90 +KPX Tcommaaccent Acircumflex -90 +KPX Tcommaaccent Adieresis -90 +KPX Tcommaaccent Agrave -90 +KPX Tcommaaccent Amacron -90 +KPX Tcommaaccent Aogonek -90 +KPX Tcommaaccent Aring -90 +KPX Tcommaaccent Atilde -90 +KPX Tcommaaccent O -18 +KPX Tcommaaccent Oacute -18 +KPX Tcommaaccent Ocircumflex -18 +KPX Tcommaaccent Odieresis -18 +KPX Tcommaaccent Ograve -18 +KPX Tcommaaccent Ohungarumlaut -18 +KPX Tcommaaccent Omacron -18 +KPX Tcommaaccent Oslash -18 +KPX Tcommaaccent Otilde -18 +KPX Tcommaaccent a -92 +KPX Tcommaaccent aacute -92 +KPX Tcommaaccent abreve -52 +KPX Tcommaaccent acircumflex -52 +KPX Tcommaaccent adieresis -52 +KPX Tcommaaccent agrave -52 +KPX Tcommaaccent amacron -52 +KPX Tcommaaccent aogonek -92 +KPX Tcommaaccent aring -92 +KPX Tcommaaccent atilde -52 +KPX Tcommaaccent colon -74 +KPX Tcommaaccent comma -74 +KPX Tcommaaccent e -92 +KPX Tcommaaccent eacute -92 +KPX Tcommaaccent ecaron -92 +KPX Tcommaaccent ecircumflex -92 +KPX Tcommaaccent edieresis -52 +KPX Tcommaaccent edotaccent -92 +KPX Tcommaaccent egrave -52 +KPX Tcommaaccent emacron -52 +KPX Tcommaaccent eogonek -92 +KPX Tcommaaccent hyphen -92 +KPX Tcommaaccent i -18 +KPX Tcommaaccent iacute -18 +KPX Tcommaaccent iogonek -18 +KPX Tcommaaccent o -92 +KPX Tcommaaccent oacute -92 +KPX Tcommaaccent ocircumflex -92 +KPX Tcommaaccent odieresis -92 +KPX Tcommaaccent ograve -92 +KPX Tcommaaccent ohungarumlaut -92 +KPX Tcommaaccent omacron -92 +KPX Tcommaaccent oslash -92 +KPX Tcommaaccent otilde -92 +KPX Tcommaaccent period -90 +KPX Tcommaaccent r -74 +KPX Tcommaaccent racute -74 +KPX Tcommaaccent rcaron -74 +KPX Tcommaaccent rcommaaccent -74 +KPX Tcommaaccent semicolon -74 +KPX Tcommaaccent u -92 +KPX Tcommaaccent uacute -92 +KPX Tcommaaccent ucircumflex -92 +KPX Tcommaaccent udieresis -92 +KPX Tcommaaccent ugrave -92 +KPX Tcommaaccent uhungarumlaut -92 +KPX Tcommaaccent umacron -92 +KPX Tcommaaccent uogonek -92 +KPX Tcommaaccent uring -92 +KPX Tcommaaccent w -74 +KPX Tcommaaccent y -34 +KPX Tcommaaccent yacute -34 +KPX Tcommaaccent ydieresis -34 +KPX U A -60 +KPX U Aacute -60 +KPX U Abreve -60 +KPX U Acircumflex -60 +KPX U Adieresis -60 +KPX U Agrave -60 +KPX U Amacron -60 +KPX U Aogonek -60 +KPX U Aring -60 +KPX U Atilde -60 +KPX U comma -50 +KPX U period -50 +KPX Uacute A -60 +KPX Uacute Aacute -60 +KPX Uacute Abreve -60 +KPX Uacute Acircumflex -60 +KPX Uacute Adieresis -60 +KPX Uacute Agrave -60 +KPX Uacute Amacron -60 +KPX Uacute Aogonek -60 +KPX Uacute Aring -60 +KPX Uacute Atilde -60 +KPX Uacute comma -50 +KPX Uacute period -50 +KPX Ucircumflex A -60 +KPX Ucircumflex Aacute -60 +KPX Ucircumflex Abreve -60 +KPX Ucircumflex Acircumflex -60 +KPX Ucircumflex Adieresis -60 +KPX Ucircumflex Agrave -60 +KPX Ucircumflex Amacron -60 +KPX Ucircumflex Aogonek -60 +KPX Ucircumflex Aring -60 +KPX Ucircumflex Atilde -60 +KPX Ucircumflex comma -50 +KPX Ucircumflex period -50 +KPX Udieresis A -60 +KPX Udieresis Aacute -60 +KPX Udieresis Abreve -60 +KPX Udieresis Acircumflex -60 +KPX Udieresis Adieresis -60 +KPX Udieresis Agrave -60 +KPX Udieresis Amacron -60 +KPX Udieresis Aogonek -60 +KPX Udieresis Aring -60 +KPX Udieresis Atilde -60 +KPX Udieresis comma -50 +KPX Udieresis period -50 +KPX Ugrave A -60 +KPX Ugrave Aacute -60 +KPX Ugrave Abreve -60 +KPX Ugrave Acircumflex -60 +KPX Ugrave Adieresis -60 +KPX Ugrave Agrave -60 +KPX Ugrave Amacron -60 +KPX Ugrave Aogonek -60 +KPX Ugrave Aring -60 +KPX Ugrave Atilde -60 +KPX Ugrave comma -50 +KPX Ugrave period -50 +KPX Uhungarumlaut A -60 +KPX Uhungarumlaut Aacute -60 +KPX Uhungarumlaut Abreve -60 +KPX Uhungarumlaut Acircumflex -60 +KPX Uhungarumlaut Adieresis -60 +KPX Uhungarumlaut Agrave -60 +KPX Uhungarumlaut Amacron -60 +KPX Uhungarumlaut Aogonek -60 +KPX Uhungarumlaut Aring -60 +KPX Uhungarumlaut Atilde -60 +KPX Uhungarumlaut comma -50 +KPX Uhungarumlaut period -50 +KPX Umacron A -60 +KPX Umacron Aacute -60 +KPX Umacron Abreve -60 +KPX Umacron Acircumflex -60 +KPX Umacron Adieresis -60 +KPX Umacron Agrave -60 +KPX Umacron Amacron -60 +KPX Umacron Aogonek -60 +KPX Umacron Aring -60 +KPX Umacron Atilde -60 +KPX Umacron comma -50 +KPX Umacron period -50 +KPX Uogonek A -60 +KPX Uogonek Aacute -60 +KPX Uogonek Abreve -60 +KPX Uogonek Acircumflex -60 +KPX Uogonek Adieresis -60 +KPX Uogonek Agrave -60 +KPX Uogonek Amacron -60 +KPX Uogonek Aogonek -60 +KPX Uogonek Aring -60 +KPX Uogonek Atilde -60 +KPX Uogonek comma -50 +KPX Uogonek period -50 +KPX Uring A -60 +KPX Uring Aacute -60 +KPX Uring Abreve -60 +KPX Uring Acircumflex -60 +KPX Uring Adieresis -60 +KPX Uring Agrave -60 +KPX Uring Amacron -60 +KPX Uring Aogonek -60 +KPX Uring Aring -60 +KPX Uring Atilde -60 +KPX Uring comma -50 +KPX Uring period -50 +KPX V A -135 +KPX V Aacute -135 +KPX V Abreve -135 +KPX V Acircumflex -135 +KPX V Adieresis -135 +KPX V Agrave -135 +KPX V Amacron -135 +KPX V Aogonek -135 +KPX V Aring -135 +KPX V Atilde -135 +KPX V G -30 +KPX V Gbreve -30 +KPX V Gcommaaccent -30 +KPX V O -45 +KPX V Oacute -45 +KPX V Ocircumflex -45 +KPX V Odieresis -45 +KPX V Ograve -45 +KPX V Ohungarumlaut -45 +KPX V Omacron -45 +KPX V Oslash -45 +KPX V Otilde -45 +KPX V a -92 +KPX V aacute -92 +KPX V abreve -92 +KPX V acircumflex -92 +KPX V adieresis -92 +KPX V agrave -92 +KPX V amacron -92 +KPX V aogonek -92 +KPX V aring -92 +KPX V atilde -92 +KPX V colon -92 +KPX V comma -129 +KPX V e -100 +KPX V eacute -100 +KPX V ecaron -100 +KPX V ecircumflex -100 +KPX V edieresis -100 +KPX V edotaccent -100 +KPX V egrave -100 +KPX V emacron -100 +KPX V eogonek -100 +KPX V hyphen -74 +KPX V i -37 +KPX V iacute -37 +KPX V icircumflex -37 +KPX V idieresis -37 +KPX V igrave -37 +KPX V imacron -37 +KPX V iogonek -37 +KPX V o -100 +KPX V oacute -100 +KPX V ocircumflex -100 +KPX V odieresis -100 +KPX V ograve -100 +KPX V ohungarumlaut -100 +KPX V omacron -100 +KPX V oslash -100 +KPX V otilde -100 +KPX V period -145 +KPX V semicolon -92 +KPX V u -92 +KPX V uacute -92 +KPX V ucircumflex -92 +KPX V udieresis -92 +KPX V ugrave -92 +KPX V uhungarumlaut -92 +KPX V umacron -92 +KPX V uogonek -92 +KPX V uring -92 +KPX W A -120 +KPX W Aacute -120 +KPX W Abreve -120 +KPX W Acircumflex -120 +KPX W Adieresis -120 +KPX W Agrave -120 +KPX W Amacron -120 +KPX W Aogonek -120 +KPX W Aring -120 +KPX W Atilde -120 +KPX W O -10 +KPX W Oacute -10 +KPX W Ocircumflex -10 +KPX W Odieresis -10 +KPX W Ograve -10 +KPX W Ohungarumlaut -10 +KPX W Omacron -10 +KPX W Oslash -10 +KPX W Otilde -10 +KPX W a -65 +KPX W aacute -65 +KPX W abreve -65 +KPX W acircumflex -65 +KPX W adieresis -65 +KPX W agrave -65 +KPX W amacron -65 +KPX W aogonek -65 +KPX W aring -65 +KPX W atilde -65 +KPX W colon -55 +KPX W comma -92 +KPX W e -65 +KPX W eacute -65 +KPX W ecaron -65 +KPX W ecircumflex -65 +KPX W edieresis -65 +KPX W edotaccent -65 +KPX W egrave -65 +KPX W emacron -65 +KPX W eogonek -65 +KPX W hyphen -37 +KPX W i -18 +KPX W iacute -18 +KPX W iogonek -18 +KPX W o -75 +KPX W oacute -75 +KPX W ocircumflex -75 +KPX W odieresis -75 +KPX W ograve -75 +KPX W ohungarumlaut -75 +KPX W omacron -75 +KPX W oslash -75 +KPX W otilde -75 +KPX W period -92 +KPX W semicolon -55 +KPX W u -50 +KPX W uacute -50 +KPX W ucircumflex -50 +KPX W udieresis -50 +KPX W ugrave -50 +KPX W uhungarumlaut -50 +KPX W umacron -50 +KPX W uogonek -50 +KPX W uring -50 +KPX W y -60 +KPX W yacute -60 +KPX W ydieresis -60 +KPX Y A -110 +KPX Y Aacute -110 +KPX Y Abreve -110 +KPX Y Acircumflex -110 +KPX Y Adieresis -110 +KPX Y Agrave -110 +KPX Y Amacron -110 +KPX Y Aogonek -110 +KPX Y Aring -110 +KPX Y Atilde -110 +KPX Y O -35 +KPX Y Oacute -35 +KPX Y Ocircumflex -35 +KPX Y Odieresis -35 +KPX Y Ograve -35 +KPX Y Ohungarumlaut -35 +KPX Y Omacron -35 +KPX Y Oslash -35 +KPX Y Otilde -35 +KPX Y a -85 +KPX Y aacute -85 +KPX Y abreve -85 +KPX Y acircumflex -85 +KPX Y adieresis -85 +KPX Y agrave -85 +KPX Y amacron -85 +KPX Y aogonek -85 +KPX Y aring -85 +KPX Y atilde -85 +KPX Y colon -92 +KPX Y comma -92 +KPX Y e -111 +KPX Y eacute -111 +KPX Y ecaron -111 +KPX Y ecircumflex -111 +KPX Y edieresis -71 +KPX Y edotaccent -111 +KPX Y egrave -71 +KPX Y emacron -71 +KPX Y eogonek -111 +KPX Y hyphen -92 +KPX Y i -37 +KPX Y iacute -37 +KPX Y iogonek -37 +KPX Y o -111 +KPX Y oacute -111 +KPX Y ocircumflex -111 +KPX Y odieresis -111 +KPX Y ograve -111 +KPX Y ohungarumlaut -111 +KPX Y omacron -111 +KPX Y oslash -111 +KPX Y otilde -111 +KPX Y period -92 +KPX Y semicolon -92 +KPX Y u -92 +KPX Y uacute -92 +KPX Y ucircumflex -92 +KPX Y udieresis -92 +KPX Y ugrave -92 +KPX Y uhungarumlaut -92 +KPX Y umacron -92 +KPX Y uogonek -92 +KPX Y uring -92 +KPX Yacute A -110 +KPX Yacute Aacute -110 +KPX Yacute Abreve -110 +KPX Yacute Acircumflex -110 +KPX Yacute Adieresis -110 +KPX Yacute Agrave -110 +KPX Yacute Amacron -110 +KPX Yacute Aogonek -110 +KPX Yacute Aring -110 +KPX Yacute Atilde -110 +KPX Yacute O -35 +KPX Yacute Oacute -35 +KPX Yacute Ocircumflex -35 +KPX Yacute Odieresis -35 +KPX Yacute Ograve -35 +KPX Yacute Ohungarumlaut -35 +KPX Yacute Omacron -35 +KPX Yacute Oslash -35 +KPX Yacute Otilde -35 +KPX Yacute a -85 +KPX Yacute aacute -85 +KPX Yacute abreve -85 +KPX Yacute acircumflex -85 +KPX Yacute adieresis -85 +KPX Yacute agrave -85 +KPX Yacute amacron -85 +KPX Yacute aogonek -85 +KPX Yacute aring -85 +KPX Yacute atilde -85 +KPX Yacute colon -92 +KPX Yacute comma -92 +KPX Yacute e -111 +KPX Yacute eacute -111 +KPX Yacute ecaron -111 +KPX Yacute ecircumflex -111 +KPX Yacute edieresis -71 +KPX Yacute edotaccent -111 +KPX Yacute egrave -71 +KPX Yacute emacron -71 +KPX Yacute eogonek -111 +KPX Yacute hyphen -92 +KPX Yacute i -37 +KPX Yacute iacute -37 +KPX Yacute iogonek -37 +KPX Yacute o -111 +KPX Yacute oacute -111 +KPX Yacute ocircumflex -111 +KPX Yacute odieresis -111 +KPX Yacute ograve -111 +KPX Yacute ohungarumlaut -111 +KPX Yacute omacron -111 +KPX Yacute oslash -111 +KPX Yacute otilde -111 +KPX Yacute period -92 +KPX Yacute semicolon -92 +KPX Yacute u -92 +KPX Yacute uacute -92 +KPX Yacute ucircumflex -92 +KPX Yacute udieresis -92 +KPX Yacute ugrave -92 +KPX Yacute uhungarumlaut -92 +KPX Yacute umacron -92 +KPX Yacute uogonek -92 +KPX Yacute uring -92 +KPX Ydieresis A -110 +KPX Ydieresis Aacute -110 +KPX Ydieresis Abreve -110 +KPX Ydieresis Acircumflex -110 +KPX Ydieresis Adieresis -110 +KPX Ydieresis Agrave -110 +KPX Ydieresis Amacron -110 +KPX Ydieresis Aogonek -110 +KPX Ydieresis Aring -110 +KPX Ydieresis Atilde -110 +KPX Ydieresis O -35 +KPX Ydieresis Oacute -35 +KPX Ydieresis Ocircumflex -35 +KPX Ydieresis Odieresis -35 +KPX Ydieresis Ograve -35 +KPX Ydieresis Ohungarumlaut -35 +KPX Ydieresis Omacron -35 +KPX Ydieresis Oslash -35 +KPX Ydieresis Otilde -35 +KPX Ydieresis a -85 +KPX Ydieresis aacute -85 +KPX Ydieresis abreve -85 +KPX Ydieresis acircumflex -85 +KPX Ydieresis adieresis -85 +KPX Ydieresis agrave -85 +KPX Ydieresis amacron -85 +KPX Ydieresis aogonek -85 +KPX Ydieresis aring -85 +KPX Ydieresis atilde -85 +KPX Ydieresis colon -92 +KPX Ydieresis comma -92 +KPX Ydieresis e -111 +KPX Ydieresis eacute -111 +KPX Ydieresis ecaron -111 +KPX Ydieresis ecircumflex -111 +KPX Ydieresis edieresis -71 +KPX Ydieresis edotaccent -111 +KPX Ydieresis egrave -71 +KPX Ydieresis emacron -71 +KPX Ydieresis eogonek -111 +KPX Ydieresis hyphen -92 +KPX Ydieresis i -37 +KPX Ydieresis iacute -37 +KPX Ydieresis iogonek -37 +KPX Ydieresis o -111 +KPX Ydieresis oacute -111 +KPX Ydieresis ocircumflex -111 +KPX Ydieresis odieresis -111 +KPX Ydieresis ograve -111 +KPX Ydieresis ohungarumlaut -111 +KPX Ydieresis omacron -111 +KPX Ydieresis oslash -111 +KPX Ydieresis otilde -111 +KPX Ydieresis period -92 +KPX Ydieresis semicolon -92 +KPX Ydieresis u -92 +KPX Ydieresis uacute -92 +KPX Ydieresis ucircumflex -92 +KPX Ydieresis udieresis -92 +KPX Ydieresis ugrave -92 +KPX Ydieresis uhungarumlaut -92 +KPX Ydieresis umacron -92 +KPX Ydieresis uogonek -92 +KPX Ydieresis uring -92 +KPX a v -25 +KPX aacute v -25 +KPX abreve v -25 +KPX acircumflex v -25 +KPX adieresis v -25 +KPX agrave v -25 +KPX amacron v -25 +KPX aogonek v -25 +KPX aring v -25 +KPX atilde v -25 +KPX b b -10 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -15 +KPX comma quotedblright -45 +KPX comma quoteright -55 +KPX d w -15 +KPX dcroat w -15 +KPX e v -15 +KPX eacute v -15 +KPX ecaron v -15 +KPX ecircumflex v -15 +KPX edieresis v -15 +KPX edotaccent v -15 +KPX egrave v -15 +KPX emacron v -15 +KPX eogonek v -15 +KPX f comma -15 +KPX f dotlessi -35 +KPX f i -25 +KPX f o -25 +KPX f oacute -25 +KPX f ocircumflex -25 +KPX f odieresis -25 +KPX f ograve -25 +KPX f ohungarumlaut -25 +KPX f omacron -25 +KPX f oslash -25 +KPX f otilde -25 +KPX f period -15 +KPX f quotedblright 50 +KPX f quoteright 55 +KPX g period -15 +KPX gbreve period -15 +KPX gcommaaccent period -15 +KPX h y -15 +KPX h yacute -15 +KPX h ydieresis -15 +KPX i v -10 +KPX iacute v -10 +KPX icircumflex v -10 +KPX idieresis v -10 +KPX igrave v -10 +KPX imacron v -10 +KPX iogonek v -10 +KPX k e -10 +KPX k eacute -10 +KPX k ecaron -10 +KPX k ecircumflex -10 +KPX k edieresis -10 +KPX k edotaccent -10 +KPX k egrave -10 +KPX k emacron -10 +KPX k eogonek -10 +KPX k o -15 +KPX k oacute -15 +KPX k ocircumflex -15 +KPX k odieresis -15 +KPX k ograve -15 +KPX k ohungarumlaut -15 +KPX k omacron -15 +KPX k oslash -15 +KPX k otilde -15 +KPX k y -15 +KPX k yacute -15 +KPX k ydieresis -15 +KPX kcommaaccent e -10 +KPX kcommaaccent eacute -10 +KPX kcommaaccent ecaron -10 +KPX kcommaaccent ecircumflex -10 +KPX kcommaaccent edieresis -10 +KPX kcommaaccent edotaccent -10 +KPX kcommaaccent egrave -10 +KPX kcommaaccent emacron -10 +KPX kcommaaccent eogonek -10 +KPX kcommaaccent o -15 +KPX kcommaaccent oacute -15 +KPX kcommaaccent ocircumflex -15 +KPX kcommaaccent odieresis -15 +KPX kcommaaccent ograve -15 +KPX kcommaaccent ohungarumlaut -15 +KPX kcommaaccent omacron -15 +KPX kcommaaccent oslash -15 +KPX kcommaaccent otilde -15 +KPX kcommaaccent y -15 +KPX kcommaaccent yacute -15 +KPX kcommaaccent ydieresis -15 +KPX n v -40 +KPX nacute v -40 +KPX ncaron v -40 +KPX ncommaaccent v -40 +KPX ntilde v -40 +KPX o v -10 +KPX o w -10 +KPX oacute v -10 +KPX oacute w -10 +KPX ocircumflex v -10 +KPX ocircumflex w -10 +KPX odieresis v -10 +KPX odieresis w -10 +KPX ograve v -10 +KPX ograve w -10 +KPX ohungarumlaut v -10 +KPX ohungarumlaut w -10 +KPX omacron v -10 +KPX omacron w -10 +KPX oslash v -10 +KPX oslash w -10 +KPX otilde v -10 +KPX otilde w -10 +KPX period quotedblright -55 +KPX period quoteright -55 +KPX quotedblleft A -10 +KPX quotedblleft Aacute -10 +KPX quotedblleft Abreve -10 +KPX quotedblleft Acircumflex -10 +KPX quotedblleft Adieresis -10 +KPX quotedblleft Agrave -10 +KPX quotedblleft Amacron -10 +KPX quotedblleft Aogonek -10 +KPX quotedblleft Aring -10 +KPX quotedblleft Atilde -10 +KPX quoteleft A -10 +KPX quoteleft Aacute -10 +KPX quoteleft Abreve -10 +KPX quoteleft Acircumflex -10 +KPX quoteleft Adieresis -10 +KPX quoteleft Agrave -10 +KPX quoteleft Amacron -10 +KPX quoteleft Aogonek -10 +KPX quoteleft Aring -10 +KPX quoteleft Atilde -10 +KPX quoteleft quoteleft -63 +KPX quoteright d -20 +KPX quoteright dcroat -20 +KPX quoteright quoteright -63 +KPX quoteright r -20 +KPX quoteright racute -20 +KPX quoteright rcaron -20 +KPX quoteright rcommaaccent -20 +KPX quoteright s -37 +KPX quoteright sacute -37 +KPX quoteright scaron -37 +KPX quoteright scedilla -37 +KPX quoteright scommaaccent -37 +KPX quoteright space -74 +KPX quoteright v -20 +KPX r c -18 +KPX r cacute -18 +KPX r ccaron -18 +KPX r ccedilla -18 +KPX r comma -92 +KPX r e -18 +KPX r eacute -18 +KPX r ecaron -18 +KPX r ecircumflex -18 +KPX r edieresis -18 +KPX r edotaccent -18 +KPX r egrave -18 +KPX r emacron -18 +KPX r eogonek -18 +KPX r g -10 +KPX r gbreve -10 +KPX r gcommaaccent -10 +KPX r hyphen -37 +KPX r n -15 +KPX r nacute -15 +KPX r ncaron -15 +KPX r ncommaaccent -15 +KPX r ntilde -15 +KPX r o -18 +KPX r oacute -18 +KPX r ocircumflex -18 +KPX r odieresis -18 +KPX r ograve -18 +KPX r ohungarumlaut -18 +KPX r omacron -18 +KPX r oslash -18 +KPX r otilde -18 +KPX r p -10 +KPX r period -100 +KPX r q -18 +KPX r v -10 +KPX racute c -18 +KPX racute cacute -18 +KPX racute ccaron -18 +KPX racute ccedilla -18 +KPX racute comma -92 +KPX racute e -18 +KPX racute eacute -18 +KPX racute ecaron -18 +KPX racute ecircumflex -18 +KPX racute edieresis -18 +KPX racute edotaccent -18 +KPX racute egrave -18 +KPX racute emacron -18 +KPX racute eogonek -18 +KPX racute g -10 +KPX racute gbreve -10 +KPX racute gcommaaccent -10 +KPX racute hyphen -37 +KPX racute n -15 +KPX racute nacute -15 +KPX racute ncaron -15 +KPX racute ncommaaccent -15 +KPX racute ntilde -15 +KPX racute o -18 +KPX racute oacute -18 +KPX racute ocircumflex -18 +KPX racute odieresis -18 +KPX racute ograve -18 +KPX racute ohungarumlaut -18 +KPX racute omacron -18 +KPX racute oslash -18 +KPX racute otilde -18 +KPX racute p -10 +KPX racute period -100 +KPX racute q -18 +KPX racute v -10 +KPX rcaron c -18 +KPX rcaron cacute -18 +KPX rcaron ccaron -18 +KPX rcaron ccedilla -18 +KPX rcaron comma -92 +KPX rcaron e -18 +KPX rcaron eacute -18 +KPX rcaron ecaron -18 +KPX rcaron ecircumflex -18 +KPX rcaron edieresis -18 +KPX rcaron edotaccent -18 +KPX rcaron egrave -18 +KPX rcaron emacron -18 +KPX rcaron eogonek -18 +KPX rcaron g -10 +KPX rcaron gbreve -10 +KPX rcaron gcommaaccent -10 +KPX rcaron hyphen -37 +KPX rcaron n -15 +KPX rcaron nacute -15 +KPX rcaron ncaron -15 +KPX rcaron ncommaaccent -15 +KPX rcaron ntilde -15 +KPX rcaron o -18 +KPX rcaron oacute -18 +KPX rcaron ocircumflex -18 +KPX rcaron odieresis -18 +KPX rcaron ograve -18 +KPX rcaron ohungarumlaut -18 +KPX rcaron omacron -18 +KPX rcaron oslash -18 +KPX rcaron otilde -18 +KPX rcaron p -10 +KPX rcaron period -100 +KPX rcaron q -18 +KPX rcaron v -10 +KPX rcommaaccent c -18 +KPX rcommaaccent cacute -18 +KPX rcommaaccent ccaron -18 +KPX rcommaaccent ccedilla -18 +KPX rcommaaccent comma -92 +KPX rcommaaccent e -18 +KPX rcommaaccent eacute -18 +KPX rcommaaccent ecaron -18 +KPX rcommaaccent ecircumflex -18 +KPX rcommaaccent edieresis -18 +KPX rcommaaccent edotaccent -18 +KPX rcommaaccent egrave -18 +KPX rcommaaccent emacron -18 +KPX rcommaaccent eogonek -18 +KPX rcommaaccent g -10 +KPX rcommaaccent gbreve -10 +KPX rcommaaccent gcommaaccent -10 +KPX rcommaaccent hyphen -37 +KPX rcommaaccent n -15 +KPX rcommaaccent nacute -15 +KPX rcommaaccent ncaron -15 +KPX rcommaaccent ncommaaccent -15 +KPX rcommaaccent ntilde -15 +KPX rcommaaccent o -18 +KPX rcommaaccent oacute -18 +KPX rcommaaccent ocircumflex -18 +KPX rcommaaccent odieresis -18 +KPX rcommaaccent ograve -18 +KPX rcommaaccent ohungarumlaut -18 +KPX rcommaaccent omacron -18 +KPX rcommaaccent oslash -18 +KPX rcommaaccent otilde -18 +KPX rcommaaccent p -10 +KPX rcommaaccent period -100 +KPX rcommaaccent q -18 +KPX rcommaaccent v -10 +KPX space A -55 +KPX space Aacute -55 +KPX space Abreve -55 +KPX space Acircumflex -55 +KPX space Adieresis -55 +KPX space Agrave -55 +KPX space Amacron -55 +KPX space Aogonek -55 +KPX space Aring -55 +KPX space Atilde -55 +KPX space T -30 +KPX space Tcaron -30 +KPX space Tcommaaccent -30 +KPX space V -45 +KPX space W -30 +KPX space Y -55 +KPX space Yacute -55 +KPX space Ydieresis -55 +KPX v a -10 +KPX v aacute -10 +KPX v abreve -10 +KPX v acircumflex -10 +KPX v adieresis -10 +KPX v agrave -10 +KPX v amacron -10 +KPX v aogonek -10 +KPX v aring -10 +KPX v atilde -10 +KPX v comma -55 +KPX v e -10 +KPX v eacute -10 +KPX v ecaron -10 +KPX v ecircumflex -10 +KPX v edieresis -10 +KPX v edotaccent -10 +KPX v egrave -10 +KPX v emacron -10 +KPX v eogonek -10 +KPX v o -10 +KPX v oacute -10 +KPX v ocircumflex -10 +KPX v odieresis -10 +KPX v ograve -10 +KPX v ohungarumlaut -10 +KPX v omacron -10 +KPX v oslash -10 +KPX v otilde -10 +KPX v period -70 +KPX w comma -55 +KPX w o -10 +KPX w oacute -10 +KPX w ocircumflex -10 +KPX w odieresis -10 +KPX w ograve -10 +KPX w ohungarumlaut -10 +KPX w omacron -10 +KPX w oslash -10 +KPX w otilde -10 +KPX w period -70 +KPX y comma -55 +KPX y e -10 +KPX y eacute -10 +KPX y ecaron -10 +KPX y ecircumflex -10 +KPX y edieresis -10 +KPX y edotaccent -10 +KPX y egrave -10 +KPX y emacron -10 +KPX y eogonek -10 +KPX y o -25 +KPX y oacute -25 +KPX y ocircumflex -25 +KPX y odieresis -25 +KPX y ograve -25 +KPX y ohungarumlaut -25 +KPX y omacron -25 +KPX y oslash -25 +KPX y otilde -25 +KPX y period -70 +KPX yacute comma -55 +KPX yacute e -10 +KPX yacute eacute -10 +KPX yacute ecaron -10 +KPX yacute ecircumflex -10 +KPX yacute edieresis -10 +KPX yacute edotaccent -10 +KPX yacute egrave -10 +KPX yacute emacron -10 +KPX yacute eogonek -10 +KPX yacute o -25 +KPX yacute oacute -25 +KPX yacute ocircumflex -25 +KPX yacute odieresis -25 +KPX yacute ograve -25 +KPX yacute ohungarumlaut -25 +KPX yacute omacron -25 +KPX yacute oslash -25 +KPX yacute otilde -25 +KPX yacute period -70 +KPX ydieresis comma -55 +KPX ydieresis e -10 +KPX ydieresis eacute -10 +KPX ydieresis ecaron -10 +KPX ydieresis ecircumflex -10 +KPX ydieresis edieresis -10 +KPX ydieresis edotaccent -10 +KPX ydieresis egrave -10 +KPX ydieresis emacron -10 +KPX ydieresis eogonek -10 +KPX ydieresis o -25 +KPX ydieresis oacute -25 +KPX ydieresis ocircumflex -25 +KPX ydieresis odieresis -25 +KPX ydieresis ograve -25 +KPX ydieresis ohungarumlaut -25 +KPX ydieresis omacron -25 +KPX ydieresis oslash -25 +KPX ydieresis otilde -25 +KPX ydieresis period -70 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/Times-BoldItalic.afm b/dompdf/vendor/dompdf/dompdf/lib/fonts/Times-BoldItalic.afm new file mode 100644 index 0000000..6bc0683 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/Times-BoldItalic.afm @@ -0,0 +1,2386 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 13:04:06 1997 +Comment UniqueID 43066 +Comment VMusage 45874 56899 +FontName Times-BoldItalic +FullName Times Bold Italic +FamilyName Times +Weight Bold +ItalicAngle -15 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -200 -218 996 921 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 669 +XHeight 462 +Ascender 683 +Descender -217 +StdHW 42 +StdVW 121 +StartCharMetrics 317 +C 32 ; WX 250 ; N space ; B 0 0 0 0 ; +C 160 ; WX 250 ; N space ; B 0 0 0 0 ; +C 33 ; WX 389 ; N exclam ; B 67 -13 370 684 ; +C 34 ; WX 555 ; N quotedbl ; B 136 398 536 685 ; +C 35 ; WX 500 ; N numbersign ; B -33 0 533 700 ; +C 36 ; WX 500 ; N dollar ; B -20 -100 497 733 ; +C 37 ; WX 833 ; N percent ; B 39 -10 793 692 ; +C 38 ; WX 778 ; N ampersand ; B 5 -19 699 682 ; +C 146 ; WX 333 ; N quoteright ; B 98 369 302 685 ; +C 40 ; WX 333 ; N parenleft ; B 28 -179 344 685 ; +C 41 ; WX 333 ; N parenright ; B -44 -179 271 685 ; +C 42 ; WX 500 ; N asterisk ; B 65 249 456 685 ; +C 43 ; WX 570 ; N plus ; B 33 0 537 506 ; +C 44 ; WX 250 ; N comma ; B -60 -182 144 134 ; +C 45 ; WX 333 ; N hyphen ; B 2 166 271 282 ; +C 173 ; WX 333 ; N hyphen ; B 2 166 271 282 ; +C 46 ; WX 250 ; N period ; B -9 -13 139 135 ; +C 47 ; WX 278 ; N slash ; B -64 -18 342 685 ; +C 48 ; WX 500 ; N zero ; B 17 -14 477 683 ; +C 49 ; WX 500 ; N one ; B 5 0 419 683 ; +C 50 ; WX 500 ; N two ; B -27 0 446 683 ; +C 51 ; WX 500 ; N three ; B -15 -13 450 683 ; +C 52 ; WX 500 ; N four ; B -15 0 503 683 ; +C 53 ; WX 500 ; N five ; B -11 -13 487 669 ; +C 54 ; WX 500 ; N six ; B 23 -15 509 679 ; +C 55 ; WX 500 ; N seven ; B 52 0 525 669 ; +C 56 ; WX 500 ; N eight ; B 3 -13 476 683 ; +C 57 ; WX 500 ; N nine ; B -12 -10 475 683 ; +C 58 ; WX 333 ; N colon ; B 23 -13 264 459 ; +C 59 ; WX 333 ; N semicolon ; B -25 -183 264 459 ; +C 60 ; WX 570 ; N less ; B 31 -8 539 514 ; +C 61 ; WX 570 ; N equal ; B 33 107 537 399 ; +C 62 ; WX 570 ; N greater ; B 31 -8 539 514 ; +C 63 ; WX 500 ; N question ; B 79 -13 470 684 ; +C 64 ; WX 832 ; N at ; B 63 -18 770 685 ; +C 65 ; WX 667 ; N A ; B -67 0 593 683 ; +C 66 ; WX 667 ; N B ; B -24 0 624 669 ; +C 67 ; WX 667 ; N C ; B 32 -18 677 685 ; +C 68 ; WX 722 ; N D ; B -46 0 685 669 ; +C 69 ; WX 667 ; N E ; B -27 0 653 669 ; +C 70 ; WX 667 ; N F ; B -13 0 660 669 ; +C 71 ; WX 722 ; N G ; B 21 -18 706 685 ; +C 72 ; WX 778 ; N H ; B -24 0 799 669 ; +C 73 ; WX 389 ; N I ; B -32 0 406 669 ; +C 74 ; WX 500 ; N J ; B -46 -99 524 669 ; +C 75 ; WX 667 ; N K ; B -21 0 702 669 ; +C 76 ; WX 611 ; N L ; B -22 0 590 669 ; +C 77 ; WX 889 ; N M ; B -29 -12 917 669 ; +C 78 ; WX 722 ; N N ; B -27 -15 748 669 ; +C 79 ; WX 722 ; N O ; B 27 -18 691 685 ; +C 80 ; WX 611 ; N P ; B -27 0 613 669 ; +C 81 ; WX 722 ; N Q ; B 27 -208 691 685 ; +C 82 ; WX 667 ; N R ; B -29 0 623 669 ; +C 83 ; WX 556 ; N S ; B 2 -18 526 685 ; +C 84 ; WX 611 ; N T ; B 50 0 650 669 ; +C 85 ; WX 722 ; N U ; B 67 -18 744 669 ; +C 86 ; WX 667 ; N V ; B 65 -18 715 669 ; +C 87 ; WX 889 ; N W ; B 65 -18 940 669 ; +C 88 ; WX 667 ; N X ; B -24 0 694 669 ; +C 89 ; WX 611 ; N Y ; B 73 0 659 669 ; +C 90 ; WX 611 ; N Z ; B -11 0 590 669 ; +C 91 ; WX 333 ; N bracketleft ; B -37 -159 362 674 ; +C 92 ; WX 278 ; N backslash ; B -1 -18 279 685 ; +C 93 ; WX 333 ; N bracketright ; B -56 -157 343 674 ; +C 94 ; WX 570 ; N asciicircum ; B 67 304 503 669 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 145 ; WX 333 ; N quoteleft ; B 128 369 332 685 ; +C 97 ; WX 500 ; N a ; B -21 -14 455 462 ; +C 98 ; WX 500 ; N b ; B -14 -13 444 699 ; +C 99 ; WX 444 ; N c ; B -5 -13 392 462 ; +C 100 ; WX 500 ; N d ; B -21 -13 517 699 ; +C 101 ; WX 444 ; N e ; B 5 -13 398 462 ; +C 102 ; WX 333 ; N f ; B -169 -205 446 698 ; L i fi ; L l fl ; +C 103 ; WX 500 ; N g ; B -52 -203 478 462 ; +C 104 ; WX 556 ; N h ; B -13 -9 498 699 ; +C 105 ; WX 278 ; N i ; B 2 -9 263 684 ; +C 106 ; WX 278 ; N j ; B -189 -207 279 684 ; +C 107 ; WX 500 ; N k ; B -23 -8 483 699 ; +C 108 ; WX 278 ; N l ; B 2 -9 290 699 ; +C 109 ; WX 778 ; N m ; B -14 -9 722 462 ; +C 110 ; WX 556 ; N n ; B -6 -9 493 462 ; +C 111 ; WX 500 ; N o ; B -3 -13 441 462 ; +C 112 ; WX 500 ; N p ; B -120 -205 446 462 ; +C 113 ; WX 500 ; N q ; B 1 -205 471 462 ; +C 114 ; WX 389 ; N r ; B -21 0 389 462 ; +C 115 ; WX 389 ; N s ; B -19 -13 333 462 ; +C 116 ; WX 278 ; N t ; B -11 -9 281 594 ; +C 117 ; WX 556 ; N u ; B 15 -9 492 462 ; +C 118 ; WX 444 ; N v ; B 16 -13 401 462 ; +C 119 ; WX 667 ; N w ; B 16 -13 614 462 ; +C 120 ; WX 500 ; N x ; B -46 -13 469 462 ; +C 121 ; WX 444 ; N y ; B -94 -205 392 462 ; +C 122 ; WX 389 ; N z ; B -43 -78 368 449 ; +C 123 ; WX 348 ; N braceleft ; B 5 -187 436 686 ; +C 124 ; WX 220 ; N bar ; B 66 -218 154 782 ; +C 125 ; WX 348 ; N braceright ; B -129 -187 302 686 ; +C 126 ; WX 570 ; N asciitilde ; B 54 173 516 333 ; +C 161 ; WX 389 ; N exclamdown ; B 19 -205 322 492 ; +C 162 ; WX 500 ; N cent ; B 42 -143 439 576 ; +C 163 ; WX 500 ; N sterling ; B -32 -12 510 683 ; +C -1 ; WX 167 ; N fraction ; B -169 -14 324 683 ; +C 165 ; WX 500 ; N yen ; B 33 0 628 669 ; +C 131 ; WX 500 ; N florin ; B -87 -156 537 707 ; +C 167 ; WX 500 ; N section ; B 36 -143 459 685 ; +C 164 ; WX 500 ; N currency ; B -26 34 526 586 ; +C 39 ; WX 278 ; N quotesingle ; B 128 398 268 685 ; +C 147 ; WX 500 ; N quotedblleft ; B 53 369 513 685 ; +C 171 ; WX 500 ; N guillemotleft ; B 12 32 468 415 ; +C 139 ; WX 333 ; N guilsinglleft ; B 32 32 303 415 ; +C 155 ; WX 333 ; N guilsinglright ; B 10 32 281 415 ; +C -1 ; WX 556 ; N fi ; B -188 -205 514 703 ; +C -1 ; WX 556 ; N fl ; B -186 -205 553 704 ; +C 150 ; WX 500 ; N endash ; B -40 178 477 269 ; +C 134 ; WX 500 ; N dagger ; B 91 -145 494 685 ; +C 135 ; WX 500 ; N daggerdbl ; B 10 -139 493 685 ; +C 183 ; WX 250 ; N periodcentered ; B 51 257 199 405 ; +C 182 ; WX 500 ; N paragraph ; B -57 -193 562 669 ; +C 149 ; WX 350 ; N bullet ; B 0 175 350 525 ; +C 130 ; WX 333 ; N quotesinglbase ; B -5 -182 199 134 ; +C 132 ; WX 500 ; N quotedblbase ; B -57 -182 403 134 ; +C 148 ; WX 500 ; N quotedblright ; B 53 369 513 685 ; +C 187 ; WX 500 ; N guillemotright ; B 12 32 468 415 ; +C 133 ; WX 1000 ; N ellipsis ; B 40 -13 852 135 ; +C 137 ; WX 1000 ; N perthousand ; B 7 -29 996 706 ; +C 191 ; WX 500 ; N questiondown ; B 30 -205 421 492 ; +C 96 ; WX 333 ; N grave ; B 85 516 297 697 ; +C 180 ; WX 333 ; N acute ; B 139 516 379 697 ; +C 136 ; WX 333 ; N circumflex ; B 40 516 367 690 ; +C 152 ; WX 333 ; N tilde ; B 48 536 407 655 ; +C 175 ; WX 333 ; N macron ; B 51 553 393 623 ; +C -1 ; WX 333 ; N breve ; B 71 516 387 678 ; +C -1 ; WX 333 ; N dotaccent ; B 163 550 298 684 ; +C 168 ; WX 333 ; N dieresis ; B 55 550 402 684 ; +C -1 ; WX 333 ; N ring ; B 127 516 340 729 ; +C 184 ; WX 333 ; N cedilla ; B -80 -218 156 5 ; +C -1 ; WX 333 ; N hungarumlaut ; B 69 516 498 697 ; +C -1 ; WX 333 ; N ogonek ; B 15 -183 244 34 ; +C -1 ; WX 333 ; N caron ; B 79 516 411 690 ; +C 151 ; WX 1000 ; N emdash ; B -40 178 977 269 ; +C 198 ; WX 944 ; N AE ; B -64 0 918 669 ; +C 170 ; WX 266 ; N ordfeminine ; B 16 399 330 685 ; +C -1 ; WX 611 ; N Lslash ; B -22 0 590 669 ; +C 216 ; WX 722 ; N Oslash ; B 27 -125 691 764 ; +C 140 ; WX 944 ; N OE ; B 23 -8 946 677 ; +C 186 ; WX 300 ; N ordmasculine ; B 56 400 347 685 ; +C 230 ; WX 722 ; N ae ; B -5 -13 673 462 ; +C -1 ; WX 278 ; N dotlessi ; B 2 -9 238 462 ; +C -1 ; WX 278 ; N lslash ; B -7 -9 307 699 ; +C 248 ; WX 500 ; N oslash ; B -3 -119 441 560 ; +C 156 ; WX 722 ; N oe ; B 6 -13 674 462 ; +C 223 ; WX 500 ; N germandbls ; B -200 -200 473 705 ; +C 207 ; WX 389 ; N Idieresis ; B -32 0 450 862 ; +C 233 ; WX 444 ; N eacute ; B 5 -13 435 697 ; +C -1 ; WX 500 ; N abreve ; B -21 -14 471 678 ; +C -1 ; WX 556 ; N uhungarumlaut ; B 15 -9 610 697 ; +C -1 ; WX 444 ; N ecaron ; B 5 -13 467 690 ; +C 159 ; WX 611 ; N Ydieresis ; B 73 0 659 862 ; +C 247 ; WX 570 ; N divide ; B 33 -29 537 535 ; +C 221 ; WX 611 ; N Yacute ; B 73 0 659 904 ; +C 194 ; WX 667 ; N Acircumflex ; B -67 0 593 897 ; +C 225 ; WX 500 ; N aacute ; B -21 -14 463 697 ; +C 219 ; WX 722 ; N Ucircumflex ; B 67 -18 744 897 ; +C 253 ; WX 444 ; N yacute ; B -94 -205 435 697 ; +C -1 ; WX 389 ; N scommaaccent ; B -19 -218 333 462 ; +C 234 ; WX 444 ; N ecircumflex ; B 5 -13 423 690 ; +C -1 ; WX 722 ; N Uring ; B 67 -18 744 921 ; +C 220 ; WX 722 ; N Udieresis ; B 67 -18 744 862 ; +C -1 ; WX 500 ; N aogonek ; B -21 -183 455 462 ; +C 218 ; WX 722 ; N Uacute ; B 67 -18 744 904 ; +C -1 ; WX 556 ; N uogonek ; B 15 -183 492 462 ; +C 203 ; WX 667 ; N Edieresis ; B -27 0 653 862 ; +C -1 ; WX 722 ; N Dcroat ; B -31 0 700 669 ; +C -1 ; WX 250 ; N commaaccent ; B -36 -218 131 -50 ; +C 169 ; WX 747 ; N copyright ; B 30 -18 718 685 ; +C -1 ; WX 667 ; N Emacron ; B -27 0 653 830 ; +C -1 ; WX 444 ; N ccaron ; B -5 -13 467 690 ; +C 229 ; WX 500 ; N aring ; B -21 -14 455 729 ; +C -1 ; WX 722 ; N Ncommaaccent ; B -27 -218 748 669 ; +C -1 ; WX 278 ; N lacute ; B 2 -9 392 904 ; +C 224 ; WX 500 ; N agrave ; B -21 -14 455 697 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 50 -218 650 669 ; +C -1 ; WX 667 ; N Cacute ; B 32 -18 677 904 ; +C 227 ; WX 500 ; N atilde ; B -21 -14 491 655 ; +C -1 ; WX 667 ; N Edotaccent ; B -27 0 653 862 ; +C 154 ; WX 389 ; N scaron ; B -19 -13 424 690 ; +C -1 ; WX 389 ; N scedilla ; B -19 -218 333 462 ; +C 237 ; WX 278 ; N iacute ; B 2 -9 352 697 ; +C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; +C -1 ; WX 667 ; N Rcaron ; B -29 0 623 897 ; +C -1 ; WX 722 ; N Gcommaaccent ; B 21 -218 706 685 ; +C 251 ; WX 556 ; N ucircumflex ; B 15 -9 492 690 ; +C 226 ; WX 500 ; N acircumflex ; B -21 -14 455 690 ; +C -1 ; WX 667 ; N Amacron ; B -67 0 593 830 ; +C -1 ; WX 389 ; N rcaron ; B -21 0 424 690 ; +C 231 ; WX 444 ; N ccedilla ; B -5 -218 392 462 ; +C -1 ; WX 611 ; N Zdotaccent ; B -11 0 590 862 ; +C 222 ; WX 611 ; N Thorn ; B -27 0 573 669 ; +C -1 ; WX 722 ; N Omacron ; B 27 -18 691 830 ; +C -1 ; WX 667 ; N Racute ; B -29 0 623 904 ; +C -1 ; WX 556 ; N Sacute ; B 2 -18 531 904 ; +C -1 ; WX 608 ; N dcaron ; B -21 -13 675 708 ; +C -1 ; WX 722 ; N Umacron ; B 67 -18 744 830 ; +C -1 ; WX 556 ; N uring ; B 15 -9 492 729 ; +C 179 ; WX 300 ; N threesuperior ; B 17 265 321 683 ; +C 210 ; WX 722 ; N Ograve ; B 27 -18 691 904 ; +C 192 ; WX 667 ; N Agrave ; B -67 0 593 904 ; +C -1 ; WX 667 ; N Abreve ; B -67 0 593 885 ; +C 215 ; WX 570 ; N multiply ; B 48 16 522 490 ; +C 250 ; WX 556 ; N uacute ; B 15 -9 492 697 ; +C -1 ; WX 611 ; N Tcaron ; B 50 0 650 897 ; +C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; +C 255 ; WX 444 ; N ydieresis ; B -94 -205 443 655 ; +C -1 ; WX 722 ; N Nacute ; B -27 -15 748 904 ; +C 238 ; WX 278 ; N icircumflex ; B -3 -9 324 690 ; +C 202 ; WX 667 ; N Ecircumflex ; B -27 0 653 897 ; +C 228 ; WX 500 ; N adieresis ; B -21 -14 476 655 ; +C 235 ; WX 444 ; N edieresis ; B 5 -13 448 655 ; +C -1 ; WX 444 ; N cacute ; B -5 -13 435 697 ; +C -1 ; WX 556 ; N nacute ; B -6 -9 493 697 ; +C -1 ; WX 556 ; N umacron ; B 15 -9 492 623 ; +C -1 ; WX 722 ; N Ncaron ; B -27 -15 748 897 ; +C 205 ; WX 389 ; N Iacute ; B -32 0 432 904 ; +C 177 ; WX 570 ; N plusminus ; B 33 0 537 506 ; +C 166 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ; +C 174 ; WX 747 ; N registered ; B 30 -18 718 685 ; +C -1 ; WX 722 ; N Gbreve ; B 21 -18 706 885 ; +C -1 ; WX 389 ; N Idotaccent ; B -32 0 406 862 ; +C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; +C 200 ; WX 667 ; N Egrave ; B -27 0 653 904 ; +C -1 ; WX 389 ; N racute ; B -21 0 407 697 ; +C -1 ; WX 500 ; N omacron ; B -3 -13 462 623 ; +C -1 ; WX 611 ; N Zacute ; B -11 0 590 904 ; +C 142 ; WX 611 ; N Zcaron ; B -11 0 590 897 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; +C 208 ; WX 722 ; N Eth ; B -31 0 700 669 ; +C 199 ; WX 667 ; N Ccedilla ; B 32 -218 677 685 ; +C -1 ; WX 278 ; N lcommaaccent ; B -42 -218 290 699 ; +C -1 ; WX 366 ; N tcaron ; B -11 -9 434 754 ; +C -1 ; WX 444 ; N eogonek ; B 5 -183 398 462 ; +C -1 ; WX 722 ; N Uogonek ; B 67 -183 744 669 ; +C 193 ; WX 667 ; N Aacute ; B -67 0 593 904 ; +C 196 ; WX 667 ; N Adieresis ; B -67 0 593 862 ; +C 232 ; WX 444 ; N egrave ; B 5 -13 398 697 ; +C -1 ; WX 389 ; N zacute ; B -43 -78 407 697 ; +C -1 ; WX 278 ; N iogonek ; B -20 -183 263 684 ; +C 211 ; WX 722 ; N Oacute ; B 27 -18 691 904 ; +C 243 ; WX 500 ; N oacute ; B -3 -13 463 697 ; +C -1 ; WX 500 ; N amacron ; B -21 -14 467 623 ; +C -1 ; WX 389 ; N sacute ; B -19 -13 407 697 ; +C 239 ; WX 278 ; N idieresis ; B 2 -9 364 655 ; +C 212 ; WX 722 ; N Ocircumflex ; B 27 -18 691 897 ; +C 217 ; WX 722 ; N Ugrave ; B 67 -18 744 904 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 500 ; N thorn ; B -120 -205 446 699 ; +C 178 ; WX 300 ; N twosuperior ; B 2 274 313 683 ; +C 214 ; WX 722 ; N Odieresis ; B 27 -18 691 862 ; +C 181 ; WX 576 ; N mu ; B -60 -207 516 449 ; +C 236 ; WX 278 ; N igrave ; B 2 -9 259 697 ; +C -1 ; WX 500 ; N ohungarumlaut ; B -3 -13 582 697 ; +C -1 ; WX 667 ; N Eogonek ; B -27 -183 653 669 ; +C -1 ; WX 500 ; N dcroat ; B -21 -13 552 699 ; +C 190 ; WX 750 ; N threequarters ; B 7 -14 726 683 ; +C -1 ; WX 556 ; N Scedilla ; B 2 -218 526 685 ; +C -1 ; WX 382 ; N lcaron ; B 2 -9 448 708 ; +C -1 ; WX 667 ; N Kcommaaccent ; B -21 -218 702 669 ; +C -1 ; WX 611 ; N Lacute ; B -22 0 590 904 ; +C 153 ; WX 1000 ; N trademark ; B 32 263 968 669 ; +C -1 ; WX 444 ; N edotaccent ; B 5 -13 398 655 ; +C 204 ; WX 389 ; N Igrave ; B -32 0 406 904 ; +C -1 ; WX 389 ; N Imacron ; B -32 0 461 830 ; +C -1 ; WX 611 ; N Lcaron ; B -22 0 671 718 ; +C 189 ; WX 750 ; N onehalf ; B -9 -14 723 683 ; +C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; +C 244 ; WX 500 ; N ocircumflex ; B -3 -13 451 690 ; +C 241 ; WX 556 ; N ntilde ; B -6 -9 504 655 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 67 -18 744 904 ; +C 201 ; WX 667 ; N Eacute ; B -27 0 653 904 ; +C -1 ; WX 444 ; N emacron ; B 5 -13 439 623 ; +C -1 ; WX 500 ; N gbreve ; B -52 -203 478 678 ; +C 188 ; WX 750 ; N onequarter ; B 7 -14 721 683 ; +C 138 ; WX 556 ; N Scaron ; B 2 -18 553 897 ; +C -1 ; WX 556 ; N Scommaaccent ; B 2 -218 526 685 ; +C -1 ; WX 722 ; N Ohungarumlaut ; B 27 -18 723 904 ; +C 176 ; WX 400 ; N degree ; B 83 397 369 683 ; +C 242 ; WX 500 ; N ograve ; B -3 -13 441 697 ; +C -1 ; WX 667 ; N Ccaron ; B 32 -18 677 897 ; +C 249 ; WX 556 ; N ugrave ; B 15 -9 492 697 ; +C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; +C -1 ; WX 722 ; N Dcaron ; B -46 0 685 897 ; +C -1 ; WX 389 ; N rcommaaccent ; B -67 -218 389 462 ; +C 209 ; WX 722 ; N Ntilde ; B -27 -15 748 862 ; +C 245 ; WX 500 ; N otilde ; B -3 -13 491 655 ; +C -1 ; WX 667 ; N Rcommaaccent ; B -29 -218 623 669 ; +C -1 ; WX 611 ; N Lcommaaccent ; B -22 -218 590 669 ; +C 195 ; WX 667 ; N Atilde ; B -67 0 593 862 ; +C -1 ; WX 667 ; N Aogonek ; B -67 -183 604 683 ; +C 197 ; WX 667 ; N Aring ; B -67 0 593 921 ; +C 213 ; WX 722 ; N Otilde ; B 27 -18 691 862 ; +C -1 ; WX 389 ; N zdotaccent ; B -43 -78 368 655 ; +C -1 ; WX 667 ; N Ecaron ; B -27 0 653 897 ; +C -1 ; WX 389 ; N Iogonek ; B -32 -183 406 669 ; +C -1 ; WX 500 ; N kcommaaccent ; B -23 -218 483 699 ; +C -1 ; WX 606 ; N minus ; B 51 209 555 297 ; +C 206 ; WX 389 ; N Icircumflex ; B -32 0 450 897 ; +C -1 ; WX 556 ; N ncaron ; B -6 -9 523 690 ; +C -1 ; WX 278 ; N tcommaaccent ; B -62 -218 281 594 ; +C 172 ; WX 606 ; N logicalnot ; B 51 108 555 399 ; +C 246 ; WX 500 ; N odieresis ; B -3 -13 471 655 ; +C 252 ; WX 556 ; N udieresis ; B 15 -9 499 655 ; +C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; +C -1 ; WX 500 ; N gcommaaccent ; B -52 -203 478 767 ; +C 240 ; WX 500 ; N eth ; B -3 -13 454 699 ; +C 158 ; WX 389 ; N zcaron ; B -43 -78 424 690 ; +C -1 ; WX 556 ; N ncommaaccent ; B -6 -218 493 462 ; +C 185 ; WX 300 ; N onesuperior ; B 30 274 301 683 ; +C -1 ; WX 278 ; N imacron ; B 2 -9 294 623 ; +C 128 ; WX 500 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2038 +KPX A C -65 +KPX A Cacute -65 +KPX A Ccaron -65 +KPX A Ccedilla -65 +KPX A G -60 +KPX A Gbreve -60 +KPX A Gcommaaccent -60 +KPX A O -50 +KPX A Oacute -50 +KPX A Ocircumflex -50 +KPX A Odieresis -50 +KPX A Ograve -50 +KPX A Ohungarumlaut -50 +KPX A Omacron -50 +KPX A Oslash -50 +KPX A Otilde -50 +KPX A Q -55 +KPX A T -55 +KPX A Tcaron -55 +KPX A Tcommaaccent -55 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -95 +KPX A W -100 +KPX A Y -70 +KPX A Yacute -70 +KPX A Ydieresis -70 +KPX A quoteright -74 +KPX A u -30 +KPX A uacute -30 +KPX A ucircumflex -30 +KPX A udieresis -30 +KPX A ugrave -30 +KPX A uhungarumlaut -30 +KPX A umacron -30 +KPX A uogonek -30 +KPX A uring -30 +KPX A v -74 +KPX A w -74 +KPX A y -74 +KPX A yacute -74 +KPX A ydieresis -74 +KPX Aacute C -65 +KPX Aacute Cacute -65 +KPX Aacute Ccaron -65 +KPX Aacute Ccedilla -65 +KPX Aacute G -60 +KPX Aacute Gbreve -60 +KPX Aacute Gcommaaccent -60 +KPX Aacute O -50 +KPX Aacute Oacute -50 +KPX Aacute Ocircumflex -50 +KPX Aacute Odieresis -50 +KPX Aacute Ograve -50 +KPX Aacute Ohungarumlaut -50 +KPX Aacute Omacron -50 +KPX Aacute Oslash -50 +KPX Aacute Otilde -50 +KPX Aacute Q -55 +KPX Aacute T -55 +KPX Aacute Tcaron -55 +KPX Aacute Tcommaaccent -55 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -95 +KPX Aacute W -100 +KPX Aacute Y -70 +KPX Aacute Yacute -70 +KPX Aacute Ydieresis -70 +KPX Aacute quoteright -74 +KPX Aacute u -30 +KPX Aacute uacute -30 +KPX Aacute ucircumflex -30 +KPX Aacute udieresis -30 +KPX Aacute ugrave -30 +KPX Aacute uhungarumlaut -30 +KPX Aacute umacron -30 +KPX Aacute uogonek -30 +KPX Aacute uring -30 +KPX Aacute v -74 +KPX Aacute w -74 +KPX Aacute y -74 +KPX Aacute yacute -74 +KPX Aacute ydieresis -74 +KPX Abreve C -65 +KPX Abreve Cacute -65 +KPX Abreve Ccaron -65 +KPX Abreve Ccedilla -65 +KPX Abreve G -60 +KPX Abreve Gbreve -60 +KPX Abreve Gcommaaccent -60 +KPX Abreve O -50 +KPX Abreve Oacute -50 +KPX Abreve Ocircumflex -50 +KPX Abreve Odieresis -50 +KPX Abreve Ograve -50 +KPX Abreve Ohungarumlaut -50 +KPX Abreve Omacron -50 +KPX Abreve Oslash -50 +KPX Abreve Otilde -50 +KPX Abreve Q -55 +KPX Abreve T -55 +KPX Abreve Tcaron -55 +KPX Abreve Tcommaaccent -55 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -95 +KPX Abreve W -100 +KPX Abreve Y -70 +KPX Abreve Yacute -70 +KPX Abreve Ydieresis -70 +KPX Abreve quoteright -74 +KPX Abreve u -30 +KPX Abreve uacute -30 +KPX Abreve ucircumflex -30 +KPX Abreve udieresis -30 +KPX Abreve ugrave -30 +KPX Abreve uhungarumlaut -30 +KPX Abreve umacron -30 +KPX Abreve uogonek -30 +KPX Abreve uring -30 +KPX Abreve v -74 +KPX Abreve w -74 +KPX Abreve y -74 +KPX Abreve yacute -74 +KPX Abreve ydieresis -74 +KPX Acircumflex C -65 +KPX Acircumflex Cacute -65 +KPX Acircumflex Ccaron -65 +KPX Acircumflex Ccedilla -65 +KPX Acircumflex G -60 +KPX Acircumflex Gbreve -60 +KPX Acircumflex Gcommaaccent -60 +KPX Acircumflex O -50 +KPX Acircumflex Oacute -50 +KPX Acircumflex Ocircumflex -50 +KPX Acircumflex Odieresis -50 +KPX Acircumflex Ograve -50 +KPX Acircumflex Ohungarumlaut -50 +KPX Acircumflex Omacron -50 +KPX Acircumflex Oslash -50 +KPX Acircumflex Otilde -50 +KPX Acircumflex Q -55 +KPX Acircumflex T -55 +KPX Acircumflex Tcaron -55 +KPX Acircumflex Tcommaaccent -55 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -95 +KPX Acircumflex W -100 +KPX Acircumflex Y -70 +KPX Acircumflex Yacute -70 +KPX Acircumflex Ydieresis -70 +KPX Acircumflex quoteright -74 +KPX Acircumflex u -30 +KPX Acircumflex uacute -30 +KPX Acircumflex ucircumflex -30 +KPX Acircumflex udieresis -30 +KPX Acircumflex ugrave -30 +KPX Acircumflex uhungarumlaut -30 +KPX Acircumflex umacron -30 +KPX Acircumflex uogonek -30 +KPX Acircumflex uring -30 +KPX Acircumflex v -74 +KPX Acircumflex w -74 +KPX Acircumflex y -74 +KPX Acircumflex yacute -74 +KPX Acircumflex ydieresis -74 +KPX Adieresis C -65 +KPX Adieresis Cacute -65 +KPX Adieresis Ccaron -65 +KPX Adieresis Ccedilla -65 +KPX Adieresis G -60 +KPX Adieresis Gbreve -60 +KPX Adieresis Gcommaaccent -60 +KPX Adieresis O -50 +KPX Adieresis Oacute -50 +KPX Adieresis Ocircumflex -50 +KPX Adieresis Odieresis -50 +KPX Adieresis Ograve -50 +KPX Adieresis Ohungarumlaut -50 +KPX Adieresis Omacron -50 +KPX Adieresis Oslash -50 +KPX Adieresis Otilde -50 +KPX Adieresis Q -55 +KPX Adieresis T -55 +KPX Adieresis Tcaron -55 +KPX Adieresis Tcommaaccent -55 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -95 +KPX Adieresis W -100 +KPX Adieresis Y -70 +KPX Adieresis Yacute -70 +KPX Adieresis Ydieresis -70 +KPX Adieresis quoteright -74 +KPX Adieresis u -30 +KPX Adieresis uacute -30 +KPX Adieresis ucircumflex -30 +KPX Adieresis udieresis -30 +KPX Adieresis ugrave -30 +KPX Adieresis uhungarumlaut -30 +KPX Adieresis umacron -30 +KPX Adieresis uogonek -30 +KPX Adieresis uring -30 +KPX Adieresis v -74 +KPX Adieresis w -74 +KPX Adieresis y -74 +KPX Adieresis yacute -74 +KPX Adieresis ydieresis -74 +KPX Agrave C -65 +KPX Agrave Cacute -65 +KPX Agrave Ccaron -65 +KPX Agrave Ccedilla -65 +KPX Agrave G -60 +KPX Agrave Gbreve -60 +KPX Agrave Gcommaaccent -60 +KPX Agrave O -50 +KPX Agrave Oacute -50 +KPX Agrave Ocircumflex -50 +KPX Agrave Odieresis -50 +KPX Agrave Ograve -50 +KPX Agrave Ohungarumlaut -50 +KPX Agrave Omacron -50 +KPX Agrave Oslash -50 +KPX Agrave Otilde -50 +KPX Agrave Q -55 +KPX Agrave T -55 +KPX Agrave Tcaron -55 +KPX Agrave Tcommaaccent -55 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -95 +KPX Agrave W -100 +KPX Agrave Y -70 +KPX Agrave Yacute -70 +KPX Agrave Ydieresis -70 +KPX Agrave quoteright -74 +KPX Agrave u -30 +KPX Agrave uacute -30 +KPX Agrave ucircumflex -30 +KPX Agrave udieresis -30 +KPX Agrave ugrave -30 +KPX Agrave uhungarumlaut -30 +KPX Agrave umacron -30 +KPX Agrave uogonek -30 +KPX Agrave uring -30 +KPX Agrave v -74 +KPX Agrave w -74 +KPX Agrave y -74 +KPX Agrave yacute -74 +KPX Agrave ydieresis -74 +KPX Amacron C -65 +KPX Amacron Cacute -65 +KPX Amacron Ccaron -65 +KPX Amacron Ccedilla -65 +KPX Amacron G -60 +KPX Amacron Gbreve -60 +KPX Amacron Gcommaaccent -60 +KPX Amacron O -50 +KPX Amacron Oacute -50 +KPX Amacron Ocircumflex -50 +KPX Amacron Odieresis -50 +KPX Amacron Ograve -50 +KPX Amacron Ohungarumlaut -50 +KPX Amacron Omacron -50 +KPX Amacron Oslash -50 +KPX Amacron Otilde -50 +KPX Amacron Q -55 +KPX Amacron T -55 +KPX Amacron Tcaron -55 +KPX Amacron Tcommaaccent -55 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -95 +KPX Amacron W -100 +KPX Amacron Y -70 +KPX Amacron Yacute -70 +KPX Amacron Ydieresis -70 +KPX Amacron quoteright -74 +KPX Amacron u -30 +KPX Amacron uacute -30 +KPX Amacron ucircumflex -30 +KPX Amacron udieresis -30 +KPX Amacron ugrave -30 +KPX Amacron uhungarumlaut -30 +KPX Amacron umacron -30 +KPX Amacron uogonek -30 +KPX Amacron uring -30 +KPX Amacron v -74 +KPX Amacron w -74 +KPX Amacron y -74 +KPX Amacron yacute -74 +KPX Amacron ydieresis -74 +KPX Aogonek C -65 +KPX Aogonek Cacute -65 +KPX Aogonek Ccaron -65 +KPX Aogonek Ccedilla -65 +KPX Aogonek G -60 +KPX Aogonek Gbreve -60 +KPX Aogonek Gcommaaccent -60 +KPX Aogonek O -50 +KPX Aogonek Oacute -50 +KPX Aogonek Ocircumflex -50 +KPX Aogonek Odieresis -50 +KPX Aogonek Ograve -50 +KPX Aogonek Ohungarumlaut -50 +KPX Aogonek Omacron -50 +KPX Aogonek Oslash -50 +KPX Aogonek Otilde -50 +KPX Aogonek Q -55 +KPX Aogonek T -55 +KPX Aogonek Tcaron -55 +KPX Aogonek Tcommaaccent -55 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -95 +KPX Aogonek W -100 +KPX Aogonek Y -70 +KPX Aogonek Yacute -70 +KPX Aogonek Ydieresis -70 +KPX Aogonek quoteright -74 +KPX Aogonek u -30 +KPX Aogonek uacute -30 +KPX Aogonek ucircumflex -30 +KPX Aogonek udieresis -30 +KPX Aogonek ugrave -30 +KPX Aogonek uhungarumlaut -30 +KPX Aogonek umacron -30 +KPX Aogonek uogonek -30 +KPX Aogonek uring -30 +KPX Aogonek v -74 +KPX Aogonek w -74 +KPX Aogonek y -34 +KPX Aogonek yacute -34 +KPX Aogonek ydieresis -34 +KPX Aring C -65 +KPX Aring Cacute -65 +KPX Aring Ccaron -65 +KPX Aring Ccedilla -65 +KPX Aring G -60 +KPX Aring Gbreve -60 +KPX Aring Gcommaaccent -60 +KPX Aring O -50 +KPX Aring Oacute -50 +KPX Aring Ocircumflex -50 +KPX Aring Odieresis -50 +KPX Aring Ograve -50 +KPX Aring Ohungarumlaut -50 +KPX Aring Omacron -50 +KPX Aring Oslash -50 +KPX Aring Otilde -50 +KPX Aring Q -55 +KPX Aring T -55 +KPX Aring Tcaron -55 +KPX Aring Tcommaaccent -55 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -95 +KPX Aring W -100 +KPX Aring Y -70 +KPX Aring Yacute -70 +KPX Aring Ydieresis -70 +KPX Aring quoteright -74 +KPX Aring u -30 +KPX Aring uacute -30 +KPX Aring ucircumflex -30 +KPX Aring udieresis -30 +KPX Aring ugrave -30 +KPX Aring uhungarumlaut -30 +KPX Aring umacron -30 +KPX Aring uogonek -30 +KPX Aring uring -30 +KPX Aring v -74 +KPX Aring w -74 +KPX Aring y -74 +KPX Aring yacute -74 +KPX Aring ydieresis -74 +KPX Atilde C -65 +KPX Atilde Cacute -65 +KPX Atilde Ccaron -65 +KPX Atilde Ccedilla -65 +KPX Atilde G -60 +KPX Atilde Gbreve -60 +KPX Atilde Gcommaaccent -60 +KPX Atilde O -50 +KPX Atilde Oacute -50 +KPX Atilde Ocircumflex -50 +KPX Atilde Odieresis -50 +KPX Atilde Ograve -50 +KPX Atilde Ohungarumlaut -50 +KPX Atilde Omacron -50 +KPX Atilde Oslash -50 +KPX Atilde Otilde -50 +KPX Atilde Q -55 +KPX Atilde T -55 +KPX Atilde Tcaron -55 +KPX Atilde Tcommaaccent -55 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -95 +KPX Atilde W -100 +KPX Atilde Y -70 +KPX Atilde Yacute -70 +KPX Atilde Ydieresis -70 +KPX Atilde quoteright -74 +KPX Atilde u -30 +KPX Atilde uacute -30 +KPX Atilde ucircumflex -30 +KPX Atilde udieresis -30 +KPX Atilde ugrave -30 +KPX Atilde uhungarumlaut -30 +KPX Atilde umacron -30 +KPX Atilde uogonek -30 +KPX Atilde uring -30 +KPX Atilde v -74 +KPX Atilde w -74 +KPX Atilde y -74 +KPX Atilde yacute -74 +KPX Atilde ydieresis -74 +KPX B A -25 +KPX B Aacute -25 +KPX B Abreve -25 +KPX B Acircumflex -25 +KPX B Adieresis -25 +KPX B Agrave -25 +KPX B Amacron -25 +KPX B Aogonek -25 +KPX B Aring -25 +KPX B Atilde -25 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -25 +KPX D Aacute -25 +KPX D Abreve -25 +KPX D Acircumflex -25 +KPX D Adieresis -25 +KPX D Agrave -25 +KPX D Amacron -25 +KPX D Aogonek -25 +KPX D Aring -25 +KPX D Atilde -25 +KPX D V -50 +KPX D W -40 +KPX D Y -50 +KPX D Yacute -50 +KPX D Ydieresis -50 +KPX Dcaron A -25 +KPX Dcaron Aacute -25 +KPX Dcaron Abreve -25 +KPX Dcaron Acircumflex -25 +KPX Dcaron Adieresis -25 +KPX Dcaron Agrave -25 +KPX Dcaron Amacron -25 +KPX Dcaron Aogonek -25 +KPX Dcaron Aring -25 +KPX Dcaron Atilde -25 +KPX Dcaron V -50 +KPX Dcaron W -40 +KPX Dcaron Y -50 +KPX Dcaron Yacute -50 +KPX Dcaron Ydieresis -50 +KPX Dcroat A -25 +KPX Dcroat Aacute -25 +KPX Dcroat Abreve -25 +KPX Dcroat Acircumflex -25 +KPX Dcroat Adieresis -25 +KPX Dcroat Agrave -25 +KPX Dcroat Amacron -25 +KPX Dcroat Aogonek -25 +KPX Dcroat Aring -25 +KPX Dcroat Atilde -25 +KPX Dcroat V -50 +KPX Dcroat W -40 +KPX Dcroat Y -50 +KPX Dcroat Yacute -50 +KPX Dcroat Ydieresis -50 +KPX F A -100 +KPX F Aacute -100 +KPX F Abreve -100 +KPX F Acircumflex -100 +KPX F Adieresis -100 +KPX F Agrave -100 +KPX F Amacron -100 +KPX F Aogonek -100 +KPX F Aring -100 +KPX F Atilde -100 +KPX F a -95 +KPX F aacute -95 +KPX F abreve -95 +KPX F acircumflex -95 +KPX F adieresis -95 +KPX F agrave -95 +KPX F amacron -95 +KPX F aogonek -95 +KPX F aring -95 +KPX F atilde -95 +KPX F comma -129 +KPX F e -100 +KPX F eacute -100 +KPX F ecaron -100 +KPX F ecircumflex -100 +KPX F edieresis -100 +KPX F edotaccent -100 +KPX F egrave -100 +KPX F emacron -100 +KPX F eogonek -100 +KPX F i -40 +KPX F iacute -40 +KPX F icircumflex -40 +KPX F idieresis -40 +KPX F igrave -40 +KPX F imacron -40 +KPX F iogonek -40 +KPX F o -70 +KPX F oacute -70 +KPX F ocircumflex -70 +KPX F odieresis -70 +KPX F ograve -70 +KPX F ohungarumlaut -70 +KPX F omacron -70 +KPX F oslash -70 +KPX F otilde -70 +KPX F period -129 +KPX F r -50 +KPX F racute -50 +KPX F rcaron -50 +KPX F rcommaaccent -50 +KPX J A -25 +KPX J Aacute -25 +KPX J Abreve -25 +KPX J Acircumflex -25 +KPX J Adieresis -25 +KPX J Agrave -25 +KPX J Amacron -25 +KPX J Aogonek -25 +KPX J Aring -25 +KPX J Atilde -25 +KPX J a -40 +KPX J aacute -40 +KPX J abreve -40 +KPX J acircumflex -40 +KPX J adieresis -40 +KPX J agrave -40 +KPX J amacron -40 +KPX J aogonek -40 +KPX J aring -40 +KPX J atilde -40 +KPX J comma -10 +KPX J e -40 +KPX J eacute -40 +KPX J ecaron -40 +KPX J ecircumflex -40 +KPX J edieresis -40 +KPX J edotaccent -40 +KPX J egrave -40 +KPX J emacron -40 +KPX J eogonek -40 +KPX J o -40 +KPX J oacute -40 +KPX J ocircumflex -40 +KPX J odieresis -40 +KPX J ograve -40 +KPX J ohungarumlaut -40 +KPX J omacron -40 +KPX J oslash -40 +KPX J otilde -40 +KPX J period -10 +KPX J u -40 +KPX J uacute -40 +KPX J ucircumflex -40 +KPX J udieresis -40 +KPX J ugrave -40 +KPX J uhungarumlaut -40 +KPX J umacron -40 +KPX J uogonek -40 +KPX J uring -40 +KPX K O -30 +KPX K Oacute -30 +KPX K Ocircumflex -30 +KPX K Odieresis -30 +KPX K Ograve -30 +KPX K Ohungarumlaut -30 +KPX K Omacron -30 +KPX K Oslash -30 +KPX K Otilde -30 +KPX K e -25 +KPX K eacute -25 +KPX K ecaron -25 +KPX K ecircumflex -25 +KPX K edieresis -25 +KPX K edotaccent -25 +KPX K egrave -25 +KPX K emacron -25 +KPX K eogonek -25 +KPX K o -25 +KPX K oacute -25 +KPX K ocircumflex -25 +KPX K odieresis -25 +KPX K ograve -25 +KPX K ohungarumlaut -25 +KPX K omacron -25 +KPX K oslash -25 +KPX K otilde -25 +KPX K u -20 +KPX K uacute -20 +KPX K ucircumflex -20 +KPX K udieresis -20 +KPX K ugrave -20 +KPX K uhungarumlaut -20 +KPX K umacron -20 +KPX K uogonek -20 +KPX K uring -20 +KPX K y -20 +KPX K yacute -20 +KPX K ydieresis -20 +KPX Kcommaaccent O -30 +KPX Kcommaaccent Oacute -30 +KPX Kcommaaccent Ocircumflex -30 +KPX Kcommaaccent Odieresis -30 +KPX Kcommaaccent Ograve -30 +KPX Kcommaaccent Ohungarumlaut -30 +KPX Kcommaaccent Omacron -30 +KPX Kcommaaccent Oslash -30 +KPX Kcommaaccent Otilde -30 +KPX Kcommaaccent e -25 +KPX Kcommaaccent eacute -25 +KPX Kcommaaccent ecaron -25 +KPX Kcommaaccent ecircumflex -25 +KPX Kcommaaccent edieresis -25 +KPX Kcommaaccent edotaccent -25 +KPX Kcommaaccent egrave -25 +KPX Kcommaaccent emacron -25 +KPX Kcommaaccent eogonek -25 +KPX Kcommaaccent o -25 +KPX Kcommaaccent oacute -25 +KPX Kcommaaccent ocircumflex -25 +KPX Kcommaaccent odieresis -25 +KPX Kcommaaccent ograve -25 +KPX Kcommaaccent ohungarumlaut -25 +KPX Kcommaaccent omacron -25 +KPX Kcommaaccent oslash -25 +KPX Kcommaaccent otilde -25 +KPX Kcommaaccent u -20 +KPX Kcommaaccent uacute -20 +KPX Kcommaaccent ucircumflex -20 +KPX Kcommaaccent udieresis -20 +KPX Kcommaaccent ugrave -20 +KPX Kcommaaccent uhungarumlaut -20 +KPX Kcommaaccent umacron -20 +KPX Kcommaaccent uogonek -20 +KPX Kcommaaccent uring -20 +KPX Kcommaaccent y -20 +KPX Kcommaaccent yacute -20 +KPX Kcommaaccent ydieresis -20 +KPX L T -18 +KPX L Tcaron -18 +KPX L Tcommaaccent -18 +KPX L V -37 +KPX L W -37 +KPX L Y -37 +KPX L Yacute -37 +KPX L Ydieresis -37 +KPX L quoteright -55 +KPX L y -37 +KPX L yacute -37 +KPX L ydieresis -37 +KPX Lacute T -18 +KPX Lacute Tcaron -18 +KPX Lacute Tcommaaccent -18 +KPX Lacute V -37 +KPX Lacute W -37 +KPX Lacute Y -37 +KPX Lacute Yacute -37 +KPX Lacute Ydieresis -37 +KPX Lacute quoteright -55 +KPX Lacute y -37 +KPX Lacute yacute -37 +KPX Lacute ydieresis -37 +KPX Lcommaaccent T -18 +KPX Lcommaaccent Tcaron -18 +KPX Lcommaaccent Tcommaaccent -18 +KPX Lcommaaccent V -37 +KPX Lcommaaccent W -37 +KPX Lcommaaccent Y -37 +KPX Lcommaaccent Yacute -37 +KPX Lcommaaccent Ydieresis -37 +KPX Lcommaaccent quoteright -55 +KPX Lcommaaccent y -37 +KPX Lcommaaccent yacute -37 +KPX Lcommaaccent ydieresis -37 +KPX Lslash T -18 +KPX Lslash Tcaron -18 +KPX Lslash Tcommaaccent -18 +KPX Lslash V -37 +KPX Lslash W -37 +KPX Lslash Y -37 +KPX Lslash Yacute -37 +KPX Lslash Ydieresis -37 +KPX Lslash quoteright -55 +KPX Lslash y -37 +KPX Lslash yacute -37 +KPX Lslash ydieresis -37 +KPX N A -30 +KPX N Aacute -30 +KPX N Abreve -30 +KPX N Acircumflex -30 +KPX N Adieresis -30 +KPX N Agrave -30 +KPX N Amacron -30 +KPX N Aogonek -30 +KPX N Aring -30 +KPX N Atilde -30 +KPX Nacute A -30 +KPX Nacute Aacute -30 +KPX Nacute Abreve -30 +KPX Nacute Acircumflex -30 +KPX Nacute Adieresis -30 +KPX Nacute Agrave -30 +KPX Nacute Amacron -30 +KPX Nacute Aogonek -30 +KPX Nacute Aring -30 +KPX Nacute Atilde -30 +KPX Ncaron A -30 +KPX Ncaron Aacute -30 +KPX Ncaron Abreve -30 +KPX Ncaron Acircumflex -30 +KPX Ncaron Adieresis -30 +KPX Ncaron Agrave -30 +KPX Ncaron Amacron -30 +KPX Ncaron Aogonek -30 +KPX Ncaron Aring -30 +KPX Ncaron Atilde -30 +KPX Ncommaaccent A -30 +KPX Ncommaaccent Aacute -30 +KPX Ncommaaccent Abreve -30 +KPX Ncommaaccent Acircumflex -30 +KPX Ncommaaccent Adieresis -30 +KPX Ncommaaccent Agrave -30 +KPX Ncommaaccent Amacron -30 +KPX Ncommaaccent Aogonek -30 +KPX Ncommaaccent Aring -30 +KPX Ncommaaccent Atilde -30 +KPX Ntilde A -30 +KPX Ntilde Aacute -30 +KPX Ntilde Abreve -30 +KPX Ntilde Acircumflex -30 +KPX Ntilde Adieresis -30 +KPX Ntilde Agrave -30 +KPX Ntilde Amacron -30 +KPX Ntilde Aogonek -30 +KPX Ntilde Aring -30 +KPX Ntilde Atilde -30 +KPX O A -40 +KPX O Aacute -40 +KPX O Abreve -40 +KPX O Acircumflex -40 +KPX O Adieresis -40 +KPX O Agrave -40 +KPX O Amacron -40 +KPX O Aogonek -40 +KPX O Aring -40 +KPX O Atilde -40 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -50 +KPX O X -40 +KPX O Y -50 +KPX O Yacute -50 +KPX O Ydieresis -50 +KPX Oacute A -40 +KPX Oacute Aacute -40 +KPX Oacute Abreve -40 +KPX Oacute Acircumflex -40 +KPX Oacute Adieresis -40 +KPX Oacute Agrave -40 +KPX Oacute Amacron -40 +KPX Oacute Aogonek -40 +KPX Oacute Aring -40 +KPX Oacute Atilde -40 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -50 +KPX Oacute X -40 +KPX Oacute Y -50 +KPX Oacute Yacute -50 +KPX Oacute Ydieresis -50 +KPX Ocircumflex A -40 +KPX Ocircumflex Aacute -40 +KPX Ocircumflex Abreve -40 +KPX Ocircumflex Acircumflex -40 +KPX Ocircumflex Adieresis -40 +KPX Ocircumflex Agrave -40 +KPX Ocircumflex Amacron -40 +KPX Ocircumflex Aogonek -40 +KPX Ocircumflex Aring -40 +KPX Ocircumflex Atilde -40 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -50 +KPX Ocircumflex X -40 +KPX Ocircumflex Y -50 +KPX Ocircumflex Yacute -50 +KPX Ocircumflex Ydieresis -50 +KPX Odieresis A -40 +KPX Odieresis Aacute -40 +KPX Odieresis Abreve -40 +KPX Odieresis Acircumflex -40 +KPX Odieresis Adieresis -40 +KPX Odieresis Agrave -40 +KPX Odieresis Amacron -40 +KPX Odieresis Aogonek -40 +KPX Odieresis Aring -40 +KPX Odieresis Atilde -40 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -50 +KPX Odieresis X -40 +KPX Odieresis Y -50 +KPX Odieresis Yacute -50 +KPX Odieresis Ydieresis -50 +KPX Ograve A -40 +KPX Ograve Aacute -40 +KPX Ograve Abreve -40 +KPX Ograve Acircumflex -40 +KPX Ograve Adieresis -40 +KPX Ograve Agrave -40 +KPX Ograve Amacron -40 +KPX Ograve Aogonek -40 +KPX Ograve Aring -40 +KPX Ograve Atilde -40 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -50 +KPX Ograve X -40 +KPX Ograve Y -50 +KPX Ograve Yacute -50 +KPX Ograve Ydieresis -50 +KPX Ohungarumlaut A -40 +KPX Ohungarumlaut Aacute -40 +KPX Ohungarumlaut Abreve -40 +KPX Ohungarumlaut Acircumflex -40 +KPX Ohungarumlaut Adieresis -40 +KPX Ohungarumlaut Agrave -40 +KPX Ohungarumlaut Amacron -40 +KPX Ohungarumlaut Aogonek -40 +KPX Ohungarumlaut Aring -40 +KPX Ohungarumlaut Atilde -40 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -50 +KPX Ohungarumlaut X -40 +KPX Ohungarumlaut Y -50 +KPX Ohungarumlaut Yacute -50 +KPX Ohungarumlaut Ydieresis -50 +KPX Omacron A -40 +KPX Omacron Aacute -40 +KPX Omacron Abreve -40 +KPX Omacron Acircumflex -40 +KPX Omacron Adieresis -40 +KPX Omacron Agrave -40 +KPX Omacron Amacron -40 +KPX Omacron Aogonek -40 +KPX Omacron Aring -40 +KPX Omacron Atilde -40 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -50 +KPX Omacron X -40 +KPX Omacron Y -50 +KPX Omacron Yacute -50 +KPX Omacron Ydieresis -50 +KPX Oslash A -40 +KPX Oslash Aacute -40 +KPX Oslash Abreve -40 +KPX Oslash Acircumflex -40 +KPX Oslash Adieresis -40 +KPX Oslash Agrave -40 +KPX Oslash Amacron -40 +KPX Oslash Aogonek -40 +KPX Oslash Aring -40 +KPX Oslash Atilde -40 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -50 +KPX Oslash X -40 +KPX Oslash Y -50 +KPX Oslash Yacute -50 +KPX Oslash Ydieresis -50 +KPX Otilde A -40 +KPX Otilde Aacute -40 +KPX Otilde Abreve -40 +KPX Otilde Acircumflex -40 +KPX Otilde Adieresis -40 +KPX Otilde Agrave -40 +KPX Otilde Amacron -40 +KPX Otilde Aogonek -40 +KPX Otilde Aring -40 +KPX Otilde Atilde -40 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -50 +KPX Otilde X -40 +KPX Otilde Y -50 +KPX Otilde Yacute -50 +KPX Otilde Ydieresis -50 +KPX P A -85 +KPX P Aacute -85 +KPX P Abreve -85 +KPX P Acircumflex -85 +KPX P Adieresis -85 +KPX P Agrave -85 +KPX P Amacron -85 +KPX P Aogonek -85 +KPX P Aring -85 +KPX P Atilde -85 +KPX P a -40 +KPX P aacute -40 +KPX P abreve -40 +KPX P acircumflex -40 +KPX P adieresis -40 +KPX P agrave -40 +KPX P amacron -40 +KPX P aogonek -40 +KPX P aring -40 +KPX P atilde -40 +KPX P comma -129 +KPX P e -50 +KPX P eacute -50 +KPX P ecaron -50 +KPX P ecircumflex -50 +KPX P edieresis -50 +KPX P edotaccent -50 +KPX P egrave -50 +KPX P emacron -50 +KPX P eogonek -50 +KPX P o -55 +KPX P oacute -55 +KPX P ocircumflex -55 +KPX P odieresis -55 +KPX P ograve -55 +KPX P ohungarumlaut -55 +KPX P omacron -55 +KPX P oslash -55 +KPX P otilde -55 +KPX P period -129 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX R O -40 +KPX R Oacute -40 +KPX R Ocircumflex -40 +KPX R Odieresis -40 +KPX R Ograve -40 +KPX R Ohungarumlaut -40 +KPX R Omacron -40 +KPX R Oslash -40 +KPX R Otilde -40 +KPX R T -30 +KPX R Tcaron -30 +KPX R Tcommaaccent -30 +KPX R U -40 +KPX R Uacute -40 +KPX R Ucircumflex -40 +KPX R Udieresis -40 +KPX R Ugrave -40 +KPX R Uhungarumlaut -40 +KPX R Umacron -40 +KPX R Uogonek -40 +KPX R Uring -40 +KPX R V -18 +KPX R W -18 +KPX R Y -18 +KPX R Yacute -18 +KPX R Ydieresis -18 +KPX Racute O -40 +KPX Racute Oacute -40 +KPX Racute Ocircumflex -40 +KPX Racute Odieresis -40 +KPX Racute Ograve -40 +KPX Racute Ohungarumlaut -40 +KPX Racute Omacron -40 +KPX Racute Oslash -40 +KPX Racute Otilde -40 +KPX Racute T -30 +KPX Racute Tcaron -30 +KPX Racute Tcommaaccent -30 +KPX Racute U -40 +KPX Racute Uacute -40 +KPX Racute Ucircumflex -40 +KPX Racute Udieresis -40 +KPX Racute Ugrave -40 +KPX Racute Uhungarumlaut -40 +KPX Racute Umacron -40 +KPX Racute Uogonek -40 +KPX Racute Uring -40 +KPX Racute V -18 +KPX Racute W -18 +KPX Racute Y -18 +KPX Racute Yacute -18 +KPX Racute Ydieresis -18 +KPX Rcaron O -40 +KPX Rcaron Oacute -40 +KPX Rcaron Ocircumflex -40 +KPX Rcaron Odieresis -40 +KPX Rcaron Ograve -40 +KPX Rcaron Ohungarumlaut -40 +KPX Rcaron Omacron -40 +KPX Rcaron Oslash -40 +KPX Rcaron Otilde -40 +KPX Rcaron T -30 +KPX Rcaron Tcaron -30 +KPX Rcaron Tcommaaccent -30 +KPX Rcaron U -40 +KPX Rcaron Uacute -40 +KPX Rcaron Ucircumflex -40 +KPX Rcaron Udieresis -40 +KPX Rcaron Ugrave -40 +KPX Rcaron Uhungarumlaut -40 +KPX Rcaron Umacron -40 +KPX Rcaron Uogonek -40 +KPX Rcaron Uring -40 +KPX Rcaron V -18 +KPX Rcaron W -18 +KPX Rcaron Y -18 +KPX Rcaron Yacute -18 +KPX Rcaron Ydieresis -18 +KPX Rcommaaccent O -40 +KPX Rcommaaccent Oacute -40 +KPX Rcommaaccent Ocircumflex -40 +KPX Rcommaaccent Odieresis -40 +KPX Rcommaaccent Ograve -40 +KPX Rcommaaccent Ohungarumlaut -40 +KPX Rcommaaccent Omacron -40 +KPX Rcommaaccent Oslash -40 +KPX Rcommaaccent Otilde -40 +KPX Rcommaaccent T -30 +KPX Rcommaaccent Tcaron -30 +KPX Rcommaaccent Tcommaaccent -30 +KPX Rcommaaccent U -40 +KPX Rcommaaccent Uacute -40 +KPX Rcommaaccent Ucircumflex -40 +KPX Rcommaaccent Udieresis -40 +KPX Rcommaaccent Ugrave -40 +KPX Rcommaaccent Uhungarumlaut -40 +KPX Rcommaaccent Umacron -40 +KPX Rcommaaccent Uogonek -40 +KPX Rcommaaccent Uring -40 +KPX Rcommaaccent V -18 +KPX Rcommaaccent W -18 +KPX Rcommaaccent Y -18 +KPX Rcommaaccent Yacute -18 +KPX Rcommaaccent Ydieresis -18 +KPX T A -55 +KPX T Aacute -55 +KPX T Abreve -55 +KPX T Acircumflex -55 +KPX T Adieresis -55 +KPX T Agrave -55 +KPX T Amacron -55 +KPX T Aogonek -55 +KPX T Aring -55 +KPX T Atilde -55 +KPX T O -18 +KPX T Oacute -18 +KPX T Ocircumflex -18 +KPX T Odieresis -18 +KPX T Ograve -18 +KPX T Ohungarumlaut -18 +KPX T Omacron -18 +KPX T Oslash -18 +KPX T Otilde -18 +KPX T a -92 +KPX T aacute -92 +KPX T abreve -92 +KPX T acircumflex -92 +KPX T adieresis -92 +KPX T agrave -92 +KPX T amacron -92 +KPX T aogonek -92 +KPX T aring -92 +KPX T atilde -92 +KPX T colon -74 +KPX T comma -92 +KPX T e -92 +KPX T eacute -92 +KPX T ecaron -92 +KPX T ecircumflex -92 +KPX T edieresis -52 +KPX T edotaccent -92 +KPX T egrave -52 +KPX T emacron -52 +KPX T eogonek -92 +KPX T hyphen -92 +KPX T i -37 +KPX T iacute -37 +KPX T iogonek -37 +KPX T o -95 +KPX T oacute -95 +KPX T ocircumflex -95 +KPX T odieresis -95 +KPX T ograve -95 +KPX T ohungarumlaut -95 +KPX T omacron -95 +KPX T oslash -95 +KPX T otilde -95 +KPX T period -92 +KPX T r -37 +KPX T racute -37 +KPX T rcaron -37 +KPX T rcommaaccent -37 +KPX T semicolon -74 +KPX T u -37 +KPX T uacute -37 +KPX T ucircumflex -37 +KPX T udieresis -37 +KPX T ugrave -37 +KPX T uhungarumlaut -37 +KPX T umacron -37 +KPX T uogonek -37 +KPX T uring -37 +KPX T w -37 +KPX T y -37 +KPX T yacute -37 +KPX T ydieresis -37 +KPX Tcaron A -55 +KPX Tcaron Aacute -55 +KPX Tcaron Abreve -55 +KPX Tcaron Acircumflex -55 +KPX Tcaron Adieresis -55 +KPX Tcaron Agrave -55 +KPX Tcaron Amacron -55 +KPX Tcaron Aogonek -55 +KPX Tcaron Aring -55 +KPX Tcaron Atilde -55 +KPX Tcaron O -18 +KPX Tcaron Oacute -18 +KPX Tcaron Ocircumflex -18 +KPX Tcaron Odieresis -18 +KPX Tcaron Ograve -18 +KPX Tcaron Ohungarumlaut -18 +KPX Tcaron Omacron -18 +KPX Tcaron Oslash -18 +KPX Tcaron Otilde -18 +KPX Tcaron a -92 +KPX Tcaron aacute -92 +KPX Tcaron abreve -92 +KPX Tcaron acircumflex -92 +KPX Tcaron adieresis -92 +KPX Tcaron agrave -92 +KPX Tcaron amacron -92 +KPX Tcaron aogonek -92 +KPX Tcaron aring -92 +KPX Tcaron atilde -92 +KPX Tcaron colon -74 +KPX Tcaron comma -92 +KPX Tcaron e -92 +KPX Tcaron eacute -92 +KPX Tcaron ecaron -92 +KPX Tcaron ecircumflex -92 +KPX Tcaron edieresis -52 +KPX Tcaron edotaccent -92 +KPX Tcaron egrave -52 +KPX Tcaron emacron -52 +KPX Tcaron eogonek -92 +KPX Tcaron hyphen -92 +KPX Tcaron i -37 +KPX Tcaron iacute -37 +KPX Tcaron iogonek -37 +KPX Tcaron o -95 +KPX Tcaron oacute -95 +KPX Tcaron ocircumflex -95 +KPX Tcaron odieresis -95 +KPX Tcaron ograve -95 +KPX Tcaron ohungarumlaut -95 +KPX Tcaron omacron -95 +KPX Tcaron oslash -95 +KPX Tcaron otilde -95 +KPX Tcaron period -92 +KPX Tcaron r -37 +KPX Tcaron racute -37 +KPX Tcaron rcaron -37 +KPX Tcaron rcommaaccent -37 +KPX Tcaron semicolon -74 +KPX Tcaron u -37 +KPX Tcaron uacute -37 +KPX Tcaron ucircumflex -37 +KPX Tcaron udieresis -37 +KPX Tcaron ugrave -37 +KPX Tcaron uhungarumlaut -37 +KPX Tcaron umacron -37 +KPX Tcaron uogonek -37 +KPX Tcaron uring -37 +KPX Tcaron w -37 +KPX Tcaron y -37 +KPX Tcaron yacute -37 +KPX Tcaron ydieresis -37 +KPX Tcommaaccent A -55 +KPX Tcommaaccent Aacute -55 +KPX Tcommaaccent Abreve -55 +KPX Tcommaaccent Acircumflex -55 +KPX Tcommaaccent Adieresis -55 +KPX Tcommaaccent Agrave -55 +KPX Tcommaaccent Amacron -55 +KPX Tcommaaccent Aogonek -55 +KPX Tcommaaccent Aring -55 +KPX Tcommaaccent Atilde -55 +KPX Tcommaaccent O -18 +KPX Tcommaaccent Oacute -18 +KPX Tcommaaccent Ocircumflex -18 +KPX Tcommaaccent Odieresis -18 +KPX Tcommaaccent Ograve -18 +KPX Tcommaaccent Ohungarumlaut -18 +KPX Tcommaaccent Omacron -18 +KPX Tcommaaccent Oslash -18 +KPX Tcommaaccent Otilde -18 +KPX Tcommaaccent a -92 +KPX Tcommaaccent aacute -92 +KPX Tcommaaccent abreve -92 +KPX Tcommaaccent acircumflex -92 +KPX Tcommaaccent adieresis -92 +KPX Tcommaaccent agrave -92 +KPX Tcommaaccent amacron -92 +KPX Tcommaaccent aogonek -92 +KPX Tcommaaccent aring -92 +KPX Tcommaaccent atilde -92 +KPX Tcommaaccent colon -74 +KPX Tcommaaccent comma -92 +KPX Tcommaaccent e -92 +KPX Tcommaaccent eacute -92 +KPX Tcommaaccent ecaron -92 +KPX Tcommaaccent ecircumflex -92 +KPX Tcommaaccent edieresis -52 +KPX Tcommaaccent edotaccent -92 +KPX Tcommaaccent egrave -52 +KPX Tcommaaccent emacron -52 +KPX Tcommaaccent eogonek -92 +KPX Tcommaaccent hyphen -92 +KPX Tcommaaccent i -37 +KPX Tcommaaccent iacute -37 +KPX Tcommaaccent iogonek -37 +KPX Tcommaaccent o -95 +KPX Tcommaaccent oacute -95 +KPX Tcommaaccent ocircumflex -95 +KPX Tcommaaccent odieresis -95 +KPX Tcommaaccent ograve -95 +KPX Tcommaaccent ohungarumlaut -95 +KPX Tcommaaccent omacron -95 +KPX Tcommaaccent oslash -95 +KPX Tcommaaccent otilde -95 +KPX Tcommaaccent period -92 +KPX Tcommaaccent r -37 +KPX Tcommaaccent racute -37 +KPX Tcommaaccent rcaron -37 +KPX Tcommaaccent rcommaaccent -37 +KPX Tcommaaccent semicolon -74 +KPX Tcommaaccent u -37 +KPX Tcommaaccent uacute -37 +KPX Tcommaaccent ucircumflex -37 +KPX Tcommaaccent udieresis -37 +KPX Tcommaaccent ugrave -37 +KPX Tcommaaccent uhungarumlaut -37 +KPX Tcommaaccent umacron -37 +KPX Tcommaaccent uogonek -37 +KPX Tcommaaccent uring -37 +KPX Tcommaaccent w -37 +KPX Tcommaaccent y -37 +KPX Tcommaaccent yacute -37 +KPX Tcommaaccent ydieresis -37 +KPX U A -45 +KPX U Aacute -45 +KPX U Abreve -45 +KPX U Acircumflex -45 +KPX U Adieresis -45 +KPX U Agrave -45 +KPX U Amacron -45 +KPX U Aogonek -45 +KPX U Aring -45 +KPX U Atilde -45 +KPX Uacute A -45 +KPX Uacute Aacute -45 +KPX Uacute Abreve -45 +KPX Uacute Acircumflex -45 +KPX Uacute Adieresis -45 +KPX Uacute Agrave -45 +KPX Uacute Amacron -45 +KPX Uacute Aogonek -45 +KPX Uacute Aring -45 +KPX Uacute Atilde -45 +KPX Ucircumflex A -45 +KPX Ucircumflex Aacute -45 +KPX Ucircumflex Abreve -45 +KPX Ucircumflex Acircumflex -45 +KPX Ucircumflex Adieresis -45 +KPX Ucircumflex Agrave -45 +KPX Ucircumflex Amacron -45 +KPX Ucircumflex Aogonek -45 +KPX Ucircumflex Aring -45 +KPX Ucircumflex Atilde -45 +KPX Udieresis A -45 +KPX Udieresis Aacute -45 +KPX Udieresis Abreve -45 +KPX Udieresis Acircumflex -45 +KPX Udieresis Adieresis -45 +KPX Udieresis Agrave -45 +KPX Udieresis Amacron -45 +KPX Udieresis Aogonek -45 +KPX Udieresis Aring -45 +KPX Udieresis Atilde -45 +KPX Ugrave A -45 +KPX Ugrave Aacute -45 +KPX Ugrave Abreve -45 +KPX Ugrave Acircumflex -45 +KPX Ugrave Adieresis -45 +KPX Ugrave Agrave -45 +KPX Ugrave Amacron -45 +KPX Ugrave Aogonek -45 +KPX Ugrave Aring -45 +KPX Ugrave Atilde -45 +KPX Uhungarumlaut A -45 +KPX Uhungarumlaut Aacute -45 +KPX Uhungarumlaut Abreve -45 +KPX Uhungarumlaut Acircumflex -45 +KPX Uhungarumlaut Adieresis -45 +KPX Uhungarumlaut Agrave -45 +KPX Uhungarumlaut Amacron -45 +KPX Uhungarumlaut Aogonek -45 +KPX Uhungarumlaut Aring -45 +KPX Uhungarumlaut Atilde -45 +KPX Umacron A -45 +KPX Umacron Aacute -45 +KPX Umacron Abreve -45 +KPX Umacron Acircumflex -45 +KPX Umacron Adieresis -45 +KPX Umacron Agrave -45 +KPX Umacron Amacron -45 +KPX Umacron Aogonek -45 +KPX Umacron Aring -45 +KPX Umacron Atilde -45 +KPX Uogonek A -45 +KPX Uogonek Aacute -45 +KPX Uogonek Abreve -45 +KPX Uogonek Acircumflex -45 +KPX Uogonek Adieresis -45 +KPX Uogonek Agrave -45 +KPX Uogonek Amacron -45 +KPX Uogonek Aogonek -45 +KPX Uogonek Aring -45 +KPX Uogonek Atilde -45 +KPX Uring A -45 +KPX Uring Aacute -45 +KPX Uring Abreve -45 +KPX Uring Acircumflex -45 +KPX Uring Adieresis -45 +KPX Uring Agrave -45 +KPX Uring Amacron -45 +KPX Uring Aogonek -45 +KPX Uring Aring -45 +KPX Uring Atilde -45 +KPX V A -85 +KPX V Aacute -85 +KPX V Abreve -85 +KPX V Acircumflex -85 +KPX V Adieresis -85 +KPX V Agrave -85 +KPX V Amacron -85 +KPX V Aogonek -85 +KPX V Aring -85 +KPX V Atilde -85 +KPX V G -10 +KPX V Gbreve -10 +KPX V Gcommaaccent -10 +KPX V O -30 +KPX V Oacute -30 +KPX V Ocircumflex -30 +KPX V Odieresis -30 +KPX V Ograve -30 +KPX V Ohungarumlaut -30 +KPX V Omacron -30 +KPX V Oslash -30 +KPX V Otilde -30 +KPX V a -111 +KPX V aacute -111 +KPX V abreve -111 +KPX V acircumflex -111 +KPX V adieresis -111 +KPX V agrave -111 +KPX V amacron -111 +KPX V aogonek -111 +KPX V aring -111 +KPX V atilde -111 +KPX V colon -74 +KPX V comma -129 +KPX V e -111 +KPX V eacute -111 +KPX V ecaron -111 +KPX V ecircumflex -111 +KPX V edieresis -71 +KPX V edotaccent -111 +KPX V egrave -71 +KPX V emacron -71 +KPX V eogonek -111 +KPX V hyphen -70 +KPX V i -55 +KPX V iacute -55 +KPX V iogonek -55 +KPX V o -111 +KPX V oacute -111 +KPX V ocircumflex -111 +KPX V odieresis -111 +KPX V ograve -111 +KPX V ohungarumlaut -111 +KPX V omacron -111 +KPX V oslash -111 +KPX V otilde -111 +KPX V period -129 +KPX V semicolon -74 +KPX V u -55 +KPX V uacute -55 +KPX V ucircumflex -55 +KPX V udieresis -55 +KPX V ugrave -55 +KPX V uhungarumlaut -55 +KPX V umacron -55 +KPX V uogonek -55 +KPX V uring -55 +KPX W A -74 +KPX W Aacute -74 +KPX W Abreve -74 +KPX W Acircumflex -74 +KPX W Adieresis -74 +KPX W Agrave -74 +KPX W Amacron -74 +KPX W Aogonek -74 +KPX W Aring -74 +KPX W Atilde -74 +KPX W O -15 +KPX W Oacute -15 +KPX W Ocircumflex -15 +KPX W Odieresis -15 +KPX W Ograve -15 +KPX W Ohungarumlaut -15 +KPX W Omacron -15 +KPX W Oslash -15 +KPX W Otilde -15 +KPX W a -85 +KPX W aacute -85 +KPX W abreve -85 +KPX W acircumflex -85 +KPX W adieresis -85 +KPX W agrave -85 +KPX W amacron -85 +KPX W aogonek -85 +KPX W aring -85 +KPX W atilde -85 +KPX W colon -55 +KPX W comma -74 +KPX W e -90 +KPX W eacute -90 +KPX W ecaron -90 +KPX W ecircumflex -90 +KPX W edieresis -50 +KPX W edotaccent -90 +KPX W egrave -50 +KPX W emacron -50 +KPX W eogonek -90 +KPX W hyphen -50 +KPX W i -37 +KPX W iacute -37 +KPX W iogonek -37 +KPX W o -80 +KPX W oacute -80 +KPX W ocircumflex -80 +KPX W odieresis -80 +KPX W ograve -80 +KPX W ohungarumlaut -80 +KPX W omacron -80 +KPX W oslash -80 +KPX W otilde -80 +KPX W period -74 +KPX W semicolon -55 +KPX W u -55 +KPX W uacute -55 +KPX W ucircumflex -55 +KPX W udieresis -55 +KPX W ugrave -55 +KPX W uhungarumlaut -55 +KPX W umacron -55 +KPX W uogonek -55 +KPX W uring -55 +KPX W y -55 +KPX W yacute -55 +KPX W ydieresis -55 +KPX Y A -74 +KPX Y Aacute -74 +KPX Y Abreve -74 +KPX Y Acircumflex -74 +KPX Y Adieresis -74 +KPX Y Agrave -74 +KPX Y Amacron -74 +KPX Y Aogonek -74 +KPX Y Aring -74 +KPX Y Atilde -74 +KPX Y O -25 +KPX Y Oacute -25 +KPX Y Ocircumflex -25 +KPX Y Odieresis -25 +KPX Y Ograve -25 +KPX Y Ohungarumlaut -25 +KPX Y Omacron -25 +KPX Y Oslash -25 +KPX Y Otilde -25 +KPX Y a -92 +KPX Y aacute -92 +KPX Y abreve -92 +KPX Y acircumflex -92 +KPX Y adieresis -92 +KPX Y agrave -92 +KPX Y amacron -92 +KPX Y aogonek -92 +KPX Y aring -92 +KPX Y atilde -92 +KPX Y colon -92 +KPX Y comma -92 +KPX Y e -111 +KPX Y eacute -111 +KPX Y ecaron -111 +KPX Y ecircumflex -71 +KPX Y edieresis -71 +KPX Y edotaccent -111 +KPX Y egrave -71 +KPX Y emacron -71 +KPX Y eogonek -111 +KPX Y hyphen -92 +KPX Y i -55 +KPX Y iacute -55 +KPX Y iogonek -55 +KPX Y o -111 +KPX Y oacute -111 +KPX Y ocircumflex -111 +KPX Y odieresis -111 +KPX Y ograve -111 +KPX Y ohungarumlaut -111 +KPX Y omacron -111 +KPX Y oslash -111 +KPX Y otilde -111 +KPX Y period -74 +KPX Y semicolon -92 +KPX Y u -92 +KPX Y uacute -92 +KPX Y ucircumflex -92 +KPX Y udieresis -92 +KPX Y ugrave -92 +KPX Y uhungarumlaut -92 +KPX Y umacron -92 +KPX Y uogonek -92 +KPX Y uring -92 +KPX Yacute A -74 +KPX Yacute Aacute -74 +KPX Yacute Abreve -74 +KPX Yacute Acircumflex -74 +KPX Yacute Adieresis -74 +KPX Yacute Agrave -74 +KPX Yacute Amacron -74 +KPX Yacute Aogonek -74 +KPX Yacute Aring -74 +KPX Yacute Atilde -74 +KPX Yacute O -25 +KPX Yacute Oacute -25 +KPX Yacute Ocircumflex -25 +KPX Yacute Odieresis -25 +KPX Yacute Ograve -25 +KPX Yacute Ohungarumlaut -25 +KPX Yacute Omacron -25 +KPX Yacute Oslash -25 +KPX Yacute Otilde -25 +KPX Yacute a -92 +KPX Yacute aacute -92 +KPX Yacute abreve -92 +KPX Yacute acircumflex -92 +KPX Yacute adieresis -92 +KPX Yacute agrave -92 +KPX Yacute amacron -92 +KPX Yacute aogonek -92 +KPX Yacute aring -92 +KPX Yacute atilde -92 +KPX Yacute colon -92 +KPX Yacute comma -92 +KPX Yacute e -111 +KPX Yacute eacute -111 +KPX Yacute ecaron -111 +KPX Yacute ecircumflex -71 +KPX Yacute edieresis -71 +KPX Yacute edotaccent -111 +KPX Yacute egrave -71 +KPX Yacute emacron -71 +KPX Yacute eogonek -111 +KPX Yacute hyphen -92 +KPX Yacute i -55 +KPX Yacute iacute -55 +KPX Yacute iogonek -55 +KPX Yacute o -111 +KPX Yacute oacute -111 +KPX Yacute ocircumflex -111 +KPX Yacute odieresis -111 +KPX Yacute ograve -111 +KPX Yacute ohungarumlaut -111 +KPX Yacute omacron -111 +KPX Yacute oslash -111 +KPX Yacute otilde -111 +KPX Yacute period -74 +KPX Yacute semicolon -92 +KPX Yacute u -92 +KPX Yacute uacute -92 +KPX Yacute ucircumflex -92 +KPX Yacute udieresis -92 +KPX Yacute ugrave -92 +KPX Yacute uhungarumlaut -92 +KPX Yacute umacron -92 +KPX Yacute uogonek -92 +KPX Yacute uring -92 +KPX Ydieresis A -74 +KPX Ydieresis Aacute -74 +KPX Ydieresis Abreve -74 +KPX Ydieresis Acircumflex -74 +KPX Ydieresis Adieresis -74 +KPX Ydieresis Agrave -74 +KPX Ydieresis Amacron -74 +KPX Ydieresis Aogonek -74 +KPX Ydieresis Aring -74 +KPX Ydieresis Atilde -74 +KPX Ydieresis O -25 +KPX Ydieresis Oacute -25 +KPX Ydieresis Ocircumflex -25 +KPX Ydieresis Odieresis -25 +KPX Ydieresis Ograve -25 +KPX Ydieresis Ohungarumlaut -25 +KPX Ydieresis Omacron -25 +KPX Ydieresis Oslash -25 +KPX Ydieresis Otilde -25 +KPX Ydieresis a -92 +KPX Ydieresis aacute -92 +KPX Ydieresis abreve -92 +KPX Ydieresis acircumflex -92 +KPX Ydieresis adieresis -92 +KPX Ydieresis agrave -92 +KPX Ydieresis amacron -92 +KPX Ydieresis aogonek -92 +KPX Ydieresis aring -92 +KPX Ydieresis atilde -92 +KPX Ydieresis colon -92 +KPX Ydieresis comma -92 +KPX Ydieresis e -111 +KPX Ydieresis eacute -111 +KPX Ydieresis ecaron -111 +KPX Ydieresis ecircumflex -71 +KPX Ydieresis edieresis -71 +KPX Ydieresis edotaccent -111 +KPX Ydieresis egrave -71 +KPX Ydieresis emacron -71 +KPX Ydieresis eogonek -111 +KPX Ydieresis hyphen -92 +KPX Ydieresis i -55 +KPX Ydieresis iacute -55 +KPX Ydieresis iogonek -55 +KPX Ydieresis o -111 +KPX Ydieresis oacute -111 +KPX Ydieresis ocircumflex -111 +KPX Ydieresis odieresis -111 +KPX Ydieresis ograve -111 +KPX Ydieresis ohungarumlaut -111 +KPX Ydieresis omacron -111 +KPX Ydieresis oslash -111 +KPX Ydieresis otilde -111 +KPX Ydieresis period -74 +KPX Ydieresis semicolon -92 +KPX Ydieresis u -92 +KPX Ydieresis uacute -92 +KPX Ydieresis ucircumflex -92 +KPX Ydieresis udieresis -92 +KPX Ydieresis ugrave -92 +KPX Ydieresis uhungarumlaut -92 +KPX Ydieresis umacron -92 +KPX Ydieresis uogonek -92 +KPX Ydieresis uring -92 +KPX b b -10 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX c h -10 +KPX c k -10 +KPX c kcommaaccent -10 +KPX cacute h -10 +KPX cacute k -10 +KPX cacute kcommaaccent -10 +KPX ccaron h -10 +KPX ccaron k -10 +KPX ccaron kcommaaccent -10 +KPX ccedilla h -10 +KPX ccedilla k -10 +KPX ccedilla kcommaaccent -10 +KPX comma quotedblright -95 +KPX comma quoteright -95 +KPX e b -10 +KPX eacute b -10 +KPX ecaron b -10 +KPX ecircumflex b -10 +KPX edieresis b -10 +KPX edotaccent b -10 +KPX egrave b -10 +KPX emacron b -10 +KPX eogonek b -10 +KPX f comma -10 +KPX f dotlessi -30 +KPX f e -10 +KPX f eacute -10 +KPX f edotaccent -10 +KPX f eogonek -10 +KPX f f -18 +KPX f o -10 +KPX f oacute -10 +KPX f ocircumflex -10 +KPX f ograve -10 +KPX f ohungarumlaut -10 +KPX f oslash -10 +KPX f otilde -10 +KPX f period -10 +KPX f quoteright 55 +KPX k e -30 +KPX k eacute -30 +KPX k ecaron -30 +KPX k ecircumflex -30 +KPX k edieresis -30 +KPX k edotaccent -30 +KPX k egrave -30 +KPX k emacron -30 +KPX k eogonek -30 +KPX k o -10 +KPX k oacute -10 +KPX k ocircumflex -10 +KPX k odieresis -10 +KPX k ograve -10 +KPX k ohungarumlaut -10 +KPX k omacron -10 +KPX k oslash -10 +KPX k otilde -10 +KPX kcommaaccent e -30 +KPX kcommaaccent eacute -30 +KPX kcommaaccent ecaron -30 +KPX kcommaaccent ecircumflex -30 +KPX kcommaaccent edieresis -30 +KPX kcommaaccent edotaccent -30 +KPX kcommaaccent egrave -30 +KPX kcommaaccent emacron -30 +KPX kcommaaccent eogonek -30 +KPX kcommaaccent o -10 +KPX kcommaaccent oacute -10 +KPX kcommaaccent ocircumflex -10 +KPX kcommaaccent odieresis -10 +KPX kcommaaccent ograve -10 +KPX kcommaaccent ohungarumlaut -10 +KPX kcommaaccent omacron -10 +KPX kcommaaccent oslash -10 +KPX kcommaaccent otilde -10 +KPX n v -40 +KPX nacute v -40 +KPX ncaron v -40 +KPX ncommaaccent v -40 +KPX ntilde v -40 +KPX o v -15 +KPX o w -25 +KPX o x -10 +KPX o y -10 +KPX o yacute -10 +KPX o ydieresis -10 +KPX oacute v -15 +KPX oacute w -25 +KPX oacute x -10 +KPX oacute y -10 +KPX oacute yacute -10 +KPX oacute ydieresis -10 +KPX ocircumflex v -15 +KPX ocircumflex w -25 +KPX ocircumflex x -10 +KPX ocircumflex y -10 +KPX ocircumflex yacute -10 +KPX ocircumflex ydieresis -10 +KPX odieresis v -15 +KPX odieresis w -25 +KPX odieresis x -10 +KPX odieresis y -10 +KPX odieresis yacute -10 +KPX odieresis ydieresis -10 +KPX ograve v -15 +KPX ograve w -25 +KPX ograve x -10 +KPX ograve y -10 +KPX ograve yacute -10 +KPX ograve ydieresis -10 +KPX ohungarumlaut v -15 +KPX ohungarumlaut w -25 +KPX ohungarumlaut x -10 +KPX ohungarumlaut y -10 +KPX ohungarumlaut yacute -10 +KPX ohungarumlaut ydieresis -10 +KPX omacron v -15 +KPX omacron w -25 +KPX omacron x -10 +KPX omacron y -10 +KPX omacron yacute -10 +KPX omacron ydieresis -10 +KPX oslash v -15 +KPX oslash w -25 +KPX oslash x -10 +KPX oslash y -10 +KPX oslash yacute -10 +KPX oslash ydieresis -10 +KPX otilde v -15 +KPX otilde w -25 +KPX otilde x -10 +KPX otilde y -10 +KPX otilde yacute -10 +KPX otilde ydieresis -10 +KPX period quotedblright -95 +KPX period quoteright -95 +KPX quoteleft quoteleft -74 +KPX quoteright d -15 +KPX quoteright dcroat -15 +KPX quoteright quoteright -74 +KPX quoteright r -15 +KPX quoteright racute -15 +KPX quoteright rcaron -15 +KPX quoteright rcommaaccent -15 +KPX quoteright s -74 +KPX quoteright sacute -74 +KPX quoteright scaron -74 +KPX quoteright scedilla -74 +KPX quoteright scommaaccent -74 +KPX quoteright space -74 +KPX quoteright t -37 +KPX quoteright tcommaaccent -37 +KPX quoteright v -15 +KPX r comma -65 +KPX r period -65 +KPX racute comma -65 +KPX racute period -65 +KPX rcaron comma -65 +KPX rcaron period -65 +KPX rcommaaccent comma -65 +KPX rcommaaccent period -65 +KPX space A -37 +KPX space Aacute -37 +KPX space Abreve -37 +KPX space Acircumflex -37 +KPX space Adieresis -37 +KPX space Agrave -37 +KPX space Amacron -37 +KPX space Aogonek -37 +KPX space Aring -37 +KPX space Atilde -37 +KPX space V -70 +KPX space W -70 +KPX space Y -70 +KPX space Yacute -70 +KPX space Ydieresis -70 +KPX v comma -37 +KPX v e -15 +KPX v eacute -15 +KPX v ecaron -15 +KPX v ecircumflex -15 +KPX v edieresis -15 +KPX v edotaccent -15 +KPX v egrave -15 +KPX v emacron -15 +KPX v eogonek -15 +KPX v o -15 +KPX v oacute -15 +KPX v ocircumflex -15 +KPX v odieresis -15 +KPX v ograve -15 +KPX v ohungarumlaut -15 +KPX v omacron -15 +KPX v oslash -15 +KPX v otilde -15 +KPX v period -37 +KPX w a -10 +KPX w aacute -10 +KPX w abreve -10 +KPX w acircumflex -10 +KPX w adieresis -10 +KPX w agrave -10 +KPX w amacron -10 +KPX w aogonek -10 +KPX w aring -10 +KPX w atilde -10 +KPX w comma -37 +KPX w e -10 +KPX w eacute -10 +KPX w ecaron -10 +KPX w ecircumflex -10 +KPX w edieresis -10 +KPX w edotaccent -10 +KPX w egrave -10 +KPX w emacron -10 +KPX w eogonek -10 +KPX w o -15 +KPX w oacute -15 +KPX w ocircumflex -15 +KPX w odieresis -15 +KPX w ograve -15 +KPX w ohungarumlaut -15 +KPX w omacron -15 +KPX w oslash -15 +KPX w otilde -15 +KPX w period -37 +KPX x e -10 +KPX x eacute -10 +KPX x ecaron -10 +KPX x ecircumflex -10 +KPX x edieresis -10 +KPX x edotaccent -10 +KPX x egrave -10 +KPX x emacron -10 +KPX x eogonek -10 +KPX y comma -37 +KPX y period -37 +KPX yacute comma -37 +KPX yacute period -37 +KPX ydieresis comma -37 +KPX ydieresis period -37 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/Times-Italic.afm b/dompdf/vendor/dompdf/dompdf/lib/fonts/Times-Italic.afm new file mode 100644 index 0000000..3c25d77 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/Times-Italic.afm @@ -0,0 +1,2669 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:56:55 1997 +Comment UniqueID 43067 +Comment VMusage 47727 58752 +FontName Times-Italic +FullName Times Italic +FamilyName Times +Weight Medium +ItalicAngle -15.5 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -169 -217 1010 883 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 653 +XHeight 441 +Ascender 683 +Descender -217 +StdHW 32 +StdVW 76 +StartCharMetrics 317 +C 32 ; WX 250 ; N space ; B 0 0 0 0 ; +C 160 ; WX 250 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 39 -11 302 667 ; +C 34 ; WX 420 ; N quotedbl ; B 144 421 432 666 ; +C 35 ; WX 500 ; N numbersign ; B 2 0 540 676 ; +C 36 ; WX 500 ; N dollar ; B 31 -89 497 731 ; +C 37 ; WX 833 ; N percent ; B 79 -13 790 676 ; +C 38 ; WX 778 ; N ampersand ; B 76 -18 723 666 ; +C 146 ; WX 333 ; N quoteright ; B 151 436 290 666 ; +C 40 ; WX 333 ; N parenleft ; B 42 -181 315 669 ; +C 41 ; WX 333 ; N parenright ; B 16 -180 289 669 ; +C 42 ; WX 500 ; N asterisk ; B 128 255 492 666 ; +C 43 ; WX 675 ; N plus ; B 86 0 590 506 ; +C 44 ; WX 250 ; N comma ; B -4 -129 135 101 ; +C 45 ; WX 333 ; N hyphen ; B 49 192 282 255 ; +C 173 ; WX 333 ; N hyphen ; B 49 192 282 255 ; +C 46 ; WX 250 ; N period ; B 27 -11 138 100 ; +C 47 ; WX 278 ; N slash ; B -65 -18 386 666 ; +C 48 ; WX 500 ; N zero ; B 32 -7 497 676 ; +C 49 ; WX 500 ; N one ; B 49 0 409 676 ; +C 50 ; WX 500 ; N two ; B 12 0 452 676 ; +C 51 ; WX 500 ; N three ; B 15 -7 465 676 ; +C 52 ; WX 500 ; N four ; B 1 0 479 676 ; +C 53 ; WX 500 ; N five ; B 15 -7 491 666 ; +C 54 ; WX 500 ; N six ; B 30 -7 521 686 ; +C 55 ; WX 500 ; N seven ; B 75 -8 537 666 ; +C 56 ; WX 500 ; N eight ; B 30 -7 493 676 ; +C 57 ; WX 500 ; N nine ; B 23 -17 492 676 ; +C 58 ; WX 333 ; N colon ; B 50 -11 261 441 ; +C 59 ; WX 333 ; N semicolon ; B 27 -129 261 441 ; +C 60 ; WX 675 ; N less ; B 84 -8 592 514 ; +C 61 ; WX 675 ; N equal ; B 86 120 590 386 ; +C 62 ; WX 675 ; N greater ; B 84 -8 592 514 ; +C 63 ; WX 500 ; N question ; B 132 -12 472 664 ; +C 64 ; WX 920 ; N at ; B 118 -18 806 666 ; +C 65 ; WX 611 ; N A ; B -51 0 564 668 ; +C 66 ; WX 611 ; N B ; B -8 0 588 653 ; +C 67 ; WX 667 ; N C ; B 66 -18 689 666 ; +C 68 ; WX 722 ; N D ; B -8 0 700 653 ; +C 69 ; WX 611 ; N E ; B -1 0 634 653 ; +C 70 ; WX 611 ; N F ; B 8 0 645 653 ; +C 71 ; WX 722 ; N G ; B 52 -18 722 666 ; +C 72 ; WX 722 ; N H ; B -8 0 767 653 ; +C 73 ; WX 333 ; N I ; B -8 0 384 653 ; +C 74 ; WX 444 ; N J ; B -6 -18 491 653 ; +C 75 ; WX 667 ; N K ; B 7 0 722 653 ; +C 76 ; WX 556 ; N L ; B -8 0 559 653 ; +C 77 ; WX 833 ; N M ; B -18 0 873 653 ; +C 78 ; WX 667 ; N N ; B -20 -15 727 653 ; +C 79 ; WX 722 ; N O ; B 60 -18 699 666 ; +C 80 ; WX 611 ; N P ; B 0 0 605 653 ; +C 81 ; WX 722 ; N Q ; B 59 -182 699 666 ; +C 82 ; WX 611 ; N R ; B -13 0 588 653 ; +C 83 ; WX 500 ; N S ; B 17 -18 508 667 ; +C 84 ; WX 556 ; N T ; B 59 0 633 653 ; +C 85 ; WX 722 ; N U ; B 102 -18 765 653 ; +C 86 ; WX 611 ; N V ; B 76 -18 688 653 ; +C 87 ; WX 833 ; N W ; B 71 -18 906 653 ; +C 88 ; WX 611 ; N X ; B -29 0 655 653 ; +C 89 ; WX 556 ; N Y ; B 78 0 633 653 ; +C 90 ; WX 556 ; N Z ; B -6 0 606 653 ; +C 91 ; WX 389 ; N bracketleft ; B 21 -153 391 663 ; +C 92 ; WX 278 ; N backslash ; B -41 -18 319 666 ; +C 93 ; WX 389 ; N bracketright ; B 12 -153 382 663 ; +C 94 ; WX 422 ; N asciicircum ; B 0 301 422 666 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 145 ; WX 333 ; N quoteleft ; B 171 436 310 666 ; +C 97 ; WX 500 ; N a ; B 17 -11 476 441 ; +C 98 ; WX 500 ; N b ; B 23 -11 473 683 ; +C 99 ; WX 444 ; N c ; B 30 -11 425 441 ; +C 100 ; WX 500 ; N d ; B 15 -13 527 683 ; +C 101 ; WX 444 ; N e ; B 31 -11 412 441 ; +C 102 ; WX 278 ; N f ; B -147 -207 424 678 ; L i fi ; L l fl ; +C 103 ; WX 500 ; N g ; B 8 -206 472 441 ; +C 104 ; WX 500 ; N h ; B 19 -9 478 683 ; +C 105 ; WX 278 ; N i ; B 49 -11 264 654 ; +C 106 ; WX 278 ; N j ; B -124 -207 276 654 ; +C 107 ; WX 444 ; N k ; B 14 -11 461 683 ; +C 108 ; WX 278 ; N l ; B 41 -11 279 683 ; +C 109 ; WX 722 ; N m ; B 12 -9 704 441 ; +C 110 ; WX 500 ; N n ; B 14 -9 474 441 ; +C 111 ; WX 500 ; N o ; B 27 -11 468 441 ; +C 112 ; WX 500 ; N p ; B -75 -205 469 441 ; +C 113 ; WX 500 ; N q ; B 25 -209 483 441 ; +C 114 ; WX 389 ; N r ; B 45 0 412 441 ; +C 115 ; WX 389 ; N s ; B 16 -13 366 442 ; +C 116 ; WX 278 ; N t ; B 37 -11 296 546 ; +C 117 ; WX 500 ; N u ; B 42 -11 475 441 ; +C 118 ; WX 444 ; N v ; B 21 -18 426 441 ; +C 119 ; WX 667 ; N w ; B 16 -18 648 441 ; +C 120 ; WX 444 ; N x ; B -27 -11 447 441 ; +C 121 ; WX 444 ; N y ; B -24 -206 426 441 ; +C 122 ; WX 389 ; N z ; B -2 -81 380 428 ; +C 123 ; WX 400 ; N braceleft ; B 51 -177 407 687 ; +C 124 ; WX 275 ; N bar ; B 105 -217 171 783 ; +C 125 ; WX 400 ; N braceright ; B -7 -177 349 687 ; +C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ; +C 161 ; WX 389 ; N exclamdown ; B 59 -205 322 473 ; +C 162 ; WX 500 ; N cent ; B 77 -143 472 560 ; +C 163 ; WX 500 ; N sterling ; B 10 -6 517 670 ; +C -1 ; WX 167 ; N fraction ; B -169 -10 337 676 ; +C 165 ; WX 500 ; N yen ; B 27 0 603 653 ; +C 131 ; WX 500 ; N florin ; B 25 -182 507 682 ; +C 167 ; WX 500 ; N section ; B 53 -162 461 666 ; +C 164 ; WX 500 ; N currency ; B -22 53 522 597 ; +C 39 ; WX 214 ; N quotesingle ; B 132 421 241 666 ; +C 147 ; WX 556 ; N quotedblleft ; B 166 436 514 666 ; +C 171 ; WX 500 ; N guillemotleft ; B 53 37 445 403 ; +C 139 ; WX 333 ; N guilsinglleft ; B 51 37 281 403 ; +C 155 ; WX 333 ; N guilsinglright ; B 52 37 282 403 ; +C -1 ; WX 500 ; N fi ; B -141 -207 481 681 ; +C -1 ; WX 500 ; N fl ; B -141 -204 518 682 ; +C 150 ; WX 500 ; N endash ; B -6 197 505 243 ; +C 134 ; WX 500 ; N dagger ; B 101 -159 488 666 ; +C 135 ; WX 500 ; N daggerdbl ; B 22 -143 491 666 ; +C 183 ; WX 250 ; N periodcentered ; B 70 199 181 310 ; +C 182 ; WX 523 ; N paragraph ; B 55 -123 616 653 ; +C 149 ; WX 350 ; N bullet ; B 40 191 310 461 ; +C 130 ; WX 333 ; N quotesinglbase ; B 44 -129 183 101 ; +C 132 ; WX 556 ; N quotedblbase ; B 57 -129 405 101 ; +C 148 ; WX 556 ; N quotedblright ; B 151 436 499 666 ; +C 187 ; WX 500 ; N guillemotright ; B 55 37 447 403 ; +C 133 ; WX 889 ; N ellipsis ; B 57 -11 762 100 ; +C 137 ; WX 1000 ; N perthousand ; B 25 -19 1010 706 ; +C 191 ; WX 500 ; N questiondown ; B 28 -205 368 471 ; +C 96 ; WX 333 ; N grave ; B 121 492 311 664 ; +C 180 ; WX 333 ; N acute ; B 180 494 403 664 ; +C 136 ; WX 333 ; N circumflex ; B 91 492 385 661 ; +C 152 ; WX 333 ; N tilde ; B 100 517 427 624 ; +C 175 ; WX 333 ; N macron ; B 99 532 411 583 ; +C -1 ; WX 333 ; N breve ; B 117 492 418 650 ; +C -1 ; WX 333 ; N dotaccent ; B 207 548 305 646 ; +C 168 ; WX 333 ; N dieresis ; B 107 548 405 646 ; +C -1 ; WX 333 ; N ring ; B 155 492 355 691 ; +C 184 ; WX 333 ; N cedilla ; B -30 -217 182 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B 93 494 486 664 ; +C -1 ; WX 333 ; N ogonek ; B 20 -169 203 40 ; +C -1 ; WX 333 ; N caron ; B 121 492 426 661 ; +C 151 ; WX 889 ; N emdash ; B -6 197 894 243 ; +C 198 ; WX 889 ; N AE ; B -27 0 911 653 ; +C 170 ; WX 276 ; N ordfeminine ; B 42 406 352 676 ; +C -1 ; WX 556 ; N Lslash ; B -8 0 559 653 ; +C 216 ; WX 722 ; N Oslash ; B 60 -105 699 722 ; +C 140 ; WX 944 ; N OE ; B 49 -8 964 666 ; +C 186 ; WX 310 ; N ordmasculine ; B 67 406 362 676 ; +C 230 ; WX 667 ; N ae ; B 23 -11 640 441 ; +C -1 ; WX 278 ; N dotlessi ; B 49 -11 235 441 ; +C -1 ; WX 278 ; N lslash ; B 41 -11 312 683 ; +C 248 ; WX 500 ; N oslash ; B 28 -135 469 554 ; +C 156 ; WX 667 ; N oe ; B 20 -12 646 441 ; +C 223 ; WX 500 ; N germandbls ; B -168 -207 493 679 ; +C 207 ; WX 333 ; N Idieresis ; B -8 0 435 818 ; +C 233 ; WX 444 ; N eacute ; B 31 -11 459 664 ; +C -1 ; WX 500 ; N abreve ; B 17 -11 502 650 ; +C -1 ; WX 500 ; N uhungarumlaut ; B 42 -11 580 664 ; +C -1 ; WX 444 ; N ecaron ; B 31 -11 482 661 ; +C 159 ; WX 556 ; N Ydieresis ; B 78 0 633 818 ; +C 247 ; WX 675 ; N divide ; B 86 -11 590 517 ; +C 221 ; WX 556 ; N Yacute ; B 78 0 633 876 ; +C 194 ; WX 611 ; N Acircumflex ; B -51 0 564 873 ; +C 225 ; WX 500 ; N aacute ; B 17 -11 487 664 ; +C 219 ; WX 722 ; N Ucircumflex ; B 102 -18 765 873 ; +C 253 ; WX 444 ; N yacute ; B -24 -206 459 664 ; +C -1 ; WX 389 ; N scommaaccent ; B 16 -217 366 442 ; +C 234 ; WX 444 ; N ecircumflex ; B 31 -11 441 661 ; +C -1 ; WX 722 ; N Uring ; B 102 -18 765 883 ; +C 220 ; WX 722 ; N Udieresis ; B 102 -18 765 818 ; +C -1 ; WX 500 ; N aogonek ; B 17 -169 476 441 ; +C 218 ; WX 722 ; N Uacute ; B 102 -18 765 876 ; +C -1 ; WX 500 ; N uogonek ; B 42 -169 477 441 ; +C 203 ; WX 611 ; N Edieresis ; B -1 0 634 818 ; +C -1 ; WX 722 ; N Dcroat ; B -8 0 700 653 ; +C -1 ; WX 250 ; N commaaccent ; B 8 -217 133 -50 ; +C 169 ; WX 760 ; N copyright ; B 41 -18 719 666 ; +C -1 ; WX 611 ; N Emacron ; B -1 0 634 795 ; +C -1 ; WX 444 ; N ccaron ; B 30 -11 482 661 ; +C 229 ; WX 500 ; N aring ; B 17 -11 476 691 ; +C -1 ; WX 667 ; N Ncommaaccent ; B -20 -187 727 653 ; +C -1 ; WX 278 ; N lacute ; B 41 -11 395 876 ; +C 224 ; WX 500 ; N agrave ; B 17 -11 476 664 ; +C -1 ; WX 556 ; N Tcommaaccent ; B 59 -217 633 653 ; +C -1 ; WX 667 ; N Cacute ; B 66 -18 690 876 ; +C 227 ; WX 500 ; N atilde ; B 17 -11 511 624 ; +C -1 ; WX 611 ; N Edotaccent ; B -1 0 634 818 ; +C 154 ; WX 389 ; N scaron ; B 16 -13 454 661 ; +C -1 ; WX 389 ; N scedilla ; B 16 -217 366 442 ; +C 237 ; WX 278 ; N iacute ; B 49 -11 355 664 ; +C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ; +C -1 ; WX 611 ; N Rcaron ; B -13 0 588 873 ; +C -1 ; WX 722 ; N Gcommaaccent ; B 52 -217 722 666 ; +C 251 ; WX 500 ; N ucircumflex ; B 42 -11 475 661 ; +C 226 ; WX 500 ; N acircumflex ; B 17 -11 476 661 ; +C -1 ; WX 611 ; N Amacron ; B -51 0 564 795 ; +C -1 ; WX 389 ; N rcaron ; B 45 0 434 661 ; +C 231 ; WX 444 ; N ccedilla ; B 30 -217 425 441 ; +C -1 ; WX 556 ; N Zdotaccent ; B -6 0 606 818 ; +C 222 ; WX 611 ; N Thorn ; B 0 0 569 653 ; +C -1 ; WX 722 ; N Omacron ; B 60 -18 699 795 ; +C -1 ; WX 611 ; N Racute ; B -13 0 588 876 ; +C -1 ; WX 500 ; N Sacute ; B 17 -18 508 876 ; +C -1 ; WX 544 ; N dcaron ; B 15 -13 658 683 ; +C -1 ; WX 722 ; N Umacron ; B 102 -18 765 795 ; +C -1 ; WX 500 ; N uring ; B 42 -11 475 691 ; +C 179 ; WX 300 ; N threesuperior ; B 43 268 339 676 ; +C 210 ; WX 722 ; N Ograve ; B 60 -18 699 876 ; +C 192 ; WX 611 ; N Agrave ; B -51 0 564 876 ; +C -1 ; WX 611 ; N Abreve ; B -51 0 564 862 ; +C 215 ; WX 675 ; N multiply ; B 93 8 582 497 ; +C 250 ; WX 500 ; N uacute ; B 42 -11 477 664 ; +C -1 ; WX 556 ; N Tcaron ; B 59 0 633 873 ; +C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ; +C 255 ; WX 444 ; N ydieresis ; B -24 -206 441 606 ; +C -1 ; WX 667 ; N Nacute ; B -20 -15 727 876 ; +C 238 ; WX 278 ; N icircumflex ; B 33 -11 327 661 ; +C 202 ; WX 611 ; N Ecircumflex ; B -1 0 634 873 ; +C 228 ; WX 500 ; N adieresis ; B 17 -11 489 606 ; +C 235 ; WX 444 ; N edieresis ; B 31 -11 451 606 ; +C -1 ; WX 444 ; N cacute ; B 30 -11 459 664 ; +C -1 ; WX 500 ; N nacute ; B 14 -9 477 664 ; +C -1 ; WX 500 ; N umacron ; B 42 -11 485 583 ; +C -1 ; WX 667 ; N Ncaron ; B -20 -15 727 873 ; +C 205 ; WX 333 ; N Iacute ; B -8 0 433 876 ; +C 177 ; WX 675 ; N plusminus ; B 86 0 590 506 ; +C 166 ; WX 275 ; N brokenbar ; B 105 -142 171 708 ; +C 174 ; WX 760 ; N registered ; B 41 -18 719 666 ; +C -1 ; WX 722 ; N Gbreve ; B 52 -18 722 862 ; +C -1 ; WX 333 ; N Idotaccent ; B -8 0 384 818 ; +C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ; +C 200 ; WX 611 ; N Egrave ; B -1 0 634 876 ; +C -1 ; WX 389 ; N racute ; B 45 0 431 664 ; +C -1 ; WX 500 ; N omacron ; B 27 -11 495 583 ; +C -1 ; WX 556 ; N Zacute ; B -6 0 606 876 ; +C 142 ; WX 556 ; N Zcaron ; B -6 0 606 873 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 658 ; +C 208 ; WX 722 ; N Eth ; B -8 0 700 653 ; +C 199 ; WX 667 ; N Ccedilla ; B 66 -217 689 666 ; +C -1 ; WX 278 ; N lcommaaccent ; B 22 -217 279 683 ; +C -1 ; WX 300 ; N tcaron ; B 37 -11 407 681 ; +C -1 ; WX 444 ; N eogonek ; B 31 -169 412 441 ; +C -1 ; WX 722 ; N Uogonek ; B 102 -184 765 653 ; +C 193 ; WX 611 ; N Aacute ; B -51 0 564 876 ; +C 196 ; WX 611 ; N Adieresis ; B -51 0 564 818 ; +C 232 ; WX 444 ; N egrave ; B 31 -11 412 664 ; +C -1 ; WX 389 ; N zacute ; B -2 -81 431 664 ; +C -1 ; WX 278 ; N iogonek ; B 49 -169 264 654 ; +C 211 ; WX 722 ; N Oacute ; B 60 -18 699 876 ; +C 243 ; WX 500 ; N oacute ; B 27 -11 487 664 ; +C -1 ; WX 500 ; N amacron ; B 17 -11 495 583 ; +C -1 ; WX 389 ; N sacute ; B 16 -13 431 664 ; +C 239 ; WX 278 ; N idieresis ; B 49 -11 352 606 ; +C 212 ; WX 722 ; N Ocircumflex ; B 60 -18 699 873 ; +C 217 ; WX 722 ; N Ugrave ; B 102 -18 765 876 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 500 ; N thorn ; B -75 -205 469 683 ; +C 178 ; WX 300 ; N twosuperior ; B 33 271 324 676 ; +C 214 ; WX 722 ; N Odieresis ; B 60 -18 699 818 ; +C 181 ; WX 500 ; N mu ; B -30 -209 497 428 ; +C 236 ; WX 278 ; N igrave ; B 49 -11 284 664 ; +C -1 ; WX 500 ; N ohungarumlaut ; B 27 -11 590 664 ; +C -1 ; WX 611 ; N Eogonek ; B -1 -169 634 653 ; +C -1 ; WX 500 ; N dcroat ; B 15 -13 572 683 ; +C 190 ; WX 750 ; N threequarters ; B 23 -10 736 676 ; +C -1 ; WX 500 ; N Scedilla ; B 17 -217 508 667 ; +C -1 ; WX 300 ; N lcaron ; B 41 -11 407 683 ; +C -1 ; WX 667 ; N Kcommaaccent ; B 7 -217 722 653 ; +C -1 ; WX 556 ; N Lacute ; B -8 0 559 876 ; +C 153 ; WX 980 ; N trademark ; B 30 247 957 653 ; +C -1 ; WX 444 ; N edotaccent ; B 31 -11 412 606 ; +C 204 ; WX 333 ; N Igrave ; B -8 0 384 876 ; +C -1 ; WX 333 ; N Imacron ; B -8 0 441 795 ; +C -1 ; WX 611 ; N Lcaron ; B -8 0 586 653 ; +C 189 ; WX 750 ; N onehalf ; B 34 -10 749 676 ; +C -1 ; WX 549 ; N lessequal ; B 26 0 523 658 ; +C 244 ; WX 500 ; N ocircumflex ; B 27 -11 468 661 ; +C 241 ; WX 500 ; N ntilde ; B 14 -9 476 624 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 102 -18 765 876 ; +C 201 ; WX 611 ; N Eacute ; B -1 0 634 876 ; +C -1 ; WX 444 ; N emacron ; B 31 -11 457 583 ; +C -1 ; WX 500 ; N gbreve ; B 8 -206 487 650 ; +C 188 ; WX 750 ; N onequarter ; B 33 -10 736 676 ; +C 138 ; WX 500 ; N Scaron ; B 17 -18 520 873 ; +C -1 ; WX 500 ; N Scommaaccent ; B 17 -217 508 667 ; +C -1 ; WX 722 ; N Ohungarumlaut ; B 60 -18 699 876 ; +C 176 ; WX 400 ; N degree ; B 101 390 387 676 ; +C 242 ; WX 500 ; N ograve ; B 27 -11 468 664 ; +C -1 ; WX 667 ; N Ccaron ; B 66 -18 689 873 ; +C 249 ; WX 500 ; N ugrave ; B 42 -11 475 664 ; +C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ; +C -1 ; WX 722 ; N Dcaron ; B -8 0 700 873 ; +C -1 ; WX 389 ; N rcommaaccent ; B -3 -217 412 441 ; +C 209 ; WX 667 ; N Ntilde ; B -20 -15 727 836 ; +C 245 ; WX 500 ; N otilde ; B 27 -11 496 624 ; +C -1 ; WX 611 ; N Rcommaaccent ; B -13 -187 588 653 ; +C -1 ; WX 556 ; N Lcommaaccent ; B -8 -217 559 653 ; +C 195 ; WX 611 ; N Atilde ; B -51 0 566 836 ; +C -1 ; WX 611 ; N Aogonek ; B -51 -169 566 668 ; +C 197 ; WX 611 ; N Aring ; B -51 0 564 883 ; +C 213 ; WX 722 ; N Otilde ; B 60 -18 699 836 ; +C -1 ; WX 389 ; N zdotaccent ; B -2 -81 380 606 ; +C -1 ; WX 611 ; N Ecaron ; B -1 0 634 873 ; +C -1 ; WX 333 ; N Iogonek ; B -8 -169 384 653 ; +C -1 ; WX 444 ; N kcommaaccent ; B 14 -187 461 683 ; +C -1 ; WX 675 ; N minus ; B 86 220 590 286 ; +C 206 ; WX 333 ; N Icircumflex ; B -8 0 425 873 ; +C -1 ; WX 500 ; N ncaron ; B 14 -9 510 661 ; +C -1 ; WX 278 ; N tcommaaccent ; B 2 -217 296 546 ; +C 172 ; WX 675 ; N logicalnot ; B 86 108 590 386 ; +C 246 ; WX 500 ; N odieresis ; B 27 -11 489 606 ; +C 252 ; WX 500 ; N udieresis ; B 42 -11 479 606 ; +C -1 ; WX 549 ; N notequal ; B 12 -29 537 541 ; +C -1 ; WX 500 ; N gcommaaccent ; B 8 -206 472 706 ; +C 240 ; WX 500 ; N eth ; B 27 -11 482 683 ; +C 158 ; WX 389 ; N zcaron ; B -2 -81 434 661 ; +C -1 ; WX 500 ; N ncommaaccent ; B 14 -187 474 441 ; +C 185 ; WX 300 ; N onesuperior ; B 43 271 284 676 ; +C -1 ; WX 278 ; N imacron ; B 46 -11 311 583 ; +C 128 ; WX 500 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2321 +KPX A C -30 +KPX A Cacute -30 +KPX A Ccaron -30 +KPX A Ccedilla -30 +KPX A G -35 +KPX A Gbreve -35 +KPX A Gcommaaccent -35 +KPX A O -40 +KPX A Oacute -40 +KPX A Ocircumflex -40 +KPX A Odieresis -40 +KPX A Ograve -40 +KPX A Ohungarumlaut -40 +KPX A Omacron -40 +KPX A Oslash -40 +KPX A Otilde -40 +KPX A Q -40 +KPX A T -37 +KPX A Tcaron -37 +KPX A Tcommaaccent -37 +KPX A U -50 +KPX A Uacute -50 +KPX A Ucircumflex -50 +KPX A Udieresis -50 +KPX A Ugrave -50 +KPX A Uhungarumlaut -50 +KPX A Umacron -50 +KPX A Uogonek -50 +KPX A Uring -50 +KPX A V -105 +KPX A W -95 +KPX A Y -55 +KPX A Yacute -55 +KPX A Ydieresis -55 +KPX A quoteright -37 +KPX A u -20 +KPX A uacute -20 +KPX A ucircumflex -20 +KPX A udieresis -20 +KPX A ugrave -20 +KPX A uhungarumlaut -20 +KPX A umacron -20 +KPX A uogonek -20 +KPX A uring -20 +KPX A v -55 +KPX A w -55 +KPX A y -55 +KPX A yacute -55 +KPX A ydieresis -55 +KPX Aacute C -30 +KPX Aacute Cacute -30 +KPX Aacute Ccaron -30 +KPX Aacute Ccedilla -30 +KPX Aacute G -35 +KPX Aacute Gbreve -35 +KPX Aacute Gcommaaccent -35 +KPX Aacute O -40 +KPX Aacute Oacute -40 +KPX Aacute Ocircumflex -40 +KPX Aacute Odieresis -40 +KPX Aacute Ograve -40 +KPX Aacute Ohungarumlaut -40 +KPX Aacute Omacron -40 +KPX Aacute Oslash -40 +KPX Aacute Otilde -40 +KPX Aacute Q -40 +KPX Aacute T -37 +KPX Aacute Tcaron -37 +KPX Aacute Tcommaaccent -37 +KPX Aacute U -50 +KPX Aacute Uacute -50 +KPX Aacute Ucircumflex -50 +KPX Aacute Udieresis -50 +KPX Aacute Ugrave -50 +KPX Aacute Uhungarumlaut -50 +KPX Aacute Umacron -50 +KPX Aacute Uogonek -50 +KPX Aacute Uring -50 +KPX Aacute V -105 +KPX Aacute W -95 +KPX Aacute Y -55 +KPX Aacute Yacute -55 +KPX Aacute Ydieresis -55 +KPX Aacute quoteright -37 +KPX Aacute u -20 +KPX Aacute uacute -20 +KPX Aacute ucircumflex -20 +KPX Aacute udieresis -20 +KPX Aacute ugrave -20 +KPX Aacute uhungarumlaut -20 +KPX Aacute umacron -20 +KPX Aacute uogonek -20 +KPX Aacute uring -20 +KPX Aacute v -55 +KPX Aacute w -55 +KPX Aacute y -55 +KPX Aacute yacute -55 +KPX Aacute ydieresis -55 +KPX Abreve C -30 +KPX Abreve Cacute -30 +KPX Abreve Ccaron -30 +KPX Abreve Ccedilla -30 +KPX Abreve G -35 +KPX Abreve Gbreve -35 +KPX Abreve Gcommaaccent -35 +KPX Abreve O -40 +KPX Abreve Oacute -40 +KPX Abreve Ocircumflex -40 +KPX Abreve Odieresis -40 +KPX Abreve Ograve -40 +KPX Abreve Ohungarumlaut -40 +KPX Abreve Omacron -40 +KPX Abreve Oslash -40 +KPX Abreve Otilde -40 +KPX Abreve Q -40 +KPX Abreve T -37 +KPX Abreve Tcaron -37 +KPX Abreve Tcommaaccent -37 +KPX Abreve U -50 +KPX Abreve Uacute -50 +KPX Abreve Ucircumflex -50 +KPX Abreve Udieresis -50 +KPX Abreve Ugrave -50 +KPX Abreve Uhungarumlaut -50 +KPX Abreve Umacron -50 +KPX Abreve Uogonek -50 +KPX Abreve Uring -50 +KPX Abreve V -105 +KPX Abreve W -95 +KPX Abreve Y -55 +KPX Abreve Yacute -55 +KPX Abreve Ydieresis -55 +KPX Abreve quoteright -37 +KPX Abreve u -20 +KPX Abreve uacute -20 +KPX Abreve ucircumflex -20 +KPX Abreve udieresis -20 +KPX Abreve ugrave -20 +KPX Abreve uhungarumlaut -20 +KPX Abreve umacron -20 +KPX Abreve uogonek -20 +KPX Abreve uring -20 +KPX Abreve v -55 +KPX Abreve w -55 +KPX Abreve y -55 +KPX Abreve yacute -55 +KPX Abreve ydieresis -55 +KPX Acircumflex C -30 +KPX Acircumflex Cacute -30 +KPX Acircumflex Ccaron -30 +KPX Acircumflex Ccedilla -30 +KPX Acircumflex G -35 +KPX Acircumflex Gbreve -35 +KPX Acircumflex Gcommaaccent -35 +KPX Acircumflex O -40 +KPX Acircumflex Oacute -40 +KPX Acircumflex Ocircumflex -40 +KPX Acircumflex Odieresis -40 +KPX Acircumflex Ograve -40 +KPX Acircumflex Ohungarumlaut -40 +KPX Acircumflex Omacron -40 +KPX Acircumflex Oslash -40 +KPX Acircumflex Otilde -40 +KPX Acircumflex Q -40 +KPX Acircumflex T -37 +KPX Acircumflex Tcaron -37 +KPX Acircumflex Tcommaaccent -37 +KPX Acircumflex U -50 +KPX Acircumflex Uacute -50 +KPX Acircumflex Ucircumflex -50 +KPX Acircumflex Udieresis -50 +KPX Acircumflex Ugrave -50 +KPX Acircumflex Uhungarumlaut -50 +KPX Acircumflex Umacron -50 +KPX Acircumflex Uogonek -50 +KPX Acircumflex Uring -50 +KPX Acircumflex V -105 +KPX Acircumflex W -95 +KPX Acircumflex Y -55 +KPX Acircumflex Yacute -55 +KPX Acircumflex Ydieresis -55 +KPX Acircumflex quoteright -37 +KPX Acircumflex u -20 +KPX Acircumflex uacute -20 +KPX Acircumflex ucircumflex -20 +KPX Acircumflex udieresis -20 +KPX Acircumflex ugrave -20 +KPX Acircumflex uhungarumlaut -20 +KPX Acircumflex umacron -20 +KPX Acircumflex uogonek -20 +KPX Acircumflex uring -20 +KPX Acircumflex v -55 +KPX Acircumflex w -55 +KPX Acircumflex y -55 +KPX Acircumflex yacute -55 +KPX Acircumflex ydieresis -55 +KPX Adieresis C -30 +KPX Adieresis Cacute -30 +KPX Adieresis Ccaron -30 +KPX Adieresis Ccedilla -30 +KPX Adieresis G -35 +KPX Adieresis Gbreve -35 +KPX Adieresis Gcommaaccent -35 +KPX Adieresis O -40 +KPX Adieresis Oacute -40 +KPX Adieresis Ocircumflex -40 +KPX Adieresis Odieresis -40 +KPX Adieresis Ograve -40 +KPX Adieresis Ohungarumlaut -40 +KPX Adieresis Omacron -40 +KPX Adieresis Oslash -40 +KPX Adieresis Otilde -40 +KPX Adieresis Q -40 +KPX Adieresis T -37 +KPX Adieresis Tcaron -37 +KPX Adieresis Tcommaaccent -37 +KPX Adieresis U -50 +KPX Adieresis Uacute -50 +KPX Adieresis Ucircumflex -50 +KPX Adieresis Udieresis -50 +KPX Adieresis Ugrave -50 +KPX Adieresis Uhungarumlaut -50 +KPX Adieresis Umacron -50 +KPX Adieresis Uogonek -50 +KPX Adieresis Uring -50 +KPX Adieresis V -105 +KPX Adieresis W -95 +KPX Adieresis Y -55 +KPX Adieresis Yacute -55 +KPX Adieresis Ydieresis -55 +KPX Adieresis quoteright -37 +KPX Adieresis u -20 +KPX Adieresis uacute -20 +KPX Adieresis ucircumflex -20 +KPX Adieresis udieresis -20 +KPX Adieresis ugrave -20 +KPX Adieresis uhungarumlaut -20 +KPX Adieresis umacron -20 +KPX Adieresis uogonek -20 +KPX Adieresis uring -20 +KPX Adieresis v -55 +KPX Adieresis w -55 +KPX Adieresis y -55 +KPX Adieresis yacute -55 +KPX Adieresis ydieresis -55 +KPX Agrave C -30 +KPX Agrave Cacute -30 +KPX Agrave Ccaron -30 +KPX Agrave Ccedilla -30 +KPX Agrave G -35 +KPX Agrave Gbreve -35 +KPX Agrave Gcommaaccent -35 +KPX Agrave O -40 +KPX Agrave Oacute -40 +KPX Agrave Ocircumflex -40 +KPX Agrave Odieresis -40 +KPX Agrave Ograve -40 +KPX Agrave Ohungarumlaut -40 +KPX Agrave Omacron -40 +KPX Agrave Oslash -40 +KPX Agrave Otilde -40 +KPX Agrave Q -40 +KPX Agrave T -37 +KPX Agrave Tcaron -37 +KPX Agrave Tcommaaccent -37 +KPX Agrave U -50 +KPX Agrave Uacute -50 +KPX Agrave Ucircumflex -50 +KPX Agrave Udieresis -50 +KPX Agrave Ugrave -50 +KPX Agrave Uhungarumlaut -50 +KPX Agrave Umacron -50 +KPX Agrave Uogonek -50 +KPX Agrave Uring -50 +KPX Agrave V -105 +KPX Agrave W -95 +KPX Agrave Y -55 +KPX Agrave Yacute -55 +KPX Agrave Ydieresis -55 +KPX Agrave quoteright -37 +KPX Agrave u -20 +KPX Agrave uacute -20 +KPX Agrave ucircumflex -20 +KPX Agrave udieresis -20 +KPX Agrave ugrave -20 +KPX Agrave uhungarumlaut -20 +KPX Agrave umacron -20 +KPX Agrave uogonek -20 +KPX Agrave uring -20 +KPX Agrave v -55 +KPX Agrave w -55 +KPX Agrave y -55 +KPX Agrave yacute -55 +KPX Agrave ydieresis -55 +KPX Amacron C -30 +KPX Amacron Cacute -30 +KPX Amacron Ccaron -30 +KPX Amacron Ccedilla -30 +KPX Amacron G -35 +KPX Amacron Gbreve -35 +KPX Amacron Gcommaaccent -35 +KPX Amacron O -40 +KPX Amacron Oacute -40 +KPX Amacron Ocircumflex -40 +KPX Amacron Odieresis -40 +KPX Amacron Ograve -40 +KPX Amacron Ohungarumlaut -40 +KPX Amacron Omacron -40 +KPX Amacron Oslash -40 +KPX Amacron Otilde -40 +KPX Amacron Q -40 +KPX Amacron T -37 +KPX Amacron Tcaron -37 +KPX Amacron Tcommaaccent -37 +KPX Amacron U -50 +KPX Amacron Uacute -50 +KPX Amacron Ucircumflex -50 +KPX Amacron Udieresis -50 +KPX Amacron Ugrave -50 +KPX Amacron Uhungarumlaut -50 +KPX Amacron Umacron -50 +KPX Amacron Uogonek -50 +KPX Amacron Uring -50 +KPX Amacron V -105 +KPX Amacron W -95 +KPX Amacron Y -55 +KPX Amacron Yacute -55 +KPX Amacron Ydieresis -55 +KPX Amacron quoteright -37 +KPX Amacron u -20 +KPX Amacron uacute -20 +KPX Amacron ucircumflex -20 +KPX Amacron udieresis -20 +KPX Amacron ugrave -20 +KPX Amacron uhungarumlaut -20 +KPX Amacron umacron -20 +KPX Amacron uogonek -20 +KPX Amacron uring -20 +KPX Amacron v -55 +KPX Amacron w -55 +KPX Amacron y -55 +KPX Amacron yacute -55 +KPX Amacron ydieresis -55 +KPX Aogonek C -30 +KPX Aogonek Cacute -30 +KPX Aogonek Ccaron -30 +KPX Aogonek Ccedilla -30 +KPX Aogonek G -35 +KPX Aogonek Gbreve -35 +KPX Aogonek Gcommaaccent -35 +KPX Aogonek O -40 +KPX Aogonek Oacute -40 +KPX Aogonek Ocircumflex -40 +KPX Aogonek Odieresis -40 +KPX Aogonek Ograve -40 +KPX Aogonek Ohungarumlaut -40 +KPX Aogonek Omacron -40 +KPX Aogonek Oslash -40 +KPX Aogonek Otilde -40 +KPX Aogonek Q -40 +KPX Aogonek T -37 +KPX Aogonek Tcaron -37 +KPX Aogonek Tcommaaccent -37 +KPX Aogonek U -50 +KPX Aogonek Uacute -50 +KPX Aogonek Ucircumflex -50 +KPX Aogonek Udieresis -50 +KPX Aogonek Ugrave -50 +KPX Aogonek Uhungarumlaut -50 +KPX Aogonek Umacron -50 +KPX Aogonek Uogonek -50 +KPX Aogonek Uring -50 +KPX Aogonek V -105 +KPX Aogonek W -95 +KPX Aogonek Y -55 +KPX Aogonek Yacute -55 +KPX Aogonek Ydieresis -55 +KPX Aogonek quoteright -37 +KPX Aogonek u -20 +KPX Aogonek uacute -20 +KPX Aogonek ucircumflex -20 +KPX Aogonek udieresis -20 +KPX Aogonek ugrave -20 +KPX Aogonek uhungarumlaut -20 +KPX Aogonek umacron -20 +KPX Aogonek uogonek -20 +KPX Aogonek uring -20 +KPX Aogonek v -55 +KPX Aogonek w -55 +KPX Aogonek y -55 +KPX Aogonek yacute -55 +KPX Aogonek ydieresis -55 +KPX Aring C -30 +KPX Aring Cacute -30 +KPX Aring Ccaron -30 +KPX Aring Ccedilla -30 +KPX Aring G -35 +KPX Aring Gbreve -35 +KPX Aring Gcommaaccent -35 +KPX Aring O -40 +KPX Aring Oacute -40 +KPX Aring Ocircumflex -40 +KPX Aring Odieresis -40 +KPX Aring Ograve -40 +KPX Aring Ohungarumlaut -40 +KPX Aring Omacron -40 +KPX Aring Oslash -40 +KPX Aring Otilde -40 +KPX Aring Q -40 +KPX Aring T -37 +KPX Aring Tcaron -37 +KPX Aring Tcommaaccent -37 +KPX Aring U -50 +KPX Aring Uacute -50 +KPX Aring Ucircumflex -50 +KPX Aring Udieresis -50 +KPX Aring Ugrave -50 +KPX Aring Uhungarumlaut -50 +KPX Aring Umacron -50 +KPX Aring Uogonek -50 +KPX Aring Uring -50 +KPX Aring V -105 +KPX Aring W -95 +KPX Aring Y -55 +KPX Aring Yacute -55 +KPX Aring Ydieresis -55 +KPX Aring quoteright -37 +KPX Aring u -20 +KPX Aring uacute -20 +KPX Aring ucircumflex -20 +KPX Aring udieresis -20 +KPX Aring ugrave -20 +KPX Aring uhungarumlaut -20 +KPX Aring umacron -20 +KPX Aring uogonek -20 +KPX Aring uring -20 +KPX Aring v -55 +KPX Aring w -55 +KPX Aring y -55 +KPX Aring yacute -55 +KPX Aring ydieresis -55 +KPX Atilde C -30 +KPX Atilde Cacute -30 +KPX Atilde Ccaron -30 +KPX Atilde Ccedilla -30 +KPX Atilde G -35 +KPX Atilde Gbreve -35 +KPX Atilde Gcommaaccent -35 +KPX Atilde O -40 +KPX Atilde Oacute -40 +KPX Atilde Ocircumflex -40 +KPX Atilde Odieresis -40 +KPX Atilde Ograve -40 +KPX Atilde Ohungarumlaut -40 +KPX Atilde Omacron -40 +KPX Atilde Oslash -40 +KPX Atilde Otilde -40 +KPX Atilde Q -40 +KPX Atilde T -37 +KPX Atilde Tcaron -37 +KPX Atilde Tcommaaccent -37 +KPX Atilde U -50 +KPX Atilde Uacute -50 +KPX Atilde Ucircumflex -50 +KPX Atilde Udieresis -50 +KPX Atilde Ugrave -50 +KPX Atilde Uhungarumlaut -50 +KPX Atilde Umacron -50 +KPX Atilde Uogonek -50 +KPX Atilde Uring -50 +KPX Atilde V -105 +KPX Atilde W -95 +KPX Atilde Y -55 +KPX Atilde Yacute -55 +KPX Atilde Ydieresis -55 +KPX Atilde quoteright -37 +KPX Atilde u -20 +KPX Atilde uacute -20 +KPX Atilde ucircumflex -20 +KPX Atilde udieresis -20 +KPX Atilde ugrave -20 +KPX Atilde uhungarumlaut -20 +KPX Atilde umacron -20 +KPX Atilde uogonek -20 +KPX Atilde uring -20 +KPX Atilde v -55 +KPX Atilde w -55 +KPX Atilde y -55 +KPX Atilde yacute -55 +KPX Atilde ydieresis -55 +KPX B A -25 +KPX B Aacute -25 +KPX B Abreve -25 +KPX B Acircumflex -25 +KPX B Adieresis -25 +KPX B Agrave -25 +KPX B Amacron -25 +KPX B Aogonek -25 +KPX B Aring -25 +KPX B Atilde -25 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -35 +KPX D Aacute -35 +KPX D Abreve -35 +KPX D Acircumflex -35 +KPX D Adieresis -35 +KPX D Agrave -35 +KPX D Amacron -35 +KPX D Aogonek -35 +KPX D Aring -35 +KPX D Atilde -35 +KPX D V -40 +KPX D W -40 +KPX D Y -40 +KPX D Yacute -40 +KPX D Ydieresis -40 +KPX Dcaron A -35 +KPX Dcaron Aacute -35 +KPX Dcaron Abreve -35 +KPX Dcaron Acircumflex -35 +KPX Dcaron Adieresis -35 +KPX Dcaron Agrave -35 +KPX Dcaron Amacron -35 +KPX Dcaron Aogonek -35 +KPX Dcaron Aring -35 +KPX Dcaron Atilde -35 +KPX Dcaron V -40 +KPX Dcaron W -40 +KPX Dcaron Y -40 +KPX Dcaron Yacute -40 +KPX Dcaron Ydieresis -40 +KPX Dcroat A -35 +KPX Dcroat Aacute -35 +KPX Dcroat Abreve -35 +KPX Dcroat Acircumflex -35 +KPX Dcroat Adieresis -35 +KPX Dcroat Agrave -35 +KPX Dcroat Amacron -35 +KPX Dcroat Aogonek -35 +KPX Dcroat Aring -35 +KPX Dcroat Atilde -35 +KPX Dcroat V -40 +KPX Dcroat W -40 +KPX Dcroat Y -40 +KPX Dcroat Yacute -40 +KPX Dcroat Ydieresis -40 +KPX F A -115 +KPX F Aacute -115 +KPX F Abreve -115 +KPX F Acircumflex -115 +KPX F Adieresis -115 +KPX F Agrave -115 +KPX F Amacron -115 +KPX F Aogonek -115 +KPX F Aring -115 +KPX F Atilde -115 +KPX F a -75 +KPX F aacute -75 +KPX F abreve -75 +KPX F acircumflex -75 +KPX F adieresis -75 +KPX F agrave -75 +KPX F amacron -75 +KPX F aogonek -75 +KPX F aring -75 +KPX F atilde -75 +KPX F comma -135 +KPX F e -75 +KPX F eacute -75 +KPX F ecaron -75 +KPX F ecircumflex -75 +KPX F edieresis -75 +KPX F edotaccent -75 +KPX F egrave -75 +KPX F emacron -75 +KPX F eogonek -75 +KPX F i -45 +KPX F iacute -45 +KPX F icircumflex -45 +KPX F idieresis -45 +KPX F igrave -45 +KPX F imacron -45 +KPX F iogonek -45 +KPX F o -105 +KPX F oacute -105 +KPX F ocircumflex -105 +KPX F odieresis -105 +KPX F ograve -105 +KPX F ohungarumlaut -105 +KPX F omacron -105 +KPX F oslash -105 +KPX F otilde -105 +KPX F period -135 +KPX F r -55 +KPX F racute -55 +KPX F rcaron -55 +KPX F rcommaaccent -55 +KPX J A -40 +KPX J Aacute -40 +KPX J Abreve -40 +KPX J Acircumflex -40 +KPX J Adieresis -40 +KPX J Agrave -40 +KPX J Amacron -40 +KPX J Aogonek -40 +KPX J Aring -40 +KPX J Atilde -40 +KPX J a -35 +KPX J aacute -35 +KPX J abreve -35 +KPX J acircumflex -35 +KPX J adieresis -35 +KPX J agrave -35 +KPX J amacron -35 +KPX J aogonek -35 +KPX J aring -35 +KPX J atilde -35 +KPX J comma -25 +KPX J e -25 +KPX J eacute -25 +KPX J ecaron -25 +KPX J ecircumflex -25 +KPX J edieresis -25 +KPX J edotaccent -25 +KPX J egrave -25 +KPX J emacron -25 +KPX J eogonek -25 +KPX J o -25 +KPX J oacute -25 +KPX J ocircumflex -25 +KPX J odieresis -25 +KPX J ograve -25 +KPX J ohungarumlaut -25 +KPX J omacron -25 +KPX J oslash -25 +KPX J otilde -25 +KPX J period -25 +KPX J u -35 +KPX J uacute -35 +KPX J ucircumflex -35 +KPX J udieresis -35 +KPX J ugrave -35 +KPX J uhungarumlaut -35 +KPX J umacron -35 +KPX J uogonek -35 +KPX J uring -35 +KPX K O -50 +KPX K Oacute -50 +KPX K Ocircumflex -50 +KPX K Odieresis -50 +KPX K Ograve -50 +KPX K Ohungarumlaut -50 +KPX K Omacron -50 +KPX K Oslash -50 +KPX K Otilde -50 +KPX K e -35 +KPX K eacute -35 +KPX K ecaron -35 +KPX K ecircumflex -35 +KPX K edieresis -35 +KPX K edotaccent -35 +KPX K egrave -35 +KPX K emacron -35 +KPX K eogonek -35 +KPX K o -40 +KPX K oacute -40 +KPX K ocircumflex -40 +KPX K odieresis -40 +KPX K ograve -40 +KPX K ohungarumlaut -40 +KPX K omacron -40 +KPX K oslash -40 +KPX K otilde -40 +KPX K u -40 +KPX K uacute -40 +KPX K ucircumflex -40 +KPX K udieresis -40 +KPX K ugrave -40 +KPX K uhungarumlaut -40 +KPX K umacron -40 +KPX K uogonek -40 +KPX K uring -40 +KPX K y -40 +KPX K yacute -40 +KPX K ydieresis -40 +KPX Kcommaaccent O -50 +KPX Kcommaaccent Oacute -50 +KPX Kcommaaccent Ocircumflex -50 +KPX Kcommaaccent Odieresis -50 +KPX Kcommaaccent Ograve -50 +KPX Kcommaaccent Ohungarumlaut -50 +KPX Kcommaaccent Omacron -50 +KPX Kcommaaccent Oslash -50 +KPX Kcommaaccent Otilde -50 +KPX Kcommaaccent e -35 +KPX Kcommaaccent eacute -35 +KPX Kcommaaccent ecaron -35 +KPX Kcommaaccent ecircumflex -35 +KPX Kcommaaccent edieresis -35 +KPX Kcommaaccent edotaccent -35 +KPX Kcommaaccent egrave -35 +KPX Kcommaaccent emacron -35 +KPX Kcommaaccent eogonek -35 +KPX Kcommaaccent o -40 +KPX Kcommaaccent oacute -40 +KPX Kcommaaccent ocircumflex -40 +KPX Kcommaaccent odieresis -40 +KPX Kcommaaccent ograve -40 +KPX Kcommaaccent ohungarumlaut -40 +KPX Kcommaaccent omacron -40 +KPX Kcommaaccent oslash -40 +KPX Kcommaaccent otilde -40 +KPX Kcommaaccent u -40 +KPX Kcommaaccent uacute -40 +KPX Kcommaaccent ucircumflex -40 +KPX Kcommaaccent udieresis -40 +KPX Kcommaaccent ugrave -40 +KPX Kcommaaccent uhungarumlaut -40 +KPX Kcommaaccent umacron -40 +KPX Kcommaaccent uogonek -40 +KPX Kcommaaccent uring -40 +KPX Kcommaaccent y -40 +KPX Kcommaaccent yacute -40 +KPX Kcommaaccent ydieresis -40 +KPX L T -20 +KPX L Tcaron -20 +KPX L Tcommaaccent -20 +KPX L V -55 +KPX L W -55 +KPX L Y -20 +KPX L Yacute -20 +KPX L Ydieresis -20 +KPX L quoteright -37 +KPX L y -30 +KPX L yacute -30 +KPX L ydieresis -30 +KPX Lacute T -20 +KPX Lacute Tcaron -20 +KPX Lacute Tcommaaccent -20 +KPX Lacute V -55 +KPX Lacute W -55 +KPX Lacute Y -20 +KPX Lacute Yacute -20 +KPX Lacute Ydieresis -20 +KPX Lacute quoteright -37 +KPX Lacute y -30 +KPX Lacute yacute -30 +KPX Lacute ydieresis -30 +KPX Lcommaaccent T -20 +KPX Lcommaaccent Tcaron -20 +KPX Lcommaaccent Tcommaaccent -20 +KPX Lcommaaccent V -55 +KPX Lcommaaccent W -55 +KPX Lcommaaccent Y -20 +KPX Lcommaaccent Yacute -20 +KPX Lcommaaccent Ydieresis -20 +KPX Lcommaaccent quoteright -37 +KPX Lcommaaccent y -30 +KPX Lcommaaccent yacute -30 +KPX Lcommaaccent ydieresis -30 +KPX Lslash T -20 +KPX Lslash Tcaron -20 +KPX Lslash Tcommaaccent -20 +KPX Lslash V -55 +KPX Lslash W -55 +KPX Lslash Y -20 +KPX Lslash Yacute -20 +KPX Lslash Ydieresis -20 +KPX Lslash quoteright -37 +KPX Lslash y -30 +KPX Lslash yacute -30 +KPX Lslash ydieresis -30 +KPX N A -27 +KPX N Aacute -27 +KPX N Abreve -27 +KPX N Acircumflex -27 +KPX N Adieresis -27 +KPX N Agrave -27 +KPX N Amacron -27 +KPX N Aogonek -27 +KPX N Aring -27 +KPX N Atilde -27 +KPX Nacute A -27 +KPX Nacute Aacute -27 +KPX Nacute Abreve -27 +KPX Nacute Acircumflex -27 +KPX Nacute Adieresis -27 +KPX Nacute Agrave -27 +KPX Nacute Amacron -27 +KPX Nacute Aogonek -27 +KPX Nacute Aring -27 +KPX Nacute Atilde -27 +KPX Ncaron A -27 +KPX Ncaron Aacute -27 +KPX Ncaron Abreve -27 +KPX Ncaron Acircumflex -27 +KPX Ncaron Adieresis -27 +KPX Ncaron Agrave -27 +KPX Ncaron Amacron -27 +KPX Ncaron Aogonek -27 +KPX Ncaron Aring -27 +KPX Ncaron Atilde -27 +KPX Ncommaaccent A -27 +KPX Ncommaaccent Aacute -27 +KPX Ncommaaccent Abreve -27 +KPX Ncommaaccent Acircumflex -27 +KPX Ncommaaccent Adieresis -27 +KPX Ncommaaccent Agrave -27 +KPX Ncommaaccent Amacron -27 +KPX Ncommaaccent Aogonek -27 +KPX Ncommaaccent Aring -27 +KPX Ncommaaccent Atilde -27 +KPX Ntilde A -27 +KPX Ntilde Aacute -27 +KPX Ntilde Abreve -27 +KPX Ntilde Acircumflex -27 +KPX Ntilde Adieresis -27 +KPX Ntilde Agrave -27 +KPX Ntilde Amacron -27 +KPX Ntilde Aogonek -27 +KPX Ntilde Aring -27 +KPX Ntilde Atilde -27 +KPX O A -55 +KPX O Aacute -55 +KPX O Abreve -55 +KPX O Acircumflex -55 +KPX O Adieresis -55 +KPX O Agrave -55 +KPX O Amacron -55 +KPX O Aogonek -55 +KPX O Aring -55 +KPX O Atilde -55 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -50 +KPX O X -40 +KPX O Y -50 +KPX O Yacute -50 +KPX O Ydieresis -50 +KPX Oacute A -55 +KPX Oacute Aacute -55 +KPX Oacute Abreve -55 +KPX Oacute Acircumflex -55 +KPX Oacute Adieresis -55 +KPX Oacute Agrave -55 +KPX Oacute Amacron -55 +KPX Oacute Aogonek -55 +KPX Oacute Aring -55 +KPX Oacute Atilde -55 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -50 +KPX Oacute X -40 +KPX Oacute Y -50 +KPX Oacute Yacute -50 +KPX Oacute Ydieresis -50 +KPX Ocircumflex A -55 +KPX Ocircumflex Aacute -55 +KPX Ocircumflex Abreve -55 +KPX Ocircumflex Acircumflex -55 +KPX Ocircumflex Adieresis -55 +KPX Ocircumflex Agrave -55 +KPX Ocircumflex Amacron -55 +KPX Ocircumflex Aogonek -55 +KPX Ocircumflex Aring -55 +KPX Ocircumflex Atilde -55 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -50 +KPX Ocircumflex X -40 +KPX Ocircumflex Y -50 +KPX Ocircumflex Yacute -50 +KPX Ocircumflex Ydieresis -50 +KPX Odieresis A -55 +KPX Odieresis Aacute -55 +KPX Odieresis Abreve -55 +KPX Odieresis Acircumflex -55 +KPX Odieresis Adieresis -55 +KPX Odieresis Agrave -55 +KPX Odieresis Amacron -55 +KPX Odieresis Aogonek -55 +KPX Odieresis Aring -55 +KPX Odieresis Atilde -55 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -50 +KPX Odieresis X -40 +KPX Odieresis Y -50 +KPX Odieresis Yacute -50 +KPX Odieresis Ydieresis -50 +KPX Ograve A -55 +KPX Ograve Aacute -55 +KPX Ograve Abreve -55 +KPX Ograve Acircumflex -55 +KPX Ograve Adieresis -55 +KPX Ograve Agrave -55 +KPX Ograve Amacron -55 +KPX Ograve Aogonek -55 +KPX Ograve Aring -55 +KPX Ograve Atilde -55 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -50 +KPX Ograve X -40 +KPX Ograve Y -50 +KPX Ograve Yacute -50 +KPX Ograve Ydieresis -50 +KPX Ohungarumlaut A -55 +KPX Ohungarumlaut Aacute -55 +KPX Ohungarumlaut Abreve -55 +KPX Ohungarumlaut Acircumflex -55 +KPX Ohungarumlaut Adieresis -55 +KPX Ohungarumlaut Agrave -55 +KPX Ohungarumlaut Amacron -55 +KPX Ohungarumlaut Aogonek -55 +KPX Ohungarumlaut Aring -55 +KPX Ohungarumlaut Atilde -55 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -50 +KPX Ohungarumlaut X -40 +KPX Ohungarumlaut Y -50 +KPX Ohungarumlaut Yacute -50 +KPX Ohungarumlaut Ydieresis -50 +KPX Omacron A -55 +KPX Omacron Aacute -55 +KPX Omacron Abreve -55 +KPX Omacron Acircumflex -55 +KPX Omacron Adieresis -55 +KPX Omacron Agrave -55 +KPX Omacron Amacron -55 +KPX Omacron Aogonek -55 +KPX Omacron Aring -55 +KPX Omacron Atilde -55 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -50 +KPX Omacron X -40 +KPX Omacron Y -50 +KPX Omacron Yacute -50 +KPX Omacron Ydieresis -50 +KPX Oslash A -55 +KPX Oslash Aacute -55 +KPX Oslash Abreve -55 +KPX Oslash Acircumflex -55 +KPX Oslash Adieresis -55 +KPX Oslash Agrave -55 +KPX Oslash Amacron -55 +KPX Oslash Aogonek -55 +KPX Oslash Aring -55 +KPX Oslash Atilde -55 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -50 +KPX Oslash X -40 +KPX Oslash Y -50 +KPX Oslash Yacute -50 +KPX Oslash Ydieresis -50 +KPX Otilde A -55 +KPX Otilde Aacute -55 +KPX Otilde Abreve -55 +KPX Otilde Acircumflex -55 +KPX Otilde Adieresis -55 +KPX Otilde Agrave -55 +KPX Otilde Amacron -55 +KPX Otilde Aogonek -55 +KPX Otilde Aring -55 +KPX Otilde Atilde -55 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -50 +KPX Otilde X -40 +KPX Otilde Y -50 +KPX Otilde Yacute -50 +KPX Otilde Ydieresis -50 +KPX P A -90 +KPX P Aacute -90 +KPX P Abreve -90 +KPX P Acircumflex -90 +KPX P Adieresis -90 +KPX P Agrave -90 +KPX P Amacron -90 +KPX P Aogonek -90 +KPX P Aring -90 +KPX P Atilde -90 +KPX P a -80 +KPX P aacute -80 +KPX P abreve -80 +KPX P acircumflex -80 +KPX P adieresis -80 +KPX P agrave -80 +KPX P amacron -80 +KPX P aogonek -80 +KPX P aring -80 +KPX P atilde -80 +KPX P comma -135 +KPX P e -80 +KPX P eacute -80 +KPX P ecaron -80 +KPX P ecircumflex -80 +KPX P edieresis -80 +KPX P edotaccent -80 +KPX P egrave -80 +KPX P emacron -80 +KPX P eogonek -80 +KPX P o -80 +KPX P oacute -80 +KPX P ocircumflex -80 +KPX P odieresis -80 +KPX P ograve -80 +KPX P ohungarumlaut -80 +KPX P omacron -80 +KPX P oslash -80 +KPX P otilde -80 +KPX P period -135 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX R O -40 +KPX R Oacute -40 +KPX R Ocircumflex -40 +KPX R Odieresis -40 +KPX R Ograve -40 +KPX R Ohungarumlaut -40 +KPX R Omacron -40 +KPX R Oslash -40 +KPX R Otilde -40 +KPX R U -40 +KPX R Uacute -40 +KPX R Ucircumflex -40 +KPX R Udieresis -40 +KPX R Ugrave -40 +KPX R Uhungarumlaut -40 +KPX R Umacron -40 +KPX R Uogonek -40 +KPX R Uring -40 +KPX R V -18 +KPX R W -18 +KPX R Y -18 +KPX R Yacute -18 +KPX R Ydieresis -18 +KPX Racute O -40 +KPX Racute Oacute -40 +KPX Racute Ocircumflex -40 +KPX Racute Odieresis -40 +KPX Racute Ograve -40 +KPX Racute Ohungarumlaut -40 +KPX Racute Omacron -40 +KPX Racute Oslash -40 +KPX Racute Otilde -40 +KPX Racute U -40 +KPX Racute Uacute -40 +KPX Racute Ucircumflex -40 +KPX Racute Udieresis -40 +KPX Racute Ugrave -40 +KPX Racute Uhungarumlaut -40 +KPX Racute Umacron -40 +KPX Racute Uogonek -40 +KPX Racute Uring -40 +KPX Racute V -18 +KPX Racute W -18 +KPX Racute Y -18 +KPX Racute Yacute -18 +KPX Racute Ydieresis -18 +KPX Rcaron O -40 +KPX Rcaron Oacute -40 +KPX Rcaron Ocircumflex -40 +KPX Rcaron Odieresis -40 +KPX Rcaron Ograve -40 +KPX Rcaron Ohungarumlaut -40 +KPX Rcaron Omacron -40 +KPX Rcaron Oslash -40 +KPX Rcaron Otilde -40 +KPX Rcaron U -40 +KPX Rcaron Uacute -40 +KPX Rcaron Ucircumflex -40 +KPX Rcaron Udieresis -40 +KPX Rcaron Ugrave -40 +KPX Rcaron Uhungarumlaut -40 +KPX Rcaron Umacron -40 +KPX Rcaron Uogonek -40 +KPX Rcaron Uring -40 +KPX Rcaron V -18 +KPX Rcaron W -18 +KPX Rcaron Y -18 +KPX Rcaron Yacute -18 +KPX Rcaron Ydieresis -18 +KPX Rcommaaccent O -40 +KPX Rcommaaccent Oacute -40 +KPX Rcommaaccent Ocircumflex -40 +KPX Rcommaaccent Odieresis -40 +KPX Rcommaaccent Ograve -40 +KPX Rcommaaccent Ohungarumlaut -40 +KPX Rcommaaccent Omacron -40 +KPX Rcommaaccent Oslash -40 +KPX Rcommaaccent Otilde -40 +KPX Rcommaaccent U -40 +KPX Rcommaaccent Uacute -40 +KPX Rcommaaccent Ucircumflex -40 +KPX Rcommaaccent Udieresis -40 +KPX Rcommaaccent Ugrave -40 +KPX Rcommaaccent Uhungarumlaut -40 +KPX Rcommaaccent Umacron -40 +KPX Rcommaaccent Uogonek -40 +KPX Rcommaaccent Uring -40 +KPX Rcommaaccent V -18 +KPX Rcommaaccent W -18 +KPX Rcommaaccent Y -18 +KPX Rcommaaccent Yacute -18 +KPX Rcommaaccent Ydieresis -18 +KPX T A -50 +KPX T Aacute -50 +KPX T Abreve -50 +KPX T Acircumflex -50 +KPX T Adieresis -50 +KPX T Agrave -50 +KPX T Amacron -50 +KPX T Aogonek -50 +KPX T Aring -50 +KPX T Atilde -50 +KPX T O -18 +KPX T Oacute -18 +KPX T Ocircumflex -18 +KPX T Odieresis -18 +KPX T Ograve -18 +KPX T Ohungarumlaut -18 +KPX T Omacron -18 +KPX T Oslash -18 +KPX T Otilde -18 +KPX T a -92 +KPX T aacute -92 +KPX T abreve -92 +KPX T acircumflex -92 +KPX T adieresis -92 +KPX T agrave -92 +KPX T amacron -92 +KPX T aogonek -92 +KPX T aring -92 +KPX T atilde -92 +KPX T colon -55 +KPX T comma -74 +KPX T e -92 +KPX T eacute -92 +KPX T ecaron -92 +KPX T ecircumflex -52 +KPX T edieresis -52 +KPX T edotaccent -92 +KPX T egrave -52 +KPX T emacron -52 +KPX T eogonek -92 +KPX T hyphen -74 +KPX T i -55 +KPX T iacute -55 +KPX T iogonek -55 +KPX T o -92 +KPX T oacute -92 +KPX T ocircumflex -92 +KPX T odieresis -92 +KPX T ograve -92 +KPX T ohungarumlaut -92 +KPX T omacron -92 +KPX T oslash -92 +KPX T otilde -92 +KPX T period -74 +KPX T r -55 +KPX T racute -55 +KPX T rcaron -55 +KPX T rcommaaccent -55 +KPX T semicolon -65 +KPX T u -55 +KPX T uacute -55 +KPX T ucircumflex -55 +KPX T udieresis -55 +KPX T ugrave -55 +KPX T uhungarumlaut -55 +KPX T umacron -55 +KPX T uogonek -55 +KPX T uring -55 +KPX T w -74 +KPX T y -74 +KPX T yacute -74 +KPX T ydieresis -34 +KPX Tcaron A -50 +KPX Tcaron Aacute -50 +KPX Tcaron Abreve -50 +KPX Tcaron Acircumflex -50 +KPX Tcaron Adieresis -50 +KPX Tcaron Agrave -50 +KPX Tcaron Amacron -50 +KPX Tcaron Aogonek -50 +KPX Tcaron Aring -50 +KPX Tcaron Atilde -50 +KPX Tcaron O -18 +KPX Tcaron Oacute -18 +KPX Tcaron Ocircumflex -18 +KPX Tcaron Odieresis -18 +KPX Tcaron Ograve -18 +KPX Tcaron Ohungarumlaut -18 +KPX Tcaron Omacron -18 +KPX Tcaron Oslash -18 +KPX Tcaron Otilde -18 +KPX Tcaron a -92 +KPX Tcaron aacute -92 +KPX Tcaron abreve -92 +KPX Tcaron acircumflex -92 +KPX Tcaron adieresis -92 +KPX Tcaron agrave -92 +KPX Tcaron amacron -92 +KPX Tcaron aogonek -92 +KPX Tcaron aring -92 +KPX Tcaron atilde -92 +KPX Tcaron colon -55 +KPX Tcaron comma -74 +KPX Tcaron e -92 +KPX Tcaron eacute -92 +KPX Tcaron ecaron -92 +KPX Tcaron ecircumflex -52 +KPX Tcaron edieresis -52 +KPX Tcaron edotaccent -92 +KPX Tcaron egrave -52 +KPX Tcaron emacron -52 +KPX Tcaron eogonek -92 +KPX Tcaron hyphen -74 +KPX Tcaron i -55 +KPX Tcaron iacute -55 +KPX Tcaron iogonek -55 +KPX Tcaron o -92 +KPX Tcaron oacute -92 +KPX Tcaron ocircumflex -92 +KPX Tcaron odieresis -92 +KPX Tcaron ograve -92 +KPX Tcaron ohungarumlaut -92 +KPX Tcaron omacron -92 +KPX Tcaron oslash -92 +KPX Tcaron otilde -92 +KPX Tcaron period -74 +KPX Tcaron r -55 +KPX Tcaron racute -55 +KPX Tcaron rcaron -55 +KPX Tcaron rcommaaccent -55 +KPX Tcaron semicolon -65 +KPX Tcaron u -55 +KPX Tcaron uacute -55 +KPX Tcaron ucircumflex -55 +KPX Tcaron udieresis -55 +KPX Tcaron ugrave -55 +KPX Tcaron uhungarumlaut -55 +KPX Tcaron umacron -55 +KPX Tcaron uogonek -55 +KPX Tcaron uring -55 +KPX Tcaron w -74 +KPX Tcaron y -74 +KPX Tcaron yacute -74 +KPX Tcaron ydieresis -34 +KPX Tcommaaccent A -50 +KPX Tcommaaccent Aacute -50 +KPX Tcommaaccent Abreve -50 +KPX Tcommaaccent Acircumflex -50 +KPX Tcommaaccent Adieresis -50 +KPX Tcommaaccent Agrave -50 +KPX Tcommaaccent Amacron -50 +KPX Tcommaaccent Aogonek -50 +KPX Tcommaaccent Aring -50 +KPX Tcommaaccent Atilde -50 +KPX Tcommaaccent O -18 +KPX Tcommaaccent Oacute -18 +KPX Tcommaaccent Ocircumflex -18 +KPX Tcommaaccent Odieresis -18 +KPX Tcommaaccent Ograve -18 +KPX Tcommaaccent Ohungarumlaut -18 +KPX Tcommaaccent Omacron -18 +KPX Tcommaaccent Oslash -18 +KPX Tcommaaccent Otilde -18 +KPX Tcommaaccent a -92 +KPX Tcommaaccent aacute -92 +KPX Tcommaaccent abreve -92 +KPX Tcommaaccent acircumflex -92 +KPX Tcommaaccent adieresis -92 +KPX Tcommaaccent agrave -92 +KPX Tcommaaccent amacron -92 +KPX Tcommaaccent aogonek -92 +KPX Tcommaaccent aring -92 +KPX Tcommaaccent atilde -92 +KPX Tcommaaccent colon -55 +KPX Tcommaaccent comma -74 +KPX Tcommaaccent e -92 +KPX Tcommaaccent eacute -92 +KPX Tcommaaccent ecaron -92 +KPX Tcommaaccent ecircumflex -52 +KPX Tcommaaccent edieresis -52 +KPX Tcommaaccent edotaccent -92 +KPX Tcommaaccent egrave -52 +KPX Tcommaaccent emacron -52 +KPX Tcommaaccent eogonek -92 +KPX Tcommaaccent hyphen -74 +KPX Tcommaaccent i -55 +KPX Tcommaaccent iacute -55 +KPX Tcommaaccent iogonek -55 +KPX Tcommaaccent o -92 +KPX Tcommaaccent oacute -92 +KPX Tcommaaccent ocircumflex -92 +KPX Tcommaaccent odieresis -92 +KPX Tcommaaccent ograve -92 +KPX Tcommaaccent ohungarumlaut -92 +KPX Tcommaaccent omacron -92 +KPX Tcommaaccent oslash -92 +KPX Tcommaaccent otilde -92 +KPX Tcommaaccent period -74 +KPX Tcommaaccent r -55 +KPX Tcommaaccent racute -55 +KPX Tcommaaccent rcaron -55 +KPX Tcommaaccent rcommaaccent -55 +KPX Tcommaaccent semicolon -65 +KPX Tcommaaccent u -55 +KPX Tcommaaccent uacute -55 +KPX Tcommaaccent ucircumflex -55 +KPX Tcommaaccent udieresis -55 +KPX Tcommaaccent ugrave -55 +KPX Tcommaaccent uhungarumlaut -55 +KPX Tcommaaccent umacron -55 +KPX Tcommaaccent uogonek -55 +KPX Tcommaaccent uring -55 +KPX Tcommaaccent w -74 +KPX Tcommaaccent y -74 +KPX Tcommaaccent yacute -74 +KPX Tcommaaccent ydieresis -34 +KPX U A -40 +KPX U Aacute -40 +KPX U Abreve -40 +KPX U Acircumflex -40 +KPX U Adieresis -40 +KPX U Agrave -40 +KPX U Amacron -40 +KPX U Aogonek -40 +KPX U Aring -40 +KPX U Atilde -40 +KPX U comma -25 +KPX U period -25 +KPX Uacute A -40 +KPX Uacute Aacute -40 +KPX Uacute Abreve -40 +KPX Uacute Acircumflex -40 +KPX Uacute Adieresis -40 +KPX Uacute Agrave -40 +KPX Uacute Amacron -40 +KPX Uacute Aogonek -40 +KPX Uacute Aring -40 +KPX Uacute Atilde -40 +KPX Uacute comma -25 +KPX Uacute period -25 +KPX Ucircumflex A -40 +KPX Ucircumflex Aacute -40 +KPX Ucircumflex Abreve -40 +KPX Ucircumflex Acircumflex -40 +KPX Ucircumflex Adieresis -40 +KPX Ucircumflex Agrave -40 +KPX Ucircumflex Amacron -40 +KPX Ucircumflex Aogonek -40 +KPX Ucircumflex Aring -40 +KPX Ucircumflex Atilde -40 +KPX Ucircumflex comma -25 +KPX Ucircumflex period -25 +KPX Udieresis A -40 +KPX Udieresis Aacute -40 +KPX Udieresis Abreve -40 +KPX Udieresis Acircumflex -40 +KPX Udieresis Adieresis -40 +KPX Udieresis Agrave -40 +KPX Udieresis Amacron -40 +KPX Udieresis Aogonek -40 +KPX Udieresis Aring -40 +KPX Udieresis Atilde -40 +KPX Udieresis comma -25 +KPX Udieresis period -25 +KPX Ugrave A -40 +KPX Ugrave Aacute -40 +KPX Ugrave Abreve -40 +KPX Ugrave Acircumflex -40 +KPX Ugrave Adieresis -40 +KPX Ugrave Agrave -40 +KPX Ugrave Amacron -40 +KPX Ugrave Aogonek -40 +KPX Ugrave Aring -40 +KPX Ugrave Atilde -40 +KPX Ugrave comma -25 +KPX Ugrave period -25 +KPX Uhungarumlaut A -40 +KPX Uhungarumlaut Aacute -40 +KPX Uhungarumlaut Abreve -40 +KPX Uhungarumlaut Acircumflex -40 +KPX Uhungarumlaut Adieresis -40 +KPX Uhungarumlaut Agrave -40 +KPX Uhungarumlaut Amacron -40 +KPX Uhungarumlaut Aogonek -40 +KPX Uhungarumlaut Aring -40 +KPX Uhungarumlaut Atilde -40 +KPX Uhungarumlaut comma -25 +KPX Uhungarumlaut period -25 +KPX Umacron A -40 +KPX Umacron Aacute -40 +KPX Umacron Abreve -40 +KPX Umacron Acircumflex -40 +KPX Umacron Adieresis -40 +KPX Umacron Agrave -40 +KPX Umacron Amacron -40 +KPX Umacron Aogonek -40 +KPX Umacron Aring -40 +KPX Umacron Atilde -40 +KPX Umacron comma -25 +KPX Umacron period -25 +KPX Uogonek A -40 +KPX Uogonek Aacute -40 +KPX Uogonek Abreve -40 +KPX Uogonek Acircumflex -40 +KPX Uogonek Adieresis -40 +KPX Uogonek Agrave -40 +KPX Uogonek Amacron -40 +KPX Uogonek Aogonek -40 +KPX Uogonek Aring -40 +KPX Uogonek Atilde -40 +KPX Uogonek comma -25 +KPX Uogonek period -25 +KPX Uring A -40 +KPX Uring Aacute -40 +KPX Uring Abreve -40 +KPX Uring Acircumflex -40 +KPX Uring Adieresis -40 +KPX Uring Agrave -40 +KPX Uring Amacron -40 +KPX Uring Aogonek -40 +KPX Uring Aring -40 +KPX Uring Atilde -40 +KPX Uring comma -25 +KPX Uring period -25 +KPX V A -60 +KPX V Aacute -60 +KPX V Abreve -60 +KPX V Acircumflex -60 +KPX V Adieresis -60 +KPX V Agrave -60 +KPX V Amacron -60 +KPX V Aogonek -60 +KPX V Aring -60 +KPX V Atilde -60 +KPX V O -30 +KPX V Oacute -30 +KPX V Ocircumflex -30 +KPX V Odieresis -30 +KPX V Ograve -30 +KPX V Ohungarumlaut -30 +KPX V Omacron -30 +KPX V Oslash -30 +KPX V Otilde -30 +KPX V a -111 +KPX V aacute -111 +KPX V abreve -111 +KPX V acircumflex -111 +KPX V adieresis -111 +KPX V agrave -111 +KPX V amacron -111 +KPX V aogonek -111 +KPX V aring -111 +KPX V atilde -111 +KPX V colon -65 +KPX V comma -129 +KPX V e -111 +KPX V eacute -111 +KPX V ecaron -111 +KPX V ecircumflex -111 +KPX V edieresis -71 +KPX V edotaccent -111 +KPX V egrave -71 +KPX V emacron -71 +KPX V eogonek -111 +KPX V hyphen -55 +KPX V i -74 +KPX V iacute -74 +KPX V icircumflex -34 +KPX V idieresis -34 +KPX V igrave -34 +KPX V imacron -34 +KPX V iogonek -74 +KPX V o -111 +KPX V oacute -111 +KPX V ocircumflex -111 +KPX V odieresis -111 +KPX V ograve -111 +KPX V ohungarumlaut -111 +KPX V omacron -111 +KPX V oslash -111 +KPX V otilde -111 +KPX V period -129 +KPX V semicolon -74 +KPX V u -74 +KPX V uacute -74 +KPX V ucircumflex -74 +KPX V udieresis -74 +KPX V ugrave -74 +KPX V uhungarumlaut -74 +KPX V umacron -74 +KPX V uogonek -74 +KPX V uring -74 +KPX W A -60 +KPX W Aacute -60 +KPX W Abreve -60 +KPX W Acircumflex -60 +KPX W Adieresis -60 +KPX W Agrave -60 +KPX W Amacron -60 +KPX W Aogonek -60 +KPX W Aring -60 +KPX W Atilde -60 +KPX W O -25 +KPX W Oacute -25 +KPX W Ocircumflex -25 +KPX W Odieresis -25 +KPX W Ograve -25 +KPX W Ohungarumlaut -25 +KPX W Omacron -25 +KPX W Oslash -25 +KPX W Otilde -25 +KPX W a -92 +KPX W aacute -92 +KPX W abreve -92 +KPX W acircumflex -92 +KPX W adieresis -92 +KPX W agrave -92 +KPX W amacron -92 +KPX W aogonek -92 +KPX W aring -92 +KPX W atilde -92 +KPX W colon -65 +KPX W comma -92 +KPX W e -92 +KPX W eacute -92 +KPX W ecaron -92 +KPX W ecircumflex -92 +KPX W edieresis -52 +KPX W edotaccent -92 +KPX W egrave -52 +KPX W emacron -52 +KPX W eogonek -92 +KPX W hyphen -37 +KPX W i -55 +KPX W iacute -55 +KPX W iogonek -55 +KPX W o -92 +KPX W oacute -92 +KPX W ocircumflex -92 +KPX W odieresis -92 +KPX W ograve -92 +KPX W ohungarumlaut -92 +KPX W omacron -92 +KPX W oslash -92 +KPX W otilde -92 +KPX W period -92 +KPX W semicolon -65 +KPX W u -55 +KPX W uacute -55 +KPX W ucircumflex -55 +KPX W udieresis -55 +KPX W ugrave -55 +KPX W uhungarumlaut -55 +KPX W umacron -55 +KPX W uogonek -55 +KPX W uring -55 +KPX W y -70 +KPX W yacute -70 +KPX W ydieresis -70 +KPX Y A -50 +KPX Y Aacute -50 +KPX Y Abreve -50 +KPX Y Acircumflex -50 +KPX Y Adieresis -50 +KPX Y Agrave -50 +KPX Y Amacron -50 +KPX Y Aogonek -50 +KPX Y Aring -50 +KPX Y Atilde -50 +KPX Y O -15 +KPX Y Oacute -15 +KPX Y Ocircumflex -15 +KPX Y Odieresis -15 +KPX Y Ograve -15 +KPX Y Ohungarumlaut -15 +KPX Y Omacron -15 +KPX Y Oslash -15 +KPX Y Otilde -15 +KPX Y a -92 +KPX Y aacute -92 +KPX Y abreve -92 +KPX Y acircumflex -92 +KPX Y adieresis -92 +KPX Y agrave -92 +KPX Y amacron -92 +KPX Y aogonek -92 +KPX Y aring -92 +KPX Y atilde -92 +KPX Y colon -65 +KPX Y comma -92 +KPX Y e -92 +KPX Y eacute -92 +KPX Y ecaron -92 +KPX Y ecircumflex -92 +KPX Y edieresis -52 +KPX Y edotaccent -92 +KPX Y egrave -52 +KPX Y emacron -52 +KPX Y eogonek -92 +KPX Y hyphen -74 +KPX Y i -74 +KPX Y iacute -74 +KPX Y icircumflex -34 +KPX Y idieresis -34 +KPX Y igrave -34 +KPX Y imacron -34 +KPX Y iogonek -74 +KPX Y o -92 +KPX Y oacute -92 +KPX Y ocircumflex -92 +KPX Y odieresis -92 +KPX Y ograve -92 +KPX Y ohungarumlaut -92 +KPX Y omacron -92 +KPX Y oslash -92 +KPX Y otilde -92 +KPX Y period -92 +KPX Y semicolon -65 +KPX Y u -92 +KPX Y uacute -92 +KPX Y ucircumflex -92 +KPX Y udieresis -92 +KPX Y ugrave -92 +KPX Y uhungarumlaut -92 +KPX Y umacron -92 +KPX Y uogonek -92 +KPX Y uring -92 +KPX Yacute A -50 +KPX Yacute Aacute -50 +KPX Yacute Abreve -50 +KPX Yacute Acircumflex -50 +KPX Yacute Adieresis -50 +KPX Yacute Agrave -50 +KPX Yacute Amacron -50 +KPX Yacute Aogonek -50 +KPX Yacute Aring -50 +KPX Yacute Atilde -50 +KPX Yacute O -15 +KPX Yacute Oacute -15 +KPX Yacute Ocircumflex -15 +KPX Yacute Odieresis -15 +KPX Yacute Ograve -15 +KPX Yacute Ohungarumlaut -15 +KPX Yacute Omacron -15 +KPX Yacute Oslash -15 +KPX Yacute Otilde -15 +KPX Yacute a -92 +KPX Yacute aacute -92 +KPX Yacute abreve -92 +KPX Yacute acircumflex -92 +KPX Yacute adieresis -92 +KPX Yacute agrave -92 +KPX Yacute amacron -92 +KPX Yacute aogonek -92 +KPX Yacute aring -92 +KPX Yacute atilde -92 +KPX Yacute colon -65 +KPX Yacute comma -92 +KPX Yacute e -92 +KPX Yacute eacute -92 +KPX Yacute ecaron -92 +KPX Yacute ecircumflex -92 +KPX Yacute edieresis -52 +KPX Yacute edotaccent -92 +KPX Yacute egrave -52 +KPX Yacute emacron -52 +KPX Yacute eogonek -92 +KPX Yacute hyphen -74 +KPX Yacute i -74 +KPX Yacute iacute -74 +KPX Yacute icircumflex -34 +KPX Yacute idieresis -34 +KPX Yacute igrave -34 +KPX Yacute imacron -34 +KPX Yacute iogonek -74 +KPX Yacute o -92 +KPX Yacute oacute -92 +KPX Yacute ocircumflex -92 +KPX Yacute odieresis -92 +KPX Yacute ograve -92 +KPX Yacute ohungarumlaut -92 +KPX Yacute omacron -92 +KPX Yacute oslash -92 +KPX Yacute otilde -92 +KPX Yacute period -92 +KPX Yacute semicolon -65 +KPX Yacute u -92 +KPX Yacute uacute -92 +KPX Yacute ucircumflex -92 +KPX Yacute udieresis -92 +KPX Yacute ugrave -92 +KPX Yacute uhungarumlaut -92 +KPX Yacute umacron -92 +KPX Yacute uogonek -92 +KPX Yacute uring -92 +KPX Ydieresis A -50 +KPX Ydieresis Aacute -50 +KPX Ydieresis Abreve -50 +KPX Ydieresis Acircumflex -50 +KPX Ydieresis Adieresis -50 +KPX Ydieresis Agrave -50 +KPX Ydieresis Amacron -50 +KPX Ydieresis Aogonek -50 +KPX Ydieresis Aring -50 +KPX Ydieresis Atilde -50 +KPX Ydieresis O -15 +KPX Ydieresis Oacute -15 +KPX Ydieresis Ocircumflex -15 +KPX Ydieresis Odieresis -15 +KPX Ydieresis Ograve -15 +KPX Ydieresis Ohungarumlaut -15 +KPX Ydieresis Omacron -15 +KPX Ydieresis Oslash -15 +KPX Ydieresis Otilde -15 +KPX Ydieresis a -92 +KPX Ydieresis aacute -92 +KPX Ydieresis abreve -92 +KPX Ydieresis acircumflex -92 +KPX Ydieresis adieresis -92 +KPX Ydieresis agrave -92 +KPX Ydieresis amacron -92 +KPX Ydieresis aogonek -92 +KPX Ydieresis aring -92 +KPX Ydieresis atilde -92 +KPX Ydieresis colon -65 +KPX Ydieresis comma -92 +KPX Ydieresis e -92 +KPX Ydieresis eacute -92 +KPX Ydieresis ecaron -92 +KPX Ydieresis ecircumflex -92 +KPX Ydieresis edieresis -52 +KPX Ydieresis edotaccent -92 +KPX Ydieresis egrave -52 +KPX Ydieresis emacron -52 +KPX Ydieresis eogonek -92 +KPX Ydieresis hyphen -74 +KPX Ydieresis i -74 +KPX Ydieresis iacute -74 +KPX Ydieresis icircumflex -34 +KPX Ydieresis idieresis -34 +KPX Ydieresis igrave -34 +KPX Ydieresis imacron -34 +KPX Ydieresis iogonek -74 +KPX Ydieresis o -92 +KPX Ydieresis oacute -92 +KPX Ydieresis ocircumflex -92 +KPX Ydieresis odieresis -92 +KPX Ydieresis ograve -92 +KPX Ydieresis ohungarumlaut -92 +KPX Ydieresis omacron -92 +KPX Ydieresis oslash -92 +KPX Ydieresis otilde -92 +KPX Ydieresis period -92 +KPX Ydieresis semicolon -65 +KPX Ydieresis u -92 +KPX Ydieresis uacute -92 +KPX Ydieresis ucircumflex -92 +KPX Ydieresis udieresis -92 +KPX Ydieresis ugrave -92 +KPX Ydieresis uhungarumlaut -92 +KPX Ydieresis umacron -92 +KPX Ydieresis uogonek -92 +KPX Ydieresis uring -92 +KPX a g -10 +KPX a gbreve -10 +KPX a gcommaaccent -10 +KPX aacute g -10 +KPX aacute gbreve -10 +KPX aacute gcommaaccent -10 +KPX abreve g -10 +KPX abreve gbreve -10 +KPX abreve gcommaaccent -10 +KPX acircumflex g -10 +KPX acircumflex gbreve -10 +KPX acircumflex gcommaaccent -10 +KPX adieresis g -10 +KPX adieresis gbreve -10 +KPX adieresis gcommaaccent -10 +KPX agrave g -10 +KPX agrave gbreve -10 +KPX agrave gcommaaccent -10 +KPX amacron g -10 +KPX amacron gbreve -10 +KPX amacron gcommaaccent -10 +KPX aogonek g -10 +KPX aogonek gbreve -10 +KPX aogonek gcommaaccent -10 +KPX aring g -10 +KPX aring gbreve -10 +KPX aring gcommaaccent -10 +KPX atilde g -10 +KPX atilde gbreve -10 +KPX atilde gcommaaccent -10 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX c h -15 +KPX c k -20 +KPX c kcommaaccent -20 +KPX cacute h -15 +KPX cacute k -20 +KPX cacute kcommaaccent -20 +KPX ccaron h -15 +KPX ccaron k -20 +KPX ccaron kcommaaccent -20 +KPX ccedilla h -15 +KPX ccedilla k -20 +KPX ccedilla kcommaaccent -20 +KPX comma quotedblright -140 +KPX comma quoteright -140 +KPX e comma -10 +KPX e g -40 +KPX e gbreve -40 +KPX e gcommaaccent -40 +KPX e period -15 +KPX e v -15 +KPX e w -15 +KPX e x -20 +KPX e y -30 +KPX e yacute -30 +KPX e ydieresis -30 +KPX eacute comma -10 +KPX eacute g -40 +KPX eacute gbreve -40 +KPX eacute gcommaaccent -40 +KPX eacute period -15 +KPX eacute v -15 +KPX eacute w -15 +KPX eacute x -20 +KPX eacute y -30 +KPX eacute yacute -30 +KPX eacute ydieresis -30 +KPX ecaron comma -10 +KPX ecaron g -40 +KPX ecaron gbreve -40 +KPX ecaron gcommaaccent -40 +KPX ecaron period -15 +KPX ecaron v -15 +KPX ecaron w -15 +KPX ecaron x -20 +KPX ecaron y -30 +KPX ecaron yacute -30 +KPX ecaron ydieresis -30 +KPX ecircumflex comma -10 +KPX ecircumflex g -40 +KPX ecircumflex gbreve -40 +KPX ecircumflex gcommaaccent -40 +KPX ecircumflex period -15 +KPX ecircumflex v -15 +KPX ecircumflex w -15 +KPX ecircumflex x -20 +KPX ecircumflex y -30 +KPX ecircumflex yacute -30 +KPX ecircumflex ydieresis -30 +KPX edieresis comma -10 +KPX edieresis g -40 +KPX edieresis gbreve -40 +KPX edieresis gcommaaccent -40 +KPX edieresis period -15 +KPX edieresis v -15 +KPX edieresis w -15 +KPX edieresis x -20 +KPX edieresis y -30 +KPX edieresis yacute -30 +KPX edieresis ydieresis -30 +KPX edotaccent comma -10 +KPX edotaccent g -40 +KPX edotaccent gbreve -40 +KPX edotaccent gcommaaccent -40 +KPX edotaccent period -15 +KPX edotaccent v -15 +KPX edotaccent w -15 +KPX edotaccent x -20 +KPX edotaccent y -30 +KPX edotaccent yacute -30 +KPX edotaccent ydieresis -30 +KPX egrave comma -10 +KPX egrave g -40 +KPX egrave gbreve -40 +KPX egrave gcommaaccent -40 +KPX egrave period -15 +KPX egrave v -15 +KPX egrave w -15 +KPX egrave x -20 +KPX egrave y -30 +KPX egrave yacute -30 +KPX egrave ydieresis -30 +KPX emacron comma -10 +KPX emacron g -40 +KPX emacron gbreve -40 +KPX emacron gcommaaccent -40 +KPX emacron period -15 +KPX emacron v -15 +KPX emacron w -15 +KPX emacron x -20 +KPX emacron y -30 +KPX emacron yacute -30 +KPX emacron ydieresis -30 +KPX eogonek comma -10 +KPX eogonek g -40 +KPX eogonek gbreve -40 +KPX eogonek gcommaaccent -40 +KPX eogonek period -15 +KPX eogonek v -15 +KPX eogonek w -15 +KPX eogonek x -20 +KPX eogonek y -30 +KPX eogonek yacute -30 +KPX eogonek ydieresis -30 +KPX f comma -10 +KPX f dotlessi -60 +KPX f f -18 +KPX f i -20 +KPX f iogonek -20 +KPX f period -15 +KPX f quoteright 92 +KPX g comma -10 +KPX g e -10 +KPX g eacute -10 +KPX g ecaron -10 +KPX g ecircumflex -10 +KPX g edieresis -10 +KPX g edotaccent -10 +KPX g egrave -10 +KPX g emacron -10 +KPX g eogonek -10 +KPX g g -10 +KPX g gbreve -10 +KPX g gcommaaccent -10 +KPX g period -15 +KPX gbreve comma -10 +KPX gbreve e -10 +KPX gbreve eacute -10 +KPX gbreve ecaron -10 +KPX gbreve ecircumflex -10 +KPX gbreve edieresis -10 +KPX gbreve edotaccent -10 +KPX gbreve egrave -10 +KPX gbreve emacron -10 +KPX gbreve eogonek -10 +KPX gbreve g -10 +KPX gbreve gbreve -10 +KPX gbreve gcommaaccent -10 +KPX gbreve period -15 +KPX gcommaaccent comma -10 +KPX gcommaaccent e -10 +KPX gcommaaccent eacute -10 +KPX gcommaaccent ecaron -10 +KPX gcommaaccent ecircumflex -10 +KPX gcommaaccent edieresis -10 +KPX gcommaaccent edotaccent -10 +KPX gcommaaccent egrave -10 +KPX gcommaaccent emacron -10 +KPX gcommaaccent eogonek -10 +KPX gcommaaccent g -10 +KPX gcommaaccent gbreve -10 +KPX gcommaaccent gcommaaccent -10 +KPX gcommaaccent period -15 +KPX k e -10 +KPX k eacute -10 +KPX k ecaron -10 +KPX k ecircumflex -10 +KPX k edieresis -10 +KPX k edotaccent -10 +KPX k egrave -10 +KPX k emacron -10 +KPX k eogonek -10 +KPX k o -10 +KPX k oacute -10 +KPX k ocircumflex -10 +KPX k odieresis -10 +KPX k ograve -10 +KPX k ohungarumlaut -10 +KPX k omacron -10 +KPX k oslash -10 +KPX k otilde -10 +KPX k y -10 +KPX k yacute -10 +KPX k ydieresis -10 +KPX kcommaaccent e -10 +KPX kcommaaccent eacute -10 +KPX kcommaaccent ecaron -10 +KPX kcommaaccent ecircumflex -10 +KPX kcommaaccent edieresis -10 +KPX kcommaaccent edotaccent -10 +KPX kcommaaccent egrave -10 +KPX kcommaaccent emacron -10 +KPX kcommaaccent eogonek -10 +KPX kcommaaccent o -10 +KPX kcommaaccent oacute -10 +KPX kcommaaccent ocircumflex -10 +KPX kcommaaccent odieresis -10 +KPX kcommaaccent ograve -10 +KPX kcommaaccent ohungarumlaut -10 +KPX kcommaaccent omacron -10 +KPX kcommaaccent oslash -10 +KPX kcommaaccent otilde -10 +KPX kcommaaccent y -10 +KPX kcommaaccent yacute -10 +KPX kcommaaccent ydieresis -10 +KPX n v -40 +KPX nacute v -40 +KPX ncaron v -40 +KPX ncommaaccent v -40 +KPX ntilde v -40 +KPX o g -10 +KPX o gbreve -10 +KPX o gcommaaccent -10 +KPX o v -10 +KPX oacute g -10 +KPX oacute gbreve -10 +KPX oacute gcommaaccent -10 +KPX oacute v -10 +KPX ocircumflex g -10 +KPX ocircumflex gbreve -10 +KPX ocircumflex gcommaaccent -10 +KPX ocircumflex v -10 +KPX odieresis g -10 +KPX odieresis gbreve -10 +KPX odieresis gcommaaccent -10 +KPX odieresis v -10 +KPX ograve g -10 +KPX ograve gbreve -10 +KPX ograve gcommaaccent -10 +KPX ograve v -10 +KPX ohungarumlaut g -10 +KPX ohungarumlaut gbreve -10 +KPX ohungarumlaut gcommaaccent -10 +KPX ohungarumlaut v -10 +KPX omacron g -10 +KPX omacron gbreve -10 +KPX omacron gcommaaccent -10 +KPX omacron v -10 +KPX oslash g -10 +KPX oslash gbreve -10 +KPX oslash gcommaaccent -10 +KPX oslash v -10 +KPX otilde g -10 +KPX otilde gbreve -10 +KPX otilde gcommaaccent -10 +KPX otilde v -10 +KPX period quotedblright -140 +KPX period quoteright -140 +KPX quoteleft quoteleft -111 +KPX quoteright d -25 +KPX quoteright dcroat -25 +KPX quoteright quoteright -111 +KPX quoteright r -25 +KPX quoteright racute -25 +KPX quoteright rcaron -25 +KPX quoteright rcommaaccent -25 +KPX quoteright s -40 +KPX quoteright sacute -40 +KPX quoteright scaron -40 +KPX quoteright scedilla -40 +KPX quoteright scommaaccent -40 +KPX quoteright space -111 +KPX quoteright t -30 +KPX quoteright tcommaaccent -30 +KPX quoteright v -10 +KPX r a -15 +KPX r aacute -15 +KPX r abreve -15 +KPX r acircumflex -15 +KPX r adieresis -15 +KPX r agrave -15 +KPX r amacron -15 +KPX r aogonek -15 +KPX r aring -15 +KPX r atilde -15 +KPX r c -37 +KPX r cacute -37 +KPX r ccaron -37 +KPX r ccedilla -37 +KPX r comma -111 +KPX r d -37 +KPX r dcroat -37 +KPX r e -37 +KPX r eacute -37 +KPX r ecaron -37 +KPX r ecircumflex -37 +KPX r edieresis -37 +KPX r edotaccent -37 +KPX r egrave -37 +KPX r emacron -37 +KPX r eogonek -37 +KPX r g -37 +KPX r gbreve -37 +KPX r gcommaaccent -37 +KPX r hyphen -20 +KPX r o -45 +KPX r oacute -45 +KPX r ocircumflex -45 +KPX r odieresis -45 +KPX r ograve -45 +KPX r ohungarumlaut -45 +KPX r omacron -45 +KPX r oslash -45 +KPX r otilde -45 +KPX r period -111 +KPX r q -37 +KPX r s -10 +KPX r sacute -10 +KPX r scaron -10 +KPX r scedilla -10 +KPX r scommaaccent -10 +KPX racute a -15 +KPX racute aacute -15 +KPX racute abreve -15 +KPX racute acircumflex -15 +KPX racute adieresis -15 +KPX racute agrave -15 +KPX racute amacron -15 +KPX racute aogonek -15 +KPX racute aring -15 +KPX racute atilde -15 +KPX racute c -37 +KPX racute cacute -37 +KPX racute ccaron -37 +KPX racute ccedilla -37 +KPX racute comma -111 +KPX racute d -37 +KPX racute dcroat -37 +KPX racute e -37 +KPX racute eacute -37 +KPX racute ecaron -37 +KPX racute ecircumflex -37 +KPX racute edieresis -37 +KPX racute edotaccent -37 +KPX racute egrave -37 +KPX racute emacron -37 +KPX racute eogonek -37 +KPX racute g -37 +KPX racute gbreve -37 +KPX racute gcommaaccent -37 +KPX racute hyphen -20 +KPX racute o -45 +KPX racute oacute -45 +KPX racute ocircumflex -45 +KPX racute odieresis -45 +KPX racute ograve -45 +KPX racute ohungarumlaut -45 +KPX racute omacron -45 +KPX racute oslash -45 +KPX racute otilde -45 +KPX racute period -111 +KPX racute q -37 +KPX racute s -10 +KPX racute sacute -10 +KPX racute scaron -10 +KPX racute scedilla -10 +KPX racute scommaaccent -10 +KPX rcaron a -15 +KPX rcaron aacute -15 +KPX rcaron abreve -15 +KPX rcaron acircumflex -15 +KPX rcaron adieresis -15 +KPX rcaron agrave -15 +KPX rcaron amacron -15 +KPX rcaron aogonek -15 +KPX rcaron aring -15 +KPX rcaron atilde -15 +KPX rcaron c -37 +KPX rcaron cacute -37 +KPX rcaron ccaron -37 +KPX rcaron ccedilla -37 +KPX rcaron comma -111 +KPX rcaron d -37 +KPX rcaron dcroat -37 +KPX rcaron e -37 +KPX rcaron eacute -37 +KPX rcaron ecaron -37 +KPX rcaron ecircumflex -37 +KPX rcaron edieresis -37 +KPX rcaron edotaccent -37 +KPX rcaron egrave -37 +KPX rcaron emacron -37 +KPX rcaron eogonek -37 +KPX rcaron g -37 +KPX rcaron gbreve -37 +KPX rcaron gcommaaccent -37 +KPX rcaron hyphen -20 +KPX rcaron o -45 +KPX rcaron oacute -45 +KPX rcaron ocircumflex -45 +KPX rcaron odieresis -45 +KPX rcaron ograve -45 +KPX rcaron ohungarumlaut -45 +KPX rcaron omacron -45 +KPX rcaron oslash -45 +KPX rcaron otilde -45 +KPX rcaron period -111 +KPX rcaron q -37 +KPX rcaron s -10 +KPX rcaron sacute -10 +KPX rcaron scaron -10 +KPX rcaron scedilla -10 +KPX rcaron scommaaccent -10 +KPX rcommaaccent a -15 +KPX rcommaaccent aacute -15 +KPX rcommaaccent abreve -15 +KPX rcommaaccent acircumflex -15 +KPX rcommaaccent adieresis -15 +KPX rcommaaccent agrave -15 +KPX rcommaaccent amacron -15 +KPX rcommaaccent aogonek -15 +KPX rcommaaccent aring -15 +KPX rcommaaccent atilde -15 +KPX rcommaaccent c -37 +KPX rcommaaccent cacute -37 +KPX rcommaaccent ccaron -37 +KPX rcommaaccent ccedilla -37 +KPX rcommaaccent comma -111 +KPX rcommaaccent d -37 +KPX rcommaaccent dcroat -37 +KPX rcommaaccent e -37 +KPX rcommaaccent eacute -37 +KPX rcommaaccent ecaron -37 +KPX rcommaaccent ecircumflex -37 +KPX rcommaaccent edieresis -37 +KPX rcommaaccent edotaccent -37 +KPX rcommaaccent egrave -37 +KPX rcommaaccent emacron -37 +KPX rcommaaccent eogonek -37 +KPX rcommaaccent g -37 +KPX rcommaaccent gbreve -37 +KPX rcommaaccent gcommaaccent -37 +KPX rcommaaccent hyphen -20 +KPX rcommaaccent o -45 +KPX rcommaaccent oacute -45 +KPX rcommaaccent ocircumflex -45 +KPX rcommaaccent odieresis -45 +KPX rcommaaccent ograve -45 +KPX rcommaaccent ohungarumlaut -45 +KPX rcommaaccent omacron -45 +KPX rcommaaccent oslash -45 +KPX rcommaaccent otilde -45 +KPX rcommaaccent period -111 +KPX rcommaaccent q -37 +KPX rcommaaccent s -10 +KPX rcommaaccent sacute -10 +KPX rcommaaccent scaron -10 +KPX rcommaaccent scedilla -10 +KPX rcommaaccent scommaaccent -10 +KPX space A -18 +KPX space Aacute -18 +KPX space Abreve -18 +KPX space Acircumflex -18 +KPX space Adieresis -18 +KPX space Agrave -18 +KPX space Amacron -18 +KPX space Aogonek -18 +KPX space Aring -18 +KPX space Atilde -18 +KPX space T -18 +KPX space Tcaron -18 +KPX space Tcommaaccent -18 +KPX space V -35 +KPX space W -40 +KPX space Y -75 +KPX space Yacute -75 +KPX space Ydieresis -75 +KPX v comma -74 +KPX v period -74 +KPX w comma -74 +KPX w period -74 +KPX y comma -55 +KPX y period -55 +KPX yacute comma -55 +KPX yacute period -55 +KPX ydieresis comma -55 +KPX ydieresis period -55 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/Times-Roman.afm b/dompdf/vendor/dompdf/dompdf/lib/fonts/Times-Roman.afm new file mode 100644 index 0000000..0fdf332 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/Times-Roman.afm @@ -0,0 +1,2421 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 12:49:17 1997 +Comment UniqueID 43068 +Comment VMusage 43909 54934 +FontName Times-Roman +FullName Times Roman +FamilyName Times +Weight Roman +ItalicAngle 0 +IsFixedPitch false +CharacterSet ExtendedRoman +FontBBox -168 -218 1000 898 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.00 +Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. +EncodingScheme WinAnsiEncoding +CapHeight 662 +XHeight 450 +Ascender 683 +Descender -217 +StdHW 28 +StdVW 84 +StartCharMetrics 317 +C 32 ; WX 250 ; N space ; B 0 0 0 0 ; +C 160 ; WX 250 ; N space ; B 0 0 0 0 ; +C 33 ; WX 333 ; N exclam ; B 130 -9 238 676 ; +C 34 ; WX 408 ; N quotedbl ; B 77 431 331 676 ; +C 35 ; WX 500 ; N numbersign ; B 5 0 496 662 ; +C 36 ; WX 500 ; N dollar ; B 44 -87 457 727 ; +C 37 ; WX 833 ; N percent ; B 61 -13 772 676 ; +C 38 ; WX 778 ; N ampersand ; B 42 -13 750 676 ; +C 146 ; WX 333 ; N quoteright ; B 79 433 218 676 ; +C 40 ; WX 333 ; N parenleft ; B 48 -177 304 676 ; +C 41 ; WX 333 ; N parenright ; B 29 -177 285 676 ; +C 42 ; WX 500 ; N asterisk ; B 69 265 432 676 ; +C 43 ; WX 564 ; N plus ; B 30 0 534 506 ; +C 44 ; WX 250 ; N comma ; B 56 -141 195 102 ; +C 45 ; WX 333 ; N hyphen ; B 39 194 285 257 ; +C 173 ; WX 333 ; N hyphen ; B 39 194 285 257 ; +C 46 ; WX 250 ; N period ; B 70 -11 181 100 ; +C 47 ; WX 278 ; N slash ; B -9 -14 287 676 ; +C 48 ; WX 500 ; N zero ; B 24 -14 476 676 ; +C 49 ; WX 500 ; N one ; B 111 0 394 676 ; +C 50 ; WX 500 ; N two ; B 30 0 475 676 ; +C 51 ; WX 500 ; N three ; B 43 -14 431 676 ; +C 52 ; WX 500 ; N four ; B 12 0 472 676 ; +C 53 ; WX 500 ; N five ; B 32 -14 438 688 ; +C 54 ; WX 500 ; N six ; B 34 -14 468 684 ; +C 55 ; WX 500 ; N seven ; B 20 -8 449 662 ; +C 56 ; WX 500 ; N eight ; B 56 -14 445 676 ; +C 57 ; WX 500 ; N nine ; B 30 -22 459 676 ; +C 58 ; WX 278 ; N colon ; B 81 -11 192 459 ; +C 59 ; WX 278 ; N semicolon ; B 80 -141 219 459 ; +C 60 ; WX 564 ; N less ; B 28 -8 536 514 ; +C 61 ; WX 564 ; N equal ; B 30 120 534 386 ; +C 62 ; WX 564 ; N greater ; B 28 -8 536 514 ; +C 63 ; WX 444 ; N question ; B 68 -8 414 676 ; +C 64 ; WX 921 ; N at ; B 116 -14 809 676 ; +C 65 ; WX 722 ; N A ; B 15 0 706 674 ; +C 66 ; WX 667 ; N B ; B 17 0 593 662 ; +C 67 ; WX 667 ; N C ; B 28 -14 633 676 ; +C 68 ; WX 722 ; N D ; B 16 0 685 662 ; +C 69 ; WX 611 ; N E ; B 12 0 597 662 ; +C 70 ; WX 556 ; N F ; B 12 0 546 662 ; +C 71 ; WX 722 ; N G ; B 32 -14 709 676 ; +C 72 ; WX 722 ; N H ; B 19 0 702 662 ; +C 73 ; WX 333 ; N I ; B 18 0 315 662 ; +C 74 ; WX 389 ; N J ; B 10 -14 370 662 ; +C 75 ; WX 722 ; N K ; B 34 0 723 662 ; +C 76 ; WX 611 ; N L ; B 12 0 598 662 ; +C 77 ; WX 889 ; N M ; B 12 0 863 662 ; +C 78 ; WX 722 ; N N ; B 12 -11 707 662 ; +C 79 ; WX 722 ; N O ; B 34 -14 688 676 ; +C 80 ; WX 556 ; N P ; B 16 0 542 662 ; +C 81 ; WX 722 ; N Q ; B 34 -178 701 676 ; +C 82 ; WX 667 ; N R ; B 17 0 659 662 ; +C 83 ; WX 556 ; N S ; B 42 -14 491 676 ; +C 84 ; WX 611 ; N T ; B 17 0 593 662 ; +C 85 ; WX 722 ; N U ; B 14 -14 705 662 ; +C 86 ; WX 722 ; N V ; B 16 -11 697 662 ; +C 87 ; WX 944 ; N W ; B 5 -11 932 662 ; +C 88 ; WX 722 ; N X ; B 10 0 704 662 ; +C 89 ; WX 722 ; N Y ; B 22 0 703 662 ; +C 90 ; WX 611 ; N Z ; B 9 0 597 662 ; +C 91 ; WX 333 ; N bracketleft ; B 88 -156 299 662 ; +C 92 ; WX 278 ; N backslash ; B -9 -14 287 676 ; +C 93 ; WX 333 ; N bracketright ; B 34 -156 245 662 ; +C 94 ; WX 469 ; N asciicircum ; B 24 297 446 662 ; +C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; +C 145 ; WX 333 ; N quoteleft ; B 115 433 254 676 ; +C 97 ; WX 444 ; N a ; B 37 -10 442 460 ; +C 98 ; WX 500 ; N b ; B 3 -10 468 683 ; +C 99 ; WX 444 ; N c ; B 25 -10 412 460 ; +C 100 ; WX 500 ; N d ; B 27 -10 491 683 ; +C 101 ; WX 444 ; N e ; B 25 -10 424 460 ; +C 102 ; WX 333 ; N f ; B 20 0 383 683 ; L i fi ; L l fl ; +C 103 ; WX 500 ; N g ; B 28 -218 470 460 ; +C 104 ; WX 500 ; N h ; B 9 0 487 683 ; +C 105 ; WX 278 ; N i ; B 16 0 253 683 ; +C 106 ; WX 278 ; N j ; B -70 -218 194 683 ; +C 107 ; WX 500 ; N k ; B 7 0 505 683 ; +C 108 ; WX 278 ; N l ; B 19 0 257 683 ; +C 109 ; WX 778 ; N m ; B 16 0 775 460 ; +C 110 ; WX 500 ; N n ; B 16 0 485 460 ; +C 111 ; WX 500 ; N o ; B 29 -10 470 460 ; +C 112 ; WX 500 ; N p ; B 5 -217 470 460 ; +C 113 ; WX 500 ; N q ; B 24 -217 488 460 ; +C 114 ; WX 333 ; N r ; B 5 0 335 460 ; +C 115 ; WX 389 ; N s ; B 51 -10 348 460 ; +C 116 ; WX 278 ; N t ; B 13 -10 279 579 ; +C 117 ; WX 500 ; N u ; B 9 -10 479 450 ; +C 118 ; WX 500 ; N v ; B 19 -14 477 450 ; +C 119 ; WX 722 ; N w ; B 21 -14 694 450 ; +C 120 ; WX 500 ; N x ; B 17 0 479 450 ; +C 121 ; WX 500 ; N y ; B 14 -218 475 450 ; +C 122 ; WX 444 ; N z ; B 27 0 418 450 ; +C 123 ; WX 480 ; N braceleft ; B 100 -181 350 680 ; +C 124 ; WX 200 ; N bar ; B 67 -218 133 782 ; +C 125 ; WX 480 ; N braceright ; B 130 -181 380 680 ; +C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ; +C 161 ; WX 333 ; N exclamdown ; B 97 -218 205 467 ; +C 162 ; WX 500 ; N cent ; B 53 -138 448 579 ; +C 163 ; WX 500 ; N sterling ; B 12 -8 490 676 ; +C -1 ; WX 167 ; N fraction ; B -168 -14 331 676 ; +C 165 ; WX 500 ; N yen ; B -53 0 512 662 ; +C 131 ; WX 500 ; N florin ; B 7 -189 490 676 ; +C 167 ; WX 500 ; N section ; B 70 -148 426 676 ; +C 164 ; WX 500 ; N currency ; B -22 58 522 602 ; +C 39 ; WX 180 ; N quotesingle ; B 48 431 133 676 ; +C 147 ; WX 444 ; N quotedblleft ; B 43 433 414 676 ; +C 171 ; WX 500 ; N guillemotleft ; B 42 33 456 416 ; +C 139 ; WX 333 ; N guilsinglleft ; B 63 33 285 416 ; +C 155 ; WX 333 ; N guilsinglright ; B 48 33 270 416 ; +C -1 ; WX 556 ; N fi ; B 31 0 521 683 ; +C -1 ; WX 556 ; N fl ; B 32 0 521 683 ; +C 150 ; WX 500 ; N endash ; B 0 201 500 250 ; +C 134 ; WX 500 ; N dagger ; B 59 -149 442 676 ; +C 135 ; WX 500 ; N daggerdbl ; B 58 -153 442 676 ; +C 183 ; WX 250 ; N periodcentered ; B 70 199 181 310 ; +C 182 ; WX 453 ; N paragraph ; B -22 -154 450 662 ; +C 149 ; WX 350 ; N bullet ; B 40 196 310 466 ; +C 130 ; WX 333 ; N quotesinglbase ; B 79 -141 218 102 ; +C 132 ; WX 444 ; N quotedblbase ; B 45 -141 416 102 ; +C 148 ; WX 444 ; N quotedblright ; B 30 433 401 676 ; +C 187 ; WX 500 ; N guillemotright ; B 44 33 458 416 ; +C 133 ; WX 1000 ; N ellipsis ; B 111 -11 888 100 ; +C 137 ; WX 1000 ; N perthousand ; B 7 -19 994 706 ; +C 191 ; WX 444 ; N questiondown ; B 30 -218 376 466 ; +C 96 ; WX 333 ; N grave ; B 19 507 242 678 ; +C 180 ; WX 333 ; N acute ; B 93 507 317 678 ; +C 136 ; WX 333 ; N circumflex ; B 11 507 322 674 ; +C 152 ; WX 333 ; N tilde ; B 1 532 331 638 ; +C 175 ; WX 333 ; N macron ; B 11 547 322 601 ; +C -1 ; WX 333 ; N breve ; B 26 507 307 664 ; +C -1 ; WX 333 ; N dotaccent ; B 118 581 216 681 ; +C 168 ; WX 333 ; N dieresis ; B 18 581 315 681 ; +C -1 ; WX 333 ; N ring ; B 67 512 266 711 ; +C 184 ; WX 333 ; N cedilla ; B 52 -215 261 0 ; +C -1 ; WX 333 ; N hungarumlaut ; B -3 507 377 678 ; +C -1 ; WX 333 ; N ogonek ; B 62 -165 243 0 ; +C -1 ; WX 333 ; N caron ; B 11 507 322 674 ; +C 151 ; WX 1000 ; N emdash ; B 0 201 1000 250 ; +C 198 ; WX 889 ; N AE ; B 0 0 863 662 ; +C 170 ; WX 276 ; N ordfeminine ; B 4 394 270 676 ; +C -1 ; WX 611 ; N Lslash ; B 12 0 598 662 ; +C 216 ; WX 722 ; N Oslash ; B 34 -80 688 734 ; +C 140 ; WX 889 ; N OE ; B 30 -6 885 668 ; +C 186 ; WX 310 ; N ordmasculine ; B 6 394 304 676 ; +C 230 ; WX 667 ; N ae ; B 38 -10 632 460 ; +C -1 ; WX 278 ; N dotlessi ; B 16 0 253 460 ; +C -1 ; WX 278 ; N lslash ; B 19 0 259 683 ; +C 248 ; WX 500 ; N oslash ; B 29 -112 470 551 ; +C 156 ; WX 722 ; N oe ; B 30 -10 690 460 ; +C 223 ; WX 500 ; N germandbls ; B 12 -9 468 683 ; +C 207 ; WX 333 ; N Idieresis ; B 18 0 315 835 ; +C 233 ; WX 444 ; N eacute ; B 25 -10 424 678 ; +C -1 ; WX 444 ; N abreve ; B 37 -10 442 664 ; +C -1 ; WX 500 ; N uhungarumlaut ; B 9 -10 501 678 ; +C -1 ; WX 444 ; N ecaron ; B 25 -10 424 674 ; +C 159 ; WX 722 ; N Ydieresis ; B 22 0 703 835 ; +C 247 ; WX 564 ; N divide ; B 30 -10 534 516 ; +C 221 ; WX 722 ; N Yacute ; B 22 0 703 890 ; +C 194 ; WX 722 ; N Acircumflex ; B 15 0 706 886 ; +C 225 ; WX 444 ; N aacute ; B 37 -10 442 678 ; +C 219 ; WX 722 ; N Ucircumflex ; B 14 -14 705 886 ; +C 253 ; WX 500 ; N yacute ; B 14 -218 475 678 ; +C -1 ; WX 389 ; N scommaaccent ; B 51 -218 348 460 ; +C 234 ; WX 444 ; N ecircumflex ; B 25 -10 424 674 ; +C -1 ; WX 722 ; N Uring ; B 14 -14 705 898 ; +C 220 ; WX 722 ; N Udieresis ; B 14 -14 705 835 ; +C -1 ; WX 444 ; N aogonek ; B 37 -165 469 460 ; +C 218 ; WX 722 ; N Uacute ; B 14 -14 705 890 ; +C -1 ; WX 500 ; N uogonek ; B 9 -155 487 450 ; +C 203 ; WX 611 ; N Edieresis ; B 12 0 597 835 ; +C -1 ; WX 722 ; N Dcroat ; B 16 0 685 662 ; +C -1 ; WX 250 ; N commaaccent ; B 59 -218 184 -50 ; +C 169 ; WX 760 ; N copyright ; B 38 -14 722 676 ; +C -1 ; WX 611 ; N Emacron ; B 12 0 597 813 ; +C -1 ; WX 444 ; N ccaron ; B 25 -10 412 674 ; +C 229 ; WX 444 ; N aring ; B 37 -10 442 711 ; +C -1 ; WX 722 ; N Ncommaaccent ; B 12 -198 707 662 ; +C -1 ; WX 278 ; N lacute ; B 19 0 290 890 ; +C 224 ; WX 444 ; N agrave ; B 37 -10 442 678 ; +C -1 ; WX 611 ; N Tcommaaccent ; B 17 -218 593 662 ; +C -1 ; WX 667 ; N Cacute ; B 28 -14 633 890 ; +C 227 ; WX 444 ; N atilde ; B 37 -10 442 638 ; +C -1 ; WX 611 ; N Edotaccent ; B 12 0 597 835 ; +C 154 ; WX 389 ; N scaron ; B 39 -10 350 674 ; +C -1 ; WX 389 ; N scedilla ; B 51 -215 348 460 ; +C 237 ; WX 278 ; N iacute ; B 16 0 290 678 ; +C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ; +C -1 ; WX 667 ; N Rcaron ; B 17 0 659 886 ; +C -1 ; WX 722 ; N Gcommaaccent ; B 32 -218 709 676 ; +C 251 ; WX 500 ; N ucircumflex ; B 9 -10 479 674 ; +C 226 ; WX 444 ; N acircumflex ; B 37 -10 442 674 ; +C -1 ; WX 722 ; N Amacron ; B 15 0 706 813 ; +C -1 ; WX 333 ; N rcaron ; B 5 0 335 674 ; +C 231 ; WX 444 ; N ccedilla ; B 25 -215 412 460 ; +C -1 ; WX 611 ; N Zdotaccent ; B 9 0 597 835 ; +C 222 ; WX 556 ; N Thorn ; B 16 0 542 662 ; +C -1 ; WX 722 ; N Omacron ; B 34 -14 688 813 ; +C -1 ; WX 667 ; N Racute ; B 17 0 659 890 ; +C -1 ; WX 556 ; N Sacute ; B 42 -14 491 890 ; +C -1 ; WX 588 ; N dcaron ; B 27 -10 589 695 ; +C -1 ; WX 722 ; N Umacron ; B 14 -14 705 813 ; +C -1 ; WX 500 ; N uring ; B 9 -10 479 711 ; +C 179 ; WX 300 ; N threesuperior ; B 15 262 291 676 ; +C 210 ; WX 722 ; N Ograve ; B 34 -14 688 890 ; +C 192 ; WX 722 ; N Agrave ; B 15 0 706 890 ; +C -1 ; WX 722 ; N Abreve ; B 15 0 706 876 ; +C 215 ; WX 564 ; N multiply ; B 38 8 527 497 ; +C 250 ; WX 500 ; N uacute ; B 9 -10 479 678 ; +C -1 ; WX 611 ; N Tcaron ; B 17 0 593 886 ; +C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ; +C 255 ; WX 500 ; N ydieresis ; B 14 -218 475 623 ; +C -1 ; WX 722 ; N Nacute ; B 12 -11 707 890 ; +C 238 ; WX 278 ; N icircumflex ; B -16 0 295 674 ; +C 202 ; WX 611 ; N Ecircumflex ; B 12 0 597 886 ; +C 228 ; WX 444 ; N adieresis ; B 37 -10 442 623 ; +C 235 ; WX 444 ; N edieresis ; B 25 -10 424 623 ; +C -1 ; WX 444 ; N cacute ; B 25 -10 413 678 ; +C -1 ; WX 500 ; N nacute ; B 16 0 485 678 ; +C -1 ; WX 500 ; N umacron ; B 9 -10 479 601 ; +C -1 ; WX 722 ; N Ncaron ; B 12 -11 707 886 ; +C 205 ; WX 333 ; N Iacute ; B 18 0 317 890 ; +C 177 ; WX 564 ; N plusminus ; B 30 0 534 506 ; +C 166 ; WX 200 ; N brokenbar ; B 67 -143 133 707 ; +C 174 ; WX 760 ; N registered ; B 38 -14 722 676 ; +C -1 ; WX 722 ; N Gbreve ; B 32 -14 709 876 ; +C -1 ; WX 333 ; N Idotaccent ; B 18 0 315 835 ; +C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ; +C 200 ; WX 611 ; N Egrave ; B 12 0 597 890 ; +C -1 ; WX 333 ; N racute ; B 5 0 335 678 ; +C -1 ; WX 500 ; N omacron ; B 29 -10 470 601 ; +C -1 ; WX 611 ; N Zacute ; B 9 0 597 890 ; +C 142 ; WX 611 ; N Zcaron ; B 9 0 597 886 ; +C -1 ; WX 549 ; N greaterequal ; B 26 0 523 666 ; +C 208 ; WX 722 ; N Eth ; B 16 0 685 662 ; +C 199 ; WX 667 ; N Ccedilla ; B 28 -215 633 676 ; +C -1 ; WX 278 ; N lcommaaccent ; B 19 -218 257 683 ; +C -1 ; WX 326 ; N tcaron ; B 13 -10 318 722 ; +C -1 ; WX 444 ; N eogonek ; B 25 -165 424 460 ; +C -1 ; WX 722 ; N Uogonek ; B 14 -165 705 662 ; +C 193 ; WX 722 ; N Aacute ; B 15 0 706 890 ; +C 196 ; WX 722 ; N Adieresis ; B 15 0 706 835 ; +C 232 ; WX 444 ; N egrave ; B 25 -10 424 678 ; +C -1 ; WX 444 ; N zacute ; B 27 0 418 678 ; +C -1 ; WX 278 ; N iogonek ; B 16 -165 265 683 ; +C 211 ; WX 722 ; N Oacute ; B 34 -14 688 890 ; +C 243 ; WX 500 ; N oacute ; B 29 -10 470 678 ; +C -1 ; WX 444 ; N amacron ; B 37 -10 442 601 ; +C -1 ; WX 389 ; N sacute ; B 51 -10 348 678 ; +C 239 ; WX 278 ; N idieresis ; B -9 0 288 623 ; +C 212 ; WX 722 ; N Ocircumflex ; B 34 -14 688 886 ; +C 217 ; WX 722 ; N Ugrave ; B 14 -14 705 890 ; +C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; +C 254 ; WX 500 ; N thorn ; B 5 -217 470 683 ; +C 178 ; WX 300 ; N twosuperior ; B 1 270 296 676 ; +C 214 ; WX 722 ; N Odieresis ; B 34 -14 688 835 ; +C 181 ; WX 500 ; N mu ; B 36 -218 512 450 ; +C 236 ; WX 278 ; N igrave ; B -8 0 253 678 ; +C -1 ; WX 500 ; N ohungarumlaut ; B 29 -10 491 678 ; +C -1 ; WX 611 ; N Eogonek ; B 12 -165 597 662 ; +C -1 ; WX 500 ; N dcroat ; B 27 -10 500 683 ; +C 190 ; WX 750 ; N threequarters ; B 15 -14 718 676 ; +C -1 ; WX 556 ; N Scedilla ; B 42 -215 491 676 ; +C -1 ; WX 344 ; N lcaron ; B 19 0 347 695 ; +C -1 ; WX 722 ; N Kcommaaccent ; B 34 -198 723 662 ; +C -1 ; WX 611 ; N Lacute ; B 12 0 598 890 ; +C 153 ; WX 980 ; N trademark ; B 30 256 957 662 ; +C -1 ; WX 444 ; N edotaccent ; B 25 -10 424 623 ; +C 204 ; WX 333 ; N Igrave ; B 18 0 315 890 ; +C -1 ; WX 333 ; N Imacron ; B 11 0 322 813 ; +C -1 ; WX 611 ; N Lcaron ; B 12 0 598 676 ; +C 189 ; WX 750 ; N onehalf ; B 31 -14 746 676 ; +C -1 ; WX 549 ; N lessequal ; B 26 0 523 666 ; +C 244 ; WX 500 ; N ocircumflex ; B 29 -10 470 674 ; +C 241 ; WX 500 ; N ntilde ; B 16 0 485 638 ; +C -1 ; WX 722 ; N Uhungarumlaut ; B 14 -14 705 890 ; +C 201 ; WX 611 ; N Eacute ; B 12 0 597 890 ; +C -1 ; WX 444 ; N emacron ; B 25 -10 424 601 ; +C -1 ; WX 500 ; N gbreve ; B 28 -218 470 664 ; +C 188 ; WX 750 ; N onequarter ; B 37 -14 718 676 ; +C 138 ; WX 556 ; N Scaron ; B 42 -14 491 886 ; +C -1 ; WX 556 ; N Scommaaccent ; B 42 -218 491 676 ; +C -1 ; WX 722 ; N Ohungarumlaut ; B 34 -14 688 890 ; +C 176 ; WX 400 ; N degree ; B 57 390 343 676 ; +C 242 ; WX 500 ; N ograve ; B 29 -10 470 678 ; +C -1 ; WX 667 ; N Ccaron ; B 28 -14 633 886 ; +C 249 ; WX 500 ; N ugrave ; B 9 -10 479 678 ; +C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ; +C -1 ; WX 722 ; N Dcaron ; B 16 0 685 886 ; +C -1 ; WX 333 ; N rcommaaccent ; B 5 -218 335 460 ; +C 209 ; WX 722 ; N Ntilde ; B 12 -11 707 850 ; +C 245 ; WX 500 ; N otilde ; B 29 -10 470 638 ; +C -1 ; WX 667 ; N Rcommaaccent ; B 17 -198 659 662 ; +C -1 ; WX 611 ; N Lcommaaccent ; B 12 -218 598 662 ; +C 195 ; WX 722 ; N Atilde ; B 15 0 706 850 ; +C -1 ; WX 722 ; N Aogonek ; B 15 -165 738 674 ; +C 197 ; WX 722 ; N Aring ; B 15 0 706 898 ; +C 213 ; WX 722 ; N Otilde ; B 34 -14 688 850 ; +C -1 ; WX 444 ; N zdotaccent ; B 27 0 418 623 ; +C -1 ; WX 611 ; N Ecaron ; B 12 0 597 886 ; +C -1 ; WX 333 ; N Iogonek ; B 18 -165 315 662 ; +C -1 ; WX 500 ; N kcommaaccent ; B 7 -218 505 683 ; +C -1 ; WX 564 ; N minus ; B 30 220 534 286 ; +C 206 ; WX 333 ; N Icircumflex ; B 11 0 322 886 ; +C -1 ; WX 500 ; N ncaron ; B 16 0 485 674 ; +C -1 ; WX 278 ; N tcommaaccent ; B 13 -218 279 579 ; +C 172 ; WX 564 ; N logicalnot ; B 30 108 534 386 ; +C 246 ; WX 500 ; N odieresis ; B 29 -10 470 623 ; +C 252 ; WX 500 ; N udieresis ; B 9 -10 479 623 ; +C -1 ; WX 549 ; N notequal ; B 12 -31 537 547 ; +C -1 ; WX 500 ; N gcommaaccent ; B 28 -218 470 749 ; +C 240 ; WX 500 ; N eth ; B 29 -10 471 686 ; +C 158 ; WX 444 ; N zcaron ; B 27 0 418 674 ; +C -1 ; WX 500 ; N ncommaaccent ; B 16 -218 485 460 ; +C 185 ; WX 300 ; N onesuperior ; B 57 270 248 676 ; +C -1 ; WX 278 ; N imacron ; B 6 0 271 601 ; +C 128 ; WX 500 ; N Euro ; B 0 0 0 0 ; +EndCharMetrics +StartKernData +StartKernPairs 2073 +KPX A C -40 +KPX A Cacute -40 +KPX A Ccaron -40 +KPX A Ccedilla -40 +KPX A G -40 +KPX A Gbreve -40 +KPX A Gcommaaccent -40 +KPX A O -55 +KPX A Oacute -55 +KPX A Ocircumflex -55 +KPX A Odieresis -55 +KPX A Ograve -55 +KPX A Ohungarumlaut -55 +KPX A Omacron -55 +KPX A Oslash -55 +KPX A Otilde -55 +KPX A Q -55 +KPX A T -111 +KPX A Tcaron -111 +KPX A Tcommaaccent -111 +KPX A U -55 +KPX A Uacute -55 +KPX A Ucircumflex -55 +KPX A Udieresis -55 +KPX A Ugrave -55 +KPX A Uhungarumlaut -55 +KPX A Umacron -55 +KPX A Uogonek -55 +KPX A Uring -55 +KPX A V -135 +KPX A W -90 +KPX A Y -105 +KPX A Yacute -105 +KPX A Ydieresis -105 +KPX A quoteright -111 +KPX A v -74 +KPX A w -92 +KPX A y -92 +KPX A yacute -92 +KPX A ydieresis -92 +KPX Aacute C -40 +KPX Aacute Cacute -40 +KPX Aacute Ccaron -40 +KPX Aacute Ccedilla -40 +KPX Aacute G -40 +KPX Aacute Gbreve -40 +KPX Aacute Gcommaaccent -40 +KPX Aacute O -55 +KPX Aacute Oacute -55 +KPX Aacute Ocircumflex -55 +KPX Aacute Odieresis -55 +KPX Aacute Ograve -55 +KPX Aacute Ohungarumlaut -55 +KPX Aacute Omacron -55 +KPX Aacute Oslash -55 +KPX Aacute Otilde -55 +KPX Aacute Q -55 +KPX Aacute T -111 +KPX Aacute Tcaron -111 +KPX Aacute Tcommaaccent -111 +KPX Aacute U -55 +KPX Aacute Uacute -55 +KPX Aacute Ucircumflex -55 +KPX Aacute Udieresis -55 +KPX Aacute Ugrave -55 +KPX Aacute Uhungarumlaut -55 +KPX Aacute Umacron -55 +KPX Aacute Uogonek -55 +KPX Aacute Uring -55 +KPX Aacute V -135 +KPX Aacute W -90 +KPX Aacute Y -105 +KPX Aacute Yacute -105 +KPX Aacute Ydieresis -105 +KPX Aacute quoteright -111 +KPX Aacute v -74 +KPX Aacute w -92 +KPX Aacute y -92 +KPX Aacute yacute -92 +KPX Aacute ydieresis -92 +KPX Abreve C -40 +KPX Abreve Cacute -40 +KPX Abreve Ccaron -40 +KPX Abreve Ccedilla -40 +KPX Abreve G -40 +KPX Abreve Gbreve -40 +KPX Abreve Gcommaaccent -40 +KPX Abreve O -55 +KPX Abreve Oacute -55 +KPX Abreve Ocircumflex -55 +KPX Abreve Odieresis -55 +KPX Abreve Ograve -55 +KPX Abreve Ohungarumlaut -55 +KPX Abreve Omacron -55 +KPX Abreve Oslash -55 +KPX Abreve Otilde -55 +KPX Abreve Q -55 +KPX Abreve T -111 +KPX Abreve Tcaron -111 +KPX Abreve Tcommaaccent -111 +KPX Abreve U -55 +KPX Abreve Uacute -55 +KPX Abreve Ucircumflex -55 +KPX Abreve Udieresis -55 +KPX Abreve Ugrave -55 +KPX Abreve Uhungarumlaut -55 +KPX Abreve Umacron -55 +KPX Abreve Uogonek -55 +KPX Abreve Uring -55 +KPX Abreve V -135 +KPX Abreve W -90 +KPX Abreve Y -105 +KPX Abreve Yacute -105 +KPX Abreve Ydieresis -105 +KPX Abreve quoteright -111 +KPX Abreve v -74 +KPX Abreve w -92 +KPX Abreve y -92 +KPX Abreve yacute -92 +KPX Abreve ydieresis -92 +KPX Acircumflex C -40 +KPX Acircumflex Cacute -40 +KPX Acircumflex Ccaron -40 +KPX Acircumflex Ccedilla -40 +KPX Acircumflex G -40 +KPX Acircumflex Gbreve -40 +KPX Acircumflex Gcommaaccent -40 +KPX Acircumflex O -55 +KPX Acircumflex Oacute -55 +KPX Acircumflex Ocircumflex -55 +KPX Acircumflex Odieresis -55 +KPX Acircumflex Ograve -55 +KPX Acircumflex Ohungarumlaut -55 +KPX Acircumflex Omacron -55 +KPX Acircumflex Oslash -55 +KPX Acircumflex Otilde -55 +KPX Acircumflex Q -55 +KPX Acircumflex T -111 +KPX Acircumflex Tcaron -111 +KPX Acircumflex Tcommaaccent -111 +KPX Acircumflex U -55 +KPX Acircumflex Uacute -55 +KPX Acircumflex Ucircumflex -55 +KPX Acircumflex Udieresis -55 +KPX Acircumflex Ugrave -55 +KPX Acircumflex Uhungarumlaut -55 +KPX Acircumflex Umacron -55 +KPX Acircumflex Uogonek -55 +KPX Acircumflex Uring -55 +KPX Acircumflex V -135 +KPX Acircumflex W -90 +KPX Acircumflex Y -105 +KPX Acircumflex Yacute -105 +KPX Acircumflex Ydieresis -105 +KPX Acircumflex quoteright -111 +KPX Acircumflex v -74 +KPX Acircumflex w -92 +KPX Acircumflex y -92 +KPX Acircumflex yacute -92 +KPX Acircumflex ydieresis -92 +KPX Adieresis C -40 +KPX Adieresis Cacute -40 +KPX Adieresis Ccaron -40 +KPX Adieresis Ccedilla -40 +KPX Adieresis G -40 +KPX Adieresis Gbreve -40 +KPX Adieresis Gcommaaccent -40 +KPX Adieresis O -55 +KPX Adieresis Oacute -55 +KPX Adieresis Ocircumflex -55 +KPX Adieresis Odieresis -55 +KPX Adieresis Ograve -55 +KPX Adieresis Ohungarumlaut -55 +KPX Adieresis Omacron -55 +KPX Adieresis Oslash -55 +KPX Adieresis Otilde -55 +KPX Adieresis Q -55 +KPX Adieresis T -111 +KPX Adieresis Tcaron -111 +KPX Adieresis Tcommaaccent -111 +KPX Adieresis U -55 +KPX Adieresis Uacute -55 +KPX Adieresis Ucircumflex -55 +KPX Adieresis Udieresis -55 +KPX Adieresis Ugrave -55 +KPX Adieresis Uhungarumlaut -55 +KPX Adieresis Umacron -55 +KPX Adieresis Uogonek -55 +KPX Adieresis Uring -55 +KPX Adieresis V -135 +KPX Adieresis W -90 +KPX Adieresis Y -105 +KPX Adieresis Yacute -105 +KPX Adieresis Ydieresis -105 +KPX Adieresis quoteright -111 +KPX Adieresis v -74 +KPX Adieresis w -92 +KPX Adieresis y -92 +KPX Adieresis yacute -92 +KPX Adieresis ydieresis -92 +KPX Agrave C -40 +KPX Agrave Cacute -40 +KPX Agrave Ccaron -40 +KPX Agrave Ccedilla -40 +KPX Agrave G -40 +KPX Agrave Gbreve -40 +KPX Agrave Gcommaaccent -40 +KPX Agrave O -55 +KPX Agrave Oacute -55 +KPX Agrave Ocircumflex -55 +KPX Agrave Odieresis -55 +KPX Agrave Ograve -55 +KPX Agrave Ohungarumlaut -55 +KPX Agrave Omacron -55 +KPX Agrave Oslash -55 +KPX Agrave Otilde -55 +KPX Agrave Q -55 +KPX Agrave T -111 +KPX Agrave Tcaron -111 +KPX Agrave Tcommaaccent -111 +KPX Agrave U -55 +KPX Agrave Uacute -55 +KPX Agrave Ucircumflex -55 +KPX Agrave Udieresis -55 +KPX Agrave Ugrave -55 +KPX Agrave Uhungarumlaut -55 +KPX Agrave Umacron -55 +KPX Agrave Uogonek -55 +KPX Agrave Uring -55 +KPX Agrave V -135 +KPX Agrave W -90 +KPX Agrave Y -105 +KPX Agrave Yacute -105 +KPX Agrave Ydieresis -105 +KPX Agrave quoteright -111 +KPX Agrave v -74 +KPX Agrave w -92 +KPX Agrave y -92 +KPX Agrave yacute -92 +KPX Agrave ydieresis -92 +KPX Amacron C -40 +KPX Amacron Cacute -40 +KPX Amacron Ccaron -40 +KPX Amacron Ccedilla -40 +KPX Amacron G -40 +KPX Amacron Gbreve -40 +KPX Amacron Gcommaaccent -40 +KPX Amacron O -55 +KPX Amacron Oacute -55 +KPX Amacron Ocircumflex -55 +KPX Amacron Odieresis -55 +KPX Amacron Ograve -55 +KPX Amacron Ohungarumlaut -55 +KPX Amacron Omacron -55 +KPX Amacron Oslash -55 +KPX Amacron Otilde -55 +KPX Amacron Q -55 +KPX Amacron T -111 +KPX Amacron Tcaron -111 +KPX Amacron Tcommaaccent -111 +KPX Amacron U -55 +KPX Amacron Uacute -55 +KPX Amacron Ucircumflex -55 +KPX Amacron Udieresis -55 +KPX Amacron Ugrave -55 +KPX Amacron Uhungarumlaut -55 +KPX Amacron Umacron -55 +KPX Amacron Uogonek -55 +KPX Amacron Uring -55 +KPX Amacron V -135 +KPX Amacron W -90 +KPX Amacron Y -105 +KPX Amacron Yacute -105 +KPX Amacron Ydieresis -105 +KPX Amacron quoteright -111 +KPX Amacron v -74 +KPX Amacron w -92 +KPX Amacron y -92 +KPX Amacron yacute -92 +KPX Amacron ydieresis -92 +KPX Aogonek C -40 +KPX Aogonek Cacute -40 +KPX Aogonek Ccaron -40 +KPX Aogonek Ccedilla -40 +KPX Aogonek G -40 +KPX Aogonek Gbreve -40 +KPX Aogonek Gcommaaccent -40 +KPX Aogonek O -55 +KPX Aogonek Oacute -55 +KPX Aogonek Ocircumflex -55 +KPX Aogonek Odieresis -55 +KPX Aogonek Ograve -55 +KPX Aogonek Ohungarumlaut -55 +KPX Aogonek Omacron -55 +KPX Aogonek Oslash -55 +KPX Aogonek Otilde -55 +KPX Aogonek Q -55 +KPX Aogonek T -111 +KPX Aogonek Tcaron -111 +KPX Aogonek Tcommaaccent -111 +KPX Aogonek U -55 +KPX Aogonek Uacute -55 +KPX Aogonek Ucircumflex -55 +KPX Aogonek Udieresis -55 +KPX Aogonek Ugrave -55 +KPX Aogonek Uhungarumlaut -55 +KPX Aogonek Umacron -55 +KPX Aogonek Uogonek -55 +KPX Aogonek Uring -55 +KPX Aogonek V -135 +KPX Aogonek W -90 +KPX Aogonek Y -105 +KPX Aogonek Yacute -105 +KPX Aogonek Ydieresis -105 +KPX Aogonek quoteright -111 +KPX Aogonek v -74 +KPX Aogonek w -52 +KPX Aogonek y -52 +KPX Aogonek yacute -52 +KPX Aogonek ydieresis -52 +KPX Aring C -40 +KPX Aring Cacute -40 +KPX Aring Ccaron -40 +KPX Aring Ccedilla -40 +KPX Aring G -40 +KPX Aring Gbreve -40 +KPX Aring Gcommaaccent -40 +KPX Aring O -55 +KPX Aring Oacute -55 +KPX Aring Ocircumflex -55 +KPX Aring Odieresis -55 +KPX Aring Ograve -55 +KPX Aring Ohungarumlaut -55 +KPX Aring Omacron -55 +KPX Aring Oslash -55 +KPX Aring Otilde -55 +KPX Aring Q -55 +KPX Aring T -111 +KPX Aring Tcaron -111 +KPX Aring Tcommaaccent -111 +KPX Aring U -55 +KPX Aring Uacute -55 +KPX Aring Ucircumflex -55 +KPX Aring Udieresis -55 +KPX Aring Ugrave -55 +KPX Aring Uhungarumlaut -55 +KPX Aring Umacron -55 +KPX Aring Uogonek -55 +KPX Aring Uring -55 +KPX Aring V -135 +KPX Aring W -90 +KPX Aring Y -105 +KPX Aring Yacute -105 +KPX Aring Ydieresis -105 +KPX Aring quoteright -111 +KPX Aring v -74 +KPX Aring w -92 +KPX Aring y -92 +KPX Aring yacute -92 +KPX Aring ydieresis -92 +KPX Atilde C -40 +KPX Atilde Cacute -40 +KPX Atilde Ccaron -40 +KPX Atilde Ccedilla -40 +KPX Atilde G -40 +KPX Atilde Gbreve -40 +KPX Atilde Gcommaaccent -40 +KPX Atilde O -55 +KPX Atilde Oacute -55 +KPX Atilde Ocircumflex -55 +KPX Atilde Odieresis -55 +KPX Atilde Ograve -55 +KPX Atilde Ohungarumlaut -55 +KPX Atilde Omacron -55 +KPX Atilde Oslash -55 +KPX Atilde Otilde -55 +KPX Atilde Q -55 +KPX Atilde T -111 +KPX Atilde Tcaron -111 +KPX Atilde Tcommaaccent -111 +KPX Atilde U -55 +KPX Atilde Uacute -55 +KPX Atilde Ucircumflex -55 +KPX Atilde Udieresis -55 +KPX Atilde Ugrave -55 +KPX Atilde Uhungarumlaut -55 +KPX Atilde Umacron -55 +KPX Atilde Uogonek -55 +KPX Atilde Uring -55 +KPX Atilde V -135 +KPX Atilde W -90 +KPX Atilde Y -105 +KPX Atilde Yacute -105 +KPX Atilde Ydieresis -105 +KPX Atilde quoteright -111 +KPX Atilde v -74 +KPX Atilde w -92 +KPX Atilde y -92 +KPX Atilde yacute -92 +KPX Atilde ydieresis -92 +KPX B A -35 +KPX B Aacute -35 +KPX B Abreve -35 +KPX B Acircumflex -35 +KPX B Adieresis -35 +KPX B Agrave -35 +KPX B Amacron -35 +KPX B Aogonek -35 +KPX B Aring -35 +KPX B Atilde -35 +KPX B U -10 +KPX B Uacute -10 +KPX B Ucircumflex -10 +KPX B Udieresis -10 +KPX B Ugrave -10 +KPX B Uhungarumlaut -10 +KPX B Umacron -10 +KPX B Uogonek -10 +KPX B Uring -10 +KPX D A -40 +KPX D Aacute -40 +KPX D Abreve -40 +KPX D Acircumflex -40 +KPX D Adieresis -40 +KPX D Agrave -40 +KPX D Amacron -40 +KPX D Aogonek -40 +KPX D Aring -40 +KPX D Atilde -40 +KPX D V -40 +KPX D W -30 +KPX D Y -55 +KPX D Yacute -55 +KPX D Ydieresis -55 +KPX Dcaron A -40 +KPX Dcaron Aacute -40 +KPX Dcaron Abreve -40 +KPX Dcaron Acircumflex -40 +KPX Dcaron Adieresis -40 +KPX Dcaron Agrave -40 +KPX Dcaron Amacron -40 +KPX Dcaron Aogonek -40 +KPX Dcaron Aring -40 +KPX Dcaron Atilde -40 +KPX Dcaron V -40 +KPX Dcaron W -30 +KPX Dcaron Y -55 +KPX Dcaron Yacute -55 +KPX Dcaron Ydieresis -55 +KPX Dcroat A -40 +KPX Dcroat Aacute -40 +KPX Dcroat Abreve -40 +KPX Dcroat Acircumflex -40 +KPX Dcroat Adieresis -40 +KPX Dcroat Agrave -40 +KPX Dcroat Amacron -40 +KPX Dcroat Aogonek -40 +KPX Dcroat Aring -40 +KPX Dcroat Atilde -40 +KPX Dcroat V -40 +KPX Dcroat W -30 +KPX Dcroat Y -55 +KPX Dcroat Yacute -55 +KPX Dcroat Ydieresis -55 +KPX F A -74 +KPX F Aacute -74 +KPX F Abreve -74 +KPX F Acircumflex -74 +KPX F Adieresis -74 +KPX F Agrave -74 +KPX F Amacron -74 +KPX F Aogonek -74 +KPX F Aring -74 +KPX F Atilde -74 +KPX F a -15 +KPX F aacute -15 +KPX F abreve -15 +KPX F acircumflex -15 +KPX F adieresis -15 +KPX F agrave -15 +KPX F amacron -15 +KPX F aogonek -15 +KPX F aring -15 +KPX F atilde -15 +KPX F comma -80 +KPX F o -15 +KPX F oacute -15 +KPX F ocircumflex -15 +KPX F odieresis -15 +KPX F ograve -15 +KPX F ohungarumlaut -15 +KPX F omacron -15 +KPX F oslash -15 +KPX F otilde -15 +KPX F period -80 +KPX J A -60 +KPX J Aacute -60 +KPX J Abreve -60 +KPX J Acircumflex -60 +KPX J Adieresis -60 +KPX J Agrave -60 +KPX J Amacron -60 +KPX J Aogonek -60 +KPX J Aring -60 +KPX J Atilde -60 +KPX K O -30 +KPX K Oacute -30 +KPX K Ocircumflex -30 +KPX K Odieresis -30 +KPX K Ograve -30 +KPX K Ohungarumlaut -30 +KPX K Omacron -30 +KPX K Oslash -30 +KPX K Otilde -30 +KPX K e -25 +KPX K eacute -25 +KPX K ecaron -25 +KPX K ecircumflex -25 +KPX K edieresis -25 +KPX K edotaccent -25 +KPX K egrave -25 +KPX K emacron -25 +KPX K eogonek -25 +KPX K o -35 +KPX K oacute -35 +KPX K ocircumflex -35 +KPX K odieresis -35 +KPX K ograve -35 +KPX K ohungarumlaut -35 +KPX K omacron -35 +KPX K oslash -35 +KPX K otilde -35 +KPX K u -15 +KPX K uacute -15 +KPX K ucircumflex -15 +KPX K udieresis -15 +KPX K ugrave -15 +KPX K uhungarumlaut -15 +KPX K umacron -15 +KPX K uogonek -15 +KPX K uring -15 +KPX K y -25 +KPX K yacute -25 +KPX K ydieresis -25 +KPX Kcommaaccent O -30 +KPX Kcommaaccent Oacute -30 +KPX Kcommaaccent Ocircumflex -30 +KPX Kcommaaccent Odieresis -30 +KPX Kcommaaccent Ograve -30 +KPX Kcommaaccent Ohungarumlaut -30 +KPX Kcommaaccent Omacron -30 +KPX Kcommaaccent Oslash -30 +KPX Kcommaaccent Otilde -30 +KPX Kcommaaccent e -25 +KPX Kcommaaccent eacute -25 +KPX Kcommaaccent ecaron -25 +KPX Kcommaaccent ecircumflex -25 +KPX Kcommaaccent edieresis -25 +KPX Kcommaaccent edotaccent -25 +KPX Kcommaaccent egrave -25 +KPX Kcommaaccent emacron -25 +KPX Kcommaaccent eogonek -25 +KPX Kcommaaccent o -35 +KPX Kcommaaccent oacute -35 +KPX Kcommaaccent ocircumflex -35 +KPX Kcommaaccent odieresis -35 +KPX Kcommaaccent ograve -35 +KPX Kcommaaccent ohungarumlaut -35 +KPX Kcommaaccent omacron -35 +KPX Kcommaaccent oslash -35 +KPX Kcommaaccent otilde -35 +KPX Kcommaaccent u -15 +KPX Kcommaaccent uacute -15 +KPX Kcommaaccent ucircumflex -15 +KPX Kcommaaccent udieresis -15 +KPX Kcommaaccent ugrave -15 +KPX Kcommaaccent uhungarumlaut -15 +KPX Kcommaaccent umacron -15 +KPX Kcommaaccent uogonek -15 +KPX Kcommaaccent uring -15 +KPX Kcommaaccent y -25 +KPX Kcommaaccent yacute -25 +KPX Kcommaaccent ydieresis -25 +KPX L T -92 +KPX L Tcaron -92 +KPX L Tcommaaccent -92 +KPX L V -100 +KPX L W -74 +KPX L Y -100 +KPX L Yacute -100 +KPX L Ydieresis -100 +KPX L quoteright -92 +KPX L y -55 +KPX L yacute -55 +KPX L ydieresis -55 +KPX Lacute T -92 +KPX Lacute Tcaron -92 +KPX Lacute Tcommaaccent -92 +KPX Lacute V -100 +KPX Lacute W -74 +KPX Lacute Y -100 +KPX Lacute Yacute -100 +KPX Lacute Ydieresis -100 +KPX Lacute quoteright -92 +KPX Lacute y -55 +KPX Lacute yacute -55 +KPX Lacute ydieresis -55 +KPX Lcaron quoteright -92 +KPX Lcaron y -55 +KPX Lcaron yacute -55 +KPX Lcaron ydieresis -55 +KPX Lcommaaccent T -92 +KPX Lcommaaccent Tcaron -92 +KPX Lcommaaccent Tcommaaccent -92 +KPX Lcommaaccent V -100 +KPX Lcommaaccent W -74 +KPX Lcommaaccent Y -100 +KPX Lcommaaccent Yacute -100 +KPX Lcommaaccent Ydieresis -100 +KPX Lcommaaccent quoteright -92 +KPX Lcommaaccent y -55 +KPX Lcommaaccent yacute -55 +KPX Lcommaaccent ydieresis -55 +KPX Lslash T -92 +KPX Lslash Tcaron -92 +KPX Lslash Tcommaaccent -92 +KPX Lslash V -100 +KPX Lslash W -74 +KPX Lslash Y -100 +KPX Lslash Yacute -100 +KPX Lslash Ydieresis -100 +KPX Lslash quoteright -92 +KPX Lslash y -55 +KPX Lslash yacute -55 +KPX Lslash ydieresis -55 +KPX N A -35 +KPX N Aacute -35 +KPX N Abreve -35 +KPX N Acircumflex -35 +KPX N Adieresis -35 +KPX N Agrave -35 +KPX N Amacron -35 +KPX N Aogonek -35 +KPX N Aring -35 +KPX N Atilde -35 +KPX Nacute A -35 +KPX Nacute Aacute -35 +KPX Nacute Abreve -35 +KPX Nacute Acircumflex -35 +KPX Nacute Adieresis -35 +KPX Nacute Agrave -35 +KPX Nacute Amacron -35 +KPX Nacute Aogonek -35 +KPX Nacute Aring -35 +KPX Nacute Atilde -35 +KPX Ncaron A -35 +KPX Ncaron Aacute -35 +KPX Ncaron Abreve -35 +KPX Ncaron Acircumflex -35 +KPX Ncaron Adieresis -35 +KPX Ncaron Agrave -35 +KPX Ncaron Amacron -35 +KPX Ncaron Aogonek -35 +KPX Ncaron Aring -35 +KPX Ncaron Atilde -35 +KPX Ncommaaccent A -35 +KPX Ncommaaccent Aacute -35 +KPX Ncommaaccent Abreve -35 +KPX Ncommaaccent Acircumflex -35 +KPX Ncommaaccent Adieresis -35 +KPX Ncommaaccent Agrave -35 +KPX Ncommaaccent Amacron -35 +KPX Ncommaaccent Aogonek -35 +KPX Ncommaaccent Aring -35 +KPX Ncommaaccent Atilde -35 +KPX Ntilde A -35 +KPX Ntilde Aacute -35 +KPX Ntilde Abreve -35 +KPX Ntilde Acircumflex -35 +KPX Ntilde Adieresis -35 +KPX Ntilde Agrave -35 +KPX Ntilde Amacron -35 +KPX Ntilde Aogonek -35 +KPX Ntilde Aring -35 +KPX Ntilde Atilde -35 +KPX O A -35 +KPX O Aacute -35 +KPX O Abreve -35 +KPX O Acircumflex -35 +KPX O Adieresis -35 +KPX O Agrave -35 +KPX O Amacron -35 +KPX O Aogonek -35 +KPX O Aring -35 +KPX O Atilde -35 +KPX O T -40 +KPX O Tcaron -40 +KPX O Tcommaaccent -40 +KPX O V -50 +KPX O W -35 +KPX O X -40 +KPX O Y -50 +KPX O Yacute -50 +KPX O Ydieresis -50 +KPX Oacute A -35 +KPX Oacute Aacute -35 +KPX Oacute Abreve -35 +KPX Oacute Acircumflex -35 +KPX Oacute Adieresis -35 +KPX Oacute Agrave -35 +KPX Oacute Amacron -35 +KPX Oacute Aogonek -35 +KPX Oacute Aring -35 +KPX Oacute Atilde -35 +KPX Oacute T -40 +KPX Oacute Tcaron -40 +KPX Oacute Tcommaaccent -40 +KPX Oacute V -50 +KPX Oacute W -35 +KPX Oacute X -40 +KPX Oacute Y -50 +KPX Oacute Yacute -50 +KPX Oacute Ydieresis -50 +KPX Ocircumflex A -35 +KPX Ocircumflex Aacute -35 +KPX Ocircumflex Abreve -35 +KPX Ocircumflex Acircumflex -35 +KPX Ocircumflex Adieresis -35 +KPX Ocircumflex Agrave -35 +KPX Ocircumflex Amacron -35 +KPX Ocircumflex Aogonek -35 +KPX Ocircumflex Aring -35 +KPX Ocircumflex Atilde -35 +KPX Ocircumflex T -40 +KPX Ocircumflex Tcaron -40 +KPX Ocircumflex Tcommaaccent -40 +KPX Ocircumflex V -50 +KPX Ocircumflex W -35 +KPX Ocircumflex X -40 +KPX Ocircumflex Y -50 +KPX Ocircumflex Yacute -50 +KPX Ocircumflex Ydieresis -50 +KPX Odieresis A -35 +KPX Odieresis Aacute -35 +KPX Odieresis Abreve -35 +KPX Odieresis Acircumflex -35 +KPX Odieresis Adieresis -35 +KPX Odieresis Agrave -35 +KPX Odieresis Amacron -35 +KPX Odieresis Aogonek -35 +KPX Odieresis Aring -35 +KPX Odieresis Atilde -35 +KPX Odieresis T -40 +KPX Odieresis Tcaron -40 +KPX Odieresis Tcommaaccent -40 +KPX Odieresis V -50 +KPX Odieresis W -35 +KPX Odieresis X -40 +KPX Odieresis Y -50 +KPX Odieresis Yacute -50 +KPX Odieresis Ydieresis -50 +KPX Ograve A -35 +KPX Ograve Aacute -35 +KPX Ograve Abreve -35 +KPX Ograve Acircumflex -35 +KPX Ograve Adieresis -35 +KPX Ograve Agrave -35 +KPX Ograve Amacron -35 +KPX Ograve Aogonek -35 +KPX Ograve Aring -35 +KPX Ograve Atilde -35 +KPX Ograve T -40 +KPX Ograve Tcaron -40 +KPX Ograve Tcommaaccent -40 +KPX Ograve V -50 +KPX Ograve W -35 +KPX Ograve X -40 +KPX Ograve Y -50 +KPX Ograve Yacute -50 +KPX Ograve Ydieresis -50 +KPX Ohungarumlaut A -35 +KPX Ohungarumlaut Aacute -35 +KPX Ohungarumlaut Abreve -35 +KPX Ohungarumlaut Acircumflex -35 +KPX Ohungarumlaut Adieresis -35 +KPX Ohungarumlaut Agrave -35 +KPX Ohungarumlaut Amacron -35 +KPX Ohungarumlaut Aogonek -35 +KPX Ohungarumlaut Aring -35 +KPX Ohungarumlaut Atilde -35 +KPX Ohungarumlaut T -40 +KPX Ohungarumlaut Tcaron -40 +KPX Ohungarumlaut Tcommaaccent -40 +KPX Ohungarumlaut V -50 +KPX Ohungarumlaut W -35 +KPX Ohungarumlaut X -40 +KPX Ohungarumlaut Y -50 +KPX Ohungarumlaut Yacute -50 +KPX Ohungarumlaut Ydieresis -50 +KPX Omacron A -35 +KPX Omacron Aacute -35 +KPX Omacron Abreve -35 +KPX Omacron Acircumflex -35 +KPX Omacron Adieresis -35 +KPX Omacron Agrave -35 +KPX Omacron Amacron -35 +KPX Omacron Aogonek -35 +KPX Omacron Aring -35 +KPX Omacron Atilde -35 +KPX Omacron T -40 +KPX Omacron Tcaron -40 +KPX Omacron Tcommaaccent -40 +KPX Omacron V -50 +KPX Omacron W -35 +KPX Omacron X -40 +KPX Omacron Y -50 +KPX Omacron Yacute -50 +KPX Omacron Ydieresis -50 +KPX Oslash A -35 +KPX Oslash Aacute -35 +KPX Oslash Abreve -35 +KPX Oslash Acircumflex -35 +KPX Oslash Adieresis -35 +KPX Oslash Agrave -35 +KPX Oslash Amacron -35 +KPX Oslash Aogonek -35 +KPX Oslash Aring -35 +KPX Oslash Atilde -35 +KPX Oslash T -40 +KPX Oslash Tcaron -40 +KPX Oslash Tcommaaccent -40 +KPX Oslash V -50 +KPX Oslash W -35 +KPX Oslash X -40 +KPX Oslash Y -50 +KPX Oslash Yacute -50 +KPX Oslash Ydieresis -50 +KPX Otilde A -35 +KPX Otilde Aacute -35 +KPX Otilde Abreve -35 +KPX Otilde Acircumflex -35 +KPX Otilde Adieresis -35 +KPX Otilde Agrave -35 +KPX Otilde Amacron -35 +KPX Otilde Aogonek -35 +KPX Otilde Aring -35 +KPX Otilde Atilde -35 +KPX Otilde T -40 +KPX Otilde Tcaron -40 +KPX Otilde Tcommaaccent -40 +KPX Otilde V -50 +KPX Otilde W -35 +KPX Otilde X -40 +KPX Otilde Y -50 +KPX Otilde Yacute -50 +KPX Otilde Ydieresis -50 +KPX P A -92 +KPX P Aacute -92 +KPX P Abreve -92 +KPX P Acircumflex -92 +KPX P Adieresis -92 +KPX P Agrave -92 +KPX P Amacron -92 +KPX P Aogonek -92 +KPX P Aring -92 +KPX P Atilde -92 +KPX P a -15 +KPX P aacute -15 +KPX P abreve -15 +KPX P acircumflex -15 +KPX P adieresis -15 +KPX P agrave -15 +KPX P amacron -15 +KPX P aogonek -15 +KPX P aring -15 +KPX P atilde -15 +KPX P comma -111 +KPX P period -111 +KPX Q U -10 +KPX Q Uacute -10 +KPX Q Ucircumflex -10 +KPX Q Udieresis -10 +KPX Q Ugrave -10 +KPX Q Uhungarumlaut -10 +KPX Q Umacron -10 +KPX Q Uogonek -10 +KPX Q Uring -10 +KPX R O -40 +KPX R Oacute -40 +KPX R Ocircumflex -40 +KPX R Odieresis -40 +KPX R Ograve -40 +KPX R Ohungarumlaut -40 +KPX R Omacron -40 +KPX R Oslash -40 +KPX R Otilde -40 +KPX R T -60 +KPX R Tcaron -60 +KPX R Tcommaaccent -60 +KPX R U -40 +KPX R Uacute -40 +KPX R Ucircumflex -40 +KPX R Udieresis -40 +KPX R Ugrave -40 +KPX R Uhungarumlaut -40 +KPX R Umacron -40 +KPX R Uogonek -40 +KPX R Uring -40 +KPX R V -80 +KPX R W -55 +KPX R Y -65 +KPX R Yacute -65 +KPX R Ydieresis -65 +KPX Racute O -40 +KPX Racute Oacute -40 +KPX Racute Ocircumflex -40 +KPX Racute Odieresis -40 +KPX Racute Ograve -40 +KPX Racute Ohungarumlaut -40 +KPX Racute Omacron -40 +KPX Racute Oslash -40 +KPX Racute Otilde -40 +KPX Racute T -60 +KPX Racute Tcaron -60 +KPX Racute Tcommaaccent -60 +KPX Racute U -40 +KPX Racute Uacute -40 +KPX Racute Ucircumflex -40 +KPX Racute Udieresis -40 +KPX Racute Ugrave -40 +KPX Racute Uhungarumlaut -40 +KPX Racute Umacron -40 +KPX Racute Uogonek -40 +KPX Racute Uring -40 +KPX Racute V -80 +KPX Racute W -55 +KPX Racute Y -65 +KPX Racute Yacute -65 +KPX Racute Ydieresis -65 +KPX Rcaron O -40 +KPX Rcaron Oacute -40 +KPX Rcaron Ocircumflex -40 +KPX Rcaron Odieresis -40 +KPX Rcaron Ograve -40 +KPX Rcaron Ohungarumlaut -40 +KPX Rcaron Omacron -40 +KPX Rcaron Oslash -40 +KPX Rcaron Otilde -40 +KPX Rcaron T -60 +KPX Rcaron Tcaron -60 +KPX Rcaron Tcommaaccent -60 +KPX Rcaron U -40 +KPX Rcaron Uacute -40 +KPX Rcaron Ucircumflex -40 +KPX Rcaron Udieresis -40 +KPX Rcaron Ugrave -40 +KPX Rcaron Uhungarumlaut -40 +KPX Rcaron Umacron -40 +KPX Rcaron Uogonek -40 +KPX Rcaron Uring -40 +KPX Rcaron V -80 +KPX Rcaron W -55 +KPX Rcaron Y -65 +KPX Rcaron Yacute -65 +KPX Rcaron Ydieresis -65 +KPX Rcommaaccent O -40 +KPX Rcommaaccent Oacute -40 +KPX Rcommaaccent Ocircumflex -40 +KPX Rcommaaccent Odieresis -40 +KPX Rcommaaccent Ograve -40 +KPX Rcommaaccent Ohungarumlaut -40 +KPX Rcommaaccent Omacron -40 +KPX Rcommaaccent Oslash -40 +KPX Rcommaaccent Otilde -40 +KPX Rcommaaccent T -60 +KPX Rcommaaccent Tcaron -60 +KPX Rcommaaccent Tcommaaccent -60 +KPX Rcommaaccent U -40 +KPX Rcommaaccent Uacute -40 +KPX Rcommaaccent Ucircumflex -40 +KPX Rcommaaccent Udieresis -40 +KPX Rcommaaccent Ugrave -40 +KPX Rcommaaccent Uhungarumlaut -40 +KPX Rcommaaccent Umacron -40 +KPX Rcommaaccent Uogonek -40 +KPX Rcommaaccent Uring -40 +KPX Rcommaaccent V -80 +KPX Rcommaaccent W -55 +KPX Rcommaaccent Y -65 +KPX Rcommaaccent Yacute -65 +KPX Rcommaaccent Ydieresis -65 +KPX T A -93 +KPX T Aacute -93 +KPX T Abreve -93 +KPX T Acircumflex -93 +KPX T Adieresis -93 +KPX T Agrave -93 +KPX T Amacron -93 +KPX T Aogonek -93 +KPX T Aring -93 +KPX T Atilde -93 +KPX T O -18 +KPX T Oacute -18 +KPX T Ocircumflex -18 +KPX T Odieresis -18 +KPX T Ograve -18 +KPX T Ohungarumlaut -18 +KPX T Omacron -18 +KPX T Oslash -18 +KPX T Otilde -18 +KPX T a -80 +KPX T aacute -80 +KPX T abreve -80 +KPX T acircumflex -80 +KPX T adieresis -40 +KPX T agrave -40 +KPX T amacron -40 +KPX T aogonek -80 +KPX T aring -80 +KPX T atilde -40 +KPX T colon -50 +KPX T comma -74 +KPX T e -70 +KPX T eacute -70 +KPX T ecaron -70 +KPX T ecircumflex -70 +KPX T edieresis -30 +KPX T edotaccent -70 +KPX T egrave -70 +KPX T emacron -30 +KPX T eogonek -70 +KPX T hyphen -92 +KPX T i -35 +KPX T iacute -35 +KPX T iogonek -35 +KPX T o -80 +KPX T oacute -80 +KPX T ocircumflex -80 +KPX T odieresis -80 +KPX T ograve -80 +KPX T ohungarumlaut -80 +KPX T omacron -80 +KPX T oslash -80 +KPX T otilde -80 +KPX T period -74 +KPX T r -35 +KPX T racute -35 +KPX T rcaron -35 +KPX T rcommaaccent -35 +KPX T semicolon -55 +KPX T u -45 +KPX T uacute -45 +KPX T ucircumflex -45 +KPX T udieresis -45 +KPX T ugrave -45 +KPX T uhungarumlaut -45 +KPX T umacron -45 +KPX T uogonek -45 +KPX T uring -45 +KPX T w -80 +KPX T y -80 +KPX T yacute -80 +KPX T ydieresis -80 +KPX Tcaron A -93 +KPX Tcaron Aacute -93 +KPX Tcaron Abreve -93 +KPX Tcaron Acircumflex -93 +KPX Tcaron Adieresis -93 +KPX Tcaron Agrave -93 +KPX Tcaron Amacron -93 +KPX Tcaron Aogonek -93 +KPX Tcaron Aring -93 +KPX Tcaron Atilde -93 +KPX Tcaron O -18 +KPX Tcaron Oacute -18 +KPX Tcaron Ocircumflex -18 +KPX Tcaron Odieresis -18 +KPX Tcaron Ograve -18 +KPX Tcaron Ohungarumlaut -18 +KPX Tcaron Omacron -18 +KPX Tcaron Oslash -18 +KPX Tcaron Otilde -18 +KPX Tcaron a -80 +KPX Tcaron aacute -80 +KPX Tcaron abreve -80 +KPX Tcaron acircumflex -80 +KPX Tcaron adieresis -40 +KPX Tcaron agrave -40 +KPX Tcaron amacron -40 +KPX Tcaron aogonek -80 +KPX Tcaron aring -80 +KPX Tcaron atilde -40 +KPX Tcaron colon -50 +KPX Tcaron comma -74 +KPX Tcaron e -70 +KPX Tcaron eacute -70 +KPX Tcaron ecaron -70 +KPX Tcaron ecircumflex -30 +KPX Tcaron edieresis -30 +KPX Tcaron edotaccent -70 +KPX Tcaron egrave -70 +KPX Tcaron emacron -30 +KPX Tcaron eogonek -70 +KPX Tcaron hyphen -92 +KPX Tcaron i -35 +KPX Tcaron iacute -35 +KPX Tcaron iogonek -35 +KPX Tcaron o -80 +KPX Tcaron oacute -80 +KPX Tcaron ocircumflex -80 +KPX Tcaron odieresis -80 +KPX Tcaron ograve -80 +KPX Tcaron ohungarumlaut -80 +KPX Tcaron omacron -80 +KPX Tcaron oslash -80 +KPX Tcaron otilde -80 +KPX Tcaron period -74 +KPX Tcaron r -35 +KPX Tcaron racute -35 +KPX Tcaron rcaron -35 +KPX Tcaron rcommaaccent -35 +KPX Tcaron semicolon -55 +KPX Tcaron u -45 +KPX Tcaron uacute -45 +KPX Tcaron ucircumflex -45 +KPX Tcaron udieresis -45 +KPX Tcaron ugrave -45 +KPX Tcaron uhungarumlaut -45 +KPX Tcaron umacron -45 +KPX Tcaron uogonek -45 +KPX Tcaron uring -45 +KPX Tcaron w -80 +KPX Tcaron y -80 +KPX Tcaron yacute -80 +KPX Tcaron ydieresis -80 +KPX Tcommaaccent A -93 +KPX Tcommaaccent Aacute -93 +KPX Tcommaaccent Abreve -93 +KPX Tcommaaccent Acircumflex -93 +KPX Tcommaaccent Adieresis -93 +KPX Tcommaaccent Agrave -93 +KPX Tcommaaccent Amacron -93 +KPX Tcommaaccent Aogonek -93 +KPX Tcommaaccent Aring -93 +KPX Tcommaaccent Atilde -93 +KPX Tcommaaccent O -18 +KPX Tcommaaccent Oacute -18 +KPX Tcommaaccent Ocircumflex -18 +KPX Tcommaaccent Odieresis -18 +KPX Tcommaaccent Ograve -18 +KPX Tcommaaccent Ohungarumlaut -18 +KPX Tcommaaccent Omacron -18 +KPX Tcommaaccent Oslash -18 +KPX Tcommaaccent Otilde -18 +KPX Tcommaaccent a -80 +KPX Tcommaaccent aacute -80 +KPX Tcommaaccent abreve -80 +KPX Tcommaaccent acircumflex -80 +KPX Tcommaaccent adieresis -40 +KPX Tcommaaccent agrave -40 +KPX Tcommaaccent amacron -40 +KPX Tcommaaccent aogonek -80 +KPX Tcommaaccent aring -80 +KPX Tcommaaccent atilde -40 +KPX Tcommaaccent colon -50 +KPX Tcommaaccent comma -74 +KPX Tcommaaccent e -70 +KPX Tcommaaccent eacute -70 +KPX Tcommaaccent ecaron -70 +KPX Tcommaaccent ecircumflex -30 +KPX Tcommaaccent edieresis -30 +KPX Tcommaaccent edotaccent -70 +KPX Tcommaaccent egrave -30 +KPX Tcommaaccent emacron -70 +KPX Tcommaaccent eogonek -70 +KPX Tcommaaccent hyphen -92 +KPX Tcommaaccent i -35 +KPX Tcommaaccent iacute -35 +KPX Tcommaaccent iogonek -35 +KPX Tcommaaccent o -80 +KPX Tcommaaccent oacute -80 +KPX Tcommaaccent ocircumflex -80 +KPX Tcommaaccent odieresis -80 +KPX Tcommaaccent ograve -80 +KPX Tcommaaccent ohungarumlaut -80 +KPX Tcommaaccent omacron -80 +KPX Tcommaaccent oslash -80 +KPX Tcommaaccent otilde -80 +KPX Tcommaaccent period -74 +KPX Tcommaaccent r -35 +KPX Tcommaaccent racute -35 +KPX Tcommaaccent rcaron -35 +KPX Tcommaaccent rcommaaccent -35 +KPX Tcommaaccent semicolon -55 +KPX Tcommaaccent u -45 +KPX Tcommaaccent uacute -45 +KPX Tcommaaccent ucircumflex -45 +KPX Tcommaaccent udieresis -45 +KPX Tcommaaccent ugrave -45 +KPX Tcommaaccent uhungarumlaut -45 +KPX Tcommaaccent umacron -45 +KPX Tcommaaccent uogonek -45 +KPX Tcommaaccent uring -45 +KPX Tcommaaccent w -80 +KPX Tcommaaccent y -80 +KPX Tcommaaccent yacute -80 +KPX Tcommaaccent ydieresis -80 +KPX U A -40 +KPX U Aacute -40 +KPX U Abreve -40 +KPX U Acircumflex -40 +KPX U Adieresis -40 +KPX U Agrave -40 +KPX U Amacron -40 +KPX U Aogonek -40 +KPX U Aring -40 +KPX U Atilde -40 +KPX Uacute A -40 +KPX Uacute Aacute -40 +KPX Uacute Abreve -40 +KPX Uacute Acircumflex -40 +KPX Uacute Adieresis -40 +KPX Uacute Agrave -40 +KPX Uacute Amacron -40 +KPX Uacute Aogonek -40 +KPX Uacute Aring -40 +KPX Uacute Atilde -40 +KPX Ucircumflex A -40 +KPX Ucircumflex Aacute -40 +KPX Ucircumflex Abreve -40 +KPX Ucircumflex Acircumflex -40 +KPX Ucircumflex Adieresis -40 +KPX Ucircumflex Agrave -40 +KPX Ucircumflex Amacron -40 +KPX Ucircumflex Aogonek -40 +KPX Ucircumflex Aring -40 +KPX Ucircumflex Atilde -40 +KPX Udieresis A -40 +KPX Udieresis Aacute -40 +KPX Udieresis Abreve -40 +KPX Udieresis Acircumflex -40 +KPX Udieresis Adieresis -40 +KPX Udieresis Agrave -40 +KPX Udieresis Amacron -40 +KPX Udieresis Aogonek -40 +KPX Udieresis Aring -40 +KPX Udieresis Atilde -40 +KPX Ugrave A -40 +KPX Ugrave Aacute -40 +KPX Ugrave Abreve -40 +KPX Ugrave Acircumflex -40 +KPX Ugrave Adieresis -40 +KPX Ugrave Agrave -40 +KPX Ugrave Amacron -40 +KPX Ugrave Aogonek -40 +KPX Ugrave Aring -40 +KPX Ugrave Atilde -40 +KPX Uhungarumlaut A -40 +KPX Uhungarumlaut Aacute -40 +KPX Uhungarumlaut Abreve -40 +KPX Uhungarumlaut Acircumflex -40 +KPX Uhungarumlaut Adieresis -40 +KPX Uhungarumlaut Agrave -40 +KPX Uhungarumlaut Amacron -40 +KPX Uhungarumlaut Aogonek -40 +KPX Uhungarumlaut Aring -40 +KPX Uhungarumlaut Atilde -40 +KPX Umacron A -40 +KPX Umacron Aacute -40 +KPX Umacron Abreve -40 +KPX Umacron Acircumflex -40 +KPX Umacron Adieresis -40 +KPX Umacron Agrave -40 +KPX Umacron Amacron -40 +KPX Umacron Aogonek -40 +KPX Umacron Aring -40 +KPX Umacron Atilde -40 +KPX Uogonek A -40 +KPX Uogonek Aacute -40 +KPX Uogonek Abreve -40 +KPX Uogonek Acircumflex -40 +KPX Uogonek Adieresis -40 +KPX Uogonek Agrave -40 +KPX Uogonek Amacron -40 +KPX Uogonek Aogonek -40 +KPX Uogonek Aring -40 +KPX Uogonek Atilde -40 +KPX Uring A -40 +KPX Uring Aacute -40 +KPX Uring Abreve -40 +KPX Uring Acircumflex -40 +KPX Uring Adieresis -40 +KPX Uring Agrave -40 +KPX Uring Amacron -40 +KPX Uring Aogonek -40 +KPX Uring Aring -40 +KPX Uring Atilde -40 +KPX V A -135 +KPX V Aacute -135 +KPX V Abreve -135 +KPX V Acircumflex -135 +KPX V Adieresis -135 +KPX V Agrave -135 +KPX V Amacron -135 +KPX V Aogonek -135 +KPX V Aring -135 +KPX V Atilde -135 +KPX V G -15 +KPX V Gbreve -15 +KPX V Gcommaaccent -15 +KPX V O -40 +KPX V Oacute -40 +KPX V Ocircumflex -40 +KPX V Odieresis -40 +KPX V Ograve -40 +KPX V Ohungarumlaut -40 +KPX V Omacron -40 +KPX V Oslash -40 +KPX V Otilde -40 +KPX V a -111 +KPX V aacute -111 +KPX V abreve -111 +KPX V acircumflex -71 +KPX V adieresis -71 +KPX V agrave -71 +KPX V amacron -71 +KPX V aogonek -111 +KPX V aring -111 +KPX V atilde -71 +KPX V colon -74 +KPX V comma -129 +KPX V e -111 +KPX V eacute -111 +KPX V ecaron -71 +KPX V ecircumflex -71 +KPX V edieresis -71 +KPX V edotaccent -111 +KPX V egrave -71 +KPX V emacron -71 +KPX V eogonek -111 +KPX V hyphen -100 +KPX V i -60 +KPX V iacute -60 +KPX V icircumflex -20 +KPX V idieresis -20 +KPX V igrave -20 +KPX V imacron -20 +KPX V iogonek -60 +KPX V o -129 +KPX V oacute -129 +KPX V ocircumflex -129 +KPX V odieresis -89 +KPX V ograve -89 +KPX V ohungarumlaut -129 +KPX V omacron -89 +KPX V oslash -129 +KPX V otilde -89 +KPX V period -129 +KPX V semicolon -74 +KPX V u -75 +KPX V uacute -75 +KPX V ucircumflex -75 +KPX V udieresis -75 +KPX V ugrave -75 +KPX V uhungarumlaut -75 +KPX V umacron -75 +KPX V uogonek -75 +KPX V uring -75 +KPX W A -120 +KPX W Aacute -120 +KPX W Abreve -120 +KPX W Acircumflex -120 +KPX W Adieresis -120 +KPX W Agrave -120 +KPX W Amacron -120 +KPX W Aogonek -120 +KPX W Aring -120 +KPX W Atilde -120 +KPX W O -10 +KPX W Oacute -10 +KPX W Ocircumflex -10 +KPX W Odieresis -10 +KPX W Ograve -10 +KPX W Ohungarumlaut -10 +KPX W Omacron -10 +KPX W Oslash -10 +KPX W Otilde -10 +KPX W a -80 +KPX W aacute -80 +KPX W abreve -80 +KPX W acircumflex -80 +KPX W adieresis -80 +KPX W agrave -80 +KPX W amacron -80 +KPX W aogonek -80 +KPX W aring -80 +KPX W atilde -80 +KPX W colon -37 +KPX W comma -92 +KPX W e -80 +KPX W eacute -80 +KPX W ecaron -80 +KPX W ecircumflex -80 +KPX W edieresis -40 +KPX W edotaccent -80 +KPX W egrave -40 +KPX W emacron -40 +KPX W eogonek -80 +KPX W hyphen -65 +KPX W i -40 +KPX W iacute -40 +KPX W iogonek -40 +KPX W o -80 +KPX W oacute -80 +KPX W ocircumflex -80 +KPX W odieresis -80 +KPX W ograve -80 +KPX W ohungarumlaut -80 +KPX W omacron -80 +KPX W oslash -80 +KPX W otilde -80 +KPX W period -92 +KPX W semicolon -37 +KPX W u -50 +KPX W uacute -50 +KPX W ucircumflex -50 +KPX W udieresis -50 +KPX W ugrave -50 +KPX W uhungarumlaut -50 +KPX W umacron -50 +KPX W uogonek -50 +KPX W uring -50 +KPX W y -73 +KPX W yacute -73 +KPX W ydieresis -73 +KPX Y A -120 +KPX Y Aacute -120 +KPX Y Abreve -120 +KPX Y Acircumflex -120 +KPX Y Adieresis -120 +KPX Y Agrave -120 +KPX Y Amacron -120 +KPX Y Aogonek -120 +KPX Y Aring -120 +KPX Y Atilde -120 +KPX Y O -30 +KPX Y Oacute -30 +KPX Y Ocircumflex -30 +KPX Y Odieresis -30 +KPX Y Ograve -30 +KPX Y Ohungarumlaut -30 +KPX Y Omacron -30 +KPX Y Oslash -30 +KPX Y Otilde -30 +KPX Y a -100 +KPX Y aacute -100 +KPX Y abreve -100 +KPX Y acircumflex -100 +KPX Y adieresis -60 +KPX Y agrave -60 +KPX Y amacron -60 +KPX Y aogonek -100 +KPX Y aring -100 +KPX Y atilde -60 +KPX Y colon -92 +KPX Y comma -129 +KPX Y e -100 +KPX Y eacute -100 +KPX Y ecaron -100 +KPX Y ecircumflex -100 +KPX Y edieresis -60 +KPX Y edotaccent -100 +KPX Y egrave -60 +KPX Y emacron -60 +KPX Y eogonek -100 +KPX Y hyphen -111 +KPX Y i -55 +KPX Y iacute -55 +KPX Y iogonek -55 +KPX Y o -110 +KPX Y oacute -110 +KPX Y ocircumflex -110 +KPX Y odieresis -70 +KPX Y ograve -70 +KPX Y ohungarumlaut -110 +KPX Y omacron -70 +KPX Y oslash -110 +KPX Y otilde -70 +KPX Y period -129 +KPX Y semicolon -92 +KPX Y u -111 +KPX Y uacute -111 +KPX Y ucircumflex -111 +KPX Y udieresis -71 +KPX Y ugrave -71 +KPX Y uhungarumlaut -111 +KPX Y umacron -71 +KPX Y uogonek -111 +KPX Y uring -111 +KPX Yacute A -120 +KPX Yacute Aacute -120 +KPX Yacute Abreve -120 +KPX Yacute Acircumflex -120 +KPX Yacute Adieresis -120 +KPX Yacute Agrave -120 +KPX Yacute Amacron -120 +KPX Yacute Aogonek -120 +KPX Yacute Aring -120 +KPX Yacute Atilde -120 +KPX Yacute O -30 +KPX Yacute Oacute -30 +KPX Yacute Ocircumflex -30 +KPX Yacute Odieresis -30 +KPX Yacute Ograve -30 +KPX Yacute Ohungarumlaut -30 +KPX Yacute Omacron -30 +KPX Yacute Oslash -30 +KPX Yacute Otilde -30 +KPX Yacute a -100 +KPX Yacute aacute -100 +KPX Yacute abreve -100 +KPX Yacute acircumflex -100 +KPX Yacute adieresis -60 +KPX Yacute agrave -60 +KPX Yacute amacron -60 +KPX Yacute aogonek -100 +KPX Yacute aring -100 +KPX Yacute atilde -60 +KPX Yacute colon -92 +KPX Yacute comma -129 +KPX Yacute e -100 +KPX Yacute eacute -100 +KPX Yacute ecaron -100 +KPX Yacute ecircumflex -100 +KPX Yacute edieresis -60 +KPX Yacute edotaccent -100 +KPX Yacute egrave -60 +KPX Yacute emacron -60 +KPX Yacute eogonek -100 +KPX Yacute hyphen -111 +KPX Yacute i -55 +KPX Yacute iacute -55 +KPX Yacute iogonek -55 +KPX Yacute o -110 +KPX Yacute oacute -110 +KPX Yacute ocircumflex -110 +KPX Yacute odieresis -70 +KPX Yacute ograve -70 +KPX Yacute ohungarumlaut -110 +KPX Yacute omacron -70 +KPX Yacute oslash -110 +KPX Yacute otilde -70 +KPX Yacute period -129 +KPX Yacute semicolon -92 +KPX Yacute u -111 +KPX Yacute uacute -111 +KPX Yacute ucircumflex -111 +KPX Yacute udieresis -71 +KPX Yacute ugrave -71 +KPX Yacute uhungarumlaut -111 +KPX Yacute umacron -71 +KPX Yacute uogonek -111 +KPX Yacute uring -111 +KPX Ydieresis A -120 +KPX Ydieresis Aacute -120 +KPX Ydieresis Abreve -120 +KPX Ydieresis Acircumflex -120 +KPX Ydieresis Adieresis -120 +KPX Ydieresis Agrave -120 +KPX Ydieresis Amacron -120 +KPX Ydieresis Aogonek -120 +KPX Ydieresis Aring -120 +KPX Ydieresis Atilde -120 +KPX Ydieresis O -30 +KPX Ydieresis Oacute -30 +KPX Ydieresis Ocircumflex -30 +KPX Ydieresis Odieresis -30 +KPX Ydieresis Ograve -30 +KPX Ydieresis Ohungarumlaut -30 +KPX Ydieresis Omacron -30 +KPX Ydieresis Oslash -30 +KPX Ydieresis Otilde -30 +KPX Ydieresis a -100 +KPX Ydieresis aacute -100 +KPX Ydieresis abreve -100 +KPX Ydieresis acircumflex -100 +KPX Ydieresis adieresis -60 +KPX Ydieresis agrave -60 +KPX Ydieresis amacron -60 +KPX Ydieresis aogonek -100 +KPX Ydieresis aring -100 +KPX Ydieresis atilde -100 +KPX Ydieresis colon -92 +KPX Ydieresis comma -129 +KPX Ydieresis e -100 +KPX Ydieresis eacute -100 +KPX Ydieresis ecaron -100 +KPX Ydieresis ecircumflex -100 +KPX Ydieresis edieresis -60 +KPX Ydieresis edotaccent -100 +KPX Ydieresis egrave -60 +KPX Ydieresis emacron -60 +KPX Ydieresis eogonek -100 +KPX Ydieresis hyphen -111 +KPX Ydieresis i -55 +KPX Ydieresis iacute -55 +KPX Ydieresis iogonek -55 +KPX Ydieresis o -110 +KPX Ydieresis oacute -110 +KPX Ydieresis ocircumflex -110 +KPX Ydieresis odieresis -70 +KPX Ydieresis ograve -70 +KPX Ydieresis ohungarumlaut -110 +KPX Ydieresis omacron -70 +KPX Ydieresis oslash -110 +KPX Ydieresis otilde -70 +KPX Ydieresis period -129 +KPX Ydieresis semicolon -92 +KPX Ydieresis u -111 +KPX Ydieresis uacute -111 +KPX Ydieresis ucircumflex -111 +KPX Ydieresis udieresis -71 +KPX Ydieresis ugrave -71 +KPX Ydieresis uhungarumlaut -111 +KPX Ydieresis umacron -71 +KPX Ydieresis uogonek -111 +KPX Ydieresis uring -111 +KPX a v -20 +KPX a w -15 +KPX aacute v -20 +KPX aacute w -15 +KPX abreve v -20 +KPX abreve w -15 +KPX acircumflex v -20 +KPX acircumflex w -15 +KPX adieresis v -20 +KPX adieresis w -15 +KPX agrave v -20 +KPX agrave w -15 +KPX amacron v -20 +KPX amacron w -15 +KPX aogonek v -20 +KPX aogonek w -15 +KPX aring v -20 +KPX aring w -15 +KPX atilde v -20 +KPX atilde w -15 +KPX b period -40 +KPX b u -20 +KPX b uacute -20 +KPX b ucircumflex -20 +KPX b udieresis -20 +KPX b ugrave -20 +KPX b uhungarumlaut -20 +KPX b umacron -20 +KPX b uogonek -20 +KPX b uring -20 +KPX b v -15 +KPX c y -15 +KPX c yacute -15 +KPX c ydieresis -15 +KPX cacute y -15 +KPX cacute yacute -15 +KPX cacute ydieresis -15 +KPX ccaron y -15 +KPX ccaron yacute -15 +KPX ccaron ydieresis -15 +KPX ccedilla y -15 +KPX ccedilla yacute -15 +KPX ccedilla ydieresis -15 +KPX comma quotedblright -70 +KPX comma quoteright -70 +KPX e g -15 +KPX e gbreve -15 +KPX e gcommaaccent -15 +KPX e v -25 +KPX e w -25 +KPX e x -15 +KPX e y -15 +KPX e yacute -15 +KPX e ydieresis -15 +KPX eacute g -15 +KPX eacute gbreve -15 +KPX eacute gcommaaccent -15 +KPX eacute v -25 +KPX eacute w -25 +KPX eacute x -15 +KPX eacute y -15 +KPX eacute yacute -15 +KPX eacute ydieresis -15 +KPX ecaron g -15 +KPX ecaron gbreve -15 +KPX ecaron gcommaaccent -15 +KPX ecaron v -25 +KPX ecaron w -25 +KPX ecaron x -15 +KPX ecaron y -15 +KPX ecaron yacute -15 +KPX ecaron ydieresis -15 +KPX ecircumflex g -15 +KPX ecircumflex gbreve -15 +KPX ecircumflex gcommaaccent -15 +KPX ecircumflex v -25 +KPX ecircumflex w -25 +KPX ecircumflex x -15 +KPX ecircumflex y -15 +KPX ecircumflex yacute -15 +KPX ecircumflex ydieresis -15 +KPX edieresis g -15 +KPX edieresis gbreve -15 +KPX edieresis gcommaaccent -15 +KPX edieresis v -25 +KPX edieresis w -25 +KPX edieresis x -15 +KPX edieresis y -15 +KPX edieresis yacute -15 +KPX edieresis ydieresis -15 +KPX edotaccent g -15 +KPX edotaccent gbreve -15 +KPX edotaccent gcommaaccent -15 +KPX edotaccent v -25 +KPX edotaccent w -25 +KPX edotaccent x -15 +KPX edotaccent y -15 +KPX edotaccent yacute -15 +KPX edotaccent ydieresis -15 +KPX egrave g -15 +KPX egrave gbreve -15 +KPX egrave gcommaaccent -15 +KPX egrave v -25 +KPX egrave w -25 +KPX egrave x -15 +KPX egrave y -15 +KPX egrave yacute -15 +KPX egrave ydieresis -15 +KPX emacron g -15 +KPX emacron gbreve -15 +KPX emacron gcommaaccent -15 +KPX emacron v -25 +KPX emacron w -25 +KPX emacron x -15 +KPX emacron y -15 +KPX emacron yacute -15 +KPX emacron ydieresis -15 +KPX eogonek g -15 +KPX eogonek gbreve -15 +KPX eogonek gcommaaccent -15 +KPX eogonek v -25 +KPX eogonek w -25 +KPX eogonek x -15 +KPX eogonek y -15 +KPX eogonek yacute -15 +KPX eogonek ydieresis -15 +KPX f a -10 +KPX f aacute -10 +KPX f abreve -10 +KPX f acircumflex -10 +KPX f adieresis -10 +KPX f agrave -10 +KPX f amacron -10 +KPX f aogonek -10 +KPX f aring -10 +KPX f atilde -10 +KPX f dotlessi -50 +KPX f f -25 +KPX f i -20 +KPX f iacute -20 +KPX f quoteright 55 +KPX g a -5 +KPX g aacute -5 +KPX g abreve -5 +KPX g acircumflex -5 +KPX g adieresis -5 +KPX g agrave -5 +KPX g amacron -5 +KPX g aogonek -5 +KPX g aring -5 +KPX g atilde -5 +KPX gbreve a -5 +KPX gbreve aacute -5 +KPX gbreve abreve -5 +KPX gbreve acircumflex -5 +KPX gbreve adieresis -5 +KPX gbreve agrave -5 +KPX gbreve amacron -5 +KPX gbreve aogonek -5 +KPX gbreve aring -5 +KPX gbreve atilde -5 +KPX gcommaaccent a -5 +KPX gcommaaccent aacute -5 +KPX gcommaaccent abreve -5 +KPX gcommaaccent acircumflex -5 +KPX gcommaaccent adieresis -5 +KPX gcommaaccent agrave -5 +KPX gcommaaccent amacron -5 +KPX gcommaaccent aogonek -5 +KPX gcommaaccent aring -5 +KPX gcommaaccent atilde -5 +KPX h y -5 +KPX h yacute -5 +KPX h ydieresis -5 +KPX i v -25 +KPX iacute v -25 +KPX icircumflex v -25 +KPX idieresis v -25 +KPX igrave v -25 +KPX imacron v -25 +KPX iogonek v -25 +KPX k e -10 +KPX k eacute -10 +KPX k ecaron -10 +KPX k ecircumflex -10 +KPX k edieresis -10 +KPX k edotaccent -10 +KPX k egrave -10 +KPX k emacron -10 +KPX k eogonek -10 +KPX k o -10 +KPX k oacute -10 +KPX k ocircumflex -10 +KPX k odieresis -10 +KPX k ograve -10 +KPX k ohungarumlaut -10 +KPX k omacron -10 +KPX k oslash -10 +KPX k otilde -10 +KPX k y -15 +KPX k yacute -15 +KPX k ydieresis -15 +KPX kcommaaccent e -10 +KPX kcommaaccent eacute -10 +KPX kcommaaccent ecaron -10 +KPX kcommaaccent ecircumflex -10 +KPX kcommaaccent edieresis -10 +KPX kcommaaccent edotaccent -10 +KPX kcommaaccent egrave -10 +KPX kcommaaccent emacron -10 +KPX kcommaaccent eogonek -10 +KPX kcommaaccent o -10 +KPX kcommaaccent oacute -10 +KPX kcommaaccent ocircumflex -10 +KPX kcommaaccent odieresis -10 +KPX kcommaaccent ograve -10 +KPX kcommaaccent ohungarumlaut -10 +KPX kcommaaccent omacron -10 +KPX kcommaaccent oslash -10 +KPX kcommaaccent otilde -10 +KPX kcommaaccent y -15 +KPX kcommaaccent yacute -15 +KPX kcommaaccent ydieresis -15 +KPX l w -10 +KPX lacute w -10 +KPX lcommaaccent w -10 +KPX lslash w -10 +KPX n v -40 +KPX n y -15 +KPX n yacute -15 +KPX n ydieresis -15 +KPX nacute v -40 +KPX nacute y -15 +KPX nacute yacute -15 +KPX nacute ydieresis -15 +KPX ncaron v -40 +KPX ncaron y -15 +KPX ncaron yacute -15 +KPX ncaron ydieresis -15 +KPX ncommaaccent v -40 +KPX ncommaaccent y -15 +KPX ncommaaccent yacute -15 +KPX ncommaaccent ydieresis -15 +KPX ntilde v -40 +KPX ntilde y -15 +KPX ntilde yacute -15 +KPX ntilde ydieresis -15 +KPX o v -15 +KPX o w -25 +KPX o y -10 +KPX o yacute -10 +KPX o ydieresis -10 +KPX oacute v -15 +KPX oacute w -25 +KPX oacute y -10 +KPX oacute yacute -10 +KPX oacute ydieresis -10 +KPX ocircumflex v -15 +KPX ocircumflex w -25 +KPX ocircumflex y -10 +KPX ocircumflex yacute -10 +KPX ocircumflex ydieresis -10 +KPX odieresis v -15 +KPX odieresis w -25 +KPX odieresis y -10 +KPX odieresis yacute -10 +KPX odieresis ydieresis -10 +KPX ograve v -15 +KPX ograve w -25 +KPX ograve y -10 +KPX ograve yacute -10 +KPX ograve ydieresis -10 +KPX ohungarumlaut v -15 +KPX ohungarumlaut w -25 +KPX ohungarumlaut y -10 +KPX ohungarumlaut yacute -10 +KPX ohungarumlaut ydieresis -10 +KPX omacron v -15 +KPX omacron w -25 +KPX omacron y -10 +KPX omacron yacute -10 +KPX omacron ydieresis -10 +KPX oslash v -15 +KPX oslash w -25 +KPX oslash y -10 +KPX oslash yacute -10 +KPX oslash ydieresis -10 +KPX otilde v -15 +KPX otilde w -25 +KPX otilde y -10 +KPX otilde yacute -10 +KPX otilde ydieresis -10 +KPX p y -10 +KPX p yacute -10 +KPX p ydieresis -10 +KPX period quotedblright -70 +KPX period quoteright -70 +KPX quotedblleft A -80 +KPX quotedblleft Aacute -80 +KPX quotedblleft Abreve -80 +KPX quotedblleft Acircumflex -80 +KPX quotedblleft Adieresis -80 +KPX quotedblleft Agrave -80 +KPX quotedblleft Amacron -80 +KPX quotedblleft Aogonek -80 +KPX quotedblleft Aring -80 +KPX quotedblleft Atilde -80 +KPX quoteleft A -80 +KPX quoteleft Aacute -80 +KPX quoteleft Abreve -80 +KPX quoteleft Acircumflex -80 +KPX quoteleft Adieresis -80 +KPX quoteleft Agrave -80 +KPX quoteleft Amacron -80 +KPX quoteleft Aogonek -80 +KPX quoteleft Aring -80 +KPX quoteleft Atilde -80 +KPX quoteleft quoteleft -74 +KPX quoteright d -50 +KPX quoteright dcroat -50 +KPX quoteright l -10 +KPX quoteright lacute -10 +KPX quoteright lcommaaccent -10 +KPX quoteright lslash -10 +KPX quoteright quoteright -74 +KPX quoteright r -50 +KPX quoteright racute -50 +KPX quoteright rcaron -50 +KPX quoteright rcommaaccent -50 +KPX quoteright s -55 +KPX quoteright sacute -55 +KPX quoteright scaron -55 +KPX quoteright scedilla -55 +KPX quoteright scommaaccent -55 +KPX quoteright space -74 +KPX quoteright t -18 +KPX quoteright tcommaaccent -18 +KPX quoteright v -50 +KPX r comma -40 +KPX r g -18 +KPX r gbreve -18 +KPX r gcommaaccent -18 +KPX r hyphen -20 +KPX r period -55 +KPX racute comma -40 +KPX racute g -18 +KPX racute gbreve -18 +KPX racute gcommaaccent -18 +KPX racute hyphen -20 +KPX racute period -55 +KPX rcaron comma -40 +KPX rcaron g -18 +KPX rcaron gbreve -18 +KPX rcaron gcommaaccent -18 +KPX rcaron hyphen -20 +KPX rcaron period -55 +KPX rcommaaccent comma -40 +KPX rcommaaccent g -18 +KPX rcommaaccent gbreve -18 +KPX rcommaaccent gcommaaccent -18 +KPX rcommaaccent hyphen -20 +KPX rcommaaccent period -55 +KPX space A -55 +KPX space Aacute -55 +KPX space Abreve -55 +KPX space Acircumflex -55 +KPX space Adieresis -55 +KPX space Agrave -55 +KPX space Amacron -55 +KPX space Aogonek -55 +KPX space Aring -55 +KPX space Atilde -55 +KPX space T -18 +KPX space Tcaron -18 +KPX space Tcommaaccent -18 +KPX space V -50 +KPX space W -30 +KPX space Y -90 +KPX space Yacute -90 +KPX space Ydieresis -90 +KPX v a -25 +KPX v aacute -25 +KPX v abreve -25 +KPX v acircumflex -25 +KPX v adieresis -25 +KPX v agrave -25 +KPX v amacron -25 +KPX v aogonek -25 +KPX v aring -25 +KPX v atilde -25 +KPX v comma -65 +KPX v e -15 +KPX v eacute -15 +KPX v ecaron -15 +KPX v ecircumflex -15 +KPX v edieresis -15 +KPX v edotaccent -15 +KPX v egrave -15 +KPX v emacron -15 +KPX v eogonek -15 +KPX v o -20 +KPX v oacute -20 +KPX v ocircumflex -20 +KPX v odieresis -20 +KPX v ograve -20 +KPX v ohungarumlaut -20 +KPX v omacron -20 +KPX v oslash -20 +KPX v otilde -20 +KPX v period -65 +KPX w a -10 +KPX w aacute -10 +KPX w abreve -10 +KPX w acircumflex -10 +KPX w adieresis -10 +KPX w agrave -10 +KPX w amacron -10 +KPX w aogonek -10 +KPX w aring -10 +KPX w atilde -10 +KPX w comma -65 +KPX w o -10 +KPX w oacute -10 +KPX w ocircumflex -10 +KPX w odieresis -10 +KPX w ograve -10 +KPX w ohungarumlaut -10 +KPX w omacron -10 +KPX w oslash -10 +KPX w otilde -10 +KPX w period -65 +KPX x e -15 +KPX x eacute -15 +KPX x ecaron -15 +KPX x ecircumflex -15 +KPX x edieresis -15 +KPX x edotaccent -15 +KPX x egrave -15 +KPX x emacron -15 +KPX x eogonek -15 +KPX y comma -65 +KPX y period -65 +KPX yacute comma -65 +KPX yacute period -65 +KPX ydieresis comma -65 +KPX ydieresis period -65 +EndKernPairs +EndKernData +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/ZapfDingbats.afm b/dompdf/vendor/dompdf/dompdf/lib/fonts/ZapfDingbats.afm new file mode 100644 index 0000000..dc5662e --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/ZapfDingbats.afm @@ -0,0 +1,225 @@ +StartFontMetrics 4.1 +Comment Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved. +Comment Creation Date: Thu May 1 15:14:13 1997 +Comment UniqueID 43082 +Comment VMusage 45775 55535 +FontName ZapfDingbats +FullName ITC Zapf Dingbats +FamilyName ZapfDingbats +Weight Medium +ItalicAngle 0 +IsFixedPitch false +CharacterSet Special +FontBBox -1 -143 981 820 +UnderlinePosition -100 +UnderlineThickness 50 +Version 002.000 +Notice Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Zapf Dingbats is a registered trademark of International Typeface Corporation. +EncodingScheme FontSpecific +StdHW 28 +StdVW 90 +StartCharMetrics 202 +C 32 ; WX 278 ; N space ; B 0 0 0 0 ; +C 33 ; WX 974 ; N a1 ; B 35 72 939 621 ; +C 34 ; WX 961 ; N a2 ; B 35 81 927 611 ; +C 35 ; WX 974 ; N a202 ; B 35 72 939 621 ; +C 36 ; WX 980 ; N a3 ; B 35 0 945 692 ; +C 37 ; WX 719 ; N a4 ; B 34 139 685 566 ; +C 38 ; WX 789 ; N a5 ; B 35 -14 755 705 ; +C 39 ; WX 790 ; N a119 ; B 35 -14 755 705 ; +C 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ; +C 41 ; WX 690 ; N a117 ; B 34 138 655 553 ; +C 42 ; WX 960 ; N a11 ; B 35 123 925 568 ; +C 43 ; WX 939 ; N a12 ; B 35 134 904 559 ; +C 44 ; WX 549 ; N a13 ; B 29 -11 516 705 ; +C 45 ; WX 855 ; N a14 ; B 34 59 820 632 ; +C 46 ; WX 911 ; N a15 ; B 35 50 876 642 ; +C 47 ; WX 933 ; N a16 ; B 35 139 899 550 ; +C 48 ; WX 911 ; N a105 ; B 35 50 876 642 ; +C 49 ; WX 945 ; N a17 ; B 35 139 909 553 ; +C 50 ; WX 974 ; N a18 ; B 35 104 938 587 ; +C 51 ; WX 755 ; N a19 ; B 34 -13 721 705 ; +C 52 ; WX 846 ; N a20 ; B 36 -14 811 705 ; +C 53 ; WX 762 ; N a21 ; B 35 0 727 692 ; +C 54 ; WX 761 ; N a22 ; B 35 0 727 692 ; +C 55 ; WX 571 ; N a23 ; B -1 -68 571 661 ; +C 56 ; WX 677 ; N a24 ; B 36 -13 642 705 ; +C 57 ; WX 763 ; N a25 ; B 35 0 728 692 ; +C 58 ; WX 760 ; N a26 ; B 35 0 726 692 ; +C 59 ; WX 759 ; N a27 ; B 35 0 725 692 ; +C 60 ; WX 754 ; N a28 ; B 35 0 720 692 ; +C 61 ; WX 494 ; N a6 ; B 35 0 460 692 ; +C 62 ; WX 552 ; N a7 ; B 35 0 517 692 ; +C 63 ; WX 537 ; N a8 ; B 35 0 503 692 ; +C 64 ; WX 577 ; N a9 ; B 35 96 542 596 ; +C 65 ; WX 692 ; N a10 ; B 35 -14 657 705 ; +C 66 ; WX 786 ; N a29 ; B 35 -14 751 705 ; +C 67 ; WX 788 ; N a30 ; B 35 -14 752 705 ; +C 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ; +C 69 ; WX 790 ; N a32 ; B 35 -14 756 705 ; +C 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ; +C 71 ; WX 794 ; N a34 ; B 35 -13 759 705 ; +C 72 ; WX 816 ; N a35 ; B 35 -14 782 705 ; +C 73 ; WX 823 ; N a36 ; B 35 -14 787 705 ; +C 74 ; WX 789 ; N a37 ; B 35 -14 754 705 ; +C 75 ; WX 841 ; N a38 ; B 35 -14 807 705 ; +C 76 ; WX 823 ; N a39 ; B 35 -14 789 705 ; +C 77 ; WX 833 ; N a40 ; B 35 -14 798 705 ; +C 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ; +C 79 ; WX 831 ; N a42 ; B 35 -14 796 705 ; +C 80 ; WX 923 ; N a43 ; B 35 -14 888 705 ; +C 81 ; WX 744 ; N a44 ; B 35 0 710 692 ; +C 82 ; WX 723 ; N a45 ; B 35 0 688 692 ; +C 83 ; WX 749 ; N a46 ; B 35 0 714 692 ; +C 84 ; WX 790 ; N a47 ; B 34 -14 756 705 ; +C 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ; +C 86 ; WX 695 ; N a49 ; B 35 -14 661 706 ; +C 87 ; WX 776 ; N a50 ; B 35 -6 741 699 ; +C 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ; +C 89 ; WX 792 ; N a52 ; B 35 -14 757 705 ; +C 90 ; WX 759 ; N a53 ; B 35 0 725 692 ; +C 91 ; WX 707 ; N a54 ; B 35 -13 672 704 ; +C 92 ; WX 708 ; N a55 ; B 35 -14 672 705 ; +C 93 ; WX 682 ; N a56 ; B 35 -14 647 705 ; +C 94 ; WX 701 ; N a57 ; B 35 -14 666 705 ; +C 95 ; WX 826 ; N a58 ; B 35 -14 791 705 ; +C 96 ; WX 815 ; N a59 ; B 35 -14 780 705 ; +C 97 ; WX 789 ; N a60 ; B 35 -14 754 705 ; +C 98 ; WX 789 ; N a61 ; B 35 -14 754 705 ; +C 99 ; WX 707 ; N a62 ; B 34 -14 673 705 ; +C 100 ; WX 687 ; N a63 ; B 36 0 651 692 ; +C 101 ; WX 696 ; N a64 ; B 35 0 661 691 ; +C 102 ; WX 689 ; N a65 ; B 35 0 655 692 ; +C 103 ; WX 786 ; N a66 ; B 34 -14 751 705 ; +C 104 ; WX 787 ; N a67 ; B 35 -14 752 705 ; +C 105 ; WX 713 ; N a68 ; B 35 -14 678 705 ; +C 106 ; WX 791 ; N a69 ; B 35 -14 756 705 ; +C 107 ; WX 785 ; N a70 ; B 36 -14 751 705 ; +C 108 ; WX 791 ; N a71 ; B 35 -14 757 705 ; +C 109 ; WX 873 ; N a72 ; B 35 -14 838 705 ; +C 110 ; WX 761 ; N a73 ; B 35 0 726 692 ; +C 111 ; WX 762 ; N a74 ; B 35 0 727 692 ; +C 112 ; WX 762 ; N a203 ; B 35 0 727 692 ; +C 113 ; WX 759 ; N a75 ; B 35 0 725 692 ; +C 114 ; WX 759 ; N a204 ; B 35 0 725 692 ; +C 115 ; WX 892 ; N a76 ; B 35 0 858 705 ; +C 116 ; WX 892 ; N a77 ; B 35 -14 858 692 ; +C 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ; +C 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ; +C 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ; +C 120 ; WX 138 ; N a82 ; B 35 0 104 692 ; +C 121 ; WX 277 ; N a83 ; B 35 0 242 692 ; +C 122 ; WX 415 ; N a84 ; B 35 0 380 692 ; +C 123 ; WX 392 ; N a97 ; B 35 263 357 705 ; +C 124 ; WX 392 ; N a98 ; B 34 263 357 705 ; +C 125 ; WX 668 ; N a99 ; B 35 263 633 705 ; +C 126 ; WX 668 ; N a100 ; B 36 263 634 705 ; +C 128 ; WX 390 ; N a89 ; B 35 -14 356 705 ; +C 129 ; WX 390 ; N a90 ; B 35 -14 355 705 ; +C 130 ; WX 317 ; N a93 ; B 35 0 283 692 ; +C 131 ; WX 317 ; N a94 ; B 35 0 283 692 ; +C 132 ; WX 276 ; N a91 ; B 35 0 242 692 ; +C 133 ; WX 276 ; N a92 ; B 35 0 242 692 ; +C 134 ; WX 509 ; N a205 ; B 35 0 475 692 ; +C 135 ; WX 509 ; N a85 ; B 35 0 475 692 ; +C 136 ; WX 410 ; N a206 ; B 35 0 375 692 ; +C 137 ; WX 410 ; N a86 ; B 35 0 375 692 ; +C 138 ; WX 234 ; N a87 ; B 35 -14 199 705 ; +C 139 ; WX 234 ; N a88 ; B 35 -14 199 705 ; +C 140 ; WX 334 ; N a95 ; B 35 0 299 692 ; +C 141 ; WX 334 ; N a96 ; B 35 0 299 692 ; +C 161 ; WX 732 ; N a101 ; B 35 -143 697 806 ; +C 162 ; WX 544 ; N a102 ; B 56 -14 488 706 ; +C 163 ; WX 544 ; N a103 ; B 34 -14 508 705 ; +C 164 ; WX 910 ; N a104 ; B 35 40 875 651 ; +C 165 ; WX 667 ; N a106 ; B 35 -14 633 705 ; +C 166 ; WX 760 ; N a107 ; B 35 -14 726 705 ; +C 167 ; WX 760 ; N a108 ; B 0 121 758 569 ; +C 168 ; WX 776 ; N a112 ; B 35 0 741 705 ; +C 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ; +C 170 ; WX 694 ; N a110 ; B 35 -14 659 705 ; +C 171 ; WX 626 ; N a109 ; B 34 0 591 705 ; +C 172 ; WX 788 ; N a120 ; B 35 -14 754 705 ; +C 173 ; WX 788 ; N a121 ; B 35 -14 754 705 ; +C 174 ; WX 788 ; N a122 ; B 35 -14 754 705 ; +C 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ; +C 176 ; WX 788 ; N a124 ; B 35 -14 754 705 ; +C 177 ; WX 788 ; N a125 ; B 35 -14 754 705 ; +C 178 ; WX 788 ; N a126 ; B 35 -14 754 705 ; +C 179 ; WX 788 ; N a127 ; B 35 -14 754 705 ; +C 180 ; WX 788 ; N a128 ; B 35 -14 754 705 ; +C 181 ; WX 788 ; N a129 ; B 35 -14 754 705 ; +C 182 ; WX 788 ; N a130 ; B 35 -14 754 705 ; +C 183 ; WX 788 ; N a131 ; B 35 -14 754 705 ; +C 184 ; WX 788 ; N a132 ; B 35 -14 754 705 ; +C 185 ; WX 788 ; N a133 ; B 35 -14 754 705 ; +C 186 ; WX 788 ; N a134 ; B 35 -14 754 705 ; +C 187 ; WX 788 ; N a135 ; B 35 -14 754 705 ; +C 188 ; WX 788 ; N a136 ; B 35 -14 754 705 ; +C 189 ; WX 788 ; N a137 ; B 35 -14 754 705 ; +C 190 ; WX 788 ; N a138 ; B 35 -14 754 705 ; +C 191 ; WX 788 ; N a139 ; B 35 -14 754 705 ; +C 192 ; WX 788 ; N a140 ; B 35 -14 754 705 ; +C 193 ; WX 788 ; N a141 ; B 35 -14 754 705 ; +C 194 ; WX 788 ; N a142 ; B 35 -14 754 705 ; +C 195 ; WX 788 ; N a143 ; B 35 -14 754 705 ; +C 196 ; WX 788 ; N a144 ; B 35 -14 754 705 ; +C 197 ; WX 788 ; N a145 ; B 35 -14 754 705 ; +C 198 ; WX 788 ; N a146 ; B 35 -14 754 705 ; +C 199 ; WX 788 ; N a147 ; B 35 -14 754 705 ; +C 200 ; WX 788 ; N a148 ; B 35 -14 754 705 ; +C 201 ; WX 788 ; N a149 ; B 35 -14 754 705 ; +C 202 ; WX 788 ; N a150 ; B 35 -14 754 705 ; +C 203 ; WX 788 ; N a151 ; B 35 -14 754 705 ; +C 204 ; WX 788 ; N a152 ; B 35 -14 754 705 ; +C 205 ; WX 788 ; N a153 ; B 35 -14 754 705 ; +C 206 ; WX 788 ; N a154 ; B 35 -14 754 705 ; +C 207 ; WX 788 ; N a155 ; B 35 -14 754 705 ; +C 208 ; WX 788 ; N a156 ; B 35 -14 754 705 ; +C 209 ; WX 788 ; N a157 ; B 35 -14 754 705 ; +C 210 ; WX 788 ; N a158 ; B 35 -14 754 705 ; +C 211 ; WX 788 ; N a159 ; B 35 -14 754 705 ; +C 212 ; WX 894 ; N a160 ; B 35 58 860 634 ; +C 213 ; WX 838 ; N a161 ; B 35 152 803 540 ; +C 214 ; WX 1016 ; N a163 ; B 34 152 981 540 ; +C 215 ; WX 458 ; N a164 ; B 35 -127 422 820 ; +C 216 ; WX 748 ; N a196 ; B 35 94 698 597 ; +C 217 ; WX 924 ; N a165 ; B 35 140 890 552 ; +C 218 ; WX 748 ; N a192 ; B 35 94 698 597 ; +C 219 ; WX 918 ; N a166 ; B 35 166 884 526 ; +C 220 ; WX 927 ; N a167 ; B 35 32 892 660 ; +C 221 ; WX 928 ; N a168 ; B 35 129 891 562 ; +C 222 ; WX 928 ; N a169 ; B 35 128 893 563 ; +C 223 ; WX 834 ; N a170 ; B 35 155 799 537 ; +C 224 ; WX 873 ; N a171 ; B 35 93 838 599 ; +C 225 ; WX 828 ; N a172 ; B 35 104 791 588 ; +C 226 ; WX 924 ; N a173 ; B 35 98 889 594 ; +C 227 ; WX 924 ; N a162 ; B 35 98 889 594 ; +C 228 ; WX 917 ; N a174 ; B 35 0 882 692 ; +C 229 ; WX 930 ; N a175 ; B 35 84 896 608 ; +C 230 ; WX 931 ; N a176 ; B 35 84 896 608 ; +C 231 ; WX 463 ; N a177 ; B 35 -99 429 791 ; +C 232 ; WX 883 ; N a178 ; B 35 71 848 623 ; +C 233 ; WX 836 ; N a179 ; B 35 44 802 648 ; +C 234 ; WX 836 ; N a193 ; B 35 44 802 648 ; +C 235 ; WX 867 ; N a180 ; B 35 101 832 591 ; +C 236 ; WX 867 ; N a199 ; B 35 101 832 591 ; +C 237 ; WX 696 ; N a181 ; B 35 44 661 648 ; +C 238 ; WX 696 ; N a200 ; B 35 44 661 648 ; +C 239 ; WX 874 ; N a182 ; B 35 77 840 619 ; +C 241 ; WX 874 ; N a201 ; B 35 73 840 615 ; +C 242 ; WX 760 ; N a183 ; B 35 0 725 692 ; +C 243 ; WX 946 ; N a184 ; B 35 160 911 533 ; +C 244 ; WX 771 ; N a197 ; B 34 37 736 655 ; +C 245 ; WX 865 ; N a185 ; B 35 207 830 481 ; +C 246 ; WX 771 ; N a194 ; B 34 37 736 655 ; +C 247 ; WX 888 ; N a198 ; B 34 -19 853 712 ; +C 248 ; WX 967 ; N a186 ; B 35 124 932 568 ; +C 249 ; WX 888 ; N a195 ; B 34 -19 853 712 ; +C 250 ; WX 831 ; N a187 ; B 35 113 796 579 ; +C 251 ; WX 873 ; N a188 ; B 36 118 838 578 ; +C 252 ; WX 927 ; N a189 ; B 35 150 891 542 ; +C 253 ; WX 970 ; N a190 ; B 35 76 931 616 ; +C 254 ; WX 918 ; N a191 ; B 34 99 884 593 ; +EndCharMetrics +EndFontMetrics diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/installed-fonts.dist.json b/dompdf/vendor/dompdf/dompdf/lib/fonts/installed-fonts.dist.json new file mode 100644 index 0000000..c6abf15 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/installed-fonts.dist.json @@ -0,0 +1,80 @@ +{ + "sans-serif": { + "normal": "Helvetica", + "bold": "Helvetica-Bold", + "italic": "Helvetica-Oblique", + "bold_italic": "Helvetica-BoldOblique" + }, + "times": { + "normal": "Times-Roman", + "bold": "Times-Bold", + "italic": "Times-Italic", + "bold_italic": "Times-BoldItalic" + }, + "times-roman": { + "normal": "Times-Roman", + "bold": "Times-Bold", + "italic": "Times-Italic", + "bold_italic": "Times-BoldItalic" + }, + "courier": { + "normal": "Courier", + "bold": "Courier-Bold", + "italic": "Courier-Oblique", + "bold_italic": "Courier-BoldOblique" + }, + "helvetica": { + "normal": "Helvetica", + "bold": "Helvetica-Bold", + "italic": "Helvetica-Oblique", + "bold_italic": "Helvetica-BoldOblique" + }, + "zapfdingbats": { + "normal": "ZapfDingbats", + "bold": "ZapfDingbats", + "italic": "ZapfDingbats", + "bold_italic": "ZapfDingbats" + }, + "symbol": { + "normal": "Symbol", + "bold": "Symbol", + "italic": "Symbol", + "bold_italic": "Symbol" + }, + "serif": { + "normal": "Times-Roman", + "bold": "Times-Bold", + "italic": "Times-Italic", + "bold_italic": "Times-BoldItalic" + }, + "monospace": { + "normal": "Courier", + "bold": "Courier-Bold", + "italic": "Courier-Oblique", + "bold_italic": "Courier-BoldOblique" + }, + "fixed": { + "normal": "Courier", + "bold": "Courier-Bold", + "italic": "Courier-Oblique", + "bold_italic": "Courier-BoldOblique" + }, + "dejavu sans": { + "bold": "DejaVuSans-Bold", + "bold_italic": "DejaVuSans-BoldOblique", + "italic": "DejaVuSans-Oblique", + "normal": "DejaVuSans" + }, + "dejavu sans mono": { + "bold": "DejaVuSansMono-Bold", + "bold_italic": "DejaVuSansMono-BoldOblique", + "italic": "DejaVuSansMono-Oblique", + "normal": "DejaVuSansMono" + }, + "dejavu serif": { + "bold": "DejaVuSerif-Bold", + "bold_italic": "DejaVuSerif-BoldItalic", + "italic": "DejaVuSerif-Italic", + "normal": "DejaVuSerif" + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/dompdf/lib/fonts/mustRead.html b/dompdf/vendor/dompdf/dompdf/lib/fonts/mustRead.html new file mode 100644 index 0000000..b9f4ba2 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/fonts/mustRead.html @@ -0,0 +1,17 @@ + + + + + Core 14 AFM Files - ReadMe + + + or + + + + + +
This file and the 14 PostScript(R) AFM files it accompanies may be used, copied, and distributed for any purpose and without charge, with or without modification, provided that all copyright notices are retained; that the AFM files are not distributed without this file; that all modifications to this file or any of the AFM files are prominently noted in the modified file(s); and that this paragraph is not modified. Adobe Systems has no responsibility or obligation to support the use of the AFM files. Col
+

Source http://www.adobe.com/devnet/font/#pcfi

+ + \ No newline at end of file diff --git a/dompdf/vendor/dompdf/dompdf/lib/res/broken_image.png b/dompdf/vendor/dompdf/dompdf/lib/res/broken_image.png new file mode 100644 index 0000000..771a1a3 Binary files /dev/null and b/dompdf/vendor/dompdf/dompdf/lib/res/broken_image.png differ diff --git a/dompdf/vendor/dompdf/dompdf/lib/res/broken_image.svg b/dompdf/vendor/dompdf/dompdf/lib/res/broken_image.svg new file mode 100644 index 0000000..83ba7e7 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/res/broken_image.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/dompdf/vendor/dompdf/dompdf/lib/res/html.css b/dompdf/vendor/dompdf/dompdf/lib/res/html.css new file mode 100644 index 0000000..151a350 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/res/html.css @@ -0,0 +1,526 @@ +/** + * dompdf default stylesheet. + * + * @package dompdf + * @link https://github.com/dompdf/dompdf + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * + * Portions from Mozilla + * @link https://dxr.mozilla.org/mozilla-central/source/layout/style/res/html.css + * @license http://mozilla.org/MPL/2.0/ Mozilla Public License, v. 2.0 + * + * Portions from W3C + * @link https://www.w3.org/TR/css-ui-3/#default-style-sheet + * + */ + +@page { + margin: 1.2cm; +} + +html { + display: -dompdf-page !important; + counter-reset: page; +} + +/* blocks */ + +article, +aside, +details, +div, +dt, +figcaption, +footer, +form, +header, +hgroup, +main, +nav, +noscript, +section, +summary { + display: block; +} + +body { + page-break-before: avoid; + display: block !important; + counter-increment: page; +} + +p, dl, multicol { + display: block; + margin: 1em 0; +} + +dd { + display: block; + margin-left: 40px; +} + +blockquote, figure { + display: block; + margin: 1em 40px; +} + +address { + display: block; + font-style: italic; +} + +center { + display: block; + text-align: center; +} + +blockquote[type=cite] { + display: block; + margin: 1em 0; + padding-left: 1em; + border-left: solid; + border-color: blue; + border-width: thin; +} + +h1, h2, h3, h4, h5, h6 { + display: block; + font-weight: bold; +} + +h1 { + font-size: 2em; + margin: .67em 0; +} + +h2 { + font-size: 1.5em; + margin: .83em 0; +} + +h3 { + font-size: 1.17em; + margin: 1em 0; +} + +h4 { + margin: 1.33em 0; +} + +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} + +h6 { + font-size: 0.67em; + margin: 2.33em 0; +} + +listing { + display: block; + font-family: fixed; + font-size: medium; + white-space: pre; + margin: 1em 0; +} + +plaintext, pre, xmp { + display: block; + font-family: fixed; + white-space: pre; + margin: 1em 0; +} + +/* tables */ + +table { + display: table; + border-spacing: 2px; + border-collapse: separate; + margin-top: 0; + margin-bottom: 0; + text-indent: 0; + text-align: left; /* quirk */ +} + +table[border] { + border: outset gray; +} + +table[border] td, +table[border] th { + border: 1px inset gray; +} + +table[border="0"] td, +table[border="0"] th { + border-width: 0; +} + +/* make sure backgrounds are inherited in tables -- see bug 4510 */ +td, th, tr { + background: inherit; +} + +/* caption inherits from table not table-outer */ +caption { + display: table-caption; + text-align: center; +} + +tr { + display: table-row; + vertical-align: inherit; +} + +col { + display: table-column; +} + +colgroup { + display: table-column-group; +} + +tbody { + display: table-row-group; + vertical-align: middle; +} + +thead { + display: table-header-group; + vertical-align: middle; +} + +tfoot { + display: table-footer-group; + vertical-align: middle; +} + +/* To simulate tbody auto-insertion */ +table > tr { + vertical-align: middle; +} + +td { + display: table-cell; + vertical-align: inherit; + text-align: inherit; + padding: 1px; +} + +th { + display: table-cell; + vertical-align: inherit; + text-align: center; + font-weight: bold; + padding: 1px; +} + +/* inlines */ + +q::before { + content: open-quote; +} + +q::after { + content: close-quote; +} + +:link { + color: #00c; + text-decoration: underline; +} + +b, strong { + font-weight: bolder; +} + +i, cite, em, var, dfn { + font-style: italic; +} + +tt, code, kbd, samp { + font-family: fixed; +} + +u, ins { + text-decoration: underline; +} + +s, strike, del { + text-decoration: line-through; +} + +big { + font-size: larger; +} + +small { + font-size: smaller; +} + +sub { + vertical-align: sub; + font-size: smaller; + line-height: normal; +} + +sup { + vertical-align: super; + font-size: smaller; + line-height: normal; +} + +nobr { + white-space: nowrap; +} + +mark { + background: yellow; + color: black; +} + +/* titles */ + +abbr[title], acronym[title] { + text-decoration: dotted underline; +} + +/* lists */ + +ul, menu, dir { + display: block; + list-style-type: disc; + margin: 1em 0; + padding-left: 40px; +} + +ol { + display: block; + list-style-type: decimal; + margin: 1em 0; + padding-left: 40px; +} + +li { + display: list-item; +} + +/*li::before { + display: -dompdf-list-bullet !important; + content: counter(-dompdf-default-counter) ". "; + padding-right: 0.5em; +}*/ + +/* nested lists have no top/bottom margins */ +:matches(ul, ol, dir, menu, dl) ul, +:matches(ul, ol, dir, menu, dl) ol, +:matches(ul, ol, dir, menu, dl) dir, +:matches(ul, ol, dir, menu, dl) menu, +:matches(ul, ol, dir, menu, dl) dl { + margin-top: 0; + margin-bottom: 0; +} + +/* 2 deep unordered lists use a circle */ +:matches(ul, ol, dir, menu) ul, +:matches(ul, ol, dir, menu) menu, +:matches(ul, ol, dir, menu) dir { + list-style-type: circle; +} + +/* 3 deep (or more) unordered lists use a square */ +:matches(ul, ol, dir, menu) :matches(ul, ol, dir, menu) ul, +:matches(ul, ol, dir, menu) :matches(ul, ol, dir, menu) menu, +:matches(ul, ol, dir, menu) :matches(ul, ol, dir, menu) dir { + list-style-type: square; +} + +/* forms */ +/* From https://www.w3.org/TR/css-ui-3/#default-style-sheet */ +form { + display: block; +} + +input, button, select { + display: inline-block; + font-family: sans-serif; +} + +input, button, textarea, select { + background: #FFF; + border: 1px solid #999; + padding: 2px; + margin: 2px; +} + +input, select { + width: 12em; +} + +input[type=hidden] { + display: none !important; +} + +input[type=checkbox], +input[type=radio], +input[type=image] { + width: auto; + border: none; + padding: 0; + margin: 0; +} + +input[type=button], +input[type=submit], +input[type=reset], +input[type=file], +button { + width: auto; + background: #CCC; + text-align: center; +} + +input[type=file] { + width: 8em; +} + +input::before { + content: attr(value); +} + +input[type=image][alt]::before { + content: attr(alt); +} + +input[type=file]::before { + content: "Choose a file"; +} + +input[type=password][value]::before { + font-family: "DejaVu Sans" !important; + content: "\2022\2022\2022\2022\2022\2022\2022\2022"; + line-height: 1em; +} + +input[type=password][value=""]::before { + content: none; +} + +input[type=checkbox], +input[type=radio], +select::after { + font-family: "DejaVu Sans" !important; + font-size: 18px; + line-height: 1; +} + +input[type=checkbox]::before { + content: "\2610"; +} + +input[type=checkbox][checked]::before { + content: "\2611"; +} + +input[type=radio]::before { + content: "\25CB"; +} + +input[type=radio][checked]::before { + content: "\25C9"; +} + +textarea { + display: block; + height: 3em; + overflow: hidden; + font-family: monospace; + white-space: pre-wrap; + overflow-wrap: break-word; +} + +select { + position: relative !important; + overflow: hidden !important; +} + +select::after { + position: absolute; + right: 0; + top: 0; + height: 5em; + width: 1.4em; + text-align: center; + background: #CCC; + content: "\25BE"; +} + +select option { + display: none; +} + +select option[selected] { + display: inline; +} + +fieldset { + display: block; + margin: 0.6em 2px 2px; + padding: 0.75em; + border: 1pt groove #666; + position: relative; +} + +fieldset > legend { + position: absolute; + top: -0.6em; + left: 0.75em; + padding: 0 0.3em; + background: white; +} + +legend { + display: inline-block; +} + +/* leafs */ + +hr { + display: block; + height: 0; + border: 1px inset; + margin: 0.5em auto 0.5em auto; +} + +hr[size="1"] { + border-style: solid none none none; +} + +iframe { + border: 2px inset; +} + +noframes { + display: block; +} + +br { + display: -dompdf-br; +} + +img, img_generated { + display: -dompdf-image !important; +} + +dompdf_generated { + display: inline; +} + +/* hidden elements */ +area, base, basefont, head, meta, script, style, title, +noembed, param { + display: none; + -dompdf-keep: yes; +} diff --git a/dompdf/vendor/dompdf/dompdf/lib/res/sRGB2014.icc b/dompdf/vendor/dompdf/dompdf/lib/res/sRGB2014.icc new file mode 100644 index 0000000..49afbfe Binary files /dev/null and b/dompdf/vendor/dompdf/dompdf/lib/res/sRGB2014.icc differ diff --git a/dompdf/vendor/dompdf/dompdf/lib/res/sRGB2014.icc.LICENSE b/dompdf/vendor/dompdf/dompdf/lib/res/sRGB2014.icc.LICENSE new file mode 100644 index 0000000..0b5ff3b --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/lib/res/sRGB2014.icc.LICENSE @@ -0,0 +1,5 @@ +The copyright owner and terms of use of an ICC profile are normally identified in the Creator field in the profile header and in the Copyright tag. Where ICC is the copyright owner, the following license terms apply: + +"This profile is made available by the International Color Consortium, and may be copied, distributed, embedded, made, used, and sold without restriction. Altered versions of this profile shall have the original identification and copyright information removed and shall not be misrepresented as the original profile." + +(reference https://www.color.org/profiles2.xalter#license) \ No newline at end of file diff --git a/dompdf/vendor/dompdf/dompdf/phpunit.xml b/dompdf/vendor/dompdf/dompdf/phpunit.xml new file mode 100644 index 0000000..7233032 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/phpunit.xml @@ -0,0 +1,20 @@ + + + + + tests + + + diff --git a/dompdf/vendor/dompdf/dompdf/src/Adapter/CPDF.php b/dompdf/vendor/dompdf/dompdf/src/Adapter/CPDF.php new file mode 100644 index 0000000..103cfc9 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Adapter/CPDF.php @@ -0,0 +1,1005 @@ + [0.0, 0.0, 4767.87, 6740.79], + "2a0" => [0.0, 0.0, 3370.39, 4767.87], + "a0" => [0.0, 0.0, 2383.94, 3370.39], + "a1" => [0.0, 0.0, 1683.78, 2383.94], + "a2" => [0.0, 0.0, 1190.55, 1683.78], + "a3" => [0.0, 0.0, 841.89, 1190.55], + "a4" => [0.0, 0.0, 595.28, 841.89], + "a5" => [0.0, 0.0, 419.53, 595.28], + "a6" => [0.0, 0.0, 297.64, 419.53], + "a7" => [0.0, 0.0, 209.76, 297.64], + "a8" => [0.0, 0.0, 147.40, 209.76], + "a9" => [0.0, 0.0, 104.88, 147.40], + "a10" => [0.0, 0.0, 73.70, 104.88], + "b0" => [0.0, 0.0, 2834.65, 4008.19], + "b1" => [0.0, 0.0, 2004.09, 2834.65], + "b2" => [0.0, 0.0, 1417.32, 2004.09], + "b3" => [0.0, 0.0, 1000.63, 1417.32], + "b4" => [0.0, 0.0, 708.66, 1000.63], + "b5" => [0.0, 0.0, 498.90, 708.66], + "b6" => [0.0, 0.0, 354.33, 498.90], + "b7" => [0.0, 0.0, 249.45, 354.33], + "b8" => [0.0, 0.0, 175.75, 249.45], + "b9" => [0.0, 0.0, 124.72, 175.75], + "b10" => [0.0, 0.0, 87.87, 124.72], + "c0" => [0.0, 0.0, 2599.37, 3676.54], + "c1" => [0.0, 0.0, 1836.85, 2599.37], + "c2" => [0.0, 0.0, 1298.27, 1836.85], + "c3" => [0.0, 0.0, 918.43, 1298.27], + "c4" => [0.0, 0.0, 649.13, 918.43], + "c5" => [0.0, 0.0, 459.21, 649.13], + "c6" => [0.0, 0.0, 323.15, 459.21], + "c7" => [0.0, 0.0, 229.61, 323.15], + "c8" => [0.0, 0.0, 161.57, 229.61], + "c9" => [0.0, 0.0, 113.39, 161.57], + "c10" => [0.0, 0.0, 79.37, 113.39], + "ra0" => [0.0, 0.0, 2437.80, 3458.27], + "ra1" => [0.0, 0.0, 1729.13, 2437.80], + "ra2" => [0.0, 0.0, 1218.90, 1729.13], + "ra3" => [0.0, 0.0, 864.57, 1218.90], + "ra4" => [0.0, 0.0, 609.45, 864.57], + "sra0" => [0.0, 0.0, 2551.18, 3628.35], + "sra1" => [0.0, 0.0, 1814.17, 2551.18], + "sra2" => [0.0, 0.0, 1275.59, 1814.17], + "sra3" => [0.0, 0.0, 907.09, 1275.59], + "sra4" => [0.0, 0.0, 637.80, 907.09], + "letter" => [0.0, 0.0, 612.00, 792.00], + "half-letter" => [0.0, 0.0, 396.00, 612.00], + "legal" => [0.0, 0.0, 612.00, 1008.00], + "ledger" => [0.0, 0.0, 1224.00, 792.00], + "tabloid" => [0.0, 0.0, 792.00, 1224.00], + "executive" => [0.0, 0.0, 521.86, 756.00], + "folio" => [0.0, 0.0, 612.00, 936.00], + "commercial #10 envelope" => [0.0, 0.0, 684.00, 297.00], + "catalog #10 1/2 envelope" => [0.0, 0.0, 648.00, 864.00], + "8.5x11" => [0.0, 0.0, 612.00, 792.00], + "8.5x14" => [0.0, 0.0, 612.00, 1008.00], + "11x17" => [0.0, 0.0, 792.00, 1224.00], + ]; + + /** + * The Dompdf object + * + * @var Dompdf + */ + protected $_dompdf; + + /** + * Instance of Cpdf class + * + * @var \Dompdf\Cpdf + */ + protected $_pdf; + + /** + * PDF width, in points + * + * @var float + */ + protected $_width; + + /** + * PDF height, in points + * + * @var float + */ + protected $_height; + + /** + * Current page number + * + * @var int + */ + protected $_page_number; + + /** + * Total number of pages + * + * @var int + */ + protected $_page_count; + + /** + * Array of pages for accessing after rendering is initially complete + * + * @var array + */ + protected $_pages; + + /** + * Currently-applied opacity level (0 - 1) + * + * @var float + */ + protected $_current_opacity = 1; + + public function __construct($paper = "letter", string $orientation = "portrait", ?Dompdf $dompdf = null) + { + if (is_array($paper)) { + $size = array_map("floatval", $paper); + } else { + $paper = strtolower($paper); + $size = self::$PAPER_SIZES[$paper] ?? self::$PAPER_SIZES["letter"]; + } + + if (strtolower($orientation) === "landscape") { + [$size[2], $size[3]] = [$size[3], $size[2]]; + } + + if ($dompdf === null) { + $this->_dompdf = new Dompdf(); + } else { + $this->_dompdf = $dompdf; + } + + $this->_pdf = new \Dompdf\Cpdf( + $size, + true, + $this->_dompdf->getOptions()->getFontCache(), + $this->_dompdf->getOptions()->getTempDir() + ); + + $this->_pdf->addInfo("Producer", sprintf("%s + CPDF", $this->_dompdf->version)); + $time = substr_replace(date('YmdHisO'), '\'', -2, 0) . '\''; + $this->_pdf->addInfo("CreationDate", "D:$time"); + $this->_pdf->addInfo("ModDate", "D:$time"); + + if ($this->_dompdf->getOptions()->isPdfAEnabled()) { + $this->_pdf->enablePdfACompliance(); + } + + $this->_width = $size[2] - $size[0]; + $this->_height = $size[3] - $size[1]; + + $this->_page_number = $this->_page_count = 1; + + $this->_pages = [$this->_pdf->getFirstPageId()]; + } + + public function get_dompdf() + { + return $this->_dompdf; + } + + /** + * Returns the Cpdf instance + * + * @return \Dompdf\Cpdf + */ + public function get_cpdf() + { + return $this->_pdf; + } + + public function add_info(string $label, string $value): void + { + $this->_pdf->addInfo($label, $value); + } + + /** + * Opens a new 'object' + * + * While an object is open, all drawing actions are recorded in the object, + * as opposed to being drawn on the current page. Objects can be added + * later to a specific page or to several pages. + * + * The return value is an integer ID for the new object. + * + * @see CPDF::close_object() + * @see CPDF::add_object() + * + * @return int + */ + public function open_object() + { + $ret = $this->_pdf->openObject(); + $this->_pdf->saveState(); + return $ret; + } + + /** + * Reopens an existing 'object' + * + * @see CPDF::open_object() + * @param int $object the ID of a previously opened object + */ + public function reopen_object($object) + { + $this->_pdf->reopenObject($object); + $this->_pdf->saveState(); + } + + /** + * Closes the current 'object' + * + * @see CPDF::open_object() + */ + public function close_object() + { + $this->_pdf->restoreState(); + $this->_pdf->closeObject(); + } + + /** + * Adds a specified 'object' to the document + * + * $object int specifying an object created with {@link + * CPDF::open_object()}. $where can be one of: + * - 'add' add to current page only + * - 'all' add to every page from the current one onwards + * - 'odd' add to all odd numbered pages from now on + * - 'even' add to all even numbered pages from now on + * - 'next' add the object to the next page only + * - 'nextodd' add to all odd numbered pages from the next one + * - 'nexteven' add to all even numbered pages from the next one + * + * @see Cpdf::addObject() + * + * @param int $object + * @param string $where + */ + public function add_object($object, $where = 'all') + { + $this->_pdf->addObject($object, $where); + } + + /** + * Stops the specified 'object' from appearing in the document. + * + * The object will stop being displayed on the page following the current + * one. + * + * @param int $object + */ + public function stop_object($object) + { + $this->_pdf->stopObject($object); + } + + /** + * Serialize the pdf object's current state for retrieval later + */ + public function serialize_object($id) + { + return $this->_pdf->serializeObject($id); + } + + public function reopen_serialized_object($obj) + { + return $this->_pdf->restoreSerializedObject($obj); + } + + //........................................................................ + + public function get_width() + { + return $this->_width; + } + + public function get_height() + { + return $this->_height; + } + + public function get_page_number() + { + return $this->_page_number; + } + + public function get_page_count() + { + return $this->_page_count; + } + + /** + * Sets the current page number + * + * @param int $num + */ + public function set_page_number($num) + { + $this->_page_number = $num; + } + + public function set_page_count($count) + { + $this->_page_count = $count; + } + + /** + * Sets the stroke color + * + * See {@link Style::set_color()} for the format of the color array. + * + * @param array $color + */ + protected function _set_stroke_color($color) + { + $this->_pdf->setStrokeColor($color); + $alpha = isset($color["alpha"]) ? $color["alpha"] : 1; + $alpha *= $this->_current_opacity; + $this->_set_line_transparency("Normal", $alpha); + } + + /** + * Sets the fill colour + * + * See {@link Style::set_color()} for the format of the colour array. + * + * @param array $color + */ + protected function _set_fill_color($color) + { + $this->_pdf->setColor($color); + $alpha = isset($color["alpha"]) ? $color["alpha"] : 1; + $alpha *= $this->_current_opacity; + $this->_set_fill_transparency("Normal", $alpha); + } + + /** + * Sets line transparency + * @see Cpdf::setLineTransparency() + * + * Valid blend modes are (case-sensitive): + * + * Normal, Multiply, Screen, Overlay, Darken, Lighten, + * ColorDodge, ColorBurn, HardLight, SoftLight, Difference, + * Exclusion + * + * @param string $mode the blending mode to use + * @param float $opacity 0.0 fully transparent, 1.0 fully opaque + */ + protected function _set_line_transparency($mode, $opacity) + { + $this->_pdf->setLineTransparency($mode, $opacity); + } + + /** + * Sets fill transparency + * @see Cpdf::setFillTransparency() + * + * Valid blend modes are (case-sensitive): + * + * Normal, Multiply, Screen, Overlay, Darken, Lighten, + * ColorDogde, ColorBurn, HardLight, SoftLight, Difference, + * Exclusion + * + * @param string $mode the blending mode to use + * @param float $opacity 0.0 fully transparent, 1.0 fully opaque + */ + protected function _set_fill_transparency($mode, $opacity) + { + $this->_pdf->setFillTransparency($mode, $opacity); + } + + /** + * Sets the line style + * + * @see Cpdf::setLineStyle() + * + * @param float $width + * @param string $cap + * @param string $join + * @param array $dash + */ + protected function _set_line_style($width, $cap, $join, $dash) + { + $this->_pdf->setLineStyle($width, $cap, $join, $dash); + } + + public function set_opacity(float $opacity, string $mode = "Normal"): void + { + $this->_set_line_transparency($mode, $opacity); + $this->_set_fill_transparency($mode, $opacity); + $this->_current_opacity = $opacity; + } + + public function set_default_view($view, $options = []) + { + array_unshift($options, $view); + call_user_func_array([$this->_pdf, "openHere"], $options); + } + + /** + * Remaps y coords from 4th to 1st quadrant + * + * @param float $y + * @return float + */ + protected function y($y) + { + return $this->_height - $y; + } + + public function line($x1, $y1, $x2, $y2, $color, $width, $style = [], $cap = "butt") + { + $this->_set_stroke_color($color); + $this->_set_line_style($width, $cap, "", $style); + + $this->_pdf->line($x1, $this->y($y1), + $x2, $this->y($y2)); + $this->_set_line_transparency("Normal", $this->_current_opacity); + } + + public function arc($x, $y, $r1, $r2, $astart, $aend, $color, $width, $style = [], $cap = "butt") + { + $this->_set_stroke_color($color); + $this->_set_line_style($width, $cap, "", $style); + + $this->_pdf->ellipse($x, $this->y($y), $r1, $r2, 0, 8, $astart, $aend, false, false, true, false); + $this->_set_line_transparency("Normal", $this->_current_opacity); + } + + public function rectangle($x1, $y1, $w, $h, $color, $width, $style = [], $cap = "butt") + { + $this->_set_stroke_color($color); + $this->_set_line_style($width, $cap, "", $style); + $this->_pdf->rectangle($x1, $this->y($y1) - $h, $w, $h); + $this->_set_line_transparency("Normal", $this->_current_opacity); + } + + public function filled_rectangle($x1, $y1, $w, $h, $color) + { + $this->_set_fill_color($color); + $this->_pdf->filledRectangle($x1, $this->y($y1) - $h, $w, $h); + $this->_set_fill_transparency("Normal", $this->_current_opacity); + } + + public function clipping_rectangle($x1, $y1, $w, $h) + { + $this->_pdf->clippingRectangle($x1, $this->y($y1) - $h, $w, $h); + } + + public function clipping_roundrectangle($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL) + { + $this->_pdf->clippingRectangleRounded($x1, $this->y($y1) - $h, $w, $h, $rTL, $rTR, $rBR, $rBL); + } + + public function clipping_polygon(array $points): void + { + // Adjust y values + for ($i = 1; $i < count($points); $i += 2) { + $points[$i] = $this->y($points[$i]); + } + + $this->_pdf->clippingPolygon($points); + } + + public function clipping_end() + { + $this->_pdf->clippingEnd(); + } + + public function save() + { + $this->_pdf->saveState(); + } + + public function restore() + { + $this->_pdf->restoreState(); + } + + public function rotate($angle, $x, $y) + { + $this->_pdf->rotate($angle, $x, $y); + } + + public function skew($angle_x, $angle_y, $x, $y) + { + $this->_pdf->skew($angle_x, $angle_y, $x, $y); + } + + public function scale($s_x, $s_y, $x, $y) + { + $this->_pdf->scale($s_x, $s_y, $x, $y); + } + + public function translate($t_x, $t_y) + { + $this->_pdf->translate($t_x, $t_y); + } + + public function transform($a, $b, $c, $d, $e, $f) + { + $this->_pdf->transform([$a, $b, $c, $d, $e, $f]); + } + + public function polygon($points, $color, $width = null, $style = [], $fill = false) + { + $this->_set_fill_color($color); + $this->_set_stroke_color($color); + + if (!$fill && isset($width)) { + $this->_set_line_style($width, "square", "miter", $style); + } + + // Adjust y values + for ($i = 1; $i < count($points); $i += 2) { + $points[$i] = $this->y($points[$i]); + } + + $this->_pdf->polygon($points, $fill); + + $this->_set_fill_transparency("Normal", $this->_current_opacity); + $this->_set_line_transparency("Normal", $this->_current_opacity); + } + + public function circle($x, $y, $r, $color, $width = null, $style = [], $fill = false) + { + $this->_set_fill_color($color); + $this->_set_stroke_color($color); + + if (!$fill && isset($width)) { + $this->_set_line_style($width, "round", "round", $style); + } + + $this->_pdf->ellipse($x, $this->y($y), $r, 0, 0, 8, 0, 360, 1, $fill); + + $this->_set_fill_transparency("Normal", $this->_current_opacity); + $this->_set_line_transparency("Normal", $this->_current_opacity); + } + + /** + * Convert image to a PNG image + * + * @param string $image_url + * @param string $type + * + * @return string|null The url of the newly converted image + */ + protected function _convert_to_png($image_url, $type) + { + $filename = Cache::getTempImage($image_url); + + if ($filename !== null && file_exists($filename)) { + return $filename; + } + + $func_name = "imagecreatefrom$type"; + + set_error_handler([Helpers::class, "record_warnings"]); + + if (method_exists(Helpers::class, $func_name)) { + $func_name = [Helpers::class, $func_name]; + } elseif (!function_exists($func_name)) { + throw new Exception("Function $func_name() not found. Cannot convert $type image: $image_url. Please install the image PHP extension."); + } + + try { + $im = call_user_func($func_name, $image_url); + + if ($im) { + imageinterlace($im, false); + + $tmp_dir = $this->_dompdf->getOptions()->getTempDir(); + $tmp_name = @tempnam($tmp_dir, "{$type}_dompdf_img_"); + @unlink($tmp_name); + $filename = "$tmp_name.png"; + + imagepng($im, $filename); + if (PHP_MAJOR_VERSION < 8) { + imagedestroy($im); + } + } else { + $filename = null; + } + } finally { + restore_error_handler(); + } + + if ($filename !== null) { + Cache::addTempImage($image_url, $filename); + } + + return $filename; + } + + public function image($img, $x, $y, $w, $h, $resolution = "normal") + { + [$width, $height, $type] = Helpers::dompdf_getimagesize($img, $this->get_dompdf()->getHttpContext()); + + $debug_png = $this->_dompdf->getOptions()->getDebugPng(); + + if ($debug_png) { + print "[image:$img|$width|$height|$type]"; + } + + switch ($type) { + case "jpeg": + if ($debug_png) { + print '!!!jpg!!!'; + } + $this->_pdf->addJpegFromFile($img, $x, $this->y($y) - $h, $w, $h); + break; + + case "webp": + /** @noinspection PhpMissingBreakStatementInspection */ + case "gif": + /** @noinspection PhpMissingBreakStatementInspection */ + case "bmp": + if ($debug_png) print "!!!{$type}!!!"; + $img = $this->_convert_to_png($img, $type); + if ($img === null) { + if ($debug_png) print '!!!conversion to PDF failed!!!'; + $this->image(Cache::$broken_image, $x, $y, $w, $h, $resolution); + break; + } + + case "png": + if ($debug_png) print '!!!png!!!'; + + $this->_pdf->addPngFromFile($img, $x, $this->y($y) - $h, $w, $h); + break; + + case "svg": + if ($debug_png) print '!!!SVG!!!'; + + $this->_pdf->addSvgFromFile($img, $x, $this->y($y) - $h, $w, $h); + break; + + default: + if ($debug_png) print '!!!unknown!!!'; + } + } + + public function select($x, $y, $w, $h, $font, $size, $color = [0, 0, 0], $opts = []) + { + $pdf = $this->_pdf; + + $pdf->selectFont($font); + + if (!isset($pdf->acroFormId)) { + $pdf->addForm(); + } + + $ft = \Dompdf\Cpdf::ACROFORM_FIELD_CHOICE; + $ff = \Dompdf\Cpdf::ACROFORM_FIELD_CHOICE_COMBO; + + $id = $pdf->addFormField($ft, rand(), $x, $this->y($y) - $h, $x + $w, $this->y($y), $ff, $size, $color); + $pdf->setFormFieldOpt($id, $opts); + } + + public function textarea($x, $y, $w, $h, $font, $size, $color = [0, 0, 0]) + { + $pdf = $this->_pdf; + + $pdf->selectFont($font); + + if (!isset($pdf->acroFormId)) { + $pdf->addForm(); + } + + $ft = \Dompdf\Cpdf::ACROFORM_FIELD_TEXT; + $ff = \Dompdf\Cpdf::ACROFORM_FIELD_TEXT_MULTILINE; + + $pdf->addFormField($ft, rand(), $x, $this->y($y) - $h, $x + $w, $this->y($y), $ff, $size, $color); + } + + public function input($x, $y, $w, $h, $type, $font, $size, $color = [0, 0, 0]) + { + $pdf = $this->_pdf; + + $pdf->selectFont($font); + + if (!isset($pdf->acroFormId)) { + $pdf->addForm(); + } + + $ft = \Dompdf\Cpdf::ACROFORM_FIELD_TEXT; + $ff = 0; + + switch ($type) { + case 'text': + $ft = \Dompdf\Cpdf::ACROFORM_FIELD_TEXT; + break; + case 'password': + $ft = \Dompdf\Cpdf::ACROFORM_FIELD_TEXT; + $ff = \Dompdf\Cpdf::ACROFORM_FIELD_TEXT_PASSWORD; + break; + case 'submit': + $ft = \Dompdf\Cpdf::ACROFORM_FIELD_BUTTON; + break; + } + + $pdf->addFormField($ft, rand(), $x, $this->y($y) - $h, $x + $w, $this->y($y), $ff, $size, $color); + } + + public function text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_space = 0.0, $char_space = 0.0, $angle = 0.0) + { + $pdf = $this->_pdf; + + $this->_set_fill_color($color); + + $is_font_subsetting = $this->_dompdf->getOptions()->getIsFontSubsettingEnabled(); + $pdf->selectFont($font, '', true, $is_font_subsetting); + + $pdf->addText($x, $this->y($y) - $pdf->getFontHeight($size), $size, $text, $angle, $word_space, $char_space); + + $this->_set_fill_transparency("Normal", $this->_current_opacity); + } + + public function javascript($code) + { + $this->_pdf->addJavascript($code); + } + + //........................................................................ + + public function add_named_dest($anchorname) + { + $this->_pdf->addDestination($anchorname, "Fit"); + } + + public function add_link($url, $x, $y, $width, $height) + { + $y = $this->y($y) - $height; + + if (strpos($url, '#') === 0) { + // Local link + $name = substr($url, 1); + if ($name) { + $this->_pdf->addInternalLink($name, $x, $y, $x + $width, $y + $height); + } + } else { + $this->_pdf->addLink($url, $x, $y, $x + $width, $y + $height); + } + } + + public function font_supports_char(string $font, string $char): bool + { + if ($char === "") { + return true; + } + + $subsetting = $this->_dompdf->getOptions()->getIsFontSubsettingEnabled(); + $this->_pdf->selectFont($font, '', false, $subsetting); + if (!\array_key_exists($font, $this->_pdf->fonts)) { + return false; + } + $fontInfo = $this->_pdf->fonts[$font]; + $charCode = Helpers::uniord($char, "UTF-8"); + + if (!$fontInfo["isUnicode"]) { + // The core fonts use Windows ANSI encoding. The char map uses the + // position of the character in the encoding's mapping table in this + // case, not the Unicode code point, which is different for the + // characters outside ISO-8859-1 (positions 0x80-0x9F) + // https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT + $mapping = [ + 0x20AC => 0x80, + 0x201A => 0x82, + 0x0192 => 0x83, + 0x201E => 0x84, + 0x2026 => 0x85, + 0x2020 => 0x86, + 0x2021 => 0x87, + 0x02C6 => 0x88, + 0x2030 => 0x89, + 0x0160 => 0x8A, + 0x2039 => 0x8B, + 0x0152 => 0x8C, + 0x017D => 0x8E, + 0x2018 => 0x91, + 0x2019 => 0x92, + 0x201C => 0x93, + 0x201D => 0x94, + 0x2022 => 0x95, + 0x2013 => 0x96, + 0x2014 => 0x97, + 0x02DC => 0x98, + 0x2122 => 0x99, + 0x0161 => 0x9A, + 0x203A => 0x9B, + 0x0153 => 0x9C, + 0x017E => 0x9E, + 0x0178 => 0x9F + ]; + + $charCode = $mapping[$charCode] ?? $charCode; + + if ($charCode > 0xFF) { + return false; + } + } + + return \array_key_exists($charCode, $fontInfo["C"]); + } + + /** + * @throws FontNotFoundException + */ + public function get_text_width($text, $font, $size, $word_spacing = 0.0, $char_spacing = 0.0) + { + $this->_pdf->selectFont($font, '', true, $this->_dompdf->getOptions()->getIsFontSubsettingEnabled()); + return $this->_pdf->getTextWidth($size, $text, $word_spacing, $char_spacing); + } + + /** + * @throws FontNotFoundException + */ + public function get_font_height($font, $size) + { + $options = $this->_dompdf->getOptions(); + $this->_pdf->selectFont($font, '', true, $options->getIsFontSubsettingEnabled()); + + return $this->_pdf->getFontHeight($size) * $options->getFontHeightRatio(); + } + + /*function get_font_x_height($font, $size) { + $this->_pdf->selectFont($font); + $ratio = $this->_dompdf->getOptions()->getFontHeightRatio(); + return $this->_pdf->getFontXHeight($size) * $ratio; + }*/ + + /** + * @throws FontNotFoundException + */ + public function get_font_baseline($font, $size) + { + $ratio = $this->_dompdf->getOptions()->getFontHeightRatio(); + return $this->get_font_height($font, $size) / $ratio; + } + + /** + * Processes a callback or script on every page. + * + * The callback function receives the four parameters `int $pageNumber`, + * `int $pageCount`, `Canvas $canvas`, and `FontMetrics $fontMetrics`, in + * that order. If a script is passed as string, the variables `$PAGE_NUM`, + * `$PAGE_COUNT`, `$pdf`, and `$fontMetrics` are available instead. Passing + * a script as string is deprecated and will be removed in a future version. + * + * This function can be used to add page numbers to all pages after the + * first one, for example. + * + * @param callable|string $callback The callback function or PHP script to process on every page + */ + public function page_script($callback): void + { + if (is_string($callback)) { + $this->processPageScript(function ( + int $PAGE_NUM, + int $PAGE_COUNT, + self $pdf, + FontMetrics $fontMetrics + ) use ($callback) { + eval($callback); + }); + return; + } + + $this->processPageScript($callback); + } + + public function page_text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_space = 0.0, $char_space = 0.0, $angle = 0.0) + { + $this->processPageScript(function (int $pageNumber, int $pageCount) use ($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle) { + $text = str_replace( + ["{PAGE_NUM}", "{PAGE_COUNT}"], + [$pageNumber, $pageCount], + $text + ); + $this->text($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle); + }); + } + + public function page_line($x1, $y1, $x2, $y2, $color, $width, $style = []) + { + $this->processPageScript(function () use ($x1, $y1, $x2, $y2, $color, $width, $style) { + $this->line($x1, $y1, $x2, $y2, $color, $width, $style); + }); + } + + /** + * @return int + */ + public function new_page() + { + $this->_page_number++; + $this->_page_count++; + + $ret = $this->_pdf->newPage(); + $this->_pages[] = $ret; + return $ret; + } + + protected function processPageScript(callable $callback): void + { + $pageNumber = 1; + + foreach ($this->_pages as $pid) { + $this->reopen_object($pid); + + $fontMetrics = $this->_dompdf->getFontMetrics(); + $callback($pageNumber, $this->_page_count, $this, $fontMetrics); + + $this->close_object(); + $pageNumber++; + } + } + + public function stream($filename = "document.pdf", $options = []) + { + if (headers_sent()) { + die("Unable to stream pdf: headers already sent"); + } + + if (!isset($options["compress"])) $options["compress"] = true; + if (!isset($options["Attachment"])) $options["Attachment"] = true; + + $debug = !$options['compress']; + $tmp = ltrim($this->_pdf->output($debug)); + + header("Content-Type: application/pdf"); + header("Content-Length: " . mb_strlen($tmp, "8bit")); + + $filename = str_replace(["\n", "'"], "", basename($filename, ".pdf")) . ".pdf"; + $attachment = $options["Attachment"] ? "attachment" : "inline"; + header(Helpers::buildContentDispositionHeader($attachment, $filename)); + + echo $tmp; + flush(); + } + + public function output($options = []) + { + if (!isset($options["compress"])) $options["compress"] = true; + + $debug = !$options['compress']; + + return $this->_pdf->output($debug); + } + + /** + * Returns logging messages generated by the Cpdf class + * + * @return string + */ + public function get_messages() + { + return $this->_pdf->messages; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Adapter/GD.php b/dompdf/vendor/dompdf/dompdf/src/Adapter/GD.php new file mode 100644 index 0000000..8bd9393 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Adapter/GD.php @@ -0,0 +1,1061 @@ +_dompdf = new Dompdf(); + } else { + $this->_dompdf = $dompdf; + } + + $this->dpi = $this->get_dompdf()->getOptions()->getDpi(); + + if ($aa_factor < 1) { + $aa_factor = 1; + } + + $this->_aa_factor = $aa_factor; + + $size[2] *= $aa_factor; + $size[3] *= $aa_factor; + + $this->_width = $size[2] - $size[0]; + $this->_height = $size[3] - $size[1]; + + $this->_actual_width = $this->_upscale($this->_width); + $this->_actual_height = $this->_upscale($this->_height); + + $this->_page_number = $this->_page_count = 0; + + if (is_null($bg_color) || !is_array($bg_color)) { + // Pure white bg + $bg_color = [1, 1, 1, 0]; + } + + $this->_bg_color_array = $bg_color; + + $this->new_page(); + } + + public function get_dompdf() + { + return $this->_dompdf; + } + + /** + * Return the GD image resource + * + * @return \GdImage|resource + */ + public function get_image() + { + return $this->_img; + } + + /** + * Return the image's width in pixels + * + * @return int + */ + public function get_width() + { + return round($this->_width / $this->_aa_factor); + } + + /** + * Return the image's height in pixels + * + * @return int + */ + public function get_height() + { + return round($this->_height / $this->_aa_factor); + } + + public function get_page_number() + { + return $this->_page_number; + } + + public function get_page_count() + { + return $this->_page_count; + } + + /** + * Sets the current page number + * + * @param int $num + */ + public function set_page_number($num) + { + $this->_page_number = $num; + } + + public function set_page_count($count) + { + $this->_page_count = $count; + } + + public function set_opacity(float $opacity, string $mode = "Normal"): void + { + // FIXME + } + + /** + * Allocate a new color. Allocate with GD as needed and store + * previously allocated colors in $this->_colors. + * + * @param array $color The new current color + * @return int The allocated color + */ + protected function _allocate_color($color) + { + $a = isset($color["alpha"]) ? $color["alpha"] : 1; + + if (isset($color["c"])) { + $color = Helpers::cmyk_to_rgb($color); + } + + list($r, $g, $b) = $color; + + $r = round($r * 255); + $g = round($g * 255); + $b = round($b * 255); + $a = round(127 - ($a * 127)); + + // Clip values + $r = $r > 255 ? 255 : $r; + $g = $g > 255 ? 255 : $g; + $b = $b > 255 ? 255 : $b; + $a = $a > 127 ? 127 : $a; + + $r = $r < 0 ? 0 : $r; + $g = $g < 0 ? 0 : $g; + $b = $b < 0 ? 0 : $b; + $a = $a < 0 ? 0 : $a; + + $key = sprintf("#%02X%02X%02X%02X", $r, $g, $b, $a); + + if (isset($this->_colors[$key])) { + return $this->_colors[$key]; + } + + if ($a != 0) { + $this->_colors[$key] = imagecolorallocatealpha($this->get_image(), $r, $g, $b, $a); + } else { + $this->_colors[$key] = imagecolorallocate($this->get_image(), $r, $g, $b); + } + + return $this->_colors[$key]; + } + + /** + * Scales value up to the current canvas DPI from 72 DPI + * + * @param float $length + * @return int + */ + protected function _upscale($length) + { + return round(($length * $this->dpi) / 72 * $this->_aa_factor); + } + + /** + * Scales value down from the current canvas DPI to 72 DPI + * + * @param float $length + * @return float + */ + protected function _downscale($length) + { + return round(($length / $this->dpi * 72) / $this->_aa_factor); + } + + protected function convertStyle(array $style, int $color, int $width): array + { + $gdStyle = []; + + if (count($style) === 1) { + $style[] = $style[0]; + } + + foreach ($style as $index => $s) { + $d = $this->_upscale($s); + + for ($i = 0; $i < $d; $i++) { + for ($j = 0; $j < $width; $j++) { + $gdStyle[] = $index % 2 === 0 + ? $color + : IMG_COLOR_TRANSPARENT; + } + } + } + + return $gdStyle; + } + + public function line($x1, $y1, $x2, $y2, $color, $width, $style = [], $cap = "butt") + { + // Account for the fact that round and square caps are expected to + // extend outwards + if ($cap === "round" || $cap === "square") { + // Shift line by half width + $w = $width / 2; + $a = $x2 - $x1; + $b = $y2 - $y1; + $c = sqrt($a ** 2 + $b ** 2); + $dx = $a * $w / $c; + $dy = $b * $w / $c; + + $x1 -= $dx; + $x2 -= $dx; + $y1 -= $dy; + $y2 -= $dy; + + // Adapt dash pattern + if (is_array($style)) { + foreach ($style as $index => &$s) { + $s = $index % 2 === 0 ? $s + $width : $s - $width; + } + } + } + + // Scale by the AA factor and DPI + $x1 = $this->_upscale($x1); + $y1 = $this->_upscale($y1); + $x2 = $this->_upscale($x2); + $y2 = $this->_upscale($y2); + $width = $this->_upscale($width); + + $c = $this->_allocate_color($color); + + // Convert the style array if required + if (is_array($style) && count($style) > 0) { + $gd_style = $this->convertStyle($style, $c, $width); + + if (!empty($gd_style)) { + imagesetstyle($this->get_image(), $gd_style); + $c = IMG_COLOR_STYLED; + } + } + + imagesetthickness($this->get_image(), $width); + + imageline($this->get_image(), $x1, $y1, $x2, $y2, $c); + } + + public function arc($x, $y, $r1, $r2, $astart, $aend, $color, $width, $style = [], $cap = "butt") + { + // Account for the fact that round and square caps are expected to + // extend outwards + if ($cap === "round" || $cap === "square") { + // Adapt dash pattern + if (is_array($style)) { + foreach ($style as $index => &$s) { + $s = $index % 2 === 0 ? $s + $width : $s - $width; + } + } + } + + // Scale by the AA factor and DPI + $x = $this->_upscale($x); + $y = $this->_upscale($y); + $w = $this->_upscale($r1 * 2); + $h = $this->_upscale($r2 * 2); + $width = $this->_upscale($width); + + // Adapt angles as imagearc counts clockwise + $start = 360 - $aend; + $end = 360 - $astart; + + $c = $this->_allocate_color($color); + + // Convert the style array if required + if (is_array($style) && count($style) > 0) { + $gd_style = $this->convertStyle($style, $c, $width); + + if (!empty($gd_style)) { + imagesetstyle($this->get_image(), $gd_style); + $c = IMG_COLOR_STYLED; + } + } + + imagesetthickness($this->get_image(), $width); + + imagearc($this->get_image(), $x, $y, $w, $h, $start, $end, $c); + } + + public function rectangle($x1, $y1, $w, $h, $color, $width, $style = [], $cap = "butt") + { + // Account for the fact that round and square caps are expected to + // extend outwards + if ($cap === "round" || $cap === "square") { + // Adapt dash pattern + if (is_array($style)) { + foreach ($style as $index => &$s) { + $s = $index % 2 === 0 ? $s + $width : $s - $width; + } + } + } + + // Scale by the AA factor and DPI + $x1 = $this->_upscale($x1); + $y1 = $this->_upscale($y1); + $w = $this->_upscale($w); + $h = $this->_upscale($h); + $width = $this->_upscale($width); + + $c = $this->_allocate_color($color); + + // Convert the style array if required + if (is_array($style) && count($style) > 0) { + $gd_style = $this->convertStyle($style, $c, $width); + + if (!empty($gd_style)) { + imagesetstyle($this->get_image(), $gd_style); + $c = IMG_COLOR_STYLED; + } + } + + imagesetthickness($this->get_image(), $width); + + if ($c === IMG_COLOR_STYLED) { + $points = [ + $x1, $y1, + $x1 + $w, $y1, + $x1 + $w, $y1 + $h, + $x1, $y1 + $h + ]; + if (version_compare(PHP_VERSION, "8.1.0", "<")) { + imagepolygon($this->get_image(), $points, count($points)/2, $c); + } else { + imagepolygon($this->get_image(), $points, $c); + } + } else { + imagerectangle($this->get_image(), $x1, $y1, $x1 + $w, $y1 + $h, $c); + } + } + + public function filled_rectangle($x1, $y1, $w, $h, $color) + { + // Scale by the AA factor and DPI + $x1 = $this->_upscale($x1); + $y1 = $this->_upscale($y1); + $w = $this->_upscale($w); + $h = $this->_upscale($h); + + $c = $this->_allocate_color($color); + + imagefilledrectangle($this->get_image(), $x1, $y1, $x1 + $w, $y1 + $h, $c); + } + + public function clipping_rectangle($x1, $y1, $w, $h) + { + // @todo + } + + public function clipping_roundrectangle($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL) + { + // @todo + } + + public function clipping_polygon(array $points): void + { + // @todo + } + + public function clipping_end() + { + // @todo + } + + public function save() + { + $this->get_dompdf()->getOptions()->setDpi(72); + } + + public function restore() + { + $this->get_dompdf()->getOptions()->setDpi($this->dpi); + } + + public function rotate($angle, $x, $y) + { + // @todo + } + + public function skew($angle_x, $angle_y, $x, $y) + { + // @todo + } + + public function scale($s_x, $s_y, $x, $y) + { + // @todo + } + + public function translate($t_x, $t_y) + { + // @todo + } + + public function transform($a, $b, $c, $d, $e, $f) + { + // @todo + } + + public function polygon($points, $color, $width = null, $style = [], $fill = false) + { + // Scale each point by the AA factor and DPI + foreach (array_keys($points) as $i) { + $points[$i] = $this->_upscale($points[$i]); + } + + $width = isset($width) ? $this->_upscale($width) : null; + + $c = $this->_allocate_color($color); + + // Convert the style array if required + if (is_array($style) && count($style) > 0 && isset($width) && !$fill) { + $gd_style = $this->convertStyle($style, $c, $width); + + if (!empty($gd_style)) { + imagesetstyle($this->get_image(), $gd_style); + $c = IMG_COLOR_STYLED; + } + } + + imagesetthickness($this->get_image(), isset($width) ? $width : 0); + + if ($fill) { + if (version_compare(PHP_VERSION, "8.1.0", "<")) { + imagefilledpolygon($this->get_image(), $points, count($points)/2, $c); + } else { + imagefilledpolygon($this->get_image(), $points, $c); + } + } else { + if (version_compare(PHP_VERSION, "8.1.0", "<")) { + imagepolygon($this->get_image(), $points, count($points)/2, $c); + } else { + imagepolygon($this->get_image(), $points, $c); + } + } + } + + public function circle($x, $y, $r, $color, $width = null, $style = [], $fill = false) + { + // Scale by the AA factor and DPI + $x = $this->_upscale($x); + $y = $this->_upscale($y); + $d = $this->_upscale(2 * $r); + $width = isset($width) ? $this->_upscale($width) : null; + + $c = $this->_allocate_color($color); + + // Convert the style array if required + if (is_array($style) && count($style) > 0 && isset($width) && !$fill) { + $gd_style = $this->convertStyle($style, $c, $width); + + if (!empty($gd_style)) { + imagesetstyle($this->get_image(), $gd_style); + $c = IMG_COLOR_STYLED; + } + } + + imagesetthickness($this->get_image(), isset($width) ? $width : 0); + + if ($fill) { + imagefilledellipse($this->get_image(), $x, $y, $d, $d, $c); + } else { + imageellipse($this->get_image(), $x, $y, $d, $d, $c); + } + } + + /** + * @throws \Exception + */ + public function image($img, $x, $y, $w, $h, $resolution = "normal") + { + $img_type = Cache::detect_type($img, $this->get_dompdf()->getHttpContext()); + + if (!$img_type) { + return; + } + + $func_name = "imagecreatefrom$img_type"; + if (method_exists(Helpers::class, $func_name)) { + $func_name = [Helpers::class, $func_name]; + } elseif (!function_exists($func_name)) { + throw new \Exception("Function $func_name() not found. Cannot convert $img_type image: $img. Please install the image PHP extension."); + } + $src = @call_user_func($func_name, $img); + + if (!$src) { + return; // Probably should add to $_dompdf_errors or whatever here + } + + // Scale by the AA factor and DPI + $x = $this->_upscale($x); + $y = $this->_upscale($y); + + $w = $this->_upscale($w); + $h = $this->_upscale($h); + + $img_w = imagesx($src); + $img_h = imagesy($src); + + imagecopyresampled($this->get_image(), $src, $x, $y, 0, 0, $w, $h, $img_w, $img_h); + } + + public function text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_spacing = 0.0, $char_spacing = 0.0, $angle = 0.0) + { + // Scale by the AA factor and DPI + $x = $this->_upscale($x); + $y = $this->_upscale($y); + $size = $this->_upscale($size) * self::FONT_SCALE; + + $h = round($this->get_font_height_actual($font, $size)); + $c = $this->_allocate_color($color); + + // imagettftext() converts numeric entities to their respective + // character. Preserve any originally double encoded entities to be + // represented as is. + // eg: &#160; will render   rather than its character. + $text = preg_replace('/&(#(?:x[a-fA-F0-9]+|[0-9]+);)/', '&\1', $text); + + $text = mb_encode_numericentity($text, [0x0080, 0xff, 0, 0xff], 'UTF-8'); + + $font = $this->get_ttf_file($font); + + // FIXME: word spacing + imagettftext($this->get_image(), $size, $angle, $x, $y + $h, $c, $font, $text); + } + + public function javascript($code) + { + // Not implemented + } + + public function add_named_dest($anchorname) + { + // Not implemented + } + + public function add_link($url, $x, $y, $width, $height) + { + // Not implemented + } + + public function add_info(string $label, string $value): void + { + // N/A + } + + public function set_default_view($view, $options = []) + { + // N/A + } + + private function getCharMap(string $font) + { + static $unicodeCharMapTables = []; + + if (isset($unicodeCharMapTables[$font])) { + return $unicodeCharMapTables[$font]; + } + + $metrics_name = "$font.ufm"; + if (!file_exists($metrics_name)) { + $metrics_name = "$font.afm"; + } + if (!file_exists($metrics_name)) { + return $unicodeCharMapTables[$font] = []; + } + + $cache_name = "$metrics_name.json"; + if (file_exists($cache_name)) { + $cached_font_info = json_decode(file_get_contents($cache_name), true); + $char_map = $cached_font_info['C']; + return $unicodeCharMapTables[$font] = $char_map; + } + + $char_map = []; + $file = file("$metrics_name"); + foreach ($file as $rowA) { + $row = trim($rowA); + $pos = strpos($row, ' '); + + if ($pos) { + // then there must be some keyword + $key = substr($row, 0, $pos); + switch ($key) { + case 'C': // Found in AFM files + $bits = explode(';', trim($row)); + $dtmp = ['C' => null, 'N' => null, 'WX' => null, 'B' => []]; + + foreach ($bits as $bit) { + $bits2 = explode(' ', trim($bit)); + if (mb_strlen($bits2[0], '8bit') == 0) { + continue; + } + + if (count($bits2) > 2) { + $dtmp[$bits2[0]] = []; + for ($i = 1; $i < count($bits2); $i++) { + $dtmp[$bits2[0]][] = $bits2[$i]; + } + } else { + if (count($bits2) == 2) { + $dtmp[$bits2[0]] = $bits2[1]; + } + } + } + + $c = (int)$dtmp['C']; + $n = $dtmp['N']; + $width = floatval($dtmp['WX']); + + if ($c >= 0) { + $char_map[$c] = $width; + } elseif (isset($n)) { + $char_map[$n] = $width; + } + break; + + // U 827 ; WX 0 ; N squaresubnosp ; G 675 ; + case 'U': // Found in UFM files + $bits = explode(';', trim($row)); + $dtmp = ['G' => null, 'N' => null, 'U' => null, 'WX' => null]; + + foreach ($bits as $bit) { + $bits2 = explode(' ', trim($bit)); + if (mb_strlen($bits2[0], '8bit') === 0) { + continue; + } + + if (count($bits2) > 2) { + $dtmp[$bits2[0]] = []; + for ($i = 1; $i < count($bits2); $i++) { + $dtmp[$bits2[0]][] = $bits2[$i]; + } + } else { + if (count($bits2) == 2) { + $dtmp[$bits2[0]] = $bits2[1]; + } + } + } + + $c = (int)$dtmp['U']; + $n = $dtmp['N']; + $glyph = $dtmp['G']; + $width = floatval($dtmp['WX']); + + if ($c >= 0) { + $char_map[$c] = $width; + } elseif (isset($n)) { + $char_map[$n] = $width; + } + + break; + } + } + } + + return $unicodeCharMapTables[$font] = $char_map; + } + + public function font_supports_char(string $font, string $char): bool + { + if ($char === "") { + return true; + } + + $font = $this->get_ttf_file($font); + $charMap = $this->getCharMap($font); + $charCode = Helpers::uniord($char, "UTF-8"); + + return \array_key_exists($charCode, $charMap); + } + + public function get_text_width($text, $font, $size, $word_spacing = 0.0, $char_spacing = 0.0) + { + $font = $this->get_ttf_file($font); + $size = $this->_upscale($size) * self::FONT_SCALE; + + // imagettfbbox() converts numeric entities to their respective + // character. Preserve any originally double encoded entities to be + // represented as is. + // eg: &#160; will render   rather than its character. + $text = preg_replace('/&(#(?:x[a-fA-F0-9]+|[0-9]+);)/', '&\1', $text); + + $text = mb_encode_numericentity($text, [0x0080, 0xffff, 0, 0xffff], 'UTF-8'); + + // FIXME: word spacing + list($x1, , $x2) = imagettfbbox($size, 0, $font, $text); + + // Add additional 1pt to prevent text overflow issues + return $this->_downscale($x2 - $x1) + 1; + } + + /** + * @param string|null $font + * @return string + */ + public function get_ttf_file($font) + { + if ($font === null) { + $font = ""; + } + + if ( stripos($font, ".ttf") === false ) { + $font .= ".ttf"; + } + + if (!file_exists($font)) { + $font_metrics = $this->_dompdf->getFontMetrics(); + $font = $font_metrics->getFont($this->_dompdf->getOptions()->getDefaultFont()) . ".ttf"; + if (!file_exists($font)) { + if (strpos($font, "mono")) { + $font = $font_metrics->getFont("DejaVu Mono") . ".ttf"; + } elseif (strpos($font, "sans") !== false) { + $font = $font_metrics->getFont("DejaVu Sans") . ".ttf"; + } elseif (strpos($font, "serif")) { + $font = $font_metrics->getFont("DejaVu Serif") . ".ttf"; + } else { + $font = $font_metrics->getFont("DejaVu Sans") . ".ttf"; + } + } + } + + return $font; + } + + public function get_font_height($font, $size) + { + $size = $this->_upscale($size) * self::FONT_SCALE; + + $height = $this->get_font_height_actual($font, $size); + + return $this->_downscale($height); + } + + /** + * @param string $font + * @param float $size + * + * @return float + */ + protected function get_font_height_actual($font, $size) + { + $font = $this->get_ttf_file($font); + $ratio = $this->_dompdf->getOptions()->getFontHeightRatio(); + + // FIXME: word spacing + list(, $y2, , , , $y1) = imagettfbbox($size, 0, $font, "MXjpqytfhl"); // Test string with ascenders, descenders and caps + return ($y2 - $y1) * $ratio; + } + + public function get_font_baseline($font, $size) + { + $ratio = $this->_dompdf->getOptions()->getFontHeightRatio(); + return $this->get_font_height($font, $size) / $ratio; + } + + public function new_page() + { + $this->_page_number++; + $this->_page_count++; + + $this->_img = imagecreatetruecolor($this->_actual_width, $this->_actual_height); + + $this->_bg_color = $this->_allocate_color($this->_bg_color_array); + imagealphablending($this->_img, true); + imagesavealpha($this->_img, true); + imagefill($this->_img, 0, 0, $this->_bg_color); + + $this->_imgs[] = $this->_img; + } + + public function open_object() + { + // N/A + } + + public function close_object() + { + // N/A + } + + public function add_object() + { + // N/A + } + + public function page_script($callback): void + { + // N/A + } + + public function page_text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_space = 0.0, $char_space = 0.0, $angle = 0.0) + { + // N/A + } + + public function page_line($x1, $y1, $x2, $y2, $color, $width, $style = []) + { + // N/A + } + + /** + * Streams the image to the client. + * + * @param string $filename The filename to present to the client. + * @param array $options Associative array: 'type' => jpeg|jpg|png; 'quality' => 0 - 100 (JPEG only); + * 'page' => Number of the page to output (defaults to the first); 'Attachment': 1 or 0 (default 1). + */ + public function stream($filename, $options = []) + { + if (headers_sent()) { + die("Unable to stream image: headers already sent"); + } + + if (!isset($options["type"])) $options["type"] = "png"; + if (!isset($options["Attachment"])) $options["Attachment"] = true; + $type = strtolower($options["type"]); + + switch ($type) { + case "jpg": + case "jpeg": + $contentType = "image/jpeg"; + $extension = ".jpg"; + break; + case "png": + default: + $contentType = "image/png"; + $extension = ".png"; + break; + } + + header("Content-Type: $contentType"); + + $filename = str_replace(["\n", "'"], "", basename($filename, ".$type")) . $extension; + $attachment = $options["Attachment"] ? "attachment" : "inline"; + header(Helpers::buildContentDispositionHeader($attachment, $filename)); + + $this->_output($options); + flush(); + } + + /** + * Returns the image as a string. + * + * @param array $options Associative array: 'type' => jpeg|jpg|png; 'quality' => 0 - 100 (JPEG only); + * 'page' => Number of the page to output (defaults to the first). + * @return string + */ + public function output($options = []) + { + ob_start(); + + $this->_output($options); + + return ob_get_clean(); + } + + /** + * Outputs the image stream directly. + * + * @param array $options Associative array: 'type' => jpeg|jpg|png; 'quality' => 0 - 100 (JPEG only); + * 'page' => Number of the page to output (defaults to the first). + */ + protected function _output($options = []) + { + if (!isset($options["type"])) $options["type"] = "png"; + if (!isset($options["page"])) $options["page"] = 1; + $type = strtolower($options["type"]); + + if (isset($this->_imgs[$options["page"] - 1])) { + $img = $this->_imgs[$options["page"] - 1]; + } else { + $img = $this->_imgs[0]; + } + + // Perform any antialiasing + if ($this->_aa_factor != 1) { + $dst_w = round($this->_actual_width / $this->_aa_factor); + $dst_h = round($this->_actual_height / $this->_aa_factor); + $dst = imagecreatetruecolor($dst_w, $dst_h); + imagecopyresampled($dst, $img, 0, 0, 0, 0, + $dst_w, $dst_h, + $this->_actual_width, $this->_actual_height); + } else { + $dst = $img; + } + + switch ($type) { + case "jpg": + case "jpeg": + if (!isset($options["quality"])) { + $options["quality"] = 75; + } + + imagejpeg($dst, null, $options["quality"]); + break; + case "png": + default: + imagepng($dst); + break; + } + + if ($this->_aa_factor != 1 && PHP_MAJOR_VERSION < 8) { + imagedestroy($dst); + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Adapter/PDFLib.php b/dompdf/vendor/dompdf/dompdf/src/Adapter/PDFLib.php new file mode 100644 index 0000000..ca92a79 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Adapter/PDFLib.php @@ -0,0 +1,1557 @@ + "Courier", + "courier-bold" => "Courier-Bold", + "courier-oblique" => "Courier-Oblique", + "courier-boldoblique" => "Courier-BoldOblique", + "helvetica" => "Helvetica", + "helvetica-bold" => "Helvetica-Bold", + "helvetica-oblique" => "Helvetica-Oblique", + "helvetica-boldoblique" => "Helvetica-BoldOblique", + "times" => "Times-Roman", + "times-roman" => "Times-Roman", + "times-bold" => "Times-Bold", + "times-italic" => "Times-Italic", + "times-bolditalic" => "Times-BoldItalic", + "symbol" => "Symbol", + "zapfdinbats" => "ZapfDingbats", + "zapfdingbats" => "ZapfDingbats", + ]; + + /** + * @var \Dompdf\Dompdf + */ + protected $_dompdf; + + /** + * Instance of PDFLib class + * + * @var \PDFLib + */ + protected $_pdf; + + /** + * Name of temporary file used for PDFs created on disk + * + * @var string + */ + protected $_file; + + /** + * PDF width, in points + * + * @var float + */ + protected $_width; + + /** + * PDF height, in points + * + * @var float + */ + protected $_height; + + /** + * Last fill color used + * + * @var array + */ + protected $_last_fill_color; + + /** + * Last stroke color used + * + * @var array + */ + protected $_last_stroke_color; + + /** + * The current opacity level + * + * @var float|null + */ + protected $_current_opacity; + + /** + * Cache of image handles + * + * @var array + */ + protected $_imgs; + + /** + * Cache of font handles + * + * @var array + */ + protected $_fonts; + + /** + * Cache of fontFile checks + * + * @var array + */ + protected $_fontsFiles; + + /** + * List of objects (templates) to add to multiple pages + * + * @var array + */ + protected $_objs; + + /** + * List of gstate objects created for this PDF (for reuse) + * + * @var array + */ + protected $_gstates = []; + + /** + * Current page number + * + * @var int + */ + protected $_page_number; + + /** + * Total number of pages + * + * @var int + */ + protected $_page_count; + + /** + * Array of pages for accessing after rendering is initially complete + * + * @var array + */ + protected $_pages; + + public function __construct($paper = "letter", string $orientation = "portrait", ?Dompdf $dompdf = null) + { + if (is_array($paper)) { + $size = array_map("floatval", $paper); + } else { + $paper = strtolower($paper); + $size = self::$PAPER_SIZES[$paper] ?? self::$PAPER_SIZES["letter"]; + } + + if (strtolower($orientation) === "landscape") { + [$size[2], $size[3]] = [$size[3], $size[2]]; + } + + $this->_width = $size[2] - $size[0]; + $this->_height = $size[3] - $size[1]; + + if ($dompdf === null) { + $this->_dompdf = new Dompdf(); + } else { + $this->_dompdf = $dompdf; + } + $options = $dompdf->getOptions(); + + $this->_pdf = new \PDFLib(); + + $license = $options->getPdflibLicense(); + if (strlen($license) > 0) { + $this->setPDFLibParameter("license", $license); + } + + if ($this->getPDFLibMajorVersion() < 10) { + $this->setPDFLibParameter("textformat", "utf8"); + } + if ($this->getPDFLibMajorVersion() >= 7) { + $this->setPDFLibParameter("errorpolicy", "return"); + // $this->_pdf->set_option('logging={filename=' . \APP_PATH . '/logs/pdflib.log classes={api=1 warning=2}}'); + // $this->_pdf->set_option('errorpolicy=exception'); + } else { + $this->setPDFLibParameter("fontwarning", "false"); + } + + $searchPath = [$options->getFontDir(), $options->getRootDir() . "/lib/fonts"]; + if (empty($searchPath) === false) { + $this->_pdf->set_option('searchpath={{' . implode("} {", $searchPath) . '}}'); + } + + // fetch PDFLib version information for the producer field + $this->_pdf->set_info("Producer Addendum", sprintf("%s + PDFLib %s", $dompdf->version, $this->getPDFLibMajorVersion())); + + // Silence pedantic warnings about missing TZ settings + $tz = @date_default_timezone_get(); + date_default_timezone_set("UTC"); + $this->_pdf->set_info("Date", date("Y-m-d")); + date_default_timezone_set($tz); + + $doc_options = ""; + + if ($options->isPdfAEnabled()) { + $doc_options = "pdfa=PDF/A-3b autoxmp"; + } + + if (self::$IN_MEMORY) { + $this->_pdf->begin_document("", $doc_options); + } else { + $tmp_dir = $options->getTempDir(); + $tmp_name = @tempnam($tmp_dir, "libdompdf_pdf_"); + @unlink($tmp_name); + $this->_file = "$tmp_name.pdf"; + $this->_pdf->begin_document($this->_file, $doc_options); + } + + if ($options->isPdfAEnabled()) { + $iccProfilePath = $options->getRootDir() . '/lib/res/sRGB2014.icc'; + $this->_pdf->load_iccprofile($iccProfilePath, "usage=outputintent"); + } + + $this->_pdf->begin_page_ext($this->_width, $this->_height, ""); + + $this->_page_number = $this->_page_count = 1; + + $this->_imgs = []; + $this->_fonts = []; + $this->_objs = []; + } + + function get_dompdf() + { + return $this->_dompdf; + } + + /** + * Close the pdf + */ + protected function _close() + { + $this->_place_objects(); + + // Close all pages + $this->_pdf->suspend_page(""); + for ($p = 1; $p <= $this->_page_count; $p++) { + $this->_pdf->resume_page("pagenumber=$p"); + $this->_pdf->end_page_ext(""); + } + + $this->_pdf->end_document(""); + } + + + /** + * Returns the PDFLib instance + * + * @return PDFLib + */ + public function get_pdflib() + { + return $this->_pdf; + } + + public function add_info(string $label, string $value): void + { + $this->_pdf->set_info($label, $value); + } + + /** + * Opens a new 'object' (template in PDFLib-speak) + * + * While an object is open, all drawing actions are recorded to the + * object instead of being drawn on the current page. Objects can + * be added later to a specific page or to several pages. + * + * The return value is an integer ID for the new object. + * + * @see PDFLib::close_object() + * @see PDFLib::add_object() + * + * @return int + */ + public function open_object() + { + $this->_pdf->suspend_page(""); + if ($this->getPDFLibMajorVersion() >= 7) { + $ret = $this->_pdf->begin_template_ext($this->_width, $this->_height, ""); + } else { + $ret = $this->_pdf->begin_template($this->_width, $this->_height); + } + $this->_pdf->save(); + $this->_objs[$ret] = ["start_page" => $this->_page_number]; + + return $ret; + } + + /** + * Reopen an existing object (NOT IMPLEMENTED) + * PDFLib does not seem to support reopening templates. + * + * @param int $object the ID of a previously opened object + * + * @throws Exception + */ + public function reopen_object($object) + { + throw new Exception("PDFLib does not support reopening objects."); + } + + /** + * Close the current template + * + * @see PDFLib::open_object() + */ + public function close_object() + { + $this->_pdf->restore(); + if ($this->getPDFLibMajorVersion() >= 7) { + $this->_pdf->end_template_ext($this->_width, $this->_height); + } else { + $this->_pdf->end_template(); + } + $this->_pdf->resume_page("pagenumber=" . $this->_page_number); + } + + /** + * Adds the specified object to the document + * + * $where can be one of: + * - 'add' add to current page only + * - 'all' add to every page from the current one onwards + * - 'odd' add to all odd numbered pages from now on + * - 'even' add to all even numbered pages from now on + * - 'next' add the object to the next page only + * - 'nextodd' add to all odd numbered pages from the next one + * - 'nexteven' add to all even numbered pages from the next one + * + * @param int $object the object handle returned by open_object() + * @param string $where + */ + public function add_object($object, $where = 'all') + { + + if (mb_strpos($where, "next") !== false) { + $this->_objs[$object]["start_page"]++; + $where = str_replace("next", "", $where); + if ($where == "") { + $where = "add"; + } + } + + $this->_objs[$object]["where"] = $where; + } + + /** + * Stops the specified template from appearing in the document. + * + * The object will stop being displayed on the page following the + * current one. + * + * @param int $object + */ + public function stop_object($object) + { + + if (!isset($this->_objs[$object])) { + return; + } + + $start = $this->_objs[$object]["start_page"]; + $where = $this->_objs[$object]["where"]; + + // Place the object on this page if required + if ($this->_page_number >= $start && + (($this->_page_number % 2 == 0 && $where === "even") || + ($this->_page_number % 2 == 1 && $where === "odd") || + ($where === "all")) + ) { + $this->_pdf->fit_image($object, 0, 0, ""); + } + + $this->_objs[$object] = null; + unset($this->_objs[$object]); + } + + /** + * Add all active objects to the current page + */ + protected function _place_objects() + { + + foreach ($this->_objs as $obj => $props) { + $start = $props["start_page"]; + $where = $props["where"]; + + // Place the object on this page if required + if ($this->_page_number >= $start && + (($this->_page_number % 2 == 0 && $where === "even") || + ($this->_page_number % 2 == 1 && $where === "odd") || + ($where === "all")) + ) { + $this->_pdf->fit_image($obj, 0, 0, ""); + } + } + } + + public function get_width() + { + return $this->_width; + } + + public function get_height() + { + return $this->_height; + } + + public function get_page_number() + { + return $this->_page_number; + } + + public function get_page_count() + { + return $this->_page_count; + } + + /** + * @param $num + */ + public function set_page_number($num) + { + $this->_page_number = (int)$num; + } + + public function set_page_count($count) + { + $this->_page_count = (int)$count; + } + + /** + * Sets the line style + * + * @param float $width + * @param string $cap + * @param string $join + * @param array $dash + */ + protected function _set_line_style($width, $cap, $join, $dash) + { + if (!is_array($dash)) { + $dash = []; + } + + // Work around PDFLib limitation with 0 dash length: + // Value 0 for option 'dasharray' is too small (minimum 1.5e-05) + foreach ($dash as &$d) { + if ($d == 0) { + $d = 1.5e-5; + } + } + + if (count($dash) === 1) { + $dash[] = $dash[0]; + } + + if ($this->getPDFLibMajorVersion() >= 9) { + if (count($dash) > 1) { + $this->_pdf->set_graphics_option("dasharray={" . implode(" ", $dash) . "}"); + } else { + $this->_pdf->set_graphics_option("dasharray=none"); + } + } else { + if (count($dash) > 1) { + $this->_pdf->setdashpattern("dasharray={" . implode(" ", $dash) . "}"); + } else { + $this->_pdf->setdash(0, 0); + } + } + + switch ($join) { + case "miter": + if ($this->getPDFLibMajorVersion() >= 9) { + $this->_pdf->set_graphics_option('linejoin=0'); + } else { + $this->_pdf->setlinejoin(0); + } + break; + + case "round": + if ($this->getPDFLibMajorVersion() >= 9) { + $this->_pdf->set_graphics_option('linejoin=1'); + } else { + $this->_pdf->setlinejoin(1); + } + break; + + case "bevel": + if ($this->getPDFLibMajorVersion() >= 9) { + $this->_pdf->set_graphics_option('linejoin=2'); + } else { + $this->_pdf->setlinejoin(2); + } + break; + + default: + break; + } + + switch ($cap) { + case "butt": + if ($this->getPDFLibMajorVersion() >= 9) { + $this->_pdf->set_graphics_option('linecap=0'); + } else { + $this->_pdf->setlinecap(0); + } + break; + + case "round": + if ($this->getPDFLibMajorVersion() >= 9) { + $this->_pdf->set_graphics_option('linecap=1'); + } else { + $this->_pdf->setlinecap(1); + } + break; + + case "square": + if ($this->getPDFLibMajorVersion() >= 9) { + $this->_pdf->set_graphics_option('linecap=2'); + } else { + $this->_pdf->setlinecap(2); + } + break; + + default: + break; + } + + $this->_pdf->setlinewidth($width); + } + + /** + * Sets the line color + * + * @param array $color array(r,g,b) + */ + protected function _set_stroke_color($color) + { + // TODO: we should check the current PDF stroke color + // instead of the cached value + if ($this->_last_stroke_color == $color) { + // FIXME: do nothing, this optimization is broken by the + // stroke being set as a side effect of other operations + //return; + } + + $alpha = isset($color["alpha"]) ? $color["alpha"] : 1; + if (isset($this->_current_opacity)) { + $alpha *= $this->_current_opacity; + } + + $this->_last_stroke_color = $color; + + if (isset($color[3])) { + $type = "cmyk"; + list($c1, $c2, $c3, $c4) = [$color[0], $color[1], $color[2], $color[3]]; + } elseif (isset($color[2])) { + $type = "rgb"; + list($c1, $c2, $c3, $c4) = [$color[0], $color[1], $color[2], 0]; + } else { + $type = "gray"; + list($c1, $c2, $c3, $c4) = [$color[0], $color[1], 0, 0]; + } + + $this->_set_stroke_opacity($alpha, "Normal"); + $this->_pdf->setcolor("stroke", $type, $c1, $c2, $c3, $c4); + } + + /** + * Sets the fill color + * + * @param array $color array(r,g,b) + */ + protected function _set_fill_color($color) + { + // TODO: we should check the current PDF fill color + // instead of the cached value + if ($this->_last_fill_color == $color) { + // FIXME: do nothing, this optimization is broken by the + // fill being set as a side effect of other operations + //return; + } + + $alpha = isset($color["alpha"]) ? $color["alpha"] : 1; + if (isset($this->_current_opacity)) { + $alpha *= $this->_current_opacity; + } + + $this->_last_fill_color = $color; + + if (isset($color[3])) { + $type = "cmyk"; + list($c1, $c2, $c3, $c4) = [$color[0], $color[1], $color[2], $color[3]]; + } elseif (isset($color[2])) { + $type = "rgb"; + list($c1, $c2, $c3, $c4) = [$color[0], $color[1], $color[2], 0]; + } else { + $type = "gray"; + list($c1, $c2, $c3, $c4) = [$color[0], $color[1], 0, 0]; + } + + $this->_set_fill_opacity($alpha, "Normal"); + $this->_pdf->setcolor("fill", $type, $c1, $c2, $c3, $c4); + } + + /** + * Sets the fill opacity + * + * @param float $opacity + * @param string $mode + */ + public function _set_fill_opacity($opacity, $mode = "Normal") + { + if ($mode === "Normal" && isset($opacity)) { + $this->_set_gstate("opacityfill=$opacity"); + } + } + + /** + * Sets the stroke opacity + * + * @param float $opacity + * @param string $mode + */ + public function _set_stroke_opacity($opacity, $mode = "Normal") + { + if ($mode === "Normal" && isset($opacity)) { + $this->_set_gstate("opacitystroke=$opacity"); + } + } + + public function set_opacity(float $opacity, string $mode = "Normal"): void + { + if ($mode === "Normal") { + $this->_set_gstate("opacityfill=$opacity opacitystroke=$opacity"); + $this->_current_opacity = $opacity; + } + } + + /** + * Sets the gstate + * + * @param $gstate_options + * @return int + */ + public function _set_gstate($gstate_options) + { + if (($gstate = array_search($gstate_options, $this->_gstates)) === false) { + $gstate = $this->_pdf->create_gstate($gstate_options); + $this->_gstates[$gstate] = $gstate_options; + } + + return $this->_pdf->set_gstate($gstate); + } + + public function set_default_view($view, $options = []) + { + // TODO + // http://www.pdflib.com/fileadmin/pdflib/pdf/manuals/PDFlib-8.0.2-API-reference.pdf + /** + * fitheight Fit the page height to the window, with the x coordinate left at the left edge of the window. + * fitrect Fit the rectangle specified by left, bottom, right, and top to the window. + * fitvisible Fit the visible contents of the page (the ArtBox) to the window. + * fitvisibleheight Fit the visible contents of the page to the window with the x coordinate left at the left edge of the window. + * fitvisiblewidth Fit the visible contents of the page to the window with the y coordinate top at the top edge of the window. + * fitwidth Fit the page width to the window, with the y coordinate top at the top edge of the window. + * fitwindow Fit the complete page to the window. + * fixed + */ + //$this->setPDFLibParameter("openaction", $view); + } + + /** + * Loads a specific font and stores the corresponding descriptor. + * + * @param string $font + * @param string $encoding + * @param string $options + * + * @return int the font descriptor for the font + */ + protected function _load_font($font, $encoding = null, $options = "") + { + // Fix for PDFLib's case-sensitive font names + $baseFont = basename($font); + $isNativeFont = false; + $lcBaseFont = strtolower($baseFont); + if (isset(self::$nativeFontsToPDFLib[$lcBaseFont])) { + $baseFont = self::$nativeFontsToPDFLib[$lcBaseFont]; + $isNativeFont = true; + } + + // Embed non-native fonts + if (!$isNativeFont) { + $options .= " embedding=true"; + } + + $options .= " autosubsetting=" . ($this->_dompdf->getOptions()->getIsFontSubsettingEnabled() === false ? "false" : "true"); + + if (is_null($encoding)) { + // Unicode encoding is only available for the commerical + // version of PDFlib and not PDFlib-Lite + if (strlen($this->_dompdf->getOptions()->getPdflibLicense()) > 0) { + $encoding = "unicode"; + } else { + $encoding = "auto"; + } + } + + $key = "$font:$encoding:$options"; + if (isset($this->_fonts[$key])) { + return $this->_fonts[$key]; + } + + // Native fonts are build in, just load it + if ($isNativeFont) { + $this->_fonts[$key] = $this->_pdf->load_font($baseFont, $encoding, $options); + return $this->_fonts[$key]; + } + + $fontOutline = $this->getPDFLibParameter("FontOutline", 1); + if ($fontOutline === "" || $fontOutline < 0) { + $families = $this->_dompdf->getFontMetrics()->getFontFamilies(); + foreach ($families as $files) { + foreach ($files as $file) { + $face = basename($file); + $afm = null; + + if (isset($this->_fontsFiles[$face])) { + continue; + } + + // Prefer ttfs to afms + if (file_exists("$file.ttf")) { + $outline = "$file.ttf"; + } elseif (file_exists("$file.TTF")) { + $outline = "$file.TTF"; + } elseif (file_exists("$file.pfb")) { + $outline = "$file.pfb"; + if (file_exists("$file.afm")) { + $afm = "$file.afm"; + } + } elseif (file_exists("$file.PFB")) { + $outline = "$file.PFB"; + if (file_exists("$file.AFM")) { + $afm = "$file.AFM"; + } + } else { + continue; + } + + $this->_fontsFiles[$face] = true; + + if ($this->getPDFLibMajorVersion() >= 9) { + $this->setPDFLibParameter("FontOutline", '{' . "$face=$outline" . '}'); + } else { + $this->setPDFLibParameter("FontOutline", "\{$face\}=\{$outline\}"); + } + + if (is_null($afm)) { + continue; + } + if ($this->getPDFLibMajorVersion() >= 9) { + $this->setPDFLibParameter("FontAFM", '{' . "$face=$afm" . '}'); + } else { + $this->setPDFLibParameter("FontAFM", "\{$face\}=\{$afm\}"); + } + } + } + } + + $this->_fonts[$key] = $this->_pdf->load_font($baseFont, $encoding, $options); + + return $this->_fonts[$key]; + } + + /** + * Remaps y coords from 4th to 1st quadrant + * + * @param float $y + * @return float + */ + protected function y($y) + { + return $this->_height - $y; + } + + public function line($x1, $y1, $x2, $y2, $color, $width, $style = [], $cap = "butt") + { + $this->_set_line_style($width, $cap, "", $style); + $this->_set_stroke_color($color); + + $y1 = $this->y($y1); + $y2 = $this->y($y2); + + $this->_pdf->moveto($x1, $y1); + $this->_pdf->lineto($x2, $y2); + $this->_pdf->stroke(); + + $this->_set_stroke_opacity($this->_current_opacity, "Normal"); + } + + public function arc($x, $y, $r1, $r2, $astart, $aend, $color, $width, $style = [], $cap = "butt") + { + $this->_set_line_style($width, $cap, "", $style); + $this->_set_stroke_color($color); + + $y = $this->y($y); + + $this->_pdf->arc($x, $y, $r1, $astart, $aend); + $this->_pdf->stroke(); + + $this->_set_stroke_opacity($this->_current_opacity, "Normal"); + } + + public function rectangle($x1, $y1, $w, $h, $color, $width, $style = [], $cap = "butt") + { + $this->_set_stroke_color($color); + $this->_set_line_style($width, $cap, "", $style); + + $y1 = $this->y($y1) - $h; + + $this->_pdf->rect($x1, $y1, $w, $h); + $this->_pdf->stroke(); + + $this->_set_stroke_opacity($this->_current_opacity, "Normal"); + } + + public function filled_rectangle($x1, $y1, $w, $h, $color) + { + $this->_set_fill_color($color); + + $y1 = $this->y($y1) - $h; + + $this->_pdf->rect(floatval($x1), floatval($y1), floatval($w), floatval($h)); + $this->_pdf->fill(); + + $this->_set_fill_opacity($this->_current_opacity, "Normal"); + } + + public function clipping_rectangle($x1, $y1, $w, $h) + { + $this->_pdf->save(); + + $y1 = $this->y($y1) - $h; + + $this->_pdf->rect(floatval($x1), floatval($y1), floatval($w), floatval($h)); + $this->_pdf->clip(); + } + + public function clipping_roundrectangle($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL) + { + if ($this->getPDFLibMajorVersion() < 9) { + $this->clipping_rectangle($x1, $y1, $w, $h); + return; + } + + $this->_pdf->save(); + + // we use 0,0 for the base coordinates for the path points + // since we're drawing the path at the $x1,$y1 coordinates + + $path = 0; + //start: left edge, top end + $path = $this->_pdf->add_path_point($path, 0, 0 - $rTL + $h, "move", ""); + // line: left edge, bottom end + $path = $this->_pdf->add_path_point($path, 0, 0 + $rBL, "line", ""); + // curve: bottom-left corner + if ($rBL > 0) { + $path = $this->_pdf->add_path_point($path, 0 + $rBL, 0, "elliptical", "radius=$rBL clockwise=false"); + } + // line: bottom edge, left end + $path = $this->_pdf->add_path_point($path, 0 - $rBR + $w, 0, "line", ""); + // curve: bottom-right corner + if ($rBR > 0) { + $path = $this->_pdf->add_path_point($path, 0 + $w, 0 + $rBR, "elliptical", "radius=$rBR clockwise=false"); + } + // line: right edge, top end + $path = $this->_pdf->add_path_point($path, 0 + $w, 0 - $rTR + $h, "line", ""); + // curve: top-right corner + if ($rTR > 0) { + $path = $this->_pdf->add_path_point($path, 0 - $rTR + $w, 0 + $h, "elliptical", "radius=$rTR clockwise=false"); + } + // line: top edge, left end + $path = $this->_pdf->add_path_point($path, 0 + $rTL, 0 + $h, "line", ""); + // curve: top-left corner + if ($rTL > 0) { + $path = $this->_pdf->add_path_point($path, 0, 0 - $rTL + $h, "elliptical", "radius=$rTL clockwise=false"); + } + $this->_pdf->draw_path($path, $x1, $this->_height-$y1-$h, "clip=true"); + } + + public function clipping_polygon(array $points): void + { + $this->_pdf->save(); + + $y = $this->y(array_pop($points)); + $x = array_pop($points); + $this->_pdf->moveto($x, $y); + + while (count($points) > 1) { + $y = $this->y(array_pop($points)); + $x = array_pop($points); + $this->_pdf->lineto($x, $y); + } + + $this->_pdf->closepath(); + $this->_pdf->clip(); + } + + public function clipping_end() + { + $this->_pdf->restore(); + } + + public function save() + { + $this->_pdf->save(); + } + + function restore() + { + $this->_pdf->restore(); + } + + public function rotate($angle, $x, $y) + { + $pdf = $this->_pdf; + $pdf->translate($x, $this->_height - $y); + $pdf->rotate(-$angle); + $pdf->translate(-$x, -$this->_height + $y); + } + + public function skew($angle_x, $angle_y, $x, $y) + { + $pdf = $this->_pdf; + $pdf->translate($x, $this->_height - $y); + $pdf->skew($angle_y, $angle_x); // Needs to be inverted + $pdf->translate(-$x, -$this->_height + $y); + } + + public function scale($s_x, $s_y, $x, $y) + { + $pdf = $this->_pdf; + $pdf->translate($x, $this->_height - $y); + $pdf->scale($s_x, $s_y); + $pdf->translate(-$x, -$this->_height + $y); + } + + public function translate($t_x, $t_y) + { + $this->_pdf->translate($t_x, -$t_y); + } + + public function transform($a, $b, $c, $d, $e, $f) + { + $this->_pdf->concat($a, $b, $c, $d, $e, $f); + } + + public function polygon($points, $color, $width = null, $style = [], $fill = false) + { + $this->_set_fill_color($color); + $this->_set_stroke_color($color); + + if (!$fill && isset($width)) { + $this->_set_line_style($width, "square", "miter", $style); + } + + $y = $this->y(array_pop($points)); + $x = array_pop($points); + $this->_pdf->moveto($x, $y); + + while (count($points) > 1) { + $y = $this->y(array_pop($points)); + $x = array_pop($points); + $this->_pdf->lineto($x, $y); + } + + if ($fill) { + $this->_pdf->fill(); + } else { + $this->_pdf->closepath_stroke(); + } + + $this->_set_fill_opacity($this->_current_opacity, "Normal"); + $this->_set_stroke_opacity($this->_current_opacity, "Normal"); + } + + public function circle($x, $y, $r, $color, $width = null, $style = [], $fill = false) + { + $this->_set_fill_color($color); + $this->_set_stroke_color($color); + + if (!$fill && isset($width)) { + $this->_set_line_style($width, "round", "round", $style); + } + + $y = $this->y($y); + + $this->_pdf->circle($x, $y, $r); + + if ($fill) { + $this->_pdf->fill(); + } else { + $this->_pdf->stroke(); + } + + $this->_set_fill_opacity($this->_current_opacity, "Normal"); + $this->_set_stroke_opacity($this->_current_opacity, "Normal"); + } + + /** + * Convert image to a PNG image + * + * @param string $image_url + * @param string $type + * + * @return string|null The url of the newly converted image + */ + protected function _convert_to_png($image_url, $type) + { + $filename = Cache::getTempImage($image_url); + + if ($filename !== null && file_exists($filename)) { + return $filename; + } + + $func_name = "imagecreatefrom$type"; + + set_error_handler([Helpers::class, "record_warnings"]); + + if (method_exists(Helpers::class, $func_name)) { + $func_name = [Helpers::class, $func_name]; + } elseif (!function_exists($func_name)) { + throw new Exception("Function $func_name() not found. Cannot convert $type image: $image_url. Please install the image PHP extension."); + } + + try { + $im = call_user_func($func_name, $image_url); + + if ($im) { + imageinterlace($im, false); + + $tmp_dir = $this->_dompdf->getOptions()->getTempDir(); + $tmp_name = @tempnam($tmp_dir, "{$type}_dompdf_img_"); + @unlink($tmp_name); + $filename = "$tmp_name.png"; + + imagepng($im, $filename); + if (PHP_MAJOR_VERSION < 8) { + imagedestroy($im); + } + } else { + $filename = null; + } + } finally { + restore_error_handler(); + } + + if ($filename !== null) { + Cache::addTempImage($image_url, $filename); + } + + return $filename; + } + + public function image($img, $x, $y, $w, $h, $resolution = "normal") + { + $w = (int)$w; + $h = (int)$h; + + $img_type = Cache::detect_type($img, $this->get_dompdf()->getHttpContext()); + + // Strip file:// prefix + if (substr($img, 0, 7) === "file://") { + $img = substr($img, 7); + } + + if (!isset($this->_imgs[$img])) { + switch (strtolower($img_type)) { + case "webp": + $img = $this->_convert_to_png($img, $img_type); + if ($img === null) { + $img = Cache::$broken_image; + } + $this->image($img, $x, $y, $w, $h, $resolution); + return; + case "gif": + if ($this->getPDFLibMajorVersion() >= 10) { + $img = $this->_convert_to_png($img, $img_type); + if ($img === null) { + $img = Cache::$broken_image; + } + $this->image($img, $x, $y, $w, $h, $resolution); + return; + } + case "bmp": + /** @noinspection PhpMissingBreakStatementInspection */ + case "jpeg": + /** @noinspection PhpMissingBreakStatementInspection */ + case "png": + $image_load_response = $this->_pdf->load_image($img_type, $img, ""); + break; + case "svg": + $image_load_response = $this->_pdf->load_graphics($img_type, $img, ""); + break; + default: + // not handled + $this->image(Cache::$broken_image, $x, $y, $w, $h, $resolution); + return; + } + if ($image_load_response === 0) { + //TODO: should do something with the error message + $error = $this->_pdf->get_errmsg(); + return; + } + $this->_imgs[$img] = $image_load_response; + } + + $img = $this->_imgs[$img]; + + $y = $this->y($y) - $h; + if (strtolower($img_type) === "svg") { + $this->_pdf->fit_graphics($img, $x, $y, 'boxsize={' . "$w $h" . '} fitmethod=entire'); + } else { + $this->_pdf->fit_image($img, $x, $y, 'boxsize={' . "$w $h" . '} fitmethod=entire'); + } + } + + public function text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_spacing = 0, $char_spacing = 0, $angle = 0) + { + if ($size == 0) { + return; + } + + $fh = $this->_load_font($font); + + $this->_pdf->setfont($fh, $size); + $this->_set_fill_color($color); + + $y = $this->y($y) - $this->get_font_height($font, $size); + + $word_spacing = (float)$word_spacing; + $char_spacing = (float)$char_spacing; + $angle = -(float)$angle; + + $this->_pdf->fit_textline($text, $x, $y, "rotate=$angle wordspacing=$word_spacing charspacing=$char_spacing "); + + $this->_set_fill_opacity($this->_current_opacity, "Normal"); + } + + public function javascript($code) + { + if (strlen($this->_dompdf->getOptions()->getPdflibLicense()) > 0) { + $this->_pdf->create_action("JavaScript", $code); + } + } + + public function add_named_dest($anchorname) + { + $this->_pdf->add_nameddest($anchorname, ""); + } + + public function add_link($url, $x, $y, $width, $height) + { + $y = $this->y($y) - $height; + if (strpos($url, '#') === 0) { + // Local link + $name = substr($url, 1); + if ($name) { + $this->_pdf->create_annotation($x, $y, $x + $width, $y + $height, 'Link', + "contents={$url} destname=" . substr($url, 1) . " linewidth=0"); + } + } else { + //TODO: PDFLib::create_action does not permit non-HTTP links for URI actions + $action = $this->_pdf->create_action("URI", "url={{$url}}"); + // add the annotation only if the action was created + if ($action !== 0) { + $this->_pdf->create_annotation($x, $y, $x + $width, $y + $height, 'Link', "contents={{$url}} action={activate=$action} linewidth=0"); + } + } + } + + public function font_supports_char(string $font, string $char): bool + { + if ($char === "") { + return true; + } + + $fh = $this->_load_font($font); + if ($fh === 0) { + return false; + } + $this->_pdf->setfont($fh, 10); + + // unicode character glyph id lookup supports both the character and the unicode ordinal value + // because some characters can not be specified directly we'll specify the ordinal for all characters + // known problematic characters: "{", "}", " ", "=", "\u{feff}" + $char_code = Helpers::uniord($char, "UTF-8"); + $options = "unicode=$char_code"; + $glyphid = (int) $this->_pdf->info_font($fh, "glyphid", $options); + + return $glyphid !== -1; + } + + public function get_text_width($text, $font, $size, $word_spacing = 0.0, $letter_spacing = 0.0) + { + if ($size == 0) { + return 0.0; + } + + $fh = $this->_load_font($font); + + // Determine the additional width due to extra spacing + $num_spaces = mb_substr_count($text, " "); + $delta = $word_spacing * $num_spaces; + + if ($letter_spacing) { + $num_chars = mb_strlen($text, "UTF-8"); + $delta += $num_chars * $letter_spacing; + } + + return $this->_pdf->stringwidth($text, $fh, $size) + $delta; + } + + public function get_font_height($font, $size) + { + if ($size == 0) { + return 0.0; + } + + $fh = $this->_load_font($font); + + $this->_pdf->setfont($fh, $size); + + $asc = $this->_pdf->info_font($fh, "ascender", "fontsize=$size"); + $desc = $this->_pdf->info_font($fh, "descender", "fontsize=$size"); + + // $desc is usually < 0, + $ratio = $this->_dompdf->getOptions()->getFontHeightRatio(); + + return (abs($asc) + abs($desc)) * $ratio; + } + + public function get_font_baseline($font, $size) + { + $ratio = $this->_dompdf->getOptions()->getFontHeightRatio(); + + return $this->get_font_height($font, $size) / $ratio * 1.1; + } + + /** + * Processes a callback or script on every page. + * + * The callback function receives the four parameters `int $pageNumber`, + * `int $pageCount`, `Canvas $canvas`, and `FontMetrics $fontMetrics`, in + * that order. If a script is passed as string, the variables `$PAGE_NUM`, + * `$PAGE_COUNT`, `$pdf`, and `$fontMetrics` are available instead. Passing + * a script as string is deprecated and will be removed in a future version. + * + * This function can be used to add page numbers to all pages after the + * first one, for example. + * + * @param callable|string $callback The callback function or PHP script to process on every page + */ + public function page_script($callback): void + { + if (is_string($callback)) { + $this->processPageScript(function ( + int $PAGE_NUM, + int $PAGE_COUNT, + self $pdf, + FontMetrics $fontMetrics + ) use ($callback) { + eval($callback); + }); + return; + } + + $this->processPageScript($callback); + } + + public function page_text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_space = 0.0, $char_space = 0.0, $angle = 0.0) + { + $this->processPageScript(function (int $pageNumber, int $pageCount) use ($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle) { + $text = str_replace( + ["{PAGE_NUM}", "{PAGE_COUNT}"], + [$pageNumber, $pageCount], + $text + ); + $this->text($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle); + }); + } + + public function page_line($x1, $y1, $x2, $y2, $color, $width, $style = []) + { + $this->processPageScript(function () use ($x1, $y1, $x2, $y2, $color, $width, $style) { + $this->line($x1, $y1, $x2, $y2, $color, $width, $style); + }); + } + + public function new_page() + { + // Add objects to the current page + $this->_place_objects(); + + $this->_pdf->suspend_page(""); + $this->_pdf->begin_page_ext($this->_width, $this->_height, ""); + $this->_page_number = ++$this->_page_count; + } + + protected function processPageScript(callable $callback): void + { + $this->_pdf->suspend_page(""); + + for ($p = 1; $p <= $this->_page_count; $p++) { + $this->_pdf->resume_page("pagenumber=$p"); + + $fontMetrics = $this->_dompdf->getFontMetrics(); + $callback($p, $this->_page_count, $this, $fontMetrics); + + $this->_pdf->suspend_page(""); + } + + $this->_pdf->resume_page("pagenumber=" . $this->_page_number); + } + + /** + * @throws Exception + */ + public function stream($filename = "document.pdf", $options = []) + { + if (headers_sent()) { + die("Unable to stream pdf: headers already sent"); + } + + if (!isset($options["compress"])) { + $options["compress"] = true; + } + if (!isset($options["Attachment"])) { + $options["Attachment"] = true; + } + + if ($options["compress"]) { + $this->setPDFLibValue("compress", 6); + } else { + $this->setPDFLibValue("compress", 0); + } + + $this->_close(); + + $data = ""; + + if (self::$IN_MEMORY) { + $data = $this->_pdf->get_buffer(); + $size = mb_strlen($data, "8bit"); + } else { + $size = filesize($this->_file); + } + + header("Content-Type: application/pdf"); + header("Content-Length: " . $size); + + $filename = str_replace(["\n", "'"], "", basename($filename, ".pdf")) . ".pdf"; + $attachment = $options["Attachment"] ? "attachment" : "inline"; + header(Helpers::buildContentDispositionHeader($attachment, $filename)); + + if (self::$IN_MEMORY) { + echo $data; + } else { + // Chunked readfile() + $chunk = (1 << 21); // 2 MB + $fh = fopen($this->_file, "rb"); + if (!$fh) { + throw new Exception("Unable to load temporary PDF file: " . $this->_file); + } + + while (!feof($fh)) { + echo fread($fh, $chunk); + } + fclose($fh); + + //debugpng + if ($this->_dompdf->getOptions()->getDebugPng()) { + print '[pdflib stream unlink ' . $this->_file . ']'; + } + if (!$this->_dompdf->getOptions()->getDebugKeepTemp()) { + unlink($this->_file); + } + $this->_file = null; + unset($this->_file); + } + + flush(); + } + + public function output($options = []) + { + if (!isset($options["compress"])) { + $options["compress"] = true; + } + + if ($options["compress"]) { + $this->setPDFLibValue("compress", 6); + } else { + $this->setPDFLibValue("compress", 0); + } + + $this->_close(); + + if (self::$IN_MEMORY) { + $data = $this->_pdf->get_buffer(); + } else { + $data = file_get_contents($this->_file); + + //debugpng + if ($this->_dompdf->getOptions()->getDebugPng()) { + print '[pdflib output unlink ' . $this->_file . ']'; + } + if (!$this->_dompdf->getOptions()->getDebugKeepTemp()) { + unlink($this->_file); + } + $this->_file = null; + unset($this->_file); + } + + return $data; + } + + /** + * @param string $keyword + * @param string $optlist + * @return mixed + */ + protected function getPDFLibParameter($keyword, $optlist = "") + { + if ($this->getPDFLibMajorVersion() >= 9) { + return $this->_pdf->get_option($keyword, ""); + } + + return $this->_pdf->get_parameter($keyword, $optlist); + } + + /** + * @param string $keyword + * @param string $value + * @return mixed + */ + protected function setPDFLibParameter($keyword, $value) + { + if ($this->getPDFLibMajorVersion() >= 9) { + return $this->_pdf->set_option($keyword . "=" . $value); + } + + return $this->_pdf->set_parameter($keyword, $value); + } + + /** + * @param string $keyword + * @param string $optlist + * @return mixed + */ + protected function getPDFLibValue($keyword, $optlist = "") + { + if ($this->getPDFLibMajorVersion() >= 9) { + return $this->getPDFLibParameter($keyword, $optlist); + } + + return $this->_pdf->get_value($keyword); + } + + /** + * @param string $keyword + * @param string $value + * @return mixed + */ + protected function setPDFLibValue($keyword, $value) + { + if ($this->getPDFLibMajorVersion() >= 9) { + return $this->setPDFLibParameter($keyword, $value); + } + + return $this->_pdf->set_value($keyword, $value); + } + + /** + * @return int + */ + protected function getPDFLibMajorVersion() + { + if (is_null(self::$MAJOR_VERSION)) { + if (method_exists($this->_pdf, "get_option")) { + self::$MAJOR_VERSION = abs(intval($this->_pdf->get_option("major", ""))); + } else { + self::$MAJOR_VERSION = abs(intval($this->_pdf->get_value("major", ""))); + } + } + + return self::$MAJOR_VERSION; + } +} + +// Workaround for idiotic limitation on statics... +PDFLib::$PAPER_SIZES = CPDF::$PAPER_SIZES; diff --git a/dompdf/vendor/dompdf/dompdf/src/Canvas.php b/dompdf/vendor/dompdf/dompdf/src/Canvas.php new file mode 100644 index 0000000..7199456 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Canvas.php @@ -0,0 +1,487 @@ + alpha]` + * where r, g, b, and alpha are float values between 0 and 1 + * @param float $width + * @param array $style + * @param string $cap `butt`, `round`, or `square` + */ + function line($x1, $y1, $x2, $y2, $color, $width, $style = [], $cap = "butt"); + + /** + * Draws an arc + * + * See {@link Cpdf::setLineStyle()} for a description of the format of the + * $style and $cap parameters (aka dash and cap). + * + * @param float $x X coordinate of the arc + * @param float $y Y coordinate of the arc + * @param float $r1 Radius 1 + * @param float $r2 Radius 2 + * @param float $astart Start angle in degrees + * @param float $aend End angle in degrees + * @param array $color Color array in the format `[r, g, b, "alpha" => alpha]` + * where r, g, b, and alpha are float values between 0 and 1 + * @param float $width + * @param array $style + * @param string $cap `butt`, `round`, or `square` + */ + function arc($x, $y, $r1, $r2, $astart, $aend, $color, $width, $style = [], $cap = "butt"); + + /** + * Draws a rectangle at x1,y1 with width w and height h + * + * See {@link Cpdf::setLineStyle()} for a description of the format of the + * $style and $cap parameters (aka dash and cap). + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + * @param array $color Color array in the format `[r, g, b, "alpha" => alpha]` + * where r, g, b, and alpha are float values between 0 and 1 + * @param float $width + * @param array $style + * @param string $cap `butt`, `round`, or `square` + */ + function rectangle($x1, $y1, $w, $h, $color, $width, $style = [], $cap = "butt"); + + /** + * Draws a filled rectangle at x1,y1 with width w and height h + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + * @param array $color Color array in the format `[r, g, b, "alpha" => alpha]` + * where r, g, b, and alpha are float values between 0 and 1 + */ + function filled_rectangle($x1, $y1, $w, $h, $color); + + /** + * Starts a clipping rectangle at x1,y1 with width w and height h + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + */ + function clipping_rectangle($x1, $y1, $w, $h); + + /** + * Starts a rounded clipping rectangle at x1,y1 with width w and height h + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + * @param float $tl + * @param float $tr + * @param float $br + * @param float $bl + */ + function clipping_roundrectangle($x1, $y1, $w, $h, $tl, $tr, $br, $bl); + + /** + * Starts a clipping polygon + * + * @param float[] $points + */ + public function clipping_polygon(array $points): void; + + /** + * Ends the last clipping shape + */ + function clipping_end(); + + /** + * Processes a callback on every page. + * + * The callback function receives the four parameters `int $pageNumber`, + * `int $pageCount`, `Canvas $canvas`, and `FontMetrics $fontMetrics`, in + * that order. + * + * This function can be used to add page numbers to all pages after the + * first one, for example. + * + * @param callable $callback The callback function to process on every page + */ + public function page_script($callback): void; + + /** + * Writes text at the specified x and y coordinates on every page. + * + * The strings '{PAGE_NUM}' and '{PAGE_COUNT}' are automatically replaced + * with their current values. + * + * @param float $x + * @param float $y + * @param string $text The text to write + * @param string $font The font file to use + * @param float $size The font size, in points + * @param array $color Color array in the format `[r, g, b, "alpha" => alpha]` + * where r, g, b, and alpha are float values between 0 and 1 + * @param float $word_space Word spacing adjustment + * @param float $char_space Char spacing adjustment + * @param float $angle Angle to write the text at, measured clockwise starting from the x-axis + */ + public function page_text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_space = 0.0, $char_space = 0.0, $angle = 0.0); + + /** + * Draws a line at the specified coordinates on every page. + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @param array $color Color array in the format `[r, g, b, "alpha" => alpha]` + * where r, g, b, and alpha are float values between 0 and 1 + * @param float $width + * @param array $style + */ + public function page_line($x1, $y1, $x2, $y2, $color, $width, $style = []); + + /** + * Save current state + */ + function save(); + + /** + * Restore last state + */ + function restore(); + + /** + * Rotate + * + * @param float $angle angle in degrees for counter-clockwise rotation + * @param float $x Origin abscissa + * @param float $y Origin ordinate + */ + function rotate($angle, $x, $y); + + /** + * Skew + * + * @param float $angle_x + * @param float $angle_y + * @param float $x Origin abscissa + * @param float $y Origin ordinate + */ + function skew($angle_x, $angle_y, $x, $y); + + /** + * Scale + * + * @param float $s_x scaling factor for width as percent + * @param float $s_y scaling factor for height as percent + * @param float $x Origin abscissa + * @param float $y Origin ordinate + */ + function scale($s_x, $s_y, $x, $y); + + /** + * Translate + * + * @param float $t_x movement to the right + * @param float $t_y movement to the bottom + */ + function translate($t_x, $t_y); + + /** + * Transform + * + * @param float $a + * @param float $b + * @param float $c + * @param float $d + * @param float $e + * @param float $f + */ + function transform($a, $b, $c, $d, $e, $f); + + /** + * Draws a polygon + * + * The polygon is formed by joining all the points stored in the $points + * array. $points has the following structure: + * ``` + * array(0 => x1, + * 1 => y1, + * 2 => x2, + * 3 => y2, + * ... + * ); + * ``` + * + * See {@link Cpdf::setLineStyle()} for a description of the format of the + * $style parameter (aka dash). + * + * @param array $points + * @param array $color Color array in the format `[r, g, b, "alpha" => alpha]` + * where r, g, b, and alpha are float values between 0 and 1 + * @param float $width + * @param array $style + * @param bool $fill Fills the polygon if true + */ + function polygon($points, $color, $width = null, $style = [], $fill = false); + + /** + * Draws a circle at $x,$y with radius $r + * + * See {@link Cpdf::setLineStyle()} for a description of the format of the + * $style parameter (aka dash). + * + * @param float $x + * @param float $y + * @param float $r + * @param array $color Color array in the format `[r, g, b, "alpha" => alpha]` + * where r, g, b, and alpha are float values between 0 and 1 + * @param float $width + * @param array $style + * @param bool $fill Fills the circle if true + */ + function circle($x, $y, $r, $color, $width = null, $style = [], $fill = false); + + /** + * Add an image to the pdf. + * + * The image is placed at the specified x and y coordinates with the + * given width and height. + * + * @param string $img The path to the image + * @param float $x X position + * @param float $y Y position + * @param float $w Width + * @param float $h Height + * @param string $resolution The resolution of the image + */ + function image($img, $x, $y, $w, $h, $resolution = "normal"); + + /** + * Writes text at the specified x and y coordinates + * + * @param float $x + * @param float $y + * @param string $text The text to write + * @param string $font The font file to use + * @param float $size The font size, in points + * @param array $color Color array in the format `[r, g, b, "alpha" => alpha]` + * where r, g, b, and alpha are float values between 0 and 1 + * @param float $word_space Word spacing adjustment + * @param float $char_space Char spacing adjustment + * @param float $angle Angle to write the text at, measured clockwise starting from the x-axis + */ + function text($x, $y, $text, $font, $size, $color = [0, 0, 0], $word_space = 0.0, $char_space = 0.0, $angle = 0.0); + + /** + * Add a named destination (similar to ... in html) + * + * @param string $anchorname The name of the named destination + */ + function add_named_dest($anchorname); + + /** + * Add a link to the pdf + * + * @param string $url The url to link to + * @param float $x The x position of the link + * @param float $y The y position of the link + * @param float $width The width of the link + * @param float $height The height of the link + */ + function add_link($url, $x, $y, $width, $height); + + /** + * Add meta information to the PDF. + * + * @param string $label Label of the value (Creator, Producer, etc.) + * @param string $value The text to set + */ + public function add_info(string $label, string $value): void; + + /** + * Determines if the font supports the given character + * + * @param string $font The font file to use + * @param string $char The character to check + * + * @return bool + */ + function font_supports_char(string $font, string $char): bool; + + /** + * Calculates text size, in points + * + * @param string $text The text to be sized + * @param string $font The font file to use + * @param float $size The font size, in points + * @param float $word_spacing Word spacing, if any + * @param float $char_spacing Char spacing, if any + * + * @return float + */ + function get_text_width($text, $font, $size, $word_spacing = 0.0, $char_spacing = 0.0); + + /** + * Calculates font height, in points + * + * @param string $font The font file to use + * @param float $size The font size, in points + * + * @return float + */ + function get_font_height($font, $size); + + /** + * Returns the font x-height, in points + * + * @param string $font The font file to use + * @param float $size The font size, in points + * + * @return float + */ + //function get_font_x_height($font, $size); + + /** + * Calculates font baseline, in points + * + * @param string $font The font file to use + * @param float $size The font size, in points + * + * @return float + */ + function get_font_baseline($font, $size); + + /** + * Returns the PDF's width in points + * + * @return float + */ + function get_width(); + + /** + * Returns the PDF's height in points + * + * @return float + */ + function get_height(); + + /** + * Sets the opacity + * + * @param float $opacity + * @param string $mode + */ + public function set_opacity(float $opacity, string $mode = "Normal"): void; + + /** + * Sets the default view + * + * @param string $view + * 'XYZ' left, top, zoom + * 'Fit' + * 'FitH' top + * 'FitV' left + * 'FitR' left,bottom,right + * 'FitB' + * 'FitBH' top + * 'FitBV' left + * @param array $options + */ + function set_default_view($view, $options = []); + + /** + * @param string $code + */ + function javascript($code); + + /** + * Starts a new page + * + * Subsequent drawing operations will appear on the new page. + */ + function new_page(); + + /** + * Streams the PDF to the client. + * + * @param string $filename The filename to present to the client. + * @param array $options Associative array: 'compress' => 1 or 0 (default 1); 'Attachment' => 1 or 0 (default 1). + */ + function stream($filename, $options = []); + + /** + * Returns the PDF as a string. + * + * @param array $options Associative array: 'compress' => 1 or 0 (default 1). + * + * @return string + */ + function output($options = []); +} diff --git a/dompdf/vendor/dompdf/dompdf/src/CanvasFactory.php b/dompdf/vendor/dompdf/dompdf/src/CanvasFactory.php new file mode 100644 index 0000000..4449d5d --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/CanvasFactory.php @@ -0,0 +1,68 @@ +getOptions()->getPdfBackend()); + + if (isset($class) && class_exists($class, false)) { + $class .= "_Adapter"; + } else { + if (($backend === "auto" || $backend === "pdflib") && + class_exists("PDFLib", false) + ) { + $class = "Dompdf\\Adapter\\PDFLib"; + } + + else { + if (class_exists($backend, false)) { + $class = $backend; + } elseif ($backend === "gd" && extension_loaded('gd')) { + $class = "Dompdf\\Adapter\\GD"; + } else { + $class = "Dompdf\\Adapter\\CPDF"; + } + } + } + + $instance = new $class($paper, $orientation, $dompdf); + + $class_interfaces = class_implements($class, false); + if (!$class_interfaces || !in_array("Dompdf\\Canvas", $class_interfaces)) { + $class = "Dompdf\\Adapter\\CPDF"; + $instance = new $class($paper, $orientation, $dompdf); + } + + return $instance; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Cellmap.php b/dompdf/vendor/dompdf/dompdf/src/Cellmap.php new file mode 100644 index 0000000..f6f3174 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Cellmap.php @@ -0,0 +1,1009 @@ + 8, + "solid" => 7, + "dashed" => 6, + "dotted" => 5, + "ridge" => 4, + "outset" => 3, + "groove" => 2, + "inset" => 1, + "none" => 0 + ]; + + /** + * The table object this cellmap is attached to. + * + * @var TableFrameDecorator + */ + protected $_table; + + /** + * The total number of rows in the table + * + * @var int + */ + protected $_num_rows; + + /** + * The total number of columns in the table + * + * @var int + */ + protected $_num_cols; + + /** + * 2D array mapping to frames + * + * @var Frame[][] + */ + protected $_cells; + + /** + * 1D array of column dimensions + * + * @var array + */ + protected $_columns; + + /** + * 1D array of row dimensions + * + * @var array + */ + protected $_rows; + + /** + * 2D array of border specs + * + * @var array + */ + protected $_borders; + + /** + * 1D Array mapping frames to (multiple) pairs, keyed on frame_id. + * + * @var array[] + */ + protected $_frames; + + /** + * Current column when adding cells, 0-based + * + * @var int + */ + private $__col; + + /** + * Current row when adding cells, 0-based + * + * @var int + */ + private $__row; + + /** + * Tells whether the columns' width can be modified + * + * @var bool + */ + private $_columns_locked = false; + + /** + * Tells whether the table has table-layout:fixed + * + * @var bool + */ + private $_fixed_layout = false; + + /** + * @param TableFrameDecorator $table + */ + public function __construct(TableFrameDecorator $table) + { + $this->_table = $table; + $this->reset(); + } + + public function reset(): void + { + $this->_num_rows = 0; + $this->_num_cols = 0; + + $this->_cells = []; + $this->_frames = []; + + if (!$this->_columns_locked) { + $this->_columns = []; + } + + $this->_rows = []; + + $this->_borders = []; + + $this->__col = $this->__row = 0; + } + + public function lock_columns(): void + { + $this->_columns_locked = true; + } + + /** + * @return bool + */ + public function is_columns_locked() + { + return $this->_columns_locked; + } + + /** + * @param bool $fixed + */ + public function set_layout_fixed(bool $fixed) + { + $this->_fixed_layout = $fixed; + } + + /** + * @return bool + */ + public function is_layout_fixed() + { + return $this->_fixed_layout; + } + + /** + * @return int + */ + public function get_num_rows() + { + return $this->_num_rows; + } + + /** + * @return int + */ + public function get_num_cols() + { + return $this->_num_cols; + } + + /** + * @return array + */ + public function &get_columns() + { + return $this->_columns; + } + + /** + * @param $columns + */ + public function set_columns($columns) + { + $this->_columns = $columns; + } + + /** + * @param int $i + * + * @return mixed + */ + public function &get_column($i) + { + if (!isset($this->_columns[$i])) { + $this->_columns[$i] = [ + "x" => 0, + "min-width" => 0, + "max-width" => 0, + "used-width" => null, + "absolute" => 0, + "percent" => 0, + "auto" => true, + ]; + } + + return $this->_columns[$i]; + } + + /** + * @return array + */ + public function &get_rows() + { + return $this->_rows; + } + + /** + * @param int $j + * + * @return mixed + */ + public function &get_row($j) + { + if (!isset($this->_rows[$j])) { + $this->_rows[$j] = [ + "y" => 0, + "first-column" => 0, + "height" => null, + ]; + } + + return $this->_rows[$j]; + } + + /** + * @param int $i + * @param int $j + * @param mixed $h_v + * @param null|mixed $prop + * + * @return mixed + */ + public function get_border($i, $j, $h_v, $prop = null) + { + if (!isset($this->_borders[$i][$j][$h_v])) { + $this->_borders[$i][$j][$h_v] = [ + "width" => 0, + "style" => "solid", + "color" => "black", + ]; + } + + if (isset($prop)) { + return $this->_borders[$i][$j][$h_v][$prop]; + } + + return $this->_borders[$i][$j][$h_v]; + } + + /** + * @param int $i + * @param int $j + * + * @return array + */ + public function get_border_properties($i, $j) + { + return [ + "top" => $this->get_border($i, $j, "horizontal"), + "right" => $this->get_border($i, $j + 1, "vertical"), + "bottom" => $this->get_border($i + 1, $j, "horizontal"), + "left" => $this->get_border($i, $j, "vertical"), + ]; + } + + /** + * @param Frame $frame + * + * @return array|null + */ + public function get_spanned_cells(Frame $frame) + { + $key = $frame->get_id(); + + if (isset($this->_frames[$key])) { + return $this->_frames[$key]; + } + + return null; + } + + /** + * @param Frame $frame + * + * @return bool + */ + public function frame_exists_in_cellmap(Frame $frame) + { + $key = $frame->get_id(); + + return isset($this->_frames[$key]); + } + + /** + * @param Frame $frame + * + * @return array + * @throws Exception + */ + public function get_frame_position(Frame $frame) + { + global $_dompdf_warnings; + + $key = $frame->get_id(); + + if (!isset($this->_frames[$key])) { + throw new Exception("Frame not found in cellmap"); + } + + // Positions are stored relative to the table position + [$table_x, $table_y] = $this->_table->get_position(); + $col = $this->_frames[$key]["columns"][0]; + $row = $this->_frames[$key]["rows"][0]; + + if (!isset($this->_columns[$col])) { + $_dompdf_warnings[] = "Frame not found in columns array. Check your table layout for missing or extra TDs."; + $x = $table_x; + } else { + $x = $table_x + $this->_columns[$col]["x"]; + } + + if (!isset($this->_rows[$row])) { + $_dompdf_warnings[] = "Frame not found in row array. Check your table layout for missing or extra TDs."; + $y = $table_y; + } else { + $y = $table_y + $this->_rows[$row]["y"]; + } + + return [$x, $y, "x" => $x, "y" => $y]; + } + + /** + * @param Frame $frame + * + * @return int + * @throws Exception + */ + public function get_frame_width(Frame $frame) + { + $key = $frame->get_id(); + + if (!isset($this->_frames[$key])) { + throw new Exception("Frame not found in cellmap"); + } + + $cols = $this->_frames[$key]["columns"]; + $w = 0; + foreach ($cols as $i) { + $w += $this->_columns[$i]["used-width"]; + } + + return $w; + } + + /** + * @param Frame $frame + * + * @return int + * @throws Exception + * @throws Exception + */ + public function get_frame_height(Frame $frame) + { + $key = $frame->get_id(); + + if (!isset($this->_frames[$key])) { + throw new Exception("Frame not found in cellmap"); + } + + $rows = $this->_frames[$key]["rows"]; + $h = 0; + foreach ($rows as $i) { + if (!isset($this->_rows[$i])) { + throw new Exception("The row #$i could not be found, please file an issue in the tracker with the HTML code"); + } + + $h += $this->_rows[$i]["height"]; + } + + return $h; + } + + /** + * @param int $j + * @param mixed $width + */ + public function set_column_width($j, $width) + { + if ($this->_columns_locked) { + return; + } + + $col =& $this->get_column($j); + $col["used-width"] = $width; + $next_col =& $this->get_column($j + 1); + $next_col["x"] = $col["x"] + $width; + } + + /** + * @param int $i + * @param long $height + */ + public function set_row_height($i, $height) + { + $row =& $this->get_row($i); + if ($height > $row["height"]) { + $row["height"] = $height; + } + $next_row =& $this->get_row($i + 1); + $next_row["y"] = $row["y"] + $row["height"]; + } + + /** + * https://www.w3.org/TR/CSS21/tables.html#border-conflict-resolution + * + * @param int $i + * @param int $j + * @param string $h_v `horizontal` or `vertical` + * @param array $border_spec + */ + protected function resolve_border(int $i, int $j, string $h_v, array $border_spec): void + { + if (!isset($this->_borders[$i][$j][$h_v])) { + $this->_borders[$i][$j][$h_v] = $border_spec; + return; + } + + $border = $this->_borders[$i][$j][$h_v]; + + $n_width = $border_spec["width"]; + $n_style = $border_spec["style"]; + $o_width = $border["width"]; + $o_style = $border["style"]; + + if ($o_style === "hidden") { + return; + } + + // A style of `none` has lowest priority independent of its specified + // width here, as its resolved width is always 0 + if ($n_style === "hidden" || $n_width > $o_width + || ($o_width == $n_width + && isset(self::BORDER_STYLE_SCORE[$n_style]) + && isset(self::BORDER_STYLE_SCORE[$o_style]) + && self::BORDER_STYLE_SCORE[$n_style] > self::BORDER_STYLE_SCORE[$o_style]) + ) { + $this->_borders[$i][$j][$h_v] = $border_spec; + } + } + + /** + * Get the resolved border properties for the given frame. + * + * @param AbstractFrameDecorator $frame + * + * @return array[] + */ + protected function get_resolved_border(AbstractFrameDecorator $frame): array + { + $key = $frame->get_id(); + $columns = $this->_frames[$key]["columns"]; + $rows = $this->_frames[$key]["rows"]; + + $first_col = $columns[0]; + $last_col = $columns[count($columns) - 1]; + $first_row = $rows[0]; + $last_row = $rows[count($rows) - 1]; + + $max_top = null; + $max_bottom = null; + $max_left = null; + $max_right = null; + + foreach ($columns as $col) { + $top = $this->_borders[$first_row][$col]["horizontal"]; + $bottom = $this->_borders[$last_row + 1][$col]["horizontal"]; + + if ($max_top === null || $top["width"] > $max_top["width"]) { + $max_top = $top; + } + if ($max_bottom === null || $bottom["width"] > $max_bottom["width"]) { + $max_bottom = $bottom; + } + } + + foreach ($rows as $row) { + $left = $this->_borders[$row][$first_col]["vertical"]; + $right = $this->_borders[$row][$last_col + 1]["vertical"]; + + if ($max_left === null || $left["width"] > $max_left["width"]) { + $max_left = $left; + } + if ($max_right === null || $right["width"] > $max_right["width"]) { + $max_right = $right; + } + } + + return [$max_top, $max_right, $max_bottom, $max_left]; + } + + /** + * @param AbstractFrameDecorator $frame + */ + public function add_frame(Frame $frame): void + { + $style = $frame->get_style(); + $display = $style->display; + + $collapse = $this->_table->get_style()->border_collapse === "collapse"; + + // Recursively add the frames within the table, its row groups and rows + if ($frame === $this->_table + || $display === "table-row" + || in_array($display, TableFrameDecorator::ROW_GROUPS, true) + ) { + $start_row = $this->__row; + + foreach ($frame->get_children() as $child) { + $this->add_frame($child); + } + + if ($display === "table-row") { + $this->add_row(); + } + + $num_rows = $this->__row - $start_row - 1; + $key = $frame->get_id(); + + // Row groups always span across the entire table + $this->_frames[$key]["columns"] = range(0, max(0, $this->_num_cols - 1)); + $this->_frames[$key]["rows"] = range($start_row, max(0, $this->__row - 1)); + $this->_frames[$key]["frame"] = $frame; + + if ($collapse) { + $bp = $style->get_border_properties(); + + // Resolve vertical borders + for ($i = 0; $i < $num_rows + 1; $i++) { + $this->resolve_border($start_row + $i, 0, "vertical", $bp["left"]); + $this->resolve_border($start_row + $i, $this->_num_cols, "vertical", $bp["right"]); + } + + // Resolve horizontal borders + for ($j = 0; $j < $this->_num_cols; $j++) { + $this->resolve_border($start_row, $j, "horizontal", $bp["top"]); + $this->resolve_border($this->__row, $j, "horizontal", $bp["bottom"]); + } + + if ($frame === $this->_table) { + // Clear borders because the cells are now using them. The + // border width still needs to be set to half the resolved + // width so that the table is positioned properly + [$top, $right, $bottom, $left] = $this->get_resolved_border($frame); + + $style->set_used("border_top_width", $top["width"] / 2); + $style->set_used("border_right_width", $right["width"] / 2); + $style->set_used("border_bottom_width", $bottom["width"] / 2); + $style->set_used("border_left_width", $left["width"] / 2); + $style->set_used("border_style", "none"); + } + } + + if ($frame !== $this->_table) { + // Clear borders for rows and row groups. For the collapsed + // model, they have been resolved and are used by the cells now. + // For the separated model, they are ignored per spec + $style->set_used("border_width", 0); + $style->set_used("border_style", "none"); + } + + if ($frame === $this->_table) { + // Apply resolved borders to table cells and calculate column + // widths after all frames have been added + $this->calculate_column_widths(); + } + return; + } + + // Add the frame to the cellmap + $key = $frame->get_id(); + $node = $frame->get_node(); + $bp = $style->get_border_properties(); + + // Determine where this cell is going + $colspan = max((int) $node->getAttribute("colspan"), 1); + $rowspan = max((int) $node->getAttribute("rowspan"), 1); + + // Find the next available column (fix by Ciro Mondueri) + $ac = $this->__col; + while (isset($this->_cells[$this->__row][$ac])) { + $ac++; + } + + $this->__col = $ac; + + // Rows: + for ($i = 0; $i < $rowspan; $i++) { + $row = $this->__row + $i; + + $this->_frames[$key]["rows"][] = $row; + + for ($j = 0; $j < $colspan; $j++) { + $this->_cells[$row][$this->__col + $j] = $frame; + } + + if ($collapse) { + // Resolve vertical borders + $this->resolve_border($row, $this->__col, "vertical", $bp["left"]); + $this->resolve_border($row, $this->__col + $colspan, "vertical", $bp["right"]); + } + } + + // Columns: + for ($j = 0; $j < $colspan; $j++) { + $col = $this->__col + $j; + $this->_frames[$key]["columns"][] = $col; + + if ($collapse) { + // Resolve horizontal borders + $this->resolve_border($this->__row, $col, "horizontal", $bp["top"]); + $this->resolve_border($this->__row + $rowspan, $col, "horizontal", $bp["bottom"]); + } + } + + $this->_frames[$key]["frame"] = $frame; + + $this->__col += $colspan; + if ($this->__col > $this->_num_cols) { + $this->_num_cols = $this->__col; + } + } + + /** + * Apply resolved borders to table cells and calculate column widths. + */ + protected function calculate_column_widths(): void + { + $table = $this->_table; + $table_style = $table->get_style(); + $collapse = $table_style->border_collapse === "collapse"; + + if ($collapse) { + $v_spacing = 0; + $h_spacing = 0; + } else { + // The additional 1/2 width gets added to the table proper + [$h, $v] = $table_style->border_spacing; + $v_spacing = $v / 2; + $h_spacing = $h / 2; + } + + foreach ($this->_frames as $frame_info) { + /** @var TableCellFrameDecorator */ + $frame = $frame_info["frame"]; + $style = $frame->get_style(); + $display = $style->display; + + if ($display !== "table-cell") { + continue; + } + + if ($collapse) { + // Set the resolved border at half width + [$top, $right, $bottom, $left] = $this->get_resolved_border($frame); + + $style->set_used("border_top_width", $top["width"] / 2); + $style->set_used("border_top_style", $top["style"]); + $style->set_used("border_top_color", $top["color"]); + $style->set_used("border_right_width", $right["width"] / 2); + $style->set_used("border_right_style", $right["style"]); + $style->set_used("border_right_color", $right["color"]); + $style->set_used("border_bottom_width", $bottom["width"] / 2); + $style->set_used("border_bottom_style", $bottom["style"]); + $style->set_used("border_bottom_color", $bottom["color"]); + $style->set_used("border_left_width", $left["width"] / 2); + $style->set_used("border_left_style", $left["style"]); + $style->set_used("border_left_color", $left["color"]); + $style->set_used("margin", 0); + } else { + // Border spacing is effectively a margin between cells + $style->set_used("margin_top", $v_spacing); + $style->set_used("margin_bottom", $v_spacing); + $style->set_used("margin_left", $h_spacing); + $style->set_used("margin_right", $h_spacing); + } + + if ($this->_columns_locked) { + continue; + } + + // Column calculation for fixed-layout tables should ony use the first row's cells + // https://www.w3.org/TR/CSS2/tables.html#fixed-table-layout + if ($this->_fixed_layout && !in_array(0, $frame_info["rows"], true)) { + continue; + } + + $node = $frame->get_node(); + $colspan = max((int) $node->getAttribute("colspan"), 1); + $first_col = $frame_info["columns"][0]; + + // Resolve the frame's width + if ($this->_fixed_layout) { + list($frame_min, $frame_max) = [0, 10e-10]; + } else { + list($frame_min, $frame_max) = $frame->get_min_max_width(); + } + + $width = $style->width; + + $val = null; + if (Helpers::is_percent($width) && $colspan === 1) { + $var = "percent"; + $val = (float)rtrim($width, "% "); + } elseif ($width !== "auto" && $colspan === 1) { + $var = "absolute"; + $val = $frame_min; + } + + $min = 0; + $max = 0; + for ($cs = 0; $cs < $colspan; $cs++) { + + // Resolve the frame's width(s) with other cells + $col =& $this->get_column($first_col + $cs); + + // Note: $var is either 'percent' or 'absolute'. We compare the + // requested percentage or absolute values with the existing widths + // and adjust accordingly. + if (isset($var) && $val > $col[$var]) { + $col[$var] = $val; + $col["auto"] = false; + } + + $min += $col["min-width"]; + $max += $col["max-width"]; + } + + if ($frame_min > $min && $colspan === 1) { + // The frame needs more space. Expand each sub-column + // FIXME try to avoid putting this dummy value when table-layout:fixed + $inc = ($this->_fixed_layout ? 10e-10 : ($frame_min - $min)); + for ($c = 0; $c < $colspan; $c++) { + $col =& $this->get_column($first_col + $c); + $col["min-width"] += $inc; + } + } + + if ($frame_max > $max) { + // FIXME try to avoid putting this dummy value when table-layout:fixed + $inc = ($this->_fixed_layout ? 10e-10 : ($frame_max - $max) / $colspan); + for ($c = 0; $c < $colspan; $c++) { + $col =& $this->get_column($first_col + $c); + $col["max-width"] += $inc; + } + } + } + + // Adjust absolute columns so that the absolute (and max) width is the + // largest minimum width of all cells. This accounts for cells without + // absolute width within an absolute column + foreach ($this->_columns as &$col) { + if ($col["absolute"] > 0) { + $col["absolute"] = $col["min-width"]; + $col["max-width"] = $col["min-width"]; + } + } + } + + protected function add_row(): void + { + $this->__row++; + $this->_num_rows++; + + // Find the next available column + $i = 0; + while (isset($this->_cells[$this->__row][$i])) { + $i++; + } + + $this->__col = $i; + } + + /** + * Remove a row from the cellmap. + * + * @param Frame + */ + public function remove_row(Frame $row) + { + $key = $row->get_id(); + if (!isset($this->_frames[$key])) { + return; // Presumably this row has already been removed + } + + $this->__row = $this->_num_rows--; + + $rows = $this->_frames[$key]["rows"]; + $columns = $this->_frames[$key]["columns"]; + + // Remove all frames from this row + foreach ($rows as $r) { + foreach ($columns as $c) { + if (isset($this->_cells[$r][$c])) { + $id = $this->_cells[$r][$c]->get_id(); + + $this->_cells[$r][$c] = null; + unset($this->_cells[$r][$c]); + + // has multiple rows? + if (isset($this->_frames[$id]) && count($this->_frames[$id]["rows"]) > 1) { + // remove just the desired row, but leave the frame + if (($row_key = array_search($r, $this->_frames[$id]["rows"])) !== false) { + unset($this->_frames[$id]["rows"][$row_key]); + } + continue; + } + + $this->_frames[$id] = null; + unset($this->_frames[$id]); + } + } + + $this->_rows[$r] = null; + unset($this->_rows[$r]); + } + + $this->_frames[$key] = null; + unset($this->_frames[$key]); + } + + /** + * Remove a row group from the cellmap. + * + * @param Frame $group The group to remove + */ + public function remove_row_group(Frame $group) + { + $key = $group->get_id(); + if (!isset($this->_frames[$key])) { + return; // Presumably this row has already been removed + } + + $iter = $group->get_first_child(); + while ($iter) { + $this->remove_row($iter); + $iter = $iter->get_next_sibling(); + } + + $this->_frames[$key] = null; + unset($this->_frames[$key]); + } + + /** + * Update a row group after rows have been removed + * + * @param Frame $group The group to update + * @param Frame $last_row The last row in the row group + */ + public function update_row_group(Frame $group, Frame $last_row) + { + $g_key = $group->get_id(); + + $first_index = $this->_frames[$g_key]["rows"][0]; + $last_index = $first_index; + $row = $last_row; + while ($row = $row->get_prev_sibling()) { + $last_index++; + } + + $this->_frames[$g_key]["rows"] = range($first_index, $last_index); + } + + public function assign_x_positions(): void + { + // Pre-condition: widths must be resolved and assigned to columns and + // column[0]["x"] must be set. + + if ($this->_columns_locked) { + return; + } + + $x = $this->_columns[0]["x"]; + foreach (array_keys($this->_columns) as $j) { + $this->_columns[$j]["x"] = $x; + $x += $this->_columns[$j]["used-width"]; + } + } + + public function assign_frame_heights(): void + { + // Pre-condition: widths and heights of each column & row must be + // calcluated + foreach ($this->_frames as $arr) { + $frame = $arr["frame"]; + + $h = 0.0; + foreach ($arr["rows"] as $row) { + if (!isset($this->_rows[$row])) { + // The row has been removed because of a page split, so skip it. + continue; + } + + $h += $this->_rows[$row]["height"]; + } + + if ($frame instanceof TableCellFrameDecorator) { + $frame->set_cell_height($h); + } else { + $frame->get_style()->set_used("height", $h); + } + } + } + + /** + * Re-adjust frame height if the table height is larger than its content + */ + public function set_frame_heights(float $table_height, float $content_height): void + { + // Distribute the increased height proportionally amongst each row + foreach ($this->_frames as $arr) { + $frame = $arr["frame"]; + + $h = 0.0; + foreach ($arr["rows"] as $row) { + if (!isset($this->_rows[$row])) { + continue; + } + + $h += $this->_rows[$row]["height"]; + } + + if ($content_height > 0) { + $new_height = ($h / $content_height) * $table_height; + } else { + $new_height = 0.0; + } + + if ($frame instanceof TableCellFrameDecorator) { + $frame->set_cell_height($new_height); + } else { + $frame->get_style()->set_used("height", $new_height); + } + } + } + + /** + * Used for debugging: + * + * @return string + */ + public function __toString(): string + { + $str = ""; + $str .= "Columns:
"; + $str .= Helpers::pre_r($this->_columns, true); + $str .= "Rows:
"; + $str .= Helpers::pre_r($this->_rows, true); + + $str .= "Frames:
"; + $arr = []; + foreach ($this->_frames as $key => $val) { + $arr[$key] = ["columns" => $val["columns"], "rows" => $val["rows"]]; + } + + $str .= Helpers::pre_r($arr, true); + + if (php_sapi_name() == "cli") { + $str = strip_tags(str_replace(["
", "", ""], + ["\n", chr(27) . "[01;33m", chr(27) . "[0m"], + $str)); + } + + return $str; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Css/AttributeTranslator.php b/dompdf/vendor/dompdf/dompdf/src/Css/AttributeTranslator.php new file mode 100644 index 0000000..29a4994 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Css/AttributeTranslator.php @@ -0,0 +1,680 @@ + array ( 'align' => '', ), + 'img' => [ + 'align' => [ + 'bottom' => 'vertical-align: baseline;', + 'middle' => 'vertical-align: middle;', + 'top' => 'vertical-align: top;', + 'left' => 'float: left;', + 'right' => 'float: right;' + ], + 'border' => 'border: %0.2Fpx solid;', + 'height' => '_set_px_height', + 'hspace' => 'padding-left: %1$0.2Fpx; padding-right: %1$0.2Fpx;', + 'vspace' => 'padding-top: %1$0.2Fpx; padding-bottom: %1$0.2Fpx;', + 'width' => '_set_px_width', + ], + 'table' => [ + 'align' => [ + 'left' => 'margin-left: 0; margin-right: auto;', + 'center' => 'margin-left: auto; margin-right: auto;', + 'right' => 'margin-left: auto; margin-right: 0;' + ], + 'bgcolor' => 'background-color: %s;', + 'border' => '_set_table_border', + 'cellpadding' => '_set_table_cellpadding', //'border-spacing: %0.2F; border-collapse: separate;', + 'cellspacing' => '_set_table_cellspacing', + 'frame' => [ + 'void' => 'border-style: none;', + 'above' => 'border-top-style: solid;', + 'below' => 'border-bottom-style: solid;', + 'hsides' => 'border-left-style: solid; border-right-style: solid;', + 'vsides' => 'border-top-style: solid; border-bottom-style: solid;', + 'lhs' => 'border-left-style: solid;', + 'rhs' => 'border-right-style: solid;', + 'box' => 'border-style: solid;', + 'border' => 'border-style: solid;' + ], + 'rules' => '_set_table_rules', + 'width' => 'width: %s;', + ], + 'hr' => [ + 'align' => '_set_hr_align', // Need to grab width to set 'left' & 'right' correctly + 'noshade' => 'border-style: solid;', + 'size' => '_set_hr_size', //'border-width: %0.2F px;', + 'width' => 'width: %s;', + ], + 'div' => [ + 'align' => 'text-align: %s;', + ], + 'h1' => [ + 'align' => 'text-align: %s;', + ], + 'h2' => [ + 'align' => 'text-align: %s;', + ], + 'h3' => [ + 'align' => 'text-align: %s;', + ], + 'h4' => [ + 'align' => 'text-align: %s;', + ], + 'h5' => [ + 'align' => 'text-align: %s;', + ], + 'h6' => [ + 'align' => 'text-align: %s;', + ], + //TODO: translate more form element attributes + 'input' => [ + 'size' => '_set_input_width' + ], + 'p' => [ + 'align' => 'text-align: %s;', + ], +// 'col' => array( +// 'align' => '', +// 'valign' => '', +// ), +// 'colgroup' => array( +// 'align' => '', +// 'valign' => '', +// ), + 'tbody' => [ + 'align' => '_set_table_row_align', + 'valign' => '_set_table_row_valign', + ], + 'td' => [ + 'align' => 'text-align: %s;', + 'bgcolor' => '_set_background_color', + 'height' => 'height: %s;', + 'nowrap' => 'white-space: nowrap;', + 'valign' => 'vertical-align: %s;', + 'width' => 'width: %s;', + ], + 'tfoot' => [ + 'align' => '_set_table_row_align', + 'valign' => '_set_table_row_valign', + ], + 'th' => [ + 'align' => 'text-align: %s;', + 'bgcolor' => '_set_background_color', + 'height' => 'height: %s;', + 'nowrap' => 'white-space: nowrap;', + 'valign' => 'vertical-align: %s;', + 'width' => 'width: %s;', + ], + 'thead' => [ + 'align' => '_set_table_row_align', + 'valign' => '_set_table_row_valign', + ], + 'tr' => [ + 'align' => '_set_table_row_align', + 'bgcolor' => '_set_table_row_bgcolor', + 'valign' => '_set_table_row_valign', + ], + 'body' => [ + 'background' => 'background-image: url(%s);', + 'bgcolor' => '_set_background_color', + 'link' => '_set_body_link', + 'text' => '_set_color', + ], + 'br' => [ + 'clear' => 'clear: %s;', + ], + 'basefont' => [ + 'color' => '_set_color', + 'face' => 'font-family: %s;', + 'size' => '_set_basefont_size', + ], + 'font' => [ + 'color' => '_set_color', + 'face' => 'font-family: %s;', + 'size' => '_set_font_size', + ], + 'dir' => [ + 'compact' => 'margin: 0.5em 0;', + ], + 'dl' => [ + 'compact' => 'margin: 0.5em 0;', + ], + 'menu' => [ + 'compact' => 'margin: 0.5em 0;', + ], + 'ol' => [ + 'compact' => 'margin: 0.5em 0;', + 'start' => 'counter-reset: -dompdf-default-counter %d;', + 'type' => '_set_list_style_type', + ], + 'ul' => [ + 'compact' => 'margin: 0.5em 0;', + 'type' => '_set_list_style_type', + ], + 'li' => [ + 'type' => '_set_list_style_type', + 'value' => 'counter-reset: -dompdf-default-counter %d;', + ], + 'pre' => [ + 'width' => 'width: %s;', + ], + ]; + + protected static $_last_basefont_size = 3; + protected static $_font_size_lookup = [ + // For basefont support + -3 => "4pt", + -2 => "5pt", + -1 => "6pt", + 0 => "7pt", + + 1 => "8pt", + 2 => "10pt", + 3 => "12pt", + 4 => "14pt", + 5 => "18pt", + 6 => "24pt", + 7 => "34pt", + + // For basefont support + 8 => "48pt", + 9 => "44pt", + 10 => "52pt", + 11 => "60pt", + ]; + + /** + * @param Frame $frame + */ + static function translate_attributes(Frame $frame) + { + $node = $frame->get_node(); + $tag = $node->nodeName; + + if (!isset(self::$__ATTRIBUTE_LOOKUP[$tag])) { + return; + } + + $valid_attrs = self::$__ATTRIBUTE_LOOKUP[$tag]; + $attrs = $node->attributes; + $style = rtrim($node->getAttribute(self::$_style_attr), "; "); + if ($style != "") { + $style .= ";"; + } + + foreach ($attrs as $attr => $attr_node) { + if (!isset($valid_attrs[$attr])) { + continue; + } + + $value = $attr_node->value; + + $target = $valid_attrs[$attr]; + + // Look up $value in $target, if $target is an array: + if (is_array($target)) { + if (isset($target[$value])) { + $style .= " " . self::_resolve_target($node, $target[$value], $value); + } + } else { + // otherwise use target directly + $style .= " " . self::_resolve_target($node, $target, $value); + } + } + + if (!is_null($style)) { + $style = ltrim($style); + $node->setAttribute(self::$_style_attr, $style); + } + } + + /** + * @param \DOMNode $node + * @param string $target + * @param string $value + * + * @return string + */ + protected static function _resolve_target(\DOMNode $node, $target, $value) + { + if ($target[0] === "_") { + return self::$target($node, $value); + } + + return $value ? sprintf($target, $value) : ""; + } + + /** + * @param \DOMElement $node + * @param string $new_style + */ + static function append_style(\DOMElement $node, $new_style) + { + $style = rtrim($node->getAttribute(self::$_style_attr), ";"); + $style .= $new_style; + $style = ltrim($style, ";"); + $node->setAttribute(self::$_style_attr, $style); + } + + /** + * @param \DOMNode $node + * + * @return \DOMNodeList|\DOMElement[] + */ + protected static function get_cell_list(\DOMNode $node) + { + $xpath = new \DOMXpath($node->ownerDocument); + + switch ($node->nodeName) { + default: + case "table": + $query = "tr/td | thead/tr/td | tbody/tr/td | tfoot/tr/td | tr/th | thead/tr/th | tbody/tr/th | tfoot/tr/th"; + break; + + case "tbody": + case "tfoot": + case "thead": + $query = "tr/td | tr/th"; + break; + + case "tr": + $query = "td | th"; + break; + } + + return $xpath->query($query, $node); + } + + /** + * @param string $value + * + * @return string + */ + protected static function _get_valid_color($value) + { + if (preg_match('/^#?([0-9A-F]{6})$/i', $value, $matches)) { + $value = "#$matches[1]"; + } + + return $value; + } + + /** + * @param \DOMElement $node + * @param string $value + * + * @return string + */ + protected static function _set_color(\DOMElement $node, $value) + { + $value = self::_get_valid_color($value); + + return "color: $value;"; + } + + /** + * @param \DOMElement $node + * @param string $value + * + * @return string + */ + protected static function _set_background_color(\DOMElement $node, $value) + { + $value = self::_get_valid_color($value); + + return "background-color: $value;"; + } + + protected static function _set_px_width(\DOMElement $node, string $value): string + { + $v = trim($value); + + if (Helpers::is_percent($v)) { + return sprintf("width: %s;", $v); + } + + if (is_numeric(mb_substr($v, 0, 1))) { + return sprintf("width: %spx;", (float) $v); + } + + return ""; + } + + protected static function _set_px_height(\DOMElement $node, string $value): string + { + $v = trim($value); + + if (Helpers::is_percent($v)) { + return sprintf("height: %s;", $v); + } + + if (is_numeric(mb_substr($v, 0, 1))) { + return sprintf("height: %spx;", (float) $v); + } + + return ""; + } + + /** + * @param \DOMElement $node + * @param string $value + * + * @return null + */ + protected static function _set_table_cellpadding(\DOMElement $node, $value) + { + $cell_list = self::get_cell_list($node); + + foreach ($cell_list as $cell) { + self::append_style($cell, "; padding: {$value}px;"); + } + + return null; + } + + /** + * @param \DOMElement $node + * @param string $value + * + * @return string + */ + protected static function _set_table_border(\DOMElement $node, $value) + { + return "border-width: $value" . "px;"; + } + + /** + * @param \DOMElement $node + * @param string $value + * + * @return string + */ + protected static function _set_table_cellspacing(\DOMElement $node, $value) + { + $style = rtrim($node->getAttribute(self::$_style_attr), ";"); + + if ($value == 0) { + $style .= "; border-collapse: collapse;"; + } else { + $style .= "; border-spacing: {$value}px; border-collapse: separate;"; + } + + return ltrim($style, ";"); + } + + /** + * @param \DOMElement $node + * @param string $value + * + * @return null|string + */ + protected static function _set_table_rules(\DOMElement $node, $value) + { + $new_style = "; border-collapse: collapse;"; + + switch ($value) { + case "none": + $new_style .= "border-style: none;"; + break; + + case "groups": + // FIXME: unsupported + return null; + + case "rows": + $new_style .= "border-style: solid none solid none; border-width: 1px; "; + break; + + case "cols": + $new_style .= "border-style: none solid none solid; border-width: 1px; "; + break; + + case "all": + $new_style .= "border-style: solid; border-width: 1px; "; + break; + + default: + // Invalid value + return null; + } + + $cell_list = self::get_cell_list($node); + + foreach ($cell_list as $cell) { + $style = $cell->getAttribute(self::$_style_attr); + $style .= $new_style; + $cell->setAttribute(self::$_style_attr, $style); + } + + $style = rtrim($node->getAttribute(self::$_style_attr), ";"); + $style .= "; border-collapse: collapse; "; + + return ltrim($style, "; "); + } + + /** + * @param \DOMElement $node + * @param string $value + * + * @return string + */ + protected static function _set_hr_size(\DOMElement $node, $value) + { + $style = rtrim($node->getAttribute(self::$_style_attr), ";"); + $style .= "; border-width: " . max(0, $value - 2) . "; "; + + return ltrim($style, "; "); + } + + /** + * @param \DOMElement $node + * @param string $value + * + * @return null|string + */ + protected static function _set_hr_align(\DOMElement $node, $value) + { + $style = rtrim($node->getAttribute(self::$_style_attr), ";"); + $width = $node->getAttribute("width"); + + if ($width == "") { + $width = "100%"; + } + + $remainder = 100 - (float)rtrim($width, "% "); + + switch ($value) { + case "left": + $style .= "; margin-right: $remainder %;"; + break; + + case "right": + $style .= "; margin-left: $remainder %;"; + break; + + case "center": + $style .= "; margin-left: auto; margin-right: auto;"; + break; + + default: + return null; + } + + return ltrim($style, "; "); + } + + /** + * @param \DOMElement $node + * @param string $value + * + * @return null|string + */ + protected static function _set_input_width(\DOMElement $node, $value) + { + if (empty($value)) { return null; } + + if ($node->hasAttribute("type") && in_array(strtolower($node->getAttribute("type")), ["text","password"])) { + return sprintf("width: %Fem", (((int)$value * .65)+2)); + } else { + return sprintf("width: %upx;", (int)$value); + } + } + + /** + * @param \DOMElement $node + * @param string $value + * + * @return null + */ + protected static function _set_table_row_align(\DOMElement $node, $value) + { + $cell_list = self::get_cell_list($node); + + foreach ($cell_list as $cell) { + self::append_style($cell, "; text-align: $value;"); + } + + return null; + } + + /** + * @param \DOMElement $node + * @param string $value + * + * @return null + */ + protected static function _set_table_row_valign(\DOMElement $node, $value) + { + $cell_list = self::get_cell_list($node); + + foreach ($cell_list as $cell) { + self::append_style($cell, "; vertical-align: $value;"); + } + + return null; + } + + /** + * @param \DOMElement $node + * @param string $value + * + * @return null + */ + protected static function _set_table_row_bgcolor(\DOMElement $node, $value) + { + $cell_list = self::get_cell_list($node); + $value = self::_get_valid_color($value); + + foreach ($cell_list as $cell) { + self::append_style($cell, "; background-color: $value;"); + } + + return null; + } + + /** + * @param \DOMElement $node + * @param string $value + * + * @return null + */ + protected static function _set_body_link(\DOMElement $node, $value) + { + $a_list = $node->getElementsByTagName("a"); + $value = self::_get_valid_color($value); + + foreach ($a_list as $a) { + self::append_style($a, "; color: $value;"); + } + + return null; + } + + /** + * @param \DOMElement $node + * @param string $value + * + * @return null + */ + protected static function _set_basefont_size(\DOMElement $node, $value) + { + // FIXME: ? we don't actually set the font size of anything here, just + // the base size for later modification by tags. + self::$_last_basefont_size = $value; + + return null; + } + + /** + * @param \DOMElement $node + * @param string $value + * + * @return string + */ + protected static function _set_font_size(\DOMElement $node, $value) + { + $style = $node->getAttribute(self::$_style_attr); + + if ($value[0] === "-" || $value[0] === "+") { + $value = self::$_last_basefont_size + (int)$value; + } + + if (isset(self::$_font_size_lookup[$value])) { + $style .= "; font-size: " . self::$_font_size_lookup[$value] . ";"; + } else { + $style .= "; font-size: $value;"; + } + + return ltrim($style, "; "); + } + + protected static function _set_list_style_type(\DOMElement $node, string $value): string + { + $v = trim($value); + + switch ($v) { + case "1": + $type = "decimal"; + break; + case "a": + $type = "lower-alpha"; + break; + case "A": + $type = "upper-alpha"; + break; + case "i": + $type = "lower-roman"; + break; + case "I": + $type = "upper-roman"; + break; + default: + $type = $v; + break; + } + + return "list-style-type: $type;"; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Css/Color.php b/dompdf/vendor/dompdf/dompdf/src/Css/Color.php new file mode 100644 index 0000000..d92d67d --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Css/Color.php @@ -0,0 +1,339 @@ + "F0F8FF", + "antiquewhite" => "FAEBD7", + "aqua" => "00FFFF", + "aquamarine" => "7FFFD4", + "azure" => "F0FFFF", + "beige" => "F5F5DC", + "bisque" => "FFE4C4", + "black" => "000000", + "blanchedalmond" => "FFEBCD", + "blue" => "0000FF", + "blueviolet" => "8A2BE2", + "brown" => "A52A2A", + "burlywood" => "DEB887", + "cadetblue" => "5F9EA0", + "chartreuse" => "7FFF00", + "chocolate" => "D2691E", + "coral" => "FF7F50", + "cornflowerblue" => "6495ED", + "cornsilk" => "FFF8DC", + "crimson" => "DC143C", + "cyan" => "00FFFF", + "darkblue" => "00008B", + "darkcyan" => "008B8B", + "darkgoldenrod" => "B8860B", + "darkgray" => "A9A9A9", + "darkgreen" => "006400", + "darkgrey" => "A9A9A9", + "darkkhaki" => "BDB76B", + "darkmagenta" => "8B008B", + "darkolivegreen" => "556B2F", + "darkorange" => "FF8C00", + "darkorchid" => "9932CC", + "darkred" => "8B0000", + "darksalmon" => "E9967A", + "darkseagreen" => "8FBC8F", + "darkslateblue" => "483D8B", + "darkslategray" => "2F4F4F", + "darkslategrey" => "2F4F4F", + "darkturquoise" => "00CED1", + "darkviolet" => "9400D3", + "deeppink" => "FF1493", + "deepskyblue" => "00BFFF", + "dimgray" => "696969", + "dimgrey" => "696969", + "dodgerblue" => "1E90FF", + "firebrick" => "B22222", + "floralwhite" => "FFFAF0", + "forestgreen" => "228B22", + "fuchsia" => "FF00FF", + "gainsboro" => "DCDCDC", + "ghostwhite" => "F8F8FF", + "gold" => "FFD700", + "goldenrod" => "DAA520", + "gray" => "808080", + "green" => "008000", + "greenyellow" => "ADFF2F", + "grey" => "808080", + "honeydew" => "F0FFF0", + "hotpink" => "FF69B4", + "indianred" => "CD5C5C", + "indigo" => "4B0082", + "ivory" => "FFFFF0", + "khaki" => "F0E68C", + "lavender" => "E6E6FA", + "lavenderblush" => "FFF0F5", + "lawngreen" => "7CFC00", + "lemonchiffon" => "FFFACD", + "lightblue" => "ADD8E6", + "lightcoral" => "F08080", + "lightcyan" => "E0FFFF", + "lightgoldenrodyellow" => "FAFAD2", + "lightgray" => "D3D3D3", + "lightgreen" => "90EE90", + "lightgrey" => "D3D3D3", + "lightpink" => "FFB6C1", + "lightsalmon" => "FFA07A", + "lightseagreen" => "20B2AA", + "lightskyblue" => "87CEFA", + "lightslategray" => "778899", + "lightslategrey" => "778899", + "lightsteelblue" => "B0C4DE", + "lightyellow" => "FFFFE0", + "lime" => "00FF00", + "limegreen" => "32CD32", + "linen" => "FAF0E6", + "magenta" => "FF00FF", + "maroon" => "800000", + "mediumaquamarine" => "66CDAA", + "mediumblue" => "0000CD", + "mediumorchid" => "BA55D3", + "mediumpurple" => "9370DB", + "mediumseagreen" => "3CB371", + "mediumslateblue" => "7B68EE", + "mediumspringgreen" => "00FA9A", + "mediumturquoise" => "48D1CC", + "mediumvioletred" => "C71585", + "midnightblue" => "191970", + "mintcream" => "F5FFFA", + "mistyrose" => "FFE4E1", + "moccasin" => "FFE4B5", + "navajowhite" => "FFDEAD", + "navy" => "000080", + "oldlace" => "FDF5E6", + "olive" => "808000", + "olivedrab" => "6B8E23", + "orange" => "FFA500", + "orangered" => "FF4500", + "orchid" => "DA70D6", + "palegoldenrod" => "EEE8AA", + "palegreen" => "98FB98", + "paleturquoise" => "AFEEEE", + "palevioletred" => "DB7093", + "papayawhip" => "FFEFD5", + "peachpuff" => "FFDAB9", + "peru" => "CD853F", + "pink" => "FFC0CB", + "plum" => "DDA0DD", + "powderblue" => "B0E0E6", + "purple" => "800080", + "red" => "FF0000", + "rosybrown" => "BC8F8F", + "royalblue" => "4169E1", + "saddlebrown" => "8B4513", + "salmon" => "FA8072", + "sandybrown" => "F4A460", + "seagreen" => "2E8B57", + "seashell" => "FFF5EE", + "sienna" => "A0522D", + "silver" => "C0C0C0", + "skyblue" => "87CEEB", + "slateblue" => "6A5ACD", + "slategray" => "708090", + "slategrey" => "708090", + "snow" => "FFFAFA", + "springgreen" => "00FF7F", + "steelblue" => "4682B4", + "tan" => "D2B48C", + "teal" => "008080", + "thistle" => "D8BFD8", + "tomato" => "FF6347", + "turquoise" => "40E0D0", + "violet" => "EE82EE", + "wheat" => "F5DEB3", + "white" => "FFFFFF", + "whitesmoke" => "F5F5F5", + "yellow" => "FFFF00", + "yellowgreen" => "9ACD32", + ]; + + /** + * @param array|string|null $color + * @return array|string|null + */ + static function parse($color) + { + if ($color === null) { + return null; + } + + if (is_array($color)) { + // Assume the array has the right format... + // FIXME: should/could verify this. + return $color; + } + + static $cache = []; + + $color = strtolower($color); + + if (isset($cache[$color])) { + return $cache[$color]; + } + + if ($color === "transparent") { + return $cache[$color] = $color; + } + + if (isset(self::$cssColorNames[$color])) { + return $cache[$color] = self::getArray(self::$cssColorNames[$color]); + } + + // https://www.w3.org/TR/css-color-4/#hex-notation + if (mb_substr($color, 0, 1) === "#") { + $length = mb_strlen($color); + $alpha = 1.0; + + // #rgb format + if ($length === 4) { + return $cache[$color] = self::getArray($color[1] . $color[1] . $color[2] . $color[2] . $color[3] . $color[3]); + } + + // #rgba format + if ($length === 5) { + if (\ctype_xdigit($color[4])) { + $alpha = round(hexdec($color[4] . $color[4])/255, 2); + } + return $cache[$color] = self::getArray($color[1] . $color[1] . $color[2] . $color[2] . $color[3] . $color[3], $alpha); + } + + // #rrggbb format + if ($length === 7) { + return $cache[$color] = self::getArray(mb_substr($color, 1, 6)); + } + + // #rrggbbaa format + if ($length === 9) { + if (\ctype_xdigit(mb_substr($color, 7, 2))) { + $alpha = round(hexdec(mb_substr($color, 7, 2))/255, 2); + } + return $cache[$color] = self::getArray(mb_substr($color, 1, 6), $alpha); + } + + return null; + } + + // rgb( r g b [/α] ) / rgb( r,g,b[,α] ) format and alias rgba() + // https://www.w3.org/TR/css-color-4/#rgb-functions + if (mb_substr($color, 0, 4) === "rgb(" || mb_substr($color, 0, 5) === "rgba(") { + $i = mb_strpos($color, "("); + $j = mb_strpos($color, ")"); + + // Bad color value + if ($i === false || $j === false) { + return null; + } + + $value_decl = trim(mb_substr($color, $i + 1, $j - $i - 1)); + + if (mb_strpos($value_decl, ",") === false) { + // Space-separated values syntax `r g b` or `r g b / α` + $parts = preg_split("/\s*\/\s*/", $value_decl); + $triplet = preg_split("/\s+/", $parts[0]); + $alpha = $parts[1] ?? 1.0; + } else { + // Comma-separated values syntax `r, g, b` or `r, g, b, α` + $parts = preg_split("/\s*,\s*/", $value_decl); + $triplet = array_slice($parts, 0, 3); + $alpha = $parts[3] ?? 1.0; + } + + if (count($triplet) !== 3) { + return null; + } + + // Parse alpha value + if (Helpers::is_percent($alpha)) { + $alpha = (float) $alpha / 100; + } else { + $alpha = (float) $alpha; + } + + $alpha = max(0.0, min($alpha, 1.0)); + + foreach ($triplet as &$c) { + if (Helpers::is_percent($c)) { + $c = round((float) $c * 2.55); + } + } + + return $cache[$color] = self::getArray(vsprintf("%02X%02X%02X", $triplet), $alpha); + } + + // cmyk( c,m,y,k ) format + // http://www.w3.org/TR/css3-gcpm/#cmyk-colors + if (mb_substr($color, 0, 5) === "cmyk(") { + $i = mb_strpos($color, "("); + $j = mb_strpos($color, ")"); + + // Bad color value + if ($i === false || $j === false) { + return null; + } + + $values = explode(",", mb_substr($color, $i + 1, $j - $i - 1)); + + if (count($values) != 4) { + return null; + } + + $values = array_map(function ($c) { + return min(1.0, max(0.0, floatval(trim($c)))); + }, $values); + + return $cache[$color] = self::getArray($values); + } + + // Invalid or unsupported color format + return null; + } + + /** + * @param array|string $color + * @param float $alpha + * @return array + */ + static function getArray($color, $alpha = 1.0) + { + $c = [null, null, null, null, "alpha" => $alpha, "hex" => null]; + + if (is_array($color)) { + $c = $color; + $c["c"] = $c[0]; + $c["m"] = $c[1]; + $c["y"] = $c[2]; + $c["k"] = $c[3]; + $c["alpha"] = $alpha; + $c["hex"] = "cmyk($c[0],$c[1],$c[2],$c[3])"; + } else { + if (\ctype_xdigit($color) === false || mb_strlen($color) !== 6) { + // invalid color value ... expected 6-character hex + return $c; + } + $c[0] = hexdec(mb_substr($color, 0, 2)) / 0xff; + $c[1] = hexdec(mb_substr($color, 2, 2)) / 0xff; + $c[2] = hexdec(mb_substr($color, 4, 2)) / 0xff; + $c["r"] = $c[0]; + $c["g"] = $c[1]; + $c["b"] = $c[2]; + $c["alpha"] = $alpha; + $c["hex"] = sprintf("#%s%02X", $color, round($alpha * 255)); + } + + return $c; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Css/Content/Attr.php b/dompdf/vendor/dompdf/dompdf/src/Css/Content/Attr.php new file mode 100644 index 0000000..6a227dd --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Css/Content/Attr.php @@ -0,0 +1,26 @@ +attribute = $attribute; + } + + public function equals(ContentPart $other): bool + { + return $other instanceof self + && $other->attribute === $this->attribute; + } + + public function __toString(): string + { + return "attr($this->attribute)"; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Css/Content/CloseQuote.php b/dompdf/vendor/dompdf/dompdf/src/Css/Content/CloseQuote.php new file mode 100644 index 0000000..88c4af4 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Css/Content/CloseQuote.php @@ -0,0 +1,10 @@ +name = $name; + $this->style = $style; + } + + public function equals(ContentPart $other): bool + { + return $other instanceof self + && $other->name === $this->name + && $other->style === $this->style; + } + + public function __toString(): string + { + return "counter($this->name, $this->style)"; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Css/Content/Counters.php b/dompdf/vendor/dompdf/dompdf/src/Css/Content/Counters.php new file mode 100644 index 0000000..30ca018 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Css/Content/Counters.php @@ -0,0 +1,40 @@ +name = $name; + $this->string = $string; + $this->style = $style; + } + + public function equals(ContentPart $other): bool + { + return $other instanceof self + && $other->name === $this->name + && $other->string === $this->string + && $other->style === $this->style; + } + + public function __toString(): string + { + return "counters($this->name, \"$this->string\", $this->style)"; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Css/Content/NoCloseQuote.php b/dompdf/vendor/dompdf/dompdf/src/Css/Content/NoCloseQuote.php new file mode 100644 index 0000000..2041105 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Css/Content/NoCloseQuote.php @@ -0,0 +1,10 @@ +string = $string; + } + + public function equals(ContentPart $other): bool + { + return $other instanceof self + && $other->string === $this->string; + } + + public function __toString(): string + { + return '"' . $this->string . '"'; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Css/Content/Url.php b/dompdf/vendor/dompdf/dompdf/src/Css/Content/Url.php new file mode 100644 index 0000000..d1ca5a2 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Css/Content/Url.php @@ -0,0 +1,26 @@ +url = $url; + } + + public function equals(ContentPart $other): bool + { + return $other instanceof self + && $other->url === $this->url; + } + + public function __toString(): string + { + return "url(\"" . str_replace("\"", "\\\"", $this->url) . "\")"; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Css/Style.php b/dompdf/vendor/dompdf/dompdf/src/Css/Style.php new file mode 100644 index 0000000..aa575ac --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Css/Style.php @@ -0,0 +1,4631 @@ +margin_top = 10.0; + * echo $style->margin_top; // Returns `10.0` + * ``` + * + * To declare a property from a string, use {@link Style::set_prop()}: + * + * ``` + * $style->set_prop("margin_top", "1em"); + * echo $style->get_specified("margin_top"); // Returns `1em` + * echo $style->margin_top; // Returns `12.0`, assuming the default font size + * ``` + * + * Actual CSS parsing is performed in the {@link Stylesheet} class. + * + * @property string $azimuth + * @property string $background_attachment + * @property array|string $background_color + * @property string $background_image Image URL or `none` + * @property string $background_image_resolution + * @property array $background_position Pair of `[x, y]`, each value being a length in pt or a percentage value + * @property string $background_repeat + * @property array|string $background_size `cover`, `contain`, or `[width, height]`, each being a length, percentage, or `auto` + * @property string $border_collapse + * @property string $border_color Only use for setting all sides to the same color + * @property float[] $border_spacing Pair of `[horizontal, vertical]` spacing + * @property string $border_style Only use for setting all sides to the same style + * @property array|string $border_top_color + * @property array|string $border_right_color + * @property array|string $border_bottom_color + * @property array|string $border_left_color + * @property string $border_top_style Valid border style + * @property string $border_right_style Valid border style + * @property string $border_bottom_style Valid border style + * @property string $border_left_style Valid border style + * @property float $border_top_width Length in pt + * @property float $border_right_width Length in pt + * @property float $border_bottom_width Length in pt + * @property float $border_left_width Length in pt + * @property string $border_width Only use for setting all sides to the same width + * @property float|string $border_bottom_left_radius Radius in pt or a percentage value + * @property float|string $border_bottom_right_radius Radius in pt or a percentage value + * @property float|string $border_top_left_radius Radius in pt or a percentage value + * @property float|string $border_top_right_radius Radius in pt or a percentage value + * @property string $border_radius Only use for setting all corners to the same radius + * @property float|string $bottom Length in pt, a percentage value, or `auto` + * @property string $caption_side + * @property string $clear + * @property string $clip + * @property array|string $color + * @property ContentPart[]|string $content List of content components, `normal`, or `none` + * @property array|string $counter_increment Array defining the counters to increment or `none` + * @property array|string $counter_reset Array defining the counters to reset or `none` + * @property string $cue_after + * @property string $cue_before + * @property string $cue + * @property string $cursor + * @property string $direction + * @property string $display + * @property string $elevation + * @property string $empty_cells + * @property string $float + * @property string $font_family + * @property float $font_size Length in pt + * @property string $font_style `normal`, `italic`, or `oblique` + * @property string $font_variant + * @property int $font_weight Number in the range [1, 1000] + * @property float|string $height Length in pt, a percentage value, or `auto` + * @property string $image_resolution + * @property string $inset Only use for setting all box insets to the same length + * @property float|string $left Length in pt, a percentage value, or `auto` + * @property float $letter_spacing Length in pt + * @property float $line_height Length in pt + * @property string $list_style_image Image URL or `none` + * @property string $list_style_position `inside` or `outside` + * @property string $list_style_type + * @property float|string $margin_right Length in pt, a percentage value, or `auto` + * @property float|string $margin_left Length in pt, a percentage value, or `auto` + * @property float|string $margin_top Length in pt, a percentage value, or `auto` + * @property float|string $margin_bottom Length in pt, a percentage value, or `auto` + * @property string $margin Only use for setting all sides to the same length + * @property float|string $max_height Length in pt, a percentage value, or `none` + * @property float|string $max_width Length in pt, a percentage value, or `none` + * @property float|string $min_height Length in pt, a percentage value, or `auto` + * @property float|string $min_width Length in pt, a percentage value, or `auto` + * @property float $opacity Number in the range [0, 1] + * @property int $orphans + * @property array|string $outline_color + * @property string $outline_style Valid border style, except for `hidden` + * @property float $outline_width Length in pt + * @property float $outline_offset Length in pt + * @property string $overflow + * @property string $overflow_wrap + * @property float|string $padding_top Length in pt or a percentage value + * @property float|string $padding_right Length in pt or a percentage value + * @property float|string $padding_bottom Length in pt or a percentage value + * @property float|string $padding_left Length in pt or a percentage value + * @property string $padding Only use for setting all sides to the same length + * @property string $page_break_after + * @property string $page_break_before + * @property string $page_break_inside + * @property string $pause_after + * @property string $pause_before + * @property string $pause + * @property string $pitch_range + * @property string $pitch + * @property string $play_during + * @property string $position + * @property array|string $quotes List of quote pairs, or `none` + * @property string $richness + * @property float|string $right Length in pt, a percentage value, or `auto` + * @property float[]|string $size Pair of `[width, height]` or `auto` + * @property string $speak_header + * @property string $speak_numeral + * @property string $speak_punctuation + * @property string $speak + * @property string $speech_rate + * @property string $src + * @property string $stress + * @property string $table_layout + * @property string $text_align + * @property string $text_decoration + * @property float|string $text_indent Length in pt or a percentage value + * @property string $text_transform + * @property float|string $top Length in pt, a percentage value, or `auto` + * @property array $transform List of transforms + * @property array $transform_origin Triplet of `[x, y, z]`, each value being a length in pt, or a percentage value for x and y + * @property string $unicode_bidi + * @property string $unicode_range + * @property string $vertical_align + * @property string $visibility + * @property string $voice_family + * @property string $volume + * @property string $white_space + * @property int $widows + * @property float|string $width Length in pt, a percentage value, or `auto` + * @property string $word_break + * @property float $word_spacing Length in pt + * @property int|string $z_index Integer value or `auto` + * @property string $_dompdf_keep + * + * @package dompdf + */ +class Style +{ + protected const CSS_IDENTIFIER = "-?[_a-zA-Z]+[_a-zA-Z0-9-]*"; + protected const CSS_INTEGER = "[+-]?\d+"; + protected const CSS_NUMBER = "[+-]?\d*\.?\d+(?:[eE][+-]?\d+)?"; + protected const CSS_STRING = "" . + '"(?>(?:\\\\["]|[^"])*)(?(?:\\\\[']|[^'])*)(? true, + // Comparison Functions + "min" => true, + "max" => true, + "clamp" => true, + // Stepped Value Functions + "round" => true, // Not fully supported + "mod" => true, + "rem" => true, + // Trigonometric Functions + "sin" => true, + "cos" => true, + "tan" => true, + "asin" => true, + "acos" => true, + "atan" => true, + "atan2" => true, + // Exponential Functions + "pow" => true, + "sqrt" => true, + "hypot" => true, + "log" => true, + "exp" => true, + // Sign-Related Functions + "abs" => true, + "sign" => true + ]; + + /** + * https://www.w3.org/TR/css-values-3/#custom-idents + */ + protected const CUSTOM_IDENT_FORBIDDEN = ["inherit", "initial", "unset", "default"]; + + /** + * Default font size, in points. + * + * @var float + */ + public static $default_font_size = 12; + + /** + * Default line height, as a fraction of the font size. + * + * @var float + */ + public static $default_line_height = 1.2; + + /** + * Default "absolute" font sizes relative to the default font-size + * https://www.w3.org/TR/css-fonts-3/#absolute-size-value + * + * @var array + */ + public static $font_size_keywords = [ + "xx-small" => 0.6, // 3/5 + "x-small" => 0.75, // 3/4 + "small" => 0.889, // 8/9 + "medium" => 1, // 1 + "large" => 1.2, // 6/5 + "x-large" => 1.5, // 3/2 + "xx-large" => 2.0, // 2/1 + ]; + + /** + * List of valid text-align keywords. + */ + public const TEXT_ALIGN_KEYWORDS = ["left", "right", "center", "justify"]; + + /** + * List of valid vertical-align keywords. + */ + public const VERTICAL_ALIGN_KEYWORDS = ["baseline", "bottom", "middle", + "sub", "super", "text-bottom", "text-top", "top"]; + + /** + * List of all block-level (outer) display types. + * * https://www.w3.org/TR/css-display-3/#display-type + * * https://www.w3.org/TR/css-display-3/#block-level + */ + public const BLOCK_LEVEL_TYPES = [ + "block", + // "flow-root", + "list-item", + // "flex", + // "grid", + "table" + ]; + + /** + * List of all inline-level (outer) display types. + * * https://www.w3.org/TR/css-display-3/#display-type + * * https://www.w3.org/TR/css-display-3/#inline-level + */ + public const INLINE_LEVEL_TYPES = [ + "inline", + "inline-block", + // "inline-flex", + // "inline-grid", + "inline-table" + ]; + + /** + * List of all table-internal (outer) display types. + * * https://www.w3.org/TR/css-display-3/#layout-specific-display + */ + public const TABLE_INTERNAL_TYPES = [ + "table-row-group", + "table-header-group", + "table-footer-group", + "table-row", + "table-cell", + "table-column-group", + "table-column", + "table-caption" + ]; + + /** + * List of all inline (inner) display types. + */ + public const INLINE_TYPES = ["inline"]; + + /** + * List of all block (inner) display types. + */ + public const BLOCK_TYPES = ["block", "inline-block", "table-cell", "list-item"]; + + /** + * List of all table (inner) display types. + */ + public const TABLE_TYPES = ["table", "inline-table"]; + + /** + * Lookup table for valid display types. Initially computed from the + * different constants. + * + * @var array + */ + protected static $valid_display_types = []; + + /** + * List of all positioned types. + */ + public const POSITIONED_TYPES = ["relative", "absolute", "fixed"]; + + /** + * List of valid border styles. + */ + public const BORDER_STYLES = [ + "none", "hidden", + "dotted", "dashed", "solid", + "double", "groove", "ridge", "inset", "outset" + ]; + + /** + * List of valid outline-style values. + * Same as the border styles, except `auto` is allowed, `hidden` is not. + * + * @link https://www.w3.org/TR/css-ui-4/#typedef-outline-line-style + */ + protected const OUTLINE_STYLES = [ + "auto", "none", + "dotted", "dashed", "solid", + "double", "groove", "ridge", "inset", "outset" + ]; + + /** + * Map of CSS shorthand properties and their corresponding sub-properties. + * The order of the sub-properties is relevant for the fallback getter, + * which is used in case no specific getter method is defined. + * + * @var array + */ + protected static $_props_shorthand = [ + "background" => [ + "background_image", + "background_position", + "background_size", + "background_repeat", + // "background_origin", + // "background_clip", + "background_attachment", + "background_color" + ], + "border" => [ + "border_top_width", + "border_right_width", + "border_bottom_width", + "border_left_width", + "border_top_style", + "border_right_style", + "border_bottom_style", + "border_left_style", + "border_top_color", + "border_right_color", + "border_bottom_color", + "border_left_color" + ], + "border_top" => [ + "border_top_width", + "border_top_style", + "border_top_color" + ], + "border_right" => [ + "border_right_width", + "border_right_style", + "border_right_color" + ], + "border_bottom" => [ + "border_bottom_width", + "border_bottom_style", + "border_bottom_color" + ], + "border_left" => [ + "border_left_width", + "border_left_style", + "border_left_color" + ], + "border_width" => [ + "border_top_width", + "border_right_width", + "border_bottom_width", + "border_left_width" + ], + "border_style" => [ + "border_top_style", + "border_right_style", + "border_bottom_style", + "border_left_style" + ], + "border_color" => [ + "border_top_color", + "border_right_color", + "border_bottom_color", + "border_left_color" + ], + "border_radius" => [ + "border_top_left_radius", + "border_top_right_radius", + "border_bottom_right_radius", + "border_bottom_left_radius" + ], + "font" => [ + "font_family", + "font_size", + // "font_stretch", + "font_style", + "font_variant", + "font_weight", + "line_height" + ], + "inset" => [ + "top", + "right", + "bottom", + "left" + ], + "list_style" => [ + "list_style_image", + "list_style_position", + "list_style_type" + ], + "margin" => [ + "margin_top", + "margin_right", + "margin_bottom", + "margin_left" + ], + "padding" => [ + "padding_top", + "padding_right", + "padding_bottom", + "padding_left" + ], + "outline" => [ + "outline_width", + "outline_style", + "outline_color" + ] + ]; + + /** + * Maps legacy property names to actual property names. + * + * @var array + */ + protected static $_props_alias = [ + "word_wrap" => "overflow_wrap", + "_dompdf_background_image_resolution" => "background_image_resolution", + "_dompdf_image_resolution" => "image_resolution", + "_webkit_transform" => "transform", + "_webkit_transform_origin" => "transform_origin" + ]; + + /** + * Default style values. + * + * @link https://www.w3.org/TR/CSS21/propidx.html + * + * @var array + */ + protected static $_defaults = null; + + /** + * Lookup table for properties that inherit by default. + * + * @link https://www.w3.org/TR/CSS21/propidx.html + * + * @var array + */ + protected static $_inherited = [ + "azimuth" => true, + "background_image_resolution" => true, + "border_collapse" => true, + "border_spacing" => true, + "caption_side" => true, + "color" => true, + "cursor" => true, + "direction" => true, + "elevation" => true, + "empty_cells" => true, + "font_family" => true, + "font_size" => true, + "font_style" => true, + "font_variant" => true, + "font_weight" => true, + "font" => true, + "image_resolution" => true, + "letter_spacing" => true, + "line_height" => true, + "list_style_image" => true, + "list_style_position" => true, + "list_style_type" => true, + "list_style" => true, + "orphans" => true, + "overflow_wrap" => true, + "pitch_range" => true, + "pitch" => true, + "quotes" => true, + "richness" => true, + "speak_header" => true, + "speak_numeral" => true, + "speak_punctuation" => true, + "speak" => true, + "speech_rate" => true, + "stress" => true, + "text_align" => true, + "text_indent" => true, + "text_transform" => true, + "visibility" => true, + "voice_family" => true, + "volume" => true, + "white_space" => true, + "widows" => true, + "word_break" => true, + "word_spacing" => true + ]; + + /** + * @var array + */ + protected static $_dependency_map = [ + "border_top_style" => [ + "border_top_width" + ], + "border_bottom_style" => [ + "border_bottom_width" + ], + "border_left_style" => [ + "border_left_width" + ], + "border_right_style" => [ + "border_right_width" + ], + "direction" => [ + "text_align" + ], + "font_size" => [ + "background_position", + "background_size", + "border_top_width", + "border_right_width", + "border_bottom_width", + "border_left_width", + "border_top_left_radius", + "border_top_right_radius", + "border_bottom_right_radius", + "border_bottom_left_radius", + "inset", + "letter_spacing", + "line_height", + "margin_top", + "margin_right", + "margin_bottom", + "margin_left", + "outline_width", + "outline_offset", + "padding_top", + "padding_right", + "padding_bottom", + "padding_left", + "word_spacing", + "width", + "height", + "min-width", + "min-height", + "max-width", + "max-height" + ], + "float" => [ + "display" + ], + "position" => [ + "display" + ], + "outline_style" => [ + "outline_width" + ] + ]; + + /** + * Lookup table for dependent properties. Initially computed from the + * dependency map. + * + * @var array + */ + protected static $_dependent_props = []; + + /** + * Caches method_exists result + * + * @var array + */ + protected static $_methods_cache = []; + + /** + * The stylesheet this style belongs to + * + * @var Stylesheet + */ + protected $_stylesheet; + + /** + * Media queries attached to the style + * + * This is a two-dimensional array where the first dimension represents + * the media query grouping (logic-or) and the second dimension the + * media queries within the grouping. + * + * The structure of the actual query element is: + * - media query feature + * - media query value or condition + * - media query operator (e.g., not) + * + * @var array + */ + protected $_media_queries; + + /** + * Properties set by an `!important` declaration. + * + * @var array + */ + protected $_important_props = []; + + /** + * Specified (or declared) values of the CSS properties. + * + * https://www.w3.org/TR/css-cascade-3/#value-stages + * + * @var array + */ + protected $_props = []; + + /** + * Used to track which CSS property were set directly versus + * those set via shorthand property + * + * @var array + */ + protected $_props_specified = []; + + /** + * Computed values of the CSS properties. + * + * @var array + */ + protected $_props_computed = []; + + /** + * Used values of the CSS properties. + * + * @var array + */ + protected $_props_used = []; + + /** + * Marks properties with non-final used values that should be cleared on + * style reset. + * + * @var array + */ + protected $non_final_used = []; + + /** + * Used to track CSS property assignment entry/exit in order to watch + * for circular dependencies. + * + * @var array + */ + protected $_prop_stack = []; + + /** + * Used to track CSS variable resolution entry/exit in order to watch + * for circular dependencies. + * + * @var array + */ + protected $_var_stack = []; + + /** + * Style of the parent element in document tree. + * + * @var Style + */ + protected $parent_style; + + /** + * @var Frame|null + */ + protected $_frame; + + /** + * The origin of the style + * + * @var int + */ + protected $_origin = Stylesheet::ORIG_AUTHOR; + + /** + * The computed bottom spacing + * + * @var float|string|null + */ + private $_computed_bottom_spacing = null; + + /** + * @var bool|null + */ + private $has_border_radius_cache = null; + + /** + * @var array|null + */ + private $resolved_border_radius = null; + + /** + * @var FontMetrics + */ + private $fontMetrics; + + /** + * @param Stylesheet $stylesheet The stylesheet the style is associated with. + * @param int $origin + */ + public function __construct(Stylesheet $stylesheet, int $origin = Stylesheet::ORIG_AUTHOR) + { + $this->fontMetrics = $stylesheet->getFontMetrics(); + + $this->_stylesheet = $stylesheet; + $this->_media_queries = []; + $this->_origin = $origin; + $this->parent_style = null; + + if (!isset(self::$_defaults)) { + + // Shorthand + $d =& self::$_defaults; + + // All CSS 2.1 properties, and their default values + // Some properties are specified with their computed value for + // efficiency; this only works if the computed value is not + // dependent on another property + $d["azimuth"] = "center"; + $d["background_attachment"] = "scroll"; + $d["background_color"] = "transparent"; + $d["background_image"] = "none"; + $d["background_image_resolution"] = "normal"; + $d["background_position"] = [0.0, 0.0]; + $d["background_repeat"] = "repeat"; + $d["background"] = ""; + $d["border_collapse"] = "separate"; + $d["border_color"] = ""; + $d["border_spacing"] = [0.0, 0.0]; + $d["border_style"] = ""; + $d["border_top"] = ""; + $d["border_right"] = ""; + $d["border_bottom"] = ""; + $d["border_left"] = ""; + $d["border_top_color"] = "currentcolor"; + $d["border_right_color"] = "currentcolor"; + $d["border_bottom_color"] = "currentcolor"; + $d["border_left_color"] = "currentcolor"; + $d["border_top_style"] = "none"; + $d["border_right_style"] = "none"; + $d["border_bottom_style"] = "none"; + $d["border_left_style"] = "none"; + $d["border_top_width"] = "medium"; + $d["border_right_width"] = "medium"; + $d["border_bottom_width"] = "medium"; + $d["border_left_width"] = "medium"; + $d["border_width"] = ""; + $d["border_bottom_left_radius"] = 0.0; + $d["border_bottom_right_radius"] = 0.0; + $d["border_top_left_radius"] = 0.0; + $d["border_top_right_radius"] = 0.0; + $d["border_radius"] = ""; + $d["border"] = ""; + $d["bottom"] = "auto"; + $d["caption_side"] = "top"; + $d["clear"] = "none"; + $d["clip"] = "auto"; + $d["color"] = "#000000"; + $d["content"] = "normal"; + $d["counter_increment"] = "none"; + $d["counter_reset"] = "none"; + $d["cue_after"] = "none"; + $d["cue_before"] = "none"; + $d["cue"] = ""; + $d["cursor"] = "auto"; + $d["direction"] = "ltr"; + $d["display"] = "inline"; + $d["elevation"] = "level"; + $d["empty_cells"] = "show"; + $d["float"] = "none"; + $d["font_family"] = $stylesheet->get_dompdf()->getOptions()->getDefaultFont(); + $d["font_size"] = "medium"; + $d["font_style"] = "normal"; + $d["font_variant"] = "normal"; + $d["font_weight"] = 400; + $d["font"] = ""; + $d["height"] = "auto"; + $d["image_resolution"] = "normal"; + $d["inset"] = ""; + $d["left"] = "auto"; + $d["letter_spacing"] = "normal"; + $d["line_height"] = "normal"; + $d["list_style_image"] = "none"; + $d["list_style_position"] = "outside"; + $d["list_style_type"] = "disc"; + $d["list_style"] = ""; + $d["margin_right"] = 0.0; + $d["margin_left"] = 0.0; + $d["margin_top"] = 0.0; + $d["margin_bottom"] = 0.0; + $d["margin"] = ""; + $d["max_height"] = "none"; + $d["max_width"] = "none"; + $d["min_height"] = "auto"; + $d["min_width"] = "auto"; + $d["orphans"] = 2; + $d["outline_color"] = "currentcolor"; // "invert" special color is not supported + $d["outline_style"] = "none"; + $d["outline_width"] = "medium"; + $d["outline_offset"] = 0.0; + $d["outline"] = ""; + $d["overflow"] = "visible"; + $d["overflow_wrap"] = "normal"; + $d["padding_top"] = 0.0; + $d["padding_right"] = 0.0; + $d["padding_bottom"] = 0.0; + $d["padding_left"] = 0.0; + $d["padding"] = ""; + $d["page_break_after"] = "auto"; + $d["page_break_before"] = "auto"; + $d["page_break_inside"] = "auto"; + $d["pause_after"] = "0"; + $d["pause_before"] = "0"; + $d["pause"] = ""; + $d["pitch_range"] = "50"; + $d["pitch"] = "medium"; + $d["play_during"] = "auto"; + $d["position"] = "static"; + $d["quotes"] = "auto"; + $d["richness"] = "50"; + $d["right"] = "auto"; + $d["size"] = "auto"; // @page + $d["speak_header"] = "once"; + $d["speak_numeral"] = "continuous"; + $d["speak_punctuation"] = "none"; + $d["speak"] = "normal"; + $d["speech_rate"] = "medium"; + $d["stress"] = "50"; + $d["table_layout"] = "auto"; + $d["text_align"] = ""; + $d["text_decoration"] = "none"; + $d["text_indent"] = 0.0; + $d["text_transform"] = "none"; + $d["top"] = "auto"; + $d["unicode_bidi"] = "normal"; + $d["vertical_align"] = "baseline"; + $d["visibility"] = "visible"; + $d["voice_family"] = ""; + $d["volume"] = "medium"; + $d["white_space"] = "normal"; + $d["widows"] = 2; + $d["width"] = "auto"; + $d["word_break"] = "normal"; + $d["word_spacing"] = "normal"; + $d["z_index"] = "auto"; + + // CSS3 + $d["opacity"] = 1.0; + $d["background_size"] = ["auto", "auto"]; + $d["transform"] = []; + $d["transform_origin"] = ["50%", "50%", 0.0]; + + // for @font-face + $d["src"] = ""; + $d["unicode_range"] = ""; + + // vendor-prefixed properties + $d["_dompdf_keep"] = ""; + + // Compute dependent props from dependency map + foreach (self::$_dependency_map as $props) { + foreach ($props as $prop) { + self::$_dependent_props[$prop] = true; + } + } + + // Compute valid display-type lookup table + self::$valid_display_types = [ + "none" => true, + "-dompdf-br" => true, + "-dompdf-image" => true, + "-dompdf-list-bullet" => true, + "-dompdf-page" => true + ]; + foreach (self::BLOCK_LEVEL_TYPES as $val) { + self::$valid_display_types[$val] = true; + } + foreach (self::INLINE_LEVEL_TYPES as $val) { + self::$valid_display_types[$val] = true; + } + foreach (self::TABLE_INTERNAL_TYPES as $val) { + self::$valid_display_types[$val] = true; + } + } + } + + /** + * Clear all non-final used values. + */ + public function reset(): void + { + foreach (array_keys($this->non_final_used) as $prop) { + unset($this->_props_used[$prop]); + } + + $this->non_final_used = []; + } + + /** + * @param array $media_queries + */ + public function set_media_queries(array $media_queries): void + { + $this->_media_queries = $media_queries; + } + + /** + * @return array + */ + public function get_media_queries(): array + { + return $this->_media_queries; + } + + /** + * @param Frame $frame + */ + public function set_frame(Frame $frame): void + { + $this->_frame = $frame; + } + + /** + * @return Frame|null + */ + public function get_frame(): ?Frame + { + return $this->_frame; + } + + /** + * @param int $origin + */ + public function set_origin(int $origin): void + { + $this->_origin = $origin; + } + + /** + * @return int + */ + public function get_origin(): int + { + return $this->_origin; + } + + /** + * Returns the {@link Stylesheet} the style is associated with. + * + * @return Stylesheet + */ + public function get_stylesheet(): Stylesheet + { + return $this->_stylesheet; + } + + public function is_custom_property(string $prop): bool + { + return \substr($prop, 0, 2) === "--"; + } + + public function is_absolute(): bool + { + $position = $this->__get("position"); + return $position === "absolute" || $position === "fixed"; + } + + public function is_in_flow(): bool + { + $float = $this->__get("float"); + return $float === "none" && !$this->is_absolute(); + } + + /** + * Converts any CSS length value into an absolute length in points. + * + * length_in_pt() takes a single length (e.g. '1em') or an array of + * lengths and returns an absolute length. If an array is passed, then + * the return value is the sum of all elements. If any of the lengths + * provided are "auto" or "none" then that value is returned. + * + * If a reference size is not provided, the current font size is used. + * + * @param float|string|array $length The numeric length (or string measurement) or array of lengths to resolve. + * @param float|null $ref_size An absolute reference size to resolve percentage lengths. + * + * @return float|string + */ + public function length_in_pt($length, ?float $ref_size = null) + { + $font_size = $this->__get("font_size"); + $ref_size = $ref_size ?? $font_size; + + if (!\is_array($length)) { + $length = [$length]; + } + + $ret = 0.0; + + foreach ($length as $l) { + if ($l === "auto" || $l === "none") { + return $l; + } + + // Assume numeric values are already in points + if (is_numeric($l)) { + $ret += (float) $l; + continue; + } + + $val = $this->single_length_in_pt((string) $l, $ref_size, $font_size); + $ret += $val ?? 0; + } + + return $ret; + } + + /** + * Convert a length declaration to pt. + * + * @param string $l The length declaration. + * @param float $ref_size Reference size for percentage declarations. + * @param float|null $font_size Font size for resolving font-size relative units. + * + * @return float|null The length in pt, or `null` for invalid declarations. + */ + protected function single_length_in_pt(string $l, float $ref_size = 0, ?float $font_size = null): ?float + { + static $cache = []; + + $font_size = $font_size ?? $this->__get("font_size"); + $dpi = $this->_stylesheet->get_dompdf()->getOptions()->getDpi(); + + $key = "$l/$dpi/$ref_size/$font_size"; + + if (\array_key_exists($key, $cache)) { + return $cache[$key]; + } + + $number = self::CSS_NUMBER; + $pattern = "/^($number)([a-zA-Z%]*)?$/"; + + if (!preg_match($pattern, $l, $matches)) { + $ident = self::CSS_IDENTIFIER; + $pattern = "/^($ident)\(.*\)$/i"; + if (preg_match($pattern, $l)) { + $value = $this->evaluate_func($this->parse_func($l), $ref_size, $font_size); + return $cache[$key] = $value; + } + return null; + } + + $v = (float) $matches[1]; + $unit = strtolower($matches[2]); + + if ($unit === "") { + // Legacy support for unitless values, not covered by spec. Might + // want to restrict this to unitless `0` in the future + $value = $v; + } + + elseif ($unit === "%") { + $value = $v / 100 * $ref_size; + } + + elseif ($unit === "px") { + $value = ($v * 72) / $dpi; + } + + elseif ($unit === "pt") { + $value = $v; + } + + elseif ($unit === "rem") { + $tree = $this->_stylesheet->get_dompdf()->getTree(); + $root_style = $tree !== null ? $tree->get_root()->get_style() : null; + $root_font_size = $root_style === null || $root_style === $this + ? $font_size + : $root_style->__get("font_size"); + $value = $v * $root_font_size; + + // Skip caching if the root style is not available yet, as to avoid + // incorrectly cached values if the root font size is different from + // the default + if ($root_style === null) { + return $value; + } + } + + elseif ($unit === "em") { + $value = $v * $font_size; + } + + elseif ($unit === "cm") { + $value = $v * 72 / 2.54; + } + + elseif ($unit === "mm") { + $value = $v * 72 / 25.4; + } + + elseif ($unit === "ex") { + // FIXME: em:ex ratio? + $value = $v * $font_size / 2; + } + + elseif ($unit === "in") { + $value = $v * 72; + } + + elseif ($unit === "pc") { + $value = $v * 12; + } + + else { + // Invalid or unsupported declaration + $value = null; + } + + return $cache[$key] = $value; + } + + /** + * Shunting-yard Algorithm + * @param string $expr infix expression + * @return array + */ + private function parse_func(string $expr): array + { + if (substr_count($expr, '(') !== substr_count($expr, ')')) { + return []; + } + + $expr = str_replace(['(', ')', '*', '/', ','], [' ( ', ' ) ', ' * ', ' / ', ' , '], $expr); + $expr = trim(preg_replace('/\s+/', ' ', $expr)); + + if ($expr === '') { + return []; + } + + $precedence = ['*' => 3, '/' => 3, '+' => 2, '-' => 2, ',' => 1]; + + $opStack = []; + $queue = []; + + $parts = explode(' ', $expr); + + foreach ($parts as $part) { + if ($part === '(') { + $opStack[] = $part; + } elseif (\array_key_exists(strtolower($part), self::CSS_MATH_FUNCTIONS)) { + $opStack[] = strtolower($part); + } elseif ($part === ')') { + while (\count($opStack) > 0 && end($opStack) !== '(' && !\array_key_exists(end($opStack), self::CSS_MATH_FUNCTIONS)) { + $queue[] = array_pop($opStack); + } + if (end($opStack) === '(') { + array_pop($opStack); + } + if (\count($opStack) > 0 && \array_key_exists(end($opStack), self::CSS_MATH_FUNCTIONS)) { + $queue[] = array_pop($opStack); + } + } elseif (\array_key_exists($part, $precedence)) { + while (\count($opStack) > 0 && end($opStack) !== '(' && $precedence[end($opStack)] >= $precedence[$part]) { + $queue[] = array_pop($opStack); + } + $opStack[] = $part; + } else { + $queue[] = $part; + } + } + + while (\count($opStack) > 0) { + $queue[] = array_pop($opStack); + } + + return $queue; + } + + /** + * Reverse Polish Notation + * @param array $rpn + * @param float $ref_size + * @param float|null $font_size + * @return float|null + */ + private function evaluate_func(array $rpn, float $ref_size = 0, ?float $font_size = null): ?float + { + if (\count($rpn) === 0) { + return null; + } + + $ops = ['*', '/', '+', '-', ',']; + + $stack = []; + + foreach ($rpn as $part) { + if (\array_key_exists($part, self::CSS_MATH_FUNCTIONS)) { + $argv = array_pop($stack); + if (!is_array($argv)) { + $argv = [$argv]; + } + $argc = \count($argv); + switch ($part) { + case 'abs': + case 'acos': + case 'asin': + case 'atan': + case 'cos': + case 'exp': + case 'sin': + case 'sqrt': + case 'tan': + if ($argc !== 1) { + return null; + } + $stack[] = call_user_func_array($part, $argv); + break; + case 'atan2': + case 'hypot': + case 'pow': + if ($argc !== 2) { + return null; + } + $stack[] = call_user_func_array($part, $argv); + break; + case 'log': + if ($argc === 1) { + $stack[] = log($argv[0]); + } elseif ($argc === 2) { + $stack[] = log($argv[0], $argv[1]); + } else { + return null; + } + break; + case 'max': + $stack[] = max($argv); + break; + case 'min': + $stack[] = min($argv); + break; + case 'mod': + if ($argc !== 2 || $argv[1] === 0.0) { + return null; + } + if ($argv[1] > 0) { + $stack[] = $argv[0] - floor($argv[0] / $argv[1]) * $argv[1]; + } else { + $stack[] = $argv[0] - ceil($argv[0] * -1 / $argv[1]) * $argv[1] * -1 ; + } + break; + case 'rem': + if ($argc !== 2 || $argv[1] === 0.0) { + return null; + } + $stack[] = $argv[0] - (intval($argv[0] / $argv[1]) * $argv[1]); + break; + case 'round': + if ($argc !== 2 || $argv[1] === 0.0) { + return null; + } + if ($argv[0] >= 0) { + $stack[] = round($argv[0] / $argv[1], 0, PHP_ROUND_HALF_UP) * $argv[1]; + } else { + $stack[] = round($argv[0] / $argv[1], 0, PHP_ROUND_HALF_DOWN) * $argv[1]; + } + break; + case 'calc': + if ($argc !== 1) { + return null; + } + $stack[] = $argv[0]; + break; + case 'clamp': + if ($argc !== 3) { + return null; + } + $stack[] = max($argv[0], min($argv[1], $argv[2])); + break; + case 'sign': + if ($argc !== 1) { + return null; + } + $stack[] = $argv[0] == 0 ? 0.0 : ($argv[0] / abs($argv[0])); + break; + default: + return null; + } + } elseif (\in_array($part, $ops, true)) { + $rightValue = array_pop($stack); + $leftValue = array_pop($stack); + if ($rightValue === null || $leftValue === null) { + return null; + } + switch ($part) { + case '*': + $stack[] = $leftValue * $rightValue; + break; + case '/': + if ($rightValue === 0.0) { + return null; + } + $stack[] = $leftValue / $rightValue; + break; + case '+': + $stack[] = $leftValue + $rightValue; + break; + case '-': + $stack[] = $leftValue - $rightValue; + break; + case ',': + if (is_array($leftValue)) { + $leftValue[] = $rightValue; + $stack[] = $leftValue; + } else { + $stack[] = [$leftValue, $rightValue]; + } + break; + } + } else { + $val = $this->single_length_in_pt($part, $ref_size, $font_size); + if ($val === null) { + return null; + } + $stack[] = $val; + } + } + + if (\count($stack) > 1) { + return null; + } + + return floatval(end($stack)); + } + + /** + * Resolves the actual values for used CSS custom properties. + * + * This function receives the whole content of the var() function, which + * can also include a fallback value. + */ + private function parse_var($matches) { + $variable = is_array($matches) ? $matches[1] : $matches; + + if (\in_array($variable, $this->_var_stack, true)) { + return null; + } + array_push($this->_var_stack, $variable); + + // Split property name and an optional fallback value. + [$custom_prop, $fallback] = explode(',', $variable, 2) + ['', '']; + $fallback = trim($fallback); + + // Try to retrieve the custom property value, or use the fallback value + // if the value could not be resolved. + $value = $this->computed($custom_prop) ?? $fallback; + + // If the resolved value also has vars in it, resolve again. + $pattern = self::CSS_VAR; + $value = preg_replace_callback( + "/$pattern/", + [$this, "parse_var"], + $value); + + array_pop($this->_var_stack); + return $value ?: null; + } + + /** + * Resolve inherited property values using the provided parent style or the + * default values, in case no parent style exists. + * + * https://www.w3.org/TR/css-cascade-3/#inheriting + * + * @param Style|null $parent + */ + public function inherit(?Style $parent = null): void + { + $this->parent_style = $parent; + + // Clear the computed font size, as it might depend on the parent + // font size + unset($this->_props_computed["font_size"]); + unset($this->_props_used["font_size"]); + + if ($parent) { + // For properties that inherit by default: When the cascade did + // not result in a value, inherit the parent value. Inheritance + // is handled via the specific sub-properties for shorthands. Custom + // properties (variables) are selected by the -- prefix. + foreach ($parent->_props as $prop => $val) { + if ( + !isset($this->_props[$prop]) + && ( + isset(self::$_inherited[$prop]) + || $this->is_custom_property($prop) + ) + ) { + $parent_val = $parent->computed($prop); + + if ($this->is_custom_property($prop)) { + $this->set_prop($prop, $parent_val); + } else { + $this->_props[$prop] = $parent_val; + $this->_props_computed[$prop] = $parent_val; + $this->_props_used[$prop] = null; + } + } + } + } + + foreach ($this->_props as $prop => $val) { + if ($val === "inherit") { + if ($parent && isset($parent->_props[$prop])) { + $parent_val = $parent->computed($prop); + + if ($this->is_custom_property($prop)) { + $this->set_prop($prop, $parent_val); + } else { + $this->_props[$prop] = $parent_val; + $this->_props_computed[$prop] = $parent_val; + $this->_props_used[$prop] = null; + } + } else { + if ($this->is_custom_property($prop)) { + $this->set_prop($prop, "unset"); + } else { + // Parent prop not set, use default + $this->_props[$prop] = self::$_defaults[$prop]; + unset($this->_props_computed[$prop]); + unset($this->_props_used[$prop]); + } + } + } + } + } + + /** + * Override properties in this style with those in $style + * + * @param Style $style + */ + public function merge(Style $style): void + { + foreach ($style->_props as $prop => $val) { + $important = isset($style->_important_props[$prop]); + + // `!important` declarations take precedence over normal ones + if (!$important && isset($this->_important_props[$prop])) { + continue; + } + + if ($important) { + $this->_important_props[$prop] = true; + } + + if ($this->is_custom_property($prop)) { + $this->set_prop($prop, $val, $important); + } else { + $this->_props[$prop] = $val; + } + + // Copy an existing computed value only for non-dependent + // properties; otherwise it may be invalid for the current style + if (!isset(self::$_dependent_props[$prop]) + && \array_key_exists($prop, $style->_props_computed) + ) { + $this->_props_computed[$prop] = $style->_props_computed[$prop]; + $this->_props_used[$prop] = null; + } else { + unset($this->_props_computed[$prop]); + unset($this->_props_used[$prop]); + } + + if (\array_key_exists($prop, $style->_props_specified)) { + $this->_props_specified[$prop] = true; + } + } + + // re-evalutate CSS variables + foreach (array_keys($this->_props) as $prop) { + if (!$this->is_custom_property($prop)) { + continue; + } + $this->set_prop($prop, $this->_props[$prop], isset($this->_important_props[$prop])); + } + } + + /** + * Clear information about important declarations after the style has been + * finalized during stylesheet loading. + */ + public function clear_important(): void + { + $this->_important_props = []; + } + + /** + * Clear border-radius and bottom-spacing cache as necessary when a given + * property is set. + * + * @param string $prop The property that is set. + */ + protected function clear_cache(string $prop): void + { + // Clear border-radius cache on setting any border-radius + // property + if ($prop === "border_top_left_radius" + || $prop === "border_top_right_radius" + || $prop === "border_bottom_left_radius" + || $prop === "border_bottom_right_radius" + ) { + $this->has_border_radius_cache = null; + $this->resolved_border_radius = null; + } + + // Clear bottom-spacing cache if necessary. Border style can + // disable/enable border calculations + if ($prop === "margin_bottom" + || $prop === "padding_bottom" + || $prop === "border_bottom_width" + || $prop === "border_bottom_style" + ) { + $this->_computed_bottom_spacing = null; + } + } + + /** + * Set a style property from a value declaration. + * + * Setting `$clear_dependencies` to `false` is useful for saving a bit of + * unnecessary work while loading stylesheets. + * + * @param string $prop The property to set. + * @param mixed $val The value declaration or computed value. + * @param bool $important Whether the declaration is important. + * @param bool $clear_dependencies Whether to clear computed values of dependent properties. + */ + public function set_prop(string $prop, $val, bool $important = false, bool $clear_dependencies = true): void + { + // Skip some checks for CSS custom properties. + if (!$this->is_custom_property($prop)) { + + $prop = str_replace("-", "_", $prop); + + // Legacy property aliases + if (isset(self::$_props_alias[$prop])) { + $prop = self::$_props_alias[$prop]; + } + + if (!isset(self::$_defaults[$prop])) { + global $_dompdf_warnings; + $_dompdf_warnings[] = "'$prop' is not a recognized CSS property."; + return; + } + } + $this->_props_specified[$prop] = true; + + // Trim declarations unconditionally, but only lower-case for comparison + // with the general keywords. Properties must handle case-insensitive + // comparisons individually + if (\is_string($val)) { + $val = trim($val); + $lower = strtolower($val); + + if ($lower === "initial" || $lower === "inherit" || $lower === "unset") { + $val = $lower; + } + } + + if (isset(self::$_props_shorthand[$prop])) { + // Shorthand properties directly set their respective sub-properties + // https://www.w3.org/TR/css-cascade-3/#shorthand + if ($val === "initial" || $val === "inherit" || $val === "unset") { + foreach (self::$_props_shorthand[$prop] as $sub_prop) { + $this->set_prop($sub_prop, $val, $important, $clear_dependencies); + } + } else { + $method = "_set_$prop"; + + // Resolve the CSS custom property value(s). + $pattern = self::CSS_VAR; + + // Always set the specified value for properties that use CSS variables + // so that an invalid initial value does not prevent re-computation later. + $this->_props[$prop] = $val; + + //TODO: we shouldn't need to parse this twice + preg_match_all("/$pattern/", $val, $matches, PREG_SET_ORDER); + foreach ($matches as $match) { + if ($this->parse_var($match) === null) { + // unset specified as for specific prop under expectation it will be overridden + foreach (self::$_props_shorthand[$prop] as $sub_prop) { + unset($this->_props_specified[$sub_prop]); + } + return; + } + } + $val = preg_replace_callback( + "/$pattern/", + [$this, "parse_var"], + $val); + + if (!isset(self::$_methods_cache[$method])) { + self::$_methods_cache[$method] = method_exists($this, $method); + } + + if (self::$_methods_cache[$method]) { + $values = $this->$method($val); + + if ($values === []) { + return; + } + + // Each missing sub-property is assigned its initial value + // https://www.w3.org/TR/css-cascade-3/#shorthand + foreach (self::$_props_shorthand[$prop] as $sub_prop) { + $sub_val = $values[$sub_prop] ?? self::$_defaults[$sub_prop]; + $this->set_prop($sub_prop, $sub_val, $important, $clear_dependencies); + unset($this->_props_specified[$sub_prop]); + } + } + } + } else { + // Legacy support for `word-break: break-word` + // https://www.w3.org/TR/css-text-3/#valdef-word-break-break-word + if ($prop === "word_break" + && \is_string($val) && strcasecmp($val, "break-word") === 0 + ) { + $val = "normal"; + $this->set_prop("overflow_wrap", "anywhere", $important, $clear_dependencies); + } + + // `!important` declarations take precedence over normal ones + if (!$important && isset($this->_important_props[$prop])) { + return; + } + + if ($important) { + $this->_important_props[$prop] = true; + } + + // https://www.w3.org/TR/css-cascade-3/#inherit-initial + if ($val === "unset") { + $val = isset(self::$_inherited[$prop]) || $this->is_custom_property($prop) ? "inherit" : "initial"; + } + + // https://www.w3.org/TR/css-cascade-3/#valdef-all-initial + if ($val === "initial" && !$this->is_custom_property($prop)) { + $val = self::$_defaults[$prop]; + } + + // Always set the specified value for properties that use CSS variables + // so that an invalid initial value does not prevent re-computation later. + if (\is_string($val) && \preg_match("/" . self::CSS_VAR . "/", $val)) { + $this->_props[$prop] = $val; + } + + $computed = $this->compute_prop($prop, $val); + + // Skip invalid declarations + if ($computed === null) { + return; + } + + $this->_props[$prop] = $val; + $this->_props_computed[$prop] = $computed; + $this->_props_used[$prop] = null; + + //TODO: this should be a directed dependency map + if ($this->is_custom_property($prop) && !\in_array($prop, $this->_prop_stack, true)) { + array_push($this->_prop_stack, $prop); + $specified_props = array_filter($this->_props, function($key) { + return \array_key_exists($key, $this->_props_specified); + }, ARRAY_FILTER_USE_KEY); // copy existing props filtered by those set explicitly before parsing vars + foreach ($specified_props as $specified_prop => $specified_value) { + if (!$this->is_custom_property($specified_prop) || strpos($specified_value, "var($prop") !== false) { + $this->set_prop($specified_prop, $specified_value, isset($this->_important_props[$specified_prop]), true); + if (isset(self::$_props_shorthand[$specified_prop])) { + foreach (self::$_props_shorthand[$specified_prop] as $sub_prop) { + if (\array_key_exists($sub_prop, $specified_props)) { + $this->set_prop($sub_prop, $specified_props[$sub_prop], isset($this->_important_props[$sub_prop]), true); + } + } + } + } + } + array_pop($this->_prop_stack); + } + + if ($clear_dependencies) { + // Clear the computed values of any dependent properties, so + // they can be re-computed + if (isset(self::$_dependency_map[$prop])) { + foreach (self::$_dependency_map[$prop] as $dependent) { + unset($this->_props_computed[$dependent]); + unset($this->_props_used[$dependent]); + } + } + + $this->clear_cache($prop); + } + } + } + + /** + * Get the specified value of a style property. + * + * @param string $prop + * + * @return mixed + * @throws Exception + */ + public function get_specified(string $prop) + { + // Legacy property aliases + if (isset(self::$_props_alias[$prop])) { + $prop = self::$_props_alias[$prop]; + } + + if (!isset(self::$_defaults[$prop]) && !$this->is_custom_property($prop)) { + throw new Exception("'$prop' is not a recognized CSS property."); + } + + return $this->_props[$prop] ?? self::$_defaults[$prop]; + } + + /** + * Set a style property to its final value. + * + * This sets the specified and used value of the style property to the given + * value, meaning the value is not parsed and thus should have a type + * compatible with the property. + * + * If a shorthand property is specified, all of its sub-properties are set + * to the given value. + * + * @param string $prop The property to set. + * @param mixed $val The final value of the property. + * + * @throws Exception + */ + public function __set(string $prop, $val) + { + // Legacy property aliases + if (isset(self::$_props_alias[$prop])) { + $prop = self::$_props_alias[$prop]; + } + + if (!isset(self::$_defaults[$prop]) && !$this->is_custom_property($prop)) { + throw new Exception("'$prop' is not a recognized CSS property."); + } + + if (isset(self::$_props_shorthand[$prop])) { + foreach (self::$_props_shorthand[$prop] as $sub_prop) { + $this->__set($sub_prop, $val); + } + } else { + $this->_props[$prop] = $val; + $this->_props_computed[$prop] = $val; + $this->_props_used[$prop] = $val; + + $this->clear_cache($prop); + } + } + + /** + * Set the used value of a style property. + * + * Used values are cleared on style reset. + * + * If a shorthand property is specified, all of its sub-properties are set + * to the given value. + * + * @param string $prop The property to set. + * @param mixed $val The used value of the property. + * + * @throws Exception + */ + public function set_used(string $prop, $val): void + { + // Legacy property aliases + if (isset(self::$_props_alias[$prop])) { + $prop = self::$_props_alias[$prop]; + } + + if (!isset(self::$_defaults[$prop])) { + throw new Exception("'$prop' is not a recognized CSS property."); + } + + if (isset(self::$_props_shorthand[$prop])) { + foreach (self::$_props_shorthand[$prop] as $sub_prop) { + $this->set_used($sub_prop, $val); + } + } else { + $this->_props_used[$prop] = $val; + $this->non_final_used[$prop] = true; + } + } + + /** + * Get the used or computed value of a style property, depending on whether + * the used value has been determined yet. + * + * @param string $prop + * + * @return mixed + * @throws Exception + */ + public function __get(string $prop) + { + // Legacy property aliases + if (isset(self::$_props_alias[$prop])) { + $prop = self::$_props_alias[$prop]; + } + + if (!isset(self::$_defaults[$prop]) && !$this->is_custom_property($prop)) { + throw new Exception("'$prop' is not a recognized CSS property."); + } + + if (isset($this->_props_used[$prop])) { + return $this->_props_used[$prop]; + } + + $method = "_get_$prop"; + + if (!isset(self::$_methods_cache[$method])) { + self::$_methods_cache[$method] = method_exists($this, $method); + } + + if (isset(self::$_props_shorthand[$prop])) { + // Don't cache shorthand values, always use getter. If no dedicated + // getter exists, use a simple fallback getter concatenating all + // sub-property values + if (self::$_methods_cache[$method]) { + return $this->$method(); + } else { + return implode(" ", array_map(function ($sub_prop) { + $val = $this->__get($sub_prop); + return \is_array($val) ? implode(" ", $val) : $val; + }, self::$_props_shorthand[$prop])); + } + } else { + $computed = $this->computed($prop); + $used = self::$_methods_cache[$method] + ? $this->$method($computed) + : $computed; + + $this->_props_used[$prop] = $used; + return $used; + } + } + + /** + * @param string $prop The property to compute. + * @param mixed $val The value to compute. Non-string values are treated as already computed. + * + * @return mixed The computed value. + */ + protected function compute_prop(string $prop, $val) + { + // During style merge, the parent style is not available yet, so + // temporarily use the initial value for `inherit` properties. The + // keyword is properly resolved during inheritance + if ($val === "inherit" && !$this->is_custom_property($prop)) { + $val = self::$_defaults[$prop]; + } + + // Check for values which are already computed + if (!\is_string($val)) { + return $val; + } + + // Resolve the CSS custom property value(s). + $pattern = self::CSS_VAR; + $val = preg_replace_callback( + "/$pattern/", + [$this, "parse_var"], + $val); + + $method = "_compute_$prop"; + + if (!isset(self::$_methods_cache[$method])) { + self::$_methods_cache[$method] = method_exists($this, $method); + } + + if (self::$_methods_cache[$method]) { + return $this->$method($val); + } elseif ($val !== "") { + return strtolower($val); + } else { + return null; + } + } + + /** + * Get the computed value for the given property. + * + * @param string $prop The property to get the computed value of. + * + * @return mixed The computed value. + */ + protected function computed(string $prop) + { + if (!\array_key_exists($prop, $this->_props_computed)) { + if (!\array_key_exists($prop, $this->_props) && $this->is_custom_property($prop)) { + return null; + } + $val = $this->_props[$prop] ?? self::$_defaults[$prop]; + $computed = $this->compute_prop($prop, $val); + + if ($computed === null) { + if ($this->is_custom_property($prop)) { + return null; + } + $computed = $this->compute_prop($prop, self::$_defaults[$prop]); + } + + $this->_props_computed[$prop] = $computed; + } + + return $this->_props_computed[$prop]; + } + + /** + * @param float $cbw The width of the containing block. + * @return float|string|null + */ + public function computed_bottom_spacing(float $cbw) + { + // Caching the bottom spacing independently of the given width is a bit + // iffy, but should be okay, as the containing block should only + // potentially change after a page break, and the style is reset in that + // case + if ($this->_computed_bottom_spacing !== null) { + return $this->_computed_bottom_spacing; + } + return $this->_computed_bottom_spacing = $this->length_in_pt( + [ + $this->margin_bottom, + $this->padding_bottom, + $this->border_bottom_width + ], + $cbw + ); + } + + /** + * Returns an `array(r, g, b, "r" => r, "g" => g, "b" => b, "alpha" => alpha, "hex" => "#rrggbb")` + * based on the provided CSS color value. + * + * @param string|null $color + * @return array|string|null + */ + public function munge_color($color) + { + return Color::parse($color); + } + + /** + * @return string + */ + public function get_font_family_raw(): string + { + return trim($this->_props["font_family"], " \t\n\r\x0B\"'"); + } + + /** + * @return string[] + */ + public function get_font_family_computed(): array + { + return $this->computed("font_family"); + } + + /** + * Getter for the `font-family` CSS property. + * + * Uses the {@link FontMetrics} class to resolve the font family into an + * actual font file. + * + * @param string[] $computed + * @return string + * + * @throws Exception + * + * @link https://www.w3.org/TR/CSS21/fonts.html#propdef-font-family + */ + protected function _get_font_family($computed): string + { + // TODO: It probably makes sense to perform the font selection outside + // the Style class completely. It is now done primarily in + // `FrameDecorator\Text::apply_font_mapping` + + // Select the appropriate font. First determine the subtype, then check + // the specified font-families for a candidate. + + $fontMetrics = $this->getFontMetrics(); + $weight = $this->__get("font_weight"); + $fontStyle = $this->__get("font_style"); + $subtype = $fontMetrics->getType($weight . ' ' . $fontStyle); + + foreach ($computed as $family) { + $font = $fontMetrics->getFont($family, $subtype); + + if ($font !== null) { + return $font; + } + } + + $font = $fontMetrics->getFont(null, $subtype); + + if ($font !== null) { + return $font; + } + + $specified = implode(", ", $computed); + throw new Exception("Unable to find a suitable font replacement for: '$specified'"); + } + + /** + * @param float $computed + * @return float + * + * @link https://www.w3.org/TR/CSS21/fonts.html#propdef-font-size + */ + protected function _get_font_size($computed) + { + // Computed value may be negative when specified via `calc()` + return max($computed, 0.0); + } + + /** + * @param float|string $computed + * @return float + * + * @link https://www.w3.org/TR/css-text-4/#word-spacing-property + */ + protected function _get_word_spacing($computed) + { + if (\is_float($computed)) { + return $computed; + } + + // Resolve percentage values + $font_size = $this->__get("font_size"); + return $this->single_length_in_pt($computed, $font_size); + } + + /** + * @param float|string $computed + * @return float + * + * @link https://www.w3.org/TR/css-text-4/#letter-spacing-property + */ + protected function _get_letter_spacing($computed) + { + if (\is_float($computed)) { + return $computed; + } + + // Resolve percentage values + $font_size = $this->__get("font_size"); + return $this->single_length_in_pt($computed, $font_size); + } + + /** + * @param float|string $computed + * @return float + * + * @link https://www.w3.org/TR/CSS21/visudet.html#propdef-line-height + */ + protected function _get_line_height($computed) + { + // Lengths have been computed to float, number values to string + if (\is_float($computed)) { + // Computed value may be negative when specified via `calc()` + return max($computed, 0.0); + } + + $font_size = $this->__get("font_size"); + $factor = $computed === "normal" + ? self::$default_line_height + : (float) $computed; + + return $factor * $font_size; + } + + /** + * @param string $computed + * @param bool $current_is_parent + * + * @return array|string + */ + protected function get_color_value($computed, bool $current_is_parent = false) + { + if ($computed === "currentcolor") { + // https://www.w3.org/TR/css-color-4/#resolving-other-colors + if ($current_is_parent) { + // Use the `color` value from the parent for the `color` + // property itself + return isset($this->parent_style) + ? $this->parent_style->__get("color") + : $this->munge_color(self::$_defaults["color"]); + } + + return $this->__get("color"); + } + + return $this->munge_color($computed) ?? "transparent"; + } + + /** + * Returns the color as an array + * + * The array has the following format: + * `array(r, g, b, "r" => r, "g" => g, "b" => b, "alpha" => alpha, "hex" => "#rrggbb")` + * + * @param string $computed + * @return array|string + * + * @link https://www.w3.org/TR/CSS21/colors.html#propdef-color + */ + protected function _get_color($computed) + { + return $this->get_color_value($computed, true); + } + + /** + * Returns the background color as an array + * + * See {@link Style::_get_color()} for format of the color array. + * + * @param string $computed + * @return array|string + * + * @link https://www.w3.org/TR/CSS21/colors.html#propdef-background-color + */ + protected function _get_background_color($computed) + { + return $this->get_color_value($computed); + } + + /** + * Returns the background image URI, or "none" + * + * @param string $computed + * @return string + * + * @link https://www.w3.org/TR/CSS21/colors.html#propdef-background-image + */ + protected function _get_background_image($computed): string + { + return $this->_stylesheet->resolve_url($computed, true); + } + + /** + * Returns the border color as an array + * + * See {@link Style::_get_color()} for format of the color array. + * + * @param string $computed + * @return array|string + * + * @link https://www.w3.org/TR/CSS21/box.html#border-color-properties + */ + protected function _get_border_top_color($computed) + { + return $this->get_color_value($computed); + } + + /** + * @param string $computed + * @return array|string + */ + protected function _get_border_right_color($computed) + { + return $this->get_color_value($computed); + } + + /** + * @param string $computed + * @return array|string + */ + protected function _get_border_bottom_color($computed) + { + return $this->get_color_value($computed); + } + + /** + * @param string $computed + * @return array|string + */ + protected function _get_border_left_color($computed) + { + return $this->get_color_value($computed); + } + + /** + * Return an array of all border properties. + * + * The returned array has the following structure: + * + * ``` + * array("top" => array("width" => [border-width], + * "style" => [border-style], + * "color" => [border-color (array)]), + * "bottom" ... ) + * ``` + * + * @return array + */ + public function get_border_properties(): array + { + return [ + "top" => [ + "width" => $this->__get("border_top_width"), + "style" => $this->__get("border_top_style"), + "color" => $this->__get("border_top_color"), + ], + "bottom" => [ + "width" => $this->__get("border_bottom_width"), + "style" => $this->__get("border_bottom_style"), + "color" => $this->__get("border_bottom_color"), + ], + "right" => [ + "width" => $this->__get("border_right_width"), + "style" => $this->__get("border_right_style"), + "color" => $this->__get("border_right_color"), + ], + "left" => [ + "width" => $this->__get("border_left_width"), + "style" => $this->__get("border_left_style"), + "color" => $this->__get("border_left_color"), + ], + ]; + } + + /** + * Return a single border-side property + * + * @param string $side + * @return string + */ + protected function get_border_side(string $side): string + { + $color = $this->__get("border_{$side}_color"); + + return $this->__get("border_{$side}_width") . " " . + $this->__get("border_{$side}_style") . " " . + (\is_array($color) ? $color["hex"] : $color); + } + + /** + * Return full border properties as a string + * + * Border properties are returned just as specified in CSS: + * `[width] [style] [color]` + * e.g. "1px solid blue" + * + * @return string + * + * @link https://www.w3.org/TR/CSS21/box.html#border-shorthand-properties + */ + protected function _get_border_top(): string + { + return $this->get_border_side("top"); + } + + /** + * @return string + */ + protected function _get_border_right(): string + { + return $this->get_border_side("right"); + } + + /** + * @return string + */ + protected function _get_border_bottom(): string + { + return $this->get_border_side("bottom"); + } + + /** + * @return string + */ + protected function _get_border_left(): string + { + return $this->get_border_side("left"); + } + + public function has_border_radius(): bool + { + if (isset($this->has_border_radius_cache)) { + return $this->has_border_radius_cache; + } + + // Use a fixed ref size here. We don't know the border-box width here + // and font size might be 0. Since we are only interested in whether + // there is any border radius at all, this should do + $tl = (float) $this->length_in_pt($this->border_top_left_radius, 12); + $tr = (float) $this->length_in_pt($this->border_top_right_radius, 12); + $br = (float) $this->length_in_pt($this->border_bottom_right_radius, 12); + $bl = (float) $this->length_in_pt($this->border_bottom_left_radius, 12); + + $this->has_border_radius_cache = $tl + $tr + $br + $bl > 0; + return $this->has_border_radius_cache; + } + + /** + * Get the final border-radius values to use. + * + * Percentage values are resolved relative to the width of the border box. + * The border radius is additionally scaled for the given render box, and + * constrained by its width and height. + * + * @param float[] $border_box The border box of the frame. + * @param float[]|null $render_box The box to resolve the border radius for. + * + * @return float[] A 4-tuple of top-left, top-right, bottom-right, and bottom-left radius. + */ + public function resolve_border_radius( + array $border_box, + ?array $render_box = null + ): array { + $render_box = $render_box ?? $border_box; + $use_cache = $render_box === $border_box; + + if ($use_cache && isset($this->resolved_border_radius)) { + return $this->resolved_border_radius; + } + + [$x, $y, $w, $h] = $border_box; + + // Resolve percentages relative to width, as long as we have no support + // for per-axis radii + $tl = (float) $this->length_in_pt($this->border_top_left_radius, $w); + $tr = (float) $this->length_in_pt($this->border_top_right_radius, $w); + $br = (float) $this->length_in_pt($this->border_bottom_right_radius, $w); + $bl = (float) $this->length_in_pt($this->border_bottom_left_radius, $w); + + if ($tl + $tr + $br + $bl > 0) { + [$rx, $ry, $rw, $rh] = $render_box; + + $t_offset = $y - $ry; + $r_offset = $rx + $rw - $x - $w; + $b_offset = $ry + $rh - $y - $h; + $l_offset = $x - $rx; + + if ($tl > 0) { + $tl = max($tl + ($t_offset + $l_offset) / 2, 0); + } + if ($tr > 0) { + $tr = max($tr + ($t_offset + $r_offset) / 2, 0); + } + if ($br > 0) { + $br = max($br + ($b_offset + $r_offset) / 2, 0); + } + if ($bl > 0) { + $bl = max($bl + ($b_offset + $l_offset) / 2, 0); + } + + if ($tl + $bl > $rh) { + $f = $rh / ($tl + $bl); + $tl = $f * $tl; + $bl = $f * $bl; + } + if ($tr + $br > $rh) { + $f = $rh / ($tr + $br); + $tr = $f * $tr; + $br = $f * $br; + } + if ($tl + $tr > $rw) { + $f = $rw / ($tl + $tr); + $tl = $f * $tl; + $tr = $f * $tr; + } + if ($bl + $br > $rw) { + $f = $rw / ($bl + $br); + $bl = $f * $bl; + $br = $f * $br; + } + } + + $values = [$tl, $tr, $br, $bl]; + + if ($use_cache) { + $this->resolved_border_radius = $values; + } + + return $values; + } + + /** + * Returns the outline color as an array + * + * See {@link Style::_get_color()} for format of the color array. + * + * @param string $computed + * @return array|string + * + * @link https://www.w3.org/TR/css-ui-4/#propdef-outline-color + */ + protected function _get_outline_color($computed) + { + return $this->get_color_value($computed); + } + + /** + * @param string $computed + * @return string + * + * @link https://www.w3.org/TR/css-ui-4/#propdef-outline-style + */ + protected function _get_outline_style($computed): string + { + return $computed === "auto" ? "solid" : $computed; + } + + /** + * Return full outline properties as a string + * + * Outline properties are returned just as specified in CSS: + * `[width] [style] [color]` + * e.g. "1px solid blue" + * + * @return string + * + * @link https://www.w3.org/TR/CSS21/box.html#border-shorthand-properties + */ + protected function _get_outline(): string + { + $color = $this->__get("outline_color"); + + return $this->__get("outline_width") . " " . + $this->__get("outline_style") . " " . + (\is_array($color) ? $color["hex"] : $color); + } + + /** + * Returns the list style image URI, or "none" + * + * @param string $computed + * @return string + * + * @link https://www.w3.org/TR/CSS21/generate.html#propdef-list-style-image + */ + protected function _get_list_style_image($computed): string + { + return $this->_stylesheet->resolve_url($computed, true); + } + + /** + * @param array|string $computed + * @return array|string + * + * @link https://www.w3.org/TR/css-content-3/#quotes + */ + protected function _get_quotes($computed) + { + if ($computed === "auto") { + // TODO: Use typographically appropriate quotes for the current + // language here + return [['"', '"'], ["'", "'"]]; + } + + return $computed; + } + + /*==============================*/ + + /** + * Parse a property value into its components. + * + * @param string $value + * + * @return string[] + */ + protected function parse_property_value(string $value): array + { + $string = self::CSS_STRING; + $ident = self::CSS_IDENTIFIER; + $number = self::CSS_NUMBER; + + $pattern = "/\n" . + "\s* (?$string) |\n" . // String + "\s* (url \( (?> (\\\\[\"'()] | [^\"'()])* ) (? \g | [^\"'()]+ ) | (?-2))* \)) ) |\n" . // Function (with balanced parentheses) + "\s* ($ident) |\n" . // Keyword + "\s* (\#[0-9a-fA-F]*) |\n" . // Hex value + "\s* ($number [a-zA-Z%]*) |\n" . // Number (+ unit/percentage) + "\s* ([\/,;]) \n" . // Delimiter + "/iSx"; + + if (!preg_match_all($pattern, $value, $matches)) { + return []; + } + + return array_map("trim", $matches[0]); + } + + protected function is_color_value(string $val): bool + { + return $val === "currentcolor" + || $val === "transparent" + || isset(Color::$cssColorNames[$val]) + || preg_match("/^#|rgb\(|rgba\(|cmyk\(/", $val); + } + + /** + * @param string $val + * @return string|null + */ + protected function compute_color_value(string $val): ?string + { + // https://www.w3.org/TR/css-color-4/#resolving-other-colors + $val = strtolower($val); + $munged_color = $val !== "currentcolor" + ? $this->munge_color($val) + : $val; + + if ($munged_color === null) { + return null; + } + + return \is_array($munged_color) ? $munged_color["hex"] : $munged_color; + } + + /** + * @param string $val + * @return int|null + */ + protected function compute_integer(string $val): ?int + { + $integer = self::CSS_INTEGER; + return preg_match("/^$integer$/", $val) + ? (int) $val + : null; + } + + /** + * @param string $val + * @return float|null + */ + protected function compute_number(string $val): ?float + { + $number = self::CSS_NUMBER; + return preg_match("/^$number$/", $val) + ? (float) $val + : null; + } + + /** + * @param string $val + * @return float|null + */ + protected function compute_length(string $val): ?float + { + return strpos($val, "%") === false + ? $this->single_length_in_pt($val) + : null; + } + + /** + * @param string $val + * @return float|null + */ + protected function compute_length_positive(string $val): ?float + { + $computed = $this->compute_length($val); + + // Negative non-`calc` values are invalid + if ($computed === null + || ($computed < 0 && !preg_match("/^-?[_a-zA-Z]/", $val)) + ) { + return null; + } + + return $computed; + } + + /** + * @param string $val + * @return float|string|null + */ + protected function compute_length_percentage(string $val) + { + // Compute with a fixed ref size to decide whether percentage values + // are valid + $computed = $this->single_length_in_pt($val, 12); + + if ($computed === null) { + return null; + } + + // Retain valid percentage declarations + return strpos($val, "%") === false ? $computed : $val; + } + + /** + * @param string $val + * @return float|string|null + */ + protected function compute_length_percentage_positive(string $val) + { + // Compute with a fixed ref size to decide whether percentage values + // are valid + $computed = $this->single_length_in_pt($val, 12); + + // Negative non-`calc` values are invalid + if ($computed === null + || ($computed < 0 && !preg_match("/^-?[_a-zA-Z]/", $val)) + ) { + return null; + } + + // Retain valid percentage declarations + return strpos($val, "%") === false ? $computed : $val; + } + + /** + * @param string $val + * @param string $style_prop The corresponding border-/outline-style property. + * + * @return float|null + * + * @link https://www.w3.org/TR/css-backgrounds-3/#typedef-line-width + */ + protected function compute_line_width(string $val, string $style_prop): ?float + { + $val = strtolower($val); + + // Border-width keywords + if ($val === "thin") { + $computed = 0.5; + } elseif ($val === "medium") { + $computed = 1.5; + } elseif ($val === "thick") { + $computed = 2.5; + } else { + $computed = $this->compute_length_positive($val); + } + + if ($computed === null) { + return null; + } + + // Computed width is 0 if the line style is `none` or `hidden` + // https://www.w3.org/TR/css-backgrounds-3/#border-width + // https://www.w3.org/TR/css-ui-4/#outline-width + $lineStyle = $this->__get($style_prop); + $hasLineStyle = $lineStyle !== "none" && $lineStyle !== "hidden"; + + return $hasLineStyle ? $computed : 0.0; + } + + /** + * @param string $val + * @return string|null + */ + protected function compute_border_style(string $val): ?string + { + $val = strtolower($val); + return \in_array($val, self::BORDER_STYLES, true) ? $val : null; + } + + /** + * @param string $val + * @return float|null + * + * @link https://www.w3.org/TR/css3-values/#angles + */ + protected function compute_angle_or_zero(string $val): ?float + { + $number = self::CSS_NUMBER; + $pattern = "/^($number)(deg|grad|rad|turn)?$/i"; + + if (!preg_match($pattern, $val, $matches)) { + return null; + } + + $v = (float) $matches[1]; + $unit = strtolower($matches[2] ?? ""); + + switch ($unit) { + case "deg": + return $v; + case "grad": + return $v * 0.9; + case "rad": + return rad2deg($v); + case "turn": + return $v * 360; + default: + return $v === 0.0 ? $v : null; + } + } + + /** + * Common computation logic for `background-position` and `transform-origin`. + * + * @param string $v1 + * @param string $v2 + * + * @return (float|string|null)[] + */ + protected function computeBackgroundPositionTransformOrigin(string $v1, string $v2): array + { + $x = null; + $y = null; + + switch ($v1) { + case "left": + $x = 0.0; + break; + case "right": + $x = "100%"; + break; + case "top": + $y = 0.0; + break; + case "bottom": + $y = "100%"; + break; + case "center": + if ($v2 === "left" || $v2 === "right") { + $y = "50%"; + } else { + $x = "50%"; + } + break; + default: + $x = $this->compute_length_percentage($v1); + break; + } + + switch ($v2) { + case "left": + $x = 0.0; + break; + case "right": + $x = "100%"; + break; + case "top": + $y = 0.0; + break; + case "bottom": + $y = "100%"; + break; + case "center": + if ($v1 === "top" || $v1 === "bottom") { + $x = "50%"; + } else { + $y = "50%"; + } + break; + default: + $y = $this->compute_length_percentage($v2); + break; + } + + return [$x, $y]; + } + + /** + * @link https://www.w3.org/TR/css-lists-3/#typedef-counter-name + */ + protected function isValidCounterName(string $name): bool + { + return $name !== "none" + && !in_array($name, self::CUSTOM_IDENT_FORBIDDEN, true); + } + + /** + * @link https://www.w3.org/TR/css-counter-styles-3/#typedef-counter-style-name + */ + protected function isValidCounterStyleName(string $name): bool + { + return $name !== "none" + && !in_array($name, self::CUSTOM_IDENT_FORBIDDEN, true); + } + + /** + * Parse a property value with 1 to 4 components into 4 values, as required + * by shorthand properties such as `margin`, `padding`, and `border-radius`. + * + * @param string $prop The shorthand property with exactly 4 sub-properties to handle. + * @param string $value The property value to parse. + * + * @return string[] + */ + protected function set_quad_shorthand(string $prop, string $value): array + { + $v = $this->parse_property_value($value); + + switch (\count($v)) { + case 1: + $values = [$v[0], $v[0], $v[0], $v[0]]; + break; + case 2: + $values = [$v[0], $v[1], $v[0], $v[1]]; + break; + case 3: + $values = [$v[0], $v[1], $v[2], $v[1]]; + break; + case 4: + $values = [$v[0], $v[1], $v[2], $v[3]]; + break; + default: + return []; + } + + return array_combine(self::$_props_shorthand[$prop], $values); + } + + /*======================*/ + + /** + * @link https://www.w3.org/TR/CSS21/visuren.html#display-prop + */ + protected function _compute_display(string $val) + { + $val = strtolower($val); + + // Make sure that common valid, but unsupported display types have an + // appropriate fallback display type + switch ($val) { + case "flow-root": + case "flex": + case "grid": + case "table-caption": + $val = "block"; + break; + case "inline-flex": + case "inline-grid": + $val = "inline-block"; + break; + } + + if (!isset(self::$valid_display_types[$val])) { + return null; + } + + // https://www.w3.org/TR/CSS21/visuren.html#dis-pos-flo + if ($this->is_in_flow()) { + return $val; + } else { + switch ($val) { + case "inline": + case "inline-block": + // case "table-row-group": + // case "table-header-group": + // case "table-footer-group": + // case "table-row": + // case "table-cell": + // case "table-column-group": + // case "table-column": + // case "table-caption": + return "block"; + case "inline-table": + return "table"; + default: + return $val; + } + } + } + + /** + * @link https://www.w3.org/TR/CSS21/colors.html#propdef-color + */ + protected function _compute_color(string $color) + { + return $this->compute_color_value($color); + } + + /** + * @link https://www.w3.org/TR/CSS21/colors.html#propdef-background-color + */ + protected function _compute_background_color(string $color) + { + return $this->compute_color_value($color); + } + + /** + * @link https://www.w3.org/TR/CSS21/colors.html#propdef-background-image + */ + protected function _compute_background_image(string $val) + { + $parsed_val = $this->_stylesheet->resolve_url($val); + + if ($parsed_val === "none") { + return "none"; + } else { + return "url(\"" . str_replace("\"", "\\\"", $parsed_val) . "\")"; + } + } + + /** + * @link https://www.w3.org/TR/CSS21/colors.html#propdef-background-repeat + */ + protected function _compute_background_repeat(string $val) + { + $keywords = ["repeat", "repeat-x", "repeat-y", "no-repeat"]; + $val = strtolower($val); + return \in_array($val, $keywords, true) ? $val : null; + } + + /** + * @link https://www.w3.org/TR/CSS21/colors.html#propdef-background-attachment + */ + protected function _compute_background_attachment(string $val) + { + $keywords = ["scroll", "fixed"]; + $val = strtolower($val); + return \in_array($val, $keywords, true) ? $val : null; + } + + /** + * @link https://www.w3.org/TR/CSS21/colors.html#propdef-background-position + */ + protected function _compute_background_position(string $val) + { + $val = strtolower($val); + $parts = $this->parse_property_value($val); + $count = \count($parts); + + if ($count === 0 || $count > 2) { + return null; + } + + $v1 = $parts[0]; + $v2 = $parts[1] ?? "center"; + [$x, $y] = $this->computeBackgroundPositionTransformOrigin($v1, $v2); + + if ($x === null || $y === null) { + return null; + } + + return [$x, $y]; + } + + /** + * Compute `background-size`. + * + * Computes to one of the following values: + * * `cover` + * * `contain` + * * `[width, height]`, each being a length, percentage, or `auto` + * + * @link https://www.w3.org/TR/css-backgrounds-3/#background-size + */ + protected function _compute_background_size(string $val) + { + $val = strtolower($val); + + if ($val === "cover" || $val === "contain") { + return $val; + } + + $parts = $this->parse_property_value($val); + $count = \count($parts); + + if ($count === 0 || $count > 2) { + return null; + } + + $width = $parts[0]; + if ($width !== "auto") { + $width = $this->compute_length_percentage_positive($width); + } + + $height = $parts[1] ?? "auto"; + if ($height !== "auto") { + $height = $this->compute_length_percentage_positive($height); + } + + if ($width === null || $height === null) { + return null; + } + + return [$width, $height]; + } + + /** + * @link https://www.w3.org/TR/css-backgrounds-3/#propdef-background + */ + protected function _set_background(string $value): array + { + $components = $this->parse_property_value($value); + $props = []; + $pos_size = []; + + foreach ($components as $val) { + $lower = strtolower($val); + + if ($lower === "none") { + $props["background_image"] = $lower; + } elseif (strncmp($lower, "url(", 4) === 0) { + $props["background_image"] = $val; + } elseif ($lower === "scroll" || $lower === "fixed") { + $props["background_attachment"] = $lower; + } elseif ($lower === "repeat" || $lower === "repeat-x" || $lower === "repeat-y" || $lower === "no-repeat") { + $props["background_repeat"] = $lower; + } elseif ($this->is_color_value($lower)) { + $props["background_color"] = $lower; + } else { + $pos_size[] = $lower; + } + } + + if (\count($pos_size)) { + // Split value list at "/" + $index = array_search("/", $pos_size, true); + + if ($index !== false) { + $pos = \array_slice($pos_size, 0, $index); + $size = \array_slice($pos_size, $index + 1); + } else { + $pos = $pos_size; + $size = []; + } + + $props["background_position"] = implode(" ", $pos); + + if (\count($size)) { + $props["background_size"] = implode(" ", $size); + } + } + + return $props; + } + + /** + * @link https://www.w3.org/TR/CSS21/fonts.html#propdef-font-family + */ + protected function _compute_font_family(string $val) + { + return array_map( + function ($name) { + return trim($name, " '\""); + }, + preg_split("/\s*,\s*/", $val) + ); + } + + /** + * @link https://www.w3.org/TR/CSS21/fonts.html#propdef-font-size + */ + protected function _compute_font_size(string $val) + { + $val = strtolower($val); + $parentFontSize = isset($this->parent_style) + ? $this->parent_style->__get("font_size") + : self::$default_font_size; + + switch ($val) { + case "xx-small": + case "x-small": + case "small": + case "medium": + case "large": + case "x-large": + case "xx-large": + $computed = self::$default_font_size * self::$font_size_keywords[$val]; + break; + + case "smaller": + $computed = 8 / 9 * $parentFontSize; + break; + + case "larger": + $computed = 6 / 5 * $parentFontSize; + break; + + default: + $computed = $this->single_length_in_pt($val, $parentFontSize, $parentFontSize); + + // Negative non-`calc` values are invalid + if ($computed === null + || ($computed < 0 && !preg_match("/^-?[_a-zA-Z]/", $val)) + ) { + return null; + } + break; + } + + return $computed; + } + + /** + * @link https://www.w3.org/TR/CSS21/fonts.html#propdef-font-style + */ + protected function _compute_font_style(string $val) + { + $val = strtolower($val); + return $val === "normal" || $val === "italic" || $val === "oblique" + ? $val + : null; + } + + /** + * @link https://www.w3.org/TR/css-fonts-4/#propdef-font-weight + */ + protected function _compute_font_weight(string $val) + { + $val = strtolower($val); + + switch ($val) { + case "normal": + return 400; + + case "bold": + return 700; + + case "bolder": + // https://www.w3.org/TR/css-fonts-4/#relative-weights + $w = isset($this->parent_style) + ? $this->parent_style->__get("font_weight") + : 400; + + if ($w < 350) { + return 400; + } elseif ($w < 550) { + return 700; + } elseif ($w < 900) { + return 900; + } else { + return $w; + } + + case "lighter": + // https://www.w3.org/TR/css-fonts-4/#relative-weights + $w = isset($this->parent_style) + ? $this->parent_style->__get("font_weight") + : 400; + + if ($w < 100) { + return $w; + } elseif ($w < 550) { + return 100; + } elseif ($w < 750) { + return 400; + } else { + return 700; + } + + default: + $number = self::CSS_NUMBER; + $weight = preg_match("/^$number$/", $val) + ? (int) $val + : null; + return $weight !== null && $weight >= 1 && $weight <= 1000 + ? $weight + : null; + } + } + + /** + * @link https://www.w3.org/TR/css-fonts-4/#src-desc + */ + protected function _compute_src(string $val) + { + return $val; + } + + /** + * Handle the `font` shorthand property. + * + * `[ font-style || font-variant || font-weight ] font-size [ / line-height ] font-family` + * + * @link https://www.w3.org/TR/CSS21/fonts.html#font-shorthand + */ + protected function _set_font(string $value): array + { + $value = strtolower($value); + $components = $this->parse_property_value($value); + $props = []; + + $number = self::CSS_NUMBER; + $unit = "pt|px|pc|rem|em|ex|in|cm|mm|%"; + $sizePattern = "/^(xx-small|x-small|small|medium|large|x-large|xx-large|smaller|larger|$number(?:$unit)|0)$/"; + $sizeIndex = null; + + // Find index of font-size to split the component list + foreach ($components as $i => $val) { + if (preg_match($sizePattern, $val)) { + $sizeIndex = $i; + $props["font_size"] = $val; + break; + } + } + + // `font-size` is mandatory + if ($sizeIndex === null) { + return []; + } + + // `font-style`, `font-variant`, `font-weight` in any order + $styleVariantWeight = \array_slice($components, 0, $sizeIndex); + $stylePattern = "/^(italic|oblique)$/"; + $variantPattern = "/^(small-caps)$/"; + $weightPattern = "/^(bold|bolder|lighter|$number)$/"; + + if (\count($styleVariantWeight) > 3) { + return []; + } + + foreach ($styleVariantWeight as $val) { + if ($val === "normal") { + // Ignore any `normal` value, as it is valid and the initial + // value for all three properties + } elseif (!isset($props["font_style"]) && preg_match($stylePattern, $val)) { + $props["font_style"] = $val; + } elseif (!isset($props["font_variant"]) && preg_match($variantPattern, $val)) { + $props["font_variant"] = $val; + } elseif (!isset($props["font_weight"]) && preg_match($weightPattern, $val)) { + $props["font_weight"] = $val; + } else { + // Duplicates and other values disallowed here + return []; + } + } + + // Optional slash + `line-height` followed by mandatory `font-family` + $lineFamily = \array_slice($components, $sizeIndex + 1); + $hasLineHeight = $lineFamily !== [] && $lineFamily[0] === "/"; + $lineHeight = $hasLineHeight ? \array_slice($lineFamily, 1, 1) : []; + $fontFamily = $hasLineHeight ? \array_slice($lineFamily, 2) : $lineFamily; + $lineHeightPattern = "/^(normal|$number(?:$unit)?)$/"; + + // Missing `font-family` or `line-height` after slash + if ($fontFamily === [] + || ($hasLineHeight && !preg_match($lineHeightPattern, $lineHeight[0])) + ) { + return []; + } + + if ($hasLineHeight) { + $props["line_height"] = $lineHeight[0]; + } + + $props["font_family"] = implode("", $fontFamily); + + return $props; + } + + /** + * Compute `text-align`. + * + * If no alignment is set on the element and the direction is rtl then + * the property is set to "right", otherwise it is set to "left". + * + * @link https://www.w3.org/TR/CSS21/text.html#propdef-text-align + */ + protected function _compute_text_align(string $val) + { + $alignment = strtolower($val); + + if ($alignment === "") { + $alignment = $this->__get("direction") === "rtl" + ? "right" + : "left"; + } + + if (!\in_array($alignment, self::TEXT_ALIGN_KEYWORDS, true)) { + return null; + } + + return $alignment; + } + + /** + * @link https://www.w3.org/TR/css-text-4/#word-spacing-property + */ + protected function _compute_word_spacing(string $val) + { + $val = strtolower($val); + + if ($val === "normal") { + return 0.0; + } + + return $this->compute_length_percentage($val); + } + + /** + * @link https://www.w3.org/TR/css-text-4/#letter-spacing-property + */ + protected function _compute_letter_spacing(string $val) + { + $val = strtolower($val); + + if ($val === "normal") { + return 0.0; + } + + return $this->compute_length_percentage($val); + } + + /** + * @link https://www.w3.org/TR/CSS21/visudet.html#propdef-line-height + */ + protected function _compute_line_height(string $val) + { + $val = strtolower($val); + + if ($val === "normal") { + return $val; + } + + // Compute number values to string and lengths to float (in pt) + if (is_numeric($val)) { + return (string) $val; + } + + $font_size = $this->__get("font_size"); + $computed = $this->single_length_in_pt($val, $font_size); + + // Negative non-`calc` values are invalid + if ($computed === null + || ($computed < 0 && !preg_match("/^-?[_a-zA-Z]/", $val)) + ) { + return null; + } + + return $computed; + } + + /** + * @link https://www.w3.org/TR/css-text-3/#text-indent-property + */ + protected function _compute_text_indent(string $val) + { + return $this->compute_length_percentage($val); + } + + /** + * @link https://www.w3.org/TR/CSS21/page.html#propdef-page-break-before + */ + protected function _compute_page_break_before(string $val) + { + $break = strtolower($val); + + if ($break === "left" || $break === "right") { + $break = "always"; + } + + return $break; + } + + /** + * @link https://www.w3.org/TR/CSS21/page.html#propdef-page-break-after + */ + protected function _compute_page_break_after(string $val) + { + $break = strtolower($val); + + if ($break === "left" || $break === "right") { + $break = "always"; + } + + return $break; + } + + /** + * @link https://www.w3.org/TR/CSS21/visudet.html#propdef-width + */ + protected function _compute_width(string $val) + { + $val = strtolower($val); + + if ($val === "auto") { + return $val; + } + + return $this->compute_length_percentage_positive($val); + } + + /** + * @link https://www.w3.org/TR/CSS21/visudet.html#propdef-height + */ + protected function _compute_height(string $val) + { + $val = strtolower($val); + + if ($val === "auto") { + return $val; + } + + return $this->compute_length_percentage_positive($val); + } + + /** + * @link https://www.w3.org/TR/CSS21/visudet.html#propdef-min-width + */ + protected function _compute_min_width(string $val) + { + $val = strtolower($val); + + // Legacy support for `none`, not covered by spec + if ($val === "auto" || $val === "none") { + return "auto"; + } + + return $this->compute_length_percentage_positive($val); + } + + /** + * @link https://www.w3.org/TR/CSS21/visudet.html#propdef-min-height + */ + protected function _compute_min_height(string $val) + { + $val = strtolower($val); + + // Legacy support for `none`, not covered by spec + if ($val === "auto" || $val === "none") { + return "auto"; + } + + return $this->compute_length_percentage_positive($val); + } + + /** + * @link https://www.w3.org/TR/CSS21/visudet.html#propdef-max-width + */ + protected function _compute_max_width(string $val) + { + $val = strtolower($val); + + // Legacy support for `auto`, not covered by spec + if ($val === "none" || $val === "auto") { + return "none"; + } + + return $this->compute_length_percentage_positive($val); + } + + /** + * @link https://www.w3.org/TR/CSS21/visudet.html#propdef-max-height + */ + protected function _compute_max_height(string $val) + { + $val = strtolower($val); + + // Legacy support for `auto`, not covered by spec + if ($val === "none" || $val === "auto") { + return "none"; + } + + return $this->compute_length_percentage_positive($val); + } + + /** + * @link https://www.w3.org/TR/css-position-3/#inset-properties + * @link https://www.w3.org/TR/css-position-3/#propdef-inset + */ + protected function _set_inset(string $val): array + { + return $this->set_quad_shorthand("inset", $val); + } + + /** + * @param string $val + * @return float|string|null + */ + protected function compute_box_inset(string $val) + { + $val = strtolower($val); + + if ($val === "auto") { + return $val; + } + + return $this->compute_length_percentage($val); + } + + protected function _compute_top(string $val) + { + return $this->compute_box_inset($val); + } + + protected function _compute_right(string $val) + { + return $this->compute_box_inset($val); + } + + protected function _compute_bottom(string $val) + { + return $this->compute_box_inset($val); + } + + protected function _compute_left(string $val) + { + return $this->compute_box_inset($val); + } + + /** + * @link https://www.w3.org/TR/CSS21/box.html#margin-properties + * @link https://www.w3.org/TR/CSS21/box.html#propdef-margin + */ + protected function _set_margin(string $val): array + { + return $this->set_quad_shorthand("margin", $val); + } + + /** + * @param string $val + * @return float|string|null + */ + protected function compute_margin(string $val) + { + $val = strtolower($val); + + // Legacy support for `none` keyword, not covered by spec + if ($val === "none") { + return 0.0; + } + + if ($val === "auto") { + return $val; + } + + return $this->compute_length_percentage($val); + } + + protected function _compute_margin_top(string $val) + { + return $this->compute_margin($val); + } + + protected function _compute_margin_right(string $val) + { + return $this->compute_margin($val); + } + + protected function _compute_margin_bottom(string $val) + { + return $this->compute_margin($val); + } + + protected function _compute_margin_left(string $val) + { + return $this->compute_margin($val); + } + + /** + * @link https://www.w3.org/TR/CSS21/box.html#padding-properties + * @link https://www.w3.org/TR/CSS21/box.html#propdef-padding + */ + protected function _set_padding(string $val): array + { + return $this->set_quad_shorthand("padding", $val); + } + + /** + * @param string $val + * @return float|string|null + */ + protected function compute_padding(string $val) + { + $val = strtolower($val); + + // Legacy support for `none` keyword, not covered by spec + if ($val === "none") { + return 0.0; + } + + return $this->compute_length_percentage_positive($val); + } + + protected function _compute_padding_top(string $val) + { + return $this->compute_padding($val); + } + + protected function _compute_padding_right(string $val) + { + return $this->compute_padding($val); + } + + protected function _compute_padding_bottom(string $val) + { + return $this->compute_padding($val); + } + + protected function _compute_padding_left(string $val) + { + return $this->compute_padding($val); + } + + /** + * @param string $value `width || style || color` + * @param string[] $styles The list of border styles to accept. + * + * @return string[]|null Array of `[width, style, color]`, or `null` if the declaration is invalid. + */ + protected function parse_border_side(string $value, array $styles = self::BORDER_STYLES): ?array + { + $value = strtolower($value); + $components = $this->parse_property_value($value); + $width = null; + $style = null; + $color = null; + + foreach ($components as $val) { + if ($style === null && \in_array($val, $styles, true)) { + $style = $val; + } elseif ($color === null && $this->is_color_value($val)) { + $color = $val; + } elseif ($width === null) { + // Assume width + $width = $val; + } else { + // Duplicates are not allowed + return null; + } + } + + return [$width, $style, $color]; + } + + /** + * @link https://www.w3.org/TR/CSS21/box.html#border-properties + * @link https://www.w3.org/TR/CSS21/box.html#propdef-border + */ + protected function _set_border(string $value): array + { + $values = $this->parse_border_side($value); + + if ($values === null) { + return []; + } + + return array_merge( + array_combine(self::$_props_shorthand["border_top"], $values), + array_combine(self::$_props_shorthand["border_right"], $values), + array_combine(self::$_props_shorthand["border_bottom"], $values), + array_combine(self::$_props_shorthand["border_left"], $values) + ); + } + + /** + * @param string $prop + * @param string $value + * @return array + */ + protected function set_border_side(string $prop, string $value): array + { + $values = $this->parse_border_side($value); + + if ($values === null) { + return []; + } + + return array_combine(self::$_props_shorthand[$prop], $values); + } + + protected function _set_border_top(string $val): array + { + return $this->set_border_side("border_top", $val); + } + + protected function _set_border_right(string $val): array + { + return $this->set_border_side("border_right", $val); + } + + protected function _set_border_bottom(string $val): array + { + return $this->set_border_side("border_bottom", $val); + } + + protected function _set_border_left(string $val): array + { + return $this->set_border_side("border_left", $val); + } + + /** + * @link https://www.w3.org/TR/CSS21/box.html#propdef-border-color + */ + protected function _set_border_color(string $val): array + { + return $this->set_quad_shorthand("border_color", $val); + } + + protected function _compute_border_top_color(string $val) + { + return $this->compute_color_value($val); + } + + protected function _compute_border_right_color(string $val) + { + return $this->compute_color_value($val); + } + + protected function _compute_border_bottom_color(string $val) + { + return $this->compute_color_value($val); + } + + protected function _compute_border_left_color(string $val) + { + return $this->compute_color_value($val); + } + + /** + * @link https://www.w3.org/TR/CSS21/box.html#propdef-border-style + */ + protected function _set_border_style(string $val): array + { + return $this->set_quad_shorthand("border_style", $val); + } + + protected function _compute_border_top_style(string $val) + { + return $this->compute_border_style($val); + } + + protected function _compute_border_right_style(string $val) + { + return $this->compute_border_style($val); + } + + protected function _compute_border_bottom_style(string $val) + { + return $this->compute_border_style($val); + } + + protected function _compute_border_left_style(string $val) + { + return $this->compute_border_style($val); + } + + /** + * @link https://www.w3.org/TR/CSS21/box.html#propdef-border-width + */ + protected function _set_border_width(string $val): array + { + return $this->set_quad_shorthand("border_width", $val); + } + + protected function _compute_border_top_width(string $val) + { + return $this->compute_line_width($val, "border_top_style"); + } + + protected function _compute_border_right_width(string $val) + { + return $this->compute_line_width($val, "border_right_style"); + } + + protected function _compute_border_bottom_width(string $val) + { + return $this->compute_line_width($val, "border_bottom_style"); + } + + protected function _compute_border_left_width(string $val) + { + return $this->compute_line_width($val, "border_left_style"); + } + + /** + * @link https://www.w3.org/TR/css-backgrounds-3/#corners + * @link https://www.w3.org/TR/css-backgrounds-3/#propdef-border-radius + */ + protected function _set_border_radius(string $val): array + { + return $this->set_quad_shorthand("border_radius", $val); + } + + protected function _compute_border_top_left_radius(string $val) + { + return $this->compute_length_percentage_positive($val); + } + + protected function _compute_border_top_right_radius(string $val) + { + return $this->compute_length_percentage_positive($val); + } + + protected function _compute_border_bottom_right_radius(string $val) + { + return $this->compute_length_percentage_positive($val); + } + + protected function _compute_border_bottom_left_radius(string $val) + { + return $this->compute_length_percentage_positive($val); + } + + /** + * @link https://www.w3.org/TR/css-ui-4/#outline-props + * @link https://www.w3.org/TR/css-ui-4/#propdef-outline + */ + protected function _set_outline(string $value): array + { + $values = $this->parse_border_side($value, self::OUTLINE_STYLES); + + if ($values === null) { + return []; + } + + return array_combine(self::$_props_shorthand["outline"], $values); + } + + protected function _compute_outline_color(string $val) + { + return $this->compute_color_value($val); + } + + protected function _compute_outline_style(string $val) + { + $val = strtolower($val); + return \in_array($val, self::OUTLINE_STYLES, true) ? $val : null; + } + + protected function _compute_outline_width(string $val) + { + return $this->compute_line_width($val, "outline_style"); + } + + /** + * @link https://www.w3.org/TR/css-ui-4/#propdef-outline-offset + */ + protected function _compute_outline_offset(string $val) + { + return $this->compute_length($val); + } + + /** + * Compute `border-spacing` to two lengths of the form + * `[horizontal, vertical]`. + * + * @link https://www.w3.org/TR/CSS21/tables.html#propdef-border-spacing + */ + protected function _compute_border_spacing(string $val) + { + $val = strtolower($val); + $parts = $this->parse_property_value($val); + $count = \count($parts); + + if ($count === 0 || $count > 2) { + return null; + } + + $h = $this->compute_length_positive($parts[0]); + $v = isset($parts[1]) + ? $this->compute_length_positive($parts[1]) + : $h; + + if ($h === null || $v === null) { + return null; + } + + return [$h, $v]; + } + + /** + * @link https://www.w3.org/TR/CSS21/generate.html#propdef-list-style-image + */ + protected function _compute_list_style_image(string $val) + { + $parsed_val = $this->_stylesheet->resolve_url($val); + + if ($parsed_val === "none") { + return "none"; + } else { + return "url(\"" . str_replace("\"", "\\\"", $parsed_val) . "\")"; + } + } + + /** + * @link https://www.w3.org/TR/CSS21/generate.html#propdef-list-style-type + */ + protected function _compute_list_style_position(string $val) + { + $val = strtolower($val); + return $val === "inside" || $val === "outside" ? $val : null; + } + + /** + * @link https://www.w3.org/TR/CSS21/generate.html#propdef-list-style-type + */ + protected function _compute_list_style_type(string $val) + { + $val = strtolower($val); + + if ($val === "none") { + return $val; + } + + $ident = self::CSS_IDENTIFIER; + return $val !== "default" && preg_match("/^$ident$/", $val) + ? $val + : null; + } + + /** + * Handle the `list-style` shorthand property. + * + * `[ list-style-position || list-style-image || list-style-type ]` + * + * @link https://www.w3.org/TR/css-lists-3/#list-style-property + */ + protected function _set_list_style(string $value): array + { + $components = $this->parse_property_value($value); + $none = 0; + $position = null; + $image = null; + $type = null; + + foreach ($components as $val) { + $lower = strtolower($val); + + // `none` can occur max 2 times (for image and type each) + if ($none < 2 && $lower === "none") { + $none++; + } elseif ($position === null && ($lower === "inside" || $lower === "outside")) { + $position = $lower; + } elseif ($image === null && strncmp($lower, "url(", 4) === 0) { + $image = $val; + } elseif ($type === null) { + $type = $val; + } else { + // Duplicates are not allowed + return []; + } + } + + // From the spec: + // Using a value of `none` in the shorthand is potentially ambiguous, as + // `none` is a valid value for both `list-style-image` and `list-style-type`. + // To resolve this ambiguity, a value of `none` in the shorthand must be + // applied to whichever of the two properties aren’t otherwise set by + // the shorthand. + if ($none === 2) { + if ($image !== null || $type !== null) { + return []; + } + + $image = "none"; + $type = "none"; + } elseif ($none === 1) { + if ($image !== null && $type !== null) { + return []; + } + + $image = $image ?? "none"; + $type = $type ?? "none"; + } + + return [ + "list_style_position" => $position, + "list_style_image" => $image, + "list_style_type" => $type + ]; + } + + /** + * @param string $value + * @param int $default + * @param bool $sumDuplicates + * + * @return array|string|null + */ + protected function compute_counter_prop(string $value, int $default, bool $sumDuplicates = false) + { + $lower = strtolower($value); + + if ($lower === "none") { + return $lower; + } + + $ident = self::CSS_IDENTIFIER; + $integer = self::CSS_INTEGER; + $counterDef = "($ident)(?:\s+($integer))?"; + $validationPattern = "/^$counterDef(\s+$counterDef)*$/"; + + if (!preg_match($validationPattern, $value)) { + return null; + } + + preg_match_all("/$counterDef/", $value, $matches, PREG_SET_ORDER); + $counters = []; + + foreach ($matches as $match) { + $name = $match[1]; + + if (!$this->isValidCounterName($name)) { + return null; + } + + $value = isset($match[2]) ? (int) $match[2] : $default; + $counters[$name] = $sumDuplicates + ? ($counters[$name] ?? 0) + $value + : $value; + } + + return $counters; + } + + /** + * @link https://www.w3.org/TR/CSS21/generate.html#propdef-counter-increment + */ + protected function _compute_counter_increment(string $val) + { + return $this->compute_counter_prop($val, 1, true); + } + + /** + * @link https://www.w3.org/TR/CSS21/generate.html#propdef-counter-reset + */ + protected function _compute_counter_reset(string $val) + { + return $this->compute_counter_prop($val, 0); + } + + /** + * @link https://www.w3.org/TR/css-content-3/#quotes + */ + protected function _compute_quotes(string $val) + { + $lower = strtolower($val); + + // `auto` is resolved in the getter, so it can inherit as is + if ($lower === "none" || $lower === "auto") { + return $lower; + } + + $components = $this->parse_property_value($val); + $quotes = []; + + foreach ($components as $value) { + if (strncmp($value, '"', 1) !== 0 + && strncmp($value, "'", 1) !== 0 + ) { + return null; + } + + $quotes[] = $this->_stylesheet->parse_string($value); + } + + if ($quotes === [] || \count($quotes) % 2 !== 0) { + return null; + } + + return array_chunk($quotes, 2); + } + + /** + * @link https://www.w3.org/TR/CSS21/generate.html#propdef-content + * @link https://www.w3.org/TR/css-content-3/#propdef-content + */ + protected function _compute_content(string $val) + { + $lower = strtolower($val); + + if ($lower === "normal" || $lower === "none") { + return $lower; + } + + $components = $this->parse_property_value($val); + $parts = []; + + if ($components === []) { + return null; + } + + foreach ($components as $value) { + // String + if (strncmp($value, '"', 1) === 0 || strncmp($value, "'", 1) === 0) { + $parts[] = new StringPart($this->_stylesheet->parse_string($value)); + continue; + } + + $lower = strtolower($value); + + // Keywords + if ($lower === "open-quote") { + $parts[] = new OpenQuote; + continue; + } elseif ($lower === "close-quote") { + $parts[] = new CloseQuote; + continue; + } elseif ($lower === "no-open-quote") { + $parts[] = new NoOpenQuote; + continue; + } elseif ($lower === "no-close-quote") { + $parts[] = new NoCloseQuote; + continue; + } + + // Functional components + $pos = strpos($lower, "("); + + if ($pos === false) { + return null; + } + + // `parse_property_value` ensures that the value is of the form + // `function(arguments)` at this point + $function = substr($lower, 0, $pos); + $arguments = trim(substr($value, $pos + 1, -1)); + + // attr() + if ($function === "attr") { + $attr = strtolower($arguments); + + if ($attr === "") { + return null; + } + + $parts[] = new Attr($attr); + } + + // counter(name [, style]) + elseif ($function === "counter") { + $ident = self::CSS_IDENTIFIER; + + if (!preg_match("/^($ident)(?:\s*,\s*($ident))?$/", $arguments, $matches)) { + return null; + } + + $name = $matches[1]; + $type = isset($matches[2]) ? strtolower($matches[2]) : "decimal"; + + if (!$this->isValidCounterName($name) + || !$this->isValidCounterStyleName($type) + ) { + return null; + } + + $parts[] = new Counter($name, $type); + } + + // counters(name, string [, style]) + elseif ($function === "counters") { + $ident = self::CSS_IDENTIFIER; + $string = self::CSS_STRING; + + if (!preg_match("/^($ident)\s*,\s*($string)(?:\s*,\s*($ident))?$/", $arguments, $matches)) { + return null; + } + + $name = $matches[1]; + $string = $this->_stylesheet->parse_string($matches[2]); + $type = isset($matches[3]) ? strtolower($matches[3]) : "decimal"; + + if (!$this->isValidCounterName($name) + || !$this->isValidCounterStyleName($type) + ) { + return null; + } + + $parts[] = new Counters($name, $string, $type); + } + + // url() + elseif ($function === "url") { + $url = $this->_stylesheet->parse_string($arguments); + $parts[] = new Url($url); + } + + else { + return null; + } + } + + return $parts; + } + + /** + * @link https://www.w3.org/TR/css-page-3/#page-size-prop + */ + protected function _compute_size(string $val) + { + $val = strtolower($val); + + if ($val === "auto") { + return $val; + } + + $parts = $this->parse_property_value($val); + $count = \count($parts); + + if ($count === 0 || $count > 3) { + return null; + } + + $size = null; + $orientation = null; + $lengths = []; + + foreach ($parts as $part) { + if ($size === null && isset(CPDF::$PAPER_SIZES[$part])) { + $size = $part; + } elseif ($orientation === null && ($part === "portrait" || $part === "landscape")) { + $orientation = $part; + } else { + $lengths[] = $part; + } + } + + if ($size !== null && $lengths !== []) { + return null; + } + + if ($size !== null) { + // Standard paper size + [$l1, $l2] = \array_slice(CPDF::$PAPER_SIZES[$size], 2, 2); + } elseif ($lengths === []) { + // Orientation only, use default paper size + $dims = $this->_stylesheet->get_dompdf()->getPaperSize(); + [$l1, $l2] = \array_slice($dims, 2, 2); + } else { + // Custom paper size + $l1 = $this->compute_length_positive($lengths[0]); + $l2 = isset($lengths[1]) ? $this->compute_length_positive($lengths[1]) : $l1; + + if ($l1 === null || $l2 === null) { + return null; + } + } + + if (($orientation === "portrait" && $l1 > $l2) + || ($orientation === "landscape" && $l2 > $l1) + ) { + return [$l2, $l1]; + } + + return [$l1, $l2]; + } + + /** + * @link https://www.w3.org/TR/css-transforms-1/#transform-property + */ + protected function _compute_transform(string $val) + { + $val = strtolower($val); + + if ($val === "none") { + return []; + } + + $parts = $this->parse_property_value($val); + $transforms = []; + + if ($parts === []) { + return null; + } + + foreach ($parts as $part) { + if (!preg_match("/^([a-z]+)\((.+)\)$/s", $part, $matches)) { + return null; + } + + $name = $matches[1]; + $arguments = trim($matches[2]); + $values = $this->parse_property_value($arguments); + $values = array_values(array_filter($values, function ($v) { + return $v !== ","; + })); + $count = \count($values); + + if ($count === 0) { + return null; + } + + switch ($name) { + // case "matrix": + // if ($count !== 6) { + // return null; + // } + + // $values = array_map([$this, "compute_number"], $values); + // break; + + // units + case "translate": + if ($count > 2) { + return null; + } + + $values = [ + $this->compute_length_percentage($values[0]), + isset($values[1]) ? $this->compute_length_percentage($values[1]) : 0.0 + ]; + break; + + case "translatex": + if ($count > 1) { + return null; + } + + $name = "translate"; + $values = [$this->compute_length_percentage($values[0]), 0.0]; + break; + + case "translatey": + if ($count > 1) { + return null; + } + + $name = "translate"; + $values = [0.0, $this->compute_length_percentage($values[0])]; + break; + + // units + case "scale": + if ($count > 2) { + return null; + } + + $v0 = $this->compute_number($values[0]); + $v1 = isset($values[1]) ? $this->compute_number($values[1]) : $v0; + $values = [$v0, $v1]; + break; + + case "scalex": + if ($count > 1) { + return null; + } + + $name = "scale"; + $values = [$this->compute_number($values[0]), 1.0]; + break; + + case "scaley": + if ($count > 1) { + return null; + } + + $name = "scale"; + $values = [1.0, $this->compute_number($values[0])]; + break; + + // units + case "rotate": + if ($count > 1) { + return null; + } + + $values = [$this->compute_angle_or_zero($values[0])]; + break; + + case "skew": + if ($count > 2) { + return null; + } + + $values = [ + $this->compute_angle_or_zero($values[0]), + isset($values[1]) ? $this->compute_angle_or_zero($values[1]) : 0.0 + ]; + break; + + case "skewx": + if ($count > 1) { + return null; + } + + $name = "skew"; + $values = [$this->compute_angle_or_zero($values[0]), 0.0]; + break; + + case "skewy": + if ($count > 1) { + return null; + } + + $name = "skew"; + $values = [0.0, $this->compute_angle_or_zero($values[0])]; + break; + + default: + return null; + } + + foreach ($values as $v) { + if ($v === null) { + return null; + } + } + + $transforms[] = [$name, $values]; + } + + return $transforms; + } + + /** + * @link https://www.w3.org/TR/css-transforms-1/#transform-origin-property + */ + protected function _compute_transform_origin(string $val) + { + $val = strtolower($val); + $parts = $this->parse_property_value($val); + $count = \count($parts); + + if ($count === 0 || $count > 3) { + return null; + } + + $v1 = $parts[0]; + $v2 = $parts[1] ?? "center"; + [$x, $y] = $this->computeBackgroundPositionTransformOrigin($v1, $v2); + $z = $count === 3 ? $this->compute_length($parts[2]) : 0.0; + + if ($x === null || $y === null || $z === null) { + return null; + } + + return [$x, $y, $z]; + } + + /** + * @param string $val + * @return string|null + */ + protected function parse_image_resolution(string $val): ?string + { + // If exif data could be get: + // $re = '/^\s*(\d+|normal|auto)(?:\s*,\s*(\d+|normal))?\s*$/'; + + $val = strtolower($val); + $re = '/^\s*(\d+|normal|auto)\s*$/'; + + if (!preg_match($re, $val, $matches)) { + return null; + } + + return $matches[1]; + } + + /** + * auto | normal | dpi + */ + protected function _compute_background_image_resolution(string $val) + { + return $this->parse_image_resolution($val); + } + + /** + * auto | normal | dpi + */ + protected function _compute_image_resolution(string $val) + { + return $this->parse_image_resolution($val); + } + + /** + * @link https://www.w3.org/TR/css-break-3/#propdef-orphans + */ + protected function _compute_orphans(string $val) + { + return $this->compute_integer($val); + } + + /** + * @link https://www.w3.org/TR/css-break-3/#propdef-widows + */ + protected function _compute_widows(string $val) + { + return $this->compute_integer($val); + } + + /** + * @link https://www.w3.org/TR/css-color-4/#propdef-opacity + */ + protected function _compute_opacity(string $val) + { + $number = self::CSS_NUMBER; + $pattern = "/^($number)(%?)$/"; + + if (!preg_match($pattern, $val, $matches)) { + return null; + } + + $v = (float) $matches[1]; + $percent = $matches[2] === "%"; + $opacity = $percent ? ($v / 100) : $v; + + return max(0.0, min($opacity, 1.0)); + } + + /** + * @link https://www.w3.org/TR/CSS21//visuren.html#propdef-z-index + */ + protected function _compute_z_index(string $val) + { + $val = strtolower($val); + + if ($val === "auto") { + return $val; + } + + return $this->compute_integer($val); + } + + /** + * @param FontMetrics $fontMetrics + * @return $this + */ + public function setFontMetrics(FontMetrics $fontMetrics) + { + $this->fontMetrics = $fontMetrics; + return $this; + } + + /** + * @return FontMetrics + */ + public function getFontMetrics() + { + return $this->fontMetrics; + } + + /** + * Generate a string representation of the Style + * + * This dumps the entire property array into a string via print_r. Useful + * for debugging. + * + * @return string + */ + /*DEBUGCSS print: see below additional debugging util*/ + public function __toString(): string + { + $parent_font_size = $this->parent_style + ? $this->parent_style->font_size + : self::$default_font_size; + + return print_r(array_merge(["parent_font_size" => $parent_font_size], + $this->_props), true); + } + + /*DEBUGCSS*/ + public function debug_print(): void + { + $parent_font_size = $this->parent_style + ? $this->parent_style->font_size + : self::$default_font_size; + + print " parent_font_size:" . $parent_font_size . ";\n"; + print " Props [\n"; + print " specified [\n"; + foreach ($this->_props as $prop => $val) { + print ' ' . $prop . ': ' . preg_replace("/\r\n/", ' ', print_r($val, true)); + if (isset($this->_important_props[$prop])) { + print ' !important'; + } + print ";\n"; + } + print " ]\n"; + print " computed [\n"; + foreach ($this->_props_computed as $prop => $val) { + print ' ' . $prop . ': ' . preg_replace("/\r\n/", ' ', print_r($val, true)); + print ";\n"; + } + print " ]\n"; + print " cached [\n"; + foreach ($this->_props_used as $prop => $val) { + print ' ' . $prop . ': ' . preg_replace("/\r\n/", ' ', print_r($val, true)); + print ";\n"; + } + print " ]\n"; + print " ]\n"; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Css/Stylesheet.php b/dompdf/vendor/dompdf/dompdf/src/Css/Stylesheet.php new file mode 100644 index 0000000..001a729 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Css/Stylesheet.php @@ -0,0 +1,1894 @@ +(?[\'"])(?.*?)(?url\(\s*(?[\'"]?)(?.*?)(?(CSS_URL_FN_QUOTE)(?local\(\s*(?[\'"]?)(?.*?)(?(CSS_LOCAL_FN_QUOTE)(?(?:(?:(?:(?only|not)\s+)?(?all|aural|bitmap|braille|dompdf|embossed|handheld|paged|print|projection|screen|speech|static|tty|tv|visual))|(?:\(\s*(?(?:(?:(?:min|max)-)?(?:width|height))|orientation|[^:]*?)\s*(?:\:\s*(?.*?)\s*)?\))))'; + + /* + * The highest possible specificity is 0x01000000 (and that is only for author + * stylesheets, as it is for inline styles). Origin precedence can be achieved by + * adding multiples of 0x10000000 to the actual specificity. Important + * declarations are handled in Style; though technically they should be handled + * here so that user important declarations can be made to take precedence over + * user important declarations, this doesn't matter in practice as Dompdf does + * not support user stylesheets, and user agent stylesheets can not include + * important declarations. + */ + private static $_stylesheet_origins = [ + self::ORIG_UA => 0x00000000, // user agent declarations + self::ORIG_USER => 0x10000000, // user normal declarations + self::ORIG_AUTHOR => 0x30000000, // author normal declarations + ]; + + /** + * Non-CSS presentational hints (i.e. HTML 4 attributes) are handled as if added + * to the beginning of an author stylesheet, i.e. anything in author stylesheets + * should override them. + */ + const SPEC_NON_CSS = 0x20000000; + + /** + * Current dompdf instance + * + * @var Dompdf + */ + private $_dompdf; + + /** + * Array of currently defined styles + * + * @var array + */ + private $_styles; + + /** + * Array of embedded files (dataURIs) found in the parsed CSS + * + * @var array + */ + private $_blobs; + + /** + * Base protocol of the document being parsed + * Used to handle relative urls. + * + * @var string + */ + private $_protocol = ""; + + /** + * Base hostname of the document being parsed + * Used to handle relative urls. + * + * @var string + */ + private $_base_host = ""; + + /** + * Base path of the document being parsed + * Used to handle relative urls. + * + * @var string + */ + private $_base_path = ""; + + /** + * The styles defined by @page rules + * + * @var array + $child = $child->nextSibling; + } + } else { + $css = $tag->nodeValue; + } + + // Set the base path of the Stylesheet to that of the file being processed + $this->css->set_protocol($this->protocol); + $this->css->set_host($this->baseHost); + $this->css->set_base_path($this->basePath); + + $this->css->load_css($css, Stylesheet::ORIG_AUTHOR); + break; + } + + // Set the base path of the Stylesheet to that of the file being processed + $this->css->set_protocol($this->protocol); + $this->css->set_host($this->baseHost); + $this->css->set_base_path($this->basePath); + } + } + + /** + * @param string $cacheId + * @deprecated + */ + public function enable_caching($cacheId) + { + $this->enableCaching($cacheId); + } + + /** + * Enable experimental caching capability + * + * @param string $cacheId + */ + public function enableCaching($cacheId) + { + $this->cacheId = $cacheId; + } + + /** + * @param string $value + * @return bool + * @deprecated + */ + public function parse_default_view($value) + { + return $this->parseDefaultView($value); + } + + /** + * @param string $value + * @return bool + */ + public function parseDefaultView($value) + { + $valid = ["XYZ", "Fit", "FitH", "FitV", "FitR", "FitB", "FitBH", "FitBV"]; + + $options = preg_split("/\s*,\s*/", trim($value)); + $defaultView = array_shift($options); + + if (!in_array($defaultView, $valid)) { + return false; + } + + $this->setDefaultView($defaultView, $options); + return true; + } + + /** + * Renders the HTML to PDF + */ + public function render() + { + $this->setPhpConfig(); + + $logOutputFile = $this->options->getLogOutputFile(); + if ($logOutputFile) { + if (!file_exists($logOutputFile) && is_writable(dirname($logOutputFile))) { + touch($logOutputFile); + } + + $startTime = microtime(true); + if (is_writable($logOutputFile)) { + ob_start(); + } + } + + $this->processHtml(); + + $this->css->apply_styles($this->tree); + + // @page style rules : size, margins + $pageStyles = $this->css->get_page_styles(); + $basePageStyle = $pageStyles["base"]; + unset($pageStyles["base"]); + + foreach ($pageStyles as $pageStyle) { + $pageStyle->inherit($basePageStyle); + } + + // Set paper size if defined via CSS + if (is_array($basePageStyle->size)) { + // Orientation is already applied when reading the computed CSS + // `size` value. The `Canvas` back ends, however, unconditionally + // swap with an orientation of `landscape` and leave the defined + // size as-is with `portrait`; so passing `portrait` as orientation + // here (via the default value) is correct + [$width, $height] = $basePageStyle->size; + $this->setPaper([0, 0, $width, $height]); + } + + // Create a new canvas instance if the current one does not match the + // desired paper size + $canvasWidth = $this->canvas->get_width(); + $canvasHeight = $this->canvas->get_height(); + $size = $this->getPaperSize(); + + if ( + \Dompdf\Helpers::lengthEqual($canvasWidth, $size[2]) === false || + \Dompdf\Helpers::lengthEqual($canvasHeight, $size[3]) === false + ) { + $this->canvas = CanvasFactory::get_instance($this, $this->paperSize, $this->paperOrientation); + $this->fontMetrics->setCanvas($this->canvas); + } + + $canvas = $this->canvas; + + $root_frame = $this->tree->get_root(); + $root = Factory::decorate_root($root_frame, $this); + foreach ($this->tree as $frame) { + if ($frame === $root_frame) { + continue; + } + Factory::decorate_frame($frame, $this, $root); + } + + // Add meta information + $title = $this->dom->getElementsByTagName("title"); + if ($title->length) { + $canvas->add_info("Title", trim($title->item(0)->nodeValue)); + } + + $metas = $this->dom->getElementsByTagName("meta"); + $labels = [ + "author" => "Author", + "keywords" => "Keywords", + "description" => "Subject", + ]; + /** @var \DOMElement $meta */ + foreach ($metas as $meta) { + $name = mb_strtolower($meta->getAttribute("name")); + $value = trim($meta->getAttribute("content")); + + if (isset($labels[$name])) { + $canvas->add_info($labels[$name], $value); + continue; + } + + if ($name === "dompdf.view" && $this->parseDefaultView($value)) { + $canvas->set_default_view($this->defaultView, $this->defaultViewOptions); + } + } + + $root->set_containing_block(0, 0, $canvas->get_width(), $canvas->get_height()); + $root->set_renderer(new Renderer($this)); + + // This is where the magic happens: + $root->reflow(); + + if (isset($this->callbacks["end_document"])) { + $fs = $this->callbacks["end_document"]; + + foreach ($fs as $f) { + $canvas->page_script($f); + } + } + + // Clean up cached images + if (!$this->options->getDebugKeepTemp()) { + Cache::clear($this->options->getDebugPng()); + } + + global $_dompdf_warnings, $_dompdf_show_warnings; + if ($_dompdf_show_warnings && isset($_dompdf_warnings)) { + echo 'Dompdf Warnings
';
+            foreach ($_dompdf_warnings as $msg) {
+                echo $msg . "\n";
+            }
+
+            if ($canvas instanceof CPDF) {
+                echo $canvas->get_cpdf()->messages;
+            }
+            echo '
'; + flush(); + } + + if ($logOutputFile && is_writable($logOutputFile)) { + $this->writeLog($logOutputFile, $startTime); + ob_end_clean(); + } + + $this->restorePhpConfig(); + } + + /** + * Writes the output buffer in the log file + * + * @param string $logOutputFile + * @param float $startTime + */ + private function writeLog(string $logOutputFile, float $startTime): void + { + $frames = Frame::$ID_COUNTER; + $memory = memory_get_peak_usage(true) / 1024; + $time = (microtime(true) - $startTime) * 1000; + + $out = sprintf( + "%6d" . + "%10.2f KB" . + "%10.2f ms" . + " " . + ($this->quirksmode ? " ON" : "OFF") . + "
", $frames, $memory, $time); + + $out .= ob_get_contents(); + ob_clean(); + + file_put_contents($logOutputFile, $out); + } + + /** + * Add meta information to the PDF after rendering. + * + * @deprecated + */ + public function add_info($label, $value) + { + $this->addInfo($label, $value); + } + + /** + * Add meta information to the PDF after rendering. + * + * @param string $label Label of the value (Creator, Producer, etc.) + * @param string $value The text to set + */ + public function addInfo(string $label, string $value): void + { + $this->canvas->add_info($label, $value); + } + + /** + * Streams the PDF to the client. + * + * The file will open a download dialog by default. The options + * parameter controls the output. Accepted options (array keys) are: + * + * 'compress' = > 1 (=default) or 0: + * Apply content stream compression + * + * 'Attachment' => 1 (=default) or 0: + * Set the 'Content-Disposition:' HTTP header to 'attachment' + * (thereby causing the browser to open a download dialog) + * + * @param string $filename the name of the streamed file + * @param array $options header options (see above) + */ + public function stream($filename = "document.pdf", $options = []) + { + $this->setPhpConfig(); + + $this->canvas->stream($filename, $options); + + $this->restorePhpConfig(); + } + + /** + * Returns the PDF as a string. + * + * The options parameter controls the output. Accepted options are: + * + * 'compress' = > 1 or 0 - apply content stream compression, this is + * on (1) by default + * + * @param array $options options (see above) + * + * @return string + */ + public function output($options = []) + { + $this->setPhpConfig(); + + $output = $this->canvas->output($options); + + $this->restorePhpConfig(); + + return $output; + } + + /** + * @return string + * @deprecated + */ + public function output_html() + { + return $this->outputHtml(); + } + + /** + * Returns the underlying HTML document as a string + * + * @return string + */ + public function outputHtml() + { + return $this->dom->saveHTML(); + } + + /** + * Get the dompdf option value + * + * @param string $key + * @return mixed + * @deprecated + */ + public function get_option($key) + { + return $this->options->get($key); + } + + /** + * @param string $key + * @param mixed $value + * @return $this + * @deprecated + */ + public function set_option($key, $value) + { + $new_options = clone $this->options; + $new_options->set($key, $value); + $this->setOptions($new_options); + return $this; + } + + /** + * @param array $options + * @return $this + * @deprecated + */ + public function set_options(array $options) + { + $new_options = clone $this->options; + $new_options->set($options); + $this->setOptions($new_options); + return $this; + } + + /** + * @param string $size + * @param string $orientation + * @deprecated + */ + public function set_paper($size, $orientation = "portrait") + { + $this->setPaper($size, $orientation); + } + + /** + * Sets the paper size & orientation + * + * @param string|float[] $size 'letter', 'legal', 'A4', etc. {@link Dompdf\Adapter\CPDF::$PAPER_SIZES} + * @param string $orientation 'portrait' or 'landscape' + * @return $this + */ + public function setPaper($size, string $orientation = "portrait"): self + { + $current_size = $this->getPaperSize(); + $this->paperSize = $size; + $this->paperOrientation = $orientation; + $new_size = $this->getPaperSize(); + if ( + \Dompdf\Helpers::lengthEqual($current_size[2], $new_size[2]) === false || + \Dompdf\Helpers::lengthEqual($current_size[3], $new_size[3]) === false + ) { + $this->canvas = CanvasFactory::get_instance($this, $this->paperSize, $this->paperOrientation); + } + return $this; + } + + /** + * Gets the paper size + * + * @return float[] A four-element float array + */ + public function getPaperSize(): array + { + $paper = $this->paperSize; + $orientation = $this->paperOrientation; + + if (is_array($paper)) { + $size = array_map("floatval", $paper); + } else { + $paper = strtolower($paper); + $size = CPDF::$PAPER_SIZES[$paper] ?? CPDF::$PAPER_SIZES["letter"]; + } + + if (strtolower($orientation) === "landscape") { + [$size[2], $size[3]] = [$size[3], $size[2]]; + } + + return $size; + } + + /** + * Gets the paper orientation + * + * @return string Either "portrait" or "landscape" + */ + public function getPaperOrientation(): string + { + return $this->paperOrientation; + } + + /** + * @param FrameTree $tree + * @return $this + */ + public function setTree(FrameTree $tree) + { + $this->tree = $tree; + return $this; + } + + /** + * @return FrameTree + * @deprecated + */ + public function get_tree() + { + return $this->getTree(); + } + + /** + * Returns the underlying {@link FrameTree} object + * + * @return FrameTree + */ + public function getTree() + { + return $this->tree; + } + + /** + * @param string $protocol + * @return $this + * @deprecated + */ + public function set_protocol($protocol) + { + return $this->setProtocol($protocol); + } + + /** + * Sets the protocol to use + * FIXME validate these + * + * @param string $protocol + * @return $this + */ + public function setProtocol(string $protocol) + { + $this->protocol = $protocol; + return $this; + } + + /** + * @return string + * @deprecated + */ + public function get_protocol() + { + return $this->getProtocol(); + } + + /** + * Returns the protocol in use + * + * @return string + */ + public function getProtocol() + { + return $this->protocol; + } + + /** + * @param string $host + * @deprecated + */ + public function set_host($host) + { + $this->setBaseHost($host); + } + + /** + * Sets the base hostname + * + * @param string $baseHost + * @return $this + */ + public function setBaseHost(string $baseHost) + { + $this->baseHost = $baseHost; + return $this; + } + + /** + * @return string + * @deprecated + */ + public function get_host() + { + return $this->getBaseHost(); + } + + /** + * Returns the base hostname + * + * @return string + */ + public function getBaseHost() + { + return $this->baseHost; + } + + /** + * Sets the base path + * + * @param string $path + * @deprecated + */ + public function set_base_path($path) + { + $this->setBasePath($path); + } + + /** + * Sets the base path + * + * @param string $basePath + * @return $this + */ + public function setBasePath(string $basePath) + { + $this->basePath = $basePath; + return $this; + } + + /** + * @return string + * @deprecated + */ + public function get_base_path() + { + return $this->getBasePath(); + } + + /** + * Returns the base path + * + * @return string + */ + public function getBasePath() + { + return $this->basePath; + } + + /** + * @param string $default_view The default document view + * @param array $options The view's options + * @return $this + * @deprecated + */ + public function set_default_view($default_view, $options) + { + return $this->setDefaultView($default_view, $options); + } + + /** + * Sets the default view + * + * @param string $defaultView The default document view + * @param array $options The view's options + * @return $this + */ + public function setDefaultView($defaultView, $options) + { + $this->defaultView = $defaultView; + $this->defaultViewOptions = $options; + return $this; + } + + /** + * @param resource $http_context + * @return $this + * @deprecated + */ + public function set_http_context($http_context) + { + return $this->setHttpContext($http_context); + } + + /** + * Sets the HTTP context + * + * @param resource|array $httpContext + * @return $this + */ + public function setHttpContext($httpContext) + { + $this->options->setHttpContext($httpContext); + return $this; + } + + /** + * @return resource + * @deprecated + */ + public function get_http_context() + { + return $this->getHttpContext(); + } + + /** + * Returns the HTTP context + * + * @return resource + */ + public function getHttpContext() + { + return $this->options->getHttpContext(); + } + + /** + * Set a custom `Canvas` instance to render the document to. + * + * Be aware that the instance will be replaced on render if the document + * defines a paper size different from the canvas. + * + * @param Canvas $canvas + * @return $this + */ + public function setCanvas(Canvas $canvas) + { + $this->canvas = $canvas; + $canvasWidth = $this->canvas->get_width(); + $canvasHeight = $this->canvas->get_height(); + $this->paperSize = [0, 0, $canvasWidth, $canvasHeight]; + $this->paperOrientation = "portrait"; + return $this; + } + + /** + * @return Canvas + * @deprecated + */ + public function get_canvas() + { + return $this->getCanvas(); + } + + /** + * Return the underlying Canvas instance (e.g. Dompdf\Adapter\CPDF, Dompdf\Adapter\GD) + * + * @return Canvas + */ + public function getCanvas() + { + return $this->canvas; + } + + /** + * @param Stylesheet $css + * @return $this + */ + public function setCss(Stylesheet $css) + { + $this->css = $css; + return $this; + } + + /** + * @return Stylesheet + * @deprecated + */ + public function get_css() + { + return $this->getCss(); + } + + /** + * Returns the stylesheet + * + * @return Stylesheet + */ + public function getCss() + { + return $this->css; + } + + /** + * @param DOMDocument $dom + * @return $this + */ + public function setDom(DOMDocument $dom) + { + $this->dom = $dom; + return $this; + } + + /** + * @return DOMDocument + * @deprecated + */ + public function get_dom() + { + return $this->getDom(); + } + + /** + * @return DOMDocument + */ + public function getDom() + { + return $this->dom; + } + + /** + * @param Options $options + * @return $this + */ + public function setOptions(Options $options) + { + // For backwards compatibility + if ($this->options && $this->options->getHttpContext() && !$options->getHttpContext()) { + $options->setHttpContext($this->options->getHttpContext()); + } + + $this->options = $options; + + $fontMetrics = $this->fontMetrics; + if (isset($fontMetrics)) { + $fontMetrics->setOptions($options); + } + + if (isset($this->canvas)) { + $this->canvas = CanvasFactory::get_instance($this, $this->paperSize, $this->paperOrientation); + if (isset($fontMetrics)) { + $this->fontMetrics = new FontMetrics($this->canvas, $this->options); + } + } + + return $this; + } + + /** + * @return Options + */ + public function getOptions() + { + return $this->options; + } + + /** + * @return array + * @deprecated + */ + public function get_callbacks() + { + return $this->getCallbacks(); + } + + /** + * Returns the callbacks array + * + * @return array + */ + public function getCallbacks() + { + return $this->callbacks; + } + + /** + * @param array $callbacks the set of callbacks to set + * @return $this + * @deprecated + */ + public function set_callbacks($callbacks) + { + return $this->setCallbacks($callbacks); + } + + /** + * Define callbacks that allow modifying the document during render. + * + * The callbacks array should contain arrays with `event` set to a callback + * event name and `f` set to a function or any other callable. + * + * The available callback events are: + * * `begin_page_reflow`: called before page reflow + * * `begin_frame`: called before a frame is rendered + * * `end_frame`: called after frame rendering is complete + * * `begin_page_render`: called before a page is rendered + * * `end_page_render`: called after page rendering is complete + * * `end_document`: called for every page after rendering is complete + * + * The function `f` receives three arguments `Frame $frame`, `Canvas $canvas`, + * and `FontMetrics $fontMetrics` for all events but `end_document`. For + * `end_document`, the function receives four arguments `int $pageNumber`, + * `int $pageCount`, `Canvas $canvas`, and `FontMetrics $fontMetrics` instead. + * + * @param array $callbacks The set of callbacks to set. + * @return $this + */ + public function setCallbacks(array $callbacks): self + { + $this->callbacks = []; + + foreach ($callbacks as $c) { + if (is_array($c) && isset($c["event"]) && isset($c["f"])) { + $event = $c["event"]; + $f = $c["f"]; + if (is_string($event) && is_callable($f)) { + $this->callbacks[$event][] = $f; + } + } + } + + return $this; + } + + /** + * @return boolean + * @deprecated + */ + public function get_quirksmode() + { + return $this->getQuirksmode(); + } + + /** + * Get the quirks mode + * + * @return boolean true if quirks mode is active + */ + public function getQuirksmode() + { + return $this->quirksmode; + } + + /** + * @param FontMetrics $fontMetrics + * @return $this + */ + public function setFontMetrics(FontMetrics $fontMetrics) + { + $this->fontMetrics = $fontMetrics; + return $this; + } + + /** + * @return FontMetrics + */ + public function getFontMetrics() + { + return $this->fontMetrics; + } + + /** + * PHP5 overloaded getter + * Along with {@link Dompdf::__set()} __get() provides access to all + * properties directly. Typically __get() is not called directly outside + * of this class. + * + * @param string $prop + * + * @throws Exception + * @return mixed + */ + function __get($prop) + { + switch ($prop) { + case 'version': + return $this->version; + default: + throw new Exception('Invalid property: ' . $prop); + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Exception.php b/dompdf/vendor/dompdf/dompdf/src/Exception.php new file mode 100644 index 0000000..3a90e47 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Exception.php @@ -0,0 +1,27 @@ +setCanvas($canvas); + $this->setOptions($options); + $this->loadFontFamilies(); + } + + /** + * @deprecated + */ + public function save_font_families() + { + $this->saveFontFamilies(); + } + + /** + * Saves the stored font family cache + * + * The name and location of the cache file are determined by {@link + * FontMetrics::USER_FONTS_FILE}. This file should be writable by the + * webserver process. + * + * @see FontMetrics::loadFontFamilies() + */ + public function saveFontFamilies() + { + file_put_contents($this->getUserFontsFilePath(), json_encode($this->userFonts, JSON_PRETTY_PRINT)); + } + + /** + * @deprecated + */ + public function load_font_families() + { + $this->loadFontFamilies(); + } + + /** + * Loads the stored font family cache + * + * @see FontMetrics::saveFontFamilies() + */ + public function loadFontFamilies() + { + $file = $this->options->getRootDir() . "/lib/fonts/installed-fonts.dist.json"; + $this->bundledFonts = json_decode(file_get_contents($file), true); + + if (is_readable($this->getUserFontsFilePath())) { + $this->userFonts = json_decode(file_get_contents($this->getUserFontsFilePath()), true); + } else { + $this->loadFontFamiliesLegacy(); + } + } + + private function loadFontFamiliesLegacy() + { + $legacyCacheFile = $this->options->getFontDir() . '/dompdf_font_family_cache.php'; + if (is_readable($legacyCacheFile)) { + $fontDir = $this->options->getFontDir(); + $rootDir = $this->options->getRootDir(); + + $cacheDataClosure = require $legacyCacheFile; + $cacheData = is_array($cacheDataClosure) ? $cacheDataClosure : $cacheDataClosure($fontDir, $rootDir); + if (is_array($cacheData)) { + foreach ($cacheData as $family => $variants) { + if (!isset($this->bundledFonts[$family]) && is_array($variants)) { + foreach ($variants as $variant => $variantPath) { + $variantName = basename($variantPath); + $variantDir = dirname($variantPath); + if ($variantDir == $fontDir) { + $this->userFonts[$family][$variant] = $variantName; + } else { + $this->userFonts[$family][$variant] = $variantPath; + } + } + } + } + $this->saveFontFamilies(); + } + } + } + + /** + * @param array $style + * @param string $remote_file + * @param resource $context + * @return bool + * @deprecated + */ + public function register_font($style, $remote_file, $context = null) + { + return $this->registerFont($style, $remote_file); + } + + /** + * @param array $style + * @param string $remoteFile + * @param resource $context + * @return bool + */ + public function registerFont($style, $remoteFile, $context = null) + { + $fontname = mb_strtolower($style["family"], "UTF-8"); + $families = $this->getFontFamilies(); + + $entry = []; + if (isset($families[$fontname])) { + $entry = $families[$fontname]; + } + + $styleString = $this->getType("{$style['weight']} {$style['style']}"); + + $remoteHash = md5($remoteFile); + + $prefix = $fontname . "_" . $styleString; + $prefix = trim($prefix, "-"); + if (function_exists('iconv')) { + $prefix = @iconv('utf-8', 'us-ascii//TRANSLIT', $prefix); + } + $prefix_encoding = mb_detect_encoding($prefix, mb_detect_order(), true); + $substchar = mb_substitute_character(); + mb_substitute_character(0x005F); + $prefix = mb_convert_encoding($prefix, "ISO-8859-1", $prefix_encoding); + mb_substitute_character($substchar); + $prefix = preg_replace("[\W]", "_", $prefix); + $prefix = preg_replace("/[^-_\w]+/", "", $prefix); + + $localFile = $prefix . "_" . $remoteHash; + $localFilePath = $this->getOptions()->getFontDir() . "/" . $localFile; + + if (isset($entry[$styleString]) && $localFilePath == $entry[$styleString]) { + return true; + } + + + $entry[$styleString] = $localFile; + + // Download the remote file + [$protocol] = Helpers::explode_url($remoteFile); + $allowed_protocols = $this->options->getAllowedProtocols(); + if (!array_key_exists($protocol, $allowed_protocols)) { + Helpers::record_warnings(E_USER_WARNING, "Permission denied on $remoteFile. The communication protocol is not supported.", __FILE__, __LINE__); + return false; + } + + foreach ($allowed_protocols[$protocol]["rules"] as $rule) { + [$result, $message] = $rule($remoteFile); + if ($result !== true) { + Helpers::record_warnings(E_USER_WARNING, "Error loading $remoteFile: $message", __FILE__, __LINE__); + return false; + } + } + + [$remoteFileContent, $http_response_header] = @Helpers::getFileContent($remoteFile, $context); + if ($remoteFileContent === null) { + return false; + } + + $localTempFile = @tempnam($this->options->get("tempDir"), "dompdf-font-"); + file_put_contents($localTempFile, $remoteFileContent); + + $font = Font::load($localTempFile); + + if (!$font) { + unlink($localTempFile); + return false; + } + + $font->parse(); + $font->saveAdobeFontMetrics("$localFilePath.ufm"); + $font->close(); + + unlink($localTempFile); + + if ( !file_exists("$localFilePath.ufm") ) { + return false; + } + + $fontExtension = ".ttf"; + switch ($font->getFontType()) { + case "TrueType": + default: + $fontExtension = ".ttf"; + break; + } + + // Save the changes + file_put_contents($localFilePath.$fontExtension, $remoteFileContent); + + if ( !file_exists($localFilePath.$fontExtension) ) { + unlink("$localFilePath.ufm"); + return false; + } + + $this->setFontFamily($fontname, $entry); + + return true; + } + + /** + * @param $text + * @param $font + * @param $size + * @param float $word_spacing + * @param float $char_spacing + * @return float + * @deprecated + */ + public function get_text_width($text, $font, $size, $word_spacing = 0.0, $char_spacing = 0.0) + { + //return self::$_pdf->get_text_width($text, $font, $size, $word_spacing, $char_spacing); + return $this->getTextWidth($text, $font, $size, $word_spacing, $char_spacing); + } + + /** + * Calculates text size, in points + * + * @param string $text The text to be sized + * @param string $font The font file to use + * @param float $size The font size, in points + * @param float $wordSpacing Word spacing, if any + * @param float $charSpacing Char spacing, if any + * + * @return float + */ + public function getTextWidth(string $text, $font, float $size, float $wordSpacing = 0.0, float $charSpacing = 0.0): float + { + // @todo Make sure this cache is efficient before enabling it + static $cache = []; + + if ($text === "") { + return 0; + } + + // Don't cache long strings + $useCache = !isset($text[50]); // Faster than strlen + + // Text-size calculations depend on the canvas used. Make sure to not + // return wrong values when switching canvas backends + $canvasClass = get_class($this->canvas); + $key = "$canvasClass/$font/$size/$wordSpacing/$charSpacing"; + + if ($useCache && isset($cache[$key][$text])) { + return $cache[$key][$text]; + } + + $width = $this->canvas->get_text_width($text, $font, $size, $wordSpacing, $charSpacing); + + if ($useCache) { + $cache[$key][$text] = $width; + } + + return $width; + } + + /** + * Maps substrings of text against the provided font list. This is achieved by + * parsing each character of the string against the supported glyphs for each + * font. Fonts preference is based on the order of the font list. + * + * Returns an array containing substring information that indicates the + * matched font (if any), start index, substring length, and (optionally) + * the actual text of the substring. + * + * @param string $text The text to map + * @param array $fontFamilies List of font families to map against + * @param string $subtype The font subtype (italic, bold, etc.) + * @param int $count The number of matches to return + * @param bool $returnSubstring Should the actual matched text be returned + * @return array + */ + public function mapTextToFonts(string $text, array $fontFamilies, string $subtype = "normal", int $count = -1, bool $returnSubstring = false): array + { + $char_mapping = []; + $fonts = []; + + foreach ($fontFamilies as $family) { + $font = $this->getFont($family, $subtype); + if ($font !== null) { + $fonts[] = $font; + } + } + + if (function_exists("mb_str_split")) { + $char_array = mb_str_split($text, 1, "UTF-8"); + } else { + $char_array = preg_split("//u", $text, -1, PREG_SPLIT_NO_EMPTY); + } + $start_index = 0; + $char_index = -1; + while (isset($char_array[++$char_index])) { + $char = $char_array[$char_index]; + if (preg_match('/[\x00-\x1F\x7F]/u', $char)) { + //non-printable, moving on + continue; + } + $mapped_font = null; + foreach ($fonts as $font) { + if ($this->canvas->font_supports_char($font, $char)) { + $mapped_font = $font; + break; + } + } + + if (!isset($char_mapping[$start_index])) { + $char_mapping[$start_index] = ["font" => $mapped_font, "length" => 0, "text" => null]; + } + + if ($mapped_font !== $char_mapping[$start_index]["font"]) { + $char_mapping[$start_index]["length"] = $char_index - $start_index; + if ($count > 0 && count($char_mapping) === $count) { + break; + } + $start_index = $char_index; + $char_mapping[$start_index] = ["font" => $mapped_font, "length" => 0, "text" => null]; + } + } + + if ($returnSubstring) { + // build the string for each mapping + foreach ($char_mapping as $start_index => &$info) { + $info["text"] = mb_substr($text, $start_index, $info["length"], "UTF-8"); + } + } + + return $char_mapping; + } + + /** + * @param $font + * @param $size + * @return float + * @deprecated + */ + public function get_font_height($font, $size) + { + return $this->getFontHeight($font, $size); + } + + /** + * Calculates font height, in points + * + * @param string $font The font file to use + * @param float $size The font size, in points + * + * @return float + */ + public function getFontHeight($font, float $size): float + { + return $this->canvas->get_font_height($font, $size); + } + + /** + * Calculates font baseline, in points + * + * @param string $font The font file to use + * @param float $size The font size, in points + * + * @return float + */ + public function getFontBaseline($font, float $size): float + { + return $this->canvas->get_font_baseline($font, $size); + } + + /** + * @param $family_raw + * @param string $subtype_raw + * @return string + * @deprecated + */ + public function get_font($family_raw, $subtype_raw = "normal") + { + return $this->getFont($family_raw, $subtype_raw); + } + + /** + * Resolves a font family & subtype into an actual font file + * Subtype can be one of 'normal', 'bold', 'italic' or 'bold_italic'. If + * the particular font family has no suitable font file, the default font + * ({@link Options::defaultFont}) is used. The font file returned + * is the absolute pathname to the font file on the system. + * + * @param string|null $familyRaw + * @param string $subtypeRaw + * + * @return string|null + */ + public function getFont($familyRaw, $subtypeRaw = "normal") + { + static $cache = []; + + if (!$familyRaw) { + $familyRaw = $familyRaw === null ? 0 : $this->options->getDefaultFont(); + } + if (!$subtypeRaw) { + $subtypeRaw = "normal"; + } + + if (isset($cache[$familyRaw][$subtypeRaw])) { + return $cache[$familyRaw][$subtypeRaw]; + } + + /* Allow calling for various fonts in search path. Therefore not immediately + * return replacement on non match. + * Only when called with NULL try replacement. + * When this is also missing there is really trouble. + * If only the subtype fails, nevertheless return failure. + * Only on checking the fallback font, check various subtypes on same font. + */ + + $subtype = strtolower($subtypeRaw); + + $families = $this->getFontFamilies(); + if ($familyRaw) { + $family = str_replace(["'", '"'], "", strtolower($familyRaw)); + + if (isset($families[$family][$subtype])) { + return $cache[$familyRaw][$subtypeRaw] = $families[$family][$subtype]; + } + + return null; + } + + $fallback_families = [strtolower($this->options->getDefaultFont()), "serif"]; + foreach ($fallback_families as $family) { + if (isset($families[$family][$subtype])) { + return $cache[$familyRaw][$subtypeRaw] = $families[$family][$subtype]; + } + + if (!isset($families[$family])) { + continue; + } + + $family = $families[$family]; + + foreach ($family as $sub => $font) { + if (strpos($subtype, $sub) !== false) { + return $cache[$familyRaw][$subtypeRaw] = $font; + } + } + + if ($subtype !== "normal") { + foreach ($family as $sub => $font) { + if ($sub !== "normal") { + return $cache[$familyRaw][$subtypeRaw] = $font; + } + } + } + + $subtype = "normal"; + + if (isset($family[$subtype])) { + return $cache[$familyRaw][$subtypeRaw] = $family[$subtype]; + } + } + + return null; + } + + /** + * @param $family + * @return null|string + * @deprecated + */ + public function get_family($family) + { + return $this->getFamily($family); + } + + /** + * @param string $family + * @return null|string + */ + public function getFamily($family) + { + $family = str_replace(["'", '"'], "", mb_strtolower($family, "UTF-8")); + $families = $this->getFontFamilies(); + + if (isset($families[$family])) { + return $families[$family]; + } + + return null; + } + + /** + * @param $type + * @return string + * @deprecated + */ + public function get_type($type) + { + return $this->getType($type); + } + + /** + * @param string $type + * @return string + */ + public function getType($type) + { + if (preg_match('/bold/i', $type)) { + $weight = 700; + } elseif (preg_match('/([1-9]00)/', $type, $match)) { + $weight = (int)$match[0]; + } else { + $weight = 400; + } + $weight = $weight === 400 ? 'normal' : $weight; + $weight = $weight === 700 ? 'bold' : $weight; + + $style = preg_match('/italic|oblique/i', $type) ? 'italic' : null; + + if ($weight === 'normal' && $style !== null) { + return $style; + } + + return $style === null + ? $weight + : $weight.'_'.$style; + } + + /** + * @return array + * @deprecated + */ + public function get_font_families() + { + return $this->getFontFamilies(); + } + + /** + * Returns the current font lookup table + * + * @return array + */ + public function getFontFamilies() + { + if (!isset($this->fontFamilies)) { + $this->setFontFamilies(); + } + return $this->fontFamilies; + } + + /** + * Convert loaded fonts to font lookup table + * + * @return array + */ + public function setFontFamilies() + { + $fontFamilies = []; + if (isset($this->bundledFonts) && is_array($this->bundledFonts)) { + foreach ($this->bundledFonts as $family => $variants) { + if (!isset($fontFamilies[$family])) { + $fontFamilies[$family] = array_map(function ($variant) { + return $this->getOptions()->getRootDir() . '/lib/fonts/' . $variant; + }, $variants); + } + } + } + if (isset($this->userFonts) && is_array($this->userFonts)) { + foreach ($this->userFonts as $family => $variants) { + $fontFamilies[$family] = array_map(function ($variant) { + $variantName = basename($variant); + if ($variantName === $variant) { + return $this->getOptions()->getFontDir() . '/' . $variant; + } + return $variant; + }, $variants); + } + } + $this->fontFamilies = $fontFamilies; + } + + /** + * @param string $fontname + * @param mixed $entry + * @deprecated + */ + public function set_font_family($fontname, $entry) + { + $this->setFontFamily($fontname, $entry); + } + + /** + * @param string $fontname + * @param mixed $entry + */ + public function setFontFamily($fontname, $entry) + { + $this->userFonts[mb_strtolower($fontname, "UTF-8")] = $entry; + $this->saveFontFamilies(); + unset($this->fontFamilies); + } + + /** + * @return string + */ + public function getUserFontsFilePath() + { + return $this->options->getFontDir() . '/' . self::USER_FONTS_FILE; + } + + /** + * @param Options $options + * @return $this + */ + public function setOptions(Options $options) + { + $this->options = $options; + unset($this->fontFamilies); + return $this; + } + + /** + * @return Options + */ + public function getOptions() + { + return $this->options; + } + + /** + * @param Canvas $canvas + * @return $this + */ + public function setCanvas(Canvas $canvas) + { + $this->canvas = $canvas; + return $this; + } + + /** + * @return Canvas + */ + public function getCanvas() + { + return $this->canvas; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Frame.php b/dompdf/vendor/dompdf/dompdf/src/Frame.php new file mode 100644 index 0000000..678fb65 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Frame.php @@ -0,0 +1,1238 @@ +_node = $node; + + $this->_parent = null; + $this->_first_child = null; + $this->_last_child = null; + $this->_prev_sibling = $this->_next_sibling = null; + + $this->_style = null; + + $this->_containing_block = [ + "x" => null, + "y" => null, + "w" => null, + "h" => null, + ]; + + $this->_containing_block[0] =& $this->_containing_block["x"]; + $this->_containing_block[1] =& $this->_containing_block["y"]; + $this->_containing_block[2] =& $this->_containing_block["w"]; + $this->_containing_block[3] =& $this->_containing_block["h"]; + + $this->_position = [ + "x" => null, + "y" => null, + ]; + + $this->_position[0] =& $this->_position["x"]; + $this->_position[1] =& $this->_position["y"]; + + $this->_opacity = 1.0; + $this->_decorator = null; + + $this->set_id(self::$ID_COUNTER++); + } + + /** + * WIP : preprocessing to remove all the unused whitespace + */ + protected function ws_trim() + { + if ($this->ws_keep()) { + return; + } + + if (self::$_ws_state === self::WS_SPACE) { + $node = $this->_node; + + if ($node->nodeName === "#text" && !empty($node->nodeValue)) { + $node->nodeValue = preg_replace("/[ \t\r\n\f]+/u", " ", trim($node->nodeValue)); + self::$_ws_state = self::WS_TEXT; + } + } + } + + /** + * @return bool + */ + protected function ws_keep() + { + $whitespace = $this->get_style()->white_space; + + return in_array($whitespace, ["pre", "pre-wrap", "pre-line"]); + } + + /** + * @return bool + */ + protected function ws_is_text() + { + $node = $this->get_node(); + + if ($node->nodeName === "img") { + return true; + } + + if (!$this->is_in_flow()) { + return false; + } + + if ($this->is_text_node()) { + return trim($node->nodeValue) !== ""; + } + + return true; + } + + /** + * "Destructor": forcibly free all references held by this frame + * + * @param bool $recursive if true, call dispose on all children + */ + public function dispose($recursive = false) + { + if ($recursive) { + while ($child = $this->_first_child) { + $child->dispose(true); + } + } + + // Remove this frame from the tree + if ($this->_prev_sibling) { + $this->_prev_sibling->_next_sibling = $this->_next_sibling; + } + + if ($this->_next_sibling) { + $this->_next_sibling->_prev_sibling = $this->_prev_sibling; + } + + if ($this->_parent && $this->_parent->_first_child === $this) { + $this->_parent->_first_child = $this->_next_sibling; + } + + if ($this->_parent && $this->_parent->_last_child === $this) { + $this->_parent->_last_child = $this->_prev_sibling; + } + + if ($this->_parent) { + $this->_parent->get_node()->removeChild($this->_node); + } + + $this->_style = null; + unset($this->_style); + } + + /** + * Re-initialize the frame + */ + public function reset() + { + $this->_position["x"] = null; + $this->_position["y"] = null; + + $this->_containing_block["x"] = null; + $this->_containing_block["y"] = null; + $this->_containing_block["w"] = null; + $this->_containing_block["h"] = null; + + $this->_style->reset(); + } + + /** + * @return \DOMElement|\DOMText + */ + public function get_node() + { + return $this->_node; + } + + /** + * @return int + */ + public function get_id() + { + return $this->_id; + } + + /** + * @return Style + */ + public function get_style() + { + return $this->_style; + } + + /** + * @deprecated + * @return Style + */ + public function get_original_style() + { + return $this->_style; + } + + /** + * @return Frame + */ + public function get_parent() + { + return $this->_parent; + } + + /** + * @return FrameDecorator\AbstractFrameDecorator + */ + public function get_decorator() + { + return $this->_decorator; + } + + /** + * @return Frame + */ + public function get_first_child() + { + return $this->_first_child; + } + + /** + * @return Frame + */ + public function get_last_child() + { + return $this->_last_child; + } + + /** + * @return Frame + */ + public function get_prev_sibling() + { + return $this->_prev_sibling; + } + + /** + * @return Frame + */ + public function get_next_sibling() + { + return $this->_next_sibling; + } + + /** + * @return FrameListIterator + */ + public function get_children(): FrameListIterator + { + return new FrameListIterator($this); + } + + // Layout property accessors + + /** + * Containing block dimensions + * + * @param string|null $i The key of the wanted containing block's dimension (x, y, w, h) + * + * @return float[]|float + */ + public function get_containing_block($i = null) + { + if (isset($i)) { + return $this->_containing_block[$i]; + } + + return $this->_containing_block; + } + + /** + * Block position + * + * @param string|null $i The key of the wanted position value (x, y) + * + * @return float[]|float + */ + public function get_position($i = null) + { + if (isset($i)) { + return $this->_position[$i]; + } + + return $this->_position; + } + + //........................................................................ + + /** + * Return the width of the margin box of the frame, in pt. Meaningless + * unless the width has been calculated properly. + * + * @return float + */ + public function get_margin_width(): float + { + $style = $this->_style; + + return (float)$style->length_in_pt([ + $style->width, + $style->margin_left, + $style->margin_right, + $style->border_left_width, + $style->border_right_width, + $style->padding_left, + $style->padding_right + ], $this->_containing_block["w"]); + } + + /** + * Return the height of the margin box of the frame, in pt. Meaningless + * unless the height has been calculated properly. + * + * @return float + */ + public function get_margin_height(): float + { + $style = $this->_style; + + return (float)$style->length_in_pt( + [ + $style->height, + (float)$style->length_in_pt( + [ + $style->border_top_width, + $style->border_bottom_width, + $style->margin_top, + $style->margin_bottom, + $style->padding_top, + $style->padding_bottom + ], $this->_containing_block["w"] + ) + ], + $this->_containing_block["h"] + ); + } + + /** + * Return the content box (x,y,w,h) of the frame. + * + * Width and height might be reported as 0 if they have not been resolved + * yet. + * + * @return float[] + */ + public function get_content_box(): array + { + $style = $this->_style; + $cb = $this->_containing_block; + + $x = $this->_position["x"] + + (float)$style->length_in_pt( + [ + $style->margin_left, + $style->border_left_width, + $style->padding_left + ], + $cb["w"] + ); + + $y = $this->_position["y"] + + (float)$style->length_in_pt( + [ + $style->margin_top, + $style->border_top_width, + $style->padding_top + ], $cb["w"] + ); + + $w = (float)$style->length_in_pt($style->width, $cb["w"]); + + $h = (float)$style->length_in_pt($style->height, $cb["h"]); + + return [0 => $x, "x" => $x, + 1 => $y, "y" => $y, + 2 => $w, "w" => $w, + 3 => $h, "h" => $h]; + } + + /** + * Return the padding box (x,y,w,h) of the frame. + * + * Width and height might be reported as 0 if they have not been resolved + * yet. + * + * @return float[] + */ + public function get_padding_box(): array + { + $style = $this->_style; + $cb = $this->_containing_block; + + $x = $this->_position["x"] + + (float)$style->length_in_pt( + [ + $style->margin_left, + $style->border_left_width + ], + $cb["w"] + ); + + $y = $this->_position["y"] + + (float)$style->length_in_pt( + [ + $style->margin_top, + $style->border_top_width + ], + $cb["h"] + ); + + $w = (float)$style->length_in_pt( + [ + $style->padding_left, + $style->width, + $style->padding_right + ], + $cb["w"] + ); + + $h = (float)$style->length_in_pt( + [ + $style->padding_top, + $style->padding_bottom, + $style->length_in_pt($style->height, $cb["h"]) + ], + $cb["w"] + ); + + return [0 => $x, "x" => $x, + 1 => $y, "y" => $y, + 2 => $w, "w" => $w, + 3 => $h, "h" => $h]; + } + + /** + * Return the border box of the frame. + * + * Width and height might be reported as 0 if they have not been resolved + * yet. + * + * @return float[] + */ + public function get_border_box(): array + { + $style = $this->_style; + $cb = $this->_containing_block; + + $x = $this->_position["x"] + (float)$style->length_in_pt($style->margin_left, $cb["w"]); + + $y = $this->_position["y"] + (float)$style->length_in_pt($style->margin_top, $cb["w"]); + + $w = (float)$style->length_in_pt( + [ + $style->border_left_width, + $style->padding_left, + $style->width, + $style->padding_right, + $style->border_right_width + ], + $cb["w"] + ); + + $h = (float)$style->length_in_pt( + [ + $style->border_top_width, + $style->padding_top, + $style->padding_bottom, + $style->border_bottom_width, + $style->length_in_pt($style->height, $cb["h"]) + ], + $cb["w"] + ); + + return [0 => $x, "x" => $x, + 1 => $y, "y" => $y, + 2 => $w, "w" => $w, + 3 => $h, "h" => $h]; + } + + /** + * @param float|null $opacity + * + * @return float + */ + public function get_opacity(?float $opacity = null): float + { + if ($opacity !== null) { + $this->set_opacity($opacity); + } + + return $this->_opacity; + } + + /** + * @return LineBox|null + */ + public function &get_containing_line() + { + return $this->_containing_line; + } + + //........................................................................ + // Set methods + + /** + * @param int $id + */ + public function set_id($id) + { + $this->_id = $id; + + // We can only set attributes of DOMElement objects (nodeType == 1). + // Since these are the only objects that we can assign CSS rules to, + // this shortcoming is okay. + if ($this->_node->nodeType == XML_ELEMENT_NODE) { + $this->_node->setAttribute("frame_id", $id); + } + } + + /** + * @param Style $style + */ + public function set_style(Style $style): void + { + // $style->set_frame($this); + $this->_style = $style; + } + + /** + * @param FrameDecorator\AbstractFrameDecorator $decorator + */ + public function set_decorator(FrameDecorator\AbstractFrameDecorator $decorator) + { + $this->_decorator = $decorator; + } + + /** + * @param float|float[]|null $x + * @param float|null $y + * @param float|null $w + * @param float|null $h + */ + public function set_containing_block($x = null, $y = null, $w = null, $h = null) + { + if (is_array($x)) { + foreach ($x as $key => $val) { + $$key = $val; + } + } + + if (is_numeric($x)) { + $this->_containing_block["x"] = $x; + } + + if (is_numeric($y)) { + $this->_containing_block["y"] = $y; + } + + if (is_numeric($w)) { + $this->_containing_block["w"] = $w; + } + + if (is_numeric($h)) { + $this->_containing_block["h"] = $h; + } + } + + /** + * @param float|float[]|null $x + * @param float|null $y + */ + public function set_position($x = null, $y = null) + { + if (is_array($x)) { + list($x, $y) = [$x["x"], $x["y"]]; + } + + if (is_numeric($x)) { + $this->_position["x"] = $x; + } + + if (is_numeric($y)) { + $this->_position["y"] = $y; + } + } + + /** + * @param float $opacity + */ + public function set_opacity(float $opacity): void + { + $parent = $this->get_parent(); + $base_opacity = $parent && $parent->_opacity !== null ? $parent->_opacity : 1.0; + $this->_opacity = $base_opacity * $opacity; + } + + /** + * @param LineBox $line + */ + public function set_containing_line(LineBox $line) + { + $this->_containing_line = $line; + } + + /** + * Indicates if the margin height is auto sized + * + * @return bool + */ + public function is_auto_height() + { + $style = $this->_style; + + return in_array( + "auto", + [ + $style->height, + $style->margin_top, + $style->margin_bottom, + $style->border_top_width, + $style->border_bottom_width, + $style->padding_top, + $style->padding_bottom, + $this->_containing_block["h"] + ], + true + ); + } + + /** + * Indicates if the margin width is auto sized + * + * @return bool + */ + public function is_auto_width() + { + $style = $this->_style; + + return in_array( + "auto", + [ + $style->width, + $style->margin_left, + $style->margin_right, + $style->border_left_width, + $style->border_right_width, + $style->padding_left, + $style->padding_right, + $this->_containing_block["w"] + ], + true + ); + } + + /** + * Tells if the frame is a text node + * + * @return bool + */ + public function is_text_node(): bool + { + if (isset($this->_is_cache["text_node"])) { + return $this->_is_cache["text_node"]; + } + + return $this->_is_cache["text_node"] = ($this->get_node()->nodeName === "#text"); + } + + /** + * @return bool + */ + public function is_positioned(): bool + { + if (isset($this->_is_cache["positioned"])) { + return $this->_is_cache["positioned"]; + } + + $position = $this->get_style()->position; + + return $this->_is_cache["positioned"] = in_array($position, Style::POSITIONED_TYPES, true); + } + + /** + * @return bool + */ + public function is_absolute(): bool + { + if (isset($this->_is_cache["absolute"])) { + return $this->_is_cache["absolute"]; + } + + return $this->_is_cache["absolute"] = $this->get_style()->is_absolute(); + } + + /** + * Whether the frame is a block container. + * + * @return bool + */ + public function is_block(): bool + { + if (isset($this->_is_cache["block"])) { + return $this->_is_cache["block"]; + } + + return $this->_is_cache["block"] = in_array($this->get_style()->display, Style::BLOCK_TYPES, true); + } + + /** + * Whether the frame has a block-level display type. + * + * @return bool + */ + public function is_block_level(): bool + { + if (isset($this->_is_cache["block_level"])) { + return $this->_is_cache["block_level"]; + } + + $display = $this->get_style()->display; + + return $this->_is_cache["block_level"] = in_array($display, Style::BLOCK_LEVEL_TYPES, true); + } + + /** + * Whether the frame has an inline-level display type. + * + * @return bool + */ + public function is_inline_level(): bool + { + if (isset($this->_is_cache["inline_level"])) { + return $this->_is_cache["inline_level"]; + } + + $display = $this->get_style()->display; + + return $this->_is_cache["inline_level"] = in_array($display, Style::INLINE_LEVEL_TYPES, true); + } + + /** + * @return bool + */ + public function is_in_flow(): bool + { + if (isset($this->_is_cache["in_flow"])) { + return $this->_is_cache["in_flow"]; + } + + return $this->_is_cache["in_flow"] = $this->get_style()->is_in_flow(); + } + + /** + * @return bool + */ + public function is_pre(): bool + { + if (isset($this->_is_cache["pre"])) { + return $this->_is_cache["pre"]; + } + + $white_space = $this->get_style()->white_space; + + return $this->_is_cache["pre"] = in_array($white_space, ["pre", "pre-wrap"], true); + } + + /** + * @return bool + */ + public function is_table(): bool + { + if (isset($this->_is_cache["table"])) { + return $this->_is_cache["table"]; + } + + $display = $this->get_style()->display; + + return $this->_is_cache["table"] = in_array($display, Style::TABLE_TYPES, true); + } + + + /** + * Inserts a new child at the beginning of the Frame + * + * @param Frame $child The new Frame to insert + * @param bool $update_node Whether or not to update the DOM + */ + public function prepend_child(Frame $child, $update_node = true) + { + if ($update_node) { + $this->_node->insertBefore($child->_node, $this->_first_child ? $this->_first_child->_node : null); + } + + // Remove the child from its parent + if ($child->_parent) { + $child->_parent->remove_child($child, false); + } + + $child->_parent = $this; + $decorator = $child->get_decorator(); + // force an update to the cached parent + if ($decorator !== null) { + $decorator->get_parent(false); + } + $child->_prev_sibling = null; + + // Handle the first child + if (!$this->_first_child) { + $this->_first_child = $child; + $this->_last_child = $child; + $child->_next_sibling = null; + } else { + $this->_first_child->_prev_sibling = $child; + $child->_next_sibling = $this->_first_child; + $this->_first_child = $child; + } + } + + /** + * Inserts a new child at the end of the Frame + * + * @param Frame $child The new Frame to insert + * @param bool $update_node Whether or not to update the DOM + */ + public function append_child(Frame $child, $update_node = true) + { + if ($update_node) { + $this->_node->appendChild($child->_node); + } + + // Remove the child from its parent + if ($child->_parent) { + $child->_parent->remove_child($child, false); + } + + $child->_parent = $this; + $decorator = $child->get_decorator(); + // force an update to the cached parent + if ($decorator !== null) { + $decorator->get_parent(false); + } + $child->_next_sibling = null; + + // Handle the first child + if (!$this->_last_child) { + $this->_first_child = $child; + $this->_last_child = $child; + $child->_prev_sibling = null; + } else { + $this->_last_child->_next_sibling = $child; + $child->_prev_sibling = $this->_last_child; + $this->_last_child = $child; + } + } + + /** + * Inserts a new child immediately before the specified frame + * + * @param Frame $new_child The new Frame to insert + * @param Frame $ref The Frame after the new Frame + * @param bool $update_node Whether or not to update the DOM + * + * @throws Exception + */ + public function insert_child_before(Frame $new_child, Frame $ref, $update_node = true) + { + if ($ref === $this->_first_child) { + $this->prepend_child($new_child, $update_node); + + return; + } + + if (is_null($ref)) { + $this->append_child($new_child, $update_node); + + return; + } + + if ($ref->_parent !== $this) { + throw new Exception("Reference child is not a child of this node."); + } + + // Update the node + if ($update_node) { + $this->_node->insertBefore($new_child->_node, $ref->_node); + } + + // Remove the child from its parent + if ($new_child->_parent) { + $new_child->_parent->remove_child($new_child, false); + } + + $new_child->_parent = $this; + $decorator = $new_child->get_decorator(); + // force an update to the cached parent + if ($decorator !== null) { + $decorator->get_parent(false); + } + $new_child->_next_sibling = $ref; + $new_child->_prev_sibling = $ref->_prev_sibling; + + if ($ref->_prev_sibling) { + $ref->_prev_sibling->_next_sibling = $new_child; + } + + $ref->_prev_sibling = $new_child; + } + + /** + * Inserts a new child immediately after the specified frame + * + * @param Frame $new_child The new Frame to insert + * @param Frame $ref The Frame before the new Frame + * @param bool $update_node Whether or not to update the DOM + * + * @throws Exception + */ + public function insert_child_after(Frame $new_child, Frame $ref, $update_node = true) + { + if ($ref === $this->_last_child) { + $this->append_child($new_child, $update_node); + + return; + } + + if (is_null($ref)) { + $this->prepend_child($new_child, $update_node); + + return; + } + + if ($ref->_parent !== $this) { + throw new Exception("Reference child is not a child of this node."); + } + + // Update the node + if ($update_node) { + if ($ref->_next_sibling) { + $next_node = $ref->_next_sibling->_node; + $this->_node->insertBefore($new_child->_node, $next_node); + } else { + $new_child->_node = $this->_node->appendChild($new_child->_node); + } + } + + // Remove the child from its parent + if ($new_child->_parent) { + $new_child->_parent->remove_child($new_child, false); + } + + $new_child->_parent = $this; + $decorator = $new_child->get_decorator(); + // force an update to the cached parent + if ($decorator !== null) { + $decorator->get_parent(false); + } + $new_child->_prev_sibling = $ref; + $new_child->_next_sibling = $ref->_next_sibling; + + if ($ref->_next_sibling) { + $ref->_next_sibling->_prev_sibling = $new_child; + } + + $ref->_next_sibling = $new_child; + } + + /** + * Remove a child frame + * + * @param Frame $child + * @param bool $update_node Whether or not to remove the DOM node + * + * @throws Exception + * @return Frame The removed child frame + */ + public function remove_child(Frame $child, $update_node = true) + { + if ($child->_parent !== $this) { + throw new Exception("Child not found in this frame"); + } + + if ($update_node) { + $this->_node->removeChild($child->_node); + } + + if ($child === $this->_first_child) { + $this->_first_child = $child->_next_sibling; + } + + if ($child === $this->_last_child) { + $this->_last_child = $child->_prev_sibling; + } + + if ($child->_prev_sibling) { + $child->_prev_sibling->_next_sibling = $child->_next_sibling; + } + + if ($child->_next_sibling) { + $child->_next_sibling->_prev_sibling = $child->_prev_sibling; + } + + $child->_next_sibling = null; + $child->_prev_sibling = null; + $child->_parent = null; + + // Force an update to the cached decorator parent + $decorator = $child->get_decorator(); + if ($decorator !== null) { + $decorator->get_parent(false); + } + + return $child; + } + + //........................................................................ + + // Debugging function: + /** + * @return string + */ + public function __toString() + { + // Skip empty text frames +// if ( $this->is_text_node() && +// preg_replace("/\s/", "", $this->_node->data) === "" ) +// return ""; + + + $str = "" . $this->_node->nodeName . ":
"; + //$str .= spl_object_hash($this->_node) . "
"; + $str .= "Id: " . $this->get_id() . "
"; + $str .= "Class: " . get_class($this) . "
"; + + if ($this->is_text_node()) { + $tmp = htmlspecialchars($this->_node->nodeValue); + $str .= "
'" . mb_substr($tmp, 0, 70, "UTF-8") .
+                (mb_strlen($tmp, "UTF-8") > 70 ? "..." : "") . "'
"; + } elseif ($css_class = $this->_node->getAttribute("class")) { + $str .= "CSS class: '$css_class'
"; + } + + if ($this->_parent) { + $str .= "\nParent:" . $this->_parent->_node->nodeName . + " (" . spl_object_hash($this->_parent->_node) . ") " . + "
"; + } + + if ($this->_prev_sibling) { + $str .= "Prev: " . $this->_prev_sibling->_node->nodeName . + " (" . spl_object_hash($this->_prev_sibling->_node) . ") " . + "
"; + } + + if ($this->_next_sibling) { + $str .= "Next: " . $this->_next_sibling->_node->nodeName . + " (" . spl_object_hash($this->_next_sibling->_node) . ") " . + "
"; + } + + $d = $this->get_decorator(); + while ($d && $d != $d->get_decorator()) { + $str .= "Decorator: " . get_class($d) . "
"; + $d = $d->get_decorator(); + } + + $str .= "Position: " . Helpers::pre_r($this->_position, true); + $str .= "\nContaining block: " . Helpers::pre_r($this->_containing_block, true); + $str .= "\nMargin width: " . Helpers::pre_r($this->get_margin_width(), true); + $str .= "\nMargin height: " . Helpers::pre_r($this->get_margin_height(), true); + + $str .= "\nStyle:
" . $this->_style->__toString() . "
"; + + if ($this->_decorator instanceof FrameDecorator\Block) { + $str .= "Lines:
";
+            foreach ($this->_decorator->get_line_boxes() as $line) {
+                foreach ($line->get_frames() as $frame) {
+                    if ($frame instanceof FrameDecorator\Text) {
+                        $str .= "\ntext: ";
+                        $str .= "'" . htmlspecialchars($frame->get_text()) . "'";
+                    } else {
+                        $str .= "\nBlock: " . $frame->get_node()->nodeName . " (" . spl_object_hash($frame->get_node()) . ")";
+                    }
+                }
+
+                $str .=
+                    "\ny => " . $line->y . "\n" .
+                    "w => " . $line->w . "\n" .
+                    "h => " . $line->h . "\n" .
+                    "left => " . $line->left . "\n" .
+                    "right => " . $line->right . "\n";
+            }
+            $str .= "
"; + } + + $str .= "\n"; + if (php_sapi_name() === "cli") { + $str = strip_tags(str_replace(["
", "", ""], + ["\n", "", ""], + $str)); + } + + return $str; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Frame/Factory.php b/dompdf/vendor/dompdf/dompdf/src/Frame/Factory.php new file mode 100644 index 0000000..be39ff3 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Frame/Factory.php @@ -0,0 +1,262 @@ +set_reflower(new PageFrameReflower($frame)); + $root->set_decorator($frame); + + return $frame; + } + + /** + * Decorate a Frame + * + * @param Frame $frame The frame to decorate + * @param Dompdf $dompdf The dompdf instance + * @param Frame|null $root The root of the frame + * + * @throws Exception + * @return AbstractFrameDecorator|null + * FIXME: this is admittedly a little smelly... + */ + public static function decorate_frame(Frame $frame, Dompdf $dompdf, ?Frame $root = null): ?AbstractFrameDecorator + { + $style = $frame->get_style(); + $display = $style->display; + + switch ($display) { + + case "block": + $positioner = "Block"; + $decorator = "Block"; + $reflower = "Block"; + break; + + case "inline-block": + $positioner = "Inline"; + $decorator = "Block"; + $reflower = "Block"; + break; + + case "inline": + $positioner = "Inline"; + if ($frame->is_text_node()) { + $decorator = "Text"; + $reflower = "Text"; + } else { + $decorator = "Inline"; + $reflower = "Inline"; + } + break; + + case "table": + $positioner = "Block"; + $decorator = "Table"; + $reflower = "Table"; + break; + + case "inline-table": + $positioner = "Inline"; + $decorator = "Table"; + $reflower = "Table"; + break; + + case "table-row-group": + case "table-header-group": + case "table-footer-group": + $positioner = "NullPositioner"; + $decorator = "TableRowGroup"; + $reflower = "TableRowGroup"; + break; + + case "table-row": + $positioner = "NullPositioner"; + $decorator = "TableRow"; + $reflower = "TableRow"; + break; + + case "table-cell": + $positioner = "TableCell"; + $decorator = "TableCell"; + $reflower = "TableCell"; + break; + + case "list-item": + $positioner = "Block"; + $decorator = "Block"; + $reflower = "Block"; + break; + + case "-dompdf-list-bullet": + if ($style->list_style_position === "inside") { + $positioner = "Inline"; + } else { + $positioner = "ListBullet"; + } + + if ($style->list_style_image !== "none") { + $decorator = "ListBulletImage"; + } else { + $decorator = "ListBullet"; + } + + $reflower = "ListBullet"; + break; + + case "-dompdf-image": + $positioner = "Inline"; + $decorator = "Image"; + $reflower = "Image"; + break; + + case "-dompdf-br": + $positioner = "Inline"; + $decorator = "Inline"; + $reflower = "Inline"; + break; + + default: + case "none": + if ($style->_dompdf_keep !== "yes") { + // Remove the node and the frame + $frame->get_parent()->remove_child($frame); + return null; + } + + $positioner = "NullPositioner"; + $decorator = "NullFrameDecorator"; + $reflower = "NullFrameReflower"; + break; + } + + // Handle CSS position + $position = $style->position; + + if ($position === "absolute") { + $positioner = "Absolute"; + } elseif ($position === "fixed") { + $positioner = "Fixed"; + } + + $node = $frame->get_node(); + + // Handle nodeName + if ($node->nodeName === "img") { + $style->set_prop("display", "-dompdf-image"); + $decorator = "Image"; + $reflower = "Image"; + } + + $decorator = "Dompdf\\FrameDecorator\\$decorator"; + $reflower = "Dompdf\\FrameReflower\\$reflower"; + + /** @var AbstractFrameDecorator $deco */ + $deco = new $decorator($frame, $dompdf); + + $deco->set_positioner(self::getPositionerInstance($positioner)); + $deco->set_reflower(new $reflower($deco, $dompdf->getFontMetrics())); + + if ($root) { + $deco->set_root($root); + } + + if ($display === "list-item") { + // Insert a list-bullet frame + $xml = $dompdf->getDom(); + $bullet_node = $xml->createElement("bullet"); // arbitrary choice + $b_f = new Frame($bullet_node); + + $node = $frame->get_node(); + $parent_node = $node->parentNode; + if ($parent_node && $parent_node instanceof \DOMElement) { + if (!$parent_node->hasAttribute("dompdf-children-count")) { + $xpath = new DOMXPath($xml); + $count = $xpath->query("li", $parent_node)->length; + $parent_node->setAttribute("dompdf-children-count", $count); + } + + if (is_numeric($node->getAttribute("value"))) { + $index = intval($node->getAttribute("value")); + } else { + if (!$parent_node->hasAttribute("dompdf-counter")) { + $index = ($parent_node->hasAttribute("start") ? $parent_node->getAttribute("start") : 1); + } else { + $index = (int)$parent_node->getAttribute("dompdf-counter") + 1; + } + } + + $parent_node->setAttribute("dompdf-counter", $index); + $bullet_node->setAttribute("dompdf-counter", $index); + } + + $new_style = $dompdf->getCss()->create_style(); + $new_style->set_prop("display", "-dompdf-list-bullet"); + $new_style->inherit($style); + $b_f->set_style($new_style); + + $deco->prepend_child(Factory::decorate_frame($b_f, $dompdf, $root)); + } + + return $deco; + } + + /** + * Creates Positioners + * + * @param string $type Type of positioner to use + * + * @return AbstractPositioner + */ + protected static function getPositionerInstance(string $type): AbstractPositioner + { + if (!isset(self::$_positioners[$type])) { + $class = '\\Dompdf\\Positioner\\'.$type; + self::$_positioners[$type] = new $class(); + } + return self::$_positioners[$type]; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Frame/FrameListIterator.php b/dompdf/vendor/dompdf/dompdf/src/Frame/FrameListIterator.php new file mode 100644 index 0000000..0157550 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Frame/FrameListIterator.php @@ -0,0 +1,100 @@ +parent = $frame; + $this->rewind(); + } + + public function rewind(): void + { + $this->cur = $this->parent->get_first_child(); + $this->prev = null; + $this->num = 0; + } + + /** + * @return bool + */ + public function valid(): bool + { + return $this->cur !== null; + } + + /** + * @return int + */ + public function key(): int + { + return $this->num; + } + + /** + * @return Frame|null + */ + public function current(): ?Frame + { + return $this->cur; + } + + public function next(): void + { + if ($this->cur === null) { + return; + } + + if ($this->cur->get_parent() === $this->parent) { + $this->prev = $this->cur; + $this->cur = $this->cur->get_next_sibling(); + $this->num++; + } else { + // Continue from the previous child if the current frame has been + // moved to another parent + $this->cur = $this->prev !== null + ? $this->prev->get_next_sibling() + : $this->parent->get_first_child(); + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Frame/FrameTree.php b/dompdf/vendor/dompdf/dompdf/src/Frame/FrameTree.php new file mode 100644 index 0000000..6d012d8 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Frame/FrameTree.php @@ -0,0 +1,324 @@ +_dom = $dom; + $this->_root = null; + $this->_registry = []; + } + + /** + * Returns the DOMDocument object representing the current html document + * + * @return DOMDocument + */ + public function get_dom() + { + return $this->_dom; + } + + /** + * Returns the root frame of the tree + * + * @return Frame + */ + public function get_root() + { + return $this->_root; + } + + /** + * Returns a specific frame given its id + * + * @param string $id + * + * @return Frame|null + */ + public function get_frame($id) + { + return isset($this->_registry[$id]) ? $this->_registry[$id] : null; + } + + /** + * Returns a post-order iterator for all frames in the tree + * + * @deprecated Iterate the tree directly instead + * @return FrameTreeIterator + */ + public function get_frames(): FrameTreeIterator + { + return new FrameTreeIterator($this->_root); + } + + /** + * Returns a post-order iterator for all frames in the tree + * + * @return FrameTreeIterator + */ + public function getIterator(): FrameTreeIterator + { + return new FrameTreeIterator($this->_root); + } + + /** + * Builds the tree + */ + public function build_tree() + { + $html = $this->_dom->getElementsByTagName("html")->item(0); + if (is_null($html)) { + $html = $this->_dom->firstChild; + } + + if (is_null($html)) { + throw new Exception("Requested HTML document contains no data."); + } + + $this->fix_tables(); + + $this->_root = $this->_build_tree_r($html); + } + + /** + * Adds missing TBODYs around TR + */ + protected function fix_tables() + { + $xp = new DOMXPath($this->_dom); + + // Move table caption before the table + // FIXME find a better way to deal with it... + $captions = $xp->query('//table/caption'); + foreach ($captions as $caption) { + $table = $caption->parentNode; + $table->parentNode->insertBefore($caption, $table); + } + + $firstRows = $xp->query('//table/tr[1]'); + /** @var DOMElement $tableChild */ + foreach ($firstRows as $tableChild) { + $tbody = $this->_dom->createElement('tbody'); + $tableNode = $tableChild->parentNode; + do { + if ($tableChild->nodeName === 'tr') { + $tmpNode = $tableChild; + $tableChild = $tableChild->nextSibling; + $tableNode->removeChild($tmpNode); + $tbody->appendChild($tmpNode); + } else { + if ($tbody->hasChildNodes() === true) { + $tableNode->insertBefore($tbody, $tableChild); + $tbody = $this->_dom->createElement('tbody'); + } + $tableChild = $tableChild->nextSibling; + } + } while ($tableChild); + if ($tbody->hasChildNodes() === true) { + $tableNode->appendChild($tbody); + } + } + } + + // FIXME: temporary hack, preferably we will improve rendering of sequential #text nodes + /** + * Remove a child from a node + * + * Remove a child from a node. If the removed node results in two + * adjacent #text nodes then combine them. + * + * @param DOMNode $node the current DOMNode being considered + * @param array $children an array of nodes that are the children of $node + * @param int $index index from the $children array of the node to remove + */ + protected function _remove_node(DOMNode $node, array &$children, $index) + { + $child = $children[$index]; + $previousChild = $child->previousSibling; + $nextChild = $child->nextSibling; + $node->removeChild($child); + if (isset($previousChild, $nextChild)) { + if ($previousChild->nodeName === "#text" && $nextChild->nodeName === "#text") { + $previousChild->nodeValue .= $nextChild->nodeValue; + $this->_remove_node($node, $children, $index+1); + } + } + array_splice($children, $index, 1); + } + + /** + * Recursively adds {@link Frame} objects to the tree + * + * Recursively build a tree of Frame objects based on a dom tree. + * No layout information is calculated at this time, although the + * tree may be adjusted (i.e. nodes and frames for generated content + * and images may be created). + * + * @param DOMNode $node the current DOMNode being considered + * + * @return Frame + */ + protected function _build_tree_r(DOMNode $node) + { + $frame = new Frame($node); + $id = $frame->get_id(); + $this->_registry[$id] = $frame; + + if (!$node->hasChildNodes()) { + return $frame; + } + + // Store the children in an array so that the tree can be modified + $children = []; + $length = $node->childNodes->length; + for ($i = 0; $i < $length; $i++) { + $children[] = $node->childNodes->item($i); + } + $index = 0; + // INFO: We don't advance $index if a node is removed to avoid skipping nodes + while ($index < count($children)) { + $child = $children[$index]; + $nodeName = strtolower($child->nodeName); + + // Skip non-displaying nodes + if (in_array($nodeName, self::$HIDDEN_TAGS)) { + if ($nodeName !== "head" && $nodeName !== "style") { + $this->_remove_node($node, $children, $index); + } else { + $index++; + } + continue; + } + // Skip empty text nodes + if ($nodeName === "#text" && $child->nodeValue === "") { + $this->_remove_node($node, $children, $index); + continue; + } + // Skip empty image nodes + if ($nodeName === "img" && $child->getAttribute("src") === "") { + $this->_remove_node($node, $children, $index); + continue; + } + + if (is_object($child)) { + $frame->append_child($this->_build_tree_r($child), false); + } + $index++; + } + + return $frame; + } + + /** + * @param DOMElement $node + * @param DOMElement $new_node + * @param string $pos + * + * @return mixed + */ + public function insert_node(DOMElement $node, DOMElement $new_node, $pos) + { + if ($pos === "after" || !$node->firstChild) { + $node->appendChild($new_node); + } else { + $node->insertBefore($new_node, $node->firstChild); + } + + $this->_build_tree_r($new_node); + + $frame_id = $new_node->getAttribute("frame_id"); + $frame = $this->get_frame($frame_id); + + $parent_id = $node->getAttribute("frame_id"); + $parent = $this->get_frame($parent_id); + + if ($parent) { + if ($pos === "before") { + $parent->prepend_child($frame, false); + } else { + $parent->append_child($frame, false); + } + } + + return $frame_id; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Frame/FrameTreeIterator.php b/dompdf/vendor/dompdf/dompdf/src/Frame/FrameTreeIterator.php new file mode 100644 index 0000000..4da8da1 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Frame/FrameTreeIterator.php @@ -0,0 +1,88 @@ +_stack[] = $this->_root = $root; + $this->_num = 0; + } + + public function rewind(): void + { + $this->_stack = [$this->_root]; + $this->_num = 0; + } + + /** + * @return bool + */ + public function valid(): bool + { + return count($this->_stack) > 0; + } + + /** + * @return int + */ + public function key(): int + { + return $this->_num; + } + + /** + * @return Frame + */ + public function current(): Frame + { + return end($this->_stack); + } + + public function next(): void + { + $b = array_pop($this->_stack); + $this->_num++; + + // Push all children onto the stack in reverse order + if ($c = $b->get_last_child()) { + $this->_stack[] = $c; + while ($c = $c->get_prev_sibling()) { + $this->_stack[] = $c; + } + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/AbstractFrameDecorator.php b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/AbstractFrameDecorator.php new file mode 100644 index 0000000..4ab7e7f --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/AbstractFrameDecorator.php @@ -0,0 +1,925 @@ + counter_value) (for generated content) + * + * @var array + */ + public $_counters = []; + + /** + * The root node of the DOM tree + * + * @var Frame + */ + protected $_root; + + /** + * The decorated frame + * + * @var Frame + */ + protected $_frame; + + /** + * AbstractPositioner object used to position this frame (Strategy pattern) + * + * @var AbstractPositioner + */ + protected $_positioner; + + /** + * Reflower object used to calculate frame dimensions (Strategy pattern) + * + * @var AbstractFrameReflower + */ + protected $_reflower; + + /** + * Reference to the current dompdf instance + * + * @var Dompdf + */ + protected $_dompdf; + + /** + * First block parent + * + * @var Block + */ + private $_block_parent; + + /** + * First positioned parent (position: relative | absolute | fixed) + * + * @var AbstractFrameDecorator + */ + private $_positioned_parent; + + /** + * Cache for the get_parent while loop results + * + * @var Frame + */ + private $_cached_parent; + + /** + * Whether generated content and counters have been set. + * + * @var bool + */ + public $content_set = false; + + /** + * Whether the frame has been split + * + * @var bool + */ + public $is_split = false; + + /** + * Whether the frame is a split-off frame + * + * @var bool + */ + public $is_split_off = false; + + /** + * Class constructor + * + * @param Frame $frame The decoration target + * @param Dompdf $dompdf The Dompdf object + */ + function __construct(Frame $frame, Dompdf $dompdf) + { + $this->_frame = $frame; + $this->_root = null; + $this->_dompdf = $dompdf; + $frame->set_decorator($this); + } + + /** + * "Destructor": forcibly free all references held by this object + * + * @param bool $recursive if true, call dispose on all children + */ + function dispose($recursive = false) + { + if ($recursive) { + while ($child = $this->get_first_child()) { + $child->dispose(true); + } + } + + $this->_root = null; + unset($this->_root); + + $this->_frame->dispose(true); + $this->_frame = null; + unset($this->_frame); + + $this->_positioner = null; + unset($this->_positioner); + + $this->_reflower = null; + unset($this->_reflower); + } + + /** + * Return a copy of this frame with $node as its node + * + * @param DOMNode $node + * + * @return AbstractFrameDecorator + */ + function copy(DOMNode $node) + { + $frame = new Frame($node); + $style = clone $this->_frame->get_style(); + + $style->reset(); + $frame->set_style($style); + + if ($node instanceof DOMElement && $node->hasAttribute("id")) { + $node->setAttribute("data-dompdf-original-id", $node->getAttribute("id")); + $node->removeAttribute("id"); + } + + $deco = Factory::decorate_frame($frame, $this->_dompdf, $this->_root); + + if ($this instanceof Text) { + $deco->trailingWs = $this->trailingWs; + } + + return $deco; + } + + /** + * Create a deep copy: copy this node and all children + * + * @return AbstractFrameDecorator + */ + function deep_copy() + { + $node = $this->_frame->get_node()->cloneNode(); + $frame = new Frame($node); + $style = clone $this->_frame->get_style(); + + $style->reset(); + $frame->set_style($style); + + if ($node instanceof DOMElement && $node->hasAttribute("id")) { + $node->setAttribute("data-dompdf-original-id", $node->getAttribute("id")); + $node->removeAttribute("id"); + } + + $deco = Factory::decorate_frame($frame, $this->_dompdf, $this->_root); + + if ($this instanceof Text) { + $deco->trailingWs = $this->trailingWs; + } + + foreach ($this->get_children() as $child) { + $deco->append_child($child->deep_copy()); + } + + return $deco; + } + + /** + * Create an anonymous child frame, inheriting styles from this frame. + * + * @param string $node_name + * @param string $display + * + * @return AbstractFrameDecorator + */ + public function create_anonymous_child(string $node_name, string $display): AbstractFrameDecorator + { + $style = $this->get_style(); + $child_style = $style->get_stylesheet()->create_style(); + $child_style->set_prop("display", $display); + $child_style->inherit($style); + + $node = $this->get_node()->ownerDocument->createElement($node_name); + $frame = new Frame($node); + $frame->set_style($child_style); + + return Factory::decorate_frame($frame, $this->_dompdf, $this->_root); + } + + function reset() + { + $this->_frame->reset(); + $this->_reflower->reset(); + $this->reset_generated_content(); + $this->revert_counter_increment(); + + $this->content_set = false; + $this->_counters = []; + + // clear parent lookup caches + $this->_cached_parent = null; + $this->_block_parent = null; + $this->_positioned_parent = null; + + // Reset all children + foreach ($this->get_children() as $child) { + $child->reset(); + } + } + + /** + * If this represents a generated node then child nodes represent generated + * content. Remove the children since the content will be generated next + * time this frame is reflowed. + */ + protected function reset_generated_content(): void + { + if ($this->content_set + && $this->get_node()->nodeName === "dompdf_generated" + ) { + $content = $this->get_style()->content; + + if ($content !== "normal" && $content !== "none") { + foreach ($this->get_children() as $child) { + $this->remove_child($child); + } + } + } + } + + /** + * Decrement any counters that were incremented on the current node, unless + * that node is the body. + */ + protected function revert_counter_increment(): void + { + if ($this->content_set + && $this->get_node()->nodeName !== "body" + && ($decrement = $this->get_style()->counter_increment) !== "none" + ) { + $this->decrement_counters($decrement); + } + } + + // Getters ----------- + + function get_id() + { + return $this->_frame->get_id(); + } + + /** + * @return Frame + */ + function get_frame() + { + return $this->_frame; + } + + function get_node() + { + return $this->_frame->get_node(); + } + + function get_style() + { + return $this->_frame->get_style(); + } + + /** + * @deprecated + */ + function get_original_style() + { + return $this->_frame->get_style(); + } + + function get_containing_block($i = null) + { + return $this->_frame->get_containing_block($i); + } + + function get_position($i = null) + { + return $this->_frame->get_position($i); + } + + /** + * @return Dompdf + */ + function get_dompdf() + { + return $this->_dompdf; + } + + public function get_margin_width(): float + { + return $this->_frame->get_margin_width(); + } + + public function get_margin_height(): float + { + return $this->_frame->get_margin_height(); + } + + public function get_content_box(): array + { + return $this->_frame->get_content_box(); + } + + public function get_padding_box(): array + { + return $this->_frame->get_padding_box(); + } + + public function get_border_box(): array + { + return $this->_frame->get_border_box(); + } + + function set_id($id) + { + $this->_frame->set_id($id); + } + + public function set_style(Style $style): void + { + $this->_frame->set_style($style); + } + + function set_containing_block($x = null, $y = null, $w = null, $h = null) + { + $this->_frame->set_containing_block($x, $y, $w, $h); + } + + function set_position($x = null, $y = null) + { + $this->_frame->set_position($x, $y); + } + + function is_auto_height() + { + return $this->_frame->is_auto_height(); + } + + function is_auto_width() + { + return $this->_frame->is_auto_width(); + } + + function __toString() + { + return $this->_frame->__toString(); + } + + function prepend_child(Frame $child, $update_node = true) + { + while ($child instanceof AbstractFrameDecorator) { + $child = $child->_frame; + } + + $this->_frame->prepend_child($child, $update_node); + } + + function append_child(Frame $child, $update_node = true) + { + while ($child instanceof AbstractFrameDecorator) { + $child = $child->_frame; + } + + $this->_frame->append_child($child, $update_node); + } + + function insert_child_before(Frame $new_child, Frame $ref, $update_node = true) + { + while ($new_child instanceof AbstractFrameDecorator) { + $new_child = $new_child->_frame; + } + + if ($ref instanceof AbstractFrameDecorator) { + $ref = $ref->_frame; + } + + $this->_frame->insert_child_before($new_child, $ref, $update_node); + } + + function insert_child_after(Frame $new_child, Frame $ref, $update_node = true) + { + $insert_frame = $new_child; + while ($insert_frame instanceof AbstractFrameDecorator) { + $insert_frame = $insert_frame->_frame; + } + + $reference_frame = $ref; + while ($reference_frame instanceof AbstractFrameDecorator) { + $reference_frame = $reference_frame->_frame; + } + + $this->_frame->insert_child_after($insert_frame, $reference_frame, $update_node); + } + + function remove_child(Frame $child, $update_node = true) + { + while ($child instanceof AbstractFrameDecorator) { + $child = $child->_frame; + } + + return $this->_frame->remove_child($child, $update_node); + } + + /** + * @param bool $use_cache + * @return AbstractFrameDecorator + */ + function get_parent($use_cache = true) + { + if ($use_cache && $this->_cached_parent) { + return $this->_cached_parent; + } + $p = $this->_frame->get_parent(); + if ($p && $deco = $p->get_decorator()) { + while ($tmp = $deco->get_decorator()) { + $deco = $tmp; + } + + return $this->_cached_parent = $deco; + } else { + return $this->_cached_parent = $p; + } + } + + /** + * @return AbstractFrameDecorator + */ + function get_first_child() + { + $c = $this->_frame->get_first_child(); + if ($c && $deco = $c->get_decorator()) { + while ($tmp = $deco->get_decorator()) { + $deco = $tmp; + } + + return $deco; + } else { + if ($c) { + return $c; + } + } + + return null; + } + + /** + * @return AbstractFrameDecorator + */ + function get_last_child() + { + $c = $this->_frame->get_last_child(); + if ($c && $deco = $c->get_decorator()) { + while ($tmp = $deco->get_decorator()) { + $deco = $tmp; + } + + return $deco; + } else { + if ($c) { + return $c; + } + } + + return null; + } + + /** + * @return AbstractFrameDecorator + */ + function get_prev_sibling() + { + $s = $this->_frame->get_prev_sibling(); + if ($s && $deco = $s->get_decorator()) { + while ($tmp = $deco->get_decorator()) { + $deco = $tmp; + } + + return $deco; + } else { + if ($s) { + return $s; + } + } + + return null; + } + + /** + * @return AbstractFrameDecorator + */ + function get_next_sibling() + { + $s = $this->_frame->get_next_sibling(); + if ($s && $deco = $s->get_decorator()) { + while ($tmp = $deco->get_decorator()) { + $deco = $tmp; + } + + return $deco; + } else { + if ($s) { + return $s; + } + } + + return null; + } + + /** + * @return FrameListIterator + */ + public function get_children(): FrameListIterator + { + return new FrameListIterator($this); + } + + /** + * @return FrameTreeIterator + */ + function get_subtree(): FrameTreeIterator + { + return new FrameTreeIterator($this); + } + + function set_positioner(AbstractPositioner $posn) + { + $this->_positioner = $posn; + if ($this->_frame instanceof AbstractFrameDecorator) { + $this->_frame->set_positioner($posn); + } + } + + function set_reflower(AbstractFrameReflower $reflower) + { + $this->_reflower = $reflower; + if ($this->_frame instanceof AbstractFrameDecorator) { + $this->_frame->set_reflower($reflower); + } + } + + /** + * @return AbstractPositioner + */ + function get_positioner() + { + return $this->_positioner; + } + + /** + * @return AbstractFrameReflower + */ + function get_reflower() + { + return $this->_reflower; + } + + /** + * @param Frame $root + */ + function set_root(Frame $root) + { + $this->_root = $root; + + if ($this->_frame instanceof AbstractFrameDecorator) { + $this->_frame->set_root($root); + } + } + + /** + * @return Page + */ + function get_root() + { + return $this->_root; + } + + /** + * @return Block + */ + function find_block_parent() + { + // Find our nearest block level parent + if (isset($this->_block_parent)) { + return $this->_block_parent; + } + + $p = $this->get_parent(); + + while ($p) { + if ($p->is_block()) { + break; + } + + $p = $p->get_parent(); + } + + return $this->_block_parent = $p; + } + + /** + * @return AbstractFrameDecorator + */ + function find_positioned_parent() + { + // Find our nearest relative positioned parent + if (isset($this->_positioned_parent)) { + return $this->_positioned_parent; + } + + $p = $this->get_parent(); + while ($p) { + if ($p->is_positioned()) { + break; + } + + $p = $p->get_parent(); + } + + if (!$p) { + $p = $this->_root; + } + + return $this->_positioned_parent = $p; + } + + /** + * Split this frame at $child. + * The current frame is cloned and $child and all children following + * $child are added to the clone. The clone is then passed to the + * current frame's parent->split() method. + * + * @param Frame|null $child + * @param bool $page_break + * @param bool $forced Whether the page break is forced. + * + * @throws Exception + */ + public function split(?Frame $child = null, bool $page_break = false, bool $forced = false): void + { + if (is_null($child)) { + $this->get_parent()->split($this, $page_break, $forced); + return; + } + + if ($child->get_parent() !== $this) { + throw new Exception("Unable to split: frame is not a child of this one."); + } + + $this->revert_counter_increment(); + + $node = $this->_frame->get_node(); + $split = $this->copy($node->cloneNode()); + + $style = $this->_frame->get_style(); + $split_style = $split->get_style(); + + // Truncate the box decoration at the split, except for the body + if ($node->nodeName !== "body") { + // Clear bottom decoration of original frame + $style->margin_bottom = 0.0; + $style->padding_bottom = 0.0; + $style->border_bottom_width = 0.0; + $style->border_bottom_left_radius = 0.0; + $style->border_bottom_right_radius = 0.0; + + // Clear top decoration of split frame + $split_style->margin_top = 0.0; + $split_style->padding_top = 0.0; + $split_style->border_top_width = 0.0; + $split_style->border_top_left_radius = 0.0; + $split_style->border_top_right_radius = 0.0; + $split_style->page_break_before = "auto"; + } + + $split_style->text_indent = 0.0; + $split_style->counter_reset = "none"; + + $this->is_split = true; + $split->is_split_off = true; + $split->_already_pushed = true; + + $this->get_parent()->insert_child_after($split, $this); + + if ($this instanceof Block) { + // Remove the frames that will be moved to the new split node from + // the line boxes + $this->remove_frames_from_line($child); + + // recalculate the float offsets after paging + foreach ($this->get_line_boxes() as $line_box) { + $line_box->get_float_offsets(); + } + } + + if (!$forced) { + // Reset top margin in case of an unforced page break + // https://www.w3.org/TR/CSS21/page.html#allowed-page-breaks + $child->get_style()->margin_top = 0.0; + } + + // Add $child and all following siblings to the new split node + $iter = $child; + while ($iter) { + $frame = $iter; + $iter = $iter->get_next_sibling(); + $frame->reset(); + $split->append_child($frame); + } + + $this->get_parent()->split($split, $page_break, $forced); + + // Preserve the current counter values. This must be done after the + // parent split, as counters get reset on frame reset + $split->_counters = $this->_counters; + } + + /** + * @param array $counters + */ + public function reset_counters(array $counters): void + { + foreach ($counters as $id => $value) { + $this->reset_counter($id, $value); + } + } + + /** + * @param string $id + * @param int $value + */ + public function reset_counter(string $id = self::DEFAULT_COUNTER, int $value = 0): void + { + $this->get_parent()->_counters[$id] = $value; + } + + /** + * @param array $counters + */ + public function decrement_counters(array $counters): void + { + foreach ($counters as $id => $increment) { + $this->increment_counter($id, $increment * -1); + } + } + + /** + * @param array $counters + */ + public function increment_counters(array $counters): void + { + foreach ($counters as $id => $increment) { + $this->increment_counter($id, $increment); + } + } + + /** + * @param string $id + * @param int $increment + */ + public function increment_counter(string $id = self::DEFAULT_COUNTER, int $increment = 1): void + { + $counter_frame = $this->lookup_counter_frame($id, true); + $counter_frame->_counters[$id] += $increment; + } + + /** + * @param string $id + * @param bool $auto_reset Instantiate a new counter if none with the given name is in scope. + * + * @return AbstractFrameDecorator|null + */ + public function lookup_counter_frame( + string $id = self::DEFAULT_COUNTER, + bool $auto_reset = false + ): ?AbstractFrameDecorator { + $f = $this->get_parent(); + + while ($f) { + if (isset($f->_counters[$id])) { + return $f; + } + $f = $f->get_parent(); + } + + if ($auto_reset) { + $f = $this->get_parent(); + $f->_counters[$id] = 0; + return $f; + } + + return null; + } + + /** + * @param string $id + * @param string $type + * + * @return string + * + * TODO: What version is the best : this one or the one in ListBullet ? + */ + public function counter_value(string $id = self::DEFAULT_COUNTER, string $type = "decimal"): string + { + $value = $this->_counters[$id] ?? 0; + + switch ($type) { + default: + case "decimal": + return $value; + + case "decimal-leading-zero": + return str_pad($value, 2, "0", STR_PAD_LEFT); + + case "lower-roman": + return Helpers::dec2roman($value); + + case "upper-roman": + return strtoupper(Helpers::dec2roman($value)); + + case "lower-latin": + case "lower-alpha": + return chr((($value - 1) % 26) + ord('a')); + + case "upper-latin": + case "upper-alpha": + return chr((($value - 1) % 26) + ord('A')); + + case "lower-greek": + return Helpers::unichr($value + 944); + + case "upper-greek": + return Helpers::unichr($value + 912); + } + } + + final function position() + { + $this->_positioner->position($this); + } + + /** + * @param float $offset_x + * @param float $offset_y + * @param bool $ignore_self + */ + final function move(float $offset_x, float $offset_y, bool $ignore_self = false): void + { + $this->_positioner->move($this, $offset_x, $offset_y, $ignore_self); + } + + /** + * @param Block|null $block + */ + final function reflow(?Block $block = null) + { + // Uncomment this to see the frames before they're laid out, instead of + // during rendering. + //echo $this->_frame; flush(); + $this->_reflower->reflow($block); + } + + /** + * @return array + */ + final public function get_min_max_width(): array + { + return $this->_reflower->get_min_max_width(); + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/Block.php b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/Block.php new file mode 100644 index 0000000..dd95209 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/Block.php @@ -0,0 +1,256 @@ +_line_boxes = [new LineBox($this)]; + $this->_cl = 0; + $this->dangling_markers = []; + } + + function reset() + { + parent::reset(); + + $this->_line_boxes = [new LineBox($this)]; + $this->_cl = 0; + $this->dangling_markers = []; + } + + /** + * @return LineBox + */ + function get_current_line_box() + { + return $this->_line_boxes[$this->_cl]; + } + + /** + * @return int + */ + function get_current_line_number() + { + return $this->_cl; + } + + /** + * @return LineBox[] + */ + function get_line_boxes() + { + return $this->_line_boxes; + } + + /** + * @param int $line_number + * @return int + */ + function set_current_line_number($line_number) + { + $line_boxes_count = count($this->_line_boxes); + $cl = max(min($line_number, $line_boxes_count), 0); + return ($this->_cl = $cl); + } + + /** + * @param int $i + */ + function clear_line($i) + { + if (isset($this->_line_boxes[$i])) { + unset($this->_line_boxes[$i]); + } + } + + /** + * @param Frame $frame + * @return LineBox|null + */ + public function add_frame_to_line(Frame $frame): ?LineBox + { + $current_line = $this->_line_boxes[$this->_cl]; + $frame->set_containing_line($current_line); + + // Inline frames are currently treated as wrappers, and are not actually + // added to the line + if ($frame instanceof Inline) { + return null; + } + + $current_line->add_frame($frame); + + $this->increase_line_width($frame->get_margin_width()); + $this->maximize_line_height($frame->get_margin_height(), $frame); + + // Add any dangling list markers to the first line box if it is inline + if ($this->_cl === 0 && $current_line->inline + && $this->dangling_markers !== [] + ) { + foreach ($this->dangling_markers as $marker) { + $current_line->add_list_marker($marker); + $this->maximize_line_height($marker->get_margin_height(), $marker); + } + + $this->dangling_markers = []; + } + + return $current_line; + } + + /** + * Remove the given frame and all following frames and lines from the block. + * + * @param Frame $frame + */ + public function remove_frames_from_line(Frame $frame): void + { + // Inline frames are not added to line boxes themselves, only their + // text frame children + $actualFrame = $frame; + while ($actualFrame !== null && $actualFrame instanceof Inline) { + $actualFrame = $actualFrame->get_first_child(); + } + + if ($actualFrame === null) { + return; + } + + // Search backwards through the lines for $frame + $frame = $actualFrame; + $i = $this->_cl; + $j = null; + + while ($i >= 0) { + $line = $this->_line_boxes[$i]; + foreach ($line->get_frames() as $index => $f) { + if ($frame === $f) { + $j = $index; + break 2; + } + } + $i--; + } + + if ($j === null) { + return; + } + + // Remove all lines that follow + for ($k = $this->_cl; $k > $i; $k--) { + unset($this->_line_boxes[$k]); + } + + // Remove the line, if it is empty + if ($j > 0) { + $line->remove_frames($j); + } else { + unset($this->_line_boxes[$i]); + } + + // Reset array indices + $this->_line_boxes = array_values($this->_line_boxes); + $this->_cl = count($this->_line_boxes) - 1; + } + + /** + * @param float $w + */ + public function increase_line_width(float $w): void + { + $this->_line_boxes[$this->_cl]->w += $w; + } + + /** + * @param float $val + * @param Frame $frame + */ + public function maximize_line_height(float $val, Frame $frame): void + { + if ($val > $this->_line_boxes[$this->_cl]->h) { + $this->_line_boxes[$this->_cl]->tallest_frame = $frame; + $this->_line_boxes[$this->_cl]->h = $val; + } + } + + /** + * @param bool $br + */ + public function add_line(bool $br = false): void + { + $line = $this->_line_boxes[$this->_cl]; + + $line->br = $br; + $y = $line->y + $line->h; + + $new_line = new LineBox($this, $y); + + $this->_line_boxes[++$this->_cl] = $new_line; + } + + /** + * @param ListBullet $marker + */ + public function add_dangling_marker(ListBullet $marker): void + { + $this->dangling_markers[] = $marker; + } + + /** + * Inherit any dangling markers from the parent block. + * + * @param Block $block + */ + public function inherit_dangling_markers(self $block): void + { + if ($block->dangling_markers !== []) { + $this->dangling_markers = $block->dangling_markers; + $block->dangling_markers = []; + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/Image.php b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/Image.php new file mode 100644 index 0000000..bbfb130 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/Image.php @@ -0,0 +1,120 @@ +get_node(); + $url = $node->getAttribute("src"); + + $debug_png = $dompdf->getOptions()->getDebugPng(); + if ($debug_png) { + print '[__construct ' . $url . ']'; + } + + list($this->_image_url, /*$type*/, $this->_image_msg) = Cache::resolve_url( + $url, + $dompdf->getProtocol(), + $dompdf->getBaseHost(), + $dompdf->getBasePath(), + $dompdf->getOptions() + ); + + if (Cache::is_broken($this->_image_url) && ($alt = $node->getAttribute("alt")) !== "") { + $fontMetrics = $dompdf->getFontMetrics(); + $style = $frame->get_style(); + $font = $style->font_family; + $size = $style->font_size; + $word_spacing = $style->word_spacing; + $letter_spacing = $style->letter_spacing; + + $style->width = $fontMetrics->getTextWidth($alt, $font, $size, $word_spacing, $letter_spacing); + $style->height = $fontMetrics->getFontHeight($font, $size); + } + } + + /** + * Get the intrinsic pixel dimensions of the image. + * + * @return array Width and height as `float|int`. + */ + public function get_intrinsic_dimensions(): array + { + [$width, $height] = Helpers::dompdf_getimagesize($this->_image_url, $this->_dompdf->getHttpContext()); + + return [$width, $height]; + } + + /** + * Resample the given pixel length according to dpi. + * + * @param float|int $length + * @return float + */ + public function resample($length): float + { + $dpi = $this->_dompdf->getOptions()->getDpi(); + return ($length * 72) / $dpi; + } + + /** + * Return the image's url + * + * @return string The url of this image + */ + function get_image_url() + { + return $this->_image_url; + } + + /** + * Return the image's error message + * + * @return string The image's error message + */ + function get_image_msg() + { + return $this->_image_msg; + } + +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/Inline.php b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/Inline.php new file mode 100644 index 0000000..668d795 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/Inline.php @@ -0,0 +1,121 @@ +get_style(); + $font = $style->font_family; + $size = $style->font_size; + $fontHeight = $this->_dompdf->getFontMetrics()->getFontHeight($font, $size); + + return ($style->line_height / ($size > 0 ? $size : 1)) * $fontHeight; + } + + public function split(?Frame $child = null, bool $page_break = false, bool $forced = false): void + { + if (is_null($child)) { + $this->get_parent()->split($this, $page_break, $forced); + return; + } + + if ($child->get_parent() !== $this) { + throw new Exception("Unable to split: frame is not a child of this one."); + } + + $this->revert_counter_increment(); + $node = $this->_frame->get_node(); + $split = $this->copy($node->cloneNode()); + + $style = $this->_frame->get_style(); + $split_style = $split->get_style(); + + // Unset the current node's right style properties + $style->margin_right = 0.0; + $style->padding_right = 0.0; + $style->border_right_width = 0.0; + $style->border_top_right_radius = 0.0; + $style->border_bottom_right_radius = 0.0; + + // Unset the split node's left style properties since we don't want them + // to propagate + $split_style->margin_left = 0.0; + $split_style->padding_left = 0.0; + $split_style->border_left_width = 0.0; + $split_style->border_top_left_radius = 0.0; + $split_style->border_bottom_left_radius = 0.0; + + // If this is a generated node don't propagate the content style + if ($split->get_node()->nodeName == "dompdf_generated") { + $split_style->content = "normal"; + } + + //On continuation of inline element on next line, + //don't repeat non-horizontally repeatable background images + //See e.g. in testcase image_variants, long descriptions + if (($url = $style->background_image) && $url !== "none" + && ($repeat = $style->background_repeat) && $repeat !== "repeat" && $repeat !== "repeat-x" + ) { + $split_style->background_image = "none"; + } + + $this->get_parent()->insert_child_after($split, $this); + + // Add $child and all following siblings to the new split node + $iter = $child; + while ($iter) { + $frame = $iter; + $iter = $iter->get_next_sibling(); + $frame->reset(); + $split->append_child($frame); + } + + $parent = $this->get_parent(); + + if ($page_break) { + $parent->split($split, $page_break, $forced); + } elseif ($parent instanceof Inline) { + $parent->split($split); + } + } + +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/ListBullet.php b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/ListBullet.php new file mode 100644 index 0000000..703f467 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/ListBullet.php @@ -0,0 +1,117 @@ +_frame->get_style(); + + if ($style->list_style_type === "none") { + return 0.0; + } + + return $style->font_size * self::BULLET_SIZE; + } + + /** + * Get the height of the bullet symbol. + * + * @return float + */ + public function get_height(): float + { + $style = $this->_frame->get_style(); + + if ($style->list_style_type === "none") { + return 0.0; + } + + return $style->font_size * self::BULLET_SIZE; + } + + /** + * Get the width of the bullet, including indentation. + */ + public function get_margin_width(): float + { + $style = $this->get_style(); + + if ($style->list_style_type === "none") { + return 0.0; + } + + return $style->font_size * (self::BULLET_SIZE + self::MARKER_INDENT); + } + + /** + * Get the line height for the bullet. + * + * This increases the height of the corresponding line box when necessary. + */ + public function get_margin_height(): float + { + $style = $this->get_style(); + + if ($style->list_style_type === "none") { + return 0.0; + } + + // TODO: This is a copy of `FrameDecorator\Text::get_margin_height()` + // Would be nice to properly refactor that at some point + $font = $style->font_family; + $size = $style->font_size; + $fontHeight = $this->_dompdf->getFontMetrics()->getFontHeight($font, $size); + + return ($style->line_height / ($size > 0 ? $size : 1)) * $fontHeight; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/ListBulletImage.php b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/ListBulletImage.php new file mode 100644 index 0000000..df6c105 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/ListBulletImage.php @@ -0,0 +1,111 @@ +get_style(); + $url = $style->list_style_image; + $frame->get_node()->setAttribute("src", $url); + $this->_img = new Image($frame, $dompdf); + parent::__construct($this->_img, $dompdf); + + $url = $this->_img->get_image_url(); + + if (Cache::is_broken($url)) { + $this->_width = parent::get_width(); + $this->_height = parent::get_height(); + } else { + // Resample the bullet image to be consistent with 'auto' sized images + [$width, $height] = $this->_img->get_intrinsic_dimensions(); + $this->_width = $this->_img->resample($width); + $this->_height = $this->_img->resample($height); + } + } + + public function get_width(): float + { + return $this->_width; + } + + public function get_height(): float + { + return $this->_height; + } + + public function get_margin_width(): float + { + $style = $this->get_style(); + return $this->_width + $style->font_size * self::MARKER_INDENT; + } + + public function get_margin_height(): float + { + $fontMetrics = $this->_dompdf->getFontMetrics(); + $style = $this->get_style(); + $font = $style->font_family; + $size = $style->font_size; + $fontHeight = $fontMetrics->getFontHeight($font, $size); + $baseline = $fontMetrics->getFontBaseline($font, $size); + + // This is the same factor as used in + // `FrameDecorator\Text::get_margin_height()` + $f = $style->line_height / ($size > 0 ? $size : 1); + + // FIXME: Tries to approximate replacing the space above the font + // baseline with the image + return $f * ($fontHeight - $baseline) + $this->_height; + } + + /** + * Return image url + * + * @return string + */ + function get_image_url() + { + return $this->_img->get_image_url(); + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/NullFrameDecorator.php b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/NullFrameDecorator.php new file mode 100644 index 0000000..f083816 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/NullFrameDecorator.php @@ -0,0 +1,33 @@ +_frame->get_style(); + $style->width = 0; + $style->height = 0; + $style->margin = 0; + $style->padding = 0; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/Page.php b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/Page.php new file mode 100644 index 0000000..374cc97 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/Page.php @@ -0,0 +1,767 @@ +_page_full = false; + $this->_in_table = 0; + $this->bottom_page_edge = null; + } + + /** + * Set the renderer used for this pdf + * + * @param Renderer $renderer the renderer to use + */ + function set_renderer($renderer) + { + $this->_renderer = $renderer; + } + + /** + * Return the renderer used for this pdf + * + * @return Renderer + */ + function get_renderer() + { + return $this->_renderer; + } + + /** + * Calculate the bottom edge of the page area after margins have been + * applied for the current page. + */ + public function calculate_bottom_page_edge(): void + { + [, , , $cbh] = $this->get_containing_block(); + $style = $this->get_style(); + $margin_bottom = (float) $style->length_in_pt($style->margin_bottom, $cbh); + + $this->bottom_page_edge = $cbh - $margin_bottom; + } + + /** + * Returns true if the page is full and is no longer accepting frames. + * + * @return bool + */ + function is_full() + { + return $this->_page_full; + } + + /** + * Start a new page by resetting the full flag. + */ + function next_page() + { + $this->_floating_frames = []; + $this->_renderer->new_page(); + $this->_page_full = false; + } + + /** + * Indicate to the page that a table is currently being reflowed. + */ + function table_reflow_start() + { + $this->_in_table++; + } + + /** + * Indicate to the page that table reflow is finished. + */ + function table_reflow_end() + { + $this->_in_table--; + } + + /** + * Return whether we are currently in a nested table or not + * + * @return bool + */ + function in_nested_table() + { + return $this->_in_table > 1; + } + + /** + * Check if a forced page break is required before $frame. This uses the + * frame's page_break_before property as well as the preceding frame's + * page_break_after property. + * + * @link http://www.w3.org/TR/CSS21/page.html#forced + * + * @param AbstractFrameDecorator $frame the frame to check + * + * @return bool true if a page break occurred + */ + function check_forced_page_break(Frame $frame) + { + // Skip check if page is already split and for the body + if ($this->_page_full || $frame->get_node()->nodeName === "body") { + return false; + } + + // If the frame is fixed-position or has a fixed-position parent + // ignore the forced page break + if ($frame->get_style()->is_absolute()) { + return false; + } + $p = $frame; + while ($p = $p->get_parent()) { + if ($p->get_style()->position === "fixed") { + return false; + } + } + + $page_breaks = ["always", "left", "right"]; + $style = $frame->get_style(); + + if (($frame->is_block_level() || $style->display === "table-row") + && in_array($style->page_break_before, $page_breaks, true) + ) { + // Prevent cascading splits + $frame->split(null, true, true); + $style->page_break_before = "auto"; + $this->_page_full = true; + $frame->_already_pushed = true; + + return true; + } + + // Find the preceding block-level sibling (or table row). Inline + // elements are treated as if wrapped in an anonymous block container + // here. See https://www.w3.org/TR/CSS21/visuren.html#anonymous-block-level + $prev = $frame->get_prev_sibling(); + while ($prev && (($prev->is_text_node() && $prev->get_node()->nodeValue === "") + || $prev->get_node()->nodeName === "bullet") + ) { + $prev = $prev->get_prev_sibling(); + } + + if ($prev && ($prev->is_block_level() || $prev->get_style()->display === "table-row") && !$prev->get_style()->is_absolute()) { + if (in_array($prev->get_style()->page_break_after, $page_breaks, true)) { + // Prevent cascading splits + $frame->split(null, true, true); + $prev->get_style()->page_break_after = "auto"; + $this->_page_full = true; + $frame->_already_pushed = true; + + return true; + } + + $prev_last_child = $prev->get_last_child(); + while ($prev_last_child && (($prev_last_child->is_text_node() && $prev_last_child->get_node()->nodeValue === "") + || $prev_last_child->get_node()->nodeName === "bullet") + ) { + $prev_last_child = $prev_last_child->get_prev_sibling(); + } + + if ($prev_last_child + && $prev_last_child->is_block_level() + && in_array($prev_last_child->get_style()->page_break_after, $page_breaks, true) + ) { + $frame->split(null, true, true); + $prev_last_child->get_style()->page_break_after = "auto"; + $this->_page_full = true; + $frame->_already_pushed = true; + + return true; + } + } + + return false; + } + + /** + * Check for a gap between the top content edge of a frame and its child + * content. + * + * Additionally, the top margin, border, and padding of the frame must fit + * on the current page. + * + * @param float $childPos The top margin or line-box edge of the child content. + * @param Frame $frame The parent frame to check. + * @return bool + */ + protected function hasGap(float $childPos, Frame $frame): bool + { + $style = $frame->get_style(); + $cbw = $frame->get_containing_block("w"); + $contentEdge = $frame->get_position("y") + (float) $style->length_in_pt([ + $style->margin_top, + $style->border_top_width, + $style->padding_top + ], $cbw); + + return Helpers::lengthGreater($childPos, $contentEdge) + && Helpers::lengthLessOrEqual($contentEdge, $this->bottom_page_edge); + } + + /** + * Determine if a page break is allowed before $frame + * http://www.w3.org/TR/CSS21/page.html#allowed-page-breaks + * + * In the normal flow, page breaks can occur at the following places: + * + * 1. In the vertical margin between block boxes. When an + * unforced page break occurs here, the used values of the + * relevant 'margin-top' and 'margin-bottom' properties are set + * to '0'. When a forced page break occurs here, the used value + * of the relevant 'margin-bottom' property is set to '0'; the + * relevant 'margin-top' used value may either be set to '0' or + * retained. + * 2. Between line boxes inside a block container box. + * 3. Between the content edge of a block container box and the + * outer edges of its child content (margin edges of block-level + * children or line box edges for inline-level children) if there + * is a (non-zero) gap between them. + * + * These breaks are subject to the following rules: + * + * * Rule A: Breaking at (1) is allowed only if the + * 'page-break-after' and 'page-break-before' properties of all + * the elements generating boxes that meet at this margin allow + * it, which is when at least one of them has the value + * 'always', 'left', or 'right', or when all of them are 'auto'. + * + * * Rule B: However, if all of them are 'auto' and a common + * ancestor of all the elements has a 'page-break-inside' value + * of 'avoid', then breaking here is not allowed. + * + * * Rule C: Breaking at (2) is allowed only if the number of line + * boxes between the break and the start of the enclosing block + * box is the value of 'orphans' or more, and the number of line + * boxes between the break and the end of the box is the value + * of 'widows' or more. + * + * * Rule D: In addition, breaking at (2) or (3) is allowed only + * if the 'page-break-inside' property of the element and all + * its ancestors is 'auto'. + * + * If the above does not provide enough break points to keep content + * from overflowing the page boxes, then rules A, B and D are + * dropped in order to find additional breakpoints. + * + * If that still does not lead to sufficient break points, rule C is + * dropped as well, to find still more break points. + * + * We also allow breaks between table rows. + * + * @param AbstractFrameDecorator $frame the frame to check + * + * @return bool true if a break is allowed, false otherwise + */ + protected function _page_break_allowed(Frame $frame) + { + Helpers::dompdf_debug("page-break", "_page_break_allowed(" . $frame->get_node()->nodeName . ")"); + $display = $frame->get_style()->display; + + // Block Frames (1): + if ($frame->is_block_level() || $display === "-dompdf-image") { + + // Avoid breaks within table-cells + if ($this->_in_table > ($display === "table" ? 1 : 0)) { + Helpers::dompdf_debug("page-break", "In table: " . $this->_in_table); + + return false; + } + + // Rule A + if ($frame->get_style()->page_break_before === "avoid") { + Helpers::dompdf_debug("page-break", "before: avoid"); + + return false; + } + + // Find the preceding block-level sibling. Inline elements are + // treated as if wrapped in an anonymous block container here. See + // https://www.w3.org/TR/CSS21/visuren.html#anonymous-block-level + $prev = $frame->get_prev_sibling(); + while ($prev && (($prev->is_text_node() && $prev->get_node()->nodeValue === "") + || $prev->get_node()->nodeName === "bullet") + ) { + $prev = $prev->get_prev_sibling(); + } + + // Does the previous element allow a page break after? + if ($prev && ($prev->is_block_level() || $prev->get_style()->display === "-dompdf-image") + && $prev->get_style()->page_break_after === "avoid" + ) { + Helpers::dompdf_debug("page-break", "after: avoid"); + + return false; + } + + // Rules B & D + $parent = $frame->get_parent(); + $p = $parent; + while ($p) { + if ($p->get_style()->page_break_inside === "avoid") { + Helpers::dompdf_debug("page-break", "parent->inside: avoid"); + + return false; + } + $p = $p->find_block_parent(); + } + + // To prevent cascading page breaks when a top-level element has + // page-break-inside: avoid, ensure that at least one frame is + // on the page before splitting. + if ($parent->get_node()->nodeName === "body" && !$prev) { + // We are the body's first child + Helpers::dompdf_debug("page-break", "Body's first child."); + + return false; + } + + // Check for a possible type (3) break + if (!$prev && $parent && !$this->hasGap($frame->get_position("y"), $parent)) { + Helpers::dompdf_debug("page-break", "First block-level frame, no gap"); + + return false; + } + + Helpers::dompdf_debug("page-break", "block: break allowed"); + + return true; + + } // Inline frames (2): + else { + if ($frame->is_inline_level()) { + + // Avoid breaks within table-cells + if ($this->_in_table) { + Helpers::dompdf_debug("page-break", "In table: " . $this->_in_table); + + return false; + } + + // Rule C + $block_parent = $frame->find_block_parent(); + $parent_style = $block_parent->get_style(); + $line = $block_parent->get_current_line_box(); + $line_count = count($block_parent->get_line_boxes()); + $line_number = $frame->get_containing_line() && empty($line->get_frames()) + ? $line_count - 1 + : $line_count; + + // The line number of the frame can be less than the current + // number of line boxes, in case we are backtracking. As long as + // we are not checking for widows yet, just checking against the + // number of line boxes is sufficient in most cases, though. + if ($line_number <= $parent_style->orphans) { + Helpers::dompdf_debug("page-break", "orphans"); + + return false; + } + + // FIXME: Checking widows is tricky without having laid out the + // remaining line boxes. Just ignore it for now... + + // Rule D + $p = $block_parent; + while ($p) { + if ($p->get_style()->page_break_inside === "avoid") { + Helpers::dompdf_debug("page-break", "parent->inside: avoid"); + + return false; + } + $p = $p->find_block_parent(); + } + + // To prevent cascading page breaks when a top-level element has + // page-break-inside: avoid, ensure that at least one frame with + // some content is on the page before splitting. + $prev = $frame->get_prev_sibling(); + while ($prev && ($prev->is_text_node() && trim($prev->get_node()->nodeValue) == "")) { + $prev = $prev->get_prev_sibling(); + } + + if ($block_parent->get_node()->nodeName === "body" && !$prev) { + // We are the body's first child + Helpers::dompdf_debug("page-break", "Body's first child."); + + return false; + } + + Helpers::dompdf_debug("page-break", "inline: break allowed"); + + return true; + + // Table-rows + } else { + if ($display === "table-row") { + + // If this is a nested table, prevent the page from breaking + if ($this->_in_table > 1) { + Helpers::dompdf_debug("page-break", "table: nested table"); + + return false; + } + + // Rule A (table row) + if ($frame->get_style()->page_break_before === "avoid") { + Helpers::dompdf_debug("page-break", "before: avoid"); + + return false; + } + + // Find the preceding row + $prev = $frame->get_prev_sibling(); + + if (!$prev) { + $prev_group = $frame->get_parent()->get_prev_sibling(); + + if ($prev_group + && in_array($prev_group->get_style()->display, Table::ROW_GROUPS, true) + ) { + $prev = $prev_group->get_last_child(); + } + } + + // Check if a page break is allowed after the preceding row + if ($prev && $prev->get_style()->page_break_after === "avoid") { + Helpers::dompdf_debug("page-break", "after: avoid"); + + return false; + } + + // Avoid breaking before the first row of a table + if (!$prev) { + Helpers::dompdf_debug("page-break", "table: first-row"); + + return false; + } + + // Rule B (table row) + // Check if the page_break_inside property is not 'avoid' + // for the parent table or any of its ancestors + $table = Table::find_parent_table($frame); + if ($table === null) { + throw new Exception("Parent table not found for table row"); + } + + $p = $table; + while ($p) { + if ($p->get_style()->page_break_inside === "avoid") { + Helpers::dompdf_debug("page-break", "parent->inside: avoid"); + + return false; + } + $p = $p->find_block_parent(); + } + + Helpers::dompdf_debug("page-break", "table-row: break allowed"); + + return true; + } else { + if (in_array($display, Table::ROW_GROUPS, true)) { + + // Disallow breaks at row-groups: only split at row boundaries + return false; + + } else { + Helpers::dompdf_debug("page-break", "? " . $display); + + return false; + } + } + } + } + } + + /** + * Check if $frame will fit on the page. If the frame does not fit, + * the frame tree is modified so that a page break occurs in the + * correct location. + * + * @param AbstractFrameDecorator $frame the frame to check + * + * @return bool + */ + function check_page_break(Frame $frame) + { + if ($this->_page_full || $frame->_already_pushed + // Never check for breaks on empty text nodes + || ($frame->is_text_node() && $frame->get_node()->nodeValue === "") + ) { + return false; + } + + $p = $frame; + do { + $display = $p->get_style()->display; + if ($display == "table-row") { + if ($p->_already_pushed) { return false; } + } + } while ($p = $p->get_parent()); + + // If the frame is absolute or fixed it shouldn't break + $p = $frame; + do { + if ($p->is_absolute()) { + return false; + } + } while ($p = $p->get_parent()); + + $margin_height = $frame->get_margin_height(); + + // Determine the frame's maximum y value + $max_y = (float)$frame->get_position("y") + $margin_height; + + // If a split is to occur here, then the bottom margins & paddings of all + // parents of $frame must fit on the page as well: + $p = $frame->get_parent(); + while ($p && $p !== $this) { + $cbw = $p->get_containing_block("w"); + $max_y += (float) $p->get_style()->computed_bottom_spacing($cbw); + $p = $p->get_parent(); + } + + // Check if $frame flows off the page + if (Helpers::lengthLessOrEqual($max_y, $this->bottom_page_edge)) { + // no: do nothing + return false; + } + + Helpers::dompdf_debug("page-break", "check_page_break"); + Helpers::dompdf_debug("page-break", "in_table: " . $this->_in_table); + + // yes: determine page break location + $iter = $frame; + $flg = false; + $pushed_flg = false; + + $in_table = $this->_in_table; + + Helpers::dompdf_debug("page-break", "Starting search"); + while ($iter) { + // echo "\nbacktrack: " .$iter->get_node()->nodeName ." ".spl_object_hash($iter->get_node()). ""; + if ($iter === $this) { + Helpers::dompdf_debug("page-break", "reached root."); + // We've reached the root in our search. Just split at $frame. + break; + } + + if ($iter->_already_pushed) { + $pushed_flg = true; + } elseif ($this->_page_break_allowed($iter)) { + Helpers::dompdf_debug("page-break", "break allowed, splitting."); + $iter->split(null, true); + $this->_page_full = true; + $this->_in_table = $in_table; + $iter->_already_pushed = true; + $frame->_already_pushed = true; + + return true; + } + + if (!$flg && $next = $iter->get_last_child()) { + Helpers::dompdf_debug("page-break", "following last child."); + + if ($next->is_table()) { + $this->_in_table++; + } + + $iter = $next; + $pushed_flg = false; + continue; + } + + if ($pushed_flg) { + // The frame was already pushed, avoid breaking on a previous page + break; + } + + $next = $iter->get_prev_sibling(); + // Skip empty text nodes + while ($next && $next->is_text_node() && $next->get_node()->nodeValue === "") { + $next = $next->get_prev_sibling(); + } + + if ($next) { + Helpers::dompdf_debug("page-break", "following prev sibling."); + + if ($next->is_table() && !$iter->is_table()) { + $this->_in_table++; + } elseif (!$next->is_table() && $iter->is_table()) { + $this->_in_table--; + } + + $iter = $next; + $flg = false; + continue; + } + + if ($next = $iter->get_parent()) { + Helpers::dompdf_debug("page-break", "following parent."); + + if ($iter->is_table()) { + $this->_in_table--; + } + + $iter = $next; + $flg = true; + continue; + } + + break; + } + + $this->_in_table = $in_table; + + // No valid page break found. Just break at $frame. + Helpers::dompdf_debug("page-break", "no valid break found, just splitting."); + + // If we are in a table, backtrack to the nearest top-level table row + if ($this->_in_table) { + $iter = $frame; + while ($iter && $iter->get_style()->display !== "table-row" && $iter->get_style()->display !== 'table-row-group' && $iter->_already_pushed === false) { + $iter = $iter->get_parent(); + } + + if ($iter) { + $iter->split(null, true); + $iter->_already_pushed = true; + } else { + return false; + } + } else { + $frame->split(null, true); + } + + $this->_page_full = true; + $frame->_already_pushed = true; + + return true; + } + + //........................................................................ + + public function split(?Frame $child = null, bool $page_break = false, bool $forced = false): void + { + // Do nothing + } + + /** + * Add a floating frame + * + * @param Frame $frame + */ + function add_floating_frame(Frame $frame) + { + array_unshift($this->_floating_frames, $frame); + } + + /** + * @return Frame[] + */ + function get_floating_frames() + { + return $this->_floating_frames; + } + + /** + * @param $key + */ + public function remove_floating_frame($key) + { + unset($this->_floating_frames[$key]); + } + + /** + * @param Frame $child + * @return int|mixed + */ + public function get_lowest_float_offset(Frame $child) + { + $style = $child->get_style(); + $side = $style->clear; + $float = $style->float; + + $y = 0; + + if ($float === "none") { + foreach ($this->_floating_frames as $key => $frame) { + if ($side === "both" || $frame->get_style()->float === $side) { + $y = max($y, $frame->get_position("y") + $frame->get_margin_height()); + } + $this->remove_floating_frame($key); + } + } + + if ($y > 0) { + $y++; // add 1px buffer from float + } + + return $y; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/Table.php b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/Table.php new file mode 100644 index 0000000..5ba8dda --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/Table.php @@ -0,0 +1,344 @@ +_cellmap = new Cellmap($this); + + $style = $frame->get_style(); + if ($style->table_layout === "fixed" && $style->width !== "auto") { + $this->_cellmap->set_layout_fixed(true); + } + + $this->_headers = []; + $this->_footers = []; + } + + public function reset() + { + parent::reset(); + $this->_cellmap->reset(); + $this->_headers = []; + $this->_footers = []; + $this->_reflower->reset(); + } + + //........................................................................ + + /** + * Split the table at $row. $row and all subsequent rows will be + * added to the clone. This method is overridden in order to remove + * frames from the cellmap properly. + */ + public function split(?Frame $child = null, bool $page_break = false, bool $forced = false): void + { + if (is_null($child)) { + parent::split($child, $page_break, $forced); + return; + } + + // If $child is a header or if it is the first non-header row, do + // not duplicate headers, simply move the table to the next page. + if (count($this->_headers) + && !in_array($child, $this->_headers, true) + && !in_array($child->get_prev_sibling(), $this->_headers, true) + ) { + $first_header = null; + + // Insert copies of the table headers before $child + foreach ($this->_headers as $header) { + + $new_header = $header->deep_copy(); + + if (is_null($first_header)) { + $first_header = $new_header; + } + + $this->insert_child_before($new_header, $child); + } + + parent::split($first_header, $page_break, $forced); + + } elseif (in_array($child->get_style()->display, self::ROW_GROUPS, true)) { + + // Individual rows should have already been handled + parent::split($child, $page_break, $forced); + + } else { + + $iter = $child; + + while ($iter) { + $this->_cellmap->remove_row($iter); + $iter = $iter->get_next_sibling(); + } + + parent::split($child, $page_break, $forced); + } + } + + public function copy(DOMNode $node) + { + $deco = parent::copy($node); + + // In order to keep columns' widths through pages + $deco->_cellmap->set_columns($this->_cellmap->get_columns()); + $deco->_cellmap->lock_columns(); + + return $deco; + } + + /** + * Static function to locate the parent table of a frame + * + * @param Frame $frame + * + * @return Table the table that is an ancestor of $frame + */ + public static function find_parent_table(Frame $frame) + { + while ($frame = $frame->get_parent()) { + if ($frame->is_table()) { + break; + } + } + + return $frame; + } + + /** + * Return this table's Cellmap + * + * @return Cellmap + */ + public function get_cellmap() + { + return $this->_cellmap; + } + + //........................................................................ + + /** + * Check for text nodes between valid table children that only contain white + * space, except if white space is to be preserved. + * + * @param AbstractFrameDecorator $frame + * + * @return bool + */ + private function isEmptyTextNode(AbstractFrameDecorator $frame): bool + { + // This is based on the white-space pattern in `FrameReflower\Text`, + // i.e. only match on collapsible white space + $wsPattern = '/^[^\S\xA0\x{202F}\x{2007}]*$/u'; + $validChildOrNull = function ($frame) { + return $frame === null + || in_array($frame->get_style()->display, self::VALID_CHILDREN, true); + }; + + return $frame instanceof Text + && !$frame->is_pre() + && preg_match($wsPattern, $frame->get_text()) + && $validChildOrNull($frame->get_prev_sibling()) + && $validChildOrNull($frame->get_next_sibling()); + } + + /** + * Restructure tree so that the table has the correct structure. Misplaced + * children are appropriately wrapped in anonymous row groups, rows, and + * cells. + * + * https://www.w3.org/TR/CSS21/tables.html#anonymous-boxes + */ + public function normalize(): void + { + $column_caption = ["table-column-group", "table-column", "table-caption"]; + $children = iterator_to_array($this->get_children()); + $tbody = null; + + foreach ($children as $child) { + $display = $child->get_style()->display; + + if (in_array($display, self::ROW_GROUPS, true)) { + // Reset anonymous tbody + $tbody = null; + + // Add headers and footers + if ($display === "table-header-group") { + $this->_headers[] = $child; + } elseif ($display === "table-footer-group") { + $this->_footers[] = $child; + } + continue; + } + + if (in_array($display, $column_caption, true)) { + continue; + } + + // Remove empty text nodes between valid children + if ($this->isEmptyTextNode($child)) { + $this->remove_child($child); + continue; + } + + // Catch consecutive misplaced frames within a single anonymous group + if ($tbody === null) { + $tbody = $this->create_anonymous_child("tbody", "table-row-group"); + $this->insert_child_before($tbody, $child); + } + + $tbody->append_child($child); + } + + // Handle empty table: Make sure there is at least one row group + if (!$this->get_first_child()) { + $tbody = $this->create_anonymous_child("tbody", "table-row-group"); + $this->append_child($tbody); + } + + foreach ($this->get_children() as $child) { + $display = $child->get_style()->display; + + if (in_array($display, self::ROW_GROUPS, true)) { + $this->normalizeRowGroup($child); + } + } + } + + private function normalizeRowGroup(AbstractFrameDecorator $frame): void + { + $children = iterator_to_array($frame->get_children()); + $tr = null; + + foreach ($children as $child) { + $display = $child->get_style()->display; + + if ($display === "table-row") { + // Reset anonymous tr + $tr = null; + continue; + } + + // Remove empty text nodes between valid children + if ($this->isEmptyTextNode($child)) { + $frame->remove_child($child); + continue; + } + + // Catch consecutive misplaced frames within a single anonymous row + if ($tr === null) { + $tr = $frame->create_anonymous_child("tr", "table-row"); + $frame->insert_child_before($tr, $child); + } + + $tr->append_child($child); + } + + // Handle empty row group: Make sure there is at least one row + if (!$frame->get_first_child()) { + $tr = $frame->create_anonymous_child("tr", "table-row"); + $frame->append_child($tr); + } + + foreach ($frame->get_children() as $child) { + $this->normalizeRow($child); + } + } + + private function normalizeRow(AbstractFrameDecorator $frame): void + { + $children = iterator_to_array($frame->get_children()); + $td = null; + + foreach ($children as $child) { + $display = $child->get_style()->display; + + if ($display === "table-cell") { + // Reset anonymous td + $td = null; + continue; + } + + // Remove empty text nodes between valid children + if ($this->isEmptyTextNode($child)) { + $frame->remove_child($child); + continue; + } + + // Catch consecutive misplaced frames within a single anonymous cell + if ($td === null) { + $td = $frame->create_anonymous_child("td", "table-cell"); + $frame->insert_child_before($td, $child); + } + + $td->append_child($child); + } + + // Handle empty row: Make sure there is at least one cell + if (!$frame->get_first_child()) { + $td = $frame->create_anonymous_child("td", "table-cell"); + $frame->append_child($td); + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/TableCell.php b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/TableCell.php new file mode 100644 index 0000000..7d06b55 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/TableCell.php @@ -0,0 +1,111 @@ +content_height = 0.0; + } + + function reset() + { + parent::reset(); + $this->content_height = 0.0; + } + + /** + * @return float + */ + public function get_content_height(): float + { + return $this->content_height; + } + + /** + * @param float $height + */ + public function set_content_height(float $height): void + { + $this->content_height = $height; + } + + /** + * @param float $height + */ + public function set_cell_height(float $height): void + { + $style = $this->get_style(); + $v_space = (float)$style->length_in_pt( + [ + $style->margin_top, + $style->padding_top, + $style->border_top_width, + $style->border_bottom_width, + $style->padding_bottom, + $style->margin_bottom + ], + (float)$style->length_in_pt($style->height) + ); + + $new_height = $height - $v_space; + $style->set_used("height", $new_height); + + if ($new_height > $this->content_height) { + $y_offset = 0; + + // Adjust our vertical alignment + switch ($style->vertical_align) { + default: + case "baseline": + // FIXME: this isn't right + + case "top": + // Don't need to do anything + return; + + case "middle": + $y_offset = ($new_height - $this->content_height) / 2; + break; + + case "bottom": + $y_offset = $new_height - $this->content_height; + break; + } + + if ($y_offset) { + // Move our children + foreach ($this->get_line_boxes() as $line) { + foreach ($line->get_frames() as $frame) { + $frame->move(0, $y_offset); + } + } + } + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/TableRow.php b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/TableRow.php new file mode 100644 index 0000000..ba985c9 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/TableRow.php @@ -0,0 +1,28 @@ +get_parent(); + $cellmap = $parent->get_cellmap(); + $iter = $child; + + while ($iter) { + $cellmap->remove_row($iter); + $iter = $iter->get_next_sibling(); + } + + // Remove all subsequent row groups from the cellmap + $iter = $this->get_next_sibling(); + + while ($iter) { + $cellmap->remove_row_group($iter); + $iter = $iter->get_next_sibling(); + } + + // If we are splitting at the first child remove the + // table-row-group from the cellmap as well + if ($child === $this->get_first_child()) { + $cellmap->remove_row_group($this); + parent::split(null, $page_break, $forced); + return; + } + + $cellmap->update_row_group($this, $child->get_prev_sibling()); + parent::split($child, $page_break, $forced); + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/Text.php b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/Text.php new file mode 100644 index 0000000..894be3f --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameDecorator/Text.php @@ -0,0 +1,279 @@ +is_text_node()) { + throw new Exception("Text_Decorator can only be applied to #text nodes."); + } + + parent::__construct($frame, $dompdf); + $this->text_spacing = 0.0; + } + + /** + * Trim trailing white space from the frame text. + */ + public function trim_trailing_ws(): void + { + $frame = $this->_frame; + $text = $this->get_text(); + $trailing = mb_substr($text, -1, null, "UTF-8"); + + // White space is always collapsed to the standard space character + // currently, so only handle that for now + if ($trailing === " ") { + $this->trailingWs = $trailing; + $this->set_text(mb_substr($text, 0, -1, "UTF-8")); + $this->recalculate_width(); + } + } + + function reset() + { + parent::reset(); + $this->text_spacing = 0.0; + $this->mapped_font = null; + + // Restore trimmed trailing white space, as the frame will go through + // another reflow and line breaks might be different after a split + if ($this->trailingWs !== null) { + $text = $this->get_text(); + $this->set_text($text . $this->trailingWs); + $this->trailingWs = null; + } + } + + // Accessor methods + + /** + * @return float + */ + public function get_text_spacing(): float + { + return $this->text_spacing; + } + + /** + * @return string + */ + function get_text() + { + // FIXME: this should be in a child class (and is incorrect) +// if ( $this->_frame->get_style()->content !== "normal" ) { +// $this->_frame->get_node()->data = $this->_frame->get_style()->content; +// $this->_frame->get_style()->content = "normal"; +// } + +// Helpers::pre_r("---"); +// $style = $this->_frame->get_style(); +// var_dump($text = $this->_frame->get_node()->data); +// var_dump($asc = utf8_decode($text)); +// for ($i = 0; $i < strlen($asc); $i++) +// Helpers::pre_r("$i: " . $asc[$i] . " - " . ord($asc[$i])); +// Helpers::pre_r("width: " . $this->_dompdf->getFontMetrics()->getTextWidth($text, $style->font_family, $style->font_size)); + + return $this->_frame->get_node()->data; + } + + //........................................................................ + + /** + * Vertical padding, border, and margin do not apply when determining the + * height for inline frames. + * + * http://www.w3.org/TR/CSS21/visudet.html#inline-non-replaced + * + * The vertical padding, border and margin of an inline, non-replaced box + * start at the top and bottom of the content area, not the + * 'line-height'. But only the 'line-height' is used to calculate the + * height of the line box. + * + * @return float + */ + public function get_margin_height(): float + { + // This function is also called in add_frame_to_line() and is used to + // determine the line height + $style = $this->get_style(); + $font = $style->font_family; + $size = $style->font_size; + $fontHeight = $this->_dompdf->getFontMetrics()->getFontHeight($font, $size); + + return ($style->line_height / ($size > 0 ? $size : 1)) * $fontHeight; + } + + public function get_padding_box(): array + { + $style = $this->_frame->get_style(); + $pb = $this->_frame->get_padding_box(); + $pb[3] = $pb["h"] = (float) $style->length_in_pt($style->height); + return $pb; + } + + /** + * @param float $spacing + */ + public function set_text_spacing(float $spacing): void + { + $this->text_spacing = $spacing; + $this->recalculate_width(); + } + + /** + * Recalculate the text width + * + * @return float + */ + public function recalculate_width(): float + { + $fontMetrics = $this->_dompdf->getFontMetrics(); + $style = $this->get_style(); + $text = $this->get_text(); + $font = $style->font_family; + $size = $style->font_size; + $word_spacing = $this->text_spacing + $style->word_spacing; + $letter_spacing = $style->letter_spacing; + $text_width = $fontMetrics->getTextWidth($text, $font, $size, $word_spacing, $letter_spacing); + + $style->set_used("width", $text_width); + return $text_width; + } + + // Text manipulation methods + + /** + * Split the text in this frame at the offset specified. The remaining + * text is added as a sibling frame following this one and is returned. + * + * @param int $offset + * @param bool $split_parent Whether to split parent inline frames. + * + * @return Text|null + */ + function split_text(int $offset, bool $split_parent = true): ?self + { + if ($offset === 0) { + return null; + } + + $split = $this->_frame->get_node()->splitText($offset); + if ($split === false) { + return null; + } + + /** @var Text */ + $deco = $this->copy($split); + $style = $this->_frame->get_style(); + $split_style = $deco->get_style(); + + if ($this->mapped_font !== null) { + $split_style->set_used("font_family", $this->mapped_font); + $deco->mapped_font = $this->mapped_font; + } + + // Clear decoration widths at the split point. They might have been + // copied from the parent frame during inline reflow + $style->margin_right = 0.0; + $style->padding_right = 0.0; + $style->border_right_width = 0.0; + + $split_style->margin_left = 0.0; + $split_style->padding_left = 0.0; + $split_style->border_left_width = 0.0; + + $p = $this->get_parent(); + $p->insert_child_after($deco, $this, false); + + if ($split_parent && $p instanceof Inline) { + $p->split($deco); + } + + return $deco; + } + + /** + * @param int $offset + * @param int $count + */ + function delete_text($offset, $count) + { + $this->_frame->get_node()->deleteData($offset, $count); + } + + /** + * @param string $text + */ + function set_text($text) + { + $this->_frame->get_node()->data = $text; + } + + /** + * Determines the optimal font that applies to the frame and splits + * the frame where the optimal font changes. + */ + function apply_font_mapping(): void + { + if ($this->mapped_font !== null) { + return; + } + + $fontMetrics = $this->_dompdf->getFontMetrics(); + $style = $this->get_style(); + $families = $style->get_font_family_computed(); + $subtype = $fontMetrics->getType($style->font_weight . ' ' . $style->font_style); + $charMapping = $fontMetrics->mapTextToFonts($this->get_text(), $families, $subtype, 1); + + if (isset($charMapping[0])) { + if ($charMapping[0]["length"] !== 0) { + $this->split_text($charMapping[0]["length"], false); + } + $mapped_font = $charMapping[0]["font"]; + if ($mapped_font !== null) { + $style->set_used("font_family", $mapped_font); + $this->mapped_font = $mapped_font; + } + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameReflower/AbstractFrameReflower.php b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/AbstractFrameReflower.php new file mode 100644 index 0000000..7f0cb51 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/AbstractFrameReflower.php @@ -0,0 +1,607 @@ +_frame = $frame; + $this->_min_max_child_cache = null; + $this->_min_max_cache = null; + } + + /** + * @return Dompdf + */ + function get_dompdf() + { + return $this->_frame->get_dompdf(); + } + + public function reset(): void + { + $this->_min_max_child_cache = null; + $this->_min_max_cache = null; + } + + /** + * Determine the actual containing block for absolute and fixed position. + * + * https://www.w3.org/TR/CSS21/visudet.html#containing-block-details + */ + protected function determine_absolute_containing_block(): void + { + $frame = $this->_frame; + $style = $frame->get_style(); + + switch ($style->position) { + case "absolute": + $parent = $frame->find_positioned_parent(); + if ($parent !== $frame->get_root()) { + $parent_style = $parent->get_style(); + $parent_padding_box = $parent->get_padding_box(); + //FIXME: an accurate measure of the positioned parent height + // is not possible until reflow has completed; + // we'll fall back to the parent's containing block, + // which is wrong for auto-height parents + if ($parent_style->height === "auto") { + $parent_containing_block = $parent->get_containing_block(); + $containing_block_height = $parent_containing_block["h"] - + (float)$parent_style->length_in_pt([ + $parent_style->margin_top, + $parent_style->margin_bottom, + $parent_style->border_top_width, + $parent_style->border_bottom_width + ], $parent_containing_block["w"]); + } else { + $containing_block_height = $parent_padding_box["h"]; + } + $frame->set_containing_block($parent_padding_box["x"], $parent_padding_box["y"], $parent_padding_box["w"], $containing_block_height); + break; + } + case "fixed": + $root = $frame->get_root(); + $parent = $frame->get_parent(); + do { + $parents_parent = $parent->get_parent(); + if ($parents_parent == $root) { + break; + } + $parent = $parents_parent; + } while ($parent); + $initial_cb = $parent->get_containing_block(); + $frame->set_containing_block($initial_cb["x"], $initial_cb["y"], $initial_cb["w"], $initial_cb["h"]); + break; + default: + // Nothing to do, containing block already set via parent + break; + } + } + + /** + * Collapse frames margins + * http://www.w3.org/TR/CSS21/box.html#collapsing-margins + */ + protected function _collapse_margins(): void + { + $frame = $this->_frame; + + // Margins of float/absolutely positioned/inline-level elements do not collapse + if (!$frame->is_in_flow() || $frame->is_inline_level() + || $frame->get_root() === $frame || $frame->get_parent() === $frame->get_root() + ) { + return; + } + + $cb = $frame->get_containing_block(); + $style = $frame->get_style(); + + $t = $style->length_in_pt($style->margin_top, $cb["w"]); + $b = $style->length_in_pt($style->margin_bottom, $cb["w"]); + + // Handle 'auto' values + if ($t === "auto") { + $style->set_used("margin_top", 0.0); + $t = 0.0; + } + + if ($b === "auto") { + $style->set_used("margin_bottom", 0.0); + $b = 0.0; + } + + // Collapse vertical margins: + $n = $frame->get_next_sibling(); + if ( $n && !($n->is_block_level() && $n->is_in_flow()) ) { + while ($n = $n->get_next_sibling()) { + if ($n->is_block_level() && $n->is_in_flow()) { + break; + } + + if (!$n->get_first_child()) { + $n = null; + break; + } + } + } + + if ($n) { + $n_style = $n->get_style(); + $n_t = (float)$n_style->length_in_pt($n_style->margin_top, $cb["w"]); + + $b = $this->get_collapsed_margin_length($b, $n_t); + $style->set_used("margin_bottom", $b); + $n_style->set_used("margin_top", 0.0); + } + + // Collapse our first child's margin, if there is no border or padding + if ($style->border_top_width == 0 && $style->length_in_pt($style->padding_top) == 0) { + $f = $this->_frame->get_first_child(); + if ( $f && !($f->is_block_level() && $f->is_in_flow()) ) { + while ($f = $f->get_next_sibling()) { + if ($f->is_block_level() && $f->is_in_flow()) { + break; + } + + if (!$f->get_first_child()) { + $f = null; + break; + } + } + } + + // Margins are collapsed only between block-level boxes + if ($f) { + $f_style = $f->get_style(); + $f_t = (float)$f_style->length_in_pt($f_style->margin_top, $cb["w"]); + + $t = $this->get_collapsed_margin_length($t, $f_t); + $style->set_used("margin_top", $t); + $f_style->set_used("margin_top", 0.0); + } + } + + // Collapse our last child's margin, if there is no border or padding + if ($style->border_bottom_width == 0 && $style->length_in_pt($style->padding_bottom) == 0) { + $l = $this->_frame->get_last_child(); + if ( $l && !($l->is_block_level() && $l->is_in_flow()) ) { + while ($l = $l->get_prev_sibling()) { + if ($l->is_block_level() && $l->is_in_flow()) { + break; + } + + if (!$l->get_last_child()) { + $l = null; + break; + } + } + } + + // Margins are collapsed only between block-level boxes + if ($l) { + $l_style = $l->get_style(); + $l_b = (float)$l_style->length_in_pt($l_style->margin_bottom, $cb["w"]); + + $b = $this->get_collapsed_margin_length($b, $l_b); + $style->set_used("margin_bottom", $b); + $l_style->set_used("margin_bottom", 0.0); + } + } + } + + /** + * Get the combined (collapsed) length of two adjoining margins. + * + * See http://www.w3.org/TR/CSS21/box.html#collapsing-margins. + * + * @param float $l1 + * @param float $l2 + * + * @return float + */ + private function get_collapsed_margin_length(float $l1, float $l2): float + { + if ($l1 < 0 && $l2 < 0) { + return min($l1, $l2); // min(x, y) = - max(abs(x), abs(y)), if x < 0 && y < 0 + } + + if ($l1 < 0 || $l2 < 0) { + return $l1 + $l2; // x + y = x - abs(y), if y < 0 + } + + return max($l1, $l2); + } + + /** + * Handle relative positioning according to + * https://www.w3.org/TR/CSS21/visuren.html#relative-positioning. + * + * @param AbstractFrameDecorator $frame The frame to handle. + */ + protected function position_relative(AbstractFrameDecorator $frame): void + { + $style = $frame->get_style(); + + if ($style->position === "relative") { + $cb = $frame->get_containing_block(); + $top = $style->length_in_pt($style->top, $cb["h"]); + $right = $style->length_in_pt($style->right, $cb["w"]); + $bottom = $style->length_in_pt($style->bottom, $cb["h"]); + $left = $style->length_in_pt($style->left, $cb["w"]); + + // FIXME RTL case: + // if ($left !== "auto" && $right !== "auto") $left = -$right; + if ($left === "auto" && $right === "auto") { + $left = 0; + } elseif ($left === "auto") { + $left = -$right; + } + + if ($top === "auto" && $bottom === "auto") { + $top = 0; + } elseif ($top === "auto") { + $top = -$bottom; + } + + $frame->move($left, $top); + } + } + + /** + * @param Block|null $block + */ + abstract function reflow(?Block $block = null); + + /** + * Resolve the `min-width` property. + * + * Resolves to 0 if not set or if a percentage and the containing-block + * width is not defined. + * + * @param float|null $cbw Width of the containing block. + * + * @return float + */ + protected function resolve_min_width(?float $cbw): float + { + $style = $this->_frame->get_style(); + $min_width = $style->min_width; + + return $min_width !== "auto" + ? $style->length_in_pt($min_width, $cbw ?? 0) + : 0.0; + } + + /** + * Resolve the `max-width` property. + * + * Resolves to `INF` if not set or if a percentage and the containing-block + * width is not defined. + * + * @param float|null $cbw Width of the containing block. + * + * @return float + */ + protected function resolve_max_width(?float $cbw): float + { + $style = $this->_frame->get_style(); + $max_width = $style->max_width; + + return $max_width !== "none" + ? $style->length_in_pt($max_width, $cbw ?? INF) + : INF; + } + + /** + * Resolve the `min-height` property. + * + * Resolves to 0 if not set or if a percentage and the containing-block + * height is not defined. + * + * @param float|null $cbh Height of the containing block. + * + * @return float + */ + protected function resolve_min_height(?float $cbh): float + { + $style = $this->_frame->get_style(); + $min_height = $style->min_height; + + return $min_height !== "auto" + ? $style->length_in_pt($min_height, $cbh ?? 0) + : 0.0; + } + + /** + * Resolve the `max-height` property. + * + * Resolves to `INF` if not set or if a percentage and the containing-block + * height is not defined. + * + * @param float|null $cbh Height of the containing block. + * + * @return float + */ + protected function resolve_max_height(?float $cbh): float + { + $style = $this->_frame->get_style(); + $max_height = $style->max_height; + + return $max_height !== "none" + ? $style->length_in_pt($style->max_height, $cbh ?? INF) + : INF; + } + + /** + * Get the minimum and maximum preferred width of the contents of the frame, + * as requested by its children. + * + * @return array A two-element array of min and max width. + */ + public function get_min_max_child_width(): array + { + if (!is_null($this->_min_max_child_cache)) { + return $this->_min_max_child_cache; + } + + $low = []; + $high = []; + + for ($iter = $this->_frame->get_children(); $iter->valid(); $iter->next()) { + $inline_min = 0; + $inline_max = 0; + + // Add all adjacent inline widths together to calculate max width + while ($iter->valid() && ($iter->current()->is_inline_level() || $iter->current()->get_style()->display === "-dompdf-image")) { + /** @var AbstractFrameDecorator */ + $child = $iter->current(); + $child->get_reflower()->_set_content(); + $minmax = $child->get_min_max_width(); + + if (in_array($child->get_style()->white_space, ["pre", "nowrap"], true)) { + $inline_min += $minmax["min"]; + } else { + $low[] = $minmax["min"]; + } + + $inline_max += $minmax["max"]; + $iter->next(); + } + + if ($inline_min > 0) { + $low[] = $inline_min; + } + if ($inline_max > 0) { + $high[] = $inline_max; + } + + // Skip children with absolute position + if ($iter->valid()) { + /** @var AbstractFrameDecorator */ + $child = $iter->current(); + $child->get_reflower()->_set_content(); + if (!$iter->current()->is_absolute()) { + list($low[], $high[]) = $child->get_min_max_width(); + } + } + } + + $min = count($low) ? max($low) : 0; + $max = count($high) ? max($high) : 0; + + return $this->_min_max_child_cache = [$min, $max]; + } + + /** + * Get the minimum and maximum preferred content-box width of the frame. + * + * @return array A two-element array of min and max width. + */ + public function get_min_max_content_width(): array + { + return $this->get_min_max_child_width(); + } + + /** + * Get the minimum and maximum preferred border-box width of the frame. + * + * Required for shrink-to-fit width calculation, as used in automatic table + * layout, absolute positioning, float and inline-block. This provides a + * basic implementation. Child classes should override this or + * `get_min_max_content_width` as necessary. + * + * @return array An array `[0 => min, 1 => max, "min" => min, "max" => max]` + * of min and max width. + */ + public function get_min_max_width(): array + { + if (!is_null($this->_min_max_cache)) { + return $this->_min_max_cache; + } + + $style = $this->_frame->get_style(); + [$min, $max] = $this->get_min_max_content_width(); + + // Account for margins, borders, and padding + $dims = [ + $style->padding_left, + $style->padding_right, + $style->border_left_width, + $style->border_right_width, + $style->margin_left, + $style->margin_right + ]; + + // The containing block is not defined yet, treat percentages as 0 + $delta = (float) $style->length_in_pt($dims, 0); + $min += $delta; + $max += $delta; + + return $this->_min_max_cache = [$min, $max, "min" => $min, "max" => $max]; + } + + /** + * Resolves the `content` property to string. + * + * https://www.w3.org/TR/CSS21/generate.html#content + * + * @return string The resulting string + */ + protected function resolve_content(): ?string + { + $frame = $this->_frame; + $style = $frame->get_style(); + $content = $style->content; + + if ($content === "normal" || $content === "none") { + return null; + } + + $quotes = $style->quotes; + $text = ""; + + foreach ($content as $val) { + if ($val instanceof StringPart) { + $text .= $val->string; + } + + elseif ($val instanceof OpenQuote) { + // FIXME: Take quotation depth into account + if ($quotes !== "none" && isset($quotes[0][0])) { + $text .= $quotes[0][0]; + } + } + + elseif ($val instanceof CloseQuote) { + // FIXME: Take quotation depth into account + if ($quotes !== "none" && isset($quotes[0][1])) { + $text .= $quotes[0][1]; + } + } + + elseif ($val instanceof NoOpenQuote) { + // FIXME: Increment quotation depth + } + + elseif ($val instanceof NoCloseQuote) { + // FIXME: Decrement quotation depth + } + + elseif ($val instanceof Attr) { + $text .= $frame->get_parent()->get_node()->getAttribute($val->attribute); + } + + elseif ($val instanceof Counter) { + $p = $frame->lookup_counter_frame($val->name, true); + $text .= $p->counter_value($val->name, $val->style); + } + + elseif ($val instanceof Counters) { + $p = $frame->lookup_counter_frame($val->name, true); + $tmp = []; + while ($p) { + array_unshift($tmp, $p->counter_value($val->name, $val->style)); + $p = $p->lookup_counter_frame($val->name); + } + $text .= implode($val->string, $tmp); + } + } + + return $text; + } + + /** + * Handle counters and set generated content if the frame is a + * generated-content frame. + */ + protected function _set_content(): void + { + $frame = $this->_frame; + + if ($frame->content_set) { + return; + } + + $style = $frame->get_style(); + + if (($reset = $style->counter_reset) !== "none") { + $frame->reset_counters($reset); + } + + if (($increment = $style->counter_increment) !== "none") { + $frame->increment_counters($increment); + } + + if ($frame->get_node()->nodeName === "dompdf_generated") { + $content = $this->resolve_content(); + + if ($content !== null) { + $node = $frame->get_node()->ownerDocument->createTextNode($content); + + $new_style = $style->get_stylesheet()->create_style(); + $new_style->inherit($style); + + $new_frame = new Frame($node); + $new_frame->set_style($new_style); + + Factory::decorate_frame($new_frame, $frame->get_dompdf(), $frame->get_root()); + $frame->append_child($new_frame); + } + } + + $frame->content_set = true; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameReflower/Block.php b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/Block.php new file mode 100644 index 0000000..45db9fd --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/Block.php @@ -0,0 +1,948 @@ +_frame; + $style = $frame->get_style(); + $absolute = $frame->is_absolute(); + + $cb = $frame->get_containing_block(); + $w = $cb["w"]; + + $rm = $style->length_in_pt($style->margin_right, $w); + $lm = $style->length_in_pt($style->margin_left, $w); + + $left = $style->length_in_pt($style->left, $w); + $right = $style->length_in_pt($style->right, $w); + + // Handle 'auto' values + $dims = [$style->border_left_width, + $style->border_right_width, + $style->padding_left, + $style->padding_right, + $width !== "auto" ? $width : 0, + $rm !== "auto" ? $rm : 0, + $lm !== "auto" ? $lm : 0]; + + // absolutely positioned boxes take the 'left' and 'right' properties into account + if ($absolute) { + $dims[] = $left !== "auto" ? $left : 0; + $dims[] = $right !== "auto" ? $right : 0; + } + + $sum = (float)$style->length_in_pt($dims, $w); + + // Compare to the containing block + $diff = $w - $sum; + + if ($absolute) { + // Absolutely positioned + // http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-width + + if ($width === "auto" || $left === "auto" || $right === "auto") { + // "all of the three are 'auto'" logic + otherwise case + if ($lm === "auto") { + $lm = 0; + } + if ($rm === "auto") { + $rm = 0; + } + + $block_parent = $frame->find_block_parent(); + $parent_content = $block_parent->get_content_box(); + $line = $block_parent->get_current_line_box(); + + // TODO: This is the in-flow inline position. Use the in-flow + // block position if the original display type is block-level + $inflow_x = $parent_content["x"] - $cb["x"] + $line->left + $line->w; + + if ($width === "auto" && $left === "auto" && $right === "auto") { + // rule 3, per instruction preceding rule set + // shrink-to-fit width + $left = $inflow_x; + [$min, $max] = $this->get_min_max_child_width(); + $width = min(max($min, $diff - $left), $max); + $right = $diff - $left - $width; + } elseif ($width === "auto" && $left === "auto") { + // rule 1 + // shrink-to-fit width + [$min, $max] = $this->get_min_max_child_width(); + $width = min(max($min, $diff), $max); + $left = $diff - $width; + } elseif ($width === "auto" && $right === "auto") { + // rule 3 + // shrink-to-fit width + [$min, $max] = $this->get_min_max_child_width(); + $width = min(max($min, $diff), $max); + $right = $diff - $width; + } elseif ($left === "auto" && $right === "auto") { + // rule 2 + $left = $inflow_x; + $right = $diff - $left; + } elseif ($left === "auto") { + // rule 4 + $left = $diff; + } elseif ($width === "auto") { + // rule 5 + $width = max($diff, 0); + } else { + // $right === "auto" + // rule 6 + $right = $diff; + } + } else { + // "none of the three are 'auto'" logic described in paragraph preceding the rules + if ($diff >= 0) { + if ($lm === "auto" && $rm === "auto") { + $lm = $rm = $diff / 2; + } elseif ($lm === "auto") { + $lm = $diff; + } elseif ($rm === "auto") { + $rm = $diff; + } + } else { + // over-constrained, solve for right + $right = $right + $diff; + + if ($lm === "auto") { + $lm = 0; + } + if ($rm === "auto") { + $rm = 0; + } + } + } + } elseif ($style->float !== "none" || $style->display === "inline-block") { + // Shrink-to-fit width for float and inline block + // https://www.w3.org/TR/CSS21/visudet.html#float-width + // https://www.w3.org/TR/CSS21/visudet.html#inlineblock-width + + if ($width === "auto") { + [$min, $max] = $this->get_min_max_child_width(); + $width = min(max($min, $diff), $max); + } + if ($lm === "auto") { + $lm = 0; + } + if ($rm === "auto") { + $rm = 0; + } + } else { + // Block-level, normal flow + // https://www.w3.org/TR/CSS21/visudet.html#blockwidth + + if ($diff >= 0) { + // Find auto properties and get them to take up the slack + if ($width === "auto") { + $width = $diff; + + if ($lm === "auto") { + $lm = 0; + } + if ($rm === "auto") { + $rm = 0; + } + } elseif ($lm === "auto" && $rm === "auto") { + $lm = $rm = $diff / 2; + } elseif ($lm === "auto") { + $lm = $diff; + } elseif ($rm === "auto") { + $rm = $diff; + } + } else { + // We are over constrained--set margin-right to the difference + $rm = (float) $rm + $diff; + + if ($width === "auto") { + $width = 0; + } + if ($lm === "auto") { + $lm = 0; + } + } + } + + return [ + "width" => $width, + "margin_left" => $lm, + "margin_right" => $rm, + "left" => $left, + "right" => $right, + ]; + } + + /** + * Call the above function, but resolve max/min widths + * + * @throws Exception + * @return array + */ + protected function _calculate_restricted_width() + { + $frame = $this->_frame; + $style = $frame->get_style(); + $cb = $frame->get_containing_block(); + + if (!isset($cb["w"])) { + throw new Exception("Box property calculation requires containing block width"); + } + + $width = $style->length_in_pt($style->width, $cb["w"]); + + $values = $this->_calculate_width($width); + $margin_left = $values["margin_left"]; + $margin_right = $values["margin_right"]; + $width = $values["width"]; + $left = $values["left"]; + $right = $values["right"]; + + // Handle min/max width + // https://www.w3.org/TR/CSS21/visudet.html#min-max-widths + $min_width = $this->resolve_min_width($cb["w"]); + $max_width = $this->resolve_max_width($cb["w"]); + + if ($width > $max_width) { + $values = $this->_calculate_width($max_width); + $margin_left = $values["margin_left"]; + $margin_right = $values["margin_right"]; + $width = $values["width"]; + $left = $values["left"]; + $right = $values["right"]; + } + + if ($width < $min_width) { + $values = $this->_calculate_width($min_width); + $margin_left = $values["margin_left"]; + $margin_right = $values["margin_right"]; + $width = $values["width"]; + $left = $values["left"]; + $right = $values["right"]; + } + + return [$width, $margin_left, $margin_right, $left, $right]; + } + + /** + * Determine the unrestricted height of content within the block + * not by adding each line's height, but by getting the last line's position. + * This because lines could have been pushed lower by a clearing element. + * + * @return float + */ + protected function _calculate_content_height(): float + { + $height = 0.0; + $lines = $this->_frame->get_line_boxes(); + if (count($lines) > 0) { + $last_line = end($lines); + $content_box = $this->_frame->get_content_box(); + $height = $last_line->y + $last_line->h - $content_box["y"]; + } + return $height; + } + + /** + * Determine the frame's restricted height + * + * @return array + */ + protected function _calculate_restricted_height() + { + $frame = $this->_frame; + $style = $frame->get_style(); + $content_height = $this->_calculate_content_height(); + $cb = $frame->get_containing_block(); + + $height = $style->length_in_pt($style->height, $cb["h"]); + $margin_top = $style->length_in_pt($style->margin_top, $cb["w"]); + $margin_bottom = $style->length_in_pt($style->margin_bottom, $cb["w"]); + + $top = $style->length_in_pt($style->top, $cb["h"]); + $bottom = $style->length_in_pt($style->bottom, $cb["h"]); + + if ($frame->is_absolute()) { + // Absolutely positioned + // http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-height + + $h_dims = [ + $top !== "auto" ? $top : 0, + $height !== "auto" ? $height : 0, + $bottom !== "auto" ? $bottom : 0 + ]; + $w_dims = [ + $style->margin_top !== "auto" ? $style->margin_top : 0, + $style->padding_top, + $style->border_top_width, + $style->border_bottom_width, + $style->padding_bottom, + $style->margin_bottom !== "auto" ? $style->margin_bottom : 0 + ]; + + $sum = (float)$style->length_in_pt($h_dims, $cb["h"]) + + (float)$style->length_in_pt($w_dims, $cb["w"]); + + $diff = $cb["h"] - $sum; + + if ($height === "auto" || $top === "auto" || $bottom === "auto") { + // "all of the three are 'auto'" logic + otherwise case + if ($margin_top === "auto") { + $margin_top = 0; + } + if ($margin_bottom === "auto") { + $margin_bottom = 0; + } + + $block_parent = $frame->find_block_parent(); + $current_line = $block_parent->get_current_line_box(); + + // TODO: This is the in-flow inline position. Use the in-flow + // block position if the original display type is block-level + $inflow_y = $current_line->y - $cb["y"]; + + if ($height === "auto" && $top === "auto" && $bottom === "auto") { + // rule 3, per instruction preceding rule set + $top = $inflow_y; + $height = $content_height; + $bottom = $diff - $top - $height; + } elseif ($height === "auto" && $top === "auto") { + // rule 1 + $height = $content_height; + $top = $diff - $height; + } elseif ($height === "auto" && $bottom === "auto") { + // rule 3 + $height = $content_height; + $bottom = $diff - $height; + } elseif ($top === "auto" && $bottom === "auto") { + // rule 2 + $top = $inflow_y; + $bottom = $diff - $top; + } elseif ($top === "auto") { + // rule 4 + $top = $diff; + } elseif ($height === "auto") { + // rule 5 + $height = max($diff, 0); + } else { + // $bottom === "auto" + // rule 6 + $bottom = $diff; + } + } else { + // "none of the three are 'auto'" logic described in paragraph preceding the rules + if ($diff >= 0) { + if ($margin_top === "auto" && $margin_bottom === "auto") { + $margin_top = $margin_bottom = $diff / 2; + } elseif ($margin_top === "auto") { + $margin_top = $diff; + } elseif ($margin_bottom === "auto") { + $margin_bottom = $diff; + } + } else { + // over-constrained, solve for bottom + $bottom = $bottom + $diff; + + if ($margin_top === "auto") { + $margin_top = 0; + } + if ($margin_bottom === "auto") { + $margin_bottom = 0; + } + } + } + } else { + // https://www.w3.org/TR/CSS21/visudet.html#normal-block + // https://www.w3.org/TR/CSS21/visudet.html#block-root-margin + + if ($height === "auto") { + $height = $content_height; + } + if ($margin_top === "auto") { + $margin_top = 0; + } + if ($margin_bottom === "auto") { + $margin_bottom = 0; + } + + // Handle min/max height + // https://www.w3.org/TR/CSS21/visudet.html#min-max-heights + $min_height = $this->resolve_min_height($cb["h"]); + $max_height = $this->resolve_max_height($cb["h"]); + $height = Helpers::clamp($height, $min_height, $max_height); + } + + // TODO: Need to also take min/max height into account for absolute + // positioning, using similar logic to the `_calculate_width`/ + // `calculate_restricted_width` split above. The non-absolute case + // can simply clamp height within min/max, as margins and offsets are + // not affected + + return [$height, $margin_top, $margin_bottom, $top, $bottom]; + } + + /** + * Adjust the justification of each of our lines. + * http://www.w3.org/TR/CSS21/text.html#propdef-text-align + */ + protected function _text_align() + { + $style = $this->_frame->get_style(); + $w = $this->_frame->get_containing_block("w"); + $width = (float)$style->length_in_pt($style->width, $w); + $text_indent = (float)$style->length_in_pt($style->text_indent, $w); + + switch ($style->text_align) { + default: + case "left": + foreach ($this->_frame->get_line_boxes() as $line) { + if (!$line->inline) { + continue; + } + + $line->trim_trailing_ws(); + + if ($line->left) { + foreach ($line->frames_to_align() as $frame) { + $frame->move($line->left, 0); + } + } + } + break; + + case "right": + foreach ($this->_frame->get_line_boxes() as $i => $line) { + if (!$line->inline) { + continue; + } + + $line->trim_trailing_ws(); + + $indent = $i === 0 ? $text_indent : 0; + $dx = $width - $line->w - $line->right - $indent; + + foreach ($line->frames_to_align() as $frame) { + $frame->move($dx, 0); + } + } + break; + + case "justify": + // We justify all lines except the last one, unless the frame + // has been split, in which case the actual last line is part of + // the split-off frame + $lines = $this->_frame->get_line_boxes(); + $last_line_index = $this->_frame->is_split ? null : count($lines) - 1; + + foreach ($lines as $i => $line) { + if (!$line->inline) { + continue; + } + + $line->trim_trailing_ws(); + + if ($line->left) { + foreach ($line->frames_to_align() as $frame) { + $frame->move($line->left, 0); + } + } + + if ($line->br || $i === $last_line_index) { + continue; + } + + $frames = $line->get_frames(); + $other_frame_count = 0; + + foreach ($frames as $frame) { + if (!($frame instanceof TextFrameDecorator)) { + $other_frame_count++; + } + } + + $word_count = $line->wc + $other_frame_count; + + // Set the spacing for each child + if ($word_count > 1) { + $indent = $i === 0 ? $text_indent : 0; + $spacing = ($width - $line->get_width() - $indent) / ($word_count - 1); + } else { + $spacing = 0; + } + + $dx = 0; + foreach ($frames as $frame) { + if ($frame instanceof TextFrameDecorator) { + $text = $frame->get_text(); + $spaces = mb_substr_count($text, " "); + + $frame->move($dx, 0); + $frame->set_text_spacing($spacing); + + $dx += $spaces * $spacing; + } else { + $frame->move($dx, 0); + } + } + + // The line (should) now occupy the entire width + $line->w = $width; + } + break; + + case "center": + case "centre": + foreach ($this->_frame->get_line_boxes() as $i => $line) { + if (!$line->inline) { + continue; + } + + $line->trim_trailing_ws(); + + $indent = $i === 0 ? $text_indent : 0; + $dx = ($width + $line->left - $line->w - $line->right - $indent) / 2; + + foreach ($line->frames_to_align() as $frame) { + $frame->move($dx, 0); + } + } + break; + } + } + + /** + * Align inline children vertically. + * Aligns each child vertically after each line is reflowed + */ + function vertical_align() + { + $fontMetrics = $this->get_dompdf()->getFontMetrics(); + + foreach ($this->_frame->get_line_boxes() as $line) { + $height = $line->h; + + // Move all markers to the top of the line box + foreach ($line->get_list_markers() as $marker) { + $x = $marker->get_position("x"); + $marker->set_position($x, $line->y); + } + + foreach ($line->frames_to_align() as $frame) { + $style = $frame->get_style(); + $isInlineBlock = $style->display !== "inline" + && $style->display !== "-dompdf-list-bullet"; + + $baseline = $fontMetrics->getFontBaseline($style->font_family, $style->font_size); + $y_offset = 0; + + //FIXME: The 0.8 ratio applied to the height is arbitrary (used to accommodate descenders?) + if ($isInlineBlock) { + // Workaround: Skip vertical alignment if the frame is the + // only one one the line, excluding empty text frames, which + // may be the result of trailing white space + // FIXME: This special case should be removed once vertical + // alignment is properly fixed + $skip = true; + + foreach ($line->get_frames() as $other) { + if ($other !== $frame + && !($other->is_text_node() && $other->get_node()->nodeValue === "") + ) { + $skip = false; + break; + } + } + + if ($skip) { + continue; + } + + $marginHeight = $frame->get_margin_height(); + $imageHeightDiff = $height * 0.8 - $marginHeight; + + $align = $frame->get_style()->vertical_align; + if (in_array($align, Style::VERTICAL_ALIGN_KEYWORDS, true)) { + switch ($align) { + case "middle": + $y_offset = $imageHeightDiff / 2; + break; + + case "sub": + $y_offset = 0.3 * $height + $imageHeightDiff; + break; + + case "super": + $y_offset = -0.2 * $height + $imageHeightDiff; + break; + + case "text-top": // FIXME: this should be the height of the frame minus the height of the text + $y_offset = $height - $style->line_height; + break; + + case "top": + break; + + case "text-bottom": // FIXME: align bottom of image with the descender? + case "bottom": + $y_offset = 0.3 * $height + $imageHeightDiff; + break; + + case "baseline": + default: + $y_offset = $imageHeightDiff; + break; + } + } else { + $y_offset = $baseline - (float)$style->length_in_pt($align, $style->font_size) - $marginHeight; + } + } else { + $parent = $frame->get_parent(); + if ($parent instanceof TableCellFrameDecorator) { + $align = "baseline"; + } else { + $align = $parent->get_style()->vertical_align; + } + if (in_array($align, Style::VERTICAL_ALIGN_KEYWORDS, true)) { + switch ($align) { + case "middle": + $y_offset = ($height * 0.8 - $baseline) / 2; + break; + + case "sub": + $y_offset = $height * 0.8 - $baseline * 0.5; + break; + + case "super": + $y_offset = $height * 0.8 - $baseline * 1.4; + break; + + case "text-top": + case "top": // Not strictly accurate, but good enough for now + break; + + case "text-bottom": + case "bottom": + $y_offset = $height * 0.8 - $baseline; + break; + + case "baseline": + default: + $y_offset = $height * 0.8 - $baseline; + break; + } + } else { + $y_offset = $height * 0.8 - $baseline - (float)$style->length_in_pt($align, $style->font_size); + } + } + + if ($y_offset !== 0) { + $frame->move(0, $y_offset); + } + } + } + } + + /** + * @param AbstractFrameDecorator $child + */ + function process_clear(AbstractFrameDecorator $child) + { + $child_style = $child->get_style(); + $root = $this->_frame->get_root(); + + // Handle "clear" + if ($child_style->clear !== "none") { + //TODO: this is a WIP for handling clear/float frames that are in between inline frames + if ($child->get_prev_sibling() !== null) { + $this->_frame->add_line(); + } + if ($child_style->float !== "none" && $child->get_next_sibling()) { + $this->_frame->set_current_line_number($this->_frame->get_current_line_number() - 1); + } + + $lowest_y = $root->get_lowest_float_offset($child); + + // If a float is still applying, we handle it + if ($lowest_y) { + if ($child->is_in_flow()) { + $line_box = $this->_frame->get_current_line_box(); + $line_box->y = $lowest_y + $child->get_margin_height(); + $line_box->left = 0; + $line_box->right = 0; + } + + $child->move(0, $lowest_y - $child->get_position("y")); + } + } + } + + /** + * @param AbstractFrameDecorator $child + * @param float $cb_x + * @param float $cb_w + */ + function process_float(AbstractFrameDecorator $child, $cb_x, $cb_w) + { + $child_style = $child->get_style(); + $root = $this->_frame->get_root(); + + // Handle "float" + if ($child_style->float !== "none") { + $root->add_floating_frame($child); + + // Remove next frame's beginning whitespace + $next = $child->get_next_sibling(); + if ($next && $next instanceof TextFrameDecorator) { + $next->set_text(ltrim($next->get_text())); + } + + $line_box = $this->_frame->get_current_line_box(); + list($old_x, $old_y) = $child->get_position(); + + $float_x = $cb_x; + $float_y = $old_y; + $float_w = $child->get_margin_width(); + + if ($child_style->clear === "none") { + switch ($child_style->float) { + case "left": + $float_x += $line_box->left; + break; + case "right": + $float_x += ($cb_w - $line_box->right - $float_w); + break; + } + } else { + if ($child_style->float === "right") { + $float_x += ($cb_w - $float_w); + } + } + + if ($cb_w < $float_x + $float_w - $old_x) { + // TODO handle when floating elements don't fit + } + + $line_box->get_float_offsets(); + + if ($child->_float_next_line) { + $float_y += $line_box->h; + } + + $child->set_position($float_x, $float_y); + $child->move($float_x - $old_x, $float_y - $old_y, true); + } + } + + /** + * @param BlockFrameDecorator|null $block + */ + function reflow(?BlockFrameDecorator $block = null) + { + + // Check if a page break is forced + $page = $this->_frame->get_root(); + $page->check_forced_page_break($this->_frame); + + // Bail if the page is full + if ($page->is_full()) { + return; + } + + $this->determine_absolute_containing_block(); + + // Counters and generated content + $this->_set_content(); + + // Inherit any dangling list markers + if ($block && $this->_frame->is_in_flow()) { + $this->_frame->inherit_dangling_markers($block); + } + + // Collapse margins if required + $this->_collapse_margins(); + + $style = $this->_frame->get_style(); + $cb = $this->_frame->get_containing_block(); + + // Determine the constraints imposed by this frame: calculate the width + // of the content area: + [$width, $margin_left, $margin_right, $left, $right] = $this->_calculate_restricted_width(); + + // Store the calculated properties + $style->set_used("width", $width); + $style->set_used("margin_left", $margin_left); + $style->set_used("margin_right", $margin_right); + $style->set_used("left", $left); + $style->set_used("right", $right); + + $margin_top = $style->length_in_pt($style->margin_top, $cb["w"]); + $margin_bottom = $style->length_in_pt($style->margin_bottom, $cb["w"]); + + $auto_top = $style->top === "auto"; + $auto_margin_top = $margin_top === "auto"; + + // Update the position + $this->_frame->position(); + [$x, $y] = $this->_frame->get_position(); + + // Adjust the first line based on the text-indent property + $indent = (float)$style->length_in_pt($style->text_indent, $cb["w"]); + $this->_frame->increase_line_width($indent); + + // Determine the content edge + $top = (float)$style->length_in_pt([ + $margin_top !== "auto" ? $margin_top : 0, + $style->border_top_width, + $style->padding_top + ], $cb["w"]); + $bottom = (float)$style->length_in_pt([ + $margin_bottom !== "auto" ? $margin_bottom : 0, + $style->border_bottom_width, + $style->padding_bottom + ], $cb["w"]); + + $cb_x = $x + (float)$margin_left + (float)$style->length_in_pt([$style->border_left_width, + $style->padding_left], $cb["w"]); + + $cb_y = $y + $top; + + $height = $style->length_in_pt($style->height, $cb["h"]); + if ($height === "auto") { + $height = ($cb["h"] + $cb["y"]) - $bottom - $cb_y; + } + + // Set the y position of the first line in this block + $line_box = $this->_frame->get_current_line_box(); + $line_box->y = $cb_y; + $line_box->get_float_offsets(); + + // Set the containing blocks and reflow each child + foreach ($this->_frame->get_children() as $child) { + $child->set_containing_block($cb_x, $cb_y, $width, $height); + $this->process_clear($child); + $child->reflow($this->_frame); + + // Check for a page break before the child + $page->check_page_break($child); + + // Don't add the child to the line if a page break has occurred + // before it (possibly via a descendant), in which case it has been + // reset, including its position + if ($page->is_full() && $child->get_position("x") === null) { + break; + } + + $this->process_float($child, $cb_x, $width); + } + + // Stop reflow if a page break has occurred before the frame, in which + // case it has been reset, including its position + if ($page->is_full() && $this->_frame->get_position("x") === null) { + return; + } + + // Determine our height + [$height, $margin_top, $margin_bottom, $top, $bottom] = $this->_calculate_restricted_height(); + + $style->set_used("height", $height); + $style->set_used("margin_top", $margin_top); + $style->set_used("margin_bottom", $margin_bottom); + $style->set_used("top", $top); + $style->set_used("bottom", $bottom); + + if ($this->_frame->is_absolute()) { + if ($auto_top) { + $this->_frame->move(0, $top); + } + if ($auto_margin_top) { + $this->_frame->move(0, $margin_top, true); + } + } + + $this->_text_align(); + $this->vertical_align(); + + // Handle relative positioning + foreach ($this->_frame->get_children() as $child) { + $this->position_relative($child); + } + + if ($block && $this->_frame->is_in_flow()) { + $block->add_frame_to_line($this->_frame); + + if ($this->_frame->is_block_level()) { + $block->add_line(); + } + } + } + + public function get_min_max_content_width(): array + { + // TODO: While the containing block is not set yet on the frame, it can + // already be determined in some cases due to fixed dimensions on the + // ancestor forming the containing block. In such cases, percentage + // values could be resolved here + $style = $this->_frame->get_style(); + $width = $style->width; + $fixed_width = $width !== "auto" && !Helpers::is_percent($width); + + // If the frame has a specified width, then we don't need to check + // its children + if ($fixed_width) { + $min = (float) $style->length_in_pt($width, 0); + $max = $min; + } else { + [$min, $max] = $this->get_min_max_child_width(); + } + + // Handle min/max width style properties + $min_width = $this->resolve_min_width(null); + $max_width = $this->resolve_max_width(null); + $min = Helpers::clamp($min, $min_width, $max_width); + $max = Helpers::clamp($max, $min_width, $max_width); + + return [$min, $max]; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameReflower/Image.php b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/Image.php new file mode 100644 index 0000000..42618f6 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/Image.php @@ -0,0 +1,213 @@ +determine_absolute_containing_block(); + + // Counters and generated content + $this->_set_content(); + + //FLOAT + //$frame = $this->_frame; + //$page = $frame->get_root(); + + //if ($frame->get_style()->float !== "none" ) { + // $page->add_floating_frame($this); + //} + + $this->resolve_dimensions(); + $this->resolve_margins(); + + $frame = $this->_frame; + $frame->position(); + + if ($block && $frame->is_in_flow()) { + $block->add_frame_to_line($frame); + } + } + + public function get_min_max_content_width(): array + { + // TODO: While the containing block is not set yet on the frame, it can + // already be determined in some cases due to fixed dimensions on the + // ancestor forming the containing block. In such cases, percentage + // values could be resolved here + $style = $this->_frame->get_style(); + + [$width] = $this->calculate_size(null, null); + $min_width = $this->resolve_min_width(null); + $percent_width = Helpers::is_percent($style->width) + || Helpers::is_percent($style->max_width) + || ($style->width === "auto" + && (Helpers::is_percent($style->height) || Helpers::is_percent($style->max_height))); + + // Use the specified min width as minimum when width or max width depend + // on the containing block and cannot be resolved yet. This mimics + // browser behavior + $min = $percent_width ? $min_width : $width; + $max = $width; + + return [$min, $max]; + } + + /** + * Calculate width and height, accounting for min/max constraints. + * + * * https://www.w3.org/TR/CSS21/visudet.html#inline-replaced-width + * * https://www.w3.org/TR/CSS21/visudet.html#inline-replaced-height + * * https://www.w3.org/TR/CSS21/visudet.html#min-max-widths + * * https://www.w3.org/TR/CSS21/visudet.html#min-max-heights + * + * @param float|null $cbw Width of the containing block. + * @param float|null $cbh Height of the containing block. + * + * @return float[] + */ + protected function calculate_size(?float $cbw, ?float $cbh): array + { + /** @var ImageFrameDecorator */ + $frame = $this->_frame; + $style = $frame->get_style(); + + $computed_width = $style->width; + $computed_height = $style->height; + + $width = $cbw === null && Helpers::is_percent($computed_width) + ? "auto" + : $style->length_in_pt($computed_width, $cbw ?? 0); + $height = $cbh === null && Helpers::is_percent($computed_height) + ? "auto" + : $style->length_in_pt($computed_height, $cbh ?? 0); + $min_width = $this->resolve_min_width($cbw); + $max_width = $this->resolve_max_width($cbw); + $min_height = $this->resolve_min_height($cbh); + $max_height = $this->resolve_max_height($cbh); + + if ($width === "auto" && $height === "auto") { + // Use intrinsic dimensions, resampled to pt + [$img_width, $img_height] = $frame->get_intrinsic_dimensions(); + $w = $frame->resample($img_width); + $h = $frame->resample($img_height); + + // Resolve min/max constraints according to the constraint-violation + // table in https://www.w3.org/TR/CSS21/visudet.html#min-max-widths + $max_width = max($min_width, $max_width); + $max_height = max($min_height, $max_height); + + if (($w > $max_width && $h <= $max_height) + || ($w > $max_width && $h > $max_height && $max_width / $w <= $max_height / $h) + || ($w < $min_width && $h > $min_height) + || ($w < $min_width && $h < $min_height && $min_width / $w > $min_height / $h) + ) { + $width = Helpers::clamp($w, $min_width, $max_width); + $height = $width * ($img_height / $img_width); + $height = Helpers::clamp($height, $min_height, $max_height); + } else { + $height = Helpers::clamp($h, $min_height, $max_height); + $width = $height * ($img_width / $img_height); + $width = Helpers::clamp($width, $min_width, $max_width); + } + } elseif ($height === "auto") { + // Width is fixed, scale height according to aspect ratio + [$img_width, $img_height] = $frame->get_intrinsic_dimensions(); + $width = Helpers::clamp((float) $width, $min_width, $max_width); + $height = $width * ($img_height / $img_width); + $height = Helpers::clamp($height, $min_height, $max_height); + } elseif ($width === "auto") { + // Height is fixed, scale width according to aspect ratio + [$img_width, $img_height] = $frame->get_intrinsic_dimensions(); + $height = Helpers::clamp((float) $height, $min_height, $max_height); + $width = $height * ($img_width / $img_height); + $width = Helpers::clamp($width, $min_width, $max_width); + } else { + // Width and height are fixed + $width = Helpers::clamp((float) $width, $min_width, $max_width); + $height = Helpers::clamp((float) $height, $min_height, $max_height); + } + + return [$width, $height]; + } + + protected function resolve_dimensions(): void + { + /** @var ImageFrameDecorator */ + $frame = $this->_frame; + $style = $frame->get_style(); + + $debug_png = $this->get_dompdf()->getOptions()->getDebugPng(); + + if ($debug_png) { + [$img_width, $img_height] = $frame->get_intrinsic_dimensions(); + print "resolve_dimensions() " . + $frame->get_style()->width . " " . + $frame->get_style()->height . ";" . + $frame->get_parent()->get_style()->width . " " . + $frame->get_parent()->get_style()->height . ";" . + $frame->get_parent()->get_parent()->get_style()->width . " " . + $frame->get_parent()->get_parent()->get_style()->height . ";" . + $img_width . " " . + $img_height . "|"; + } + + [, , $cbw, $cbh] = $frame->get_containing_block(); + [$width, $height] = $this->calculate_size($cbw, $cbh); + + if ($debug_png) { + print $width . " " . $height . ";"; + } + + $style->set_used("width", $width); + $style->set_used("height", $height); + } + + protected function resolve_margins(): void + { + // Only handle the inline case for now + // https://www.w3.org/TR/CSS21/visudet.html#inline-replaced-width + // https://www.w3.org/TR/CSS21/visudet.html#inline-replaced-height + $style = $this->_frame->get_style(); + + if ($style->margin_left === "auto") { + $style->set_used("margin_left", 0.0); + } + if ($style->margin_right === "auto") { + $style->set_used("margin_right", 0.0); + } + if ($style->margin_top === "auto") { + $style->set_used("margin_top", 0.0); + } + if ($style->margin_bottom === "auto") { + $style->set_used("margin_bottom", 0.0); + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameReflower/Inline.php b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/Inline.php new file mode 100644 index 0000000..d31fa45 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/Inline.php @@ -0,0 +1,191 @@ +_frame; + $style = $frame->get_style(); + + // Resolve width, so the margin width can be checked + $style->set_used("width", 0.0); + + $cb = $frame->get_containing_block(); + $line = $block->get_current_line_box(); + $width = $frame->get_margin_width(); + + if ($width > ($cb["w"] - $line->left - $line->w - $line->right)) { + $block->add_line(); + + // Find the appropriate inline ancestor to split + $child = $frame; + $p = $child->get_parent(); + while ($p instanceof InlineFrameDecorator && !$child->get_prev_sibling()) { + $child = $p; + $p = $p->get_parent(); + } + + if ($p instanceof InlineFrameDecorator) { + // Split parent and stop current reflow. Reflow continues + // via child-reflow loop of split parent + $p->split($child); + return; + } + } + + $frame->position(); + $block->add_frame_to_line($frame); + } + + /** + * @param BlockFrameDecorator|null $block + */ + function reflow(?BlockFrameDecorator $block = null) + { + /** @var InlineFrameDecorator */ + $frame = $this->_frame; + + // Check if a page break is forced + $page = $frame->get_root(); + $page->check_forced_page_break($frame); + + if ($page->is_full()) { + return; + } + + // Counters and generated content + $this->_set_content(); + + $style = $frame->get_style(); + + // Resolve auto margins + // https://www.w3.org/TR/CSS21/visudet.html#inline-width + // https://www.w3.org/TR/CSS21/visudet.html#inline-non-replaced + if ($style->margin_left === "auto") { + $style->set_used("margin_left", 0.0); + } + if ($style->margin_right === "auto") { + $style->set_used("margin_right", 0.0); + } + if ($style->margin_top === "auto") { + $style->set_used("margin_top", 0.0); + } + if ($style->margin_bottom === "auto") { + $style->set_used("margin_bottom", 0.0); + } + + // Handle line breaks + if ($frame->get_node()->nodeName === "br") { + if ($block) { + $line = $block->get_current_line_box(); + $frame->set_containing_line($line); + $block->maximize_line_height($frame->get_margin_height(), $frame); + $block->add_line(true); + + $next = $frame->get_next_sibling(); + $p = $frame->get_parent(); + + if ($next && $p instanceof InlineFrameDecorator) { + $p->split($next); + } + } + return; + } + + // Handle empty inline frames + if (!$frame->get_first_child()) { + if ($block) { + $this->reflow_empty($block); + } + return; + } + + // Add margin, padding & border width to the first and last children, + // so they are accounted for during text layout + if (($f = $frame->get_first_child()) && $f instanceof TextFrameDecorator) { + $f_style = $f->get_style(); + $f_style->margin_left = $style->margin_left; + $f_style->padding_left = $style->padding_left; + $f_style->border_left_width = $style->border_left_width; + } + + if (($l = $frame->get_last_child()) && $l instanceof TextFrameDecorator) { + $l_style = $l->get_style(); + $l_style->margin_right = $style->margin_right; + $l_style->padding_right = $style->padding_right; + $l_style->border_right_width = $style->border_right_width; + } + + $frame->position(); + + $cb = $frame->get_containing_block(); + + // Set the containing blocks and reflow each child. The containing + // block is not changed by line boxes. + foreach ($frame->get_children() as $child) { + $child->set_containing_block($cb); + $child->reflow($block); + + // Stop reflow if the frame has been reset by a line or page break + // due to child reflow + if (!$frame->content_set) { + return; + } + } + + // Assume the position of the first in-flow child, otherwise use the + // fallback position that was set before child reflow + $child = $frame->get_first_child(); + while ($child && !$child->is_in_flow()) { + $child = $child->get_next_sibling(); + } + + if ($child) { + [$x, $y] = $child->get_position(); + $frame->set_position($x, $y); + } + + // Handle relative positioning + foreach ($frame->get_children() as $child) { + $this->position_relative($child); + } + + if ($block) { + $block->add_frame_to_line($frame); + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameReflower/ListBullet.php b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/ListBullet.php new file mode 100644 index 0000000..c7141ab --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/ListBullet.php @@ -0,0 +1,51 @@ +_frame; + $style = $frame->get_style(); + + $style->set_used("width", $frame->get_width()); + $frame->position(); + + if ($style->list_style_position === "inside") { + $block->add_frame_to_line($frame); + } else { + $block->add_dangling_marker($frame); + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameReflower/NullFrameReflower.php b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/NullFrameReflower.php new file mode 100644 index 0000000..0159b1e --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/NullFrameReflower.php @@ -0,0 +1,37 @@ +get_style(); + $page_styles = $style->get_stylesheet()->get_page_styles(); + + // http://www.w3.org/TR/CSS21/page.html#page-selectors + if (count($page_styles) > 1) { + $odd = $page_number % 2 == 1; + $first = $page_number == 1; + + $style = clone $page_styles["base"]; + + // FIXME RTL + if ($odd && isset($page_styles[":right"])) { + $style->merge($page_styles[":right"]); + } + + if ($odd && isset($page_styles[":odd"])) { + $style->merge($page_styles[":odd"]); + } + + // FIXME RTL + if (!$odd && isset($page_styles[":left"])) { + $style->merge($page_styles[":left"]); + } + + if (!$odd && isset($page_styles[":even"])) { + $style->merge($page_styles[":even"]); + } + + if ($first && isset($page_styles[":first"])) { + $style->merge($page_styles[":first"]); + } + + $frame->set_style($style); + } + + $frame->calculate_bottom_page_edge(); + } + + /** + * Paged layout: + * http://www.w3.org/TR/CSS21/page.html + * + * @param BlockFrameDecorator|null $block + */ + function reflow(?BlockFrameDecorator $block = null) + { + /** @var PageFrameDecorator $frame */ + $frame = $this->_frame; + $child = $frame->get_first_child(); + $fixed_children = []; + $prev_child = null; + $current_page = 0; + + // Only if it's the first page, we save the nodes with a fixed position + if ($child) { + foreach ($child->get_children() as $onechild) { + if ($onechild->get_style()->position === "fixed") { + $fixed_children[] = $onechild->deep_copy(); + $child->remove_child($onechild); + } + } + $fixed_children = array_reverse($fixed_children); + } + + while ($child) { + $this->apply_page_style($frame, $current_page + 1); + + $style = $frame->get_style(); + + // Pages are only concerned with margins + $cb = $frame->get_containing_block(); + $left = (float)$style->length_in_pt($style->margin_left, $cb["w"]); + $right = (float)$style->length_in_pt($style->margin_right, $cb["w"]); + $top = (float)$style->length_in_pt($style->margin_top, $cb["h"]); + $bottom = (float)$style->length_in_pt($style->margin_bottom, $cb["h"]); + + $content_x = $cb["x"] + $left; + $content_y = $cb["y"] + $top; + $content_width = $cb["w"] - $left - $right; + $content_height = $cb["h"] - $top - $bottom; + + $child->set_containing_block($content_x, $content_y, $content_width, $content_height); + + //Insert a copy of each node which have a fixed position + foreach ($fixed_children as $fixed_child) { + $child->prepend_child($fixed_child->deep_copy()); + } + + // Check for begin reflow callback + $this->_check_callbacks("begin_page_reflow", $child); + + $child->reflow(); + $next_child = $child->get_next_sibling(); + + // Check for begin render callback + $this->_check_callbacks("begin_page_render", $child); + + // Render the page + $frame->get_renderer()->render($child); + + // Check for end render callback + $this->_check_callbacks("end_page_render", $child); + + if ($next_child) { + $frame->next_page(); + } + + // Wait to dispose of all frames on the previous page + // so callback will have access to them + if ($prev_child) { + $prev_child->dispose(true); + } + $prev_child = $child; + $child = $next_child; + $current_page++; + } + + // Dispose of previous page if it still exists + if ($prev_child) { + $prev_child->dispose(true); + } + } + + /** + * Check for callbacks that need to be performed when a given event + * gets triggered on a page + * + * @param string $event The type of event + * @param Frame $frame The frame that event is triggered on + */ + protected function _check_callbacks(string $event, Frame $frame): void + { + if (!isset($this->_callbacks)) { + $dompdf = $this->get_dompdf(); + $this->_callbacks = $dompdf->getCallbacks(); + $this->_canvas = $dompdf->getCanvas(); + } + + if (isset($this->_callbacks[$event])) { + $fs = $this->_callbacks[$event]; + $canvas = $this->_canvas; + $fontMetrics = $this->get_dompdf()->getFontMetrics(); + + foreach ($fs as $f) { + $f($frame, $canvas, $fontMetrics); + } + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameReflower/Table.php b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/Table.php new file mode 100644 index 0000000..707d18f --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/Table.php @@ -0,0 +1,523 @@ +_state = null; + parent::__construct($frame); + } + + /** + * State is held here so it needs to be reset along with the decorator + */ + public function reset(): void + { + parent::reset(); + $this->_state = null; + } + + protected function _assign_widths() + { + $style = $this->_frame->get_style(); + + // Find the min/max width of the table and sort the columns into + // absolute/percent/auto arrays + $delta = $this->_state["width_delta"]; + $min_width = $this->_state["min_width"]; + $max_width = $this->_state["max_width"]; + $percent_used = $this->_state["percent_used"]; + $absolute_used = $this->_state["absolute_used"]; + $auto_min = $this->_state["auto_min"]; + + $absolute =& $this->_state["absolute"]; + $percent =& $this->_state["percent"]; + $auto =& $this->_state["auto"]; + + // Determine the actual width of the table (excluding borders and + // padding) + $cb = $this->_frame->get_containing_block(); + $columns =& $this->_frame->get_cellmap()->get_columns(); + + $width = $style->width; + $min_table_width = $this->resolve_min_width($cb["w"]) - $delta; + + if ($width !== "auto") { + $preferred_width = (float) $style->length_in_pt($width, $cb["w"]) - $delta; + + if ($preferred_width < $min_table_width) { + $preferred_width = $min_table_width; + } + + if ($preferred_width > $min_width) { + $width = $preferred_width; + } else { + $width = $min_width; + } + + } else { + if ($max_width + $delta < $cb["w"]) { + $width = $max_width; + } elseif ($cb["w"] - $delta > $min_width) { + $width = $cb["w"] - $delta; + } else { + $width = $min_width; + } + + if ($width < $min_table_width) { + $width = $min_table_width; + } + + } + + // Store our resolved width + $style->set_used("width", $width); + + $cellmap = $this->_frame->get_cellmap(); + + if ($cellmap->is_columns_locked()) { + return; + } + + // If the whole table fits on the page, then assign each column it's max width + if ($width == $max_width) { + foreach ($columns as $i => $col) { + $cellmap->set_column_width($i, $col["max-width"]); + } + + return; + } + + // Determine leftover and assign it evenly to all columns + if ($width > $min_width) { + // We have three cases to deal with: + // + // 1. All columns are auto or absolute width. In this case we + // distribute extra space across all auto columns weighted by the + // difference between their max and min width, or by max width only + // if the width of the table is larger than the max width for all + // columns. + // + // 2. Only absolute widths have been specified, no auto columns. In + // this case we distribute extra space across all columns weighted + // by their absolute width. + // + // 3. Percentage widths have been specified. In this case we normalize + // the percentage values and try to assign widths as fractions of + // the table width. Absolute column widths are fully satisfied and + // any remaining space is evenly distributed among all auto columns. + + // Case 1: + if ($percent_used == 0 && count($auto)) { + foreach ($absolute as $i) { + $w = $columns[$i]["min-width"]; + $cellmap->set_column_width($i, $w); + } + + if ($width < $max_width) { + $increment = $width - $min_width; + $table_delta = $max_width - $min_width; + + foreach ($auto as $i) { + $min = $columns[$i]["min-width"]; + $max = $columns[$i]["max-width"]; + $col_delta = $max - $min; + $w = $min + $increment * ($col_delta / $table_delta); + $cellmap->set_column_width($i, $w); + } + } else { + $increment = $width - $max_width; + $auto_max = $max_width - $absolute_used; + + foreach ($auto as $i) { + $max = $columns[$i]["max-width"]; + $f = $auto_max > 0 ? $max / $auto_max : 1 / count($auto); + $w = $max + $increment * $f; + $cellmap->set_column_width($i, $w); + } + } + return; + } + + // Case 2: + if ($percent_used == 0 && !count($auto)) { + $increment = $width - $absolute_used; + + foreach ($absolute as $i) { + $abs = $columns[$i]["min-width"]; + $f = $absolute_used > 0 ? $abs / $absolute_used : 1 / count($absolute); + $w = $abs + $increment * $f; + $cellmap->set_column_width($i, $w); + } + return; + } + + // Case 3: + if ($percent_used > 0) { + // Scale percent values if the total percentage is > 100 or + // there are no auto values to take up slack + if ($percent_used > 100 || count($auto) == 0) { + $scale = 100 / $percent_used; + } else { + $scale = 1; + } + + // Account for the minimum space used by the unassigned auto + // columns, by the columns with absolute widths, and the + // percentage columns following the current one + $used_width = $auto_min + $absolute_used; + + foreach ($absolute as $i) { + $w = $columns[$i]["min-width"]; + $cellmap->set_column_width($i, $w); + } + + $percent_min = 0; + + foreach ($percent as $i) { + $percent_min += $columns[$i]["min-width"]; + } + + // First-come, first served + foreach ($percent as $i) { + $min = $columns[$i]["min-width"]; + $percent_min -= $min; + $slack = $width - $used_width - $percent_min; + + $columns[$i]["percent"] *= $scale; + $w = min($columns[$i]["percent"] * $width / 100, $slack); + + if ($w < $min) { + $w = $min; + } + + $cellmap->set_column_width($i, $w); + $used_width += $w; + } + + // This works because $used_width includes the min-width of each + // unassigned column + if (count($auto) > 0) { + $increment = ($width - $used_width) / count($auto); + + foreach ($auto as $i) { + $w = $columns[$i]["min-width"] + $increment; + $cellmap->set_column_width($i, $w); + } + } + return; + } + } else { + // We are over-constrained: + // Each column gets its minimum width + foreach ($columns as $i => $col) { + $cellmap->set_column_width($i, $col["min-width"]); + } + } + } + + /** + * Determine the frame's height based on min/max height + * + * @return float + */ + protected function _calculate_height() + { + $frame = $this->_frame; + $style = $frame->get_style(); + $cb = $frame->get_containing_block(); + + $height = $style->length_in_pt($style->height, $cb["h"]); + + $cellmap = $frame->get_cellmap(); + $cellmap->assign_frame_heights(); + $rows = $cellmap->get_rows(); + + // Determine our content height + $content_height = 0.0; + foreach ($rows as $r) { + $content_height += $r["height"]; + } + + if ($height === "auto") { + $height = $content_height; + } + + // Handle min/max height + // https://www.w3.org/TR/CSS21/visudet.html#min-max-heights + $min_height = $this->resolve_min_height($cb["h"]); + $max_height = $this->resolve_max_height($cb["h"]); + $height = Helpers::clamp($height, $min_height, $max_height); + + // Use the content height or the height value, whichever is greater + if ($height <= $content_height) { + $height = $content_height; + } else { + // FIXME: Borders and row positions are not properly updated by this + // $cellmap->set_frame_heights($height, $content_height); + } + + return $height; + } + + /** + * @param BlockFrameDecorator|null $block + */ + function reflow(?BlockFrameDecorator $block = null) + { + /** @var TableFrameDecorator */ + $frame = $this->_frame; + + // Check if a page break is forced + $page = $frame->get_root(); + $page->check_forced_page_break($frame); + + // Bail if the page is full + if ($page->is_full()) { + return; + } + + // Let the page know that we're reflowing a table so that splits + // are suppressed (simply setting page-break-inside: avoid won't + // work because we may have an arbitrary number of block elements + // inside tds.) + $page->table_reflow_start(); + + $this->determine_absolute_containing_block(); + + // Counters and generated content + $this->_set_content(); + + // Collapse vertical margins, if required + $this->_collapse_margins(); + + // Table layout algorithm: + // http://www.w3.org/TR/CSS21/tables.html#auto-table-layout + + if (is_null($this->_state)) { + $this->get_min_max_width(); + } + + $cb = $frame->get_containing_block(); + $style = $frame->get_style(); + + // This is slightly inexact, but should be okay. Add half the + // border-spacing to the table as padding. The other half is added to + // the cells themselves. + if ($style->border_collapse === "separate") { + [$h, $v] = $style->border_spacing; + $v = $v / 2; + $h = $h / 2; + + $style->set_used("padding_left", (float)$style->length_in_pt($style->padding_left, $cb["w"]) + $h); + $style->set_used("padding_right", (float)$style->length_in_pt($style->padding_right, $cb["w"]) + $h); + $style->set_used("padding_top", (float)$style->length_in_pt($style->padding_top, $cb["w"]) + $v); + $style->set_used("padding_bottom", (float)$style->length_in_pt($style->padding_bottom, $cb["w"]) + $v); + } + + $this->_assign_widths(); + + // Adjust left & right margins, if they are auto + $delta = $this->_state["width_delta"]; + $width = $style->width; + $left = $style->length_in_pt($style->margin_left, $cb["w"]); + $right = $style->length_in_pt($style->margin_right, $cb["w"]); + + $diff = (float) $cb["w"] - (float) $width - $delta; + + if ($left === "auto" && $right === "auto") { + if ($diff < 0) { + $left = 0; + $right = $diff; + } else { + $left = $right = $diff / 2; + } + } else { + if ($left === "auto") { + $left = max($diff - $right, 0); + } + if ($right === "auto") { + $right = max($diff - $left, 0); + } + } + + $style->set_used("margin_left", $left); + $style->set_used("margin_right", $right); + + $frame->position(); + [$x, $y] = $frame->get_position(); + + // Determine the content edge + $offset_x = (float)$left + (float)$style->length_in_pt([ + $style->padding_left, + $style->border_left_width + ], $cb["w"]); + $offset_y = (float)$style->length_in_pt([ + $style->margin_top, + $style->border_top_width, + $style->padding_top + ], $cb["w"]); + $content_x = $x + $offset_x; + $content_y = $y + $offset_y; + + if (isset($cb["h"])) { + $h = $cb["h"]; + } else { + $h = null; + } + + $cellmap = $frame->get_cellmap(); + $col =& $cellmap->get_column(0); + $col["x"] = $offset_x; + + $row =& $cellmap->get_row(0); + $row["y"] = $offset_y; + + $cellmap->assign_x_positions(); + + // Set the containing block of each child & reflow + foreach ($frame->get_children() as $child) { + $child->set_containing_block($content_x, $content_y, $width, $h); + $child->reflow(); + + if (!$page->in_nested_table()) { + // Check if a split has occurred + $page->check_page_break($child); + + if ($page->is_full()) { + break; + } + } + } + + // Stop reflow if a page break has occurred before the frame, in which + // case it has been reset, including its position + if ($page->is_full() && $frame->get_position("x") === null) { + $page->table_reflow_end(); + return; + } + + // Assign heights to our cells: + $style->set_used("height", $this->_calculate_height()); + + $page->table_reflow_end(); + + if ($block && $frame->is_in_flow()) { + $block->add_frame_to_line($frame); + + if ($frame->is_block_level()) { + $block->add_line(); + } + } + } + + public function get_min_max_width(): array + { + if (!is_null($this->_min_max_cache)) { + return $this->_min_max_cache; + } + + $style = $this->_frame->get_style(); + $cellmap = $this->_frame->get_cellmap(); + + $this->_frame->normalize(); + + // Add the cells to the cellmap (this will calculate column widths as + // frames are added) + $cellmap->add_frame($this->_frame); + + // Find the min/max width of the table and sort the columns into + // absolute/percent/auto arrays + $this->_state = []; + $this->_state["min_width"] = 0; + $this->_state["max_width"] = 0; + + $this->_state["percent_used"] = 0; + $this->_state["absolute_used"] = 0; + $this->_state["auto_min"] = 0; + + $this->_state["absolute"] = []; + $this->_state["percent"] = []; + $this->_state["auto"] = []; + + $columns =& $cellmap->get_columns(); + foreach ($columns as $i => $col) { + $this->_state["min_width"] += $col["min-width"]; + $this->_state["max_width"] += $col["max-width"]; + + if ($col["absolute"] > 0) { + $this->_state["absolute"][] = $i; + $this->_state["absolute_used"] += $col["min-width"]; + } elseif ($col["percent"] > 0) { + $this->_state["percent"][] = $i; + $this->_state["percent_used"] += $col["percent"]; + } else { + $this->_state["auto"][] = $i; + $this->_state["auto_min"] += $col["min-width"]; + } + } + + // Account for margins, borders, padding, and border spacing + $cb_w = $this->_frame->get_containing_block("w"); + $lm = (float) $style->length_in_pt($style->margin_left, $cb_w); + $rm = (float) $style->length_in_pt($style->margin_right, $cb_w); + + $dims = [ + $style->border_left_width, + $style->border_right_width, + $style->padding_left, + $style->padding_right + ]; + + if ($style->border_collapse !== "collapse") { + list($dims[]) = $style->border_spacing; + } + + $delta = (float) $style->length_in_pt($dims, $cb_w); + + $this->_state["width_delta"] = $delta; + + $min_width = $this->_state["min_width"] + $delta + $lm + $rm; + $max_width = $this->_state["max_width"] + $delta + $lm + $rm; + + return $this->_min_max_cache = [ + $min_width, + $max_width, + "min" => $min_width, + "max" => $max_width + ]; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameReflower/TableCell.php b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/TableCell.php new file mode 100644 index 0000000..e63029f --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/TableCell.php @@ -0,0 +1,165 @@ +_frame; + $table = TableFrameDecorator::find_parent_table($frame); + if ($table === null) { + throw new Exception("Parent table not found for table cell"); + } + + // Counters and generated content + $this->_set_content(); + + $style = $frame->get_style(); + $cellmap = $table->get_cellmap(); + + [$x, $y] = $cellmap->get_frame_position($frame); + $frame->set_position($x, $y); + + $cells = $cellmap->get_spanned_cells($frame); + + $w = 0; + foreach ($cells["columns"] as $i) { + $col = $cellmap->get_column($i); + $w += $col["used-width"]; + } + + //FIXME? + $h = $frame->get_containing_block("h"); + + $left_space = (float)$style->length_in_pt([$style->margin_left, + $style->padding_left, + $style->border_left_width], + $w); + + $right_space = (float)$style->length_in_pt([$style->padding_right, + $style->margin_right, + $style->border_right_width], + $w); + + $top_space = (float)$style->length_in_pt([$style->margin_top, + $style->padding_top, + $style->border_top_width], + $h); + $bottom_space = (float)$style->length_in_pt([$style->margin_bottom, + $style->padding_bottom, + $style->border_bottom_width], + $h); + + $cb_w = $w - $left_space - $right_space; + $style->set_used("width", $cb_w); + + $content_x = $x + $left_space; + $content_y = $line_y = $y + $top_space; + + // Adjust the first line based on the text-indent property + $indent = (float)$style->length_in_pt($style->text_indent, $w); + $frame->increase_line_width($indent); + + $page = $frame->get_root(); + + // Set the y position of the first line in the cell + $line_box = $frame->get_current_line_box(); + $line_box->y = $line_y; + + // Set the containing blocks and reflow each child + foreach ($frame->get_children() as $child) { + $child->set_containing_block($content_x, $content_y, $cb_w, $h); + $this->process_clear($child); + $child->reflow($frame); + $this->process_float($child, $content_x, $cb_w); + + if ($page->is_full()) { + break; + } + } + + // Determine our height + $style_height = (float) $style->length_in_pt($style->height, $h); + $content_height = $this->_calculate_content_height(); + $height = max($style_height, $content_height); + + $frame->set_content_height($content_height); + + // Let the cellmap know our height + $cell_height = $height / count($cells["rows"]); + + if ($style_height <= $height) { + $cell_height += $top_space + $bottom_space; + } + + foreach ($cells["rows"] as $i) { + $cellmap->set_row_height($i, $cell_height); + } + + $style->set_used("height", $height); + + $this->_text_align(); + $this->vertical_align(); + + // Handle relative positioning + foreach ($frame->get_children() as $child) { + $this->position_relative($child); + } + } + + public function get_min_max_content_width(): array + { + // Ignore percentage values for a specified width here, as they are + // relative to the table width, which is not determined yet + $style = $this->_frame->get_style(); + $width = $style->width; + $fixed_width = $width !== "auto" && !Helpers::is_percent($width); + + [$min, $max] = $this->get_min_max_child_width(); + + // For table cells: Use specified width if it is greater than the + // minimum defined by the content + if ($fixed_width) { + $width = (float) $style->length_in_pt($width, 0); + $min = max($width, $min); + $max = $min; + } + + // Handle min/max width style properties + $min_width = $this->resolve_min_width(null); + $max_width = $this->resolve_max_width(null); + $min = Helpers::clamp($min, $min_width, $max_width); + $max = Helpers::clamp($max, $min_width, $max_width); + + return [$min, $max]; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameReflower/TableRow.php b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/TableRow.php new file mode 100644 index 0000000..5115a24 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/TableRow.php @@ -0,0 +1,86 @@ +_frame; + + // Check if a page break is forced + $page = $frame->get_root(); + $page->check_forced_page_break($frame); + + // Bail if the page is full + if ($page->is_full()) { + return; + } + + // Counters and generated content + $this->_set_content(); + + $frame->position(); + $style = $frame->get_style(); + $cb = $frame->get_containing_block(); + + foreach ($frame->get_children() as $child) { + $child->set_containing_block($cb); + $child->reflow(); + + if ($page->is_full()) { + break; + } + } + + if ($page->is_full()) { + return; + } + + $table = TableFrameDecorator::find_parent_table($frame); + if ($table === null) { + throw new Exception("Parent table not found for table row"); + } + $cellmap = $table->get_cellmap(); + + $style->set_used("width", $cellmap->get_frame_width($frame)); + $style->set_used("height", $cellmap->get_frame_height($frame)); + + $frame->set_position($cellmap->get_frame_position($frame)); + } + + /** + * @throws Exception + */ + public function get_min_max_width(): array + { + throw new Exception("Min/max width is undefined for table rows"); + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameReflower/TableRowGroup.php b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/TableRowGroup.php new file mode 100644 index 0000000..20f5ee6 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/TableRowGroup.php @@ -0,0 +1,81 @@ +_frame; + $page = $frame->get_root(); + $parent = $frame->get_parent(); + $dompdf_generated = $parent->get_frame()->get_node()->nodeName === "dompdf_generated"; + + // Counters and generated content + $this->_set_content(); + + $style = $frame->get_style(); + $cb = $frame->get_containing_block(); + + foreach ($frame->get_children() as $child) { + $child->set_containing_block($cb["x"], $cb["y"], $cb["w"], $cb["h"]); + $child->reflow(); + + // Check if a split has occurred + $page->check_page_break($child); + + if ($page->is_full()) { + break; + } + } + + if ($page->is_full() && $dompdf_generated && $frame->get_parent() === null) { + return; + } + + $table = TableFrameDecorator::find_parent_table($frame); + if ($table === null) { + throw new Exception("Parent table not found for table row group"); + } + $cellmap = $table->get_cellmap(); + + // Stop reflow if a page break has occurred before the frame, in which + // case it is not part of its parent table's cell map yet + if ($page->is_full() && !$cellmap->frame_exists_in_cellmap($frame)) { + return; + } + + $style->set_used("width", $cellmap->get_frame_width($frame)); + $style->set_used("height", $cellmap->get_frame_height($frame)); + + $frame->set_position($cellmap->get_frame_position($frame)); + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/FrameReflower/Text.php b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/Text.php new file mode 100644 index 0000000..7564910 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/FrameReflower/Text.php @@ -0,0 +1,601 @@ + + */ + const SOFT_HYPHEN = "\xC2\xAD"; + + /** + * The regex splits on everything that's a separator (^\S double negative), + * excluding the following non-breaking space characters: + * * nbsp (\xA0) + * * narrow nbsp (\x{202F}) + * * figure space (\x{2007}) + */ + public static $_whitespace_pattern = '/([^\S\xA0\x{202F}\x{2007}]+)/u'; + + /** + * The regex splits on everything that's a separator (^\S double negative) + * plus dashes, excluding the following non-breaking space characters: + * * nbsp (\xA0) + * * narrow nbsp (\x{202F}) + * * figure space (\x{2007}) + */ + public static $_wordbreak_pattern = '/([^\S\xA0\x{202F}\x{2007}\n]+|\R|\-+|\xAD+)/u'; + + /** + * Frame for this reflower + * + * @var TextFrameDecorator + */ + protected $_frame; + + /** + * @var FontMetrics + */ + private $fontMetrics; + + /** + * @param TextFrameDecorator $frame + * @param FontMetrics $fontMetrics + */ + public function __construct(TextFrameDecorator $frame, FontMetrics $fontMetrics) + { + parent::__construct($frame); + $this->setFontMetrics($fontMetrics); + } + + /** + * Apply text transform and white-space collapse according to style. + * + * * http://www.w3.org/TR/CSS21/text.html#propdef-text-transform + * * http://www.w3.org/TR/CSS21/text.html#propdef-white-space + * + * @param string $text + * @return string + */ + protected function pre_process_text(string $text): string + { + $style = $this->_frame->get_style(); + + // Handle text transform + switch ($style->text_transform) { + case "capitalize": + $text = Helpers::mb_ucwords($text); + break; + case "uppercase": + $text = mb_convert_case($text, MB_CASE_UPPER, "UTF-8"); + break; + case "lowercase": + $text = mb_convert_case($text, MB_CASE_LOWER, "UTF-8"); + break; + default: + break; + } + + // Handle white-space collapse + switch ($style->white_space) { + default: + case "normal": + case "nowrap": + $text = preg_replace(self::$_whitespace_pattern, " ", $text) ?? ""; + break; + + case "pre-line": + // Collapse white space except for line breaks + $text = preg_replace('/([^\S\xA0\x{202F}\x{2007}\n]+)/u', " ", $text) ?? ""; + break; + + case "pre": + case "pre-wrap": + break; + + } + + return $text; + } + + /** + * @param string $text + * @param BlockFrameDecorator $block + * @param bool $nowrap + * + * @return int|false + */ + protected function line_break(string $text, BlockFrameDecorator $block, bool $nowrap = false) + { + $fontMetrics = $this->getFontMetrics(); + $frame = $this->_frame; + $style = $frame->get_style(); + $font = $style->font_family; + $size = $style->font_size; + $word_spacing = $style->word_spacing; + $letter_spacing = $style->letter_spacing; + + // Determine the available width + $current_line = $block->get_current_line_box(); + $line_width = $frame->get_containing_block("w"); + $current_line_width = $current_line->left + $current_line->w + $current_line->right; + $available_width = $line_width - $current_line_width; + + // Determine the frame width including margin, padding & border + $visible_text = preg_replace('/\xAD/u', "", $text); + $text_width = $fontMetrics->getTextWidth($visible_text, $font, $size, $word_spacing, $letter_spacing); + $mbp_width = (float) $style->length_in_pt([ + $style->margin_left, + $style->border_left_width, + $style->padding_left, + $style->padding_right, + $style->border_right_width, + $style->margin_right + ], $line_width); + $frame_width = $text_width + $mbp_width; + + if (Helpers::lengthLessOrEqual($frame_width, $available_width)) { + return false; + } + + $force_first = $current_line->left == 0 + && $current_line->right == 0 + && $current_line->is_empty(); + + if ($nowrap) { + return $force_first ? false : 0; + } + + // Split the text into words + $words = preg_split(self::$_wordbreak_pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE); + $wc = count($words); + + // Determine the split point + $width = 0.0; + $str = ""; + + $space_width = $fontMetrics->getTextWidth(" ", $font, $size, $word_spacing, $letter_spacing); + $shy_width = $fontMetrics->getTextWidth(self::SOFT_HYPHEN, $font, $size); + + // @todo support + for ($i = 0; $i < $wc; $i += 2) { + // Allow trailing white space to overflow. White space is always + // collapsed to the standard space character currently, so only + // handle that for now + $sep = $words[$i + 1] ?? ""; + $word = $sep === " " ? $words[$i] : $words[$i] . $sep; + $word_width = $fontMetrics->getTextWidth($word, $font, $size, $word_spacing, $letter_spacing); + $used_width = $width + $word_width + $mbp_width; + + if ($used_width > 0 && Helpers::lengthGreater($used_width, $available_width)) { + // If the previous split happened by soft hyphen, we have to + // append its width again because the last hyphen of a line + // won't be removed + if (isset($words[$i - 1]) && self::SOFT_HYPHEN === $words[$i - 1]) { + $width += $shy_width; + } + break; + } + + // If the word is splitted by soft hyphen, but no line break is needed + // we have to reduce the width. But the str is not modified, otherwise + // the wrong offset is calculated at the end of this method. + if ($sep === self::SOFT_HYPHEN) { + $width += $word_width - $shy_width; + $str .= $word; + } elseif ($sep === " ") { + $width += $word_width + $space_width; + $str .= $word . $sep; + } else { + $width += $word_width; + $str .= $word; + } + } + + // The first word has overflowed. Force it onto the line, or as many + // characters as fit if breaking words is allowed + if ($force_first && $width === 0.0) { + if ($sep === " ") { + $word .= $sep; + } + + // https://www.w3.org/TR/css-text-3/#overflow-wrap-property + $wrap = $style->overflow_wrap; + $break_word = $wrap === "anywhere" || $wrap === "break-word"; + + if ($break_word) { + $s = ""; + $len = mb_strlen($word, "UTF-8"); + + for ($j = 0; $j < $len; $j++) { + $c = mb_substr($word, $j, 1, "UTF-8"); + $w = $fontMetrics->getTextWidth($s . $c, $font, $size, $word_spacing, $letter_spacing); + + if (Helpers::lengthGreater($w, $available_width)) { + break; + } + + $s .= $c; + } + + // Always force the first character onto the line + $str = $j === 0 ? $s . $c : $s; + } else { + $str = $word; + } + } + + $offset = mb_strlen($str, "UTF-8"); + return $offset; + } + + /** + * @param string $text + * @return int|false + */ + protected function newline_break(string $text) + { + if (($i = mb_strpos($text, "\n", 0, "UTF-8")) === false) { + return false; + } + + return $i + 1; + } + + /** + * @param BlockFrameDecorator $block + * @return bool|null Whether to add a new line at the end. `null` if reflow + * should be stopped. + */ + protected function layout_line(BlockFrameDecorator $block): ?bool + { + $frame = $this->_frame; + $style = $frame->get_style(); + $current_line = $block->get_current_line_box(); + $text = $frame->get_text(); + + // Trim leading white space if this is the first text on the line + if ($current_line->is_empty() && !$frame->is_pre()) { + $text = ltrim($text, " "); + } + + if ($text === "") { + $frame->set_text(""); + $style->set_used("width", 0.0); + return false; + } + + // Determine the next line break + // http://www.w3.org/TR/CSS21/text.html#propdef-white-space + $white_space = $style->white_space; + $nowrap = $white_space === "nowrap" || $white_space === "pre"; + + switch ($white_space) { + default: + case "normal": + case "nowrap": + $split = $this->line_break($text, $block, $nowrap); + $add_line = false; + break; + + case "pre": + case "pre-line": + case "pre-wrap": + $hard_split = $this->newline_break($text); + $first_line = $hard_split !== false + ? mb_substr($text, 0, $hard_split, "UTF-8") + : $text; + $soft_split = $this->line_break($first_line, $block, $nowrap); + + $split = $soft_split !== false ? $soft_split : $hard_split; + $add_line = $hard_split !== false; + break; + } + + if ($split === 0) { + // Make sure to move text when floating frames leave no space to + // place anything onto the line + // TODO: Would probably be better to move just below the current + // floating frame instead of trying to place text in line-height + // increments + if ($current_line->h === 0.0) { + // Line height might be 0 + $h = max($frame->get_margin_height(), 1.0); + $block->maximize_line_height($h, $frame); + } + + // Break line and repeat layout + $block->add_line(); + + // Find the appropriate inline ancestor to split + $child = $frame; + $p = $child->get_parent(); + while ($p instanceof InlineFrameDecorator && !$child->get_prev_sibling()) { + $child = $p; + $p = $p->get_parent(); + } + + if ($p instanceof InlineFrameDecorator) { + // Split parent and stop current reflow. Reflow continues + // via child-reflow loop of split parent + $p->split($child); + return null; + } + + return $this->layout_line($block); + } + + // Final split point is determined + if ($split !== false && $split < mb_strlen($text, "UTF-8")) { + // Split the line + $frame->set_text($text); + $frame->split_text($split, true); + $add_line = true; + + // Remove inner soft hyphens + $t = $frame->get_text(); + $shyPosition = mb_strpos($t, self::SOFT_HYPHEN, 0, "UTF-8"); + if (false !== $shyPosition && $shyPosition < mb_strlen($t, "UTF-8") - 1) { + $t = str_replace(self::SOFT_HYPHEN, "", mb_substr($t, 0, -1, "UTF-8")) . mb_substr($t, -1, null, "UTF-8"); + $frame->set_text($t); + } + } else { + // No split required + // Remove soft hyphens + $text = str_replace(self::SOFT_HYPHEN, "", $text); + $frame->set_text($text); + } + + // Set our new width + $frame->recalculate_width(); + + return $add_line; + } + + /** + * @param BlockFrameDecorator|null $block + * @throws Exception + */ + function reflow(?BlockFrameDecorator $block = null) + { + $frame = $this->_frame; + $page = $frame->get_root(); + $page->check_forced_page_break($frame); + + if ($page->is_full()) { + return; + } + + $style = $frame->get_style(); + + // Handle text transform and white space + $frame->set_text($this->pre_process_text($frame->get_text())); + + // map text to fonts based on supported Unicode range + $frame->apply_font_mapping(); + $text = $frame->get_text(); + + // Determine the text height + $size = $style->font_size; + $font = $style->font_family; + $font_height = $this->getFontMetrics()->getFontHeight($font, $size); + $style->set_used("height", $font_height); + + if ($block === null) { + return; + } + + $add_line = $this->layout_line($block); + + if ($add_line === null) { + return; + } + + $frame->position(); + + // Skip wrapped white space between block-level elements in case white + // space is collapsed + $text = $frame->get_text(); + if ($text === "" && $frame->get_margin_width() === 0.0) { + return; + } + + $line = $block->add_frame_to_line($frame); + $trimmed = trim($text); + + // Split the text into words (used to determine spacing between + // words on justified lines) + if ($trimmed !== "") { + $words = preg_split(self::$_whitespace_pattern, $trimmed); + $line->wc += count($words); + } + + if ($add_line) { + $block->add_line(); + } + } + + /** + * Trim trailing white space from the frame text. + */ + public function trim_trailing_ws(): void + { + $this->_frame->trim_trailing_ws(); + } + + public function reset(): void + { + parent::reset(); + } + + //........................................................................ + + public function get_min_max_width(): array + { + $fontMetrics = $this->getFontMetrics(); + $frame = $this->_frame; + $style = $frame->get_style(); + + // Handle text transform and white space + $frame->set_text($this->pre_process_text($frame->get_text())); + + // map text to fonts based on supported Unicode range + $frame->apply_font_mapping(); + $text = $frame->get_text(); + + $font = $style->font_family; + $size = $style->font_size; + $word_spacing = $style->word_spacing; + $letter_spacing = $style->letter_spacing; + + if (!$frame->is_pre()) { + // Determine whether the frame is at the start of its parent block. + // Trim leading white space in that case + $child = $frame; + $p = $frame->get_parent(); + while (!$p->is_block() && !$child->get_prev_sibling()) { + $child = $p; + $p = $p->get_parent(); + } + + if (!$child->get_prev_sibling()) { + $text = ltrim($text, " "); + } + + // Determine whether the frame is at the end of its parent block. + // Trim trailing white space in that case + $child = $frame; + $p = $frame->get_parent(); + while (!$p->is_block() && !$child->get_next_sibling()) { + $child = $p; + $p = $p->get_parent(); + } + + if (!$child->get_next_sibling()) { + $text = rtrim($text, " "); + } + } + + // Strip soft hyphens for max-line-width calculations + $visible_text = preg_replace('/\xAD/u', "", $text); + + // Determine minimum text width + switch ($style->white_space) { + default: + case "normal": + case "pre-line": + case "pre-wrap": + // The min width is the longest word or, if breaking words is + // allowed with the `anywhere` keyword, the widest character. + // For performance reasons, we only check the first character in + // the latter case. + // https://www.w3.org/TR/css-text-3/#overflow-wrap-property + if ($style->overflow_wrap === "anywhere") { + $char = mb_substr($visible_text, 0, 1, "UTF-8"); + $min = $fontMetrics->getTextWidth($char, $font, $size, $word_spacing, $letter_spacing); + } else { + // Find the longest word + $words = preg_split(self::$_wordbreak_pattern, $text, -1, PREG_SPLIT_DELIM_CAPTURE); + $lengths = array_map(function ($chunk) use ($fontMetrics, $font, $size, $word_spacing, $letter_spacing) { + // Allow trailing white space to overflow. As in actual + // layout above, only handle a single space for now + $sep = $chunk[1] ?? ""; + $word = $sep === " " ? $chunk[0] : $chunk[0] . $sep; + return $fontMetrics->getTextWidth($word, $font, $size, $word_spacing, $letter_spacing); + }, array_chunk($words, 2)); + $min = max($lengths); + } + break; + + case "pre": + // Find the longest line + $lines = array_flip(preg_split("/\R/u", $visible_text)); + array_walk($lines, function (&$chunked_text_width, $chunked_text) use ($fontMetrics, $font, $size, $word_spacing, $letter_spacing) { + $chunked_text_width = $fontMetrics->getTextWidth($chunked_text, $font, $size, $word_spacing, $letter_spacing); + }); + arsort($lines); + $min = reset($lines); + break; + + case "nowrap": + $min = $fontMetrics->getTextWidth($visible_text, $font, $size, $word_spacing, $letter_spacing); + break; + } + + // Determine maximum text width + switch ($style->white_space) { + default: + case "normal": + $max = $fontMetrics->getTextWidth($visible_text, $font, $size, $word_spacing, $letter_spacing); + break; + + case "pre-line": + case "pre-wrap": + // Find the longest line + $lines = array_flip(preg_split("/\R/u", $visible_text)); + array_walk($lines, function (&$chunked_text_width, $chunked_text) use ($fontMetrics, $font, $size, $word_spacing, $letter_spacing) { + $chunked_text_width = $fontMetrics->getTextWidth($chunked_text, $font, $size, $word_spacing, $letter_spacing); + }); + arsort($lines); + $max = reset($lines); + break; + + case "pre": + case "nowrap": + $max = $min; + break; + } + + // Account for margins, borders, and padding + $dims = [ + $style->padding_left, + $style->padding_right, + $style->border_left_width, + $style->border_right_width, + $style->margin_left, + $style->margin_right + ]; + + // The containing block is not defined yet, treat percentages as 0 + $delta = (float) $style->length_in_pt($dims, 0); + $min += $delta; + $max += $delta; + + return [$min, $max, "min" => $min, "max" => $max]; + } + + /** + * @param FontMetrics $fontMetrics + * @return $this + */ + public function setFontMetrics(FontMetrics $fontMetrics) + { + $this->fontMetrics = $fontMetrics; + return $this; + } + + /** + * @return FontMetrics + */ + public function getFontMetrics() + { + return $this->fontMetrics; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Helpers.php b/dompdf/vendor/dompdf/dompdf/src/Helpers.php new file mode 100644 index 0000000..e8435d2 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Helpers.php @@ -0,0 +1,1253 @@ + tags if the current sapi is not 'cli'. + * Returns the output string instead of displaying it if $return is true. + * + * @param mixed $mixed variable or expression to display + * @param bool $return + * + * @return string|null + */ + public static function pre_r($mixed, $return = false) + { + if ($return) { + return "
" . print_r($mixed, true) . "
"; + } + + if (php_sapi_name() !== "cli") { + echo "
";
+        }
+
+        print_r($mixed);
+
+        if (php_sapi_name() !== "cli") {
+            echo "
"; + } else { + echo "\n"; + } + + flush(); + + return null; + } + + /** + * Builds a full url given a protocol, hostname, base path and URL. + * + * When the URL provided is a local file reference from the root of the filesystem + * (i.e., beginning with a "/") and the file does not resolve to a valid path, + * the path is validated against the chroot paths (if provided). + * + * @param string $protocol + * @param string $host + * @param string $base_path + * @param string $url + * @param array $chrootDirs array of strings representing the chroot paths + * @return string + */ + public static function build_url($protocol, $host, $base_path, $url, $chrootDirs = []) + { + $protocol = mb_strtolower($protocol, "UTF-8"); + if (empty($protocol)) { + $protocol = "file://"; + } + if ($url === "") { + return null; + } + + $url_lc = mb_strtolower($url, "UTF-8"); + + // Is the url already fully qualified, a Data URI, or a reference to a named anchor? + // File-protocol URLs may require additional processing (e.g. for URLs with a relative path) + if ( + ( + mb_strpos($url_lc, "://") !== false + && !in_array(substr($url_lc, 0, 7), ["file://", "phar://"], true) + ) + || mb_substr($url_lc, 0, 1) === "#" + || mb_strpos($url_lc, "data:") === 0 + || mb_strpos($url_lc, "mailto:") === 0 + || mb_strpos($url_lc, "tel:") === 0 + ) { + return $url; + } + + $res = ""; + if (strpos($url_lc, "file://") === 0) { + $url = substr($url, 7); + $protocol = "file://"; + } elseif (strpos($url_lc, "phar://") === 0) { + $res = substr($url, strpos($url_lc, ".phar")+5); + $url = substr($url, 7, strpos($url_lc, ".phar")-2); + $protocol = "phar://"; + } + + $ret = ""; + + $is_local_path = in_array($protocol, ["file://", "phar://"], true); + + if ($is_local_path) { + //On Windows local file, an abs path can begin also with a '\' or a drive letter and colon + //drive: followed by a relative path would be a drive specific default folder. + //not known in php app code, treat as abs path + //($url[1] !== ':' || ($url[2]!=='\\' && $url[2]!=='/')) + if ($url[0] !== '/' && (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' || (mb_strlen($url) > 1 && $url[0] !== '\\' && $url[1] !== ':'))) { + // For rel path and local access we ignore the host, and run the path through realpath() + $ret .= realpath($base_path) . '/'; + } + $ret .= $url; + $ret = preg_replace('/\?(.*)$/', "", $ret); + + $filepath = realpath($ret); + if ($filepath !== false) { + $ret = "$protocol$filepath$res"; + + return $ret; + } + + if ($url[0] == '/' && !empty($chrootDirs)) { + foreach ($chrootDirs as $dir) { + $ret = realpath($dir) . $url; + $ret = preg_replace('/\?(.*)$/', "", $ret); + + if ($filepath = realpath($ret)) { + $ret = "$protocol$filepath$res"; + + return $ret; + } + } + } + + return null; + } + + $ret = $protocol; + // Protocol relative urls (e.g. "//example.org/style.css") + if (strpos($url, '//') === 0) { + $ret .= substr($url, 2); + //remote urls with backslash in html/css are not really correct, but lets be genereous + } elseif ($url[0] === '/' || $url[0] === '\\') { + // Absolute path + $ret .= $host . $url; + } else { + // Relative path + //$base_path = $base_path !== "" ? rtrim($base_path, "/\\") . "/" : ""; + $ret .= $host . $base_path . $url; + } + + // URL should now be complete, final cleanup + $parsed_url = parse_url($ret); + + // reproduced from https://www.php.net/manual/en/function.parse-url.php#106731 + $scheme = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : ''; + $host = isset($parsed_url['host']) ? $parsed_url['host'] : ''; + $port = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : ''; + $user = isset($parsed_url['user']) ? $parsed_url['user'] : ''; + $pass = isset($parsed_url['pass']) ? ':' . $parsed_url['pass'] : ''; + $pass = ($user || $pass) ? "$pass@" : ''; + $path = isset($parsed_url['path']) ? $parsed_url['path'] : ''; + $query = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : ''; + $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : ''; + + // partially reproduced from https://stackoverflow.com/a/1243431/264628 + /* replace '//' or '/./' or '/foo/../' with '/' */ + $re = array('#(/\.?/)#', '#/(?!\.\.)[^/]+/\.\./#'); + for ($n=1; $n>0; $path=preg_replace($re, '/', $path, -1, $n)) {} + + $ret = "$scheme$user$pass$host$port$path$query$fragment"; + + return $ret; + } + + /** + * Builds a HTTP Content-Disposition header string using `$dispositionType` + * and `$filename`. + * + * If the filename contains any characters not in the ISO-8859-1 character + * set, a fallback filename will be included for clients not supporting the + * `filename*` parameter. + * + * @param string $dispositionType + * @param string $filename + * @return string + */ + public static function buildContentDispositionHeader($dispositionType, $filename) + { + $encoding = mb_detect_encoding($filename); + $fallbackfilename = mb_convert_encoding($filename, "ISO-8859-1", $encoding); + $fallbackfilename = str_replace("\"", "", $fallbackfilename); + $encodedfilename = rawurlencode($filename); + + $contentDisposition = "Content-Disposition: $dispositionType; filename=\"$fallbackfilename\""; + if ($fallbackfilename !== $filename) { + $contentDisposition .= "; filename*=UTF-8''$encodedfilename"; + } + + return $contentDisposition; + } + + /** + * Converts decimal numbers to roman numerals. + * + * As numbers larger than 3999 (and smaller than 1) cannot be represented in + * the standard form of roman numerals, those are left in decimal form. + * + * See https://en.wikipedia.org/wiki/Roman_numerals#Standard_form + * + * @param int|string $num + * + * @throws Exception + * @return string + */ + public static function dec2roman($num): string + { + + static $ones = ["", "i", "ii", "iii", "iv", "v", "vi", "vii", "viii", "ix"]; + static $tens = ["", "x", "xx", "xxx", "xl", "l", "lx", "lxx", "lxxx", "xc"]; + static $hund = ["", "c", "cc", "ccc", "cd", "d", "dc", "dcc", "dccc", "cm"]; + static $thou = ["", "m", "mm", "mmm"]; + + if (!is_numeric($num)) { + throw new Exception("dec2roman() requires a numeric argument."); + } + + if ($num >= 4000 || $num <= 0) { + return (string) $num; + } + + $num = strrev((string)$num); + + $ret = ""; + switch (mb_strlen($num)) { + /** @noinspection PhpMissingBreakStatementInspection */ + case 4: + $ret .= $thou[$num[3]]; + /** @noinspection PhpMissingBreakStatementInspection */ + case 3: + $ret .= $hund[$num[2]]; + /** @noinspection PhpMissingBreakStatementInspection */ + case 2: + $ret .= $tens[$num[1]]; + /** @noinspection PhpMissingBreakStatementInspection */ + case 1: + $ret .= $ones[$num[0]]; + default: + break; + } + + return $ret; + } + + /** + * Converts decimal numbers to base26 (hexavigesimal) + * represented in lower case letters. + * + * @param int|string $num + * + * @throws Exception + * @return string + */ + public static function dec2base26($num): string + { + if (!is_numeric($num)) { + throw new Exception("dec2base26() requires a numeric argument."); + } + + $num = intval($num); + + if ($num <= 0) { + return (string) $num; + } + + $ret = ''; + while ($num > 0) { + $remainder = ($num - 1) % 26; + $ret = chr(97 + $remainder) . $ret; + $num = intval(($num - 1) / 26); + } + return $ret; + } + + /** + * Restrict a length to the given range. + * + * If min > max, the result is min. + * + * @param float $length + * @param float $min + * @param float $max + * + * @return float + */ + public static function clamp(float $length, float $min, float $max): float + { + return max($min, min($length, $max)); + } + + /** + * Determines whether $value is a percentage or not + * + * @param string|float|int $value + * + * @return bool + */ + public static function is_percent($value): bool + { + return is_string($value) && false !== mb_strpos($value, "%"); + } + + /** + * Parses a data URI scheme + * http://en.wikipedia.org/wiki/Data_URI_scheme + * + * @param string $data_uri The data URI to parse + * + * @return array|bool The result with charset, mime type and decoded data + */ + public static function parse_data_uri($data_uri) + { + $expression = '/^data:(?P[a-z0-9\/+-.]+)(;charset=(?P[a-z0-9-])+)?(?P;base64)?\,(?P.*)?/is'; + if (!preg_match($expression, $data_uri, $match)) { + $parts = explode(",", $data_uri); + $parts[0] = preg_replace('/\\s/', '', $parts[0]); + if (preg_match('/\\s/', $data_uri) && !preg_match($expression, implode(",", $parts), $match)) { + return false; + } + } + + $match['data'] = rawurldecode($match['data']); + $result = [ + 'charset' => $match['charset'] ? $match['charset'] : 'US-ASCII', + 'mime' => $match['mime'] ? $match['mime'] : 'text/plain', + 'data' => $match['base64'] ? base64_decode($match['data']) : $match['data'], + ]; + + return $result; + } + + /** + * Encodes a Uniform Resource Identifier (URI) by replacing non-alphanumeric + * characters with a percent (%) sign followed by two hex digits, excepting + * characters in the URI reserved character set. + * + * Assumes that the URI is a complete URI, so does not encode reserved + * characters that have special meaning in the URI. + * + * Simulates the encodeURI function available in JavaScript + * https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/encodeURI + * + * Source: http://stackoverflow.com/q/4929584/264628 + * + * @param string $uri The URI to encode + * @return string The original URL with special characters encoded + */ + public static function encodeURI($uri) { + $unescaped = [ + '%2D'=>'-','%5F'=>'_','%2E'=>'.','%21'=>'!', '%7E'=>'~', + '%2A'=>'*', '%27'=>"'", '%28'=>'(', '%29'=>')' + ]; + $reserved = [ + '%3B'=>';','%2C'=>',','%2F'=>'/','%3F'=>'?','%3A'=>':', + '%40'=>'@','%26'=>'&','%3D'=>'=','%2B'=>'+','%24'=>'$' + ]; + $score = [ + '%23'=>'#' + ]; + return preg_replace( + '/%25([a-fA-F0-9]{2,2})/', + '%$1', + strtr(rawurlencode($uri), array_merge($reserved, $unescaped, $score)) + ); + } + + /** + * Decoder for RLE8 compression in windows bitmaps + * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp + * + * @param string $str Data to decode + * @param int $width Image width + * + * @return string + */ + public static function rle8_decode($str, $width) + { + $lineWidth = $width + (3 - ($width - 1) % 4); + $out = ''; + $cnt = strlen($str); + + for ($i = 0; $i < $cnt; $i++) { + $o = ord($str[$i]); + switch ($o) { + case 0: # ESCAPE + $i++; + switch (ord($str[$i])) { + case 0: # NEW LINE + $padCnt = $lineWidth - strlen($out) % $lineWidth; + if ($padCnt < $lineWidth) { + $out .= str_repeat(chr(0), $padCnt); # pad line + } + break; + case 1: # END OF FILE + $padCnt = $lineWidth - strlen($out) % $lineWidth; + if ($padCnt < $lineWidth) { + $out .= str_repeat(chr(0), $padCnt); # pad line + } + break 3; + case 2: # DELTA + $i += 2; + break; + default: # ABSOLUTE MODE + $num = ord($str[$i]); + for ($j = 0; $j < $num; $j++) { + $out .= $str[++$i]; + } + if ($num % 2) { + $i++; + } + } + break; + default: + $out .= str_repeat($str[++$i], $o); + } + } + return $out; + } + + /** + * Decoder for RLE4 compression in windows bitmaps + * see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp + * + * @param string $str Data to decode + * @param int $width Image width + * + * @return string + */ + public static function rle4_decode($str, $width) + { + $w = floor($width / 2) + ($width % 2); + $lineWidth = $w + (3 - (($width - 1) / 2) % 4); + $pixels = []; + $cnt = strlen($str); + $c = 0; + + for ($i = 0; $i < $cnt; $i++) { + $o = ord($str[$i]); + switch ($o) { + case 0: # ESCAPE + $i++; + switch (ord($str[$i])) { + case 0: # NEW LINE + while (count($pixels) % $lineWidth != 0) { + $pixels[] = 0; + } + break; + case 1: # END OF FILE + while (count($pixels) % $lineWidth != 0) { + $pixels[] = 0; + } + break 3; + case 2: # DELTA + $i += 2; + break; + default: # ABSOLUTE MODE + $num = ord($str[$i]); + for ($j = 0; $j < $num; $j++) { + if ($j % 2 == 0) { + $c = ord($str[++$i]); + $pixels[] = ($c & 240) >> 4; + } else { + $pixels[] = $c & 15; + } + } + + if ($num % 2 == 0) { + $i++; + } + } + break; + default: + $c = ord($str[++$i]); + for ($j = 0; $j < $o; $j++) { + $pixels[] = ($j % 2 == 0 ? ($c & 240) >> 4 : $c & 15); + } + } + } + + $out = ''; + if (count($pixels) % 2) { + $pixels[] = 0; + } + + $cnt = count($pixels) / 2; + + for ($i = 0; $i < $cnt; $i++) { + $out .= chr(16 * $pixels[2 * $i] + $pixels[2 * $i + 1]); + } + + return $out; + } + + /** + * parse a full url or pathname and return an array(protocol, host, path, + * file + query + fragment) + * + * @param string $url + * @return array + */ + public static function explode_url($url) + { + $protocol = ""; + $host = ""; + $path = ""; + $file = ""; + $res = ""; + + $arr = parse_url($url); + if ( isset($arr["scheme"]) ) { + $arr["scheme"] = mb_strtolower($arr["scheme"], "UTF-8"); + } + + if (isset($arr["scheme"]) && $arr["scheme"] !== "file" && $arr["scheme"] !== "phar" && strlen($arr["scheme"]) > 1) { + $protocol = $arr["scheme"] . "://"; + + if (isset($arr["user"])) { + $host .= $arr["user"]; + + if (isset($arr["pass"])) { + $host .= ":" . $arr["pass"]; + } + + $host .= "@"; + } + + if (isset($arr["host"])) { + $host .= $arr["host"]; + } + + if (isset($arr["port"])) { + $host .= ":" . $arr["port"]; + } + + if (isset($arr["path"]) && $arr["path"] !== "") { + // Do we have a trailing slash? + if ($arr["path"][mb_strlen($arr["path"], "8bit") - 1] === "/") { + $path = $arr["path"]; + $file = ""; + } else { + $path = rtrim(dirname($arr["path"]), '/\\') . "/"; + $file = basename($arr["path"]); + } + } + + if (isset($arr["query"])) { + $file .= "?" . $arr["query"]; + } + + if (isset($arr["fragment"])) { + $file .= "#" . $arr["fragment"]; + } + + } else { + + $protocol = ""; + $host = ""; // localhost, really + + $i = mb_stripos($url, "://", 0, "UTF-8"); + if ($i !== false) { + $protocol = mb_strtolower(mb_substr($url, 0, $i + 3, "UTF-8"), "UTF-8"); + $url = mb_substr($url, $i + 3, null, "UTF-8"); + } else { + $protocol = "file://"; + } + + if ($protocol === "phar://") { + $res = substr($url, stripos($url, ".phar")+5); + $url = substr($url, 7, stripos($url, ".phar")-2); + } + + $file = basename($url); + $path = dirname($url) . "/"; + } + + $ret = [$protocol, $host, $path, $file, + "protocol" => $protocol, + "host" => $host, + "path" => $path, + "file" => $file, + "resource" => $res]; + return $ret; + } + + /** + * Print debug messages + * + * @param string $type The type of debug messages to print + * @param string $msg The message to show + */ + public static function dompdf_debug($type, $msg) + { + global $_DOMPDF_DEBUG_TYPES, $_dompdf_show_warnings, $_dompdf_debug; + if (isset($_DOMPDF_DEBUG_TYPES[$type]) && ($_dompdf_show_warnings || $_dompdf_debug)) { + $arr = debug_backtrace(); + + echo basename($arr[0]["file"]) . " (" . $arr[0]["line"] . "): " . $arr[1]["function"] . ": "; + Helpers::pre_r($msg); + } + } + + /** + * Stores warnings in an array for display later + * This function allows warnings generated by the DomDocument parser + * and CSS loader ({@link Stylesheet}) to be captured and displayed + * later. Without this function, errors are displayed immediately and + * PDF streaming is impossible. + * @see http://www.php.net/manual/en/function.set-error_handler.php + * + * @param int $errno + * @param string $errstr + * @param string $errfile + * @param string $errline + * + * @throws Exception + */ + public static function record_warnings($errno, $errstr, $errfile, $errline) + { + // Not a warning or notice + if (!($errno & (E_WARNING | E_NOTICE | E_USER_NOTICE | E_USER_WARNING | E_DEPRECATED | E_USER_DEPRECATED))) { + throw new Exception($errstr . " $errno"); + } + + global $_dompdf_warnings; + global $_dompdf_show_warnings; + + if ($_dompdf_show_warnings) { + echo $errstr . "\n"; + } + + $_dompdf_warnings[] = $errstr; + } + + /** + * Get Unicode code point of character + * + * Shim for use on systems running PHP < 7.2 + * + * @param string $c + * @param string|null $encoding + * @return int|false + */ + public static function uniord(string $c, ?string $encoding = null) + { + if (function_exists("mb_ord")) { + if (PHP_VERSION_ID < 80000 && $encoding === null) { + // in PHP < 8 the encoding argument, if supplied, must be a valid encoding + $encoding = "UTF-8"; + } + return mb_ord($c, $encoding); + } + + if ($encoding != "UTF-8" && $encoding !== null) { + $c = mb_convert_encoding($c, "UTF-8", $encoding); + } + + $length = mb_strlen(mb_substr($c, 0, 1, "UTF-8"), "8bit"); + $ord = false; + $bytes = []; + $numbytes = 1; + for ($i = 0; $i < $length; $i++) { + $o = ord($c[$i]); // get one string character at time + if (count($bytes) === 0) { // get starting octect + if ($o <= 0x7F) { + $ord = $o; + $numbytes = 1; + } elseif (($o >> 0x05) === 0x06) { // 2 bytes character (0x06 = 110 BIN) + $bytes[] = ($o - 0xC0) << 0x06; + $numbytes = 2; + } elseif (($o >> 0x04) === 0x0E) { // 3 bytes character (0x0E = 1110 BIN) + $bytes[] = ($o - 0xE0) << 0x0C; + $numbytes = 3; + } elseif (($o >> 0x03) === 0x1E) { // 4 bytes character (0x1E = 11110 BIN) + $bytes[] = ($o - 0xF0) << 0x12; + $numbytes = 4; + } else { + $ord = false; + break; + } + } elseif (($o >> 0x06) === 0x02) { // bytes 2, 3 and 4 must start with 0x02 = 10 BIN + $bytes[] = $o - 0x80; + if (count($bytes) === $numbytes) { + // compose UTF-8 bytes to a single unicode value + $o = $bytes[0]; + for ($j = 1; $j < $numbytes; $j++) { + $o += ($bytes[$j] << (($numbytes - $j - 1) * 0x06)); + } + if ((($o >= 0xD800) and ($o <= 0xDFFF)) or ($o >= 0x10FFFF)) { + // The definition of UTF-8 prohibits encoding character numbers between + // U+D800 and U+DFFF, which are reserved for use with the UTF-16 + // encoding form (as surrogate pairs) and do not directly represent + // characters. + return false; + } else { + $ord = $o; // add char to array + } + // reset data for next char + $bytes = []; + $numbytes = 1; + } + } else { + $ord = false; + break; + } + } + + return $ord; + } + + /** + * Return character by Unicode code point value + * + * Shim for use on systems running PHP < 7.2 + * + * @param int $c + * @param string|null $encoding + * @return string|false + */ + public static function unichr(int $c, ?string $encoding = null) + { + if (function_exists("mb_chr")) { + if (PHP_VERSION_ID < 80000 && $encoding === null) { + // in PHP < 8 the encoding argument, if supplied, must be a valid encoding + $encoding = "UTF-8"; + } + return mb_chr($c, $encoding); + } + + $chr = false; + if ($c <= 0x7F) { + $chr = chr($c); + } elseif ($c <= 0x7FF) { + $chr = chr(0xC0 | $c >> 6) . chr(0x80 | $c & 0x3F); + } elseif ($c <= 0xFFFF) { + $chr = chr(0xE0 | $c >> 12) . chr(0x80 | $c >> 6 & 0x3F) + . chr(0x80 | $c & 0x3F); + } elseif ($c <= 0x10FFFF) { + $chr = chr(0xF0 | $c >> 18) . chr(0x80 | $c >> 12 & 0x3F) + . chr(0x80 | $c >> 6 & 0x3F) + . chr(0x80 | $c & 0x3F); + } + + return $chr; + } + + /** + * Converts a CMYK color to RGB + * + * @param float|float[] $c + * @param float $m + * @param float $y + * @param float $k + * + * @return float[] + */ + public static function cmyk_to_rgb($c, $m = null, $y = null, $k = null) + { + if (is_array($c)) { + [$c, $m, $y, $k] = $c; + } + + $c *= 255; + $m *= 255; + $y *= 255; + $k *= 255; + + $r = (1 - round(2.55 * ($c + $k))); + $g = (1 - round(2.55 * ($m + $k))); + $b = (1 - round(2.55 * ($y + $k))); + + if ($r < 0) { + $r = 0; + } + if ($g < 0) { + $g = 0; + } + if ($b < 0) { + $b = 0; + } + + return [ + $r, $g, $b, + "r" => $r, "g" => $g, "b" => $b + ]; + } + + /** + * getimagesize doesn't give a good size for 32bit BMP image v5 + * + * @param string $filename + * @param resource $context + * @return array An array of three elements: width and height as + * `float|int`, and image type as `string|null`. + */ + public static function dompdf_getimagesize($filename, $context = null) + { + static $cache = []; + + // Custom types + $types = [ + IMAGETYPE_JPEG => "jpeg", + IMAGETYPE_GIF => "gif", + IMAGETYPE_BMP => "bmp", + IMAGETYPE_PNG => "png", + IMAGETYPE_WEBP => "webp" + ]; + if (defined('IMAGETYPE_SVG')) { + $types[IMAGETYPE_SVG] = "svg"; + } + + if (isset($cache[$filename])) { + return $cache[$filename]; + } + + $parse_result = @getimagesize($filename); + $width = $height = $type = null; + if ($parse_result !== false) { + [$width, $height, $type] = $parse_result; + $type = $types[$type] ?? null; + } + + if ($width == null || $height == null) { + [$data] = Helpers::getFileContent($filename, $context); + + if ($data !== null) { + if (substr($data, 0, 2) === "BM") { + $meta = unpack("vtype/Vfilesize/Vreserved/Voffset/Vheadersize/Vwidth/Vheight", $data); + $width = (int) $meta["width"]; + $height = (int) $meta["height"]; + $type = "bmp"; + } elseif (strpos($data, "loadFile($filename); + + [$width, $height] = $doc->getDimensions(); + $width = (float) $width; + $height = (float) $height; + $type = "svg"; + } + } + } + + return $cache[$filename] = [$width ?? 0, $height ?? 0, $type]; + } + + /** + * Credit goes to mgutt + * http://www.programmierer-forum.de/function-imagecreatefrombmp-welche-variante-laeuft-t143137.htm + * Modified by Fabien Menager to support RGB555 BMP format + */ + public static function imagecreatefrombmp($filename) + { + if (!function_exists("imagecreatetruecolor")) { + trigger_error("The PHP GD extension is required, but is not installed.", E_ERROR); + return false; + } + + if (function_exists("imagecreatefrombmp") && ($im = imagecreatefrombmp($filename)) !== false) { + return $im; + } + + // version 1.00 + if (!($fh = fopen($filename, 'rb'))) { + trigger_error('imagecreatefrombmp: Can not open ' . $filename, E_USER_WARNING); + return false; + } + + $bytes_read = 0; + + // read file header + $meta = unpack('vtype/Vfilesize/Vreserved/Voffset', fread($fh, 14)); + + // check for bitmap + if ($meta['type'] != 19778) { + trigger_error('imagecreatefrombmp: ' . $filename . ' is not a bitmap!', E_USER_WARNING); + return false; + } + + // read image header + $meta += unpack('Vheadersize/Vwidth/Vheight/vplanes/vbits/Vcompression/Vimagesize/Vxres/Vyres/Vcolors/Vimportant', fread($fh, 40)); + $bytes_read += 40; + + // read additional bitfield header + if ($meta['compression'] == 3) { + $meta += unpack('VrMask/VgMask/VbMask', fread($fh, 12)); + $bytes_read += 12; + } + + // set bytes and padding + $meta['bytes'] = $meta['bits'] / 8; + $meta['decal'] = 4 - (4 * (($meta['width'] * $meta['bytes'] / 4) - floor($meta['width'] * $meta['bytes'] / 4))); + if ($meta['decal'] == 4) { + $meta['decal'] = 0; + } + + // obtain imagesize + if ($meta['imagesize'] < 1) { + $meta['imagesize'] = $meta['filesize'] - $meta['offset']; + // in rare cases filesize is equal to offset so we need to read physical size + if ($meta['imagesize'] < 1) { + $meta['imagesize'] = @filesize($filename) - $meta['offset']; + if ($meta['imagesize'] < 1) { + trigger_error('imagecreatefrombmp: Can not obtain filesize of ' . $filename . '!', E_USER_WARNING); + return false; + } + } + } + + // calculate colors + $meta['colors'] = !$meta['colors'] ? pow(2, $meta['bits']) : $meta['colors']; + + // read color palette + $palette = []; + if ($meta['bits'] < 16) { + $palette = unpack('l' . $meta['colors'], fread($fh, $meta['colors'] * 4)); + // in rare cases the color value is signed + if ($palette[1] < 0) { + foreach ($palette as $i => $color) { + $palette[$i] = $color + 16777216; + } + } + } + + // ignore extra bitmap headers + if ($meta['headersize'] > $bytes_read) { + fread($fh, $meta['headersize'] - $bytes_read); + } + + // create gd image + $im = imagecreatetruecolor($meta['width'], $meta['height']); + $data = fread($fh, $meta['imagesize']); + + // uncompress data + switch ($meta['compression']) { + case 1: + $data = Helpers::rle8_decode($data, $meta['width']); + break; + case 2: + $data = Helpers::rle4_decode($data, $meta['width']); + break; + } + + $p = 0; + $vide = chr(0); + $y = $meta['height'] - 1; + $error = 'imagecreatefrombmp: ' . $filename . ' has not enough data!'; + + // loop through the image data beginning with the lower left corner + while ($y >= 0) { + $x = 0; + while ($x < $meta['width']) { + switch ($meta['bits']) { + case 32: + case 24: + if (!($part = substr($data, $p, 3 /*$meta['bytes']*/))) { + trigger_error($error, E_USER_WARNING); + return $im; + } + $color = unpack('V', $part . $vide); + break; + case 16: + if (!($part = substr($data, $p, 2 /*$meta['bytes']*/))) { + trigger_error($error, E_USER_WARNING); + return $im; + } + $color = unpack('v', $part); + + if (empty($meta['rMask']) || $meta['rMask'] != 0xf800) { + $color[1] = (($color[1] & 0x7c00) >> 7) * 65536 + (($color[1] & 0x03e0) >> 2) * 256 + (($color[1] & 0x001f) << 3); // 555 + } else { + $color[1] = (($color[1] & 0xf800) >> 8) * 65536 + (($color[1] & 0x07e0) >> 3) * 256 + (($color[1] & 0x001f) << 3); // 565 + } + break; + case 8: + $color = unpack('n', $vide . substr($data, $p, 1)); + $color[1] = $palette[$color[1] + 1]; + break; + case 4: + $color = unpack('n', $vide . substr($data, floor($p), 1)); + $color[1] = ($p * 2) % 2 == 0 ? $color[1] >> 4 : $color[1] & 0x0F; + $color[1] = $palette[$color[1] + 1]; + break; + case 1: + $color = unpack('n', $vide . substr($data, floor($p), 1)); + switch (($p * 8) % 8) { + case 0: + $color[1] = $color[1] >> 7; + break; + case 1: + $color[1] = ($color[1] & 0x40) >> 6; + break; + case 2: + $color[1] = ($color[1] & 0x20) >> 5; + break; + case 3: + $color[1] = ($color[1] & 0x10) >> 4; + break; + case 4: + $color[1] = ($color[1] & 0x8) >> 3; + break; + case 5: + $color[1] = ($color[1] & 0x4) >> 2; + break; + case 6: + $color[1] = ($color[1] & 0x2) >> 1; + break; + case 7: + $color[1] = ($color[1] & 0x1); + break; + } + $color[1] = $palette[$color[1] + 1]; + break; + default: + trigger_error('imagecreatefrombmp: ' . $filename . ' has ' . $meta['bits'] . ' bits and this is not supported!', E_USER_WARNING); + return false; + } + imagesetpixel($im, $x, $y, $color[1]); + $x++; + $p += $meta['bytes']; + } + $y--; + $p += $meta['decal']; + } + fclose($fh); + return $im; + } + + /** + * Gets the content of the file at the specified path using one of + * the following methods, in preferential order: + * - file_get_contents: if allow_url_fopen is true or the file is local + * - curl: if allow_url_fopen is false and curl is available + * + * @param string $uri + * @param resource $context + * @param int $offset + * @param int $maxlen + * @return string[] + */ + public static function getFileContent($uri, $context = null, $offset = 0, $maxlen = null) + { + $content = null; + $headers = null; + [$protocol] = Helpers::explode_url($uri); + $is_local_path = in_array(strtolower($protocol), ["", "file://", "phar://"], true); + $can_use_curl = in_array(strtolower($protocol), ["http://", "https://"], true) && function_exists('curl_exec'); + + set_error_handler([self::class, 'record_warnings']); + + try { + if ($is_local_path || ini_get('allow_url_fopen') && !$can_use_curl) { + $http_response_header = null; + if (version_compare(PHP_VERSION, "8.4.0", ">=")) { + \http_clear_last_response_headers(); + } + if ($is_local_path === false) { + $uri = Helpers::encodeURI($uri); + } + if (isset($maxlen)) { + $result = file_get_contents($uri, false, $context, $offset, $maxlen); + } else { + $result = file_get_contents($uri, false, $context, $offset); + } + if ($result !== false) { + $content = $result; + } + if (version_compare(PHP_VERSION, "8.4.0", ">=")) { + $headers = \http_get_last_response_headers(); + \http_clear_last_response_headers(); + } elseif (isset($http_response_header)) { + $headers = $http_response_header; + } + + } elseif ($can_use_curl) { + $curl = curl_init($uri); + + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_HEADER, true); + if ($offset > 0) { + curl_setopt($curl, CURLOPT_RESUME_FROM, $offset); + } + + if ($maxlen > 0) { + curl_setopt($curl, CURLOPT_BUFFERSIZE, 128); + curl_setopt($curl, CURLOPT_NOPROGRESS, false); + curl_setopt($curl, CURLOPT_PROGRESSFUNCTION, function ($res, $download_size_total, $download_size, $upload_size_total, $upload_size) use ($maxlen) { + return ($download_size > $maxlen) ? 1 : 0; + }); + } + + $context_options = []; + if (!is_null($context)) { + $context_options = stream_context_get_options($context); + } + foreach ($context_options as $stream => $options) { + foreach ($options as $option => $value) { + $key = strtolower($stream) . ":" . strtolower($option); + switch ($key) { + case "curl:curl_verify_ssl_host": + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, !$value ? 0 : 2); + break; + case "curl:max_redirects": + curl_setopt($curl, CURLOPT_MAXREDIRS, $value); + break; + case "http:follow_location": + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, $value); + break; + case "http:header": + if (is_string($value)) { + curl_setopt($curl, CURLOPT_HTTPHEADER, [$value]); + } else { + curl_setopt($curl, CURLOPT_HTTPHEADER, $value); + } + break; + case "http:timeout": + curl_setopt($curl, CURLOPT_TIMEOUT, $value); + break; + case "http:user_agent": + curl_setopt($curl, CURLOPT_USERAGENT, $value); + break; + case "curl:curl_verify_ssl_peer": + case "ssl:verify_peer": + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $value); + break; + } + } + } + + $data = curl_exec($curl); + + if ($data !== false && !curl_errno($curl)) { + switch ($http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE)) { + case 200: + $raw_headers = substr($data, 0, curl_getinfo($curl, CURLINFO_HEADER_SIZE)); + $headers = preg_split("/[\n\r]+/", trim($raw_headers)); + $content = substr($data, curl_getinfo($curl, CURLINFO_HEADER_SIZE)); + break; + } + } + + if (PHP_MAJOR_VERSION < 8) { + curl_close($curl); + } + } + } finally { + restore_error_handler(); + } + + return [$content, $headers]; + } + + /** + * @param string $str + * @return string + */ + public static function mb_ucwords(string $str): string + { + $max_len = mb_strlen($str, "UTF-8"); + if ($max_len === 1) { + return mb_strtoupper($str, "UTF-8"); + } + + $str = mb_strtoupper(mb_substr($str, 0, 1, "UTF-8"), "UTF-8") . mb_substr($str, 1, null, "UTF-8"); + + foreach ([' ', '.', ',', '!', '?', '-', '+'] as $s) { + $pos = 0; + while (($pos = mb_strpos($str, $s, $pos, "UTF-8")) !== false) { + $pos++; + // Nothing to do if the separator is the last char of the string + if ($pos !== false && $pos < $max_len) { + // If the char we want to upper is the last char there is nothing to append behind + if ($pos + 1 < $max_len) { + $str = mb_substr($str, 0, $pos, "UTF-8") . mb_strtoupper(mb_substr($str, $pos, 1, "UTF-8"), "UTF-8") . mb_substr($str, $pos + 1, null, "UTF-8"); + } else { + $str = mb_substr($str, 0, $pos, "UTF-8") . mb_strtoupper(mb_substr($str, $pos, 1, "UTF-8"), "UTF-8"); + } + } + } + } + + return $str; + } + + /** + * Check whether two lengths should be considered equal, accounting for + * inaccuracies in float computation. + * + * The implementation relies on the fact that we are neither dealing with + * very large, nor with very small numbers in layout. Adapted from + * https://floating-point-gui.de/errors/comparison/. + * + * @param float $a + * @param float $b + * + * @return bool + */ + public static function lengthEqual(float $a, float $b): bool + { + // The epsilon results in a precision of at least: + // * 7 decimal digits at around 1 + // * 4 decimal digits at around 1000 (around the size of common paper formats) + // * 2 decimal digits at around 100,000 (100,000pt ~ 35.28m) + static $epsilon = 1e-8; + static $almostZero = 1e-12; + + $diff = abs($a - $b); + + if ($a === $b || $diff < $almostZero) { + return true; + } + + return $diff < $epsilon * max(abs($a), abs($b)); + } + + /** + * Check `$a < $b`, accounting for inaccuracies in float computation. + */ + public static function lengthLess(float $a, float $b): bool + { + return $a < $b && !self::lengthEqual($a, $b); + } + + /** + * Check `$a <= $b`, accounting for inaccuracies in float computation. + */ + public static function lengthLessOrEqual(float $a, float $b): bool + { + return $a <= $b || self::lengthEqual($a, $b); + } + + /** + * Check `$a > $b`, accounting for inaccuracies in float computation. + */ + public static function lengthGreater(float $a, float $b): bool + { + return $a > $b && !self::lengthEqual($a, $b); + } + + /** + * Check `$a >= $b`, accounting for inaccuracies in float computation. + */ + public static function lengthGreaterOrEqual(float $a, float $b): bool + { + return $a >= $b || self::lengthEqual($a, $b); + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Image/Cache.php b/dompdf/vendor/dompdf/dompdf/src/Image/Cache.php new file mode 100644 index 0000000..5a06f3f --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Image/Cache.php @@ -0,0 +1,292 @@ +getChroot()); + + if ($full_url === null) { + throw new ImageException("Unable to parse image URL $url.", E_WARNING); + } + + $parsed_url = Helpers::explode_url($full_url); + $protocol = strtolower($parsed_url["protocol"]); + $is_data_uri = strpos($protocol, "data:") === 0; + + $allowed_protocols = $options->getAllowedProtocols(); + if (!array_key_exists($protocol, $allowed_protocols)) { + throw new ImageException("Permission denied on $url. The communication protocol is not supported.", E_WARNING); + } + foreach ($allowed_protocols[$protocol]["rules"] as $rule) { + [$result, $message] = $rule($full_url); + if (!$result) { + throw new ImageException("Error loading $url: $message", E_WARNING); + } + } + + if ($protocol === "file://") { + $resolved_url = $full_url; + } elseif (isset(self::$_cache[$full_url])) { + $resolved_url = self::$_cache[$full_url]; + } else { + $tmp_dir = $options->getTempDir(); + if (($resolved_url = @tempnam($tmp_dir, "ca_dompdf_img_")) === false) { + throw new ImageException("Unable to create temporary image in " . $tmp_dir, E_WARNING); + } + $tempfile = $resolved_url; + + $image = null; + if ($is_data_uri) { + if (($parsed_data_uri = Helpers::parse_data_uri($url)) !== false) { + $image = $parsed_data_uri["data"]; + } + } else { + list($image, $http_response_header) = Helpers::getFileContent($full_url, $options->getHttpContext()); + } + + // Image not found or invalid + if ($image === null) { + $msg = ($is_data_uri ? "Data-URI could not be parsed" : "Image not found"); + throw new ImageException($msg, E_WARNING); + } + + if (@file_put_contents($resolved_url, $image) === false) { + throw new ImageException("Unable to create temporary image in " . $tmp_dir, E_WARNING); + } + + self::$_cache[$full_url] = $resolved_url; + } + + // Check if the local file is readable + if (!is_readable($resolved_url) || !filesize($resolved_url)) { + throw new ImageException("Image not readable or empty", E_WARNING); + } + + list($width, $height, $type) = Helpers::dompdf_getimagesize($resolved_url, $options->getHttpContext()); + + if (($width && $height && in_array($type, ["gif", "png", "jpeg", "bmp", "svg","webp"], true)) === false) { + throw new ImageException("Image type unknown", E_WARNING); + } + + if ($type === "svg") { + $parser = xml_parser_create("utf-8"); + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false); + xml_set_element_handler( + $parser, + function ($parser, $name, $attributes) use ($options, $parsed_url, $full_url) { + if (strtolower($name) === "image") { + if (!\array_key_exists($full_url, self::$svgRefs)) { + self::$svgRefs[$full_url] = []; + } + $attributes = array_change_key_case($attributes, CASE_LOWER); + $urls = []; + $urls[] = $attributes["xlink:href"] ?? ""; + $urls[] = $attributes["href"] ?? ""; + foreach ($urls as $url) { + if (empty($url)) { + continue; + } + + $inner_full_url = Helpers::build_url($parsed_url["protocol"], $parsed_url["host"], $parsed_url["path"], $url, $options->getChroot()); + if (empty($inner_full_url)) { + continue; + } + + self::detectCircularRef($full_url, $inner_full_url); + self::$svgRefs[$full_url][] = $inner_full_url; + [$resolved_url, $type, $message] = self::resolve_url($url, $parsed_url["protocol"], $parsed_url["host"], $parsed_url["path"], $options); + if (!empty($message)) { + throw new ImageException("This SVG document references a restricted resource. $message", E_WARNING); + } + } + } + }, + null + ); + + if (($fp = fopen($resolved_url, "r")) !== false) { + while ($line = fread($fp, 8192)) { + xml_parse($parser, $line, false); + } + fclose($fp); + xml_parse($parser, "", true); + } + if (PHP_MAJOR_VERSION < 8) { + xml_parser_free($parser); + } + } + } catch (ImageException $e) { + if ($tempfile) { + unlink($tempfile); + } + $resolved_url = self::$broken_image; + list($width, $height, $type) = Helpers::dompdf_getimagesize($resolved_url, $options->getHttpContext()); + $message = self::$error_message; + Helpers::record_warnings($e->getCode(), $e->getMessage() . " \n $url", $e->getFile(), $e->getLine()); + if ($full_url !== null) { + self::$_cache[$full_url] = $resolved_url; + } + } + + return [$resolved_url, $type, $message]; + } + + static function detectCircularRef(string $src, string $target) + { + if (!\array_key_exists($target, self::$svgRefs)) { + return; + } + foreach (self::$svgRefs[$target] as $ref) { + if ($ref === $src) { + throw new ImageException("Circular external SVG image reference detected.", E_WARNING); + } + self::detectCircularRef($src, $ref); + } + } + + /** + * Register a temp file for the given original image file. + * + * @param string $filePath The path of the original image. + * @param string $tempPath The path of the temp file to register. + * @param string $key An optional key to register the temp file at. + */ + static function addTempImage(string $filePath, string $tempPath, string $key = "default"): void + { + if (!isset(self::$tempImages[$filePath])) { + self::$tempImages[$filePath] = []; + } + + self::$tempImages[$filePath][$key] = $tempPath; + } + + /** + * Get the path of a temp file registered for the given original image file. + * + * @param string $filePath The path of the original image. + * @param string $key The key the temp file is registered at. + */ + static function getTempImage(string $filePath, string $key = "default"): ?string + { + return self::$tempImages[$filePath][$key] ?? null; + } + + /** + * Unlink all cached images (i.e. temporary images either downloaded + * or converted) except for the bundled "broken image" + */ + static function clear(bool $debugPng = false) + { + foreach (self::$_cache as $file) { + if ($file === self::$broken_image) { + continue; + } + if ($debugPng) { + print "[clear unlink $file]"; + } + if (file_exists($file)) { + unlink($file); + } + } + + foreach (self::$tempImages as $versions) { + foreach ($versions as $file) { + if ($file === self::$broken_image) { + continue; + } + if ($debugPng) { + print "[unlink temp image $file]"; + } + if (file_exists($file)) { + unlink($file); + } + } + } + + self::$_cache = []; + self::$tempImages = []; + self::$svgRefs = []; + } + + static function detect_type($file, $context = null) + { + list(, , $type) = Helpers::dompdf_getimagesize($file, $context); + + return $type; + } + + static function is_broken($url) + { + return $url === self::$broken_image; + } +} + +if (file_exists(realpath(__DIR__ . "/../../lib/res/broken_image.svg"))) { + Cache::$broken_image = realpath(__DIR__ . "/../../lib/res/broken_image.svg"); +} diff --git a/dompdf/vendor/dompdf/dompdf/src/JavascriptEmbedder.php b/dompdf/vendor/dompdf/dompdf/src/JavascriptEmbedder.php new file mode 100644 index 0000000..f4b9bc2 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/JavascriptEmbedder.php @@ -0,0 +1,51 @@ +_dompdf = $dompdf; + } + + /** + * @param $script + */ + public function insert($script) + { + $this->_dompdf->getCanvas()->javascript($script); + } + + /** + * @param Frame $frame + */ + public function render(Frame $frame) + { + if (!$this->_dompdf->getOptions()->getIsJavascriptEnabled()) { + return; + } + + $this->insert($frame->get_node()->nodeValue); + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/LineBox.php b/dompdf/vendor/dompdf/dompdf/src/LineBox.php new file mode 100644 index 0000000..85ea8cc --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/LineBox.php @@ -0,0 +1,407 @@ +_block_frame = $frame; + $this->_frames = []; + $this->y = $y; + + $this->get_float_offsets(); + } + + /** + * Returns the floating elements inside the first floating parent + * + * @param Page $root + * + * @return Frame[] + */ + public function get_floats_inside(Page $root): array + { + $floating_frames = $root->get_floating_frames(); + + if (count($floating_frames) == 0) { + return $floating_frames; + } + + // Find nearest floating element + $p = $this->_block_frame; + while ($p->get_style()->float === "none") { + $parent = $p->get_parent(); + + if (!$parent) { + break; + } + + $p = $parent; + } + + if ($p == $root) { + return $floating_frames; + } + + $parent = $p; + + $childs = []; + + foreach ($floating_frames as $_floating) { + $p = $_floating->get_parent(); + + while (($p = $p->get_parent()) && $p !== $parent); + + if ($p) { + $childs[] = $p; + } + } + + return $childs; + } + + public function get_float_offsets(): void + { + static $anti_infinite_loop = 10000; // FIXME smelly hack + + $reflower = $this->_block_frame->get_reflower(); + + if (!$reflower) { + return; + } + + $cb_w = null; + + $block = $this->_block_frame; + $root = $block->get_root(); + + if (!$root) { + return; + } + + $style = $this->_block_frame->get_style(); + $floating_frames = $this->get_floats_inside($root); + $inside_left_floating_width = 0; + $inside_right_floating_width = 0; + $outside_left_floating_width = 0; + $outside_right_floating_width = 0; + + foreach ($floating_frames as $child_key => $floating_frame) { + $floating_frame_parent = $floating_frame->get_parent(); + $id = $floating_frame->get_id(); + + if (isset($this->floating_blocks[$id])) { + continue; + } + + $float = $floating_frame->get_style()->float; + $floating_width = $floating_frame->get_margin_width(); + + if (!$cb_w) { + $cb_w = $floating_frame->get_containing_block("w"); + } + + $line_w = $this->get_width(); + + if (!$floating_frame->_float_next_line && ($cb_w <= $line_w + $floating_width) && ($cb_w > $line_w)) { + $floating_frame->_float_next_line = true; + continue; + } + + // If the child is still shifted by the floating element + if ($anti_infinite_loop-- > 0 && + $floating_frame->get_position("y") + $floating_frame->get_margin_height() >= $this->y && + $block->get_position("x") + $block->get_margin_width() >= $floating_frame->get_position("x") + ) { + if ($float === "left") { + if ($floating_frame_parent === $this->_block_frame) { + $inside_left_floating_width += $floating_width; + } else { + $outside_left_floating_width += $floating_width; + } + } elseif ($float === "right") { + if ($floating_frame_parent === $this->_block_frame) { + $inside_right_floating_width += $floating_width; + } else { + $outside_right_floating_width += $floating_width; + } + } + + $this->floating_blocks[$id] = true; + } // else, the floating element won't shift anymore + else { + $root->remove_floating_frame($child_key); + } + } + + $this->left += $inside_left_floating_width; + if ($outside_left_floating_width > 0 && $outside_left_floating_width > ((float)$style->length_in_pt($style->margin_left) + (float)$style->length_in_pt($style->padding_left))) { + $this->left += $outside_left_floating_width - (float)$style->length_in_pt($style->margin_left) - (float)$style->length_in_pt($style->padding_left); + } + $this->right += $inside_right_floating_width; + if ($outside_right_floating_width > 0 && $outside_right_floating_width > ((float)$style->length_in_pt($style->margin_left) + (float)$style->length_in_pt($style->padding_right))) { + $this->right += $outside_right_floating_width - (float)$style->length_in_pt($style->margin_right) - (float)$style->length_in_pt($style->padding_right); + } + } + + /** + * @return float + */ + public function get_width(): float + { + return $this->left + $this->w + $this->right; + } + + /** + * @return Block + */ + public function get_block_frame(): Block + { + return $this->_block_frame; + } + + /** + * @return AbstractFrameDecorator[] + */ + public function &get_frames(): array + { + return $this->_frames; + } + + /** + * @return bool + */ + public function is_empty(): bool + { + return $this->_frames === []; + } + + /** + * @param AbstractFrameDecorator $frame + */ + public function add_frame(Frame $frame): void + { + $this->_frames[] = $frame; + + if ($frame->get_positioner() instanceof InlinePositioner) { + $this->inline = true; + } + } + + /** + * Remove the frame at the given index and all following frames from the + * line. + * + * @param int $index + */ + public function remove_frames(int $index): void + { + $lastIndex = count($this->_frames) - 1; + + if ($index < 0 || $index > $lastIndex) { + return; + } + + for ($i = $lastIndex; $i >= $index; $i--) { + $f = $this->_frames[$i]; + unset($this->_frames[$i]); + $this->w -= $f->get_margin_width(); + } + + // Reset array indices + $this->_frames = array_values($this->_frames); + + // Recalculate the height of the line + $h = 0.0; + $this->inline = false; + + foreach ($this->_frames as $f) { + $h = max($h, $f->get_margin_height()); + + if ($f->get_positioner() instanceof InlinePositioner) { + $this->inline = true; + } + } + + $this->h = $h; + } + + /** + * Get the `outside` positioned list markers to be vertically aligned with + * the line box. + * + * @return ListBullet[] + */ + public function get_list_markers(): array + { + return $this->list_markers; + } + + /** + * Add a list marker to the line box. + * + * The list marker is only added for the purpose of vertical alignment, it + * is not actually added to the list of frames of the line box. + */ + public function add_list_marker(ListBullet $marker): void + { + $this->list_markers[] = $marker; + } + + /** + * An iterator of all list markers and inline positioned frames of the line + * box. + * + * @return Iterator + */ + public function frames_to_align(): Iterator + { + yield from $this->list_markers; + + foreach ($this->_frames as $frame) { + if ($frame->get_positioner() instanceof InlinePositioner) { + yield $frame; + } + } + } + + /** + * Trim trailing whitespace from the line. + */ + public function trim_trailing_ws(): void + { + $lastIndex = count($this->_frames) - 1; + + if ($lastIndex < 0) { + return; + } + + $lastFrame = $this->_frames[$lastIndex]; + $reflower = $lastFrame->get_reflower(); + + if ($reflower instanceof TextFrameReflower && !$lastFrame->is_pre()) { + $reflower->trim_trailing_ws(); + $this->recalculate_width(); + } + } + + /** + * Recalculate LineBox width based on the contained frames total width. + * + * @return float + */ + public function recalculate_width(): float + { + $width = 0.0; + + foreach ($this->_frames as $frame) { + $width += $frame->get_margin_width(); + } + + return $this->w = $width; + } + + public function __toString(): string + { + $props = ["wc", "y", "w", "h", "left", "right", "br"]; + $s = ""; + foreach ($props as $prop) { + $s .= "$prop: " . $this->$prop . "\n"; + } + $s .= count($this->_frames) . " frames\n"; + + return $s; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Options.php b/dompdf/vendor/dompdf/dompdf/src/Options.php new file mode 100644 index 0000000..d7b9453 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Options.php @@ -0,0 +1,1231 @@ + ["rules" => []], + "file://" => ["rules" => []], + "http://" => ["rules" => []], + "https://" => ["rules" => []] + ]; + + /** + * Operational artifact (log files, temporary files) path validation + * + * @var callable + */ + private $artifactPathValidation = null; + + /** + * @var string + */ + private $logOutputFile = ''; + + /** + * Styles targeted to this media type are applied to the document. + * This is on top of the media types that are always applied: + * all, static, visual, bitmap, paged, dompdf + * + * @var string + */ + private $defaultMediaType = "screen"; + + /** + * The default paper size. + * + * North America standard is "letter"; other countries generally "a4" + * @see \Dompdf\Adapter\CPDF::PAPER_SIZES for valid sizes + * + * @var string|float[] + */ + private $defaultPaperSize = "letter"; + + /** + * The default paper orientation. + * + * The orientation of the page (portrait or landscape). + * + * @var string + */ + private $defaultPaperOrientation = "portrait"; + + /** + * The default font family + * + * Used if no suitable fonts can be found. This must exist in the font folder. + * + * @var string + */ + private $defaultFont = "serif"; + + /** + * Image DPI setting + * + * This setting determines the default DPI setting for images and fonts. The + * DPI may be overridden for inline images by explicitly setting the + * image's width & height style attributes (i.e. if the image's native + * width is 600 pixels and you specify the image's width as 72 points, + * the image will have a DPI of 600 in the rendered PDF. The DPI of + * background images can not be overridden and is controlled entirely + * via this parameter. + * + * For the purposes of DOMPDF, pixels per inch (PPI) = dots per inch (DPI). + * If a size in html is given as px (or without unit as image size), + * this tells the corresponding size in pt at 72 DPI. + * This adjusts the relative sizes to be similar to the rendering of the + * html page in a reference browser. + * + * In pdf, always 1 pt = 1/72 inch + * + * @var int + */ + private $dpi = 96; + + /** + * A ratio applied to the fonts height to be more like browsers' line height + * + * @var float + */ + private $fontHeightRatio = 1.1; + + /** + * Enable embedded PHP + * + * If this setting is set to true then DOMPDF will automatically evaluate + * embedded PHP contained within tags. + * + * ==== IMPORTANT ==== + * Enabling this for documents you do not trust (e.g. arbitrary remote html + * pages) is a security risk. Embedded scripts are run with the same level of + * system access available to dompdf. Set this option to false (recommended) + * if you wish to process untrusted documents. + * + * This setting may increase the risk of system exploit. Do not change + * this settings without understanding the consequences. Additional + * documentation is available on the dompdf wiki at: + * https://github.com/dompdf/dompdf/wiki + * + * @var bool + */ + private $isPhpEnabled = false; + + /** + * Enable remote file access + * + * If this setting is set to true, DOMPDF will access remote sites for + * images and CSS files as required. + * + * ==== IMPORTANT ==== + * This can be a security risk, in particular in combination with isPhpEnabled and + * allowing remote html code to be passed to $dompdf = new DOMPDF(); $dompdf->load_html(...); + * This allows anonymous users to download legally doubtful internet content which on + * tracing back appears to being downloaded by your server, or allows malicious php code + * in remote html pages to be executed by your server with your account privileges. + * + * This setting may increase the risk of system exploit. Do not change + * this settings without understanding the consequences. Additional + * documentation is available on the dompdf wiki at: + * https://github.com/dompdf/dompdf/wiki + * + * @var bool + */ + private $isRemoteEnabled = false; + + /** + * List of allowed remote hosts + * + * Each value of the array must be a valid hostname. + * + * This will be used to filter which resources can be loaded in combination with + * isRemoteEnabled. If isRemoteEnabled is FALSE, then this will have no effect. + * + * Leave to NULL to allow any remote host. + * + * @var array|null + */ + private $allowedRemoteHosts = null; + + /** + * Enable PDF/A-3 compliance mode + * + * ==== EXPERIMENTAL ==== + * This feature is currently only supported with the CPDF backend and will + * have no effect if used with any other. + * + * Currently this mode only takes care of adding the necessary metadata, output intents, etc. + * It does not enforce font embedding, it's up to you to embed the fonts you plan on using. + * + * @var bool + */ + private $isPdfAEnabled = false; + + /** + * Enable inline JavaScript + * + * If this setting is set to true then DOMPDF will automatically insert + * JavaScript code contained within + * tags as written into the PDF. + * + * NOTE: This is PDF-based JavaScript to be executed by the PDF viewer, + * not browser-based JavaScript executed by Dompdf. + * + * @var bool + */ + private $isJavascriptEnabled = true; + + /** + * Use the HTML5 Lib parser + * + * @deprecated + * @var bool + */ + private $isHtml5ParserEnabled = true; + + /** + * Whether to enable font subsetting or not. + * + * @var bool + */ + private $isFontSubsettingEnabled = true; + + /** + * @var bool + */ + private $debugPng = false; + + /** + * @var bool + */ + private $debugKeepTemp = false; + + /** + * @var bool + */ + private $debugCss = false; + + /** + * @var bool + */ + private $debugLayout = false; + + /** + * @var bool + */ + private $debugLayoutLines = true; + + /** + * @var bool + */ + private $debugLayoutBlocks = true; + + /** + * @var bool + */ + private $debugLayoutInline = true; + + /** + * @var bool + */ + private $debugLayoutPaddingBox = true; + + /** + * The PDF rendering backend to use + * + * Valid settings are 'PDFLib', 'CPDF', 'GD', and 'auto'. 'auto' will + * look for PDFLib and use it if found, or if not it will fall back on + * CPDF. 'GD' renders PDFs to graphic files. {@link Dompdf\CanvasFactory} + * ultimately determines which rendering class to instantiate + * based on this setting. + * + * @var string + */ + private $pdfBackend = "CPDF"; + + /** + * PDFlib license key + * + * If you are using a licensed, commercial version of PDFlib, specify + * your license key here. If you are using PDFlib-Lite or are evaluating + * the commercial version of PDFlib, comment out this setting. + * + * @link http://www.pdflib.com + * + * If pdflib present in web server and auto or selected explicitly above, + * a real license code must exist! + * + * @var string + */ + private $pdflibLicense = ""; + + /** + * HTTP context created with stream_context_create() + * Will be used for file_get_contents + * + * @link https://www.php.net/manual/context.php + * + * @var resource + */ + private $httpContext; + + /** + * @param array $attributes + */ + public function __construct(?array $attributes = null) + { + $rootDir = realpath(__DIR__ . "/../"); + $this->setChroot(array($rootDir)); + $this->setRootDir($rootDir); + $this->setTempDir(sys_get_temp_dir()); + $this->setFontDir($rootDir . "/lib/fonts"); + $this->setFontCache($this->getFontDir()); + + $ver = ""; + $versionFile = realpath(__DIR__ . '/../VERSION'); + if (($version = file_get_contents($versionFile)) !== false) { + $version = trim($version); + if ($version !== '$Format:<%h>$') { + $ver = "/$version"; + } + } + $this->setHttpContext([ + "http" => [ + "follow_location" => false, + "user_agent" => "Dompdf$ver https://github.com/dompdf/dompdf" + ] + ]); + + $this->setAllowedProtocols(["data://", "file://", "http://", "https://"]); + + $this->setArtifactPathValidation([$this, "validateArtifactPath"]); + + if (null !== $attributes) { + $this->set($attributes); + } + } + + /** + * @param array|string $attributes + * @param null|mixed $value + * @return $this + */ + public function set($attributes, $value = null) + { + if (!is_array($attributes)) { + $attributes = [$attributes => $value]; + } + + foreach ($attributes as $key => $value) { + $methodForMatch = lcfirst(str_replace(' ', '', ucwords(str_replace('_', ' ', $key)))); + $methodForCall = "set" . ucfirst($methodForMatch); + + if ($methodForMatch === 'enablePhp') { + $methodForCall = "setIsPhpEnabled"; + } elseif ($methodForMatch === 'enableRemote') { + $methodForCall = "setIsRemoteEnabled"; + } elseif ($methodForMatch === 'enablePdfA') { + $methodForCall = "setIsPdfAEnabled"; + } elseif ($methodForMatch === 'enableJavascript') { + $methodForCall = "setIsJavascriptEnabled"; + } elseif ($methodForMatch === 'enableHtml5Parser') { + $methodForCall = "setIsHtml5ParserEnabled"; + } elseif ($methodForMatch === 'enableFontSubsetting') { + $methodForCall = "setIsFontSubsettingEnabled"; + } + + if (method_exists($this, $methodForCall)) { + $this->{$methodForCall}($value); + } + } + + return $this; + } + + /** + * @param string $key + * @return mixed + */ + public function get($key) + { + $methodForMatch = lcfirst(str_replace(' ', '', ucwords(str_replace('_', ' ', $key)))); + $methodForCall = "get" . ucfirst($methodForMatch); + + if ($methodForMatch === 'enablePhp') { + $methodForCall = "getIsPhpEnabled"; + } elseif ($methodForMatch === 'enableRemote') { + $methodForCall = "getIsRemoteEnabled"; + } elseif ($methodForMatch === 'enablePdfA') { + $methodForCall = "getIsPdfAEnabled"; + } elseif ($methodForMatch === 'enableJavascript') { + $methodForCall = "getIsJavascriptEnabled"; + } elseif ($methodForMatch === 'enableHtml5Parser') { + $methodForCall = "getIsHtml5ParserEnabled"; + } elseif ($methodForMatch === 'enableFontSubsetting') { + $methodForCall = "getIsFontSubsettingEnabled"; + } + + if (method_exists($this, $methodForCall)) { + return $this->{$methodForCall}(); + } + + return null; + } + + /** + * @param string $pdfBackend + * @return $this + */ + public function setPdfBackend($pdfBackend) + { + $this->pdfBackend = $pdfBackend; + return $this; + } + + /** + * @return string + */ + public function getPdfBackend() + { + return $this->pdfBackend; + } + + /** + * @param string $pdflibLicense + * @return $this + */ + public function setPdflibLicense($pdflibLicense) + { + $this->pdflibLicense = $pdflibLicense; + return $this; + } + + /** + * @return string + */ + public function getPdflibLicense() + { + return $this->pdflibLicense; + } + + /** + * @param array|string $chroot + * @return $this + */ + public function setChroot($chroot, $delimiter = ',') + { + if (is_string($chroot)) { + $this->chroot = explode($delimiter, $chroot); + } elseif (is_array($chroot)) { + $this->chroot = $chroot; + } + return $this; + } + + /** + * @return array + */ + public function getAllowedProtocols() + { + return $this->allowedProtocols; + } + + /** + * @param array $allowedProtocols The protocols to allow, as an array + * formatted as ["protocol://" => ["rules" => [callable]], ...] + * or ["protocol://", ...] + * + * @return $this + */ + public function setAllowedProtocols(array $allowedProtocols) + { + $protocols = []; + foreach ($allowedProtocols as $protocol => $config) { + if (is_string($protocol)) { + $protocols[$protocol] = []; + if (is_array($config)) { + $protocols[$protocol] = $config; + } + } elseif (is_string($config)) { + $protocols[$config] = []; + } + } + $this->allowedProtocols = []; + foreach ($protocols as $protocol => $config) { + $this->addAllowedProtocol($protocol, ...($config["rules"] ?? [])); + } + return $this; + } + + /** + * Adds a new protocol to the allowed protocols collection + * + * @param string $protocol The scheme to add (e.g. "http://") + * @param callable $rule A callable that validates the protocol + * @return $this + */ + public function addAllowedProtocol(string $protocol, callable ...$rules) + { + $protocol = strtolower($protocol); + if (empty($rules)) { + $rules = []; + switch ($protocol) { + case "data://": + break; + case "file://": + $rules[] = [$this, "validateLocalUri"]; + break; + case "http://": + case "https://": + $rules[] = [$this, "validateRemoteUri"]; + break; + case "phar://": + $rules[] = [$this, "validatePharUri"]; + break; + } + } + $this->allowedProtocols[$protocol] = ["rules" => $rules]; + return $this; + } + + /** + * @return array + */ + public function getArtifactPathValidation() + { + return $this->artifactPathValidation; + } + + /** + * @param callable $validator + * @return $this + */ + public function setArtifactPathValidation($validator) + { + $this->artifactPathValidation = $validator; + return $this; + } + + /** + * @return array + */ + public function getChroot() + { + $chroot = []; + if (is_array($this->chroot)) { + $chroot = $this->chroot; + } + return $chroot; + } + + /** + * @param boolean $debugCss + * @return $this + */ + public function setDebugCss($debugCss) + { + $this->debugCss = $debugCss; + return $this; + } + + /** + * @return boolean + */ + public function getDebugCss() + { + return $this->debugCss; + } + + /** + * @param boolean $debugKeepTemp + * @return $this + */ + public function setDebugKeepTemp($debugKeepTemp) + { + $this->debugKeepTemp = $debugKeepTemp; + return $this; + } + + /** + * @return boolean + */ + public function getDebugKeepTemp() + { + return $this->debugKeepTemp; + } + + /** + * @param boolean $debugLayout + * @return $this + */ + public function setDebugLayout($debugLayout) + { + $this->debugLayout = $debugLayout; + return $this; + } + + /** + * @return boolean + */ + public function getDebugLayout() + { + return $this->debugLayout; + } + + /** + * @param boolean $debugLayoutBlocks + * @return $this + */ + public function setDebugLayoutBlocks($debugLayoutBlocks) + { + $this->debugLayoutBlocks = $debugLayoutBlocks; + return $this; + } + + /** + * @return boolean + */ + public function getDebugLayoutBlocks() + { + return $this->debugLayoutBlocks; + } + + /** + * @param boolean $debugLayoutInline + * @return $this + */ + public function setDebugLayoutInline($debugLayoutInline) + { + $this->debugLayoutInline = $debugLayoutInline; + return $this; + } + + /** + * @return boolean + */ + public function getDebugLayoutInline() + { + return $this->debugLayoutInline; + } + + /** + * @param boolean $debugLayoutLines + * @return $this + */ + public function setDebugLayoutLines($debugLayoutLines) + { + $this->debugLayoutLines = $debugLayoutLines; + return $this; + } + + /** + * @return boolean + */ + public function getDebugLayoutLines() + { + return $this->debugLayoutLines; + } + + /** + * @param boolean $debugLayoutPaddingBox + * @return $this + */ + public function setDebugLayoutPaddingBox($debugLayoutPaddingBox) + { + $this->debugLayoutPaddingBox = $debugLayoutPaddingBox; + return $this; + } + + /** + * @return boolean + */ + public function getDebugLayoutPaddingBox() + { + return $this->debugLayoutPaddingBox; + } + + /** + * @param boolean $debugPng + * @return $this + */ + public function setDebugPng($debugPng) + { + $this->debugPng = $debugPng; + return $this; + } + + /** + * @return boolean + */ + public function getDebugPng() + { + return $this->debugPng; + } + + /** + * @param string $defaultFont + * @return $this + */ + public function setDefaultFont($defaultFont) + { + if (!($defaultFont === null || trim($defaultFont) === "")) { + $this->defaultFont = $defaultFont; + } else { + $this->defaultFont = "serif"; + } + return $this; + } + + /** + * @return string + */ + public function getDefaultFont() + { + return $this->defaultFont; + } + + /** + * @param string $defaultMediaType + * @return $this + */ + public function setDefaultMediaType($defaultMediaType) + { + $this->defaultMediaType = $defaultMediaType; + return $this; + } + + /** + * @return string + */ + public function getDefaultMediaType() + { + return $this->defaultMediaType; + } + + /** + * @param string|float[] $defaultPaperSize + * @return $this + */ + public function setDefaultPaperSize($defaultPaperSize): self + { + $this->defaultPaperSize = $defaultPaperSize; + return $this; + } + + /** + * @param string $defaultPaperOrientation + * @return $this + */ + public function setDefaultPaperOrientation(string $defaultPaperOrientation): self + { + $this->defaultPaperOrientation = $defaultPaperOrientation; + return $this; + } + + /** + * @return string|float[] + */ + public function getDefaultPaperSize() + { + return $this->defaultPaperSize; + } + + /** + * @return string + */ + public function getDefaultPaperOrientation(): string + { + return $this->defaultPaperOrientation; + } + + /** + * @param int $dpi + * @return $this + */ + public function setDpi($dpi) + { + $this->dpi = $dpi; + return $this; + } + + /** + * @return int + */ + public function getDpi() + { + return $this->dpi; + } + + /** + * @param string $fontCache + * @return $this + */ + public function setFontCache($fontCache) + { + if (!is_callable($this->artifactPathValidation) || ($this->artifactPathValidation)($fontCache, "fontCache") === true) { + $this->fontCache = $fontCache; + } + return $this; + } + + /** + * @return string + */ + public function getFontCache() + { + return $this->fontCache; + } + + /** + * @param string $fontDir + * @return $this + */ + public function setFontDir($fontDir) + { + if (!is_callable($this->artifactPathValidation) || ($this->artifactPathValidation)($fontDir, "fontDir") === true) { + $this->fontDir = $fontDir; + } + return $this; + } + + /** + * @return string + */ + public function getFontDir() + { + return $this->fontDir; + } + + /** + * @param float $fontHeightRatio + * @return $this + */ + public function setFontHeightRatio($fontHeightRatio) + { + $this->fontHeightRatio = $fontHeightRatio; + return $this; + } + + /** + * @return float + */ + public function getFontHeightRatio() + { + return $this->fontHeightRatio; + } + + /** + * @param boolean $isFontSubsettingEnabled + * @return $this + */ + public function setIsFontSubsettingEnabled($isFontSubsettingEnabled) + { + $this->isFontSubsettingEnabled = $isFontSubsettingEnabled; + return $this; + } + + /** + * @return boolean + */ + public function getIsFontSubsettingEnabled() + { + return $this->isFontSubsettingEnabled; + } + + /** + * @return boolean + */ + public function isFontSubsettingEnabled() + { + return $this->getIsFontSubsettingEnabled(); + } + + /** + * @deprecated + * @param boolean $isHtml5ParserEnabled + * @return $this + */ + public function setIsHtml5ParserEnabled($isHtml5ParserEnabled) + { + $this->isHtml5ParserEnabled = $isHtml5ParserEnabled; + return $this; + } + + /** + * @deprecated + * @return boolean + */ + public function getIsHtml5ParserEnabled() + { + return $this->isHtml5ParserEnabled; + } + + /** + * @deprecated + * @return boolean + */ + public function isHtml5ParserEnabled() + { + return $this->getIsHtml5ParserEnabled(); + } + + /** + * @param boolean $isJavascriptEnabled + * @return $this + */ + public function setIsJavascriptEnabled($isJavascriptEnabled) + { + $this->isJavascriptEnabled = $isJavascriptEnabled; + return $this; + } + + /** + * @return boolean + */ + public function getIsJavascriptEnabled() + { + return $this->isJavascriptEnabled; + } + + /** + * @return boolean + */ + public function isJavascriptEnabled() + { + return $this->getIsJavascriptEnabled(); + } + + /** + * @param boolean $isPhpEnabled + * @return $this + */ + public function setIsPhpEnabled($isPhpEnabled) + { + $this->isPhpEnabled = $isPhpEnabled; + return $this; + } + + /** + * @return boolean + */ + public function getIsPhpEnabled() + { + return $this->isPhpEnabled; + } + + /** + * @return boolean + */ + public function isPhpEnabled() + { + return $this->getIsPhpEnabled(); + } + + /** + * @param boolean $isRemoteEnabled + * @return $this + */ + public function setIsRemoteEnabled($isRemoteEnabled) + { + $this->isRemoteEnabled = $isRemoteEnabled; + return $this; + } + + /** + * @return boolean + */ + public function getIsRemoteEnabled() + { + return $this->isRemoteEnabled; + } + + /** + * @return boolean + */ + public function isRemoteEnabled() + { + return $this->getIsRemoteEnabled(); + } + + /** + * @param array|null $allowedRemoteHosts + * @return $this + */ + public function setAllowedRemoteHosts($allowedRemoteHosts) + { + if (is_array($allowedRemoteHosts)) { + // Set hosts to lowercase + foreach ($allowedRemoteHosts as &$host) { + $host = mb_strtolower($host, "UTF-8"); + } + + unset($host); + } + + $this->allowedRemoteHosts = $allowedRemoteHosts; + return $this; + } + + /** + * @return array|null + */ + public function getAllowedRemoteHosts() + { + return $this->allowedRemoteHosts; + } + + /** + * @param boolean $isRemoteEnabled + * @return $this + */ + public function setIsPdfAEnabled($isPdfAEnabled) + { + $this->isPdfAEnabled = $isPdfAEnabled; + return $this; + } + + /** + * @return boolean + */ + public function getIsPdfAEnabled() + { + return $this->isPdfAEnabled; + } + + /** + * @return boolean + */ + public function isPdfAEnabled() + { + return $this->getIsPdfAEnabled(); + } + + /** + * @param string $logOutputFile + * @return $this + */ + public function setLogOutputFile($logOutputFile) + { + if (!is_callable($this->artifactPathValidation) || ($this->artifactPathValidation)($logOutputFile, "logOutputFile") === true) { + $this->logOutputFile = $logOutputFile; + } + return $this; + } + + /** + * @return string + */ + public function getLogOutputFile() + { + return $this->logOutputFile; + } + + /** + * @param string $tempDir + * @return $this + */ + public function setTempDir($tempDir) + { + if (!is_callable($this->artifactPathValidation) || ($this->artifactPathValidation)($tempDir, "tempDir") === true) { + $this->tempDir = $tempDir; + } + return $this; + } + + /** + * @return string + */ + public function getTempDir() + { + return $this->tempDir; + } + + /** + * @param string $rootDir + * @return $this + */ + public function setRootDir($rootDir) + { + if (!is_callable($this->artifactPathValidation) || ($this->artifactPathValidation)($rootDir, "rootDir") === true) { + $this->rootDir = $rootDir; + } + return $this; + } + + /** + * @return string + */ + public function getRootDir() + { + return $this->rootDir; + } + + /** + * Sets the HTTP context + * + * @param resource|array $httpContext + * @return $this + */ + public function setHttpContext($httpContext) + { + $this->httpContext = is_array($httpContext) ? stream_context_create($httpContext) : $httpContext; + return $this; + } + + /** + * Returns the HTTP context + * + * @return resource + */ + public function getHttpContext() + { + return $this->httpContext; + } + + + public function validateArtifactPath(?string $path, string $option) + { + if ($path === null) { + return true; + } + $parsed_uri = parse_url($path); + if ($parsed_uri === false || (array_key_exists("scheme", $parsed_uri) && strtolower($parsed_uri["scheme"]) === "phar")) { + return false; + } + return true; + } + + public function validateLocalUri(string $uri) + { + if ($uri === null || strlen($uri) === 0) { + return [false, "The URI must not be empty."]; + } + + $realfile = realpath(str_replace("file://", "", $uri)); + + $dirs = $this->chroot; + $dirs[] = $this->rootDir; + $chrootValid = false; + foreach ($dirs as $chrootPath) { + $chrootPath = realpath($chrootPath); + if ($chrootPath !== false && strpos($realfile, $chrootPath) === 0) { + $chrootValid = true; + break; + } + } + if ($chrootValid !== true) { + return [false, "Permission denied. The file could not be found under the paths specified by Options::chroot."]; + } + + if (!$realfile) { + return [false, "File not found."]; + } + + return [true, null]; + } + + public function validatePharUri(string $uri) + { + if ($uri === null || strlen($uri) === 0) { + return [false, "The URI must not be empty."]; + } + + $file = substr(substr($uri, 0, strpos($uri, ".phar") + 5), 7); + return $this->validateLocalUri($file); + } + + public function validateRemoteUri(string $uri) + { + if ($uri === null || strlen($uri) === 0) { + return [false, "The URI must not be empty."]; + } + + if (!$this->isRemoteEnabled) { + return [false, "Remote file requested, but remote file download is disabled."]; + } + + if (is_array($this->allowedRemoteHosts) && count($this->allowedRemoteHosts) > 0) { + $host = parse_url($uri, PHP_URL_HOST); + $host = mb_strtolower($host, "UTF-8"); + + if (!in_array($host, $this->allowedRemoteHosts, true)) { + return [false, "Remote host is not in allowed list: " . $host]; + } + } + + return [true, null]; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/PhpEvaluator.php b/dompdf/vendor/dompdf/dompdf/src/PhpEvaluator.php new file mode 100644 index 0000000..4a46555 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/PhpEvaluator.php @@ -0,0 +1,62 @@ +_canvas = $canvas; + } + + /** + * @param $code + * @param array $vars + */ + public function evaluate($code, $vars = []) + { + if (!$this->_canvas->get_dompdf()->getOptions()->getIsPhpEnabled()) { + return; + } + + // Set up some variables for the inline code + $pdf = $this->_canvas; + $fontMetrics = $pdf->get_dompdf()->getFontMetrics(); + $PAGE_NUM = $pdf->get_page_number(); + $PAGE_COUNT = $pdf->get_page_count(); + + // Override those variables if passed in + foreach ($vars as $k => $v) { + $$k = $v; + } + + eval($code); + } + + /** + * @param Frame $frame + */ + public function render(Frame $frame) + { + $this->evaluate($frame->get_node()->nodeValue); + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Positioner/Absolute.php b/dompdf/vendor/dompdf/dompdf/src/Positioner/Absolute.php new file mode 100644 index 0000000..2df9a74 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Positioner/Absolute.php @@ -0,0 +1,128 @@ +get_reflower() instanceof Block) { + $style = $frame->get_style(); + [$cbx, $cby, $cbw, $cbh] = $frame->get_containing_block(); + + // If the `top` value is `auto`, the frame will be repositioned + // after its height has been resolved + $left = (float) $style->length_in_pt($style->left, $cbw); + $top = (float) $style->length_in_pt($style->top, $cbh); + + $frame->set_position($cbx + $left, $cby + $top); + } else { + // Legacy positioning logic for image and table frames + // TODO: Resolve dimensions, margins, and offsets similar to the + // block case in the reflowers and use the simplified logic above + $style = $frame->get_style(); + $block_parent = $frame->find_block_parent(); + $current_line = $block_parent->get_current_line_box(); + + list($x, $y, $w, $h) = $frame->get_containing_block(); + $inflow_x = $block_parent->get_content_box()["x"] + $current_line->left + $current_line->w; + $inflow_y = $current_line->y; + + $top = $style->length_in_pt($style->top, $h); + $right = $style->length_in_pt($style->right, $w); + $bottom = $style->length_in_pt($style->bottom, $h); + $left = $style->length_in_pt($style->left, $w); + + list($width, $height) = [$frame->get_margin_width(), $frame->get_margin_height()]; + + $orig_width = $style->get_specified("width"); + $orig_height = $style->get_specified("height"); + + /**************************** + * + * Width auto: + * ____________| left=auto | left=fixed | + * right=auto | A | B | + * right=fixed | C | D | + * + * Width fixed: + * ____________| left=auto | left=fixed | + * right=auto | E | F | + * right=fixed | G | H | + *****************************/ + + if ($left === "auto") { + if ($right === "auto") { + // A or E - Keep the frame at the same position + $x = $inflow_x; + } else { + if ($orig_width === "auto") { + // C + $x += $w - $width - $right; + } else { + // G + $x += $w - $width - $right; + } + } + } else { + if ($right === "auto") { + // B or F + $x += (float)$left; + } else { + if ($orig_width === "auto") { + // D - TODO change width + $x += (float)$left; + } else { + // H - Everything is fixed: left + width win + $x += (float)$left; + } + } + } + + // The same vertically + if ($top === "auto") { + if ($bottom === "auto") { + // A or E - Keep the frame at the same position + $y = $inflow_y; + } else { + if ($orig_height === "auto") { + // C + $y += (float)$h - $height - (float)$bottom; + } else { + // G + $y += (float)$h - $height - (float)$bottom; + } + } + } else { + if ($bottom === "auto") { + // B or F + $y += (float)$top; + } else { + if ($orig_height === "auto") { + // D - TODO change height + $y += (float)$top; + } else { + // H - Everything is fixed: top + height win + $y += (float)$top; + } + } + } + + $frame->set_position($x, $y); + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Positioner/AbstractPositioner.php b/dompdf/vendor/dompdf/dompdf/src/Positioner/AbstractPositioner.php new file mode 100644 index 0000000..a75c09f --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Positioner/AbstractPositioner.php @@ -0,0 +1,48 @@ +get_position(); + + if (!$ignore_self) { + $frame->set_position($x + $offset_x, $y + $offset_y); + } + + foreach ($frame->get_children() as $child) { + $child->move($offset_x, $offset_y); + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Positioner/Block.php b/dompdf/vendor/dompdf/dompdf/src/Positioner/Block.php new file mode 100644 index 0000000..e6f65ea --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Positioner/Block.php @@ -0,0 +1,40 @@ +get_style(); + $cb = $frame->get_containing_block(); + $p = $frame->find_block_parent(); + + if ($p) { + $float = $style->float; + + if (!$float || $float === "none") { + $p->add_line(true); + } + $y = $p->get_current_line_box()->y; + } else { + $y = $cb["y"]; + } + + $x = $cb["x"]; + + $frame->set_position($x, $y); + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Positioner/Fixed.php b/dompdf/vendor/dompdf/dompdf/src/Positioner/Fixed.php new file mode 100644 index 0000000..13eb9e9 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Positioner/Fixed.php @@ -0,0 +1,92 @@ +get_reflower() instanceof Block) { + parent::position($frame); + } else { + // Legacy positioning logic for image and table frames + // TODO: Resolve dimensions, margins, and offsets similar to the + // block case in the reflowers and use the simplified logic above + $style = $frame->get_style(); + $root = $frame->get_root(); + $initialcb = $root->get_containing_block(); + $initialcb_style = $root->get_style(); + + $p = $frame->find_block_parent(); + if ($p) { + $p->add_line(); + } + // Compute the margins of the @page style + $margin_top = (float)$initialcb_style->length_in_pt($initialcb_style->margin_top, $initialcb["h"]); + $margin_right = (float)$initialcb_style->length_in_pt($initialcb_style->margin_right, $initialcb["w"]); + $margin_bottom = (float)$initialcb_style->length_in_pt($initialcb_style->margin_bottom, $initialcb["h"]); + $margin_left = (float)$initialcb_style->length_in_pt($initialcb_style->margin_left, $initialcb["w"]); + + // The needed computed style of the element + $height = (float)$style->length_in_pt($style->get_specified("height"), $initialcb["h"]); + $width = (float)$style->length_in_pt($style->get_specified("width"), $initialcb["w"]); + + $top = $style->length_in_pt($style->get_specified("top"), $initialcb["h"]); + $right = $style->length_in_pt($style->get_specified("right"), $initialcb["w"]); + $bottom = $style->length_in_pt($style->get_specified("bottom"), $initialcb["h"]); + $left = $style->length_in_pt($style->get_specified("left"), $initialcb["w"]); + + $y = $margin_top; + if (isset($top)) { + $y = (float)$top + $margin_top; + if ($top === "auto") { + $y = $margin_top; + if (isset($bottom) && $bottom !== "auto") { + $y = $initialcb["h"] - $bottom - $margin_bottom; + if ($frame->is_auto_height()) { + $y -= $height; + } else { + $y -= $frame->get_margin_height(); + } + } + } + } + + $x = $margin_left; + if (isset($left)) { + $x = (float)$left + $margin_left; + if ($left === "auto") { + $x = $margin_left; + if (isset($right) && $right !== "auto") { + $x = $initialcb["w"] - $right - $margin_right; + if ($frame->is_auto_width()) { + $x -= $width; + } else { + $x -= $frame->get_margin_width(); + } + } + } + } + + $frame->set_position($x, $y); + + foreach ($frame->get_children() as $child) { + $child->set_position($x, $y); + } + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Positioner/Inline.php b/dompdf/vendor/dompdf/dompdf/src/Positioner/Inline.php new file mode 100644 index 0000000..f1036e9 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Positioner/Inline.php @@ -0,0 +1,56 @@ +find_block_parent(); + $cb = $frame->get_containing_block(); + + if (!$block) { + // FIXME: An inline frame without block parent should not be + // possible, but this can occur currently when the body is styled + // with `display: inline !important;` or `display: inline-block !important;` + $frame->set_position($cb["x"], $cb["y"]); + return; + } + + $line = $block->get_current_line_box(); + + if (!$frame->is_text_node() && !($frame instanceof InlineFrameDecorator)) { + // Atomic inline boxes and replaced inline elements + // (inline-block, inline-table, img etc.) + $width = $frame->get_margin_width(); + $available_width = $cb["w"] - $line->left - $line->w - $line->right; + + if (Helpers::lengthGreater($width, $available_width)) { + $block->add_line(); + $line = $block->get_current_line_box(); + } + } + + $frame->set_position($cb["x"] + $line->w, $line->y); + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Positioner/ListBullet.php b/dompdf/vendor/dompdf/dompdf/src/Positioner/ListBullet.php new file mode 100644 index 0000000..081d594 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Positioner/ListBullet.php @@ -0,0 +1,42 @@ +get_parent(); + $style = $parent->get_style(); + $cbw = $parent->get_containing_block("w"); + $margin_left = (float) $style->length_in_pt($style->margin_left, $cbw); + $border_edge = $parent->get_position("x") + $margin_left; + + // This includes the marker indentation + $x = $border_edge - $frame->get_margin_width(); + + // The marker is later vertically aligned with the corresponding line + // box and its vertical position is fine-tuned in the renderer + $p = $frame->find_block_parent(); + $y = $p->get_current_line_box()->y; + + $frame->set_position($x, $y); + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Positioner/NullPositioner.php b/dompdf/vendor/dompdf/dompdf/src/Positioner/NullPositioner.php new file mode 100644 index 0000000..6ad425c --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Positioner/NullPositioner.php @@ -0,0 +1,26 @@ +get_cellmap(); + $frame->set_position($cellmap->get_frame_position($frame)); + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Positioner/TableRow.php b/dompdf/vendor/dompdf/dompdf/src/Positioner/TableRow.php new file mode 100644 index 0000000..79c0fcf --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Positioner/TableRow.php @@ -0,0 +1,34 @@ +get_containing_block(); + $p = $frame->get_prev_sibling(); + + if ($p) { + $y = $p->get_position("y") + $p->get_margin_height(); + } else { + $y = $cb["y"]; + } + $frame->set_position($cb["x"], $y); + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer.php b/dompdf/vendor/dompdf/dompdf/src/Renderer.php new file mode 100644 index 0000000..15391fb --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Renderer.php @@ -0,0 +1,307 @@ +_canvas->new_page(); + } + + /** + * Render frames recursively + * + * @param Frame $frame the frame to render + */ + public function render(Frame $frame) + { + global $_dompdf_debug; + + $this->_check_callbacks("begin_frame", $frame); + + if ($_dompdf_debug) { + echo $frame; + flush(); + } + + $style = $frame->get_style(); + + if (in_array($style->visibility, ["hidden", "collapse"], true)) { + return; + } + + $display = $style->display; + $transformList = $style->transform; + $hasTransform = $transformList !== []; + + // Starts the CSS transformation + if ($hasTransform) { + $this->_canvas->save(); + + [$x, $y] = $frame->get_padding_box(); + [$originX, $originY] = $style->transform_origin; + $w = (float) $style->length_in_pt($style->width); + $h = (float) $style->length_in_pt($style->height); + + foreach ($transformList as $transform) { + [$function, $values] = $transform; + + if ($function === "matrix") { + $function = "transform"; + } elseif ($function === "translate") { + $values[0] = $style->length_in_pt($values[0], $w); + $values[1] = $style->length_in_pt($values[1], $h); + } + + $values[] = $x + $style->length_in_pt($originX, $w); + $values[] = $y + $style->length_in_pt($originY, $h); + + call_user_func_array([$this->_canvas, $function], $values); + } + } + + switch ($display) { + + case "block": + case "list-item": + case "inline-block": + case "table": + case "inline-table": + $this->_render_frame("block", $frame); + break; + + case "inline": + if ($frame->is_text_node()) { + $this->_render_frame("text", $frame); + } else { + $this->_render_frame("inline", $frame); + } + break; + + case "table-cell": + $this->_render_frame("table-cell", $frame); + break; + + case "table-row": + $this->_render_frame("table-row", $frame); + break; + + case "table-row-group": + case "table-header-group": + case "table-footer-group": + $this->_render_frame("table-row-group", $frame); + break; + + case "-dompdf-list-bullet": + $this->_render_frame("list-bullet", $frame); + break; + + case "-dompdf-image": + $this->_render_frame("image", $frame); + break; + + case "none": + $node = $frame->get_node(); + + if ($node->nodeName === "script") { + if ($node->getAttribute("type") === "text/php" || + $node->getAttribute("language") === "php" + ) { + // Evaluate embedded php scripts + $this->_render_frame("php", $frame); + } elseif ($node->getAttribute("type") === "text/javascript" || + $node->getAttribute("language") === "javascript" + ) { + // Insert JavaScript + $this->_render_frame("javascript", $frame); + } + } + + // Don't render children, so skip to next iter + return; + + default: + break; + + } + + // Starts the overflow: hidden box + if ($style->overflow === "hidden") { + $padding_box = $frame->get_padding_box(); + [$x, $y, $w, $h] = $padding_box; + $style = $frame->get_style(); + + if ($style->has_border_radius()) { + $border_box = $frame->get_border_box(); + [$tl, $tr, $br, $bl] = $style->resolve_border_radius($border_box, $padding_box); + $this->_canvas->clipping_roundrectangle($x, $y, $w, $h, $tl, $tr, $br, $bl); + } else { + $this->_canvas->clipping_rectangle($x, $y, $w, $h); + } + } + + $stack = []; + + foreach ($frame->get_children() as $child) { + // < 0 : negative z-index + // = 0 : no z-index, no stacking context + // = 1 : stacking context without z-index + // > 1 : z-index + $child_style = $child->get_style(); + $child_z_index = $child_style->z_index; + $z_index = 0; + + if ($child_z_index !== "auto") { + $z_index = $child_z_index + 1; + } elseif ($child_style->float !== "none" || $child->is_positioned()) { + $z_index = 1; + } + + $stack[$z_index][] = $child; + } + + ksort($stack); + + foreach ($stack as $by_index) { + foreach ($by_index as $child) { + $this->render($child); + } + } + + // Ends the overflow: hidden box + if ($style->overflow === "hidden") { + $this->_canvas->clipping_end(); + } + + if ($hasTransform) { + $this->_canvas->restore(); + } + + // Check for end frame callback + $this->_check_callbacks("end_frame", $frame); + } + + /** + * Check for callbacks that need to be performed when a given event + * gets triggered on a frame + * + * @param string $event The type of event + * @param Frame $frame The frame that event is triggered on + */ + protected function _check_callbacks(string $event, Frame $frame): void + { + if (!isset($this->_callbacks)) { + $this->_callbacks = $this->_dompdf->getCallbacks(); + } + + if (isset($this->_callbacks[$event])) { + $fs = $this->_callbacks[$event]; + $canvas = $this->_canvas; + $fontMetrics = $this->_dompdf->getFontMetrics(); + + foreach ($fs as $f) { + $f($frame, $canvas, $fontMetrics); + } + } + } + + /** + * Render a single frame + * + * Creates Renderer objects on demand + * + * @param string $type type of renderer to use + * @param Frame $frame the frame to render + */ + protected function _render_frame($type, $frame) + { + + if (!isset($this->_renderers[$type])) { + + switch ($type) { + case "block": + $this->_renderers[$type] = new Block($this->_dompdf); + break; + + case "inline": + $this->_renderers[$type] = new Inline($this->_dompdf); + break; + + case "text": + $this->_renderers[$type] = new Text($this->_dompdf); + break; + + case "image": + $this->_renderers[$type] = new Image($this->_dompdf); + break; + + case "table-cell": + $this->_renderers[$type] = new TableCell($this->_dompdf); + break; + + case "table-row": + $this->_renderers[$type] = new TableRow($this->_dompdf); + break; + + case "table-row-group": + $this->_renderers[$type] = new TableRowGroup($this->_dompdf); + break; + + case "list-bullet": + $this->_renderers[$type] = new ListBullet($this->_dompdf); + break; + + case "php": + $this->_renderers[$type] = new PhpEvaluator($this->_canvas); + break; + + case "javascript": + $this->_renderers[$type] = new JavascriptEmbedder($this->_dompdf); + break; + + } + } + + $this->_renderers[$type]->render($frame); + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer/AbstractRenderer.php b/dompdf/vendor/dompdf/dompdf/src/Renderer/AbstractRenderer.php new file mode 100644 index 0000000..293bed2 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Renderer/AbstractRenderer.php @@ -0,0 +1,1298 @@ +_dompdf = $dompdf; + $this->_canvas = $dompdf->getCanvas(); + } + + /** + * Render a frame. + * + * Specialized in child classes + * + * @param Frame $frame The frame to render + */ + abstract function render(Frame $frame); + + /** + * @param Frame $frame + * @param float[] $border_box + */ + protected function _render_background(Frame $frame, array $border_box): void + { + $style = $frame->get_style(); + $color = $style->background_color; + $image = $style->background_image; + [$x, $y, $w, $h] = $border_box; + + if ($color === "transparent" && $image === "none") { + return; + } + + if ($style->has_border_radius()) { + [$tl, $tr, $br, $bl] = $style->resolve_border_radius($border_box); + $this->_canvas->clipping_roundrectangle($x, $y, $w, $h, $tl, $tr, $br, $bl); + } + + if ($color !== "transparent") { + $this->_canvas->filled_rectangle($x, $y, $w, $h, $color); + } + + if ($image !== "none") { + $this->_background_image($image, $x, $y, $w, $h, $style); + } + + if ($style->has_border_radius()) { + $this->_canvas->clipping_end(); + } + } + + /** + * @param Frame $frame + * @param float[] $border_box + * @param string $corner_style + */ + protected function _render_border(Frame $frame, array $border_box, string $corner_style = "bevel"): void + { + $style = $frame->get_style(); + $bp = $style->get_border_properties(); + [$x, $y, $w, $h] = $border_box; + [$tl, $tr, $br, $bl] = $style->resolve_border_radius($border_box); + + // Short-cut: If all the borders are "solid" with the same color and + // style, and no radius, we'd better draw a rectangle + if ($bp["top"]["style"] === "solid" && + $bp["top"] === $bp["right"] && + $bp["right"] === $bp["bottom"] && + $bp["bottom"] === $bp["left"] && + !$style->has_border_radius() + ) { + $props = $bp["top"]; + if ($props["color"] === "transparent" || $props["width"] <= 0) { + return; + } + + $width = (float)$style->length_in_pt($props["width"]); + $this->_canvas->rectangle($x + $width / 2, $y + $width / 2, $w - $width, $h - $width, $props["color"], $width); + return; + } + + // Do it the long way + $widths = [ + (float)$style->length_in_pt($bp["top"]["width"]), + (float)$style->length_in_pt($bp["right"]["width"]), + (float)$style->length_in_pt($bp["bottom"]["width"]), + (float)$style->length_in_pt($bp["left"]["width"]) + ]; + + foreach ($bp as $side => $props) { + if ($props["style"] === "none" || + $props["style"] === "hidden" || + $props["color"] === "transparent" || + $props["width"] <= 0 + ) { + continue; + } + + [$x, $y, $w, $h] = $border_box; + $method = "_border_" . $props["style"]; + + switch ($side) { + case "top": + $length = $w; + $r1 = $tl; + $r2 = $tr; + break; + + case "bottom": + $length = $w; + $y += $h; + $r1 = $bl; + $r2 = $br; + break; + + case "left": + $length = $h; + $r1 = $tl; + $r2 = $bl; + break; + + case "right": + $length = $h; + $x += $w; + $r1 = $tr; + $r2 = $br; + break; + + default: + break; + } + + // draw rounded corners + $this->$method($x, $y, $length, $props["color"], $widths, $side, $corner_style, $r1, $r2); + } + } + + /** + * @param Frame $frame + * @param float[] $border_box + * @param string $corner_style + */ + protected function _render_outline(Frame $frame, array $border_box, string $corner_style = "bevel"): void + { + $style = $frame->get_style(); + + $width = $style->outline_width; + $outline_style = $style->outline_style; + $color = $style->outline_color; + + if ($outline_style === "none" || $color === "transparent" || $width <= 0) { + return; + } + + $offset = $style->outline_offset; + + [$x, $y, $w, $h] = $border_box; + $d = $width + $offset; + $outline_box = [$x - $d, $y - $d, $w + $d * 2, $h + $d * 2]; + [$tl, $tr, $br, $bl] = $style->resolve_border_radius($border_box, $outline_box); + + $x -= $offset; + $y -= $offset; + $w += $offset * 2; + $h += $offset * 2; + + // For a simple outline, we can draw a rectangle + if ($outline_style === "solid" && !$style->has_border_radius()) { + $x -= $width / 2; + $y -= $width / 2; + $w += $width; + $h += $width; + + $this->_canvas->rectangle($x, $y, $w, $h, $color, $width); + return; + } + + $x -= $width; + $y -= $width; + $w += $width * 2; + $h += $width * 2; + + $method = "_border_" . $outline_style; + $widths = array_fill(0, 4, $width); + $sides = ["top", "right", "left", "bottom"]; + + foreach ($sides as $side) { + switch ($side) { + case "top": + $length = $w; + $side_x = $x; + $side_y = $y; + $r1 = $tl; + $r2 = $tr; + break; + + case "bottom": + $length = $w; + $side_x = $x; + $side_y = $y + $h; + $r1 = $bl; + $r2 = $br; + break; + + case "left": + $length = $h; + $side_x = $x; + $side_y = $y; + $r1 = $tl; + $r2 = $bl; + break; + + case "right": + $length = $h; + $side_x = $x + $w; + $side_y = $y; + $r1 = $tr; + $r2 = $br; + break; + + default: + break; + } + + $this->$method($side_x, $side_y, $length, $color, $widths, $side, $corner_style, $r1, $r2); + } + } + + /** + * Render a background image over a rectangular area + * + * @param string $url The background image to load + * @param float $x The left edge of the rectangular area + * @param float $y The top edge of the rectangular area + * @param float $width The width of the rectangular area + * @param float $height The height of the rectangular area + * @param Style $style The associated Style object + * + * @throws \Exception + */ + protected function _background_image(string $url, float $x, float $y, float $width, float $height, Style $style): void + { + if (!function_exists("imagecreatetruecolor")) { + throw new \Exception("The PHP GD extension is required, but is not installed."); + } + + $sheet = $style->get_stylesheet(); + + // Skip degenerate cases + if ($width == 0 || $height == 0) { + return; + } + + $box_width = $width; + $box_height = $height; + + //debugpng + if ($this->_dompdf->getOptions()->getDebugPng()) { + print '[_background_image ' . $url . ']'; + } + + list($img, $type, /*$msg*/) = Cache::resolve_url( + $url, + $sheet->get_protocol(), + $sheet->get_host(), + $sheet->get_base_path(), + $this->_dompdf->getOptions() + ); + + // Bail if the image is no good + if (Cache::is_broken($img)) { + return; + } + + //Try to optimize away reading and composing of same background multiple times + //Postponing read with imagecreatefrom ...() + //final composition parameters and name not known yet + //Therefore read dimension directly from file, instead of creating gd object first. + //$img_w = imagesx($src); $img_h = imagesy($src); + + list($img_w, $img_h) = Helpers::dompdf_getimagesize($img, $this->_dompdf->getHttpContext()); + if ($img_w == 0 || $img_h == 0) { + return; + } + + // save for later check if file needs to be resized. + $org_img_w = $img_w; + $org_img_h = $img_h; + + $repeat = $style->background_repeat; + $dpi = $this->_dompdf->getOptions()->getDpi(); + + //Increase background resolution and dependent box size according to image resolution to be placed in + //Then image can be copied in without resize + $bg_width = round((float)($width * $dpi) / 72); + $bg_height = round((float)($height * $dpi) / 72); + + list($img_w, $img_h) = $this->_resize_background_image( + $img_w, + $img_h, + $bg_width, + $bg_height, + $style->background_size, + $dpi + ); + //Need %bg_x, $bg_y as background pos, where img starts, converted to pixel + + list($bg_x, $bg_y) = $style->background_position; + + if (Helpers::is_percent($bg_x)) { + // The point $bg_x % from the left edge of the image is placed + // $bg_x % from the left edge of the background rectangle + $p = ((float)$bg_x) / 100.0; + $x1 = $p * $img_w; + $x2 = $p * $bg_width; + + $bg_x = $x2 - $x1; + } else { + $bg_x = (float)($style->length_in_pt($bg_x) * $dpi) / 72; + } + + $bg_x = round($bg_x + (float)$style->length_in_pt($style->border_left_width) * $dpi / 72); + + if (Helpers::is_percent($bg_y)) { + // The point $bg_y % from the left edge of the image is placed + // $bg_y % from the left edge of the background rectangle + $p = ((float)$bg_y) / 100.0; + $y1 = $p * $img_h; + $y2 = $p * $bg_height; + + $bg_y = $y2 - $y1; + } else { + $bg_y = (float)($style->length_in_pt($bg_y) * $dpi) / 72; + } + + $bg_y = round($bg_y + (float)$style->length_in_pt($style->border_top_width) * $dpi / 72); + + //clip background to the image area on partial repeat. Nothing to do if img off area + //On repeat, normalize start position to the tile at immediate left/top or 0/0 of area + //On no repeat with positive offset: move size/start to have offset==0 + //Handle x/y Dimensions separately + + if ($repeat !== "repeat" && $repeat !== "repeat-x") { + //No repeat x + if ($bg_x < 0) { + $bg_width = $img_w + $bg_x; + } else { + $x += ($bg_x * 72) / $dpi; + $bg_width = $bg_width - $bg_x; + if ($bg_width > $img_w) { + $bg_width = $img_w; + } + $bg_x = 0; + } + + if ($bg_width <= 0) { + return; + } + + $width = (float)($bg_width * 72) / $dpi; + } else { + //repeat x + if ($bg_x < 0) { + $bg_x = -((-$bg_x) % $img_w); + } else { + $bg_x = $bg_x % $img_w; + if ($bg_x > 0) { + $bg_x -= $img_w; + } + } + } + + if ($repeat !== "repeat" && $repeat !== "repeat-y") { + //no repeat y + if ($bg_y < 0) { + $bg_height = $img_h + $bg_y; + } else { + $y += ($bg_y * 72) / $dpi; + $bg_height = $bg_height - $bg_y; + if ($bg_height > $img_h) { + $bg_height = $img_h; + } + $bg_y = 0; + } + if ($bg_height <= 0) { + return; + } + $height = (float)($bg_height * 72) / $dpi; + } else { + //repeat y + if ($bg_y < 0) { + $bg_y = -((-$bg_y) % $img_h); + } else { + $bg_y = $bg_y % $img_h; + if ($bg_y > 0) { + $bg_y -= $img_h; + } + } + } + + //Optimization, if repeat has no effect + if ($repeat === "repeat" && $bg_y <= 0 && $img_h + $bg_y >= $bg_height) { + $repeat = "repeat-x"; + } + + if ($repeat === "repeat" && $bg_x <= 0 && $img_w + $bg_x >= $bg_width) { + $repeat = "repeat-y"; + } + + if (($repeat === "repeat-x" && $bg_x <= 0 && $img_w + $bg_x >= $bg_width) || + ($repeat === "repeat-y" && $bg_y <= 0 && $img_h + $bg_y >= $bg_height) + ) { + $repeat = "no-repeat"; + } + + // Avoid rendering identical background-image variants multiple times + // This is not dependent of background color of box! .'_'.(is_array($bg_color) ? $bg_color["hex"] : $bg_color) + // Note: Here, bg_* are the start values, not end values after going through the tile loops! + + $key = implode("_", [$bg_width, $bg_height, $img_w, $img_h, $bg_x, $bg_y, $repeat]); + // FIXME: This will fail when a file with that exact name exists in the + // same directory, included in the document as regular image + $cpdfKey = $img . "_" . $key; + $tmpFile = Cache::getTempImage($img, $key); + $cached = ($this->_canvas instanceof CPDF && $this->_canvas->get_cpdf()->image_iscached($cpdfKey)) + || ($tmpFile !== null && file_exists($tmpFile)); + + if (!$cached) { + // img: image url string + // img_w, img_h: original image size in px + // width, height: box size in pt + // bg_width, bg_height: box size in px + // x, y: left/top edge of box on page in pt + // start_x, start_y: placement of image relative to pattern + // $repeat: repeat mode + // $bg: GD object of result image + // $src: GD object of original image + + // Create a new image to fit over the background rectangle + $bg = imagecreatetruecolor($bg_width, $bg_height); + $cpdfFromGd = true; + + switch (strtolower($type)) { + case "png": + $cpdfFromGd = false; + imagesavealpha($bg, true); + imagealphablending($bg, false); + $src = @imagecreatefrompng($img); + break; + + case "jpeg": + $src = @imagecreatefromjpeg($img); + break; + + case "webp": + $src = @imagecreatefromwebp($img); + break; + + case "gif": + $src = @imagecreatefromgif($img); + break; + + case "bmp": + $src = @Helpers::imagecreatefrombmp($img); + break; + + default: + return; // Unsupported image type + } + + if ($src == null) { + return; + } + + if ($img_w != $org_img_w || $img_h != $org_img_h) { + $newSrc = imagecreatetruecolor($img_w, $img_h); + imagealphablending($newSrc, false); + imagesavealpha($newSrc, true); + imagecopyresampled($newSrc, $src, 0, 0, 0, 0, $img_w, $img_h, imagesx($src), imagesy($src)); + if (PHP_MAJOR_VERSION < 8) { + imagedestroy($src); + } + $src = $newSrc; + } + + if ($src == null) { + return; + } + + //Background color if box is not relevant here + //Non transparent image: box clipped to real size. Background non relevant. + //Transparent image: The image controls the transparency and lets shine through whatever background. + //However on transparent image preset the composed image with the transparency color, + //to keep the transparency when copying over the non transparent parts of the tiles. + $ti = imagecolortransparent($src); + $palletsize = imagecolorstotal($src); + + if ($ti >= 0 && $ti < $palletsize) { + $tc = imagecolorsforindex($src, $ti); + $ti = imagecolorallocate($bg, $tc['red'], $tc['green'], $tc['blue']); + imagefill($bg, 0, 0, $ti); + imagecolortransparent($bg, $ti); + } + + //This has only an effect for the non repeatable dimension. + //compute start of src and dest coordinates of the single copy + if ($bg_x < 0) { + $dst_x = 0; + $src_x = -$bg_x; + } else { + $src_x = 0; + $dst_x = $bg_x; + } + + if ($bg_y < 0) { + $dst_y = 0; + $src_y = -$bg_y; + } else { + $src_y = 0; + $dst_y = $bg_y; + } + + //For historical reasons exchange meanings of variables: + //start_* will be the start values, while bg_* will be the temporary start values in the loops + $start_x = $bg_x; + $start_y = $bg_y; + + // Copy regions from the source image to the background + if ($repeat === "no-repeat") { + // Simply place the image on the background + imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $img_h); + + } elseif ($repeat === "repeat-x") { + for ($bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w) { + if ($bg_x < 0) { + $dst_x = 0; + $src_x = -$bg_x; + $w = $img_w + $bg_x; + } else { + $dst_x = $bg_x; + $src_x = 0; + $w = $img_w; + } + imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $img_h); + } + } elseif ($repeat === "repeat-y") { + + for ($bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h) { + if ($bg_y < 0) { + $dst_y = 0; + $src_y = -$bg_y; + $h = $img_h + $bg_y; + } else { + $dst_y = $bg_y; + $src_y = 0; + $h = $img_h; + } + imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $h); + } + } elseif ($repeat === "repeat") { + for ($bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h) { + for ($bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w) { + if ($bg_x < 0) { + $dst_x = 0; + $src_x = -$bg_x; + $w = $img_w + $bg_x; + } else { + $dst_x = $bg_x; + $src_x = 0; + $w = $img_w; + } + + if ($bg_y < 0) { + $dst_y = 0; + $src_y = -$bg_y; + $h = $img_h + $bg_y; + } else { + $dst_y = $bg_y; + $src_y = 0; + $h = $img_h; + } + imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $h); + } + } + } else { + print 'Unknown repeat!'; + } + + if (PHP_MAJOR_VERSION < 8) { + imagedestroy($src); + } + + if ($cpdfFromGd && $this->_canvas instanceof CPDF) { + // Skip writing temp file as the GD object is added directly + } else { + $tmpDir = $this->_dompdf->getOptions()->getTempDir(); + $tmpName = @tempnam($tmpDir, "bg_dompdf_img_"); + @unlink($tmpName); + $tmpFile = "$tmpName.png"; + + imagepng($bg, $tmpFile); + if (PHP_MAJOR_VERSION < 8) { + imagedestroy($bg); + } + + Cache::addTempImage($img, $tmpFile, $key); + } + } else { + $bg = null; + $cpdfFromGd = $tmpFile === null; + } + + if ($this->_dompdf->getOptions()->getDebugPng()) { + print '[_background_image ' . $tmpFile . ']'; + } + + $this->_canvas->clipping_rectangle($x, $y, $box_width, $box_height); + + // When using cpdf and optimization to direct png creation from gd object is available, + // don't create temp file, but place gd object directly into the pdf + if ($cpdfFromGd && $this->_canvas instanceof CPDF) { + // Note: CPDF_Adapter image converts y position + $this->_canvas->get_cpdf()->addImagePng($bg, $cpdfKey, $x, $this->_canvas->get_height() - $y - $height, $width, $height); + + if (isset($bg) && PHP_MAJOR_VERSION < 8) { + imagedestroy($bg); + } + } else { + $this->_canvas->image($tmpFile, $x, $y, $width, $height); + } + + $this->_canvas->clipping_end(); + } + + /** + * @param float $img_width + * @param float $img_height + * @param float $container_width + * @param float $container_height + * @param array|string $bg_resize + * @param int $dpi + * + * @return float[] + */ + protected function _resize_background_image( + float $img_width, + float $img_height, + float $container_width, + float $container_height, + $bg_resize, + int $dpi + ): array { + // We got two some specific numbers and/or auto definitions + if (is_array($bg_resize)) { + $is_auto_width = $bg_resize[0] === 'auto'; + if ($is_auto_width) { + $new_img_width = $img_width; + } else { + $new_img_width = $bg_resize[0]; + if (Helpers::is_percent($new_img_width)) { + $new_img_width = round(($container_width / 100) * (float)$new_img_width); + } else { + $new_img_width = round($new_img_width * $dpi / 72); + } + } + + $is_auto_height = $bg_resize[1] === 'auto'; + if ($is_auto_height) { + $new_img_height = $img_height; + } else { + $new_img_height = $bg_resize[1]; + if (Helpers::is_percent($new_img_height)) { + $new_img_height = round(($container_height / 100) * (float)$new_img_height); + } else { + $new_img_height = round($new_img_height * $dpi / 72); + } + } + + // if one of both was set to auto the other one needs to scale proportionally + if ($is_auto_width !== $is_auto_height) { + if ($is_auto_height) { + $new_img_height = round($new_img_width * ($img_height / $img_width)); + } else { + $new_img_width = round($new_img_height * ($img_width / $img_height)); + } + } + } else { + $container_ratio = $container_height / $container_width; + + if ($bg_resize === 'cover' || $bg_resize === 'contain') { + $img_ratio = $img_height / $img_width; + + if ( + ($bg_resize === 'cover' && $container_ratio > $img_ratio) || + ($bg_resize === 'contain' && $container_ratio < $img_ratio) + ) { + $new_img_height = $container_height; + $new_img_width = round($container_height / $img_ratio); + } else { + $new_img_width = $container_width; + $new_img_height = round($container_width * $img_ratio); + } + } else { + $new_img_width = $img_width; + $new_img_height = $img_height; + } + } + + return [$new_img_width, $new_img_height]; + } + + // Border rendering functions + + /** + * @param float $x + * @param float $y + * @param float $length + * @param array $color + * @param float[] $widths + * @param string $side + * @param string $corner_style + * @param float $r1 + * @param float $r2 + */ + protected function _border_dotted($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) + { + $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, "dotted", $r1, $r2); + } + + /** + * @param float $x + * @param float $y + * @param float $length + * @param array $color + * @param float[] $widths + * @param string $side + * @param string $corner_style + * @param float $r1 + * @param float $r2 + */ + protected function _border_dashed($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) + { + $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, "dashed", $r1, $r2); + } + + /** + * @param float $x + * @param float $y + * @param float $length + * @param array $color + * @param float[] $widths + * @param string $side + * @param string $corner_style + * @param float $r1 + * @param float $r2 + */ + protected function _border_solid($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) + { + $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, "solid", $r1, $r2); + } + + /** + * @param string $side + * @param float $ratio + * @param float $top + * @param float $right + * @param float $bottom + * @param float $left + * @param float $x + * @param float $y + * @param float $length + * @param float $r1 + * @param float $r2 + */ + protected function _apply_ratio($side, $ratio, $top, $right, $bottom, $left, &$x, &$y, &$length, &$r1, &$r2) + { + switch ($side) { + case "top": + $r1 -= $left * $ratio; + $r2 -= $right * $ratio; + $x += $left * $ratio; + $y += $top * $ratio; + $length -= $left * $ratio + $right * $ratio; + break; + + case "bottom": + $r1 -= $right * $ratio; + $r2 -= $left * $ratio; + $x += $left * $ratio; + $y -= $bottom * $ratio; + $length -= $left * $ratio + $right * $ratio; + break; + + case "left": + $r1 -= $top * $ratio; + $r2 -= $bottom * $ratio; + $x += $left * $ratio; + $y += $top * $ratio; + $length -= $top * $ratio + $bottom * $ratio; + break; + + case "right": + $r1 -= $bottom * $ratio; + $r2 -= $top * $ratio; + $x -= $right * $ratio; + $y += $top * $ratio; + $length -= $top * $ratio + $bottom * $ratio; + break; + + default: + return; + } + } + + /** + * @param float $x + * @param float $y + * @param float $length + * @param array $color + * @param float[] $widths + * @param string $side + * @param string $corner_style + * @param float $r1 + * @param float $r2 + */ + protected function _border_double($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) + { + list($top, $right, $bottom, $left) = $widths; + + $third_widths = [$top / 3, $right / 3, $bottom / 3, $left / 3]; + + // draw the outer border + $this->_border_solid($x, $y, $length, $color, $third_widths, $side, $corner_style, $r1, $r2); + + $this->_apply_ratio($side, 2 / 3, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2); + + $this->_border_solid($x, $y, $length, $color, $third_widths, $side, $corner_style, $r1, $r2); + } + + /** + * @param float $x + * @param float $y + * @param float $length + * @param array $color + * @param float[] $widths + * @param string $side + * @param string $corner_style + * @param float $r1 + * @param float $r2 + */ + protected function _border_groove($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) + { + list($top, $right, $bottom, $left) = $widths; + + $half_widths = [$top / 2, $right / 2, $bottom / 2, $left / 2]; + + $this->_border_inset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); + + $this->_apply_ratio($side, 0.5, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2); + + $this->_border_outset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); + } + + /** + * @param float $x + * @param float $y + * @param float $length + * @param array $color + * @param float[] $widths + * @param string $side + * @param string $corner_style + * @param float $r1 + * @param float $r2 + */ + protected function _border_ridge($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) + { + list($top, $right, $bottom, $left) = $widths; + + $half_widths = [$top / 2, $right / 2, $bottom / 2, $left / 2]; + + $this->_border_outset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); + + $this->_apply_ratio($side, 0.5, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2); + + $this->_border_inset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); + } + + /** + * @param $c + * @return mixed + */ + protected function _tint($c) + { + if (!is_numeric($c)) { + return $c; + } + + return min(1, $c + 0.16); + } + + /** + * @param $c + * @return mixed + */ + protected function _shade($c) + { + if (!is_numeric($c)) { + return $c; + } + + return max(0, $c - 0.33); + } + + /** + * @param float $x + * @param float $y + * @param float $length + * @param array $color + * @param float[] $widths + * @param string $side + * @param string $corner_style + * @param float $r1 + * @param float $r2 + */ + protected function _border_inset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) + { + switch ($side) { + case "top": + case "left": + $shade = array_map([$this, "_shade"], $color); + $this->_border_solid($x, $y, $length, $shade, $widths, $side, $corner_style, $r1, $r2); + break; + + case "bottom": + case "right": + $tint = array_map([$this, "_tint"], $color); + $this->_border_solid($x, $y, $length, $tint, $widths, $side, $corner_style, $r1, $r2); + break; + + default: + return; + } + } + + /** + * @param float $x + * @param float $y + * @param float $length + * @param array $color + * @param float[] $widths + * @param string $side + * @param string $corner_style + * @param float $r1 + * @param float $r2 + */ + protected function _border_outset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) + { + switch ($side) { + case "top": + case "left": + $tint = array_map([$this, "_tint"], $color); + $this->_border_solid($x, $y, $length, $tint, $widths, $side, $corner_style, $r1, $r2); + break; + + case "bottom": + case "right": + $shade = array_map([$this, "_shade"], $color); + $this->_border_solid($x, $y, $length, $shade, $widths, $side, $corner_style, $r1, $r2); + break; + + default: + return; + } + } + + /** + * Get the dash pattern and cap style for the given border style, width, and + * line length. + * + * The base pattern is adjusted so that it fits the given line length + * symmetrically. + * + * @param string $style + * @param float $width + * @param float $length + * + * @return array + */ + protected function dashPattern(string $style, float $width, float $length): array + { + if ($style === "dashed") { + $w = 3 * $width; + + if ($length < $w) { + $s = $w; + } else { + // Scale dashes and gaps + $r = round($length / $w); + $r = $r % 2 === 0 ? $r + 1 : $r; + $s = $length / $r; + } + + return [[$s], "butt"]; + } + + if ($style === "dotted") { + // Draw circles along the line + // Round caps extend outwards by half line width, so a zero dash + // width results in a circle + $gap = $width <= 1 ? 2 : 1; + $w = ($gap + 1) * $width; + + if ($length < $w) { + $s = $w; + } else { + // Only scale gaps + $l = $length - $width; + $r = max(round($l / $w), 1); + $s = $l / $r; + } + + return [[0, $s], "round"]; + } + + return [[], "butt"]; + } + + /** + * Draws a solid, dotted, or dashed line, observing the border radius + * + * @param float $x + * @param float $y + * @param float $length + * @param array $color + * @param float[] $widths + * @param string $side + * @param string $corner_style + * @param string $pattern_name + * @param float $r1 + * @param float $r2 + */ + protected function _border_line($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $pattern_name = "none", $r1 = 0, $r2 = 0) + { + /** used by $$side */ + [$top, $right, $bottom, $left] = $widths; + $width = $$side; + + // No need to clip corners if border radius is large enough + $cornerClip = $corner_style === "bevel" && ($r1 < $width || $r2 < $width); + $lineLength = $length - $r1 - $r2; + [$pattern, $cap] = $this->dashPattern($pattern_name, $width, $lineLength); + + // Determine arc border radius for corner arcs + $halfWidth = $width / 2; + $ar1 = max($r1 - $halfWidth, 0); + $ar2 = max($r2 - $halfWidth, 0); + + // Small angle adjustments to prevent the background from shining through + $adj1 = $ar1 / 80; + $adj2 = $ar2 / 80; + + // Adjust line width and corner angles to account for the fact that + // round caps extend outwards. The line is actually only shifted below, + // not shortened, as otherwise the end dash (circle) will vanish + // occasionally + $dl = $cap === "round" ? $halfWidth : 0; + + if ($cap === "round" && $ar1 > 0) { + $adj1 -= rad2deg(asin($halfWidth / $ar1)); + } + if ($cap === "round" && $ar2 > 0) { + $adj2 -= rad2deg(asin($halfWidth / $ar2)); + } + + switch ($side) { + case "top": + if ($cornerClip) { + $points = [ + $x, $y, + $x, $y - 1, // Extend outwards to avoid gaps + $x + $length, $y - 1, // Extend outwards to avoid gaps + $x + $length, $y, + $x + $length - max($right, $r2), $y + max($width, $r2), + $x + max($left, $r1), $y + max($width, $r1) + ]; + $this->_canvas->clipping_polygon($points); + } + + $y += $halfWidth; + + if ($ar1 > 0 && $adj1 > -22.5) { + $this->_canvas->arc($x + $r1, $y + $ar1, $ar1, $ar1, 90 - $adj1, 135 + $adj1, $color, $width, $pattern, $cap); + } + + if ($lineLength > 0) { + $this->_canvas->line($x + $dl + $r1, $y, $x + $dl + $length - $r2, $y, $color, $width, $pattern, $cap); + } + + if ($ar2 > 0 && $adj2 > -22.5) { + $this->_canvas->arc($x + $length - $r2, $y + $ar2, $ar2, $ar2, 45 - $adj2, 90 + $adj2, $color, $width, $pattern, $cap); + } + break; + + case "bottom": + if ($cornerClip) { + $points = [ + $x, $y, + $x, $y + 1, // Extend outwards to avoid gaps + $x + $length, $y + 1, // Extend outwards to avoid gaps + $x + $length, $y, + $x + $length - max($right, $r2), $y - max($width, $r2), + $x + max($left, $r1), $y - max($width, $r1) + ]; + $this->_canvas->clipping_polygon($points); + } + + $y -= $halfWidth; + + if ($ar1 > 0 && $adj1 > -22.5) { + $this->_canvas->arc($x + $r1, $y - $ar1, $ar1, $ar1, 225 - $adj1, 270 + $adj1, $color, $width, $pattern, $cap); + } + + if ($lineLength > 0) { + $this->_canvas->line($x + $dl + $r1, $y, $x + $dl + $length - $r2, $y, $color, $width, $pattern, $cap); + } + + if ($ar2 > 0 && $adj2 > -22.5) { + $this->_canvas->arc($x + $length - $r2, $y - $ar2, $ar2, $ar2, 270 - $adj2, 315 + $adj2, $color, $width, $pattern, $cap); + } + break; + + case "left": + if ($cornerClip) { + $points = [ + $x, $y, + $x - 1, $y, // Extend outwards to avoid gaps + $x - 1, $y + $length, // Extend outwards to avoid gaps + $x, $y + $length, + $x + max($width, $r2), $y + $length - max($bottom, $r2), + $x + max($width, $r1), $y + max($top, $r1) + ]; + $this->_canvas->clipping_polygon($points); + } + + $x += $halfWidth; + + if ($ar1 > 0 && $adj1 > -22.5) { + $this->_canvas->arc($x + $ar1, $y + $r1, $ar1, $ar1, 135 - $adj1, 180 + $adj1, $color, $width, $pattern, $cap); + } + + if ($lineLength > 0) { + $this->_canvas->line($x, $y + $dl + $r1, $x, $y + $dl + $length - $r2, $color, $width, $pattern, $cap); + } + + if ($ar2 > 0 && $adj2 > -22.5) { + $this->_canvas->arc($x + $ar2, $y + $length - $r2, $ar2, $ar2, 180 - $adj2, 225 + $adj2, $color, $width, $pattern, $cap); + } + break; + + case "right": + if ($cornerClip) { + $points = [ + $x, $y, + $x + 1, $y, // Extend outwards to avoid gaps + $x + 1, $y + $length, // Extend outwards to avoid gaps + $x, $y + $length, + $x - max($width, $r2), $y + $length - max($bottom, $r2), + $x - max($width, $r1), $y + max($top, $r1) + ]; + $this->_canvas->clipping_polygon($points); + } + + $x -= $halfWidth; + + if ($ar1 > 0 && $adj1 > -22.5) { + $this->_canvas->arc($x - $ar1, $y + $r1, $ar1, $ar1, 0 - $adj1, 45 + $adj1, $color, $width, $pattern, $cap); + } + + if ($lineLength > 0) { + $this->_canvas->line($x, $y + $dl + $r1, $x, $y + $dl + $length - $r2, $color, $width, $pattern, $cap); + } + + if ($ar2 > 0 && $adj2 > -22.5) { + $this->_canvas->arc($x - $ar2, $y + $length - $r2, $ar2, $ar2, 315 - $adj2, 360 + $adj2, $color, $width, $pattern, $cap); + } + break; + } + + if ($cornerClip) { + $this->_canvas->clipping_end(); + } + } + + /** + * @param float $opacity + */ + protected function _set_opacity(float $opacity): void + { + if ($opacity >= 0.0 && $opacity <= 1.0) { + $this->_canvas->set_opacity($opacity); + } + } + + /** + * Add a named destination if the element has an ID or is an anchor element + * with `name` attribute. + * + * @param DOMElement $node + */ + protected function addNamedDest(DOMElement $node): void + { + $id = $node->getAttribute("id"); + if ($id !== "") { + $this->_canvas->add_named_dest($id); + } + + if ($node->nodeName === "a") { + $name = $node->getAttribute("name"); + if ($name !== "") { + $this->_canvas->add_named_dest($name); + } + } + } + + /** + * Add a hyperlink if the element is an anchor element with `href` + * attribute. + * + * @param DOMElement $node + * @param float[] $borderBox + */ + protected function addHyperlink(DOMElement $node, array $borderBox): void + { + if ($node->nodeName === "a" && ($href = $node->getAttribute("href")) !== "") { + [$x, $y, $w, $h] = $borderBox; + $dompdf = $this->_dompdf; + $href = Helpers::build_url( + $dompdf->getProtocol(), + $dompdf->getBaseHost(), + $dompdf->getBasePath(), + $href, + $dompdf->getOptions()->getChroot() + ) ?? $href; + $this->_canvas->add_link($href, $x, $y, $w, $h); + } + } + + /** + * @param float[] $box + * @param array|string $color + * @param array $style + */ + protected function debugLayout(array $box, $color = "red", array $style = []): void + { + $this->_canvas->rectangle($box[0], $box[1], $box[2], $box[3], Color::parse($color), 0.1, $style); + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer/Block.php b/dompdf/vendor/dompdf/dompdf/src/Renderer/Block.php new file mode 100644 index 0000000..ab2768d --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Renderer/Block.php @@ -0,0 +1,81 @@ +get_style(); + $node = $frame->get_node(); + + $this->_set_opacity($frame->get_opacity($style->opacity)); + + [$x, $y, $w, $h] = $frame->get_border_box(); + + if ($node->nodeName === "body") { + // Margins should be fully resolved at this point + $mt = $style->margin_top; + $mb = $style->margin_bottom; + $h = $frame->get_containing_block("h") - $mt - $mb; + } + + $border_box = [$x, $y, $w, $h]; + + // Draw our background, border and content + $this->_render_background($frame, $border_box); + $this->_render_border($frame, $border_box); + $this->_render_outline($frame, $border_box); + + $this->addNamedDest($node); + $this->addHyperlink($node, $border_box); + $this->debugBlockLayout($frame, "red", false); + } + + /** + * @param Frame $frame + * @param array|string $color + * @param bool $lines + */ + protected function debugBlockLayout(Frame $frame, $color, bool $lines = false): void + { + $options = $this->_dompdf->getOptions(); + $debugLayout = $options->getDebugLayout(); + + if (!$debugLayout) { + return; + } + + if ($options->getDebugLayoutBlocks()) { + $this->debugLayout($frame->get_border_box(), $color); + + if ($options->getDebugLayoutPaddingBox()) { + $this->debugLayout($frame->get_padding_box(), $color, [0.5, 0.5]); + } + } + + if ($lines && $options->getDebugLayoutLines() && $frame instanceof BlockFrameDecorator) { + [$cx, , $cw] = $frame->get_content_box(); + + foreach ($frame->get_line_boxes() as $line) { + $lw = $cw - $line->left - $line->right; + $this->debugLayout([$cx + $line->left, $line->y, $lw, $line->h], "orange"); + } + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer/Image.php b/dompdf/vendor/dompdf/dompdf/src/Renderer/Image.php new file mode 100644 index 0000000..1373bb0 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Renderer/Image.php @@ -0,0 +1,73 @@ +get_style(); + $node = $frame->get_node(); + $border_box = $frame->get_border_box(); + + $this->_set_opacity($frame->get_opacity($style->opacity)); + + // Render background & borders + $this->_render_background($frame, $border_box); + $this->_render_border($frame, $border_box); + $this->_render_outline($frame, $border_box); + + $content_box = $frame->get_content_box(); + [$x, $y, $w, $h] = $content_box; + + $src = $frame->get_image_url(); + + if (Cache::is_broken($src) && ($alt = $node->getAttribute("alt")) !== "") { + $font = $style->font_family; + $size = $style->font_size; + $word_spacing = $style->word_spacing; + $letter_spacing = $style->letter_spacing; + + $this->_canvas->text( + $x, + $y, + $alt, + $font, + $size, + $style->color, + $word_spacing, + $letter_spacing + ); + } elseif ($w > 0 && $h > 0) { + if ($style->has_border_radius()) { + [$tl, $tr, $br, $bl] = $style->resolve_border_radius($border_box, $content_box); + $this->_canvas->clipping_roundrectangle($x, $y, $w, $h, $tl, $tr, $br, $bl); + } + + $this->_canvas->image($src, $x, $y, $w, $h, $style->image_resolution); + + if ($style->has_border_radius()) { + $this->_canvas->clipping_end(); + } + } + + $this->addNamedDest($node); + $this->debugBlockLayout($frame, "blue"); + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer/Inline.php b/dompdf/vendor/dompdf/dompdf/src/Renderer/Inline.php new file mode 100644 index 0000000..5d9e284 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Renderer/Inline.php @@ -0,0 +1,121 @@ +get_first_child(); + while ($child && !$child->is_in_flow()) { + $child = $child->get_next_sibling(); + } + + if (!$child) { + return; // No children, no service + } + + $style = $frame->get_style(); + $node = $frame->get_node(); + + $this->_set_opacity($frame->get_opacity($style->opacity)); + + // Draw background & border behind each child. To do this, we need to + // to figure out just how much space each child takes. Retrieve the + // position of the first child again, to account for text and vertical + // alignment + [$x, $y] = $child->get_position(); + [$w, $h] = $this->get_child_size($frame); + + [, , $cbw] = $frame->get_containing_block(); + $margin_left = $style->length_in_pt($style->margin_left, $cbw); + $pt = $style->length_in_pt($style->padding_top, $cbw); + $pb = $style->length_in_pt($style->padding_bottom, $cbw); + + // Make sure that border and background start inside the left margin + // Extend the drawn box by border and padding in vertical direction, as + // these do not affect layout + // FIXME: Using a small vertical offset of a fraction of the height here + // to work around the vertical position being slightly off in general + $x += $margin_left; + $y -= $style->border_top_width + $pt - ($h * 0.1); + $h += $style->border_top_width + $pt + $style->border_bottom_width + $pb; + + $border_box = [$x, $y, $w, $h]; + $this->_render_background($frame, $border_box); + $this->_render_border($frame, $border_box); + $this->_render_outline($frame, $border_box); + + $this->addNamedDest($node); + $this->addHyperlink($node, $border_box); + + $options = $this->_dompdf->getOptions(); + + if ($options->getDebugLayout() && $options->getDebugLayoutInline()) { + $this->debugLayout($border_box, "blue"); + + if ($options->getDebugLayoutPaddingBox()) { + $padding_box = [ + $x + $style->border_left_width, + $y + $style->border_top_width, + $w - $style->border_left_width - $style->border_right_width, + $h - $style->border_top_width - $style->border_bottom_width + ]; + $this->debugLayout($padding_box, "blue", [0.5, 0.5]); + } + } + } + + protected function get_child_size(Frame $frame): array + { + $w = 0.0; + $h = 0.0; + + foreach ($frame->get_children() as $child) { + if (!$child->is_in_flow()) { + continue; + } + + // Exclude trailing white space + if ($child->get_node()->nodeValue === " " + && $child->get_prev_sibling() && !$child->get_next_sibling() + ) { + break; + } + + $style = $child->get_style(); + $auto_width = $style->width === "auto"; + $auto_height = $style->height === "auto"; + [, , $child_w, $child_h] = $child->get_border_box(); + + if ($auto_width || $auto_height) { + [$child_w2, $child_h2] = $this->get_child_size($child); + + if ($auto_width) { + $child_w = $child_w2; + } + + if ($auto_height) { + $child_h = $child_h2; + } + } + + $w += $child_w; + $h = max($h, $child_h); + } + + return [$w, $h]; + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer/ListBullet.php b/dompdf/vendor/dompdf/dompdf/src/Renderer/ListBullet.php new file mode 100644 index 0000000..dadfe2b --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Renderer/ListBullet.php @@ -0,0 +1,213 @@ +get_parent(); + $style = $frame->get_style(); + + $this->_set_opacity($frame->get_opacity($style->opacity)); + + // Don't render bullets twice if the list item was split + if ($li->is_split_off) { + return; + } + + $font_family = $style->font_family; + $font_size = $style->font_size; + $baseline = $this->_canvas->get_font_baseline($font_family, $font_size); + + // Handle list-style-image + // If list style image is requested but missing, fall back to predefined types + if ($frame instanceof ListBulletImage && !Cache::is_broken($img = $frame->get_image_url())) { + [$x, $y] = $frame->get_position(); + $w = $frame->get_width(); + $h = $frame->get_height(); + $y += $baseline - $h; + + $this->_canvas->image($img, $x, $y, $w, $h); + } else { + $bullet_style = $style->list_style_type; + + switch ($bullet_style) { + case "disc": + case "circle": + [$x, $y] = $frame->get_position(); + $offset = $font_size * ListBulletFrameDecorator::BULLET_OFFSET; + $r = ($font_size * ListBulletFrameDecorator::BULLET_SIZE) / 2; + $x += $r; + $y += $baseline - $r - $offset; + $o = $font_size * ListBulletFrameDecorator::BULLET_THICKNESS; + $this->_canvas->circle($x, $y, $r, $style->color, $o, null, $bullet_style !== "circle"); + break; + + case "square": + [$x, $y] = $frame->get_position(); + $offset = $font_size * ListBulletFrameDecorator::BULLET_OFFSET; + $w = $font_size * ListBulletFrameDecorator::BULLET_SIZE; + $y += $baseline - $w - $offset; + $this->_canvas->filled_rectangle($x, $y, $w, $w, $style->color); + break; + + default: + case "decimal": + case "decimal-leading-zero": + case "lower-alpha": + case "lower-latin": + case "lower-roman": + case "lower-greek": + case "upper-alpha": + case "upper-latin": + case "upper-roman": + $pad = null; + if ($bullet_style === "decimal-leading-zero") { + $pad = strlen($li->get_parent()->get_node()->getAttribute("dompdf-children-count")); + } + + $node = $frame->get_node(); + + if (!$node->hasAttribute("dompdf-counter")) { + return; + } + + $index = (int) $node->getAttribute("dompdf-counter"); + $text = $this->make_counter($index, $bullet_style, $pad); + + $word_spacing = $style->word_spacing; + $letter_spacing = $style->letter_spacing; + $text_width = $this->_dompdf->getFontMetrics()->getTextWidth($text, $font_family, $font_size, $word_spacing, $letter_spacing); + + [$x, $y] = $frame->get_position(); + // Correct for static frame width applied by positioner + $x += $frame->get_width() - $text_width; + + $this->_canvas->text($x, $y, $text, + $font_family, $font_size, + $style->color, $word_spacing, $letter_spacing); + break; + + case "none": + break; + } + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer/TableCell.php b/dompdf/vendor/dompdf/dompdf/src/Renderer/TableCell.php new file mode 100644 index 0000000..fbf9178 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Renderer/TableCell.php @@ -0,0 +1,189 @@ +get_style(); + $node = $frame->get_node(); + + if (trim($node->nodeValue) === "" && $style->empty_cells === "hide") { + return; + } + + $this->_set_opacity($frame->get_opacity($style->opacity)); + + $border_box = $frame->get_border_box(); + $table = Table::find_parent_table($frame); + if ($table === null) { + throw new Exception("Parent table not found for table cell"); + } + + if ($table->get_style()->border_collapse !== "collapse") { + $this->_render_background($frame, $border_box); + $this->_render_border($frame, $border_box); + $this->_render_outline($frame, $border_box); + } else { + // The collapsed case is slightly complicated... + + $cells = $table->get_cellmap()->get_spanned_cells($frame); + + if (is_null($cells)) { + return; + } + + // Render the background to the padding box, as the cells are + // rendered individually one after another, and we don't want the + // background to overlap an adjacent border + $padding_box = $frame->get_padding_box(); + + $this->_render_background($frame, $padding_box); + $this->_render_collapsed_border($frame, $table); + + // FIXME: Outline should be drawn over other cells + $this->_render_outline($frame, $border_box); + } + + $this->addNamedDest($node); + $this->addHyperlink($node, $border_box); + $this->debugBlockLayout($frame, "red", false); + } + + /** + * @param Frame $frame + * @param Table $table + */ + protected function _render_collapsed_border(Frame $frame, Table $table): void + { + $cellmap = $table->get_cellmap(); + $cells = $cellmap->get_spanned_cells($frame); + $num_rows = $cellmap->get_num_rows(); + $num_cols = $cellmap->get_num_cols(); + + [$table_x, $table_y] = $table->get_position(); + + // Determine the top row spanned by this cell + $i = $cells["rows"][0]; + $top_row = $cellmap->get_row($i); + + // Determine if this cell borders on the bottom of the table. If so, + // then we draw its bottom border. Otherwise the next row down will + // draw its top border instead. + if (in_array($num_rows - 1, $cells["rows"])) { + $draw_bottom = true; + $bottom_row = $cellmap->get_row($num_rows - 1); + } else { + $draw_bottom = false; + } + + // Draw the horizontal borders + foreach ($cells["columns"] as $j) { + $bp = $cellmap->get_border_properties($i, $j); + $col = $cellmap->get_column($j); + + $x = $table_x + $col["x"] - $bp["left"]["width"] / 2; + $y = $table_y + $top_row["y"] - $bp["top"]["width"] / 2; + $w = $col["used-width"] + ($bp["left"]["width"] + $bp["right"]["width"]) / 2; + + if ($bp["top"]["width"] > 0) { + $widths = [ + (float)$bp["top"]["width"], + (float)$bp["right"]["width"], + (float)$bp["bottom"]["width"], + (float)$bp["left"]["width"] + ]; + + $method = "_border_" . $bp["top"]["style"]; + $this->$method($x, $y, $w, $bp["top"]["color"], $widths, "top", "square"); + } + + if ($draw_bottom) { + $bp = $cellmap->get_border_properties($num_rows - 1, $j); + if ($bp["bottom"]["width"] <= 0) { + continue; + } + + $widths = [ + (float)$bp["top"]["width"], + (float)$bp["right"]["width"], + (float)$bp["bottom"]["width"], + (float)$bp["left"]["width"] + ]; + + $y = $table_y + $bottom_row["y"] + $bottom_row["height"] + $bp["bottom"]["width"] / 2; + + $method = "_border_" . $bp["bottom"]["style"]; + $this->$method($x, $y, $w, $bp["bottom"]["color"], $widths, "bottom", "square"); + } + } + + $j = $cells["columns"][0]; + $left_col = $cellmap->get_column($j); + + if (in_array($num_cols - 1, $cells["columns"])) { + $draw_right = true; + $right_col = $cellmap->get_column($num_cols - 1); + } else { + $draw_right = false; + } + + // Draw the vertical borders + foreach ($cells["rows"] as $i) { + $bp = $cellmap->get_border_properties($i, $j); + $row = $cellmap->get_row($i); + + $x = $table_x + $left_col["x"] - $bp["left"]["width"] / 2; + $y = $table_y + $row["y"] - $bp["top"]["width"] / 2; + $h = $row["height"] + ($bp["top"]["width"] + $bp["bottom"]["width"]) / 2; + + if ($bp["left"]["width"] > 0) { + $widths = [ + (float)$bp["top"]["width"], + (float)$bp["right"]["width"], + (float)$bp["bottom"]["width"], + (float)$bp["left"]["width"] + ]; + + $method = "_border_" . $bp["left"]["style"]; + $this->$method($x, $y, $h, $bp["left"]["color"], $widths, "left", "square"); + } + + if ($draw_right) { + $bp = $cellmap->get_border_properties($i, $num_cols - 1); + if ($bp["right"]["width"] <= 0) { + continue; + } + + $widths = [ + (float)$bp["top"]["width"], + (float)$bp["right"]["width"], + (float)$bp["bottom"]["width"], + (float)$bp["left"]["width"] + ]; + + $x = $table_x + $right_col["x"] + $right_col["used-width"] + $bp["right"]["width"] / 2; + + $method = "_border_" . $bp["right"]["style"]; + $this->$method($x, $y, $h, $bp["right"]["color"], $widths, "right", "square"); + } + } + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer/TableRow.php b/dompdf/vendor/dompdf/dompdf/src/Renderer/TableRow.php new file mode 100644 index 0000000..b1608e8 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Renderer/TableRow.php @@ -0,0 +1,40 @@ +get_style(); + $node = $frame->get_node(); + + $this->_set_opacity($frame->get_opacity($style->opacity)); + + $border_box = $frame->get_border_box(); + + // FIXME: Render background onto the area consisting of all spanned + // cells. In the separated border model, the border-spacing area should + // be left out. Currently, the background is inherited by the table + // cells instead, which does not handle transparent backgrounds and + // background images correctly. + // See https://www.w3.org/TR/CSS21/tables.html#table-layers + + $this->_render_outline($frame, $border_box); + + $this->addNamedDest($node); + $this->addHyperlink($node, $border_box); + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer/TableRowGroup.php b/dompdf/vendor/dompdf/dompdf/src/Renderer/TableRowGroup.php new file mode 100644 index 0000000..eb5d23b --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Renderer/TableRowGroup.php @@ -0,0 +1,40 @@ +get_style(); + $node = $frame->get_node(); + + $this->_set_opacity($frame->get_opacity($style->opacity)); + + $border_box = $frame->get_border_box(); + + // FIXME: Render background onto the area consisting of all spanned + // cells. In the separated border model, the border-spacing area should + // be left out. Currently, the background is inherited by the table + // cells instead, which does not handle transparent backgrounds and + // background images correctly. + // See https://www.w3.org/TR/CSS21/tables.html#table-layers + + $this->_render_outline($frame, $border_box); + + $this->addNamedDest($node); + $this->addHyperlink($node, $border_box); + } +} diff --git a/dompdf/vendor/dompdf/dompdf/src/Renderer/Text.php b/dompdf/vendor/dompdf/dompdf/src/Renderer/Text.php new file mode 100644 index 0000000..656f3c9 --- /dev/null +++ b/dompdf/vendor/dompdf/dompdf/src/Renderer/Text.php @@ -0,0 +1,161 @@ +_canvas, "get_cpdf" ) + //- For cpdf these can and must stay 0, because font metrics are used directly. + //- For other renderers, if different values are wanted, separate the parameter sets. + // But $size and $size-$height seem to be accurate enough + + /** Relative to bottom of text, as fraction of height */ + const UNDERLINE_OFFSET = 0.0; + + /** Relative to top of text */ + const OVERLINE_OFFSET = 0.0; + + /** Relative to centre of text. */ + const LINETHROUGH_OFFSET = 0.0; + + /** How far to extend lines past either end, in pt */ + const DECO_EXTENSION = 0.0; + + /** + * @param \Dompdf\FrameDecorator\Text $frame + */ + function render(Frame $frame) + { + $style = $frame->get_style(); + $text = $frame->get_text(); + + if ($text === "") { + return; + } + + $this->_set_opacity($frame->get_opacity($style->opacity)); + + [$x, $y] = $frame->get_position(); + $cb = $frame->get_containing_block(); + + $ml = $style->margin_left; + $pl = $style->padding_left; + $bl = $style->border_left_width; + $x += (float) $style->length_in_pt([$ml, $pl, $bl], $cb["w"]); + + $font = $style->font_family; + $size = $style->font_size; + $frame_font_size = $frame->get_dompdf()->getFontMetrics()->getFontHeight($font, $size); + $word_spacing = $frame->get_text_spacing() + $style->word_spacing; + $letter_spacing = $style->letter_spacing; + $width = (float) $style->width; + + /*$text = str_replace( + array("{PAGE_NUM}"), + array($this->_canvas->get_page_number()), + $text + );*/ + + $this->_canvas->text($x, $y, $text, + $font, $size, + $style->color, $word_spacing, $letter_spacing); + + $line = $frame->get_containing_line(); + + // FIXME Instead of using the tallest frame to position, + // the decoration, the text should be well placed + if (false && $line->tallest_frame) { + $base_frame = $line->tallest_frame; + $style = $base_frame->get_style(); + $size = $style->font_size; + } + + $line_thickness = $size * self::DECO_THICKNESS; + $underline_offset = $size * self::UNDERLINE_OFFSET; + $overline_offset = $size * self::OVERLINE_OFFSET; + $linethrough_offset = $size * self::LINETHROUGH_OFFSET; + $underline_position = -0.08; + + if ($this->_canvas instanceof CPDF) { + $cpdf_font = $this->_canvas->get_cpdf()->fonts[$style->font_family]; + + if (isset($cpdf_font["UnderlinePosition"])) { + $underline_position = $cpdf_font["UnderlinePosition"] / 1000; + } + + if (isset($cpdf_font["UnderlineThickness"])) { + $line_thickness = $size * ($cpdf_font["UnderlineThickness"] / 1000); + } + } + + $descent = $size * $underline_position; + $base = $frame_font_size; + + // Handle text decoration: + // http://www.w3.org/TR/CSS21/text.html#propdef-text-decoration + + // Draw all applicable text-decorations. Start with the root and work our way down. + $p = $frame; + $stack = []; + while ($p = $p->get_parent()) { + $stack[] = $p; + } + + while (isset($stack[0])) { + $f = array_pop($stack); + + if (($text_deco = $f->get_style()->text_decoration) === "none") { + continue; + } + + $deco_y = $y; //$line->y; + $color = $f->get_style()->color; + + switch ($text_deco) { + default: + continue 2; + + case "underline": + $deco_y += $base - $descent + $underline_offset + $line_thickness / 2; + break; + + case "overline": + $deco_y += $overline_offset + $line_thickness / 2; + break; + + case "line-through": + $deco_y += $base * 0.7 + $linethrough_offset; + break; + } + + $dx = 0; + $x1 = $x - self::DECO_EXTENSION; + $x2 = $x + $width + $dx + self::DECO_EXTENSION; + $this->_canvas->line($x1, $deco_y, $x2, $deco_y, $color, $line_thickness); + } + + $options = $this->_dompdf->getOptions(); + + if ($options->getDebugLayout() && $options->getDebugLayoutLines()) { + $fontMetrics = $this->_dompdf->getFontMetrics(); + $textWidth = $fontMetrics->getTextWidth($text, $font, $size, $word_spacing, $letter_spacing); + $this->debugLayout([$x, $y, $textWidth, $frame_font_size], "orange", [0.5, 0.5]); + } + } +} diff --git a/dompdf/vendor/dompdf/php-font-lib/AUTHORS.md b/dompdf/vendor/dompdf/php-font-lib/AUTHORS.md new file mode 100644 index 0000000..69b8f0b --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/AUTHORS.md @@ -0,0 +1,17 @@ +FontLib was designed and developed by Fabien Ménager. + +### Current Team + +* **Brian Sweeney** (maintainer) + +### Alumni + +* **Fabien Ménager** (creator) + +### Contributors +* **mondrake** +* [and many more...](https://github.com/dompdf/php-font-lib/graphs/contributors) + +### Thanks + +FontLib would not have been possible without strong community support. diff --git a/dompdf/vendor/dompdf/php-font-lib/LICENSE b/dompdf/vendor/dompdf/php-font-lib/LICENSE new file mode 100644 index 0000000..bca992d --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/LICENSE @@ -0,0 +1,456 @@ + 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. + + 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. + + 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. + + 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. + + 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. + + 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. + + 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. + + 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. + + 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. \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/README.md b/dompdf/vendor/dompdf/php-font-lib/README.md new file mode 100644 index 0000000..df8edfe --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/README.md @@ -0,0 +1,50 @@ +[![PHPUnit tests](https://github.com/dompdf/php-font-lib/actions/workflows/phpunit.yml/badge.svg)](https://github.com/dompdf/php-font-lib/actions/workflows/phpunit.yml) + +# PHP Font Lib + +This library can be used to: + * Read TrueType, OpenType (with TrueType glyphs), WOFF font files + * Extract basic info (name, style, etc) + * Extract advanced info (horizontal metrics, glyph names, glyph shapes, etc) + * Make an Adobe Font Metrics (AFM) file from a font + +This project was initiated by the need to read font files in the [DOMPDF project](https://github.com/dompdf/dompdf). + +Usage Example +------------- + +### Base font information + +```php +$font = \FontLib\Font::load('fontfile.ttf'); +$font->parse(); // for getFontWeight() to work this call must be done first! +echo $font->getFontName() .'
'; +echo $font->getFontSubfamily() .'
'; +echo $font->getFontSubfamilyID() .'
'; +echo $font->getFontFullName() .'
'; +echo $font->getFontVersion() .'
'; +echo $font->getFontWeight() .'
'; +echo $font->getFontPostscriptName() .'
'; +$font->close(); +``` + +### Font Metrics Generation + +```php +$font = FontLib\Font::load('fontfile.ttf'); +$font->parse(); +$font->saveAdobeFontMetrics('fontfile.ufm'); +``` + +### Create a font subset + +```php +$font = FontLib\Font::load('fontfile.ttf'); +$font->parse(); +$font->setSubset("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ.:,;' (!?)+-*/== 1234567890"); // characters to include +$font->reduce(); +touch('fontfile.subset.ttf'); +$font->open('fontfile.subset.ttf', FontLib\BinaryStream::modeReadWrite); +$font->encode(array("OS/2")); +$font->close(); +``` diff --git a/dompdf/vendor/dompdf/php-font-lib/composer.json b/dompdf/vendor/dompdf/php-font-lib/composer.json new file mode 100644 index 0000000..934bb00 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/composer.json @@ -0,0 +1,33 @@ +{ + "name": "dompdf/php-font-lib", + "type": "library", + "description": "A library to read, parse, export and make subsets of different types of font files.", + "homepage": "https://github.com/dompdf/php-font-lib", + "license": "LGPL-2.1-or-later", + "authors": [ + { + "name": "The FontLib Community", + "homepage": "https://github.com/dompdf/php-font-lib/blob/master/AUTHORS.md" + } + ], + "autoload": { + "psr-4": { + "FontLib\\": "src/FontLib" + } + }, + "autoload-dev": { + "psr-4": { + "FontLib\\Tests\\": "tests/FontLib" + } + }, + "config": { + "bin-dir": "bin" + }, + "require": { + "php": "^7.1 || ^8.0", + "ext-mbstring": "*" + }, + "require-dev": { + "symfony/phpunit-bridge" : "^3 || ^4 || ^5 || ^6" + } +} diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/adobe-standard-encoding.map b/dompdf/vendor/dompdf/php-font-lib/maps/adobe-standard-encoding.map new file mode 100644 index 0000000..230d4a1 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/adobe-standard-encoding.map @@ -0,0 +1,231 @@ +// Adobe Standard Encoding table for ttf2pt1 +// Thomas Henlich + +=20 U+0020 SPACE +=21 U+0021 EXCLAMATION MARK +=22 U+0022 QUOTATION MARK +=23 U+0023 NUMBER SIGN +=24 U+0024 DOLLAR SIGN +=25 U+0025 PERCENT SIGN +=26 U+0026 AMPERSAND +=27 U+2019 RIGHT SINGLE QUOTATION MARK +=28 U+0028 LEFT PARENTHESIS +=29 U+0029 RIGHT PARENTHESIS +=2A U+002A ASTERISK +=2B U+002B PLUS SIGN +=2C U+002C COMMA +=2D U+002D HYPHEN-MINUS +=2E U+002E FULL STOP +=2F U+002F SOLIDUS +=30 U+0030 DIGIT ZERO +=31 U+0031 DIGIT ONE +=32 U+0032 DIGIT TWO +=33 U+0033 DIGIT THREE +=34 U+0034 DIGIT FOUR +=35 U+0035 DIGIT FIVE +=36 U+0036 DIGIT SIX +=37 U+0037 DIGIT SEVEN +=38 U+0038 DIGIT EIGHT +=39 U+0039 DIGIT NINE +=3A U+003A COLON +=3B U+003B SEMICOLON +=3C U+003C LESS-THAN SIGN +=3D U+003D EQUALS SIGN +=3E U+003E GREATER-THAN SIGN +=3F U+003F QUESTION MARK +=40 U+0040 COMMERCIAL AT +=41 U+0041 LATIN CAPITAL LETTER A +=42 U+0042 LATIN CAPITAL LETTER B +=43 U+0043 LATIN CAPITAL LETTER C +=44 U+0044 LATIN CAPITAL LETTER D +=45 U+0045 LATIN CAPITAL LETTER E +=46 U+0046 LATIN CAPITAL LETTER F +=47 U+0047 LATIN CAPITAL LETTER G +=48 U+0048 LATIN CAPITAL LETTER H +=49 U+0049 LATIN CAPITAL LETTER I +=4A U+004A LATIN CAPITAL LETTER J +=4B U+004B LATIN CAPITAL LETTER K +=4C U+004C LATIN CAPITAL LETTER L +=4D U+004D LATIN CAPITAL LETTER M +=4E U+004E LATIN CAPITAL LETTER N +=4F U+004F LATIN CAPITAL LETTER O +=50 U+0050 LATIN CAPITAL LETTER P +=51 U+0051 LATIN CAPITAL LETTER Q +=52 U+0052 LATIN CAPITAL LETTER R +=53 U+0053 LATIN CAPITAL LETTER S +=54 U+0054 LATIN CAPITAL LETTER T +=55 U+0055 LATIN CAPITAL LETTER U +=56 U+0056 LATIN CAPITAL LETTER V +=57 U+0057 LATIN CAPITAL LETTER W +=58 U+0058 LATIN CAPITAL LETTER X +=59 U+0059 LATIN CAPITAL LETTER Y +=5A U+005A LATIN CAPITAL LETTER Z +=5B U+005B LEFT SQUARE BRACKET +=5C U+005C REVERSE SOLIDUS +=5D U+005D RIGHT SQUARE BRACKET +=5E U+005E CIRCUMFLEX ACCENT +=5F U+005F LOW LINE +=60 U+2018 LEFT SINGLE QUOTATION MARK +=61 U+0061 LATIN SMALL LETTER A +=62 U+0062 LATIN SMALL LETTER B +=63 U+0063 LATIN SMALL LETTER C +=64 U+0064 LATIN SMALL LETTER D +=65 U+0065 LATIN SMALL LETTER E +=66 U+0066 LATIN SMALL LETTER F +=67 U+0067 LATIN SMALL LETTER G +=68 U+0068 LATIN SMALL LETTER H +=69 U+0069 LATIN SMALL LETTER I +=6A U+006A LATIN SMALL LETTER J +=6B U+006B LATIN SMALL LETTER K +=6C U+006C LATIN SMALL LETTER L +=6D U+006D LATIN SMALL LETTER M +=6E U+006E LATIN SMALL LETTER N +=6F U+006F LATIN SMALL LETTER O +=70 U+0070 LATIN SMALL LETTER P +=71 U+0071 LATIN SMALL LETTER Q +=72 U+0072 LATIN SMALL LETTER R +=73 U+0073 LATIN SMALL LETTER S +=74 U+0074 LATIN SMALL LETTER T +=75 U+0075 LATIN SMALL LETTER U +=76 U+0076 LATIN SMALL LETTER V +=77 U+0077 LATIN SMALL LETTER W +=78 U+0078 LATIN SMALL LETTER X +=79 U+0079 LATIN SMALL LETTER Y +=7A U+007A LATIN SMALL LETTER Z +=7B U+007B LEFT CURLY BRACKET +=7C U+007C VERTICAL LINE +=7D U+007D RIGHT CURLY BRACKET +=7E U+007E TILDE +=A1 U+00A1 INVERTED EXCLAMATION MARK +=A2 U+00A2 CENT SIGN +=A3 U+00A3 POUND SIGN +=A4 U+2044 FRACTION SLASH +=A5 U+00A5 YEN SIGN +=A6 U+0192 LATIN SMALL LETTER F WITH HOOK +=A7 U+00A7 SECTION SIGN +=A8 U+00A4 CURRENCY SIGN +=A9 U+0027 APOSTROPHE +=AA U+201C LEFT DOUBLE QUOTATION MARK +=AB U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +=AC U+2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK +=AD U+203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +=AE U+FB01 LATIN SMALL LIGATURE FI +=AF U+FB02 LATIN SMALL LIGATURE FL +=B1 U+2013 EN DASH +=B2 U+2020 DAGGER +=B3 U+2021 DOUBLE DAGGER +=B4 U+00B7 MIDDLE DOT +=B6 U+00B6 PILCROW SIGN +=B7 U+2022 BULLET +=B8 U+201A SINGLE LOW-9 QUOTATION MARK +=B9 U+201E DOUBLE LOW-9 QUOTATION MARK +=BA U+201D RIGHT DOUBLE QUOTATION MARK +=BB U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +=BC U+2026 HORIZONTAL ELLIPSIS +=BD U+2030 PER MILLE SIGN +=BF U+00BF INVERTED QUESTION MARK +=C1 U+0060 GRAVE ACCENT +=C2 U+00B4 ACUTE ACCENT +=C3 U+02C6 MODIFIER LETTER CIRCUMFLEX ACCENT +=C4 U+02DC SMALL TILDE +=C5 U+00AF MACRON +=C6 U+02D8 BREVE +=C7 U+02D9 DOT ABOVE +=C8 U+00A8 DIAERESIS +=CA U+02DA RING ABOVE +=CB U+00B8 CEDILLA +=CD U+02DD DOUBLE ACUTE ACCENT +=CE U+02DB OGONEK +=CF U+02C7 CARON +=D0 U+2014 EM DASH +=E1 U+00C6 LATIN CAPITAL LETTER AE +=E3 U+00AA FEMININE ORDINAL INDICATOR +=E8 U+0141 LATIN CAPITAL LETTER L WITH STROKE +=E9 U+00D8 LATIN CAPITAL LETTER O WITH STROKE +=EA U+0152 LATIN CAPITAL LIGATURE OE +=EB U+00BA MASCULINE ORDINAL INDICATOR +=F1 U+00E6 LATIN SMALL LETTER AE +=F5 U+0131 LATIN SMALL LETTER DOTLESS I +=F8 U+0142 LATIN SMALL LETTER L WITH STROKE +=F9 U+00F8 LATIN SMALL LETTER O WITH STROKE +=FA U+0153 LATIN SMALL LIGATURE OE +=FB U+00DF LATIN SMALL LETTER SHARP S + +// unencoded characters: +=100 U+00E7 LATIN SMALL LETTER C WITH CEDILLA +=101 U+00FF LATIN SMALL LETTER Y WITH DIAERESIS +=102 U+00E3 LATIN SMALL LETTER A WITH TILDE +=103 U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX +=104 U+00B3 SUPERSCRIPT THREE +=105 U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX +=106 U+00FE LATIN SMALL LETTER THORN +=107 U+00E8 LATIN SMALL LETTER E WITH GRAVE +=108 U+00B2 SUPERSCRIPT TWO +=109 U+00E9 LATIN SMALL LETTER E WITH ACUTE +=10A U+00F5 LATIN SMALL LETTER O WITH TILDE +=10B U+00C1 LATIN CAPITAL LETTER A WITH ACUTE +=10C U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX +=10D U+00FD LATIN SMALL LETTER Y WITH ACUTE +=10E U+00FC LATIN SMALL LETTER U WITH DIAERESIS +=10F U+00BE VULGAR FRACTION THREE QUARTERS +=110 U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX +=111 U+00D0 LATIN CAPITAL LETTER ETH +=112 U+00EB LATIN SMALL LETTER E WITH DIAERESIS +=113 U+00F9 LATIN SMALL LETTER U WITH GRAVE +=114 U+2122 TRADE MARK SIGN +=115 U+00F2 LATIN SMALL LETTER O WITH GRAVE +=116 U+0161 LATIN SMALL LETTER S WITH CARON +=117 U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS +=118 U+00FA LATIN SMALL LETTER U WITH ACUTE +=119 U+00E0 LATIN SMALL LETTER A WITH GRAVE +=11A U+00F1 LATIN SMALL LETTER N WITH TILDE +=11B U+00E5 LATIN SMALL LETTER A WITH RING ABOVE +=11C U+017E LATIN SMALL LETTER Z WITH CARON +=11D U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX +=11E U+00D1 LATIN CAPITAL LETTER N WITH TILDE +=11F U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX +=120 U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX +=121 U+00CD LATIN CAPITAL LETTER I WITH ACUTE +=122 U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA +=123 U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS +=124 U+0160 LATIN CAPITAL LETTER S WITH CARON +=125 U+00CC LATIN CAPITAL LETTER I WITH GRAVE +=126 U+00E4 LATIN SMALL LETTER A WITH DIAERESIS +=127 U+00D2 LATIN CAPITAL LETTER O WITH GRAVE +=128 U+00C8 LATIN CAPITAL LETTER E WITH GRAVE +=129 U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS +=12A U+00AE REGISTERED SIGN +=12B U+00D5 LATIN CAPITAL LETTER O WITH TILDE +=12C U+00BC VULGAR FRACTION ONE QUARTER +=12D U+00D9 LATIN CAPITAL LETTER U WITH GRAVE +=12E U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX +=12F U+00DE LATIN CAPITAL LETTER THORN +=130 U+00F7 DIVISION SIGN +=131 U+00C3 LATIN CAPITAL LETTER A WITH TILDE +=132 U+00DA LATIN CAPITAL LETTER U WITH ACUTE +=133 U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX +=134 U+00AC NOT SIGN +=135 U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE +=136 U+00EF LATIN SMALL LETTER I WITH DIAERESIS +=137 U+00ED LATIN SMALL LETTER I WITH ACUTE +=138 U+00E1 LATIN SMALL LETTER A WITH ACUTE +=139 U+00B1 PLUS-MINUS SIGN +=13A U+00D7 MULTIPLICATION SIGN +=13B U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS +=13C U+2212 MINUS SIGN +=13D U+00B9 SUPERSCRIPT ONE +=13E U+00C9 LATIN CAPITAL LETTER E WITH ACUTE +=13F U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX +=140 U+00A9 COPYRIGHT SIGN +=141 U+00C0 LATIN CAPITAL LETTER A WITH GRAVE +=142 U+00F6 LATIN SMALL LETTER O WITH DIAERESIS +=143 U+00F3 LATIN SMALL LETTER O WITH ACUTE +=144 U+00B0 DEGREE SIGN +=145 U+00EC LATIN SMALL LETTER I WITH GRAVE +=146 U+00B5 MICRO SIGN +=147 U+00D3 LATIN CAPITAL LETTER O WITH ACUTE +=148 U+00F0 LATIN SMALL LETTER ETH +=149 U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS +=14A U+00DD LATIN CAPITAL LETTER Y WITH ACUTE +=14B U+00A6 BROKEN BAR +=14C U+00BD VULGAR FRACTION ONE HALF diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/cp1250.map b/dompdf/vendor/dompdf/php-font-lib/maps/cp1250.map new file mode 100644 index 0000000..33a555e --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/cp1250.map @@ -0,0 +1,251 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+015A Sacute +!8D U+0164 Tcaron +!8E U+017D Zcaron +!8F U+0179 Zacute +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+015B sacute +!9D U+0165 tcaron +!9E U+017E zcaron +!9F U+017A zacute +!A0 U+00A0 space +!A1 U+02C7 caron +!A2 U+02D8 breve +!A3 U+0141 Lslash +!A4 U+00A4 currency +!A5 U+0104 Aogonek +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+015E Scedilla +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+02DB ogonek +!B3 U+0142 lslash +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+0105 aogonek +!BA U+015F scedilla +!BB U+00BB guillemotright +!BC U+013D Lcaron +!BD U+02DD hungarumlaut +!BE U+013E lcaron +!BF U+017C zdotaccent +!C0 U+0154 Racute +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0139 Lacute +!C6 U+0106 Cacute +!C7 U+00C7 Ccedilla +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+011A Ecaron +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+010E Dcaron +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+0147 Ncaron +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0158 Rcaron +!D9 U+016E Uring +!DA U+00DA Uacute +!DB U+0170 Uhungarumlaut +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+0162 Tcommaaccent +!DF U+00DF germandbls +!E0 U+0155 racute +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+013A lacute +!E6 U+0107 cacute +!E7 U+00E7 ccedilla +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+011B ecaron +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+010F dcaron +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+0148 ncaron +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0159 rcaron +!F9 U+016F uring +!FA U+00FA uacute +!FB U+0171 uhungarumlaut +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+0163 tcommaaccent +!FF U+02D9 dotaccent diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/cp1251.map b/dompdf/vendor/dompdf/php-font-lib/maps/cp1251.map new file mode 100644 index 0000000..b5960fe --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/cp1251.map @@ -0,0 +1,255 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0402 afii10051 +!81 U+0403 afii10052 +!82 U+201A quotesinglbase +!83 U+0453 afii10100 +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+20AC Euro +!89 U+2030 perthousand +!8A U+0409 afii10058 +!8B U+2039 guilsinglleft +!8C U+040A afii10059 +!8D U+040C afii10061 +!8E U+040B afii10060 +!8F U+040F afii10145 +!90 U+0452 afii10099 +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9A U+0459 afii10106 +!9B U+203A guilsinglright +!9C U+045A afii10107 +!9D U+045C afii10109 +!9E U+045B afii10108 +!9F U+045F afii10193 +!A0 U+00A0 space +!A1 U+040E afii10062 +!A2 U+045E afii10110 +!A3 U+0408 afii10057 +!A4 U+00A4 currency +!A5 U+0490 afii10050 +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+0401 afii10023 +!A9 U+00A9 copyright +!AA U+0404 afii10053 +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+0407 afii10056 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+0406 afii10055 +!B3 U+0456 afii10103 +!B4 U+0491 afii10098 +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+0451 afii10071 +!B9 U+2116 afii61352 +!BA U+0454 afii10101 +!BB U+00BB guillemotright +!BC U+0458 afii10105 +!BD U+0405 afii10054 +!BE U+0455 afii10102 +!BF U+0457 afii10104 +!C0 U+0410 afii10017 +!C1 U+0411 afii10018 +!C2 U+0412 afii10019 +!C3 U+0413 afii10020 +!C4 U+0414 afii10021 +!C5 U+0415 afii10022 +!C6 U+0416 afii10024 +!C7 U+0417 afii10025 +!C8 U+0418 afii10026 +!C9 U+0419 afii10027 +!CA U+041A afii10028 +!CB U+041B afii10029 +!CC U+041C afii10030 +!CD U+041D afii10031 +!CE U+041E afii10032 +!CF U+041F afii10033 +!D0 U+0420 afii10034 +!D1 U+0421 afii10035 +!D2 U+0422 afii10036 +!D3 U+0423 afii10037 +!D4 U+0424 afii10038 +!D5 U+0425 afii10039 +!D6 U+0426 afii10040 +!D7 U+0427 afii10041 +!D8 U+0428 afii10042 +!D9 U+0429 afii10043 +!DA U+042A afii10044 +!DB U+042B afii10045 +!DC U+042C afii10046 +!DD U+042D afii10047 +!DE U+042E afii10048 +!DF U+042F afii10049 +!E0 U+0430 afii10065 +!E1 U+0431 afii10066 +!E2 U+0432 afii10067 +!E3 U+0433 afii10068 +!E4 U+0434 afii10069 +!E5 U+0435 afii10070 +!E6 U+0436 afii10072 +!E7 U+0437 afii10073 +!E8 U+0438 afii10074 +!E9 U+0439 afii10075 +!EA U+043A afii10076 +!EB U+043B afii10077 +!EC U+043C afii10078 +!ED U+043D afii10079 +!EE U+043E afii10080 +!EF U+043F afii10081 +!F0 U+0440 afii10082 +!F1 U+0441 afii10083 +!F2 U+0442 afii10084 +!F3 U+0443 afii10085 +!F4 U+0444 afii10086 +!F5 U+0445 afii10087 +!F6 U+0446 afii10088 +!F7 U+0447 afii10089 +!F8 U+0448 afii10090 +!F9 U+0449 afii10091 +!FA U+044A afii10092 +!FB U+044B afii10093 +!FC U+044C afii10094 +!FD U+044D afii10095 +!FE U+044E afii10096 +!FF U+044F afii10097 diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/cp1252.map b/dompdf/vendor/dompdf/php-font-lib/maps/cp1252.map new file mode 100644 index 0000000..b79015c --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/cp1252.map @@ -0,0 +1,251 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+0152 OE +!8E U+017D Zcaron +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+0153 oe +!9E U+017E zcaron +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/cp1253.map b/dompdf/vendor/dompdf/php-font-lib/maps/cp1253.map new file mode 100644 index 0000000..b5d843c --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/cp1253.map @@ -0,0 +1,239 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9B U+203A guilsinglright +!A0 U+00A0 space +!A1 U+0385 dieresistonos +!A2 U+0386 Alphatonos +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+2015 afii00208 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+0384 tonos +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+0388 Epsilontonos +!B9 U+0389 Etatonos +!BA U+038A Iotatonos +!BB U+00BB guillemotright +!BC U+038C Omicrontonos +!BD U+00BD onehalf +!BE U+038E Upsilontonos +!BF U+038F Omegatonos +!C0 U+0390 iotadieresistonos +!C1 U+0391 Alpha +!C2 U+0392 Beta +!C3 U+0393 Gamma +!C4 U+0394 Delta +!C5 U+0395 Epsilon +!C6 U+0396 Zeta +!C7 U+0397 Eta +!C8 U+0398 Theta +!C9 U+0399 Iota +!CA U+039A Kappa +!CB U+039B Lambda +!CC U+039C Mu +!CD U+039D Nu +!CE U+039E Xi +!CF U+039F Omicron +!D0 U+03A0 Pi +!D1 U+03A1 Rho +!D3 U+03A3 Sigma +!D4 U+03A4 Tau +!D5 U+03A5 Upsilon +!D6 U+03A6 Phi +!D7 U+03A7 Chi +!D8 U+03A8 Psi +!D9 U+03A9 Omega +!DA U+03AA Iotadieresis +!DB U+03AB Upsilondieresis +!DC U+03AC alphatonos +!DD U+03AD epsilontonos +!DE U+03AE etatonos +!DF U+03AF iotatonos +!E0 U+03B0 upsilondieresistonos +!E1 U+03B1 alpha +!E2 U+03B2 beta +!E3 U+03B3 gamma +!E4 U+03B4 delta +!E5 U+03B5 epsilon +!E6 U+03B6 zeta +!E7 U+03B7 eta +!E8 U+03B8 theta +!E9 U+03B9 iota +!EA U+03BA kappa +!EB U+03BB lambda +!EC U+03BC mu +!ED U+03BD nu +!EE U+03BE xi +!EF U+03BF omicron +!F0 U+03C0 pi +!F1 U+03C1 rho +!F2 U+03C2 sigma1 +!F3 U+03C3 sigma +!F4 U+03C4 tau +!F5 U+03C5 upsilon +!F6 U+03C6 phi +!F7 U+03C7 chi +!F8 U+03C8 psi +!F9 U+03C9 omega +!FA U+03CA iotadieresis +!FB U+03CB upsilondieresis +!FC U+03CC omicrontonos +!FD U+03CD upsilontonos +!FE U+03CE omegatonos diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/cp1254.map b/dompdf/vendor/dompdf/php-font-lib/maps/cp1254.map new file mode 100644 index 0000000..3cc8c78 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/cp1254.map @@ -0,0 +1,249 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+0152 OE +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+0153 oe +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+011E Gbreve +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0130 Idotaccent +!DE U+015E Scedilla +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+011F gbreve +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0131 dotlessi +!FE U+015F scedilla +!FF U+00FF ydieresis diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/cp1255.map b/dompdf/vendor/dompdf/php-font-lib/maps/cp1255.map new file mode 100644 index 0000000..fa13530 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/cp1255.map @@ -0,0 +1,233 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9B U+203A guilsinglright +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+20AA afii57636 +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00D7 multiply +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD sfthyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 middot +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00F7 divide +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+05B0 afii57799 +!C1 U+05B1 afii57801 +!C2 U+05B2 afii57800 +!C3 U+05B3 afii57802 +!C4 U+05B4 afii57793 +!C5 U+05B5 afii57794 +!C6 U+05B6 afii57795 +!C7 U+05B7 afii57798 +!C8 U+05B8 afii57797 +!C9 U+05B9 afii57806 +!CB U+05BB afii57796 +!CC U+05BC afii57807 +!CD U+05BD afii57839 +!CE U+05BE afii57645 +!CF U+05BF afii57841 +!D0 U+05C0 afii57842 +!D1 U+05C1 afii57804 +!D2 U+05C2 afii57803 +!D3 U+05C3 afii57658 +!D4 U+05F0 afii57716 +!D5 U+05F1 afii57717 +!D6 U+05F2 afii57718 +!D7 U+05F3 gereshhebrew +!D8 U+05F4 gershayimhebrew +!E0 U+05D0 afii57664 +!E1 U+05D1 afii57665 +!E2 U+05D2 afii57666 +!E3 U+05D3 afii57667 +!E4 U+05D4 afii57668 +!E5 U+05D5 afii57669 +!E6 U+05D6 afii57670 +!E7 U+05D7 afii57671 +!E8 U+05D8 afii57672 +!E9 U+05D9 afii57673 +!EA U+05DA afii57674 +!EB U+05DB afii57675 +!EC U+05DC afii57676 +!ED U+05DD afii57677 +!EE U+05DE afii57678 +!EF U+05DF afii57679 +!F0 U+05E0 afii57680 +!F1 U+05E1 afii57681 +!F2 U+05E2 afii57682 +!F3 U+05E3 afii57683 +!F4 U+05E4 afii57684 +!F5 U+05E5 afii57685 +!F6 U+05E6 afii57686 +!F7 U+05E7 afii57687 +!F8 U+05E8 afii57688 +!F9 U+05E9 afii57689 +!FA U+05EA afii57690 +!FD U+200E afii299 +!FE U+200F afii300 diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/cp1257.map b/dompdf/vendor/dompdf/php-font-lib/maps/cp1257.map new file mode 100644 index 0000000..077fdc3 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/cp1257.map @@ -0,0 +1,244 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!8D U+00A8 dieresis +!8E U+02C7 caron +!8F U+00B8 cedilla +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9B U+203A guilsinglright +!9D U+00AF macron +!9E U+02DB ogonek +!A0 U+00A0 space +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00D8 Oslash +!A9 U+00A9 copyright +!AA U+0156 Rcommaaccent +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00C6 AE +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00F8 oslash +!B9 U+00B9 onesuperior +!BA U+0157 rcommaaccent +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00E6 ae +!C0 U+0104 Aogonek +!C1 U+012E Iogonek +!C2 U+0100 Amacron +!C3 U+0106 Cacute +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+0118 Eogonek +!C7 U+0112 Emacron +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0179 Zacute +!CB U+0116 Edotaccent +!CC U+0122 Gcommaaccent +!CD U+0136 Kcommaaccent +!CE U+012A Imacron +!CF U+013B Lcommaaccent +!D0 U+0160 Scaron +!D1 U+0143 Nacute +!D2 U+0145 Ncommaaccent +!D3 U+00D3 Oacute +!D4 U+014C Omacron +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0172 Uogonek +!D9 U+0141 Lslash +!DA U+015A Sacute +!DB U+016A Umacron +!DC U+00DC Udieresis +!DD U+017B Zdotaccent +!DE U+017D Zcaron +!DF U+00DF germandbls +!E0 U+0105 aogonek +!E1 U+012F iogonek +!E2 U+0101 amacron +!E3 U+0107 cacute +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+0119 eogonek +!E7 U+0113 emacron +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+017A zacute +!EB U+0117 edotaccent +!EC U+0123 gcommaaccent +!ED U+0137 kcommaaccent +!EE U+012B imacron +!EF U+013C lcommaaccent +!F0 U+0161 scaron +!F1 U+0144 nacute +!F2 U+0146 ncommaaccent +!F3 U+00F3 oacute +!F4 U+014D omacron +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0173 uogonek +!F9 U+0142 lslash +!FA U+015B sacute +!FB U+016B umacron +!FC U+00FC udieresis +!FD U+017C zdotaccent +!FE U+017E zcaron +!FF U+02D9 dotaccent diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/cp1258.map b/dompdf/vendor/dompdf/php-font-lib/maps/cp1258.map new file mode 100644 index 0000000..7032c35 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/cp1258.map @@ -0,0 +1,247 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!8C U+0152 OE +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9B U+203A guilsinglright +!9C U+0153 oe +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+0300 gravecomb +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+0110 Dcroat +!D1 U+00D1 Ntilde +!D2 U+0309 hookabovecomb +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+01A0 Ohorn +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+01AF Uhorn +!DE U+0303 tildecomb +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+0301 acutecomb +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+0111 dcroat +!F1 U+00F1 ntilde +!F2 U+0323 dotbelowcomb +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+01A1 ohorn +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+01B0 uhorn +!FE U+20AB dong +!FF U+00FF ydieresis diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/cp874.map b/dompdf/vendor/dompdf/php-font-lib/maps/cp874.map new file mode 100644 index 0000000..16330d0 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/cp874.map @@ -0,0 +1,225 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!85 U+2026 ellipsis +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!A0 U+00A0 space +!A1 U+0E01 kokaithai +!A2 U+0E02 khokhaithai +!A3 U+0E03 khokhuatthai +!A4 U+0E04 khokhwaithai +!A5 U+0E05 khokhonthai +!A6 U+0E06 khorakhangthai +!A7 U+0E07 ngonguthai +!A8 U+0E08 chochanthai +!A9 U+0E09 chochingthai +!AA U+0E0A chochangthai +!AB U+0E0B sosothai +!AC U+0E0C chochoethai +!AD U+0E0D yoyingthai +!AE U+0E0E dochadathai +!AF U+0E0F topatakthai +!B0 U+0E10 thothanthai +!B1 U+0E11 thonangmonthothai +!B2 U+0E12 thophuthaothai +!B3 U+0E13 nonenthai +!B4 U+0E14 dodekthai +!B5 U+0E15 totaothai +!B6 U+0E16 thothungthai +!B7 U+0E17 thothahanthai +!B8 U+0E18 thothongthai +!B9 U+0E19 nonuthai +!BA U+0E1A bobaimaithai +!BB U+0E1B poplathai +!BC U+0E1C phophungthai +!BD U+0E1D fofathai +!BE U+0E1E phophanthai +!BF U+0E1F fofanthai +!C0 U+0E20 phosamphaothai +!C1 U+0E21 momathai +!C2 U+0E22 yoyakthai +!C3 U+0E23 roruathai +!C4 U+0E24 ruthai +!C5 U+0E25 lolingthai +!C6 U+0E26 luthai +!C7 U+0E27 wowaenthai +!C8 U+0E28 sosalathai +!C9 U+0E29 sorusithai +!CA U+0E2A sosuathai +!CB U+0E2B hohipthai +!CC U+0E2C lochulathai +!CD U+0E2D oangthai +!CE U+0E2E honokhukthai +!CF U+0E2F paiyannoithai +!D0 U+0E30 saraathai +!D1 U+0E31 maihanakatthai +!D2 U+0E32 saraaathai +!D3 U+0E33 saraamthai +!D4 U+0E34 saraithai +!D5 U+0E35 saraiithai +!D6 U+0E36 sarauethai +!D7 U+0E37 saraueethai +!D8 U+0E38 sarauthai +!D9 U+0E39 sarauuthai +!DA U+0E3A phinthuthai +!DF U+0E3F bahtthai +!E0 U+0E40 saraethai +!E1 U+0E41 saraaethai +!E2 U+0E42 saraothai +!E3 U+0E43 saraaimaimuanthai +!E4 U+0E44 saraaimaimalaithai +!E5 U+0E45 lakkhangyaothai +!E6 U+0E46 maiyamokthai +!E7 U+0E47 maitaikhuthai +!E8 U+0E48 maiekthai +!E9 U+0E49 maithothai +!EA U+0E4A maitrithai +!EB U+0E4B maichattawathai +!EC U+0E4C thanthakhatthai +!ED U+0E4D nikhahitthai +!EE U+0E4E yamakkanthai +!EF U+0E4F fongmanthai +!F0 U+0E50 zerothai +!F1 U+0E51 onethai +!F2 U+0E52 twothai +!F3 U+0E53 threethai +!F4 U+0E54 fourthai +!F5 U+0E55 fivethai +!F6 U+0E56 sixthai +!F7 U+0E57 seventhai +!F8 U+0E58 eightthai +!F9 U+0E59 ninethai +!FA U+0E5A angkhankhuthai +!FB U+0E5B khomutthai diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-1.map b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-1.map new file mode 100644 index 0000000..74fb2fe --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-1.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-11.map b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-11.map new file mode 100644 index 0000000..8cf6673 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-11.map @@ -0,0 +1,248 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0E01 kokaithai +!A2 U+0E02 khokhaithai +!A3 U+0E03 khokhuatthai +!A4 U+0E04 khokhwaithai +!A5 U+0E05 khokhonthai +!A6 U+0E06 khorakhangthai +!A7 U+0E07 ngonguthai +!A8 U+0E08 chochanthai +!A9 U+0E09 chochingthai +!AA U+0E0A chochangthai +!AB U+0E0B sosothai +!AC U+0E0C chochoethai +!AD U+0E0D yoyingthai +!AE U+0E0E dochadathai +!AF U+0E0F topatakthai +!B0 U+0E10 thothanthai +!B1 U+0E11 thonangmonthothai +!B2 U+0E12 thophuthaothai +!B3 U+0E13 nonenthai +!B4 U+0E14 dodekthai +!B5 U+0E15 totaothai +!B6 U+0E16 thothungthai +!B7 U+0E17 thothahanthai +!B8 U+0E18 thothongthai +!B9 U+0E19 nonuthai +!BA U+0E1A bobaimaithai +!BB U+0E1B poplathai +!BC U+0E1C phophungthai +!BD U+0E1D fofathai +!BE U+0E1E phophanthai +!BF U+0E1F fofanthai +!C0 U+0E20 phosamphaothai +!C1 U+0E21 momathai +!C2 U+0E22 yoyakthai +!C3 U+0E23 roruathai +!C4 U+0E24 ruthai +!C5 U+0E25 lolingthai +!C6 U+0E26 luthai +!C7 U+0E27 wowaenthai +!C8 U+0E28 sosalathai +!C9 U+0E29 sorusithai +!CA U+0E2A sosuathai +!CB U+0E2B hohipthai +!CC U+0E2C lochulathai +!CD U+0E2D oangthai +!CE U+0E2E honokhukthai +!CF U+0E2F paiyannoithai +!D0 U+0E30 saraathai +!D1 U+0E31 maihanakatthai +!D2 U+0E32 saraaathai +!D3 U+0E33 saraamthai +!D4 U+0E34 saraithai +!D5 U+0E35 saraiithai +!D6 U+0E36 sarauethai +!D7 U+0E37 saraueethai +!D8 U+0E38 sarauthai +!D9 U+0E39 sarauuthai +!DA U+0E3A phinthuthai +!DF U+0E3F bahtthai +!E0 U+0E40 saraethai +!E1 U+0E41 saraaethai +!E2 U+0E42 saraothai +!E3 U+0E43 saraaimaimuanthai +!E4 U+0E44 saraaimaimalaithai +!E5 U+0E45 lakkhangyaothai +!E6 U+0E46 maiyamokthai +!E7 U+0E47 maitaikhuthai +!E8 U+0E48 maiekthai +!E9 U+0E49 maithothai +!EA U+0E4A maitrithai +!EB U+0E4B maichattawathai +!EC U+0E4C thanthakhatthai +!ED U+0E4D nikhahitthai +!EE U+0E4E yamakkanthai +!EF U+0E4F fongmanthai +!F0 U+0E50 zerothai +!F1 U+0E51 onethai +!F2 U+0E52 twothai +!F3 U+0E53 threethai +!F4 U+0E54 fourthai +!F5 U+0E55 fivethai +!F6 U+0E56 sixthai +!F7 U+0E57 seventhai +!F8 U+0E58 eightthai +!F9 U+0E59 ninethai +!FA U+0E5A angkhankhuthai +!FB U+0E5B khomutthai diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-15.map b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-15.map new file mode 100644 index 0000000..2689703 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-15.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+20AC Euro +!A5 U+00A5 yen +!A6 U+0160 Scaron +!A7 U+00A7 section +!A8 U+0161 scaron +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+017D Zcaron +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+017E zcaron +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+0152 OE +!BD U+0153 oe +!BE U+0178 Ydieresis +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-16.map b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-16.map new file mode 100644 index 0000000..89b802a --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-16.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+0105 aogonek +!A3 U+0141 Lslash +!A4 U+20AC Euro +!A5 U+201E quotedblbase +!A6 U+0160 Scaron +!A7 U+00A7 section +!A8 U+0161 scaron +!A9 U+00A9 copyright +!AA U+0218 Scommaaccent +!AB U+00AB guillemotleft +!AC U+0179 Zacute +!AD U+00AD hyphen +!AE U+017A zacute +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+010C Ccaron +!B3 U+0142 lslash +!B4 U+017D Zcaron +!B5 U+201D quotedblright +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+017E zcaron +!B9 U+010D ccaron +!BA U+0219 scommaaccent +!BB U+00BB guillemotright +!BC U+0152 OE +!BD U+0153 oe +!BE U+0178 Ydieresis +!BF U+017C zdotaccent +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0106 Cacute +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+015A Sacute +!D8 U+0170 Uhungarumlaut +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0118 Eogonek +!DE U+021A Tcommaaccent +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+0107 cacute +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+015B sacute +!F8 U+0171 uhungarumlaut +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0119 eogonek +!FE U+021B tcommaaccent +!FF U+00FF ydieresis diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-2.map b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-2.map new file mode 100644 index 0000000..af9588d --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-2.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+02D8 breve +!A3 U+0141 Lslash +!A4 U+00A4 currency +!A5 U+013D Lcaron +!A6 U+015A Sacute +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+0160 Scaron +!AA U+015E Scedilla +!AB U+0164 Tcaron +!AC U+0179 Zacute +!AD U+00AD hyphen +!AE U+017D Zcaron +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+0105 aogonek +!B2 U+02DB ogonek +!B3 U+0142 lslash +!B4 U+00B4 acute +!B5 U+013E lcaron +!B6 U+015B sacute +!B7 U+02C7 caron +!B8 U+00B8 cedilla +!B9 U+0161 scaron +!BA U+015F scedilla +!BB U+0165 tcaron +!BC U+017A zacute +!BD U+02DD hungarumlaut +!BE U+017E zcaron +!BF U+017C zdotaccent +!C0 U+0154 Racute +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0139 Lacute +!C6 U+0106 Cacute +!C7 U+00C7 Ccedilla +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+011A Ecaron +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+010E Dcaron +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+0147 Ncaron +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0158 Rcaron +!D9 U+016E Uring +!DA U+00DA Uacute +!DB U+0170 Uhungarumlaut +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+0162 Tcommaaccent +!DF U+00DF germandbls +!E0 U+0155 racute +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+013A lacute +!E6 U+0107 cacute +!E7 U+00E7 ccedilla +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+011B ecaron +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+010F dcaron +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+0148 ncaron +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0159 rcaron +!F9 U+016F uring +!FA U+00FA uacute +!FB U+0171 uhungarumlaut +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+0163 tcommaaccent +!FF U+02D9 dotaccent diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-4.map b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-4.map new file mode 100644 index 0000000..e81dd7f --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-4.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+0138 kgreenlandic +!A3 U+0156 Rcommaaccent +!A4 U+00A4 currency +!A5 U+0128 Itilde +!A6 U+013B Lcommaaccent +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+0160 Scaron +!AA U+0112 Emacron +!AB U+0122 Gcommaaccent +!AC U+0166 Tbar +!AD U+00AD hyphen +!AE U+017D Zcaron +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+0105 aogonek +!B2 U+02DB ogonek +!B3 U+0157 rcommaaccent +!B4 U+00B4 acute +!B5 U+0129 itilde +!B6 U+013C lcommaaccent +!B7 U+02C7 caron +!B8 U+00B8 cedilla +!B9 U+0161 scaron +!BA U+0113 emacron +!BB U+0123 gcommaaccent +!BC U+0167 tbar +!BD U+014A Eng +!BE U+017E zcaron +!BF U+014B eng +!C0 U+0100 Amacron +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+012E Iogonek +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+0116 Edotaccent +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+012A Imacron +!D0 U+0110 Dcroat +!D1 U+0145 Ncommaaccent +!D2 U+014C Omacron +!D3 U+0136 Kcommaaccent +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+0172 Uogonek +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0168 Utilde +!DE U+016A Umacron +!DF U+00DF germandbls +!E0 U+0101 amacron +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+012F iogonek +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+0117 edotaccent +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+012B imacron +!F0 U+0111 dcroat +!F1 U+0146 ncommaaccent +!F2 U+014D omacron +!F3 U+0137 kcommaaccent +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+0173 uogonek +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0169 utilde +!FE U+016B umacron +!FF U+02D9 dotaccent diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-5.map b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-5.map new file mode 100644 index 0000000..8030fd5 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-5.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0401 afii10023 +!A2 U+0402 afii10051 +!A3 U+0403 afii10052 +!A4 U+0404 afii10053 +!A5 U+0405 afii10054 +!A6 U+0406 afii10055 +!A7 U+0407 afii10056 +!A8 U+0408 afii10057 +!A9 U+0409 afii10058 +!AA U+040A afii10059 +!AB U+040B afii10060 +!AC U+040C afii10061 +!AD U+00AD hyphen +!AE U+040E afii10062 +!AF U+040F afii10145 +!B0 U+0410 afii10017 +!B1 U+0411 afii10018 +!B2 U+0412 afii10019 +!B3 U+0413 afii10020 +!B4 U+0414 afii10021 +!B5 U+0415 afii10022 +!B6 U+0416 afii10024 +!B7 U+0417 afii10025 +!B8 U+0418 afii10026 +!B9 U+0419 afii10027 +!BA U+041A afii10028 +!BB U+041B afii10029 +!BC U+041C afii10030 +!BD U+041D afii10031 +!BE U+041E afii10032 +!BF U+041F afii10033 +!C0 U+0420 afii10034 +!C1 U+0421 afii10035 +!C2 U+0422 afii10036 +!C3 U+0423 afii10037 +!C4 U+0424 afii10038 +!C5 U+0425 afii10039 +!C6 U+0426 afii10040 +!C7 U+0427 afii10041 +!C8 U+0428 afii10042 +!C9 U+0429 afii10043 +!CA U+042A afii10044 +!CB U+042B afii10045 +!CC U+042C afii10046 +!CD U+042D afii10047 +!CE U+042E afii10048 +!CF U+042F afii10049 +!D0 U+0430 afii10065 +!D1 U+0431 afii10066 +!D2 U+0432 afii10067 +!D3 U+0433 afii10068 +!D4 U+0434 afii10069 +!D5 U+0435 afii10070 +!D6 U+0436 afii10072 +!D7 U+0437 afii10073 +!D8 U+0438 afii10074 +!D9 U+0439 afii10075 +!DA U+043A afii10076 +!DB U+043B afii10077 +!DC U+043C afii10078 +!DD U+043D afii10079 +!DE U+043E afii10080 +!DF U+043F afii10081 +!E0 U+0440 afii10082 +!E1 U+0441 afii10083 +!E2 U+0442 afii10084 +!E3 U+0443 afii10085 +!E4 U+0444 afii10086 +!E5 U+0445 afii10087 +!E6 U+0446 afii10088 +!E7 U+0447 afii10089 +!E8 U+0448 afii10090 +!E9 U+0449 afii10091 +!EA U+044A afii10092 +!EB U+044B afii10093 +!EC U+044C afii10094 +!ED U+044D afii10095 +!EE U+044E afii10096 +!EF U+044F afii10097 +!F0 U+2116 afii61352 +!F1 U+0451 afii10071 +!F2 U+0452 afii10099 +!F3 U+0453 afii10100 +!F4 U+0454 afii10101 +!F5 U+0455 afii10102 +!F6 U+0456 afii10103 +!F7 U+0457 afii10104 +!F8 U+0458 afii10105 +!F9 U+0459 afii10106 +!FA U+045A afii10107 +!FB U+045B afii10108 +!FC U+045C afii10109 +!FD U+00A7 section +!FE U+045E afii10110 +!FF U+045F afii10193 diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-7.map b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-7.map new file mode 100644 index 0000000..be8698a --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-7.map @@ -0,0 +1,250 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+2018 quoteleft +!A2 U+2019 quoteright +!A3 U+00A3 sterling +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AF U+2015 afii00208 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+0384 tonos +!B5 U+0385 dieresistonos +!B6 U+0386 Alphatonos +!B7 U+00B7 periodcentered +!B8 U+0388 Epsilontonos +!B9 U+0389 Etatonos +!BA U+038A Iotatonos +!BB U+00BB guillemotright +!BC U+038C Omicrontonos +!BD U+00BD onehalf +!BE U+038E Upsilontonos +!BF U+038F Omegatonos +!C0 U+0390 iotadieresistonos +!C1 U+0391 Alpha +!C2 U+0392 Beta +!C3 U+0393 Gamma +!C4 U+0394 Delta +!C5 U+0395 Epsilon +!C6 U+0396 Zeta +!C7 U+0397 Eta +!C8 U+0398 Theta +!C9 U+0399 Iota +!CA U+039A Kappa +!CB U+039B Lambda +!CC U+039C Mu +!CD U+039D Nu +!CE U+039E Xi +!CF U+039F Omicron +!D0 U+03A0 Pi +!D1 U+03A1 Rho +!D3 U+03A3 Sigma +!D4 U+03A4 Tau +!D5 U+03A5 Upsilon +!D6 U+03A6 Phi +!D7 U+03A7 Chi +!D8 U+03A8 Psi +!D9 U+03A9 Omega +!DA U+03AA Iotadieresis +!DB U+03AB Upsilondieresis +!DC U+03AC alphatonos +!DD U+03AD epsilontonos +!DE U+03AE etatonos +!DF U+03AF iotatonos +!E0 U+03B0 upsilondieresistonos +!E1 U+03B1 alpha +!E2 U+03B2 beta +!E3 U+03B3 gamma +!E4 U+03B4 delta +!E5 U+03B5 epsilon +!E6 U+03B6 zeta +!E7 U+03B7 eta +!E8 U+03B8 theta +!E9 U+03B9 iota +!EA U+03BA kappa +!EB U+03BB lambda +!EC U+03BC mu +!ED U+03BD nu +!EE U+03BE xi +!EF U+03BF omicron +!F0 U+03C0 pi +!F1 U+03C1 rho +!F2 U+03C2 sigma1 +!F3 U+03C3 sigma +!F4 U+03C4 tau +!F5 U+03C5 upsilon +!F6 U+03C6 phi +!F7 U+03C7 chi +!F8 U+03C8 psi +!F9 U+03C9 omega +!FA U+03CA iotadieresis +!FB U+03CB upsilondieresis +!FC U+03CC omicrontonos +!FD U+03CD upsilontonos +!FE U+03CE omegatonos diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-9.map b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-9.map new file mode 100644 index 0000000..a60bb19 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/iso-8859-9.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+011E Gbreve +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0130 Idotaccent +!DE U+015E Scedilla +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+011F gbreve +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0131 dotlessi +!FE U+015F scedilla +!FF U+00FF ydieresis diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/koi8-r.map b/dompdf/vendor/dompdf/php-font-lib/maps/koi8-r.map new file mode 100644 index 0000000..026880d --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/koi8-r.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+2500 SF100000 +!81 U+2502 SF110000 +!82 U+250C SF010000 +!83 U+2510 SF030000 +!84 U+2514 SF020000 +!85 U+2518 SF040000 +!86 U+251C SF080000 +!87 U+2524 SF090000 +!88 U+252C SF060000 +!89 U+2534 SF070000 +!8A U+253C SF050000 +!8B U+2580 upblock +!8C U+2584 dnblock +!8D U+2588 block +!8E U+258C lfblock +!8F U+2590 rtblock +!90 U+2591 ltshade +!91 U+2592 shade +!92 U+2593 dkshade +!93 U+2320 integraltp +!94 U+25A0 filledbox +!95 U+2219 periodcentered +!96 U+221A radical +!97 U+2248 approxequal +!98 U+2264 lessequal +!99 U+2265 greaterequal +!9A U+00A0 space +!9B U+2321 integralbt +!9C U+00B0 degree +!9D U+00B2 twosuperior +!9E U+00B7 periodcentered +!9F U+00F7 divide +!A0 U+2550 SF430000 +!A1 U+2551 SF240000 +!A2 U+2552 SF510000 +!A3 U+0451 afii10071 +!A4 U+2553 SF520000 +!A5 U+2554 SF390000 +!A6 U+2555 SF220000 +!A7 U+2556 SF210000 +!A8 U+2557 SF250000 +!A9 U+2558 SF500000 +!AA U+2559 SF490000 +!AB U+255A SF380000 +!AC U+255B SF280000 +!AD U+255C SF270000 +!AE U+255D SF260000 +!AF U+255E SF360000 +!B0 U+255F SF370000 +!B1 U+2560 SF420000 +!B2 U+2561 SF190000 +!B3 U+0401 afii10023 +!B4 U+2562 SF200000 +!B5 U+2563 SF230000 +!B6 U+2564 SF470000 +!B7 U+2565 SF480000 +!B8 U+2566 SF410000 +!B9 U+2567 SF450000 +!BA U+2568 SF460000 +!BB U+2569 SF400000 +!BC U+256A SF540000 +!BD U+256B SF530000 +!BE U+256C SF440000 +!BF U+00A9 copyright +!C0 U+044E afii10096 +!C1 U+0430 afii10065 +!C2 U+0431 afii10066 +!C3 U+0446 afii10088 +!C4 U+0434 afii10069 +!C5 U+0435 afii10070 +!C6 U+0444 afii10086 +!C7 U+0433 afii10068 +!C8 U+0445 afii10087 +!C9 U+0438 afii10074 +!CA U+0439 afii10075 +!CB U+043A afii10076 +!CC U+043B afii10077 +!CD U+043C afii10078 +!CE U+043D afii10079 +!CF U+043E afii10080 +!D0 U+043F afii10081 +!D1 U+044F afii10097 +!D2 U+0440 afii10082 +!D3 U+0441 afii10083 +!D4 U+0442 afii10084 +!D5 U+0443 afii10085 +!D6 U+0436 afii10072 +!D7 U+0432 afii10067 +!D8 U+044C afii10094 +!D9 U+044B afii10093 +!DA U+0437 afii10073 +!DB U+0448 afii10090 +!DC U+044D afii10095 +!DD U+0449 afii10091 +!DE U+0447 afii10089 +!DF U+044A afii10092 +!E0 U+042E afii10048 +!E1 U+0410 afii10017 +!E2 U+0411 afii10018 +!E3 U+0426 afii10040 +!E4 U+0414 afii10021 +!E5 U+0415 afii10022 +!E6 U+0424 afii10038 +!E7 U+0413 afii10020 +!E8 U+0425 afii10039 +!E9 U+0418 afii10026 +!EA U+0419 afii10027 +!EB U+041A afii10028 +!EC U+041B afii10029 +!ED U+041C afii10030 +!EE U+041D afii10031 +!EF U+041E afii10032 +!F0 U+041F afii10033 +!F1 U+042F afii10049 +!F2 U+0420 afii10034 +!F3 U+0421 afii10035 +!F4 U+0422 afii10036 +!F5 U+0423 afii10037 +!F6 U+0416 afii10024 +!F7 U+0412 afii10019 +!F8 U+042C afii10046 +!F9 U+042B afii10045 +!FA U+0417 afii10025 +!FB U+0428 afii10042 +!FC U+042D afii10047 +!FD U+0429 afii10043 +!FE U+0427 afii10041 +!FF U+042A afii10044 diff --git a/dompdf/vendor/dompdf/php-font-lib/maps/koi8-u.map b/dompdf/vendor/dompdf/php-font-lib/maps/koi8-u.map new file mode 100644 index 0000000..97d9d03 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/maps/koi8-u.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+2500 SF100000 +!81 U+2502 SF110000 +!82 U+250C SF010000 +!83 U+2510 SF030000 +!84 U+2514 SF020000 +!85 U+2518 SF040000 +!86 U+251C SF080000 +!87 U+2524 SF090000 +!88 U+252C SF060000 +!89 U+2534 SF070000 +!8A U+253C SF050000 +!8B U+2580 upblock +!8C U+2584 dnblock +!8D U+2588 block +!8E U+258C lfblock +!8F U+2590 rtblock +!90 U+2591 ltshade +!91 U+2592 shade +!92 U+2593 dkshade +!93 U+2320 integraltp +!94 U+25A0 filledbox +!95 U+2022 bullet +!96 U+221A radical +!97 U+2248 approxequal +!98 U+2264 lessequal +!99 U+2265 greaterequal +!9A U+00A0 space +!9B U+2321 integralbt +!9C U+00B0 degree +!9D U+00B2 twosuperior +!9E U+00B7 periodcentered +!9F U+00F7 divide +!A0 U+2550 SF430000 +!A1 U+2551 SF240000 +!A2 U+2552 SF510000 +!A3 U+0451 afii10071 +!A4 U+0454 afii10101 +!A5 U+2554 SF390000 +!A6 U+0456 afii10103 +!A7 U+0457 afii10104 +!A8 U+2557 SF250000 +!A9 U+2558 SF500000 +!AA U+2559 SF490000 +!AB U+255A SF380000 +!AC U+255B SF280000 +!AD U+0491 afii10098 +!AE U+255D SF260000 +!AF U+255E SF360000 +!B0 U+255F SF370000 +!B1 U+2560 SF420000 +!B2 U+2561 SF190000 +!B3 U+0401 afii10023 +!B4 U+0404 afii10053 +!B5 U+2563 SF230000 +!B6 U+0406 afii10055 +!B7 U+0407 afii10056 +!B8 U+2566 SF410000 +!B9 U+2567 SF450000 +!BA U+2568 SF460000 +!BB U+2569 SF400000 +!BC U+256A SF540000 +!BD U+0490 afii10050 +!BE U+256C SF440000 +!BF U+00A9 copyright +!C0 U+044E afii10096 +!C1 U+0430 afii10065 +!C2 U+0431 afii10066 +!C3 U+0446 afii10088 +!C4 U+0434 afii10069 +!C5 U+0435 afii10070 +!C6 U+0444 afii10086 +!C7 U+0433 afii10068 +!C8 U+0445 afii10087 +!C9 U+0438 afii10074 +!CA U+0439 afii10075 +!CB U+043A afii10076 +!CC U+043B afii10077 +!CD U+043C afii10078 +!CE U+043D afii10079 +!CF U+043E afii10080 +!D0 U+043F afii10081 +!D1 U+044F afii10097 +!D2 U+0440 afii10082 +!D3 U+0441 afii10083 +!D4 U+0442 afii10084 +!D5 U+0443 afii10085 +!D6 U+0436 afii10072 +!D7 U+0432 afii10067 +!D8 U+044C afii10094 +!D9 U+044B afii10093 +!DA U+0437 afii10073 +!DB U+0448 afii10090 +!DC U+044D afii10095 +!DD U+0449 afii10091 +!DE U+0447 afii10089 +!DF U+044A afii10092 +!E0 U+042E afii10048 +!E1 U+0410 afii10017 +!E2 U+0411 afii10018 +!E3 U+0426 afii10040 +!E4 U+0414 afii10021 +!E5 U+0415 afii10022 +!E6 U+0424 afii10038 +!E7 U+0413 afii10020 +!E8 U+0425 afii10039 +!E9 U+0418 afii10026 +!EA U+0419 afii10027 +!EB U+041A afii10028 +!EC U+041B afii10029 +!ED U+041C afii10030 +!EE U+041D afii10031 +!EF U+041E afii10032 +!F0 U+041F afii10033 +!F1 U+042F afii10049 +!F2 U+0420 afii10034 +!F3 U+0421 afii10035 +!F4 U+0422 afii10036 +!F5 U+0423 afii10037 +!F6 U+0416 afii10024 +!F7 U+0412 afii10019 +!F8 U+042C afii10046 +!F9 U+042B afii10045 +!FA U+0417 afii10025 +!FB U+0428 afii10042 +!FC U+042D afii10047 +!FD U+0429 afii10043 +!FE U+0427 afii10041 +!FF U+042A afii10044 diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/AdobeFontMetrics.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/AdobeFontMetrics.php new file mode 100644 index 0000000..eeaeb89 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/AdobeFontMetrics.php @@ -0,0 +1,252 @@ +font = $font; + } + + function write($file, $encoding = null) { + $map_data = array(); + + if ($encoding) { + $encoding = preg_replace("/[^a-z0-9-_]/", "", $encoding); + $map_file = dirname(__FILE__) . "/../../maps/$encoding.map"; + if (!file_exists($map_file)) { + throw new \Exception("Unknown encoding ($encoding)"); + } + + $map = new EncodingMap($map_file); + $map_data = $map->parse(); + } + + $this->f = fopen($file, "w+"); + + $font = $this->font; + + $this->startSection("FontMetrics", 4.1); + $this->addPair("Notice", "Converted by PHP-font-lib"); + $this->addPair("Comment", "https://github.com/dompdf/php-font-lib"); + + $encoding_scheme = ($encoding ? $encoding : "FontSpecific"); + $this->addPair("EncodingScheme", $encoding_scheme); + + $records = $font->getData("name", "records"); + foreach ($records as $id => $record) { + if (!isset(name::$nameIdCodes[$id]) || preg_match("/[\r\n]/", $record->string)) { + continue; + } + + $this->addPair(name::$nameIdCodes[$id], $record->string); + } + + $os2 = $font->getData("OS/2"); + $this->addPair("Weight", ($os2["usWeightClass"] > 400 ? "Bold" : "Medium")); + + $post = $font->getData("post"); + $this->addPair("ItalicAngle", $post["italicAngle"]); + $this->addPair("IsFixedPitch", ($post["isFixedPitch"] ? "true" : "false")); + $this->addPair("UnderlineThickness", $font->normalizeFUnit($post["underlineThickness"])); + $this->addPair("UnderlinePosition", $font->normalizeFUnit($post["underlinePosition"])); + + $hhea = $font->getData("hhea"); + + if (isset($hhea["ascent"])) { + $this->addPair("FontHeightOffset", $font->normalizeFUnit($hhea["lineGap"])); + } + else { + $this->addPair("FontHeightOffset", $font->normalizeFUnit($os2["typoLineGap"])); + } + + $glyf = $font->getData("glyf"); + $glyphIndexArray = $font->getUnicodeCharMap(); + $hasGlyphs = $glyf instanceof glyf && is_array($glyphIndexArray); + + // capHeight is based on capital H + if ($hasGlyphs && \array_key_exists(72, $glyphIndexArray)) { + $upperH = $glyf[$glyphIndexArray[72]]; + $upperH->parseData(); + $this->addPair("CapHeight", $font->normalizeFUnit($upperH->yMax)); + } + + // xHeight is based on lowercase x + if ($hasGlyphs && \array_key_exists(120, $glyphIndexArray)) { + $lowerX = $glyf[$glyphIndexArray[120]]; + $lowerX->parseData(); + $this->addPair("XHeight", $font->normalizeFUnit($lowerX->yMax)); + } + + // ascender is based on lowercase d + if ($hasGlyphs && \array_key_exists(100, $glyphIndexArray)) { + $lowerD = $glyf[$glyphIndexArray[100]]; + $lowerD->parseData(); + $this->addPair("Ascender", $font->normalizeFUnit($lowerD->yMax)); + } elseif (isset($hhea["ascent"])) { + $this->addPair("Ascender", $font->normalizeFUnit($hhea["ascent"])); + } + else { + $this->addPair("Ascender", $font->normalizeFUnit($os2["typoAscender"])); + } + + // descender is based on lowercase p + if ($hasGlyphs && \array_key_exists(112, $glyphIndexArray)) { + $lowerP = $glyf[$glyphIndexArray[112]]; + $lowerP->parseData(); + $this->addPair("Descender", $font->normalizeFUnit($lowerP->yMin)); + } elseif (isset($hhea["descent"])) { + $this->addPair("Descender", $font->normalizeFUnit($hhea["descent"])); + } + else { + $this->addPair("Descender", -abs($font->normalizeFUnit($os2["typoDescender"]))); + } + + $head = $font->getData("head"); + $this->addArray("FontBBox", array( + $font->normalizeFUnit($head["xMin"]), + $font->normalizeFUnit($head["yMin"]), + $font->normalizeFUnit($head["xMax"]), + $font->normalizeFUnit($head["yMax"]), + )); + + if ($glyphIndexArray) { + $hmtx = $font->getData("hmtx"); + $names = $font->getData("post", "names"); + + $this->startSection("CharMetrics", count($hmtx)); + + if ($encoding) { + foreach ($map_data as $code => $value) { + list($c, $name) = $value; + + if (!isset($glyphIndexArray[$c])) { + continue; + } + + $g = $glyphIndexArray[$c]; + + if (!isset($hmtx[$g])) { + $hmtx[$g] = $hmtx[0]; + } + + $this->addMetric(array( + "C" => ($code > 255 ? -1 : $code), + "WX" => $font->normalizeFUnit($hmtx[$g][0]), + "N" => $name, + )); + } + } + else { + foreach ($glyphIndexArray as $c => $g) { + if (!isset($hmtx[$g])) { + $hmtx[$g] = $hmtx[0]; + } + + $this->addMetric(array( + "U" => $c, + "WX" => $font->normalizeFUnit($hmtx[$g][0]), + "N" => (isset($names[$g]) ? $names[$g] : sprintf("uni%04x", $c)), + "G" => $g, + )); + } + } + + $this->endSection("CharMetrics"); + + $kern = $font->getData("kern", "subtable"); + $tree = is_array($kern) ? $kern["tree"] : null; + + if (!$encoding && is_array($tree)) { + $this->startSection("KernData"); + $this->startSection("KernPairs", count($tree, COUNT_RECURSIVE) - count($tree)); + + foreach ($tree as $left => $values) { + if (!is_array($values)) { + continue; + } + if (!isset($glyphIndexArray[$left])) { + continue; + } + + $left_gid = $glyphIndexArray[$left]; + + if (!isset($names[$left_gid])) { + continue; + } + + $left_name = $names[$left_gid]; + + $this->addLine(""); + + foreach ($values as $right => $value) { + if (!isset($glyphIndexArray[$right])) { + continue; + } + + $right_gid = $glyphIndexArray[$right]; + + if (!isset($names[$right_gid])) { + continue; + } + + $right_name = $names[$right_gid]; + $this->addPair("KPX", "$left_name $right_name $value"); + } + } + + $this->endSection("KernPairs"); + $this->endSection("KernData"); + } + } + + $this->endSection("FontMetrics"); + } + + function addLine($line) { + fwrite($this->f, "$line\n"); + } + + function addPair($key, $value) { + $this->addLine("$key $value"); + } + + function addArray($key, $array) { + $this->addLine("$key " . implode(" ", $array)); + } + + function addMetric($data) { + $array = array(); + foreach ($data as $key => $value) { + $array[] = "$key $value"; + } + $this->addLine(implode(" ; ", $array)); + } + + function startSection($name, $value = "") { + $this->addLine("Start$name $value"); + } + + function endSection($name) { + $this->addLine("End$name"); + } +} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/BinaryStream.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/BinaryStream.php new file mode 100644 index 0000000..cc5e72c --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/BinaryStream.php @@ -0,0 +1,448 @@ +open($filename, self::modeRead); + } + + /** + * Open a font file in a chosen mode + * + * @param string $filename The file name of the font to open + * @param string $mode The opening mode + * + * @throws \Exception + * @return bool + */ + public function open($filename, $mode = self::modeRead) { + if (!in_array($mode, array(self::modeRead, self::modeWrite, self::modeReadWrite))) { + throw new \Exception("Unknown file open mode"); + } + + $this->f = fopen($filename, $mode); + + return $this->f != false; + } + + /** + * Close the internal file pointer + */ + public function close() { + return fclose($this->f) != false; + } + + /** + * Change the internal file pointer + * + * @param resource $fp + * + * @throws \Exception + */ + public function setFile($fp) { + if (!is_resource($fp)) { + throw new \Exception('$fp is not a valid resource'); + } + + $this->f = $fp; + } + + /** + * Create a temporary file in write mode + * + * @param bool $allow_memory Allow in-memory files + * + * @return resource the temporary file pointer resource + */ + public static function getTempFile($allow_memory = true) { + $f = null; + + if ($allow_memory) { + $f = fopen("php://temp", "rb+"); + } + else { + $f = fopen(tempnam(sys_get_temp_dir(), "fnt"), "rb+"); + } + + return $f; + } + + /** + * Move the internal file pinter to $offset bytes + * + * @param int $offset + * + * @return bool True if the $offset position exists in the file + */ + public function seek($offset) { + return fseek($this->f, $offset, SEEK_SET) == 0; + } + + /** + * Gives the current position in the file + * + * @return int The current position + */ + public function pos() { + return ftell($this->f); + } + + public function skip($n) { + fseek($this->f, $n, SEEK_CUR); + } + + /** + * @param int $n The number of bytes to read + * + * @return string + */ + public function read($n) { + if ($n < 1) { + return ""; + } + + return (string) fread($this->f, $n); + } + + public function write($data, $length = null) { + if ($data === null || $data === "" || $data === false) { + return 0; + } + + return fwrite($this->f, $data, $length); + } + + public function readUInt8() { + return ord($this->read(1)); + } + + public function readUInt8Many($count) { + return array_values(unpack("C*", $this->read($count))); + } + + public function writeUInt8($data) { + return $this->write(chr($data), 1); + } + + public function readInt8() { + $v = $this->readUInt8(); + + if ($v >= 0x80) { + $v -= 0x100; + } + + return $v; + } + + public function readInt8Many($count) { + return array_values(unpack("c*", $this->read($count))); + } + + public function writeInt8($data) { + if ($data < 0) { + $data += 0x100; + } + + return $this->writeUInt8($data); + } + + public function readUInt16() { + $a = unpack("nn", $this->read(2)); + + return $a["n"]; + } + + public function readUInt16Many($count) { + return array_values(unpack("n*", $this->read($count * 2))); + } + + public function readUFWord() { + return $this->readUInt16(); + } + + public function writeUInt16($data) { + return $this->write(pack("n", $data), 2); + } + + public function writeUFWord($data) { + return $this->writeUInt16($data); + } + + public function readInt16() { + $a = unpack("nn", $this->read(2)); + $v = $a["n"]; + + if ($v >= 0x8000) { + $v -= 0x10000; + } + + return $v; + } + + public function readInt16Many($count) { + $vals = array_values(unpack("n*", $this->read($count * 2))); + foreach ($vals as &$v) { + if ($v >= 0x8000) { + $v -= 0x10000; + } + } + + return $vals; + } + + public function readFWord() { + return $this->readInt16(); + } + + public function writeInt16($data) { + if ($data < 0) { + $data += 0x10000; + } + + return $this->writeUInt16($data); + } + + public function writeFWord($data) { + return $this->writeInt16($data); + } + + public function readUInt32() { + $a = unpack("NN", $this->read(4)); + + return $a["N"]; + } + + public function writeUInt32($data) { + return $this->write(pack("N", $data), 4); + } + + public function readFixed() { + $d = $this->readInt16(); + $d2 = $this->readUInt16(); + + return round($d + $d2 / 0x10000, 4); + } + + public function writeFixed($data) { + $left = floor($data); + $right = ($data - $left) * 0x10000; + + return $this->writeInt16($left) + $this->writeUInt16($right); + } + + public function readLongDateTime() { + $this->readUInt32(); // ignored + $date = $this->readUInt32() - 2082844800; + + # PHP_INT_MIN isn't defined in PHP < 7.0 + $php_int_min = defined("PHP_INT_MIN") ? PHP_INT_MIN : ~PHP_INT_MAX; + + if (is_string($date) || $date > PHP_INT_MAX || $date < $php_int_min) { + $date = 0; + } + + return date("Y-m-d H:i:s", $date); + } + + public function writeLongDateTime($data) { + $date = strtotime($data); + $date += 2082844800; + + return $this->writeUInt32(0) + $this->writeUInt32($date); + } + + public function unpack($def) { + $d = array(); + foreach ($def as $name => $type) { + $d[$name] = $this->r($type); + } + + return $d; + } + + public function pack($def, $data) { + $bytes = 0; + foreach ($def as $name => $type) { + $bytes += $this->w($type, $data[$name]); + } + + return $bytes; + } + + /** + * Read a data of type $type in the file from the current position + * + * @param mixed $type The data type to read + * + * @return mixed The data that was read + */ + public function r($type) { + switch ($type) { + case self::uint8: + return $this->readUInt8(); + case self::int8: + return $this->readInt8(); + case self::uint16: + return $this->readUInt16(); + case self::int16: + return $this->readInt16(); + case self::uint32: + return $this->readUInt32(); + case self::int32: + return $this->readUInt32(); + case self::shortFrac: + return $this->readFixed(); + case self::Fixed: + return $this->readFixed(); + case self::FWord: + return $this->readInt16(); + case self::uFWord: + return $this->readUInt16(); + case self::F2Dot14: + return $this->readInt16(); + case self::longDateTime: + return $this->readLongDateTime(); + case self::char: + return $this->read(1); + default: + if (is_array($type)) { + if ($type[0] == self::char) { + return $this->read($type[1]); + } + if ($type[0] == self::uint16) { + return $this->readUInt16Many($type[1]); + } + if ($type[0] == self::int16) { + return $this->readInt16Many($type[1]); + } + if ($type[0] == self::uint8) { + return $this->readUInt8Many($type[1]); + } + if ($type[0] == self::int8) { + return $this->readInt8Many($type[1]); + } + + $ret = array(); + for ($i = 0; $i < $type[1]; $i++) { + $ret[] = $this->r($type[0]); + } + + return $ret; + } + + return null; + } + } + + /** + * Write $data of type $type in the file from the current position + * + * @param mixed $type The data type to write + * @param mixed $data The data to write + * + * @return int The number of bytes read + */ + public function w($type, $data) { + switch ($type) { + case self::uint8: + return $this->writeUInt8($data); + case self::int8: + return $this->writeInt8($data); + case self::uint16: + return $this->writeUInt16($data); + case self::int16: + return $this->writeInt16($data); + case self::uint32: + return $this->writeUInt32($data); + case self::int32: + return $this->writeUInt32($data); + case self::shortFrac: + return $this->writeFixed($data); + case self::Fixed: + return $this->writeFixed($data); + case self::FWord: + return $this->writeInt16($data); + case self::uFWord: + return $this->writeUInt16($data); + case self::F2Dot14: + return $this->writeInt16($data); + case self::longDateTime: + return $this->writeLongDateTime($data); + case self::char: + return $this->write($data, 1); + default: + if (is_array($type)) { + if ($type[0] == self::char) { + return $this->write($data, $type[1]); + } + + $ret = 0; + for ($i = 0; $i < $type[1]; $i++) { + if (isset($data[$i])) { + $ret += $this->w($type[0], $data[$i]); + } + } + + return $ret; + } + + return null; + } + } + + /** + * Converts a Uint32 value to string + * + * @param int $uint32 + * + * @return string The string + */ + public function convertUInt32ToStr($uint32) { + return chr(($uint32 >> 24) & 0xFF) . chr(($uint32 >> 16) & 0xFF) . chr(($uint32 >> 8) & 0xFF) . chr($uint32 & 0xFF); + } +} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/EOT/File.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/EOT/File.php new file mode 100644 index 0000000..fb07cdd --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/EOT/File.php @@ -0,0 +1,158 @@ +header)) { + return; + } + + $this->header = new Header($this); + $this->header->parse(); + } + + function parse() { + $this->parseHeader(); + + $flags = $this->header->data["Flags"]; + + if ($flags & self::TTEMBED_TTCOMPRESSED) { + $mtx_version = $this->readUInt8(); + $mtx_copy_limit = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8(); + $mtx_offset_1 = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8(); + $mtx_offset_2 = $this->readUInt8() << 16 | $this->readUInt8() << 8 | $this->readUInt8(); + /* + var_dump("$mtx_version $mtx_copy_limit $mtx_offset_1 $mtx_offset_2"); + + $pos = $this->pos(); + $size = $mtx_offset_1 - $pos; + var_dump("pos: $pos"); + var_dump("size: $size");*/ + } + + if ($flags & self::TTEMBED_XORENCRYPTDATA) { + // Process XOR + } + // TODO Read font data ... + } + + /** + * Little endian version of the read method + * + * @param int $n The number of bytes to read + * + * @return string + */ + public function read($n) { + if ($n < 1) { + return ""; + } + + $string = (string) fread($this->f, $n); + $chunks = mb_str_split($string, 2, '8bit'); + $chunks = array_map("strrev", $chunks); + return implode("", $chunks); + } + + public function readUInt32() { + $uint32 = parent::readUInt32(); + + return $uint32 >> 16 & 0x0000FFFF | $uint32 << 16 & 0xFFFF0000; + } + + /** + * Get font copyright + * + * @return string|null + */ + function getFontCopyright() { + return null; + } + + /** + * Get font name + * + * @return string|null + */ + function getFontName() { + return $this->header->data["FamilyName"]; + } + + /** + * Get font subfamily + * + * @return string|null + */ + function getFontSubfamily() { + return $this->header->data["StyleName"]; + } + + /** + * Get font subfamily ID + * + * @return string|null + */ + function getFontSubfamilyID() { + return $this->header->data["StyleName"]; + } + + /** + * Get font full name + * + * @return string|null + */ + function getFontFullName() { + return $this->header->data["FullName"]; + } + + /** + * Get font version + * + * @return string|null + */ + function getFontVersion() { + return $this->header->data["VersionName"]; + } + + /** + * Get font weight + * + * @return string|null + */ + function getFontWeight() { + return $this->header->data["Weight"]; + } + + /** + * Get font Postscript name + * + * @return string|null + */ + function getFontPostscriptName() { + return null; + } +} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/EOT/Header.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/EOT/Header.php new file mode 100644 index 0000000..492da8a --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/EOT/Header.php @@ -0,0 +1,112 @@ + self::uint32, + "numTables" => self::uint16, + "searchRange" => self::uint16, + "entrySelector" => self::uint16, + "rangeShift" => self::uint16, + ); + + public function parse() { + $font = $this->font; + + $this->data = $font->unpack(array( + "EOTSize" => self::uint32, + "FontDataSize" => self::uint32, + "Version" => self::uint32, + "Flags" => self::uint32, + "FontPANOSE" => array(self::uint8, 10), + "Charset" => self::uint8, + "Italic" => self::uint8, + "Weight" => self::uint32, + "fsType" => self::uint16, + "MagicNumber" => self::uint16, + "UnicodeRange1" => self::uint32, + "UnicodeRange2" => self::uint32, + "UnicodeRange3" => self::uint32, + "UnicodeRange4" => self::uint32, + "CodePageRange1" => self::uint32, + "CodePageRange2" => self::uint32, + "CheckSumAdjustment" => self::uint32, + "Reserved1" => self::uint32, + "Reserved2" => self::uint32, + "Reserved3" => self::uint32, + "Reserved4" => self::uint32, + )); + + $this->data["Padding1"] = $font->readUInt16(); + $this->readString("FamilyName"); + + $this->data["Padding2"] = $font->readUInt16(); + $this->readString("StyleName"); + + $this->data["Padding3"] = $font->readUInt16(); + $this->readString("VersionName"); + + $this->data["Padding4"] = $font->readUInt16(); + $this->readString("FullName"); + + switch ($this->data["Version"]) { + default: + throw new Exception("Unknown EOT version " . $this->data["Version"]); + + case 0x00010000: + // Nothing to do more + break; + + case 0x00020001: + $this->data["Padding5"] = $font->readUInt16(); + $this->readString("RootString"); + break; + + case 0x00020002: + $this->data["Padding5"] = $font->readUInt16(); + $this->readString("RootString"); + + $this->data["RootStringCheckSum"] = $font->readUInt32(); + $this->data["EUDCCodePage"] = $font->readUInt32(); + + $this->data["Padding6"] = $font->readUInt16(); + $this->readString("Signature"); + + $this->data["EUDCFlags"] = $font->readUInt32(); + $this->data["EUDCFontSize"] = $font->readUInt32(); + break; + } + + if (!empty($this->data["RootString"])) { + $this->data["RootString"] = explode("\0", $this->data["RootString"]); + } + } + + private function readString($name) { + $font = $this->font; + $size = $font->readUInt16(); + + $this->data["{$name}Size"] = $size; + $this->data[$name] = Font::UTF16ToUTF8($font->read($size)); + } + + public function encode() { + //return $this->font->pack($this->def, $this->data); + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/EncodingMap.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/EncodingMap.php new file mode 100644 index 0000000..a5942ef --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/EncodingMap.php @@ -0,0 +1,36 @@ +f = fopen($file, "r"); + } + + function parse() { + $map = array(); + + while ($line = fgets($this->f)) { + if (preg_match('/^[\!\=]([0-9A-F]{2,})\s+U\+([0-9A-F]{2})([0-9A-F]{2})\s+([^\s]+)/', $line, $matches)) { + $unicode = (hexdec($matches[2]) << 8) + hexdec($matches[3]); + $map[hexdec($matches[1])] = array($unicode, $matches[4]); + } + } + + ksort($map); + + return $map; + } +} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Exception/FontNotFoundException.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Exception/FontNotFoundException.php new file mode 100644 index 0000000..d97f252 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Exception/FontNotFoundException.php @@ -0,0 +1,11 @@ +message = 'Font not found in: ' . $fontPath; + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Font.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Font.php new file mode 100644 index 0000000..8661288 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Font.php @@ -0,0 +1,88 @@ +load($file); + + return $obj; + } + + return null; + } + + static function d($str) { + if (!self::$debug) { + return; + } + echo "$str\n"; + } + + static function UTF16ToUTF8($str) { + return mb_convert_encoding($str, "utf-8", "utf-16"); + } + + static function UTF8ToUTF16($str) { + return mb_convert_encoding($str, "utf-16", "utf-8"); + } +} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/Outline.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/Outline.php new file mode 100644 index 0000000..dde4de2 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/Outline.php @@ -0,0 +1,108 @@ +seek($offset); + + if ($size === 0 || $font->readInt16() > -1) { + /** @var OutlineSimple $glyph */ + $glyph = new OutlineSimple($table, $offset, $size); + } + else { + /** @var OutlineComposite $glyph */ + $glyph = new OutlineComposite($table, $offset, $size); + } + + $glyph->parse($font); + + return $glyph; + } + + /** + * @return File + */ + function getFont() { + return $this->table->getFont(); + } + + function __construct(glyf $table, $offset = null, $size = null) { + $this->table = $table; + $this->offset = $offset; + $this->size = $size; + } + + function parse(BinaryStream $font) { + $font->seek($this->offset); + + $this->raw = $font->read($this->size); + } + + function parseData() { + $font = $this->getFont(); + $font->seek($this->offset); + + $this->numberOfContours = $font->readInt16(); + $this->xMin = $font->readFWord(); + $this->yMin = $font->readFWord(); + $this->xMax = $font->readFWord(); + $this->yMax = $font->readFWord(); + } + + function encode() { + $font = $this->getFont(); + + return $font->write($this->raw, mb_strlen((string) $this->raw, '8bit')); + } + + function getSVGContours() { + // Inherit + } + + function getGlyphIDs() { + return array(); + } +} + diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/OutlineComponent.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/OutlineComponent.php new file mode 100644 index 0000000..40aade3 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/OutlineComponent.php @@ -0,0 +1,30 @@ +a, $this->b, + $this->c, $this->d, + $this->e, $this->f, + ); + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/OutlineComposite.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/OutlineComposite.php new file mode 100644 index 0000000..179c012 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/OutlineComposite.php @@ -0,0 +1,252 @@ +components)) { + $this->parseData(); + } + + $glyphIDs = array(); + foreach ($this->components as $_component) { + $glyphIDs[] = $_component->glyphIndex; + + $_glyph = $this->table->data[$_component->glyphIndex]; + + if ($_glyph !== $this) { + $glyphIDs = array_merge($glyphIDs, $_glyph->getGlyphIDs()); + } + } + + return $glyphIDs; + } + + /*function parse() { + //$this->parseData(); + }*/ + + function parseData() { + parent::parseData(); + + $font = $this->getFont(); + + do { + $flags = $font->readUInt16(); + $glyphIndex = $font->readUInt16(); + + $a = 1.0; + $b = 0.0; + $c = 0.0; + $d = 1.0; + $e = 0.0; + $f = 0.0; + + $point_compound = null; + $point_component = null; + + $instructions = null; + + if ($flags & self::ARG_1_AND_2_ARE_WORDS) { + if ($flags & self::ARGS_ARE_XY_VALUES) { + $e = $font->readInt16(); + $f = $font->readInt16(); + } + else { + $point_compound = $font->readUInt16(); + $point_component = $font->readUInt16(); + } + } + else { + if ($flags & self::ARGS_ARE_XY_VALUES) { + $e = $font->readInt8(); + $f = $font->readInt8(); + } + else { + $point_compound = $font->readUInt8(); + $point_component = $font->readUInt8(); + } + } + + if ($flags & self::WE_HAVE_A_SCALE) { + $a = $d = $font->readInt16(); + } + elseif ($flags & self::WE_HAVE_AN_X_AND_Y_SCALE) { + $a = $font->readInt16(); + $d = $font->readInt16(); + } + elseif ($flags & self::WE_HAVE_A_TWO_BY_TWO) { + $a = $font->readInt16(); + $b = $font->readInt16(); + $c = $font->readInt16(); + $d = $font->readInt16(); + } + + //if ($flags & self::WE_HAVE_INSTRUCTIONS) { + // + //} + + $component = new OutlineComponent(); + $component->flags = $flags; + $component->glyphIndex = $glyphIndex; + $component->a = $a; + $component->b = $b; + $component->c = $c; + $component->d = $d; + $component->e = $e; + $component->f = $f; + $component->point_compound = $point_compound; + $component->point_component = $point_component; + $component->instructions = $instructions; + + $this->components[] = $component; + } while ($flags & self::MORE_COMPONENTS); + if ($flags & self::WE_HAVE_INSTRUCTIONS) { + $numInstr = $font->readUInt16(); + $instr = $font->read($numInstr); + $this->components[count($this->components) - 1]->instructions = pack('n', $numInstr) . $instr; + } + } + + function encode() { + $font = $this->getFont(); + + $gids = $font->getSubset(); + + $size = $font->writeInt16(-1); + $size += $font->writeFWord($this->xMin); + $size += $font->writeFWord($this->yMin); + $size += $font->writeFWord($this->xMax); + $size += $font->writeFWord($this->yMax); + + foreach ($this->components as $_i => $_component) { + $flags = 0; + if ($_component->point_component === null && $_component->point_compound === null) { + $flags |= self::ARGS_ARE_XY_VALUES; + + if (abs($_component->e) > 0x7F || abs($_component->f) > 0x7F) { + $flags |= self::ARG_1_AND_2_ARE_WORDS; + } + } + elseif ($_component->point_component > 0xFF || $_component->point_compound > 0xFF) { + $flags |= self::ARG_1_AND_2_ARE_WORDS; + } + + if ($_component->b == 0 && $_component->c == 0) { + if ($_component->a == $_component->d) { + if ($_component->a != 1.0) { + $flags |= self::WE_HAVE_A_SCALE; + } + } + else { + $flags |= self::WE_HAVE_AN_X_AND_Y_SCALE; + } + } + else { + $flags |= self::WE_HAVE_A_TWO_BY_TWO; + } + + if ($_i < count($this->components) - 1) { + $flags |= self::MORE_COMPONENTS; + } elseif($_component->instructions !== null) { + $flags |= self::WE_HAVE_INSTRUCTIONS; + } + + $size += $font->writeUInt16($flags); + + $new_gid = array_search($_component->glyphIndex, $gids); + $size += $font->writeUInt16($new_gid); + + if ($flags & self::ARG_1_AND_2_ARE_WORDS) { + if ($flags & self::ARGS_ARE_XY_VALUES) { + $size += $font->writeInt16($_component->e); + $size += $font->writeInt16($_component->f); + } + else { + $size += $font->writeUInt16($_component->point_compound); + $size += $font->writeUInt16($_component->point_component); + } + } + else { + if ($flags & self::ARGS_ARE_XY_VALUES) { + $size += $font->writeInt8($_component->e); + $size += $font->writeInt8($_component->f); + } + else { + $size += $font->writeUInt8($_component->point_compound); + $size += $font->writeUInt8($_component->point_component); + } + } + + if ($flags & self::WE_HAVE_A_SCALE) { + $size += $font->writeInt16($_component->a); + } + elseif ($flags & self::WE_HAVE_AN_X_AND_Y_SCALE) { + $size += $font->writeInt16($_component->a); + $size += $font->writeInt16($_component->d); + } + elseif ($flags & self::WE_HAVE_A_TWO_BY_TWO) { + $size += $font->writeInt16($_component->a); + $size += $font->writeInt16($_component->b); + $size += $font->writeInt16($_component->c); + $size += $font->writeInt16($_component->d); + } + } + + if($_component->instructions !== null) { + $size += $font->write($_component->instructions, strlen($_component->instructions)); + } + + return $size; + } + + public function getSVGContours() { + $contours = array(); + + /** @var \FontLib\Table\Type\glyf $glyph_data */ + $glyph_data = $this->getFont()->getTableObject("glyf"); + + /** @var Outline[] $glyphs */ + $glyphs = $glyph_data->data; + + foreach ($this->components as $component) { + $_glyph = $glyphs[$component->glyphIndex]; + + if ($_glyph !== $this) { + $contours[] = array( + "contours" => $_glyph->getSVGContours(), + "transform" => $component->getMatrix(), + ); + } + } + + return $contours; + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/OutlineSimple.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/OutlineSimple.php new file mode 100644 index 0000000..4b2d4ca --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Glyph/OutlineSimple.php @@ -0,0 +1,334 @@ +size) { + return; + } + + $font = $this->getFont(); + + $noc = $this->numberOfContours; + + if ($noc == 0) { + return; + } + + $endPtsOfContours = $font->r(array(self::uint16, $noc)); + + $instructionLength = $font->readUInt16(); + $this->instructions = $font->r(array(self::uint8, $instructionLength)); + + $count = $endPtsOfContours[$noc - 1] + 1; + + // Flags + $flags = array(); + for ($index = 0; $index < $count; $index++) { + $flags[$index] = $font->readUInt8(); + + if ($flags[$index] & self::REPEAT) { + $repeats = $font->readUInt8(); + + for ($i = 1; $i <= $repeats; $i++) { + $flags[$index + $i] = $flags[$index]; + } + + $index += $repeats; + } + } + + $points = array(); + foreach ($flags as $i => $flag) { + $points[$i]["onCurve"] = $flag & self::ON_CURVE; + $points[$i]["endOfContour"] = in_array($i, $endPtsOfContours); + } + + // X Coords + $x = 0; + for ($i = 0; $i < $count; $i++) { + $flag = $flags[$i]; + + if ($flag & self::THIS_X_IS_SAME) { + if ($flag & self::X_SHORT_VECTOR) { + $x += $font->readUInt8(); + } + } + else { + if ($flag & self::X_SHORT_VECTOR) { + $x -= $font->readUInt8(); + } + else { + $x += $font->readInt16(); + } + } + + $points[$i]["x"] = $x; + } + + // Y Coords + $y = 0; + for ($i = 0; $i < $count; $i++) { + $flag = $flags[$i]; + + if ($flag & self::THIS_Y_IS_SAME) { + if ($flag & self::Y_SHORT_VECTOR) { + $y += $font->readUInt8(); + } + } + else { + if ($flag & self::Y_SHORT_VECTOR) { + $y -= $font->readUInt8(); + } + else { + $y += $font->readInt16(); + } + } + + $points[$i]["y"] = $y; + } + + $this->points = $points; + } + + public function splitSVGPath($path) { + preg_match_all('/([a-z])|(-?\d+(?:\.\d+)?)/i', $path, $matches, PREG_PATTERN_ORDER); + + return $matches[0]; + } + + public function makePoints($path) { + $path = $this->splitSVGPath($path); + $l = count($path); + $i = 0; + + $points = array(); + + while ($i < $l) { + switch ($path[$i]) { + // moveTo + case "M": + $points[] = array( + "onCurve" => true, + "x" => $path[++$i], + "y" => $path[++$i], + "endOfContour" => false, + ); + break; + + // lineTo + case "L": + $points[] = array( + "onCurve" => true, + "x" => $path[++$i], + "y" => $path[++$i], + "endOfContour" => false, + ); + break; + + // quadraticCurveTo + case "Q": + $points[] = array( + "onCurve" => false, + "x" => $path[++$i], + "y" => $path[++$i], + "endOfContour" => false, + ); + $points[] = array( + "onCurve" => true, + "x" => $path[++$i], + "y" => $path[++$i], + "endOfContour" => false, + ); + break; + + // closePath + /** @noinspection PhpMissingBreakStatementInspection */ + case "z": + $points[count($points) - 1]["endOfContour"] = true; + + default: + $i++; + break; + } + } + + return $points; + } + + function encode() { + if (empty($this->points)) { + return parent::encode(); + } + + return $this->size = $this->encodePoints($this->points); + } + + public function encodePoints($points) { + $endPtsOfContours = array(); + $flags = array(); + $coords_x = array(); + $coords_y = array(); + + $last_x = 0; + $last_y = 0; + $xMin = $yMin = 0xFFFF; + $xMax = $yMax = -0xFFFF; + foreach ($points as $i => $point) { + $flag = 0; + if ($point["onCurve"]) { + $flag |= self::ON_CURVE; + } + + if ($point["endOfContour"]) { + $endPtsOfContours[] = $i; + } + + // Simplified, we could do some optimizations + if ($point["x"] == $last_x) { + $flag |= self::THIS_X_IS_SAME; + } + else { + $x = intval($point["x"]); + $xMin = min($x, $xMin); + $xMax = max($x, $xMax); + $coords_x[] = $x - $last_x; // int16 + } + + // Simplified, we could do some optimizations + if ($point["y"] == $last_y) { + $flag |= self::THIS_Y_IS_SAME; + } + else { + $y = intval($point["y"]); + $yMin = min($y, $yMin); + $yMax = max($y, $yMax); + $coords_y[] = $y - $last_y; // int16 + } + + $flags[] = $flag; + $last_x = $point["x"]; + $last_y = $point["y"]; + } + + $font = $this->getFont(); + + $l = 0; + $l += $font->writeInt16(count($endPtsOfContours)); // endPtsOfContours + $l += $font->writeFWord(isset($this->xMin) ? $this->xMin : $xMin); // xMin + $l += $font->writeFWord(isset($this->yMin) ? $this->yMin : $yMin); // yMin + $l += $font->writeFWord(isset($this->xMax) ? $this->xMax : $xMax); // xMax + $l += $font->writeFWord(isset($this->yMax) ? $this->yMax : $yMax); // yMax + + // Simple glyf + $l += $font->w(array(self::uint16, count($endPtsOfContours)), $endPtsOfContours); // endPtsOfContours + $l += $font->writeUInt16(0); // instructionLength + $l += $font->w(array(self::uint8, count($flags)), $flags); // flags + $l += $font->w(array(self::int16, count($coords_x)), $coords_x); // xCoordinates + $l += $font->w(array(self::int16, count($coords_y)), $coords_y); // yCoordinates + return $l; + } + + public function getSVGContours($points = null) { + $path = ""; + + if (!$points) { + if (empty($this->points)) { + $this->parseData(); + } + + $points = $this->points; + } + + $length = (empty($points) ? 0 : count($points)); + $firstIndex = 0; + $count = 0; + + for ($i = 0; $i < $length; $i++) { + $count++; + + if ($points[$i]["endOfContour"]) { + $path .= $this->getSVGPath($points, $firstIndex, $count); + $firstIndex = $i + 1; + $count = 0; + } + } + + return $path; + } + + protected function getSVGPath($points, $startIndex, $count) { + $offset = 0; + $path = ""; + + while ($offset < $count) { + $point = $points[$startIndex + $offset % $count]; + $point_p1 = $points[$startIndex + ($offset + 1) % $count]; + + if ($offset == 0) { + $path .= "M{$point['x']},{$point['y']} "; + } + + if ($point["onCurve"]) { + if ($point_p1["onCurve"]) { + $path .= "L{$point_p1['x']},{$point_p1['y']} "; + $offset++; + } + else { + $point_p2 = $points[$startIndex + ($offset + 2) % $count]; + + if ($point_p2["onCurve"]) { + $path .= "Q{$point_p1['x']},{$point_p1['y']},{$point_p2['x']},{$point_p2['y']} "; + } + else { + $path .= "Q{$point_p1['x']},{$point_p1['y']}," . $this->midValue($point_p1['x'], $point_p2['x']) . "," . $this->midValue($point_p1['y'], $point_p2['y']) . " "; + } + + $offset += 2; + } + } + else { + if ($point_p1["onCurve"]) { + $path .= "Q{$point['x']},{$point['y']},{$point_p1['x']},{$point_p1['y']} "; + } + else { + $path .= "Q{$point['x']},{$point['y']}," . $this->midValue($point['x'], $point_p1['x']) . "," . $this->midValue($point['y'], $point_p1['y']) . " "; + } + + $offset++; + } + } + + $path .= "z "; + + return $path; + } + + function midValue($a, $b) { + return $a + ($b - $a) / 2; + } +} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Header.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Header.php new file mode 100644 index 0000000..32b80c6 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Header.php @@ -0,0 +1,36 @@ +font = $font; + } + + public function encode() { + return $this->font->pack($this->def, $this->data); + } + + public function parse() { + $this->data = $this->font->unpack($this->def); + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/OpenType/File.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/OpenType/File.php new file mode 100644 index 0000000..8bfed0b --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/OpenType/File.php @@ -0,0 +1,17 @@ +font = $font; + $this->f = $font->f; + } + + function parse() { + $this->tag = $this->font->read(4); + } + + function open($filename, $mode = self::modeRead) { + // void + } + + function setTable(Table $font_table) { + $this->font_table = $font_table; + } + + function encode($entry_offset) { + Font::d("\n==== $this->tag ===="); + //Font::d("Entry offset = $entry_offset"); + + $data = $this->font_table; + $font = $this->font; + + $table_offset = $font->pos(); + $this->offset = $table_offset; + $table_length = $data->encode(); + + $font->seek($table_offset + $table_length); + $pad = 0; + $mod = $table_length % 4; + if ($mod != 0) { + $pad = 4 - $mod; + $font->write(str_pad("", $pad, "\0"), $pad); + } + + $font->seek($table_offset); + $table_data = $font->read($table_length); + + $font->seek($entry_offset); + + $font->write($this->tag, 4); + $font->writeUInt32(self::computeChecksum($table_data)); + $font->writeUInt32($table_offset); + $font->writeUInt32($table_length); + + Font::d("Bytes written = $table_length"); + + $font->seek($table_offset + $table_length + $pad); + } + + /** + * @return File + */ + function getFont() { + return $this->font; + } + + function startRead() { + $this->font->seek($this->offset); + } + + function endRead() { + // + } + + function startWrite() { + $this->font->seek($this->offset); + } + + function endWrite() { + // + } +} + diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Table.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Table.php new file mode 100644 index 0000000..6b3a565 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Table.php @@ -0,0 +1,92 @@ +entry = $entry; + $entry->setTable($this); + } + + /** + * @return File + */ + public function getFont() { + return $this->entry->getFont(); + } + + protected function _encode() { + if (empty($this->data)) { + Font::d(" >> Table is empty"); + + return 0; + } + + return $this->getFont()->pack($this->def, $this->data); + } + + protected function _parse() { + $this->data = $this->getFont()->unpack($this->def); + } + + protected function _parseRaw() { + $this->data = $this->getFont()->read($this->entry->length); + } + + protected function _encodeRaw() { + return $this->getFont()->write($this->data, $this->entry->length); + } + + public function toHTML() { + return "
" . var_export($this->data, true) . "
"; + } + + final public function encode() { + $this->entry->startWrite(); + + if (false && empty($this->def)) { + $length = $this->_encodeRaw(); + } + else { + $length = $this->_encode(); + } + + $this->entry->endWrite(); + + return $length; + } + + final public function parse() { + $this->entry->startRead(); + + if (false && empty($this->def)) { + $this->_parseRaw(); + } + else { + $this->_parse(); + } + + $this->entry->endRead(); + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/cmap.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/cmap.php new file mode 100644 index 0000000..c7abca7 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/cmap.php @@ -0,0 +1,380 @@ + self::uint16, + "numberSubtables" => self::uint16, + ); + + private static $subtable_header_format = array( + "platformID" => self::uint16, + "platformSpecificID" => self::uint16, + "offset" => self::uint32, + ); + + private static $subtable_v2_format = array( + "length" => self::uint16, + "language" => self::uint16 + ); + + private static $subtable_v2_format_subheader = array( + "firstCode" => self::uint16, + "entryCount" => self::uint16, + "idDelta" => self::int16, + "idRangeOffset" => self::uint16 + ); + + private static $subtable_v4_format = array( + "length" => self::uint16, + "language" => self::uint16, + "segCountX2" => self::uint16, + "searchRange" => self::uint16, + "entrySelector" => self::uint16, + "rangeShift" => self::uint16, + ); + + private static $subtable_v12_format = array( + "length" => self::uint32, + "language" => self::uint32, + "ngroups" => self::uint32 + ); + + protected function _parse() { + $font = $this->getFont(); + + $cmap_offset = $font->pos(); + + $data = $font->unpack(self::$header_format); + + $subtables = array(); + for ($i = 0; $i < $data["numberSubtables"]; $i++) { + $subtables[] = $font->unpack(self::$subtable_header_format); + } + + $data["subtables"] = $subtables; + + foreach ($data["subtables"] as $i => &$subtable) { + $font->seek($cmap_offset + $subtable["offset"]); + + $subtable["format"] = $font->readUInt16(); + + switch ($subtable["format"]) { + case 0: + case 6: + case 8: + case 10: + case 13: + case 14: + unset($data["subtables"][$i]); + $data["numberSubtables"]--; + continue 2; + + case 2: + $subtable += $font->unpack(self::$subtable_v2_format); + + $subHeaderKeys = array_map(function($val) { return $val / 8; }, $font->readUInt16Many(256)); + $subHeaders = array(); + + $glyphIdArray = array(); + $maxSubHeaderIndex = max($subHeaderKeys); + for ($i = 0; $i <= $maxSubHeaderIndex; $i++) { + $subHeader = $font->unpack(self::$subtable_v2_format_subheader); + $offset = $font->pos(); + $subHeader["glyphIdArrayOffset"] = $offset + $subHeader["idRangeOffset"] - 2; + $subHeaders[$i] = $subHeader; + + if (!\array_key_exists($subHeader["glyphIdArrayOffset"], $glyphIdArray) || count($glyphIdArray[$subHeader["glyphIdArrayOffset"]]) < $subHeader["entryCount"]) { + $font->seek($subHeader["glyphIdArrayOffset"]); + $glyphIdArray[$subHeader["glyphIdArrayOffset"]] = $font->readUInt16Many($subHeader["entryCount"]); + $font->seek($offset); + } + } + + $glyphIndexArray = array(); + foreach ($subHeaderKeys as $highByte => $subHeaderKey) { + $subHeader = $subHeaders[$subHeaderKey]; + if ($subHeaderKey === 0) { + $c = $highByte; + if ($c < $subHeader["firstCode"] || $c >= ($subHeader["firstCode"] + $subHeader["entryCount"])) { + $glyphIndexArray[$c] = 0; + continue; + } + $c = $highByte; + $index = $c - $subHeader["firstCode"]; + $glyphId = $glyphIdArray[$subHeader["glyphIdArrayOffset"]][$index]; + if ($glyphId === 0) { + $glyphIndexArray[$c] = 0; + } else { + $glyphIndexArray[$c] = ($glyphId + $subHeader["idDelta"]) & 0xFFFF; + } + } else { + for ($index = 0; $index < $subHeader["entryCount"]; $index++) { + $c = null; + $lowByte = $subHeader["firstCode"] + $index; + $c = (($highByte & 0xFF) << 8) | ($lowByte & 0xFF); + $glyphId = $glyphIdArray[$subHeader["glyphIdArrayOffset"]][$index]; + if ($glyphId === 0) { + $glyphIndexArray[$c] = 0; + } else { + $glyphIndexArray[$c] = ($glyphId + $subHeader["idDelta"]) & 0xFFFF; + } + } + } + } + + $subtable += array( + "subHeaderKeys" => $subHeaderKeys, + "subHeaders" => $subHeaders, + "glyphIdArray" => $glyphIdArray, + "glyphIndexArray" => $glyphIndexArray + ); + + break; + + case 4: + $subtable += $font->unpack(self::$subtable_v4_format); + + $segCount = $subtable["segCountX2"] / 2; + $subtable["segCount"] = $segCount; + + $endCode = $font->readUInt16Many($segCount); + + $font->readUInt16(); // reservedPad + + $startCode = $font->readUInt16Many($segCount); + $idDelta = $font->readInt16Many($segCount); + + $ro_start = $font->pos(); + $idRangeOffset = $font->readUInt16Many($segCount); + + $glyphIndexArray = array(); + for ($i = 0; $i < $segCount; $i++) { + $c1 = $startCode[$i]; + $c2 = $endCode[$i]; + $d = $idDelta[$i]; + $ro = $idRangeOffset[$i]; + + if ($ro > 0) { + $font->seek($subtable["offset"] + 2 * $i + $ro); + } + + for ($c = $c1; $c <= $c2; $c++) { + if ($c === 0xFFFF) { + continue; + } + + if ($ro == 0) { + $gid = ($c + $d) & 0xFFFF; + } + else { + $offset = ($c - $c1) * 2 + $ro; + $offset = $ro_start + 2 * $i + $offset; + + $gid = 0; + if ($font->seek($offset) === true) { + $gid = $font->readUInt16(); + } + + if ($gid != 0) { + $gid = ($gid + $d) & 0xFFFF; + } + } + + if ($gid >= 0) { + $glyphIndexArray[$c] = $gid; + } + } + } + + $subtable += array( + "endCode" => $endCode, + "startCode" => $startCode, + "idDelta" => $idDelta, + "idRangeOffset" => $idRangeOffset, + "glyphIndexArray" => $glyphIndexArray + ); + break; + + case 12: + $font->readUInt16(); + + $subtable += $font->unpack(self::$subtable_v12_format); + + $glyphIndexArray = array(); + $endCodes = array(); + $startCodes = array(); + + for ($p = 0; $p < $subtable['ngroups']; $p++) { + + $startCode = $startCodes[] = $font->readUInt32(); + $endCode = $endCodes[] = $font->readUInt32(); + $startGlyphCode = $font->readUInt32(); + + for ($c = $startCode; $c <= $endCode; $c++) { + $glyphIndexArray[$c] = $startGlyphCode; + $startGlyphCode++; + } + } + + $subtable += array( + "startCode" => $startCodes, + "endCode" => $endCodes, + "glyphIndexArray" => $glyphIndexArray, + ); + break; + } + } + + $this->data = $data; + } + + function _encode() { + $font = $this->getFont(); + + $subset = $font->getSubset(); + $glyphIndexArray = $font->getUnicodeCharMap(); + + $newGlyphIndexArray = array(); + foreach ($glyphIndexArray as $code => $gid) { + $new_gid = array_search($gid, $subset); + if ($new_gid !== false) { + $newGlyphIndexArray[$code] = $new_gid; + } + } + + ksort($newGlyphIndexArray); // Sort by char code + + $segments = array(); + + $i = -1; + $prevCode = 0xFFFF; + $prevGid = 0xFFFF; + + foreach ($newGlyphIndexArray as $code => $gid) { + if ( + $prevCode + 1 != $code || + $prevGid + 1 != $gid + ) { + $i++; + $segments[$i] = array(); + } + + $segments[$i][] = array($code, $gid); + + $prevCode = $code; + $prevGid = $gid; + } + + $segments[][] = array(0xFFFF, null); + + $startCode = array(); + $endCode = array(); + $idDelta = array(); + + foreach ($segments as $codes) { + $start = reset($codes); + $end = end($codes); + + $startCode[] = $start[0]; + $endCode[] = $end[0]; + $idDelta[] = $start[1] - $start[0]; + } + + $segCount = count($startCode); + $idRangeOffset = array_fill(0, $segCount, 0); + + $searchRange = 1; + $entrySelector = 0; + while ($searchRange * 2 <= $segCount) { + $searchRange *= 2; + $entrySelector++; + } + $searchRange *= 2; + $rangeShift = $segCount * 2 - $searchRange; + + $subtables = array( + array( + // header + "platformID" => 3, // Unicode + "platformSpecificID" => 1, + "offset" => null, + + // subtable + "format" => 4, + "length" => null, + "language" => 0, + "segCount" => $segCount, + "segCountX2" => $segCount * 2, + "searchRange" => $searchRange, + "entrySelector" => $entrySelector, + "rangeShift" => $rangeShift, + "startCode" => $startCode, + "endCode" => $endCode, + "idDelta" => $idDelta, + "idRangeOffset" => $idRangeOffset, + "glyphIndexArray" => $newGlyphIndexArray, + ) + ); + + $data = array( + "version" => 0, + "numberSubtables" => count($subtables), + "subtables" => $subtables, + ); + + $length = $font->pack(self::$header_format, $data); + + $subtable_headers_size = $data["numberSubtables"] * 8; // size of self::$subtable_header_format + $subtable_headers_offset = $font->pos(); + + $length += $font->write(str_repeat("\0", $subtable_headers_size), $subtable_headers_size); + + // write subtables data + foreach ($data["subtables"] as $i => $subtable) { + $length_before = $length; + $data["subtables"][$i]["offset"] = $length; + + $length += $font->writeUInt16($subtable["format"]); + + $before_subheader = $font->pos(); + $length += $font->pack(self::$subtable_v4_format, $subtable); + + $segCount = $subtable["segCount"]; + $length += $font->w(array(self::uint16, $segCount), $subtable["endCode"]); + $length += $font->writeUInt16(0); // reservedPad + $length += $font->w(array(self::uint16, $segCount), $subtable["startCode"]); + $length += $font->w(array(self::int16, $segCount), $subtable["idDelta"]); + $length += $font->w(array(self::uint16, $segCount), $subtable["idRangeOffset"]); + $length += $font->w(array(self::uint16, $segCount), array_values($subtable["glyphIndexArray"])); + + $after_subtable = $font->pos(); + + $subtable["length"] = $length - $length_before; + $font->seek($before_subheader); + $font->pack(self::$subtable_v4_format, $subtable); + + $font->seek($after_subtable); + } + + // write subtables headers + $font->seek($subtable_headers_offset); + foreach ($data["subtables"] as $subtable) { + $font->pack(self::$subtable_header_format, $subtable); + } + + return $length; + } +} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/cvt.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/cvt.php new file mode 100644 index 0000000..82a9514 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/cvt.php @@ -0,0 +1,26 @@ +getFont(); + $font->seek($this->entry->offset); + $this->rawData = $font->read($this->entry->length); + } + function _encode() { + return $this->getFont()->write($this->rawData, $this->entry->length); + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/fpgm.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/fpgm.php new file mode 100644 index 0000000..e97d9ed --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/fpgm.php @@ -0,0 +1,26 @@ +getFont(); + $font->seek($this->entry->offset); + $this->rawData = $font->read($this->entry->length); + } + function _encode() { + return $this->getFont()->write($this->rawData, $this->entry->length); + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/glyf.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/glyf.php new file mode 100644 index 0000000..94ee2d3 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/glyf.php @@ -0,0 +1,165 @@ +getFont(); + $offset = $font->pos(); + + $loca = $font->getData("loca"); + $real_loca = array_slice($loca, 0, -1); // Not the last dummy loca entry + + $data = array(); + + foreach ($real_loca as $gid => $location) { + $_offset = $offset + $loca[$gid]; + $_size = $loca[$gid + 1] - $loca[$gid]; + $data[$gid] = Outline::init($this, $_offset, $_size, $font); + } + + $this->data = $data; + } + + public function getGlyphIDs($gids = array()) { + $glyphIDs = array(); + + foreach ($gids as $_gid) { + $_glyph = $this->data[$_gid]; + $glyphIDs = array_merge($glyphIDs, $_glyph->getGlyphIDs()); + } + + return array_unique(array_merge($gids, $glyphIDs)); + } + + public function toHTML($n = 500) { + $max = 160; + $font = $this->getFont(); + + $head = $font->getData("head"); + $head_json = json_encode($head); + + $os2 = $font->getData("OS/2"); + $os2_json = json_encode($os2); + + $hmtx = $font->getData("hmtx"); + $hmtx_json = json_encode($hmtx); + + $names = $font->getData("post", "names"); + $glyphIndexArray = array_flip($font->getUnicodeCharMap()); + + $width = (abs($head["xMin"]) + $head["xMax"]); + $height = (abs($head["yMin"]) + $head["yMax"]); + + $ratio = 1; + if ($width > $max || $height > $max) { + $ratio = max($width, $height) / $max; + $width = round($width / $ratio); + $height = round($height / $ratio); + } + + $s = "

" . "Only the first $n simple glyphs are shown (" . count($this->data) . " total) +
Simple glyph
+
Composite glyph
+ Zoom: +

+ "; + + foreach ($this->data as $g => $glyph) { + if ($n-- <= 0) { + break; + } + + $glyph->parseData(); + + $shape = array( + "SVGContours" => $glyph->getSVGContours(), + "xMin" => $glyph->xMin, + "yMin" => $glyph->yMin, + "xMax" => $glyph->xMax, + "yMax" => $glyph->yMax, + ); + $shape_json = json_encode($shape); + + $type = ($glyph instanceof OutlineSimple ? "simple" : "composite"); + $char = isset($glyphIndexArray[$g]) ? $glyphIndexArray[$g] : 0; + $name = isset($names[$g]) ? $names[$g] : sprintf("uni%04x", $char); + $char = $char ? "&#{$glyphIndexArray[$g]};" : ""; + + if ($char === "" && empty($shape["SVGContours"])) { + $n++; + continue; + } + + $s .= "
+ $g + $char + $name + "; + + if ($type == "composite") { + foreach ($glyph->getGlyphIDs() as $_id) { + $s .= "$_id "; + } + } + + $s .= "
+ +
+ "; + } + + return $s; + } + + + protected function _encode() { + $font = $this->getFont(); + $subset = $font->getSubset(); + $data = $this->data; + + $loca = array(); + + $length = 0; + foreach ($subset as $gid) { + $loca[] = $length; + + $bytes = $data[$gid]->encode(); + + $pad = 0; + $mod = $bytes % 4; + if ($mod != 0) { + $pad = 4 - $mod; + $font->write(str_pad("", $pad, "\0"), $pad); + } + $length += $bytes + $pad; + } + + $loca[] = $length; // dummy loca + $font->getTableObject("loca")->data = $loca; + + return $length; + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/head.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/head.php new file mode 100644 index 0000000..ce5a3a4 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/head.php @@ -0,0 +1,50 @@ + self::Fixed, + "fontRevision" => self::Fixed, + "checkSumAdjustment" => self::uint32, + "magicNumber" => self::uint32, + "flags" => self::uint16, + "unitsPerEm" => self::uint16, + "created" => self::longDateTime, + "modified" => self::longDateTime, + "xMin" => self::FWord, + "yMin" => self::FWord, + "xMax" => self::FWord, + "yMax" => self::FWord, + "macStyle" => self::uint16, + "lowestRecPPEM" => self::uint16, + "fontDirectionHint" => self::int16, + "indexToLocFormat" => self::int16, + "glyphDataFormat" => self::int16, + ); + + protected function _parse() { + parent::_parse(); + + if ($this->data["magicNumber"] != 0x5F0F3CF5) { + throw new Exception("Incorrect magic number (" . dechex($this->data["magicNumber"]) . ")"); + } + } + + function _encode() { + $this->data["checkSumAdjustment"] = 0; + return parent::_encode(); + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/hhea.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/hhea.php new file mode 100644 index 0000000..becb9a4 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/hhea.php @@ -0,0 +1,43 @@ + self::Fixed, + "ascent" => self::FWord, + "descent" => self::FWord, + "lineGap" => self::FWord, + "advanceWidthMax" => self::uFWord, + "minLeftSideBearing" => self::FWord, + "minRightSideBearing" => self::FWord, + "xMaxExtent" => self::FWord, + "caretSlopeRise" => self::int16, + "caretSlopeRun" => self::int16, + "caretOffset" => self::FWord, + self::int16, + self::int16, + self::int16, + self::int16, + "metricDataFormat" => self::int16, + "numOfLongHorMetrics" => self::uint16, + ); + + function _encode() { + $font = $this->getFont(); + $this->data["numOfLongHorMetrics"] = count($font->getSubset()); + + return parent::_encode(); + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/hmtx.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/hmtx.php new file mode 100644 index 0000000..ccd37d7 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/hmtx.php @@ -0,0 +1,64 @@ +getFont(); + $offset = $font->pos(); + + $numOfLongHorMetrics = $font->getData("hhea", "numOfLongHorMetrics"); + $numGlyphs = $font->getData("maxp", "numGlyphs"); + + $font->seek($offset); + + $data = array(); + $metrics = $font->readUInt16Many($numOfLongHorMetrics * 2); + for ($gid = 0, $mid = 0; $gid < $numOfLongHorMetrics; $gid++) { + $advanceWidth = isset($metrics[$mid]) ? $metrics[$mid] : 0; + $mid += 1; + $leftSideBearing = isset($metrics[$mid]) ? $metrics[$mid] : 0; + $mid += 1; + $data[$gid] = array($advanceWidth, $leftSideBearing); + } + + if ($numOfLongHorMetrics < $numGlyphs) { + $lastWidth = end($data)[0]; + $numLeft = $numGlyphs - $numOfLongHorMetrics; + $metrics = $font->readUInt16Many($numLeft); + for($i = 0; $i < $numLeft; $i++) { + $gid = $numOfLongHorMetrics + $i; + $leftSideBearing = isset($metrics[$i]) ? $metrics[$i] : 0; + $data[$gid] = array($lastWidth, $leftSideBearing); + } + } + + $this->data = $data; + } + + protected function _encode() { + $font = $this->getFont(); + $subset = $font->getSubset(); + $data = $this->data; + + $length = 0; + + foreach ($subset as $gid) { + $length += $font->writeUInt16($data[$gid][0]); + $length += $font->writeUInt16($data[$gid][1]); + } + + return $length; + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/kern.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/kern.php new file mode 100644 index 0000000..75f2c6f --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/kern.php @@ -0,0 +1,79 @@ +getFont(); + + $data = $font->unpack(array( + "version" => self::uint16, + "nTables" => self::uint16, + + // only the first subtable will be parsed + "subtableVersion" => self::uint16, + "length" => self::uint16, + "coverage" => self::uint16, + )); + + $data["format"] = ($data["coverage"] >> 8); + + $subtable = array(); + + switch ($data["format"]) { + case 0: + $subtable = $font->unpack(array( + "nPairs" => self::uint16, + "searchRange" => self::uint16, + "entrySelector" => self::uint16, + "rangeShift" => self::uint16, + )); + + $pairs = array(); + $tree = array(); + + $values = $font->readUInt16Many($subtable["nPairs"] * 3); + for ($i = 0, $idx = 0; $i < $subtable["nPairs"]; $i++) { + $left = $values[$idx++]; + $right = $values[$idx++]; + $value = $values[$idx++]; + + if ($value >= 0x8000) { + $value -= 0x10000; + } + + $pairs[] = array( + "left" => $left, + "right" => $right, + "value" => $value, + ); + + $tree[$left][$right] = $value; + } + + //$subtable["pairs"] = $pairs; + $subtable["tree"] = $tree; + break; + + case 1: + case 2: + case 3: + break; + } + + $data["subtable"] = $subtable; + + $this->data = $data; + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/loca.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/loca.php new file mode 100644 index 0000000..bbd87d1 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/loca.php @@ -0,0 +1,79 @@ +getFont(); + $offset = $font->pos(); + + $indexToLocFormat = $font->getData("head", "indexToLocFormat"); + $numGlyphs = $font->getData("maxp", "numGlyphs"); + + $font->seek($offset); + + $data = array(); + + // 2 bytes + if ($indexToLocFormat == 0) { + $d = $font->read(($numGlyphs + 1) * 2); + $loc = unpack("n*", $d); + + for ($i = 0; $i <= $numGlyphs; $i++) { + $data[] = isset($loc[$i + 1]) ? $loc[$i + 1] * 2 : 0; + } + } + + // 4 bytes + else { + if ($indexToLocFormat == 1) { + $d = $font->read(($numGlyphs + 1) * 4); + $loc = unpack("N*", $d); + + for ($i = 0; $i <= $numGlyphs; $i++) { + $data[] = isset($loc[$i + 1]) ? $loc[$i + 1] : 0; + } + } + } + + $this->data = $data; + } + + function _encode() { + $font = $this->getFont(); + $data = $this->data; + + $indexToLocFormat = $font->getData("head", "indexToLocFormat"); + $numGlyphs = $font->getData("maxp", "numGlyphs"); + $length = 0; + + // 2 bytes + if ($indexToLocFormat == 0) { + for ($i = 0; $i <= $numGlyphs; $i++) { + $length += $font->writeUInt16($data[$i] / 2); + } + } + + // 4 bytes + else { + if ($indexToLocFormat == 1) { + for ($i = 0; $i <= $numGlyphs; $i++) { + $length += $font->writeUInt32($data[$i]); + } + } + } + + return $length; + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/maxp.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/maxp.php new file mode 100644 index 0000000..867125a --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/maxp.php @@ -0,0 +1,41 @@ + self::Fixed, + "numGlyphs" => self::uint16, + "maxPoints" => self::uint16, + "maxContours" => self::uint16, + "maxComponentPoints" => self::uint16, + "maxComponentContours" => self::uint16, + "maxZones" => self::uint16, + "maxTwilightPoints" => self::uint16, + "maxStorage" => self::uint16, + "maxFunctionDefs" => self::uint16, + "maxInstructionDefs" => self::uint16, + "maxStackElements" => self::uint16, + "maxSizeOfInstructions" => self::uint16, + "maxComponentElements" => self::uint16, + "maxComponentDepth" => self::uint16, + ); + + function _encode() { + $font = $this->getFont(); + $this->data["numGlyphs"] = count($font->getSubset()); + + return parent::_encode(); + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/name.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/name.php new file mode 100644 index 0000000..003a1e8 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/name.php @@ -0,0 +1,241 @@ + self::uint16, + "count" => self::uint16, + "stringOffset" => self::uint16, + ); + + const NAME_COPYRIGHT = 0; + const NAME_NAME = 1; + const NAME_SUBFAMILY = 2; + const NAME_SUBFAMILY_ID = 3; + const NAME_FULL_NAME = 4; + const NAME_VERSION = 5; + const NAME_POSTSCRIPT_NAME = 6; + const NAME_TRADEMARK = 7; + const NAME_MANUFACTURER = 8; + const NAME_DESIGNER = 9; + const NAME_DESCRIPTION = 10; + const NAME_VENDOR_URL = 11; + const NAME_DESIGNER_URL = 12; + const NAME_LICENSE = 13; + const NAME_LICENSE_URL = 14; + const NAME_PREFERRE_FAMILY = 16; + const NAME_PREFERRE_SUBFAMILY = 17; + const NAME_COMPAT_FULL_NAME = 18; + const NAME_SAMPLE_TEXT = 19; + + static $nameIdCodes = array( + 0 => "Copyright", + 1 => "FontName", + 2 => "FontSubfamily", + 3 => "UniqueID", + 4 => "FullName", + 5 => "Version", + 6 => "PostScriptName", + 7 => "Trademark", + 8 => "Manufacturer", + 9 => "Designer", + 10 => "Description", + 11 => "FontVendorURL", + 12 => "FontDesignerURL", + 13 => "LicenseDescription", + 14 => "LicenseURL", + // 15 + 16 => "PreferredFamily", + 17 => "PreferredSubfamily", + 18 => "CompatibleFullName", + 19 => "SampleText", + ); + + static $platforms = array( + 0 => "Unicode", + 1 => "Macintosh", + // 2 => Reserved + 3 => "Microsoft", + ); + + static $platformSpecific = array( + // Unicode + 0 => array( + 0 => "Default semantics", + 1 => "Version 1.1 semantics", + 2 => "ISO 10646 1993 semantics (deprecated)", + 3 => "Unicode 2.0 or later semantics", + ), + + // Macintosh + 1 => array( + 0 => "Roman", + 1 => "Japanese", + 2 => "Traditional Chinese", + 3 => "Korean", + 4 => "Arabic", + 5 => "Hebrew", + 6 => "Greek", + 7 => "Russian", + 8 => "RSymbol", + 9 => "Devanagari", + 10 => "Gurmukhi", + 11 => "Gujarati", + 12 => "Oriya", + 13 => "Bengali", + 14 => "Tamil", + 15 => "Telugu", + 16 => "Kannada", + 17 => "Malayalam", + 18 => "Sinhalese", + 19 => "Burmese", + 20 => "Khmer", + 21 => "Thai", + 22 => "Laotian", + 23 => "Georgian", + 24 => "Armenian", + 25 => "Simplified Chinese", + 26 => "Tibetan", + 27 => "Mongolian", + 28 => "Geez", + 29 => "Slavic", + 30 => "Vietnamese", + 31 => "Sindhi", + ), + + // Microsoft + 3 => array( + 0 => "Symbol", + 1 => "Unicode BMP (UCS-2)", + 2 => "ShiftJIS", + 3 => "PRC", + 4 => "Big5", + 5 => "Wansung", + 6 => "Johab", + // 7 => Reserved + // 8 => Reserved + // 9 => Reserved + 10 => "Unicode UCS-4", + ), + ); + + protected function _parse() { + $font = $this->getFont(); + + $tableOffset = $font->pos(); + + $data = $font->unpack(self::$header_format); + + $records = array(); + for ($i = 0; $i < $data["count"]; $i++) { + $record = new nameRecord(); + $record_data = $font->unpack(nameRecord::$format); + $record->map($record_data); + + $records[] = $record; + } + + $system_encodings = mb_list_encodings(); + $system_encodings = array_change_key_case(array_fill_keys($system_encodings, true), CASE_UPPER); + + $names = array(); + foreach ($records as $record) { + $font->seek($tableOffset + $data["stringOffset"] + $record->offset); + $record->stringRaw = $font->read($record->length); + + $encoding = null; + switch ($record->platformID) { + case 3: + switch ($record->platformSpecificID) { + case 2: + if (\array_key_exists("SJIS", $system_encodings)) { + $encoding = "SJIS"; + } + break; + case 3: + if (\array_key_exists("GB18030", $system_encodings)) { + $encoding = "GB18030"; + } + break; + case 4: + if (\array_key_exists("BIG-5", $system_encodings)) { + $encoding = "BIG-5"; + } + break; + case 5: + if (\array_key_exists("UHC", $system_encodings)) { + $encoding = "UHC"; + } + break; + } + break; + } + if ($encoding === null) { + $encoding = "UTF-16"; + } + + $record->string = mb_convert_encoding($record->stringRaw, "UTF-8", $encoding); + if (strpos($record->string, "\0") !== false) { + $record->string = str_replace("\0", "", $record->string); + } + $names[$record->nameID] = $record; + } + + $data["records"] = $names; + + $this->data = $data; + } + + protected function _encode() { + $font = $this->getFont(); + + /** @var nameRecord[] $records */ + $records = $this->data["records"]; + $count_records = \count($records); + + $this->data["count"] = $count_records; + $this->data["stringOffset"] = 6 + ($count_records * 12); // 6 => uint16 * 3, 12 => sizeof self::$record_format + + $length = $font->pack(self::$header_format, $this->data); + + $offset = 0; + + /** @var nameRecord[] $records_to_encode */ + $records_to_encode = array(); + foreach ($records as $record) { + $encoded_record = new nameRecord(); + $encoded_record->platformID = 3; + $encoded_record->platformSpecificID = 1; + $encoded_record->languageID = $record->languageID; + $encoded_record->nameID = $record->nameID; + $encoded_record->offset = $offset; + $encoded_record->string = $record->string; + $encoded_record->length = mb_strlen($encoded_record->getUTF16(), "8bit"); + $records_to_encode[] = $encoded_record; + + $offset += $encoded_record->length; + $length += $font->pack(nameRecord::$format, (array)$encoded_record); + } + + foreach ($records_to_encode as $record) { + $str = $record->getUTF16(); + $length += $font->write($str, mb_strlen($str, "8bit")); + } + + return $length; + } +} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/nameRecord.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/nameRecord.php new file mode 100644 index 0000000..162629d --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/nameRecord.php @@ -0,0 +1,53 @@ + self::uint16, + "platformSpecificID" => self::uint16, + "languageID" => self::uint16, + "nameID" => self::uint16, + "length" => self::uint16, + "offset" => self::uint16, + ); + + public function map($data) { + foreach ($data as $key => $value) { + $this->$key = $value; + } + } + + public function getUTF8() { + return $this->string; + } + + public function getUTF16() { + return Font::UTF8ToUTF16($this->string); + } + + function __toString() { + return $this->string; + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/os2.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/os2.php new file mode 100644 index 0000000..b1a2016 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/os2.php @@ -0,0 +1,46 @@ + self::uint16, + "xAvgCharWidth" => self::int16, + "usWeightClass" => self::uint16, + "usWidthClass" => self::uint16, + "fsType" => self::int16, + "ySubscriptXSize" => self::int16, + "ySubscriptYSize" => self::int16, + "ySubscriptXOffset" => self::int16, + "ySubscriptYOffset" => self::int16, + "ySuperscriptXSize" => self::int16, + "ySuperscriptYSize" => self::int16, + "ySuperscriptXOffset" => self::int16, + "ySuperscriptYOffset" => self::int16, + "yStrikeoutSize" => self::int16, + "yStrikeoutPosition" => self::int16, + "sFamilyClass" => self::int16, + "panose" => array(self::uint8, 10), + "ulCharRange" => array(self::uint32, 4), + "achVendID" => array(self::char, 4), + "fsSelection" => self::uint16, + "fsFirstCharIndex" => self::uint16, + "fsLastCharIndex" => self::uint16, + "typoAscender" => self::int16, + "typoDescender" => self::int16, + "typoLineGap" => self::int16, + "winAscent" => self::int16, + "winDescent" => self::int16, + ); +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/post.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/post.php new file mode 100644 index 0000000..3b29c08 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/post.php @@ -0,0 +1,142 @@ + self::Fixed, + "italicAngle" => self::Fixed, + "underlinePosition" => self::FWord, + "underlineThickness" => self::FWord, + "isFixedPitch" => self::uint32, + "minMemType42" => self::uint32, + "maxMemType42" => self::uint32, + "minMemType1" => self::uint32, + "maxMemType1" => self::uint32, + ); + + protected function _parse() { + $font = $this->getFont(); + $data = $font->unpack($this->def); + + $names = array(); + + switch ($data["format"]) { + case 1: + $names = File::$macCharNames; + break; + + case 2: + $data["numberOfGlyphs"] = $font->readUInt16(); + + $glyphNameIndex = $font->readUInt16Many($data["numberOfGlyphs"]); + + $data["glyphNameIndex"] = $glyphNameIndex; + + $namesPascal = array(); + for ($i = 0; $i < $data["numberOfGlyphs"]; $i++) { + $len = $font->readUInt8(); + $namesPascal[] = $font->read($len); + } + + foreach ($glyphNameIndex as $g => $index) { + if ($index < 258) { + $names[$g] = File::$macCharNames[$index]; + } + else { + if (array_key_exists($index - 258, $namesPascal)) { + $names[$g] = $namesPascal[$index - 258]; + } + } + } + + break; + + case 2.5: + // TODO + break; + + case 3: + // nothing + break; + + case 4: + // TODO + break; + } + + $data["names"] = $names; + + $this->data = $data; + } + + function _encode() { + $font = $this->getFont(); + $data = $this->data; + $data["format"] = 3; + + $length = $font->pack($this->def, $data); + + return $length; + /* + $subset = $font->getSubset(); + + switch($data["format"]) { + case 1: + // nothing to do + break; + + case 2: + $old_names = $data["names"]; + + $glyphNameIndex = range(0, count($subset)); + + $names = array(); + foreach($subset as $gid) { + $names[] = $data["names"][$data["glyphNameIndex"][$gid]]; + } + + $numberOfGlyphs = count($names); + $length += $font->writeUInt16($numberOfGlyphs); + + foreach($glyphNameIndex as $gni) { + $length += $font->writeUInt16($gni); + } + + //$names = array_slice($names, 257); + foreach($names as $name) { + $len = strlen($name); + $length += $font->writeUInt8($len); + $length += $font->write($name, $len); + } + + break; + + case 2.5: + // TODO + break; + + case 3: + // nothing + break; + + case 4: + // TODO + break; + } + + return $length;*/ + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/prep.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/prep.php new file mode 100644 index 0000000..a8442cf --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/Table/Type/prep.php @@ -0,0 +1,29 @@ +getFont(); + $font->seek($this->entry->offset); + $this->rawData = $font->read($this->entry->length); + } + function _encode() { + return $this->getFont()->write($this->rawData, $this->entry->length); + } +} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/Collection.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/Collection.php new file mode 100644 index 0000000..2c97030 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/Collection.php @@ -0,0 +1,99 @@ +numFonts)) { + return; + } + + $this->read(4); // tag name + + $this->version = $this->readFixed(); + $this->numFonts = $this->readUInt32(); + + for ($i = 0; $i < $this->numFonts; $i++) { + $this->collectionOffsets[] = $this->readUInt32(); + } + } + + /** + * @param int $fontId + * + * @throws OutOfBoundsException + * @return File + */ + function getFont($fontId) { + $this->parse(); + + if (!isset($this->collectionOffsets[$fontId])) { + throw new OutOfBoundsException(); + } + + if (isset($this->collection[$fontId])) { + return $this->collection[$fontId]; + } + + $font = new File(); + $font->f = $this->f; + $font->setTableOffset($this->collectionOffsets[$fontId]); + + return $this->collection[$fontId] = $font; + } + + function current() { + return $this->getFont($this->position); + } + + function key() { + return $this->position; + } + + function next() { + return ++$this->position; + } + + function rewind() { + $this->position = 0; + } + + function valid() { + $this->parse(); + + return isset($this->collectionOffsets[$this->position]); + } + + function count() { + $this->parse(); + + return $this->numFonts; + } +} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/File.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/File.php new file mode 100644 index 0000000..f4c797a --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/File.php @@ -0,0 +1,590 @@ +> 0x05) === 0x06) { // 2 bytes character (0x06 = 110 BIN) + $bytes[] = ($o - 0xC0) << 0x06; + $numbytes = 2; + } elseif (($o >> 0x04) === 0x0E) { // 3 bytes character (0x0E = 1110 BIN) + $bytes[] = ($o - 0xE0) << 0x0C; + $numbytes = 3; + } elseif (($o >> 0x03) === 0x1E) { // 4 bytes character (0x1E = 11110 BIN) + $bytes[] = ($o - 0xF0) << 0x12; + $numbytes = 4; + } else { + $ord = false; + break; + } + } elseif (($o >> 0x06) === 0x02) { // bytes 2, 3 and 4 must start with 0x02 = 10 BIN + $bytes[] = $o - 0x80; + if (\count($bytes) === $numbytes) { + // compose UTF-8 bytes to a single unicode value + $o = $bytes[0]; + for ($j = 1; $j < $numbytes; $j++) { + $o += ($bytes[$j] << (($numbytes - $j - 1) * 0x06)); + } + if ((($o >= 0xD800) and ($o <= 0xDFFF)) or ($o >= 0x10FFFF)) { + // The definition of UTF-8 prohibits encoding character numbers between + // U+D800 and U+DFFF, which are reserved for use with the UTF-16 + // encoding form (as surrogate pairs) and do not directly represent + // characters. + return false; + } else { + $ord = $o; // add char to array + } + // reset data for next char + $bytes = []; + $numbytes = 1; + } + } else { + $ord = false; + break; + } + } + + return $ord; + } + + function getTable() { + $this->parseTableEntries(); + + return $this->directory; + } + + function setTableOffset($offset) { + $this->tableOffset = $offset; + } + + function parse() { + $this->parseTableEntries(); + + $this->data = array(); + + foreach ($this->directory as $tag => $table) { + if (empty($this->data[$tag])) { + $this->readTable($tag); + } + } + } + + function utf8toUnicode($str) { + $len = mb_strlen($str, '8bit'); + $out = array(); + + for ($i = 0; $i < $len; $i++) { + $uni = -1; + $h = ord($str[$i]); + + if ($h <= 0x7F) { + $uni = $h; + } + elseif ($h >= 0xC2) { + if (($h <= 0xDF) && ($i < $len - 1)) { + $uni = ($h & 0x1F) << 6 | (ord($str[++$i]) & 0x3F); + } + elseif (($h <= 0xEF) && ($i < $len - 2)) { + $uni = ($h & 0x0F) << 12 | (ord($str[++$i]) & 0x3F) << 6 | (ord($str[++$i]) & 0x3F); + } + elseif (($h <= 0xF4) && ($i < $len - 3)) { + $uni = ($h & 0x0F) << 18 | (ord($str[++$i]) & 0x3F) << 12 | (ord($str[++$i]) & 0x3F) << 6 | (ord($str[++$i]) & 0x3F); + } + } + + if ($uni >= 0) { + $out[] = $uni; + } + } + + return $out; + } + + function getUnicodeCharMap() { + $subtable = null; + foreach ($this->getData("cmap", "subtables") as $_subtable) { + if ($_subtable["platformID"] == 0 || ($_subtable["platformID"] == 3 && $_subtable["platformSpecificID"] == 1)) { + $subtable = $_subtable; + break; + } + } + + if ($subtable) { + return $subtable["glyphIndexArray"]; + } + + $system_encodings = mb_list_encodings(); + $system_encodings = array_change_key_case(array_fill_keys($system_encodings, true), CASE_UPPER); + foreach ($this->getData("cmap", "subtables") as $_subtable) { + $encoding = null; + switch ($_subtable["platformID"]) { + case 3: + switch ($_subtable["platformSpecificID"]) { + case 2: + if (\array_key_exists("SJIS", $system_encodings)) { + $encoding = "SJIS"; + } + break; + case 3: + if (\array_key_exists("GB18030", $system_encodings)) { + $encoding = "GB18030"; + } + break; + case 4: + if (\array_key_exists("BIG-5", $system_encodings)) { + $encoding = "BIG-5"; + } + break; + case 5: + if (\array_key_exists("UHC", $system_encodings)) { + $encoding = "UHC"; + } + break; + } + break; + } + if ($encoding) { + $glyphIndexArray = array(); + foreach ($_subtable["glyphIndexArray"] as $c => $gid) { + $str = trim(pack("N", $c)); + if (\strlen($str) > 0) { + $ord = $this->uniord($str, $encoding); + if ($ord > 0) { + $glyphIndexArray[$ord] = $gid; + } + } + } + return $glyphIndexArray; + } + } + + return null; + } + + function setSubset($subset) { + if (!is_array($subset)) { + $subset = $this->utf8toUnicode($subset); + } + + $subset = array_unique($subset); + + $glyphIndexArray = $this->getUnicodeCharMap(); + + if (!$glyphIndexArray) { + return; + } + + $gids = array( + 0, // .notdef + 1, // .null + ); + + foreach ($subset as $code) { + if (!isset($glyphIndexArray[$code])) { + continue; + } + + $gid = $glyphIndexArray[$code]; + $gids[$gid] = $gid; + } + + /** @var glyf $glyf */ + $glyf = $this->getTableObject("glyf"); + if ($glyf) { + $gids = $glyf->getGlyphIDs($gids); + sort($gids); + $this->glyph_subset = $gids; + } + $this->glyph_all = array_values($glyphIndexArray); // FIXME + } + + function getSubset() { + if (empty($this->glyph_subset)) { + return $this->glyph_all; + } + + return $this->glyph_subset; + } + + function encode($tags = array()) { + if (!self::$raw) { + $tags = array_merge(array("head", "hhea", "cmap", "hmtx", "maxp", "glyf", "loca", "name", "post", "cvt ", "fpgm", "prep"), $tags); + } + else { + $tags = array_keys($this->directory); + } + + $n = 16; // @todo + + Font::d("Tables : " . implode(", ", $tags)); + + /** @var DirectoryEntry[] $entries */ + $entries = array(); + foreach ($tags as $tag) { + if (!isset($this->directory[$tag])) { + Font::d(" >> '$tag' table doesn't exist"); + continue; + } + + $entries[$tag] = $this->directory[$tag]; + } + + $num_tables = count($entries); + $exponent = floor(log($num_tables, 2)); + $power_of_two = pow(2, $exponent); + + $this->header->data["numTables"] = $num_tables; + $this->header->data["searchRange"] = $power_of_two * 16; + $this->header->data["entrySelector"] = log($power_of_two, 2); + $this->header->data["rangeShift"] = $num_tables * 16 - $this->header->data["searchRange"]; + $this->header->encode(); + + $directory_offset = $this->pos(); + $offset = $directory_offset + $num_tables * $n; + $this->seek($offset); + + $i = 0; + foreach ($entries as $entry) { + $entry->encode($directory_offset + $i * $n); + $i++; + } + } + + function parseHeader() { + if (!empty($this->header)) { + return; + } + + $this->seek($this->tableOffset); + + $this->header = new Header($this); + $this->header->parse(); + } + + function getFontType(){ + $class_parts = explode("\\", get_class($this)); + return $class_parts[1]; + } + + function parseTableEntries() { + $this->parseHeader(); + + if (!empty($this->directory)) { + return; + } + + if (empty($this->header->data["numTables"])) { + return; + } + + + $type = $this->getFontType(); + $class = "FontLib\\$type\\TableDirectoryEntry"; + + for ($i = 0; $i < $this->header->data["numTables"]; $i++) { + /** @var TableDirectoryEntry $entry */ + $entry = new $class($this); + $entry->parse(); + + $this->directory[$entry->tag] = $entry; + } + } + + function normalizeFUnit($value, $base = 1000) { + return round($value * ($base / $this->getData("head", "unitsPerEm"))); + } + + protected function readTable($tag) { + $this->parseTableEntries(); + + if (!self::$raw) { + $name_canon = preg_replace("/[^a-z0-9]/", "", strtolower($tag)); + + $class = "FontLib\\Table\\Type\\$name_canon"; + + if (!isset($this->directory[$tag]) || !@class_exists($class)) { + return; + } + } + else { + $class = "FontLib\\Table\\Table"; + } + + /** @var Table $table */ + $table = new $class($this->directory[$tag]); + $table->parse(); + + $this->data[$tag] = $table; + } + + /** + * @param $name + * + * @return Table + */ + public function getTableObject($name) { + if (\array_key_exists($name, $this->data)) { + return $this->data[$name]; + } + return null; + } + + public function setTableObject($name, Table $data) { + $this->data[$name] = $data; + } + + public function getData($name, $key = null) { + $this->parseTableEntries(); + + if (empty($this->data[$name])) { + $this->readTable($name); + } + + if (!isset($this->data[$name])) { + return null; + } + + if (!$key) { + return $this->data[$name]->data; + } + else { + return $this->data[$name]->data[$key]; + } + } + + function addDirectoryEntry(DirectoryEntry $entry) { + $this->directory[$entry->tag] = $entry; + } + + function saveAdobeFontMetrics($file, $encoding = null) { + $afm = new AdobeFontMetrics($this); + $afm->write($file, $encoding); + } + + /** + * Get a specific name table string value from its ID + * + * @param int $nameID The name ID + * + * @return string|null + */ + function getNameTableString($nameID) { + /** @var nameRecord[] $records */ + $records = $this->getData("name", "records"); + + if (!isset($records[$nameID])) { + return null; + } + + return $records[$nameID]->string; + } + + /** + * Get font copyright + * + * @return string|null + */ + function getFontCopyright() { + return $this->getNameTableString(name::NAME_COPYRIGHT); + } + + /** + * Get font name + * + * @return string|null + */ + function getFontName() { + return $this->getNameTableString(name::NAME_NAME); + } + + /** + * Get font subfamily + * + * @return string|null + */ + function getFontSubfamily() { + return $this->getNameTableString(name::NAME_SUBFAMILY); + } + + /** + * Get font subfamily ID + * + * @return string|null + */ + function getFontSubfamilyID() { + return $this->getNameTableString(name::NAME_SUBFAMILY_ID); + } + + /** + * Get font full name + * + * @return string|null + */ + function getFontFullName() { + return $this->getNameTableString(name::NAME_FULL_NAME); + } + + /** + * Get font version + * + * @return string|null + */ + function getFontVersion() { + return $this->getNameTableString(name::NAME_VERSION); + } + + /** + * Get font weight + * + * @return string|null + */ + function getFontWeight() { + return $this->getTableObject("OS/2")->data["usWeightClass"]; + } + + /** + * Get font Postscript name + * + * @return string|null + */ + function getFontPostscriptName() { + return $this->getNameTableString(name::NAME_POSTSCRIPT_NAME); + } + + function reduce() { + $names_to_keep = array( + name::NAME_COPYRIGHT, + name::NAME_NAME, + name::NAME_SUBFAMILY, + name::NAME_SUBFAMILY_ID, + name::NAME_FULL_NAME, + name::NAME_VERSION, + name::NAME_POSTSCRIPT_NAME, + ); + + foreach ($this->data["name"]->data["records"] as $id => $rec) { + if (!in_array($id, $names_to_keep)) { + unset($this->data["name"]->data["records"][$id]); + } + } + } +} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/Header.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/Header.php new file mode 100644 index 0000000..7c04728 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/Header.php @@ -0,0 +1,30 @@ + self::uint32, + "numTables" => self::uint16, + "searchRange" => self::uint16, + "entrySelector" => self::uint16, + "rangeShift" => self::uint16, + ); + + public function parse() { + parent::parse(); + + $format = $this->data["format"]; + $this->data["formatText"] = $this->convertUInt32ToStr($format); + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/TableDirectoryEntry.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/TableDirectoryEntry.php new file mode 100644 index 0000000..3ddd6d0 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/TrueType/TableDirectoryEntry.php @@ -0,0 +1,32 @@ +font; + $this->checksum = $font->readUInt32(); + $this->offset = $font->readUInt32(); + $this->length = $font->readUInt32(); + $this->entryLength += 12; + } +} + diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/WOFF/File.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/WOFF/File.php new file mode 100644 index 0000000..bbc40fb --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/WOFF/File.php @@ -0,0 +1,80 @@ +header)) { + return; + } + + $this->header = new Header($this); + $this->header->parse(); + } + + public function load($file) { + parent::load($file); + + $this->parseTableEntries(); + $dataOffset = $this->pos() + count($this->directory) * 20; + + $fw = $this->getTempFile(false); + $fr = $this->f; + + $this->f = $fw; + $offset = $this->header->encode(); + + foreach ($this->directory as $entry) { + // Read ... + $this->f = $fr; + $this->seek($entry->offset); + $data = $this->read($entry->length); + + if ($entry->length < $entry->origLength) { + $data = (string) gzuncompress($data); + } + + // Prepare data ... + $length = mb_strlen($data, '8bit'); + $entry->length = $entry->origLength = $length; + $entry->offset = $dataOffset; + + // Write ... + $this->f = $fw; + + // Woff Entry + $this->seek($offset); + $offset += $this->write($entry->tag, 4); // tag + $offset += $this->writeUInt32($dataOffset); // offset + $offset += $this->writeUInt32($length); // length + $offset += $this->writeUInt32($length); // origLength + $offset += $this->writeUInt32(DirectoryEntry::computeChecksum($data)); // checksum + + // Data + $this->seek($dataOffset); + $dataOffset += $this->write($data, $length); + } + + $this->f = $fw; + $this->seek(0); + + // Need to re-parse this, don't know why + $this->header = null; + $this->directory = array(); + $this->parseTableEntries(); + } +} diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/WOFF/Header.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/WOFF/Header.php new file mode 100644 index 0000000..e87a8d3 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/WOFF/Header.php @@ -0,0 +1,31 @@ + self::uint32, + "flavor" => self::uint32, + "length" => self::uint32, + "numTables" => self::uint16, + self::uint16, + "totalSfntSize" => self::uint32, + "majorVersion" => self::uint16, + "minorVersion" => self::uint16, + "metaOffset" => self::uint32, + "metaLength" => self::uint32, + "metaOrigLength" => self::uint32, + "privOffset" => self::uint32, + "privLength" => self::uint32, + ); +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-font-lib/src/FontLib/WOFF/TableDirectoryEntry.php b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/WOFF/TableDirectoryEntry.php new file mode 100644 index 0000000..b57a650 --- /dev/null +++ b/dompdf/vendor/dompdf/php-font-lib/src/FontLib/WOFF/TableDirectoryEntry.php @@ -0,0 +1,33 @@ +font; + $this->offset = $font->readUInt32(); + $this->length = $font->readUInt32(); + $this->origLength = $font->readUInt32(); + $this->checksum = $font->readUInt32(); + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/AUTHORS.md b/dompdf/vendor/dompdf/php-svg-lib/AUTHORS.md new file mode 100644 index 0000000..6642e3d --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/AUTHORS.md @@ -0,0 +1,17 @@ +SvgLib was designed and developed by Fabien Ménager. + +### Current Team + +* **Brian Sweeney** (maintainer) + +### Alumni + +* **Fabien Ménager** (creator) + +### Contributors +* **ssddanbrown** +* [and many more...](https://github.com/dompdf/php-svg-lib/graphs/contributors) + +### Thanks + +SvgLib would not have been possible without strong community support. \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-svg-lib/LICENSE b/dompdf/vendor/dompdf/php-svg-lib/LICENSE new file mode 100644 index 0000000..0a04128 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + 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 that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU 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 as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/dompdf/vendor/dompdf/php-svg-lib/README.md b/dompdf/vendor/dompdf/php-svg-lib/README.md new file mode 100644 index 0000000..ff3c921 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/README.md @@ -0,0 +1,12 @@ +# SVG file parsing / rendering library + +[![Build Status](https://github.com/dompdf/php-svg-lib/actions/workflows/test.yml/badge.svg)](https://github.com/dompdf/php-svg-lib/actions/workflows/test.yml) + +[![Latest Stable Version](https://poser.pugx.org/phenx/php-svg-lib/v/stable)](https://packagist.org/packages/phenx/php-svg-lib) +[![Total Downloads](https://poser.pugx.org/phenx/php-svg-lib/downloads)](https://packagist.org/packages/phenx/php-svg-lib) +[![Latest Unstable Version](https://poser.pugx.org/phenx/php-svg-lib/v/unstable)](https://packagist.org/packages/phenx/php-svg-lib) +[![License](https://poser.pugx.org/phenx/php-svg-lib/license)](https://packagist.org/packages/phenx/php-svg-lib) + +The main purpose of this lib is to rasterize SVG to a surface which can be an image or a PDF for example, through a `\Svg\Surface` PHP interface. + +This project was initialized by the need to render SVG documents inside PDF files for the [DomPdf](https://github.com/dompdf/dompdf) project. diff --git a/dompdf/vendor/dompdf/php-svg-lib/composer.json b/dompdf/vendor/dompdf/php-svg-lib/composer.json new file mode 100644 index 0000000..bf2b153 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/composer.json @@ -0,0 +1,31 @@ +{ + "name": "dompdf/php-svg-lib", + "type": "library", + "description": "A library to read, parse and export to PDF SVG files.", + "homepage": "https://github.com/dompdf/php-svg-lib", + "license": "LGPL-3.0-or-later", + "authors": [ + { + "name": "The SvgLib Community", + "homepage": "https://github.com/dompdf/php-svg-lib/blob/master/AUTHORS.md" + } + ], + "autoload": { + "psr-4": { + "Svg\\": "src/Svg" + } + }, + "autoload-dev": { + "psr-4": { + "Svg\\Tests\\": "tests/Svg" + } + }, + "require": { + "php": "^7.1 || ^8.0", + "ext-mbstring": "*", + "sabberworm/php-css-parser": "^8.4" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5" + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/CssLength.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/CssLength.php new file mode 100644 index 0000000..88eda8c --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/CssLength.php @@ -0,0 +1,135 @@ + + */ + protected static $inchDivisions = [ + 'in' => 1, + 'cm' => 2.54, + 'mm' => 25.4, + 'q' => 101.6, + 'pc' => 6, + 'pt' => 72, + ]; + + /** + * The CSS length unit indicator. + * Will be lower-case and one of the units listed in the '$units' array or empty. + * + * @var string + */ + protected $unit = ''; + + /** + * The numeric value of the given length. + * + * @var float + */ + protected $value = 0; + + /** + * The original unparsed length provided. + * + * @var string + */ + protected $unparsed; + + public function __construct(string $length) + { + $this->unparsed = $length; + $this->parseLengthComponents($length); + } + + /** + * Parse out the unit and value components from the given string length. + */ + protected function parseLengthComponents(string $length): void + { + $length = strtolower($length); + + foreach (self::$units as $unit) { + $pos = strpos($length, $unit); + if ($pos) { + $this->value = floatval(substr($length, 0, $pos)); + $this->unit = $unit; + return; + } + } + + $this->unit = ''; + $this->value = floatval($length); + } + + /** + * Get the unit type of this css length. + * Units are standardised to be lower-cased. + * + * @return string + */ + public function getUnit(): string + { + return $this->unit; + } + + /** + * Get this CSS length in the equivalent pixel count size. + * + * @param float $referenceSize + * @param float $dpi + * + * @return float + */ + public function toPixels(float $referenceSize = 11.0, float $dpi = 96.0): float + { + // Standard relative units + if (in_array($this->unit, ['em', 'rem', 'ex', 'ch'])) { + return $this->value * $referenceSize; + } + + // Percentage relative units + if (in_array($this->unit, ['%', 'vw', 'vh', 'vmin', 'vmax'])) { + return $this->value * ($referenceSize / 100); + } + + // Inch relative units + if (in_array($this->unit, array_keys(static::$inchDivisions))) { + $inchValue = $this->value * $dpi; + $division = static::$inchDivisions[$this->unit]; + return $inchValue / $division; + } + + return $this->value; + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/DefaultStyle.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/DefaultStyle.php new file mode 100644 index 0000000..e27bdb9 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/DefaultStyle.php @@ -0,0 +1,28 @@ +filename = $filename; + } + + protected function initParser() { + $parser = xml_parser_create("utf-8"); + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false); + xml_set_element_handler( + $parser, + array($this, "_tagStart"), + array($this, "_tagEnd") + ); + xml_set_character_data_handler( + $parser, + array($this, "_charData") + ); + + return $parser; + } + + public function __construct() { + + } + + /** + * Increase the nesting level for defs-like elements + * + * @return int + */ + public function enterDefs () { + $this->_defs_depth++; + $this->inDefs = true; + return $this->_defs_depth; + } + + /** + * Decrease the nesting level for defs-like elements + * + * @return int + */ + public function exitDefs () { + $this->_defs_depth--; + if ($this->_defs_depth < 0) { + $this->_defs_depth = 0; + } + $this->inDefs = ($this->_defs_depth > 0 ? true : false); + return $this->_defs_depth; + } + + /** + * @return SurfaceInterface + */ + public function getSurface() + { + return $this->surface; + } + + public function getStack() + { + return $this->stack; + } + + public function getWidth() + { + return $this->width; + } + + public function getHeight() + { + return $this->height; + } + + public function getDiagonal() + { + return sqrt(($this->width)**2 + ($this->height)**2) / sqrt(2); + } + + public function getDimensions() { + $rootAttributes = null; + + $parser = xml_parser_create("utf-8"); + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false); + xml_set_element_handler( + $parser, + function ($parser, $name, $attributes) use (&$rootAttributes) { + if ($name === "svg" && $rootAttributes === null) { + $attributes = array_change_key_case($attributes, CASE_LOWER); + + $rootAttributes = $attributes; + } + }, + function ($parser, $name) {} + ); + + $fp = fopen($this->filename, "r"); + while ($line = fread($fp, 8192)) { + xml_parse($parser, $line, false); + + if ($rootAttributes !== null) { + break; + } + } + xml_parse($parser, "", true); + + xml_parser_free($parser); + + return $this->handleSizeAttributes($rootAttributes); + } + + public function handleSizeAttributes($attributes){ + if ($this->width === null) { + if (isset($attributes["width"])) { + $width = $this->convertSize($attributes["width"], 400); + $this->width = $width; + } + + if (isset($attributes["height"])) { + $height = $this->convertSize($attributes["height"], 300); + $this->height = $height; + } + + if (isset($attributes['viewbox'])) { + $viewBox = preg_split('/[\s,]+/is', trim($attributes['viewbox'])); + if (count($viewBox) == 4) { + $this->x = $viewBox[0]; + $this->y = $viewBox[1]; + + if (!$this->width) { + $this->width = $viewBox[2]; + } + if (!$this->height) { + $this->height = $viewBox[3]; + } + } + } + } + + return array( + 0 => $this->width, + 1 => $this->height, + + "width" => $this->width, + "height" => $this->height, + ); + } + + public function getDocument(){ + return $this; + } + + /** + * Append a style sheet + * + * @param \Sabberworm\CSS\CSSList\Document $stylesheet + */ + public function appendStyleSheet($stylesheet) { + $this->styleSheets[] = $stylesheet; + } + + /** + * Get the document style sheets + * + * @return \Sabberworm\CSS\CSSList\Document[] + */ + public function getStyleSheets() { + return $this->styleSheets; + } + + protected function before($attributes) + { + $surface = $this->getSurface(); + + $style = new DefaultStyle($this); + $style->inherit($this); + $style->fromAttributes($attributes); + + $this->setStyle($style); + + $surface->setStyle($style); + } + + public function render(SurfaceInterface $surface) + { + $this->_defs_depth = 0; + $this->inDefs = false; + $this->surface = $surface; + + $parser = $this->initParser(); + + if ($this->x || $this->y) { + $surface->translate(-$this->x, -$this->y); + } + + $fp = fopen($this->filename, "r"); + while ($line = fread($fp, 8192)) { + xml_parse($parser, $line, false); + } + + xml_parse($parser, "", true); + + xml_parser_free($parser); + } + + protected function svgOffset($attributes) + { + $this->attributes = $attributes; + + $this->handleSizeAttributes($attributes); + } + + public function getDef($id) { + $id = ltrim($id, "#"); + + return isset($this->defs[$id]) ? $this->defs[$id] : null; + } + + private function _tagStart($parser, $name, $attributes) + { + $this->x = 0; + $this->y = 0; + + $tag = null; + + $attributes = array_change_key_case($attributes, CASE_LOWER); + + switch (strtolower($name)) { + case 'defs': + $this->enterDefs(); + return; + + case 'svg': + if (count($this->attributes)) { + $tag = new Group($this, $name); + } + else { + $tag = $this; + $this->svgOffset($attributes); + } + break; + + case 'path': + $tag = new Path($this, $name); + break; + + case 'rect': + $tag = new Rect($this, $name); + break; + + case 'circle': + $tag = new Circle($this, $name); + break; + + case 'ellipse': + $tag = new Ellipse($this, $name); + break; + + case 'image': + $tag = new Image($this, $name); + break; + + case 'line': + $tag = new Line($this, $name); + break; + + case 'polyline': + $tag = new Polyline($this, $name); + break; + + case 'polygon': + $tag = new Polygon($this, $name); + break; + + case 'lineargradient': + $tag = new LinearGradient($this, $name); + break; + + case 'radialgradient': + $tag = new LinearGradient($this, $name); + break; + + case 'stop': + $tag = new Stop($this, $name); + break; + + case 'style': + $tag = new StyleTag($this, $name); + break; + + case 'a': + $tag = new Anchor($this, $name); + break; + + case 'g': + $tag = new Group($this, $name); + break; + + case 'symbol': + $this->enterDefs(); + $tag = new Symbol($this, $name); + break; + + case 'clippath': + $tag = new ClipPath($this, $name); + break; + + case 'use': + $tag = new UseTag($this, $name); + break; + + case 'text': + $tag = new Text($this, $name); + break; + + case 'desc': + return; + } + + if ($tag) { + if (isset($attributes["id"])) { + $this->defs[$attributes["id"]] = $tag; + } + else { + /** @var AbstractTag $top */ + $top = end($this->stack); + if ($top && $top != $tag) { + $top->children[] = $tag; + } + } + + $this->stack[] = $tag; + + $tag->handle($attributes); + } + } + + function _charData($parser, $data) + { + $stack_top = end($this->stack); + + if ($stack_top instanceof Text || $stack_top instanceof StyleTag) { + $stack_top->appendText($data); + } + } + + function _tagEnd($parser, $name) + { + /** @var AbstractTag $tag */ + $tag = null; + switch (strtolower($name)) { + case 'defs': + $this->exitDefs(); + return; + + case 'symbol': + $this->exitDefs(); + $tag = array_pop($this->stack); + break; + + case 'svg': + case 'path': + case 'rect': + case 'circle': + case 'ellipse': + case 'image': + case 'line': + case 'polyline': + case 'polygon': + case 'radialgradient': + case 'lineargradient': + case 'stop': + case 'style': + case 'text': + case 'g': + case 'clippath': + case 'use': + case 'a': + $tag = array_pop($this->stack); + break; + } + + if ((!$this->inDefs && $tag) || $tag instanceof StyleTag) { + $tag->handleEnd(); + } + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Gradient/Stop.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Gradient/Stop.php new file mode 100644 index 0000000..186cc57 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Gradient/Stop.php @@ -0,0 +1,15 @@ +_document = $document; + } + } + + protected function getStyleMap() + { + return array( + 'color' => array('color', self::TYPE_COLOR), + 'opacity' => array('opacity', self::TYPE_NUMBER), + 'display' => array('display', self::TYPE_NAME), + + 'fill' => array('fill', self::TYPE_COLOR), + 'fill-opacity' => array('fillOpacity', self::TYPE_NUMBER), + 'fill-rule' => array('fillRule', self::TYPE_NAME), + + 'stroke' => array('stroke', self::TYPE_COLOR), + 'stroke-dasharray' => array('strokeDasharray', self::TYPE_NAME), + 'stroke-dashoffset' => array('strokeDashoffset', self::TYPE_NUMBER), + 'stroke-linecap' => array('strokeLinecap', self::TYPE_NAME), + 'stroke-linejoin' => array('strokeLinejoin', self::TYPE_NAME), + 'stroke-miterlimit' => array('strokeMiterlimit', self::TYPE_NUMBER), + 'stroke-opacity' => array('strokeOpacity', self::TYPE_NUMBER), + 'stroke-width' => array('strokeWidth', self::TYPE_NUMBER), + + 'font-family' => array('fontFamily', self::TYPE_NAME), + 'font-size' => array('fontSize', self::TYPE_NUMBER), + 'font-weight' => array('fontWeight', self::TYPE_NAME), + 'font-style' => array('fontStyle', self::TYPE_NAME), + 'text-anchor' => array('textAnchor', self::TYPE_NAME), + ); + } + + /** + * @param $attributes + * + * @return Style + */ + public function fromAttributes($attributes) + { + $this->fillStyles($attributes); + + if (isset($attributes["style"])) { + $styles = self::parseCssStyle($attributes["style"]); + $this->fillStyles($styles); + } + } + + public function inherit(AbstractTag $tag) { + $group = $tag->getParentGroup(); + if ($group) { + $parent_style = $group->getStyle(); + $this->_parentStyle = $parent_style; + foreach ($parent_style as $_key => $_value) { + if ($_value !== null) { + $this->$_key = $_value; + } + } + } + } + + public function fromStyleSheets(AbstractTag $tag, $attributes) { + $class = isset($attributes["class"]) ? preg_split('/\s+/', trim($attributes["class"])) : null; + + $stylesheets = $tag->getDocument()->getStyleSheets(); + + $styles = array(); + + foreach ($stylesheets as $_sc) { + + /** @var \Sabberworm\CSS\RuleSet\DeclarationBlock $_decl */ + foreach ($_sc->getAllDeclarationBlocks() as $_decl) { + + /** @var \Sabberworm\CSS\Property\Selector $_selector */ + foreach ($_decl->getSelectors() as $_selector) { + $_selector = $_selector->getSelector(); + + // Match class name + if ($class !== null) { + foreach ($class as $_class) { + if ($_selector === ".$_class") { + /** @var \Sabberworm\CSS\Rule\Rule $_rule */ + foreach ($_decl->getRules() as $_rule) { + $styles[$_rule->getRule()] = $_rule->getValue() . ""; + } + + break 2; + } + } + } + + // Match tag name + if ($_selector === $tag->tagName) { + /** @var \Sabberworm\CSS\Rule\Rule $_rule */ + foreach ($_decl->getRules() as $_rule) { + $styles[$_rule->getRule()] = $_rule->getValue() . ""; + } + + break; + } + } + } + } + + $this->fillStyles($styles); + } + + protected function fillStyles($styles) + { + $style_map = $this->getStyleMap(); + foreach ($style_map as $from => $spec) { + if (isset($styles[$from])) { + list($to, $type) = $spec; + $value = null; + switch ($type) { + case self::TYPE_COLOR: + $value = self::parseColor($styles[$from]); + if ($value === "currentcolor") { + if ($type === "color") { + $value = $this->_parentStyle->color; + } else { + $value = $this->color; + } + } + if (is_array($value) && $value[3] !== 1.0 && array_key_exists("{$from}-opacity", $style_map) === true) { + $styles["{$from}-opacity"] = $value[3]; + } + break; + + case self::TYPE_NUMBER: + $value = ($styles[$from] === null) ? null : (float)$styles[$from]; + break; + + default: + $value = $styles[$from]; + } + + if ($from === "font-family") { + $scheme = \strtolower(parse_url($value, PHP_URL_SCHEME) ?: ""); + if ( + $scheme === "phar" || \strtolower(\substr($value, 0, 7)) === "phar://" + || ($this->_document !== null && $this->_document->allowExternalReferences === false && $scheme !== "data") + ) { + continue; + } + } + + if ($value !== null) { + $this->$to = $value; + } + } + } + } + + static function parseColor($color) + { + $color = strtolower(trim($color)); + + $parts = preg_split('/[^,]\s+/', $color, 2); + + if (count($parts) == 2) { + $color = $parts[1]; + } else { + $color = $parts[0]; + } + + if ($color === "none") { + return "none"; + } + + if ($color === "currentcolor") { + return "currentcolor"; + } + + if ($color === "transparent") { + return [0.0, 0.0, 0.0, 0.0]; + } + + // SVG color name + if (isset(self::$colorNames[$color])) { + return self::parseHexColor(self::$colorNames[$color]); + } + + // Hex color + if ($color[0] === "#") { + return self::parseHexColor($color); + } + + // RGB color + if (strpos($color, "rgb") !== false) { + return self::getQuad($color); + } + + // HSL color + if (strpos($color, "hsl") !== false) { + $quad = self::getQuad($color, true); + + if ($quad == null) { + return null; + } + + list($h, $s, $l, $a) = $quad; + + $r = $l; + $g = $l; + $b = $l; + $v = ($l <= 0.5) ? ($l * (1.0 + $s)) : ($l + $s - $l * $s); + if ($v > 0) { + $m = $l + $l - $v; + $sv = ($v - $m) / $v; + $h *= 6.0; + $sextant = floor($h); + $fract = $h - $sextant; + $vsf = $v * $sv * $fract; + $mid1 = $m + $vsf; + $mid2 = $v - $vsf; + + switch ($sextant) { + case 0: + $r = $v; + $g = $mid1; + $b = $m; + break; + case 1: + $r = $mid2; + $g = $v; + $b = $m; + break; + case 2: + $r = $m; + $g = $v; + $b = $mid1; + break; + case 3: + $r = $m; + $g = $mid2; + $b = $v; + break; + case 4: + $r = $mid1; + $g = $m; + $b = $v; + break; + case 5: + $r = $v; + $g = $m; + $b = $mid2; + break; + } + } + $a = $a * 255; + + return array( + $r * 255.0, + $g * 255.0, + $b * 255.0, + $a + ); + } + + // Gradient + if (strpos($color, "url(#") !== false) { + $i = strpos($color, "("); + $j = strpos($color, ")"); + + // Bad url format + if ($i === false || $j === false) { + return null; + } + + //FIXME: gradients not supported? + return null; // trim(substr($color, $i + 1, $j - $i - 1)); + } + + return null; + } + + static function getQuad($color, $percent = false) { + $i = strpos($color, "("); + $j = strpos($color, ")"); + + // Bad color value + if ($i === false || $j === false) { + return null; + } + + $quad = preg_split("/\\s*[,\\/]\\s*/", trim(substr($color, $i + 1, $j - $i - 1))); + if (!isset($quad[3])) { + $quad[3] = "1"; + } + + if (count($quad) != 3 && count($quad) != 4) { + return null; + } + + foreach (array_keys($quad) as $c) { + $quad[$c] = trim($quad[$c]); + + if ($percent) { + if ($quad[$c][strlen($quad[$c]) - 1] === "%") { + $quad[$c] = floatval($quad[$c]) / 100; + } else { + $quad[$c] = floatval($quad[$c]) / 255; + } + } else { + if ($quad[$c][strlen($quad[$c]) - 1] === "%") { + $quad[$c] = floatval($quad[$c]) * 2.55; + } else { + $quad[$c] = floatval($quad[$c]); + } + } + } + + return $quad; + } + + static function parseHexColor($hex) + { + $c = array(0.0, 0.0, 0.0, 1.0); + + // #FFFFFF + if (isset($hex[6])) { + $c[0] = hexdec(substr($hex, 1, 2)); + $c[1] = hexdec(substr($hex, 3, 2)); + $c[2] = hexdec(substr($hex, 5, 2)); + + if (isset($hex[7])) { + $alpha = substr($hex, 7, 2); + if (ctype_xdigit($alpha)) { + $c[3] = round(hexdec($alpha)/255, 2); + } + } + } else { + $c[0] = hexdec($hex[1] . $hex[1]); + $c[1] = hexdec($hex[2] . $hex[2]); + $c[2] = hexdec($hex[3] . $hex[3]); + + if (isset($hex[4])) { + if (ctype_xdigit($hex[4])) { + $c[3] = round(hexdec($hex[4] . $hex[4])/255, 2); + } + } + } + + return $c; + } + + /** + * Simple CSS parser + * + * @param $style + * + * @return array + */ + static function parseCssStyle($style) + { + $matches = array(); + preg_match_all("/([a-z-]+)\\s*:\\s*([^;$]+)/si", $style, $matches, PREG_SET_ORDER); + + $styles = array(); + foreach ($matches as $match) { + $styles[$match[1]] = $match[2]; + } + + return $styles; + } + + static $colorNames = array( + 'antiquewhite' => '#FAEBD7', + 'aqua' => '#00FFFF', + 'aquamarine' => '#7FFFD4', + 'beige' => '#F5F5DC', + 'black' => '#000000', + 'blue' => '#0000FF', + 'brown' => '#A52A2A', + 'cadetblue' => '#5F9EA0', + 'chocolate' => '#D2691E', + 'cornflowerblue' => '#6495ED', + 'crimson' => '#DC143C', + 'darkblue' => '#00008B', + 'darkgoldenrod' => '#B8860B', + 'darkgreen' => '#006400', + 'darkmagenta' => '#8B008B', + 'darkorange' => '#FF8C00', + 'darkred' => '#8B0000', + 'darkseagreen' => '#8FBC8F', + 'darkslategray' => '#2F4F4F', + 'darkviolet' => '#9400D3', + 'deepskyblue' => '#00BFFF', + 'dodgerblue' => '#1E90FF', + 'firebrick' => '#B22222', + 'forestgreen' => '#228B22', + 'fuchsia' => '#FF00FF', + 'gainsboro' => '#DCDCDC', + 'gold' => '#FFD700', + 'gray' => '#808080', + 'green' => '#008000', + 'greenyellow' => '#ADFF2F', + 'hotpink' => '#FF69B4', + 'indigo' => '#4B0082', + 'khaki' => '#F0E68C', + 'lavenderblush' => '#FFF0F5', + 'lemonchiffon' => '#FFFACD', + 'lightcoral' => '#F08080', + 'lightgoldenrodyellow' => '#FAFAD2', + 'lightgreen' => '#90EE90', + 'lightsalmon' => '#FFA07A', + 'lightskyblue' => '#87CEFA', + 'lightslategray' => '#778899', + 'lightyellow' => '#FFFFE0', + 'lime' => '#00FF00', + 'limegreen' => '#32CD32', + 'magenta' => '#FF00FF', + 'maroon' => '#800000', + 'mediumaquamarine' => '#66CDAA', + 'mediumorchid' => '#BA55D3', + 'mediumseagreen' => '#3CB371', + 'mediumspringgreen' => '#00FA9A', + 'mediumvioletred' => '#C71585', + 'midnightblue' => '#191970', + 'mintcream' => '#F5FFFA', + 'moccasin' => '#FFE4B5', + 'navy' => '#000080', + 'olive' => '#808000', + 'orange' => '#FFA500', + 'orchid' => '#DA70D6', + 'palegreen' => '#98FB98', + 'palevioletred' => '#D87093', + 'peachpuff' => '#FFDAB9', + 'pink' => '#FFC0CB', + 'powderblue' => '#B0E0E6', + 'purple' => '#800080', + 'red' => '#FF0000', + 'royalblue' => '#4169E1', + 'salmon' => '#FA8072', + 'seagreen' => '#2E8B57', + 'sienna' => '#A0522D', + 'silver' => '#C0C0C0', + 'skyblue' => '#87CEEB', + 'slategray' => '#708090', + 'springgreen' => '#00FF7F', + 'steelblue' => '#4682B4', + 'tan' => '#D2B48C', + 'teal' => '#008080', + 'thistle' => '#D8BFD8', + 'turquoise' => '#40E0D0', + 'violetred' => '#D02090', + 'white' => '#FFFFFF', + 'yellow' => '#FFFF00', + 'aliceblue' => '#f0f8ff', + 'azure' => '#f0ffff', + 'bisque' => '#ffe4c4', + 'blanchedalmond' => '#ffebcd', + 'blueviolet' => '#8a2be2', + 'burlywood' => '#deb887', + 'chartreuse' => '#7fff00', + 'coral' => '#ff7f50', + 'cornsilk' => '#fff8dc', + 'cyan' => '#00ffff', + 'darkcyan' => '#008b8b', + 'darkgray' => '#a9a9a9', + 'darkgrey' => '#a9a9a9', + 'darkkhaki' => '#bdb76b', + 'darkolivegreen' => '#556b2f', + 'darkorchid' => '#9932cc', + 'darksalmon' => '#e9967a', + 'darkslateblue' => '#483d8b', + 'darkslategrey' => '#2f4f4f', + 'darkturquoise' => '#00ced1', + 'deeppink' => '#ff1493', + 'dimgray' => '#696969', + 'dimgrey' => '#696969', + 'floralwhite' => '#fffaf0', + 'ghostwhite' => '#f8f8ff', + 'goldenrod' => '#daa520', + 'grey' => '#808080', + 'honeydew' => '#f0fff0', + 'indianred' => '#cd5c5c', + 'ivory' => '#fffff0', + 'lavender' => '#e6e6fa', + 'lawngreen' => '#7cfc00', + 'lightblue' => '#add8e6', + 'lightcyan' => '#e0ffff', + 'lightgray' => '#d3d3d3', + 'lightgrey' => '#d3d3d3', + 'lightpink' => '#ffb6c1', + 'lightseagreen' => '#20b2aa', + 'lightslategrey' => '#778899', + 'lightsteelblue' => '#b0c4de', + 'linen' => '#faf0e6', + 'mediumblue' => '#0000cd', + 'mediumpurple' => '#9370db', + 'mediumslateblue' => '#7b68ee', + 'mediumturquoise' => '#48d1cc', + 'mistyrose' => '#ffe4e1', + 'navajowhite' => '#ffdead', + 'oldlace' => '#fdf5e6', + 'olivedrab' => '#6b8e23', + 'orangered' => '#ff4500', + 'palegoldenrod' => '#eee8aa', + 'paleturquoise' => '#afeeee', + 'papayawhip' => '#ffefd5', + 'peru' => '#cd853f', + 'plum' => '#dda0dd', + 'rosybrown' => '#bc8f8f', + 'saddlebrown' => '#8b4513', + 'sandybrown' => '#f4a460', + 'seashell' => '#fff5ee', + 'slateblue' => '#6a5acd', + 'slategrey' => '#708090', + 'snow' => '#fffafa', + 'tomato' => '#ff6347', + 'violet' => '#ee82ee', + 'wheat' => '#f5deb3', + 'whitesmoke' => '#f5f5f5', + 'yellowgreen' => '#9acd32', + ); +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Surface/CPdf.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Surface/CPdf.php new file mode 100644 index 0000000..ce807a2 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Surface/CPdf.php @@ -0,0 +1,6411 @@ + "Normal", "opacity" => 1.0]; + + /** + * array Current fill transparency (partial graphics state) + */ + public $currentFillTransparency = ["mode" => "Normal", "opacity" => 1.0]; + + /** + * @var array An array which is used to save the state of the document, mainly the colors and styles + * it is used to temporarily change to another state, then change back to what it was before + */ + public $stateStack = []; + + /** + * @var integer Number of elements within the state stack + */ + public $nStateStack = 0; + + /** + * @var integer Number of page objects within the document + */ + public $numPages = 0; + + /** + * @var array Object Id storage stack + */ + public $stack = []; + + /** + * @var integer Number of elements within the object Id storage stack + */ + public $nStack = 0; + + /** + * an array which contains information about the objects which are not firmly attached to pages + * these have been added with the addObject function + */ + public $looseObjects = []; + + /** + * array contains information about how the loose objects are to be added to the document + */ + public $addLooseObjects = []; + + /** + * @var integer The objectId of the information object for the document + * this contains authorship, title etc. + */ + public $infoObject = 0; + + /** + * @var integer Number of images being tracked within the document + */ + public $numImages = 0; + + /** + * @var array An array containing options about the document + * it defaults to turning on the compression of the objects + */ + public $options = ['compression' => true]; + + /** + * @var integer The objectId of the first page of the document + */ + public $firstPageId; + + /** + * @var integer The object Id of the procset object + */ + public $procsetObjectId; + + /** + * @var array Store the information about the relationship between font families + * this used so that the code knows which font is the bold version of another font, etc. + * the value of this array is initialised in the constructor function. + */ + public $fontFamilies = []; + + /** + * @var string Folder for php serialized formats of font metrics files. + * If empty string, use same folder as original metrics files. + * This can be passed in from class creator. + * If this folder does not exist or is not writable, Cpdf will be **much** slower. + * Because of potential trouble with php safe mode, folder cannot be created at runtime. + */ + public $fontcache = ''; + + /** + * @var integer The version of the font metrics cache file. + * This value must be manually incremented whenever the internal font data structure is modified. + */ + public $fontcacheVersion = 6; + + /** + * @var string Temporary folder. + * If empty string, will attempt system tmp folder. + * This can be passed in from class creator. + */ + public $tmp = ''; + + /** + * @var string Track if the current font is bolded or italicised + */ + public $currentTextState = ''; + + /** + * @var string Messages are stored here during processing, these can be selected afterwards to give some useful debug information + */ + public $messages = ''; + + /** + * @var string The encryption array for the document encryption is stored here + */ + public $arc4 = ''; + + /** + * @var integer The object Id of the encryption information + */ + public $arc4_objnum = 0; + + /** + * @var string The file identifier, used to uniquely identify a pdf document + */ + public $fileIdentifier = ''; + + /** + * @var boolean A flag to say if a document is to be encrypted or not + */ + public $encrypted = false; + + /** + * @var string The encryption key for the encryption of all the document content (structure is not encrypted) + */ + public $encryptionKey = ''; + + /** + * @var array Array which forms a stack to keep track of nested callback functions + */ + public $callback = []; + + /** + * @var integer The number of callback functions in the callback array + */ + public $nCallback = 0; + + /** + * @var array Store label->id pairs for named destinations, these will be used to replace internal links + * done this way so that destinations can be defined after the location that links to them + */ + public $destinations = []; + + /** + * @var array Store the stack for the transaction commands, each item in here is a record of the values of all the + * publiciables within the class, so that the user can rollback at will (from each 'start' command) + * note that this includes the objects array, so these can be large. + */ + public $checkpoint = ''; + + /** + * @var array Table of Image origin filenames and image labels which were already added with o_image(). + * Allows to merge identical images + */ + public $imagelist = []; + + /** + * @var array Table of already added alpha and plain image files for transparent PNG images. + */ + protected $imageAlphaList = []; + + /** + * @var array List of temporary image files to be deleted after processing. + */ + protected $imageCache = []; + + /** + * @var boolean Whether the text passed in should be treated as Unicode or just local character set. + */ + public $isUnicode = false; + + /** + * @var string the JavaScript code of the document + */ + public $javascript = ''; + + /** + * @var boolean whether the compression is possible + */ + protected $compressionReady = false; + + /** + * @var array Current page size + */ + protected $currentPageSize = ["width" => 0, "height" => 0]; + + /** + * @var array All the chars that will be required in the font subsets + */ + protected $stringSubsets = []; + + /** + * @var string The target internal encoding + */ + protected static $targetEncoding = 'Windows-1252'; + + /** + * @var array + */ + protected $byteRange = array(); + + /** + * @var array The list of the core fonts + */ + protected static $coreFonts = [ + 'courier', + 'courier-bold', + 'courier-oblique', + 'courier-boldoblique', + 'helvetica', + 'helvetica-bold', + 'helvetica-oblique', + 'helvetica-boldoblique', + 'times-roman', + 'times-bold', + 'times-italic', + 'times-bolditalic', + 'symbol', + 'zapfdingbats' + ]; + + /** + * Class constructor + * This will start a new document + * + * @param array $pageSize Array of 4 numbers, defining the bottom left and upper right corner of the page. first two are normally zero. + * @param boolean $isUnicode Whether text will be treated as Unicode or not. + * @param string $fontcache The font cache folder + * @param string $tmp The temporary folder + */ + function __construct($pageSize = [0, 0, 612, 792], $isUnicode = false, $fontcache = '', $tmp = '') + { + $this->isUnicode = $isUnicode; + $this->fontcache = rtrim($fontcache, DIRECTORY_SEPARATOR."/\\"); + $this->tmp = ($tmp !== '' ? $tmp : sys_get_temp_dir()); + $this->newDocument($pageSize); + + $this->compressionReady = function_exists('gzcompress'); + + if (in_array('Windows-1252', mb_list_encodings())) { + self::$targetEncoding = 'Windows-1252'; + } + + // also initialize the font families that are known about already + $this->setFontFamily('init'); + } + + public function __destruct() + { + foreach ($this->imageCache as $file) { + if (file_exists($file)) { + unlink($file); + } + } + } + + /** + * Document object methods (internal use only) + * + * There is about one object method for each type of object in the pdf document + * Each function has the same call list ($id,$action,$options). + * $id = the object ID of the object, or what it is to be if it is being created + * $action = a string specifying the action to be performed, though ALL must support: + * 'new' - create the object with the id $id + * 'out' - produce the output for the pdf object + * $options = optional, a string or array containing the various parameters for the object + * + * These, in conjunction with the output function are the ONLY way for output to be produced + * within the pdf 'file'. + */ + + /** + * Destination object, used to specify the location for the user to jump to, presently on opening + * + * @param $id + * @param $action + * @param string $options + * @return string|null + */ + protected function o_destination($id, $action, $options = '') + { + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'destination', 'info' => []]; + $tmp = ''; + switch ($options['type']) { + case 'XYZ': + /** @noinspection PhpMissingBreakStatementInspection */ + case 'FitR': + $tmp = ' ' . $options['p3'] . $tmp; + case 'FitH': + case 'FitV': + case 'FitBH': + /** @noinspection PhpMissingBreakStatementInspection */ + case 'FitBV': + $tmp = ' ' . $options['p1'] . ' ' . $options['p2'] . $tmp; + case 'Fit': + case 'FitB': + $tmp = $options['type'] . $tmp; + $this->objects[$id]['info']['string'] = $tmp; + $this->objects[$id]['info']['page'] = $options['page']; + } + break; + + case 'out': + $o = &$this->objects[$id]; + + $tmp = $o['info']; + $res = "\n$id 0 obj\n" . '[' . $tmp['page'] . ' 0 R /' . $tmp['string'] . "]\nendobj"; + + return $res; + } + + return null; + } + + /** + * set the viewer preferences + * + * @param $id + * @param $action + * @param string|array $options + * @return string|null + */ + protected function o_viewerPreferences($id, $action, $options = '') + { + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'viewerPreferences', 'info' => []]; + break; + + case 'add': + $o = &$this->objects[$id]; + + foreach ($options as $k => $v) { + switch ($k) { + // Boolean keys + case 'HideToolbar': + case 'HideMenubar': + case 'HideWindowUI': + case 'FitWindow': + case 'CenterWindow': + case 'DisplayDocTitle': + case 'PickTrayByPDFSize': + $o['info'][$k] = (bool)$v; + break; + + // Integer keys + case 'NumCopies': + $o['info'][$k] = (int)$v; + break; + + // Name keys + case 'ViewArea': + case 'ViewClip': + case 'PrintClip': + case 'PrintArea': + $o['info'][$k] = (string)$v; + break; + + // Named with limited valid values + case 'NonFullScreenPageMode': + if (!in_array($v, ['UseNone', 'UseOutlines', 'UseThumbs', 'UseOC'])) { + break; + } + $o['info'][$k] = $v; + break; + + case 'Direction': + if (!in_array($v, ['L2R', 'R2L'])) { + break; + } + $o['info'][$k] = $v; + break; + + case 'PrintScaling': + if (!in_array($v, ['None', 'AppDefault'])) { + break; + } + $o['info'][$k] = $v; + break; + + case 'Duplex': + if (!in_array($v, ['None', 'Simplex', 'DuplexFlipShortEdge', 'DuplexFlipLongEdge'])) { + break; + } + $o['info'][$k] = $v; + break; + + // Integer array + case 'PrintPageRange': + // Cast to integer array + foreach ($v as $vK => $vV) { + $v[$vK] = (int)$vV; + } + $o['info'][$k] = array_values($v); + break; + } + } + break; + + case 'out': + $o = &$this->objects[$id]; + $res = "\n$id 0 obj\n<< "; + + foreach ($o['info'] as $k => $v) { + if (is_string($v)) { + $v = '/' . $v; + } elseif (is_int($v)) { + $v = (string) $v; + } elseif (is_bool($v)) { + $v = ($v ? 'true' : 'false'); + } elseif (is_array($v)) { + $v = '[' . implode(' ', $v) . ']'; + } + $res .= "\n/$k $v"; + } + $res .= "\n>>\nendobj"; + + return $res; + } + + return null; + } + + /** + * define the document catalog, the overall controller for the document + * + * @param $id + * @param $action + * @param string|array $options + * @return string|null + */ + protected function o_catalog($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'catalog', 'info' => []]; + $this->catalogId = $id; + break; + + case 'acroform': + case 'outlines': + case 'pages': + case 'openHere': + case 'names': + $o['info'][$action] = $options; + break; + + case 'viewerPreferences': + if (!isset($o['info']['viewerPreferences'])) { + $this->numObj++; + $this->o_viewerPreferences($this->numObj, 'new'); + $o['info']['viewerPreferences'] = $this->numObj; + } + + $vp = $o['info']['viewerPreferences']; + $this->o_viewerPreferences($vp, 'add', $options); + + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /Catalog"; + + foreach ($o['info'] as $k => $v) { + switch ($k) { + case 'outlines': + $res .= "\n/Outlines $v 0 R"; + break; + + case 'pages': + $res .= "\n/Pages $v 0 R"; + break; + + case 'viewerPreferences': + $res .= "\n/ViewerPreferences $v 0 R"; + break; + + case 'openHere': + $res .= "\n/OpenAction $v 0 R"; + break; + + case 'names': + $res .= "\n/Names $v 0 R"; + break; + + case 'acroform': + $res .= "\n/AcroForm $v 0 R"; + break; + } + } + + $res .= " >>\nendobj"; + + return $res; + } + + return null; + } + + /** + * object which is a parent to the pages in the document + * + * @param $id + * @param $action + * @param string $options + * @return string|null + */ + protected function o_pages($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'pages', 'info' => []]; + $this->o_catalog($this->catalogId, 'pages', $id); + break; + + case 'page': + if (!is_array($options)) { + // then it will just be the id of the new page + $o['info']['pages'][] = $options; + } else { + // then it should be an array having 'id','rid','pos', where rid=the page to which this one will be placed relative + // and pos is either 'before' or 'after', saying where this page will fit. + if (isset($options['id']) && isset($options['rid']) && isset($options['pos'])) { + $i = array_search($options['rid'], $o['info']['pages']); + if (isset($o['info']['pages'][$i]) && $o['info']['pages'][$i] == $options['rid']) { + + // then there is a match + // make a space + switch ($options['pos']) { + case 'before': + $k = $i; + break; + + case 'after': + $k = $i + 1; + break; + + default: + $k = -1; + break; + } + + if ($k >= 0) { + for ($j = count($o['info']['pages']) - 1; $j >= $k; $j--) { + $o['info']['pages'][$j + 1] = $o['info']['pages'][$j]; + } + + $o['info']['pages'][$k] = $options['id']; + } + } + } + } + break; + + case 'procset': + $o['info']['procset'] = $options; + break; + + case 'mediaBox': + $o['info']['mediaBox'] = $options; + // which should be an array of 4 numbers + $this->currentPageSize = ['width' => $options[2], 'height' => $options[3]]; + break; + + case 'font': + $o['info']['fonts'][] = ['objNum' => $options['objNum'], 'fontNum' => $options['fontNum']]; + break; + + case 'extGState': + $o['info']['extGStates'][] = ['objNum' => $options['objNum'], 'stateNum' => $options['stateNum']]; + break; + + case 'xObject': + $o['info']['xObjects'][] = ['objNum' => $options['objNum'], 'label' => $options['label']]; + break; + + case 'out': + if (count($o['info']['pages'])) { + $res = "\n$id 0 obj\n<< /Type /Pages\n/Kids ["; + foreach ($o['info']['pages'] as $v) { + $res .= "$v 0 R\n"; + } + + $res .= "]\n/Count " . count($this->objects[$id]['info']['pages']); + + if ((isset($o['info']['fonts']) && count($o['info']['fonts'])) || + isset($o['info']['procset']) || + (isset($o['info']['extGStates']) && count($o['info']['extGStates'])) + ) { + $res .= "\n/Resources <<"; + + if (isset($o['info']['procset'])) { + $res .= "\n/ProcSet " . $o['info']['procset'] . " 0 R"; + } + + if (isset($o['info']['fonts']) && count($o['info']['fonts'])) { + $res .= "\n/Font << "; + foreach ($o['info']['fonts'] as $finfo) { + $res .= "\n/F" . $finfo['fontNum'] . " " . $finfo['objNum'] . " 0 R"; + } + $res .= "\n>>"; + } + + if (isset($o['info']['xObjects']) && count($o['info']['xObjects'])) { + $res .= "\n/XObject << "; + foreach ($o['info']['xObjects'] as $finfo) { + $res .= "\n/" . $finfo['label'] . " " . $finfo['objNum'] . " 0 R"; + } + $res .= "\n>>"; + } + + if (isset($o['info']['extGStates']) && count($o['info']['extGStates'])) { + $res .= "\n/ExtGState << "; + foreach ($o['info']['extGStates'] as $gstate) { + $res .= "\n/GS" . $gstate['stateNum'] . " " . $gstate['objNum'] . " 0 R"; + } + $res .= "\n>>"; + } + + $res .= "\n>>"; + if (isset($o['info']['mediaBox'])) { + $tmp = $o['info']['mediaBox']; + $res .= "\n/MediaBox [" . sprintf( + '%.3F %.3F %.3F %.3F', + $tmp[0], + $tmp[1], + $tmp[2], + $tmp[3] + ) . ']'; + } + } + + $res .= "\n >>\nendobj"; + } else { + $res = "\n$id 0 obj\n<< /Type /Pages\n/Count 0\n>>\nendobj"; + } + + return $res; + } + + return null; + } + + /** + * define the outlines in the doc, empty for now + * + * @param $id + * @param $action + * @param string $options + * @return string|null + */ + protected function o_outlines($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'outlines', 'info' => ['outlines' => []]]; + $this->o_catalog($this->catalogId, 'outlines', $id); + break; + + case 'outline': + $o['info']['outlines'][] = $options; + break; + + case 'out': + if (count($o['info']['outlines'])) { + $res = "\n$id 0 obj\n<< /Type /Outlines /Kids ["; + foreach ($o['info']['outlines'] as $v) { + $res .= "$v 0 R "; + } + + $res .= "] /Count " . count($o['info']['outlines']) . " >>\nendobj"; + } else { + $res = "\n$id 0 obj\n<< /Type /Outlines /Count 0 >>\nendobj"; + } + + return $res; + } + + return null; + } + + /** + * an object to hold the font description + * + * @param $id + * @param $action + * @param string|array $options + * @return string|null + * @throws FontNotFoundException + */ + protected function o_font($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = [ + 't' => 'font', + 'info' => [ + 'name' => $options['name'], + 'fontFileName' => $options['fontFileName'], + 'SubType' => 'Type1', + 'isSubsetting' => $options['isSubsetting'] + ] + ]; + $fontNum = $this->numFonts; + $this->objects[$id]['info']['fontNum'] = $fontNum; + + // deal with the encoding and the differences + if (isset($options['differences'])) { + // then we'll need an encoding dictionary + $this->numObj++; + $this->o_fontEncoding($this->numObj, 'new', $options); + $this->objects[$id]['info']['encodingDictionary'] = $this->numObj; + } else { + if (isset($options['encoding'])) { + // we can specify encoding here + switch ($options['encoding']) { + case 'WinAnsiEncoding': + case 'MacRomanEncoding': + case 'MacExpertEncoding': + $this->objects[$id]['info']['encoding'] = $options['encoding']; + break; + + case 'none': + break; + + default: + $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding'; + break; + } + } else { + $this->objects[$id]['info']['encoding'] = 'WinAnsiEncoding'; + } + } + + if ($this->fonts[$options['fontFileName']]['isUnicode']) { + // For Unicode fonts, we need to incorporate font data into + // sub-sections that are linked from the primary font section. + // Look at o_fontGIDtoCID and o_fontDescendentCID functions + // for more information. + // + // All of this code is adapted from the excellent changes made to + // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/) + + $toUnicodeId = ++$this->numObj; + $this->o_toUnicode($toUnicodeId, 'new'); + $this->objects[$id]['info']['toUnicode'] = $toUnicodeId; + + $cidFontId = ++$this->numObj; + $this->o_fontDescendentCID($cidFontId, 'new', $options); + $this->objects[$id]['info']['cidFont'] = $cidFontId; + } + + // also tell the pages node about the new font + $this->o_pages($this->currentNode, 'font', ['fontNum' => $fontNum, 'objNum' => $id]); + break; + + case 'add': + $font_options = $this->processFont($id, $o['info']); + + if ($font_options !== false) { + foreach ($font_options as $k => $v) { + switch ($k) { + case 'BaseFont': + $o['info']['name'] = $v; + break; + case 'FirstChar': + case 'LastChar': + case 'Widths': + case 'FontDescriptor': + case 'SubType': + $this->addMessage('o_font ' . $k . " : " . $v); + $o['info'][$k] = $v; + break; + } + } + + // pass values down to descendent font + if (isset($o['info']['cidFont'])) { + $this->o_fontDescendentCID($o['info']['cidFont'], 'add', $font_options); + } + } + break; + + case 'out': + if ($this->fonts[$this->objects[$id]['info']['fontFileName']]['isUnicode']) { + // For Unicode fonts, we need to incorporate font data into + // sub-sections that are linked from the primary font section. + // Look at o_fontGIDtoCID and o_fontDescendentCID functions + // for more information. + // + // All of this code is adapted from the excellent changes made to + // transform FPDF to TCPDF (http://tcpdf.sourceforge.net/) + + $res = "\n$id 0 obj\n<fonts[$fontFileName])) { + return false; + } + + $font = &$this->fonts[$fontFileName]; + + $fileSuffix = $font['fileSuffix']; + $fileSuffixLower = strtolower($font['fileSuffix']); + $fbfile = "$fontFileName.$fileSuffix"; + $isTtfFont = $fileSuffixLower === 'ttf'; + $isPfbFont = $fileSuffixLower === 'pfb'; + + $this->addMessage('selectFont: checking for - ' . $fbfile); + + if (!$fileSuffix) { + $this->addMessage( + 'selectFont: pfb or ttf file not found, ok if this is one of the 14 standard fonts' + ); + + return false; + } else { + $adobeFontName = isset($font['PostScriptName']) ? $font['PostScriptName'] : $font['FontName']; + // $fontObj = $this->numObj; + $this->addMessage("selectFont: adding font file - $fbfile - $adobeFontName"); + + // find the array of font widths, and put that into an object. + $firstChar = -1; + $lastChar = 0; + $widths = []; + $cid_widths = []; + + foreach ($font['C'] as $num => $d) { + if (intval($num) > 0 || $num == '0') { + if (!$font['isUnicode']) { + // With Unicode, widths array isn't used + if ($lastChar > 0 && $num > $lastChar + 1) { + for ($i = $lastChar + 1; $i < $num; $i++) { + $widths[] = 0; + } + } + } + + $widths[] = $d; + + if ($font['isUnicode']) { + $cid_widths[$num] = $d; + } + + if ($firstChar == -1) { + $firstChar = $num; + } + + $lastChar = $num; + } + } + + // also need to adjust the widths for the differences array + if (isset($object['differences'])) { + foreach ($object['differences'] as $charNum => $charName) { + if ($charNum > $lastChar) { + if (!$object['isUnicode']) { + // With Unicode, widths array isn't used + for ($i = $lastChar + 1; $i <= $charNum; $i++) { + $widths[] = 0; + } + } + + $lastChar = $charNum; + } + + if (isset($font['C'][$charName])) { + $widths[$charNum - $firstChar] = $font['C'][$charName]; + if ($font['isUnicode']) { + $cid_widths[$charName] = $font['C'][$charName]; + } + } + } + } + + if ($font['isUnicode']) { + $font['CIDWidths'] = $cid_widths; + } + + $this->addMessage('selectFont: FirstChar = ' . $firstChar); + $this->addMessage('selectFont: LastChar = ' . $lastChar); + + $widthid = -1; + + if (!$font['isUnicode']) { + // With Unicode, widths array isn't used + + $this->numObj++; + $this->o_contents($this->numObj, 'new', 'raw'); + $this->objects[$this->numObj]['c'] .= '[' . implode(' ', $widths) . ']'; + $widthid = $this->numObj; + } + + $missing_width = 500; + $stemV = 70; + + if (isset($font['MissingWidth'])) { + $missing_width = $font['MissingWidth']; + } + if (isset($font['StdVW'])) { + $stemV = $font['StdVW']; + } else { + if (isset($font['Weight']) && preg_match('!(bold|black)!i', $font['Weight'])) { + $stemV = 120; + } + } + + // load the pfb file, and put that into an object too. + // note that pdf supports only binary format type 1 font files, though there is a + // simple utility to convert them from pfa to pfb. + $data = file_get_contents($fbfile); + + // create the font descriptor + $this->numObj++; + $fontDescriptorId = $this->numObj; + + $this->numObj++; + $pfbid = $this->numObj; + + // determine flags (more than a little flakey, hopefully will not matter much) + $flags = 0; + + if ($font['ItalicAngle'] != 0) { + $flags += pow(2, 6); + } + + if ($font['IsFixedPitch'] === 'true') { + $flags += 1; + } + + $flags += pow(2, 5); // assume non-sybolic + $list = [ + 'Ascent' => 'Ascender', + 'CapHeight' => 'Ascender', //FIXME: php-font-lib is not grabbing this value, so we'll fake it and use the Ascender value // 'CapHeight' + 'MissingWidth' => 'MissingWidth', + 'Descent' => 'Descender', + 'FontBBox' => 'FontBBox', + 'ItalicAngle' => 'ItalicAngle' + ]; + $fdopt = [ + 'Flags' => $flags, + 'FontName' => $adobeFontName, + 'StemV' => $stemV + ]; + + foreach ($list as $k => $v) { + if (isset($font[$v])) { + $fdopt[$k] = $font[$v]; + } + } + + if ($isPfbFont) { + $fdopt['FontFile'] = $pfbid; + } elseif ($isTtfFont) { + $fdopt['FontFile2'] = $pfbid; + } + + $this->o_fontDescriptor($fontDescriptorId, 'new', $fdopt); + + // embed the font program + $this->o_contents($this->numObj, 'new'); + $this->objects[$pfbid]['c'] .= $data; + + // determine the cruicial lengths within this file + if ($isPfbFont) { + $l1 = strpos($data, 'eexec') + 6; + $l2 = strpos($data, '00000000') - $l1; + $l3 = mb_strlen($data, '8bit') - $l2 - $l1; + $this->o_contents( + $this->numObj, + 'add', + ['Length1' => $l1, 'Length2' => $l2, 'Length3' => $l3] + ); + } elseif ($isTtfFont) { + $l1 = mb_strlen($data, '8bit'); + $this->o_contents($this->numObj, 'add', ['Length1' => $l1]); + } + + // tell the font object about all this new stuff + $options = [ + 'BaseFont' => $adobeFontName, + 'MissingWidth' => $missing_width, + 'Widths' => $widthid, + 'FirstChar' => $firstChar, + 'LastChar' => $lastChar, + 'FontDescriptor' => $fontDescriptorId + ]; + + if ($isTtfFont) { + $options['SubType'] = 'TrueType'; + } + + $this->addMessage("adding extra info to font.($fontObjId)"); + + foreach ($options as $fk => $fv) { + $this->addMessage("$fk : $fv"); + } + } + + return $options; + } + + /** + * A toUnicode section, needed for unicode fonts + * + * @param $id + * @param $action + * @return null|string + */ + protected function o_toUnicode($id, $action) + { + switch ($action) { + case 'new': + $this->objects[$id] = [ + 't' => 'toUnicode' + ]; + break; + case 'add': + break; + case 'out': + $ordering = 'UCS'; + $registry = 'Adobe'; + + if ($this->encrypted) { + $this->encryptInit($id); + $ordering = $this->ARC4($ordering); + $registry = $this->filterText($this->ARC4($registry), false, false); + } + + $stream = <<> def +/CMapName /Adobe-Identity-UCS def +/CMapType 2 def +1 begincodespacerange +<0000> +endcodespacerange +1 beginbfrange +<0000> <0000> +endbfrange +endcmap +CMapName currentdict /CMap defineresource pop +end +end +EOT; + + $res = "\n$id 0 obj\n"; + $res .= "<>\n"; + $res .= "stream\n" . $stream . "\nendstream" . "\nendobj"; + + return $res; + } + + return null; + } + + /** + * a font descriptor, needed for including additional fonts + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_fontDescriptor($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'fontDescriptor', 'info' => $options]; + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /FontDescriptor\n"; + foreach ($o['info'] as $label => $value) { + switch ($label) { + case 'Ascent': + case 'CapHeight': + case 'Descent': + case 'Flags': + case 'ItalicAngle': + case 'StemV': + case 'AvgWidth': + case 'Leading': + case 'MaxWidth': + case 'MissingWidth': + case 'StemH': + case 'XHeight': + case 'CharSet': + if (mb_strlen($value, '8bit')) { + $res .= "/$label $value\n"; + } + + break; + case 'FontFile': + case 'FontFile2': + case 'FontFile3': + $res .= "/$label $value 0 R\n"; + break; + + case 'FontBBox': + $res .= "/$label [$value[0] $value[1] $value[2] $value[3]]\n"; + break; + + case 'FontName': + $res .= "/$label /$value\n"; + break; + } + } + + $res .= ">>\nendobj"; + + return $res; + } + + return null; + } + + /** + * the font encoding + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_fontEncoding($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + // the options array should contain 'differences' and maybe 'encoding' + $this->objects[$id] = ['t' => 'fontEncoding', 'info' => $options]; + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /Encoding\n"; + if (!isset($o['info']['encoding'])) { + $o['info']['encoding'] = 'WinAnsiEncoding'; + } + + if ($o['info']['encoding'] !== 'none') { + $res .= "/BaseEncoding /" . $o['info']['encoding'] . "\n"; + } + + $res .= "/Differences \n["; + + $onum = -100; + + foreach ($o['info']['differences'] as $num => $label) { + if ($num != $onum + 1) { + // we cannot make use of consecutive numbering + $res .= "\n$num /$label"; + } else { + $res .= " /$label"; + } + + $onum = $num; + } + + $res .= "\n]\n>>\nendobj"; + + return $res; + } + + return null; + } + + /** + * a descendent cid font, needed for unicode fonts + * + * @param $id + * @param $action + * @param string|array $options + * @return null|string + */ + protected function o_fontDescendentCID($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'fontDescendentCID', 'info' => $options]; + + // we need a CID system info section + $cidSystemInfoId = ++$this->numObj; + $this->o_cidSystemInfo($cidSystemInfoId, 'new'); + $this->objects[$id]['info']['cidSystemInfo'] = $cidSystemInfoId; + + // and a CID to GID map + $cidToGidMapId = ++$this->numObj; + $this->o_fontGIDtoCIDMap($cidToGidMapId, 'new', $options); + $this->objects[$id]['info']['cidToGidMap'] = $cidToGidMapId; + break; + + case 'add': + foreach ($options as $k => $v) { + switch ($k) { + case 'BaseFont': + $o['info']['name'] = $v; + break; + + case 'FirstChar': + case 'LastChar': + case 'MissingWidth': + case 'FontDescriptor': + case 'SubType': + $this->addMessage("o_fontDescendentCID $k : $v"); + $o['info'][$k] = $v; + break; + } + } + + // pass values down to cid to gid map + $this->o_fontGIDtoCIDMap($o['info']['cidToGidMap'], 'add', $options); + break; + + case 'out': + $res = "\n$id 0 obj\n"; + $res .= "<fonts[$o['info']['fontFileName']]['CIDWidths'])) { + $cid_widths = &$this->fonts[$o['info']['fontFileName']]['CIDWidths']; + $w = ''; + foreach ($cid_widths as $cid => $width) { + $w .= "$cid [$width] "; + } + $res .= "/W [$w]\n"; + } + + $res .= "/CIDToGIDMap " . $o['info']['cidToGidMap'] . " 0 R\n"; + $res .= ">>\n"; + $res .= "endobj"; + + return $res; + } + + return null; + } + + /** + * CID system info section, needed for unicode fonts + * + * @param $id + * @param $action + * @return null|string + */ + protected function o_cidSystemInfo($id, $action) + { + switch ($action) { + case 'new': + $this->objects[$id] = [ + 't' => 'cidSystemInfo' + ]; + break; + case 'add': + break; + case 'out': + $ordering = 'UCS'; + $registry = 'Adobe'; + + if ($this->encrypted) { + $this->encryptInit($id); + $ordering = $this->ARC4($ordering); + $registry = $this->ARC4($registry); + } + + + $res = "\n$id 0 obj\n"; + + $res .= '<objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'fontGIDtoCIDMap', 'info' => $options]; + break; + + case 'out': + $res = "\n$id 0 obj\n"; + $fontFileName = $o['info']['fontFileName']; + $tmp = $this->fonts[$fontFileName]['CIDtoGID'] = base64_decode($this->fonts[$fontFileName]['CIDtoGID']); + + $compressed = isset($this->fonts[$fontFileName]['CIDtoGID_Compressed']) && + $this->fonts[$fontFileName]['CIDtoGID_Compressed']; + + if (!$compressed && isset($o['raw'])) { + $res .= $tmp; + } else { + $res .= "<<"; + + if (!$compressed && $this->compressionReady && $this->options['compression']) { + // then implement ZLIB based compression on this content stream + $compressed = true; + $tmp = gzcompress($tmp, 6); + } + if ($compressed) { + $res .= "\n/Filter /FlateDecode"; + } + + if ($this->encrypted) { + $this->encryptInit($id); + $tmp = $this->ARC4($tmp); + } + + $res .= "\n/Length " . mb_strlen($tmp, '8bit') . ">>\nstream\n$tmp\nendstream"; + } + + $res .= "\nendobj"; + + return $res; + } + + return null; + } + + /** + * the document procset, solves some problems with printing to old PS printers + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_procset($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'procset', 'info' => ['PDF' => 1, 'Text' => 1]]; + $this->o_pages($this->currentNode, 'procset', $id); + $this->procsetObjectId = $id; + break; + + case 'add': + // this is to add new items to the procset list, despite the fact that this is considered + // obsolete, the items are required for printing to some postscript printers + switch ($options) { + case 'ImageB': + case 'ImageC': + case 'ImageI': + $o['info'][$options] = 1; + break; + } + break; + + case 'out': + $res = "\n$id 0 obj\n["; + foreach ($o['info'] as $label => $val) { + $res .= "/$label "; + } + $res .= "]\nendobj"; + + return $res; + } + + return null; + } + + /** + * define the document information + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_info($id, $action, $options = '') + { + switch ($action) { + case 'new': + $this->infoObject = $id; + $date = 'D:' . @date('Ymd'); + $this->objects[$id] = [ + 't' => 'info', + 'info' => [ + 'Producer' => 'CPDF (dompdf)', + 'CreationDate' => $date + ] + ]; + break; + case 'Title': + case 'Author': + case 'Subject': + case 'Keywords': + case 'Creator': + case 'Producer': + case 'CreationDate': + case 'ModDate': + case 'Trapped': + $this->objects[$id]['info'][$action] = $options; + break; + + case 'out': + $encrypted = $this->encrypted; + if ($encrypted) { + $this->encryptInit($id); + } + + $res = "\n$id 0 obj\n<<\n"; + $o = &$this->objects[$id]; + foreach ($o['info'] as $k => $v) { + $res .= "/$k ("; + + // dates must be outputted as-is, without Unicode transformations + if ($k !== 'CreationDate' && $k !== 'ModDate') { + $v = $this->utf8toUtf16BE($v); + } + + if ($encrypted) { + $v = $this->ARC4($v); + } + + $res .= $this->filterText($v, false, false); + $res .= ")\n"; + } + + $res .= ">>\nendobj"; + + return $res; + } + + return null; + } + + /** + * an action object, used to link to URLS initially + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_action($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + if (is_array($options)) { + $this->objects[$id] = ['t' => 'action', 'info' => $options, 'type' => $options['type']]; + } else { + // then assume a URI action + $this->objects[$id] = ['t' => 'action', 'info' => $options, 'type' => 'URI']; + } + break; + + case 'out': + if ($this->encrypted) { + $this->encryptInit($id); + } + + $res = "\n$id 0 obj\n<< /Type /Action"; + switch ($o['type']) { + case 'ilink': + if (!isset($this->destinations[(string)$o['info']['label']])) { + break; + } + + // there will be an 'label' setting, this is the name of the destination + $res .= "\n/S /GoTo\n/D " . $this->destinations[(string)$o['info']['label']] . " 0 R"; + break; + + case 'URI': + $res .= "\n/S /URI\n/URI ("; + if ($this->encrypted) { + $res .= $this->filterText($this->ARC4($o['info']), false, false); + } else { + $res .= $this->filterText($o['info'], false, false); + } + + $res .= ")"; + break; + } + + $res .= "\n>>\nendobj"; + + return $res; + } + + return null; + } + + /** + * an annotation object, this will add an annotation to the current page. + * initially will support just link annotations + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_annotation($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + // add the annotation to the current page + $pageId = $this->currentPage; + $this->o_page($pageId, 'annot', $id); + + // and add the action object which is going to be required + switch ($options['type']) { + case 'link': + $this->objects[$id] = ['t' => 'annotation', 'info' => $options]; + $this->numObj++; + $this->o_action($this->numObj, 'new', $options['url']); + $this->objects[$id]['info']['actionId'] = $this->numObj; + break; + + case 'ilink': + // this is to a named internal link + $label = $options['label']; + $this->objects[$id] = ['t' => 'annotation', 'info' => $options]; + $this->numObj++; + $this->o_action($this->numObj, 'new', ['type' => 'ilink', 'label' => $label]); + $this->objects[$id]['info']['actionId'] = $this->numObj; + break; + } + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /Annot"; + switch ($o['info']['type']) { + case 'link': + case 'ilink': + $res .= "\n/Subtype /Link"; + break; + } + $res .= "\n/A " . $o['info']['actionId'] . " 0 R"; + $res .= "\n/Border [0 0 0]"; + $res .= "\n/H /I"; + $res .= "\n/Rect [ "; + + foreach ($o['info']['rect'] as $v) { + $res .= sprintf("%.4F ", $v); + } + + $res .= "]"; + $res .= "\n>>\nendobj"; + + return $res; + } + + return null; + } + + /** + * a page object, it also creates a contents object to hold its contents + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_page($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->numPages++; + $this->objects[$id] = [ + 't' => 'page', + 'info' => [ + 'parent' => $this->currentNode, + 'pageNum' => $this->numPages, + 'mediaBox' => $this->objects[$this->currentNode]['info']['mediaBox'] + ] + ]; + + if (is_array($options)) { + // then this must be a page insertion, array should contain 'rid','pos'=[before|after] + $options['id'] = $id; + $this->o_pages($this->currentNode, 'page', $options); + } else { + $this->o_pages($this->currentNode, 'page', $id); + } + + $this->currentPage = $id; + //make a contents object to go with this page + $this->numObj++; + $this->o_contents($this->numObj, 'new', $id); + $this->currentContents = $this->numObj; + $this->objects[$id]['info']['contents'] = []; + $this->objects[$id]['info']['contents'][] = $this->numObj; + + $match = ($this->numPages % 2 ? 'odd' : 'even'); + foreach ($this->addLooseObjects as $oId => $target) { + if ($target === 'all' || $match === $target) { + $this->objects[$id]['info']['contents'][] = $oId; + } + } + break; + + case 'content': + $o['info']['contents'][] = $options; + break; + + case 'annot': + // add an annotation to this page + if (!isset($o['info']['annot'])) { + $o['info']['annot'] = []; + } + + // $options should contain the id of the annotation dictionary + $o['info']['annot'][] = $options; + break; + + case 'out': + $res = "\n$id 0 obj\n<< /Type /Page"; + if (isset($o['info']['mediaBox'])) { + $tmp = $o['info']['mediaBox']; + $res .= "\n/MediaBox [" . sprintf( + '%.3F %.3F %.3F %.3F', + $tmp[0], + $tmp[1], + $tmp[2], + $tmp[3] + ) . ']'; + } + $res .= "\n/Parent " . $o['info']['parent'] . " 0 R"; + + if (isset($o['info']['annot'])) { + $res .= "\n/Annots ["; + foreach ($o['info']['annot'] as $aId) { + $res .= " $aId 0 R"; + } + $res .= " ]"; + } + + $count = count($o['info']['contents']); + if ($count == 1) { + $res .= "\n/Contents " . $o['info']['contents'][0] . " 0 R"; + } else { + if ($count > 1) { + $res .= "\n/Contents [\n"; + + // reverse the page contents so added objects are below normal content + //foreach (array_reverse($o['info']['contents']) as $cId) { + // Back to normal now that I've got transparency working --Benj + foreach ($o['info']['contents'] as $cId) { + $res .= "$cId 0 R\n"; + } + $res .= "]"; + } + } + + $res .= "\n>>\nendobj"; + + return $res; + } + + return null; + } + + /** + * the contents objects hold all of the content which appears on pages + * + * @param $id + * @param $action + * @param string|array $options + * @return null|string + */ + protected function o_contents($id, $action, $options = '') + { + if ($action !== 'new') { + $o = &$this->objects[$id]; + } + + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'contents', 'c' => '', 'info' => []]; + if (mb_strlen($options, '8bit') && intval($options)) { + // then this contents is the primary for a page + $this->objects[$id]['onPage'] = $options; + } else { + if ($options === 'raw') { + // then this page contains some other type of system object + $this->objects[$id]['raw'] = 1; + } + } + break; + + case 'add': + // add more options to the declaration + foreach ($options as $k => $v) { + $o['info'][$k] = $v; + } + + case 'out': + $tmp = $o['c']; + $res = "\n$id 0 obj\n"; + + if (isset($this->objects[$id]['raw'])) { + $res .= $tmp; + } else { + $res .= "<<"; + if ($this->compressionReady && $this->options['compression']) { + // then implement ZLIB based compression on this content stream + $res .= " /Filter /FlateDecode"; + $tmp = gzcompress($tmp, 6); + } + + if ($this->encrypted) { + $this->encryptInit($id); + $tmp = $this->ARC4($tmp); + } + + foreach ($o['info'] as $k => $v) { + $res .= "\n/$k $v"; + } + + $res .= "\n/Length " . mb_strlen($tmp, '8bit') . " >>\nstream\n$tmp\nendstream"; + } + + $res .= "\nendobj"; + + return $res; + } + + return null; + } + + /** + * @param $id + * @param $action + * @return string|null + */ + protected function o_embedjs($id, $action) + { + switch ($action) { + case 'new': + $this->objects[$id] = [ + 't' => 'embedjs', + 'info' => [ + 'Names' => '[(EmbeddedJS) ' . ($id + 1) . ' 0 R]' + ] + ]; + break; + + case 'out': + $o = &$this->objects[$id]; + $res = "\n$id 0 obj\n<< "; + foreach ($o['info'] as $k => $v) { + $res .= "\n/$k $v"; + } + $res .= "\n>>\nendobj"; + + return $res; + } + + return null; + } + + /** + * @param $id + * @param $action + * @param string $code + * @return null|string + */ + protected function o_javascript($id, $action, $code = '') + { + switch ($action) { + case 'new': + $this->objects[$id] = [ + 't' => 'javascript', + 'info' => [ + 'S' => '/JavaScript', + 'JS' => '(' . $this->filterText($code, true, false) . ')', + ] + ]; + break; + + case 'out': + $o = &$this->objects[$id]; + $res = "\n$id 0 obj\n<< "; + + foreach ($o['info'] as $k => $v) { + $res .= "\n/$k $v"; + } + $res .= "\n>>\nendobj"; + + return $res; + } + + return null; + } + + /** + * an image object, will be an XObject in the document, includes description and data + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_image($id, $action, $options = '') + { + switch ($action) { + case 'new': + // make the new object + $this->objects[$id] = ['t' => 'image', 'data' => &$options['data'], 'info' => []]; + + $info =& $this->objects[$id]['info']; + + $info['Type'] = '/XObject'; + $info['Subtype'] = '/Image'; + $info['Width'] = $options['iw']; + $info['Height'] = $options['ih']; + + if (isset($options['masked']) && $options['masked']) { + $info['SMask'] = ($this->numObj - 1) . ' 0 R'; + } + + if (!isset($options['type']) || $options['type'] === 'jpg') { + if (!isset($options['channels'])) { + $options['channels'] = 3; + } + + switch ($options['channels']) { + case 1: + $info['ColorSpace'] = '/DeviceGray'; + break; + case 4: + $info['ColorSpace'] = '/DeviceCMYK'; + break; + default: + $info['ColorSpace'] = '/DeviceRGB'; + break; + } + + if ($info['ColorSpace'] === '/DeviceCMYK') { + $info['Decode'] = '[1 0 1 0 1 0 1 0]'; + } + + $info['Filter'] = '/DCTDecode'; + $info['BitsPerComponent'] = 8; + } else { + if ($options['type'] === 'png') { + $info['Filter'] = '/FlateDecode'; + $info['DecodeParms'] = '<< /Predictor 15 /Colors ' . $options['ncolor'] . ' /Columns ' . $options['iw'] . ' /BitsPerComponent ' . $options['bitsPerComponent'] . '>>'; + + if ($options['isMask']) { + $info['ColorSpace'] = '/DeviceGray'; + } else { + if (mb_strlen($options['pdata'], '8bit')) { + $tmp = ' [ /Indexed /DeviceRGB ' . (mb_strlen($options['pdata'], '8bit') / 3 - 1) . ' '; + $this->numObj++; + $this->o_contents($this->numObj, 'new'); + $this->objects[$this->numObj]['c'] = $options['pdata']; + $tmp .= $this->numObj . ' 0 R'; + $tmp .= ' ]'; + $info['ColorSpace'] = $tmp; + + if (isset($options['transparency'])) { + $transparency = $options['transparency']; + switch ($transparency['type']) { + case 'indexed': + $tmp = ' [ ' . $transparency['data'] . ' ' . $transparency['data'] . '] '; + $info['Mask'] = $tmp; + break; + + case 'color-key': + $tmp = ' [ ' . + $transparency['r'] . ' ' . $transparency['r'] . + $transparency['g'] . ' ' . $transparency['g'] . + $transparency['b'] . ' ' . $transparency['b'] . + ' ] '; + $info['Mask'] = $tmp; + break; + } + } + } else { + if (isset($options['transparency'])) { + $transparency = $options['transparency']; + + switch ($transparency['type']) { + case 'indexed': + $tmp = ' [ ' . $transparency['data'] . ' ' . $transparency['data'] . '] '; + $info['Mask'] = $tmp; + break; + + case 'color-key': + $tmp = ' [ ' . + $transparency['r'] . ' ' . $transparency['r'] . ' ' . + $transparency['g'] . ' ' . $transparency['g'] . ' ' . + $transparency['b'] . ' ' . $transparency['b'] . + ' ] '; + $info['Mask'] = $tmp; + break; + } + } + $info['ColorSpace'] = '/' . $options['color']; + } + } + + $info['BitsPerComponent'] = $options['bitsPerComponent']; + } + } + + // assign it a place in the named resource dictionary as an external object, according to + // the label passed in with it. + $this->o_pages($this->currentNode, 'xObject', ['label' => $options['label'], 'objNum' => $id]); + + // also make sure that we have the right procset object for it. + $this->o_procset($this->procsetObjectId, 'add', 'ImageC'); + break; + + case 'out': + $o = &$this->objects[$id]; + $tmp = &$o['data']; + $res = "\n$id 0 obj\n<<"; + + foreach ($o['info'] as $k => $v) { + $res .= "\n/$k $v"; + } + + if ($this->encrypted) { + $this->encryptInit($id); + $tmp = $this->ARC4($tmp); + } + + $res .= "\n/Length " . mb_strlen($tmp, '8bit') . ">>\nstream\n$tmp\nendstream\nendobj"; + + return $res; + } + + return null; + } + + /** + * graphics state object + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_extGState($id, $action, $options = "") + { + static $valid_params = [ + "LW", + "LC", + "LC", + "LJ", + "ML", + "D", + "RI", + "OP", + "op", + "OPM", + "Font", + "BG", + "BG2", + "UCR", + "TR", + "TR2", + "HT", + "FL", + "SM", + "SA", + "BM", + "SMask", + "CA", + "ca", + "AIS", + "TK" + ]; + + switch ($action) { + case "new": + $this->objects[$id] = ['t' => 'extGState', 'info' => $options]; + + // Tell the pages about the new resource + $this->numStates++; + $this->o_pages($this->currentNode, 'extGState', ["objNum" => $id, "stateNum" => $this->numStates]); + break; + + case "out": + $o = &$this->objects[$id]; + $res = "\n$id 0 obj\n<< /Type /ExtGState\n"; + + foreach ($o["info"] as $k => $v) { + if (!in_array($k, $valid_params)) { + continue; + } + $res .= "/$k $v\n"; + } + + $res .= ">>\nendobj"; + + return $res; + } + + return null; + } + + /** + * @param integer $id + * @param string $action + * @param mixed $options + * @return string + */ + protected function o_xobject($id, $action, $options = '') + { + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'xobject', 'info' => $options, 'c' => '']; + break; + + case 'procset': + $this->objects[$id]['procset'] = $options; + break; + + case 'font': + $this->objects[$id]['fonts'][$options['fontNum']] = [ + 'objNum' => $options['objNum'], + 'fontNum' => $options['fontNum'] + ]; + break; + + case 'xObject': + $this->objects[$id]['xObjects'][] = ['objNum' => $options['objNum'], 'label' => $options['label']]; + break; + + case 'out': + $o = &$this->objects[$id]; + $res = "\n$id 0 obj\n<< /Type /XObject\n"; + + foreach ($o["info"] as $k => $v) { + switch ($k) { + case 'Subtype': + $res .= "/Subtype /$v\n"; + break; + case 'bbox': + $res .= "/BBox ["; + foreach ($v as $value) { + $res .= sprintf("%.4F ", $value); + } + $res .= "]\n"; + break; + default: + $res .= "/$k $v\n"; + break; + } + } + $res .= "/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]\n"; + + $res .= "/Resources <<"; + if (isset($o['procset'])) { + $res .= "\n/ProcSet " . $o['procset'] . " 0 R"; + } else { + $res .= "\n/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]"; + } + if (isset($o['fonts']) && count($o['fonts'])) { + $res .= "\n/Font << "; + foreach ($o['fonts'] as $finfo) { + $res .= "\n/F" . $finfo['fontNum'] . " " . $finfo['objNum'] . " 0 R"; + } + $res .= "\n>>"; + } + if (isset($o['xObjects']) && count($o['xObjects'])) { + $res .= "\n/XObject << "; + foreach ($o['xObjects'] as $finfo) { + $res .= "\n/" . $finfo['label'] . " " . $finfo['objNum'] . " 0 R"; + } + $res .= "\n>>"; + } + $res .= "\n>>\n"; + + $tmp = $o["c"]; + if ($this->compressionReady && $this->options['compression']) { + // then implement ZLIB based compression on this content stream + $res .= " /Filter /FlateDecode\n"; + $tmp = gzcompress($tmp, 6); + } + + if ($this->encrypted) { + $this->encryptInit($id); + $tmp = $this->ARC4($tmp); + } + + $res .= "/Length " . mb_strlen($tmp, '8bit') . " >>\n"; + $res .= "stream\n" . $tmp . "\nendstream" . "\nendobj"; + + return $res; + } + + return null; + } + + /** + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_acroform($id, $action, $options = '') + { + switch ($action) { + case "new": + $this->o_catalog($this->catalogId, 'acroform', $id); + $this->objects[$id] = array('t' => 'acroform', 'info' => $options); + break; + + case 'addfield': + $this->objects[$id]['info']['Fields'][] = $options; + break; + + case 'font': + $this->objects[$id]['fonts'][$options['fontNum']] = [ + 'objNum' => $options['objNum'], + 'fontNum' => $options['fontNum'] + ]; + break; + + case "out": + $o = &$this->objects[$id]; + $res = "\n$id 0 obj\n<<"; + + foreach ($o["info"] as $k => $v) { + switch ($k) { + case 'Fields': + $res .= " /Fields ["; + foreach ($v as $i) { + $res .= "$i 0 R "; + } + $res .= "]\n"; + break; + default: + $res .= "/$k $v\n"; + } + } + + $res .= "/DR <<\n"; + if (isset($o['fonts']) && count($o['fonts'])) { + $res .= "/Font << \n"; + foreach ($o['fonts'] as $finfo) { + $res .= "/F" . $finfo['fontNum'] . " " . $finfo['objNum'] . " 0 R\n"; + } + $res .= ">>\n"; + } + $res .= ">>\n"; + + $res .= ">>\nendobj"; + + return $res; + } + + return null; + } + + /** + * @param $id + * @param $action + * @param mixed $options + * @return null|string + */ + protected function o_field($id, $action, $options = '') + { + switch ($action) { + case "new": + $this->o_page($options['pageid'], 'annot', $id); + $this->o_acroform($this->acroFormId, 'addfield', $id); + $this->objects[$id] = ['t' => 'field', 'info' => $options]; + break; + + case 'set': + $this->objects[$id]['info'] = array_merge($this->objects[$id]['info'], $options); + break; + + case "out": + $o = &$this->objects[$id]; + $res = "\n$id 0 obj\n<< /Type /Annot /Subtype /Widget \n"; + + $encrypted = $this->encrypted; + if ($encrypted) { + $this->encryptInit($id); + } + + foreach ($o["info"] as $k => $v) { + switch ($k) { + case 'pageid': + $res .= "/P $v 0 R\n"; + break; + case 'value': + if ($encrypted) { + $v = $this->filterText($this->ARC4($v), false, false); + } + $res .= "/V ($v)\n"; + break; + case 'refvalue': + $res .= "/V $v 0 R\n"; + break; + case 'da': + if ($encrypted) { + $v = $this->filterText($this->ARC4($v), false, false); + } + $res .= "/DA ($v)\n"; + break; + case 'options': + $res .= "/Opt [\n"; + foreach ($v as $opt) { + if ($encrypted) { + $opt = $this->filterText($this->ARC4($opt), false, false); + } + $res .= "($opt)\n"; + } + $res .= "]\n"; + break; + case 'rect': + $res .= "/Rect ["; + foreach ($v as $value) { + $res .= sprintf("%.4F ", $value); + } + $res .= "]\n"; + break; + case 'appearance': + $res .= "/AP << "; + foreach ($v as $a => $ref) { + $res .= "/$a $ref 0 R "; + } + $res .= ">>\n"; + break; + case 'T': + if ($encrypted) { + $v = $this->filterText($this->ARC4($v), false, false); + } + $res .= "/T ($v)\n"; + break; + default: + $res .= "/$k $v\n"; + } + + } + + $res .= ">>\nendobj"; + + return $res; + } + + return null; + } + + /** + * + * @param $id + * @param $action + * @param string $options + * @return null|string + */ + protected function o_sig($id, $action, $options = '') + { + $sign_maxlen = $this->signatureMaxLen; + + switch ($action) { + case "new": + $this->objects[$id] = array('t' => 'sig', 'info' => $options); + $this->byteRange[$id] = ['t' => 'sig']; + break; + + case 'byterange': + $o = &$this->objects[$id]; + $content =& $options['content']; + $content_len = strlen($content); + $pos = strpos($content, sprintf("/ByteRange [ %'.010d", $id)); + $len = strlen('/ByteRange [ ********** ********** ********** ********** ]'); + $rangeStartPos = $pos + $len + 1 + 10; // before '<' + $content = substr_replace($content, str_pad(sprintf('/ByteRange [ 0 %u %u %u ]', $rangeStartPos, $rangeStartPos + $sign_maxlen + 2, $content_len - 2 - $sign_maxlen - $rangeStartPos), $len, ' ', STR_PAD_RIGHT), $pos, $len); + + $fuid = uniqid(); + $tmpInput = $this->tmp . "/pkcs7.tmp." . $fuid . '.in'; + $tmpOutput = $this->tmp . "/pkcs7.tmp." . $fuid . '.out'; + + if (file_put_contents($tmpInput, substr($content, 0, $rangeStartPos)) === false) { + throw new \Exception("Unable to write temporary file for signing."); + } + if (file_put_contents($tmpInput, substr($content, $rangeStartPos + 2 + $sign_maxlen), + FILE_APPEND) === false) { + throw new \Exception("Unable to write temporary file for signing."); + } + + if (openssl_pkcs7_sign($tmpInput, $tmpOutput, + $o['info']['SignCert'], + array($o['info']['PrivKey'], $o['info']['Password']), + array(), PKCS7_BINARY | PKCS7_DETACHED) === false) { + throw new \Exception("Failed to prepare signature."); + } + + $signature = file_get_contents($tmpOutput); + + unlink($tmpInput); + unlink($tmpOutput); + + $sign = substr($signature, (strpos($signature, "%%EOF\n\n------") + 13)); + list($head, $signature) = explode("\n\n", $sign); + + $signature = base64_decode(trim($signature)); + + $signature = current(unpack('H*', $signature)); + $signature = str_pad($signature, $sign_maxlen, '0'); + $siglen = strlen($signature); + if (strlen($signature) > $sign_maxlen) { + throw new \Exception("Signature length ($siglen) exceeds the $sign_maxlen limit."); + } + + $content = substr_replace($content, $signature, $rangeStartPos + 1, $sign_maxlen); + break; + + case "out": + $res = "\n$id 0 obj\n<<\n"; + + $encrypted = $this->encrypted; + if ($encrypted) { + $this->encryptInit($id); + } + + $res .= "/ByteRange " .sprintf("[ %'.010d ********** ********** ********** ]\n", $id); + $res .= "/Contents <" . str_pad('', $sign_maxlen, '0') . ">\n"; + $res .= "/Filter/Adobe.PPKLite\n"; //PPKMS \n"; + $res .= "/Type/Sig/SubFilter/adbe.pkcs7.detached \n"; + + $date = "D:" . substr_replace(date('YmdHisO'), '\'', -2, 0) . '\''; + if ($encrypted) { + $date = $this->ARC4($date); + } + + $res .= "/M ($date)\n"; + $res .= "/Prop_Build << /App << /Name /DomPDF >> /Filter << /Name /Adobe.PPKLite >> >>\n"; + + $o = &$this->objects[$id]; + foreach ($o['info'] as $k => $v) { + switch ($k) { + case 'Name': + case 'Location': + case 'Reason': + case 'ContactInfo': + if ($v !== null && $v !== '') { + $res .= "/$k (" . + ($encrypted ? $this->filterText($this->ARC4($v), false, false) : $v) . ") \n"; + } + break; + } + } + $res .= ">>\nendobj"; + + return $res; + } + + return null; + } + + /** + * encryption object. + * + * @param $id + * @param $action + * @param string $options + * @return string|null + */ + protected function o_encryption($id, $action, $options = '') + { + switch ($action) { + case 'new': + // make the new object + $this->objects[$id] = ['t' => 'encryption', 'info' => $options]; + $this->arc4_objnum = $id; + break; + + case 'keys': + // figure out the additional parameters required + $pad = chr(0x28) . chr(0xBF) . chr(0x4E) . chr(0x5E) . chr(0x4E) . chr(0x75) . chr(0x8A) . chr(0x41) + . chr(0x64) . chr(0x00) . chr(0x4E) . chr(0x56) . chr(0xFF) . chr(0xFA) . chr(0x01) . chr(0x08) + . chr(0x2E) . chr(0x2E) . chr(0x00) . chr(0xB6) . chr(0xD0) . chr(0x68) . chr(0x3E) . chr(0x80) + . chr(0x2F) . chr(0x0C) . chr(0xA9) . chr(0xFE) . chr(0x64) . chr(0x53) . chr(0x69) . chr(0x7A); + + $info = $this->objects[$id]['info']; + + $len = mb_strlen($info['owner'], '8bit'); + + if ($len > 32) { + $owner = substr($info['owner'], 0, 32); + } else { + if ($len < 32) { + $owner = $info['owner'] . substr($pad, 0, 32 - $len); + } else { + $owner = $info['owner']; + } + } + + $len = mb_strlen($info['user'], '8bit'); + if ($len > 32) { + $user = substr($info['user'], 0, 32); + } else { + if ($len < 32) { + $user = $info['user'] . substr($pad, 0, 32 - $len); + } else { + $user = $info['user']; + } + } + + $tmp = $this->md5_16($owner); + $okey = substr($tmp, 0, 5); + $this->ARC4_init($okey); + $ovalue = $this->ARC4($user); + $this->objects[$id]['info']['O'] = $ovalue; + + // now make the u value, phew. + $tmp = $this->md5_16( + $user . $ovalue . chr($info['p']) . chr(255) . chr(255) . chr(255) . hex2bin($this->fileIdentifier) + ); + + $ukey = substr($tmp, 0, 5); + $this->ARC4_init($ukey); + $this->encryptionKey = $ukey; + $this->encrypted = true; + $uvalue = $this->ARC4($pad); + $this->objects[$id]['info']['U'] = $uvalue; + // initialize the arc4 array + break; + + case 'out': + $o = &$this->objects[$id]; + + $res = "\n$id 0 obj\n<<"; + $res .= "\n/Filter /Standard"; + $res .= "\n/V 1"; + $res .= "\n/R 2"; + $res .= "\n/O (" . $this->filterText($o['info']['O'], false, false) . ')'; + $res .= "\n/U (" . $this->filterText($o['info']['U'], false, false) . ')'; + // and the p-value needs to be converted to account for the twos-complement approach + $o['info']['p'] = (($o['info']['p'] ^ 255) + 1) * -1; + $res .= "\n/P " . ($o['info']['p']); + $res .= "\n>>\nendobj"; + + return $res; + } + + return null; + } + + protected function o_indirect_references($id, $action, $options = null) + { + switch ($action) { + case 'new': + case 'add': + if ($id === 0) { + $id = ++$this->numObj; + $this->o_catalog($this->catalogId, 'names', $id); + $this->objects[$id] = ['t' => 'indirect_references', 'info' => $options]; + $this->indirectReferenceId = $id; + } else { + $this->objects[$id]['info'] = array_merge($this->objects[$id]['info'], $options); + } + break; + case 'out': + $res = "\n$id 0 obj << "; + + foreach ($this->objects[$id]['info'] as $referenceObjName => $referenceObjId) { + $res .= "/$referenceObjName $referenceObjId 0 R "; + } + + $res .= ">> endobj"; + return $res; + } + + return null; + } + + protected function o_names($id, $action, $options = null) + { + switch ($action) { + case 'new': + case 'add': + if ($id === 0) { + $id = ++$this->numObj; + $this->objects[$id] = ['t' => 'names', 'info' => [$options]]; + $this->o_indirect_references($this->indirectReferenceId, 'add', ['EmbeddedFiles' => $id]); + $this->embeddedFilesId = $id; + } else { + $this->objects[$id]['info'][] = $options; + } + break; + case 'out': + $info = &$this->objects[$id]['info']; + $res = ''; + if (count($info) > 0) { + $res = "\n$id 0 obj << /Names [ "; + + if ($this->encrypted) { + $this->encryptInit($id); + } + + foreach ($info as $entry) { + if ($this->encrypted) { + $filename = $this->ARC4($entry['filename']); + } else { + $filename = $entry['filename']; + } + + $res .= "($filename) " . $entry['dict_reference'] . " 0 R "; + } + + $res .= "] >> endobj"; + } + return $res; + } + + return null; + } + + protected function o_embedded_file_dictionary($id, $action, $options = null) + { + switch ($action) { + case 'new': + $embeddedFileId = ++$this->numObj; + $options['embedded_reference'] = $embeddedFileId; + $this->objects[$id] = ['t' => 'embedded_file_dictionary', 'info' => $options]; + $this->o_embedded_file($embeddedFileId, 'new', $options); + $options['dict_reference'] = $id; + $this->o_names($this->embeddedFilesId, 'add', $options); + break; + case 'out': + $info = &$this->objects[$id]['info']; + $filename = $this->utf8toUtf16BE($info['filename']); + $description = $this->utf8toUtf16BE($info['description']); + + if ($this->encrypted) { + $this->encryptInit($id); + $filename = $this->ARC4($filename); + $description = $this->ARC4($description); + } + + $filename = $this->filterText($filename, false, false); + $description = $this->filterText($description, false, false); + + $res = "\n$id 0 obj <>"; + $res .= " /F ($filename) /UF ($filename) /Desc ($description)"; + $res .= " >> endobj"; + return $res; + } + + return null; + } + + protected function o_embedded_file($id, $action, $options = null): ?string + { + switch ($action) { + case 'new': + $this->objects[$id] = ['t' => 'embedded_file', 'info' => $options]; + break; + case 'out': + $info = &$this->objects[$id]['info']; + + if ($this->compressionReady) { + $filepath = $info['filepath']; + $checksum = md5_file($filepath); + $f = fopen($filepath, "rb"); + + $file_content_compressed = ''; + $deflateContext = deflate_init(ZLIB_ENCODING_DEFLATE, ['level' => 6]); + while (($block = fread($f, 8192))) { + $file_content_compressed .= deflate_add($deflateContext, $block, ZLIB_NO_FLUSH); + } + $file_content_compressed .= deflate_add($deflateContext, '', ZLIB_FINISH); + $file_size_uncompressed = ftell($f); + fclose($f); + } else { + $file_content = file_get_contents($info['filepath']); + $file_size_uncompressed = mb_strlen($file_content, '8bit'); + $checksum = md5($file_content); + } + + if ($this->encrypted) { + $this->encryptInit($id); + $checksum = $this->ARC4($checksum); + $file_content_compressed = $this->ARC4($file_content_compressed); + } + $file_size_compressed = mb_strlen($file_content_compressed, '8bit'); + + $res = "\n$id 0 obj <>" . + " /Type/EmbeddedFile /Filter/FlateDecode" . + " /Length $file_size_compressed >> stream\n$file_content_compressed\nendstream\nendobj"; + + return $res; + } + + return null; + } + + /** + * ARC4 functions + * A series of function to implement ARC4 encoding in PHP + */ + + /** + * calculate the 16 byte version of the 128 bit md5 digest of the string + * + * @param $string + * @return string + */ + function md5_16($string) + { + $tmp = md5($string); + $out = ''; + for ($i = 0; $i <= 30; $i = $i + 2) { + $out .= chr(hexdec(substr($tmp, $i, 2))); + } + + return $out; + } + + /** + * initialize the encryption for processing a particular object + * + * @param $id + */ + function encryptInit($id) + { + $tmp = $this->encryptionKey; + $hex = dechex($id); + if (mb_strlen($hex, '8bit') < 6) { + $hex = substr('000000', 0, 6 - mb_strlen($hex, '8bit')) . $hex; + } + $tmp .= chr(hexdec(substr($hex, 4, 2))) + . chr(hexdec(substr($hex, 2, 2))) + . chr(hexdec(substr($hex, 0, 2))) + . chr(0) + . chr(0) + ; + $key = $this->md5_16($tmp); + $this->ARC4_init(substr($key, 0, 10)); + } + + /** + * initialize the ARC4 encryption + * + * @param string $key + */ + function ARC4_init($key = '') + { + $this->arc4 = ''; + + // setup the control array + if (mb_strlen($key, '8bit') == 0) { + return; + } + + $k = ''; + while (mb_strlen($k, '8bit') < 256) { + $k .= $key; + } + + $k = substr($k, 0, 256); + for ($i = 0; $i < 256; $i++) { + $this->arc4 .= chr($i); + } + + $j = 0; + + for ($i = 0; $i < 256; $i++) { + $t = $this->arc4[$i]; + $j = ($j + ord($t) + ord($k[$i])) % 256; + $this->arc4[$i] = $this->arc4[$j]; + $this->arc4[$j] = $t; + } + } + + /** + * ARC4 encrypt a text string + * + * @param $text + * @return string + */ + function ARC4($text) + { + $len = mb_strlen($text, '8bit'); + $a = 0; + $b = 0; + $c = $this->arc4; + $out = ''; + for ($i = 0; $i < $len; $i++) { + $a = ($a + 1) % 256; + $t = $c[$a]; + $b = ($b + ord($t)) % 256; + $c[$a] = $c[$b]; + $c[$b] = $t; + $k = ord($c[(ord($c[$a]) + ord($c[$b])) % 256]); + $out .= chr(ord($text[$i]) ^ $k); + } + + return $out; + } + + /** + * functions which can be called to adjust or add to the document + */ + + /** + * add a link in the document to an external URL + * + * @param $url + * @param $x0 + * @param $y0 + * @param $x1 + * @param $y1 + */ + function addLink($url, $x0, $y0, $x1, $y1) + { + $this->numObj++; + $info = ['type' => 'link', 'url' => $url, 'rect' => [$x0, $y0, $x1, $y1]]; + $this->o_annotation($this->numObj, 'new', $info); + } + + /** + * add a link in the document to an internal destination (ie. within the document) + * + * @param $label + * @param $x0 + * @param $y0 + * @param $x1 + * @param $y1 + */ + function addInternalLink($label, $x0, $y0, $x1, $y1) + { + $this->numObj++; + $info = ['type' => 'ilink', 'label' => $label, 'rect' => [$x0, $y0, $x1, $y1]]; + $this->o_annotation($this->numObj, 'new', $info); + } + + /** + * set the encryption of the document + * can be used to turn it on and/or set the passwords which it will have. + * also the functions that the user will have are set here, such as print, modify, add + * + * @param string $userPass + * @param string $ownerPass + * @param array $pc + */ + function setEncryption($userPass = '', $ownerPass = '', $pc = []) + { + $p = bindec("11000000"); + + $options = ['print' => 4, 'modify' => 8, 'copy' => 16, 'add' => 32]; + + foreach ($pc as $k => $v) { + if ($v && isset($options[$k])) { + $p += $options[$k]; + } else { + if (isset($options[$v])) { + $p += $options[$v]; + } + } + } + + // implement encryption on the document + if ($this->arc4_objnum == 0) { + // then the block does not exist already, add it. + $this->numObj++; + if (mb_strlen($ownerPass) == 0) { + $ownerPass = $userPass; + } + + $this->o_encryption($this->numObj, 'new', ['user' => $userPass, 'owner' => $ownerPass, 'p' => $p]); + } + } + + /** + * should be used for internal checks, not implemented as yet + */ + function checkAllHere() + { + } + + /** + * return the pdf stream as a string returned from the function + * + * @param bool $debug + * @return string + */ + function output($debug = false) + { + if ($debug) { + // turn compression off + $this->options['compression'] = false; + } + + if ($this->javascript) { + $this->numObj++; + + $js_id = $this->numObj; + $this->o_embedjs($js_id, 'new'); + $this->o_javascript(++$this->numObj, 'new', $this->javascript); + + $id = $this->catalogId; + + $this->o_indirect_references($this->indirectReferenceId, 'add', ['JavaScript' => $js_id]); + } + + if ($this->fileIdentifier === '') { + $tmp = implode('', $this->objects[$this->infoObject]['info']); + $this->fileIdentifier = md5('DOMPDF' . __FILE__ . $tmp . microtime() . mt_rand()); + } + + if ($this->arc4_objnum) { + $this->o_encryption($this->arc4_objnum, 'keys'); + $this->ARC4_init($this->encryptionKey); + } + + $this->checkAllHere(); + + $xref = []; + $content = '%PDF-' . self::PDF_VERSION; + $pos = mb_strlen($content, '8bit'); + + // pre-process o_font objects before output of all objects + foreach ($this->objects as $k => $v) { + if ($v['t'] === 'font') { + $this->o_font($k, 'add'); + } + } + + foreach ($this->objects as $k => $v) { + $tmp = 'o_' . $v['t']; + $cont = $this->$tmp($k, 'out'); + $content .= $cont; + $xref[] = $pos + 1; //+1 to account for \n at the start of each object + $pos += mb_strlen($cont, '8bit'); + } + + $content .= "\nxref\n0 " . (count($xref) + 1) . "\n0000000000 65535 f \n"; + + foreach ($xref as $p) { + $content .= str_pad($p, 10, "0", STR_PAD_LEFT) . " 00000 n \n"; + } + + $content .= "trailer\n<<\n" . + '/Size ' . (count($xref) + 1) . "\n" . + '/Root 1 0 R' . "\n" . + '/Info ' . $this->infoObject . " 0 R\n" + ; + + // if encryption has been applied to this document then add the marker for this dictionary + if ($this->arc4_objnum > 0) { + $content .= '/Encrypt ' . $this->arc4_objnum . " 0 R\n"; + } + + $content .= '/ID[<' . $this->fileIdentifier . '><' . $this->fileIdentifier . ">]\n"; + + // account for \n added at start of xref table + $pos++; + + $content .= ">>\nstartxref\n$pos\n%%EOF\n"; + + if (count($this->byteRange) > 0) { + foreach ($this->byteRange as $k => $v) { + $tmp = 'o_' . $v['t']; + $this->$tmp($k, 'byterange', ['content' => &$content]); + } + } + + return $content; + } + + /** + * initialize a new document + * if this is called on an existing document results may be unpredictable, but the existing document would be lost at minimum + * this function is called automatically by the constructor function + * + * @param array $pageSize + */ + private function newDocument($pageSize = [0, 0, 612, 792]) + { + $this->numObj = 0; + $this->objects = []; + + $this->numObj++; + $this->o_catalog($this->numObj, 'new'); + + $this->numObj++; + $this->o_outlines($this->numObj, 'new'); + + $this->numObj++; + $this->o_pages($this->numObj, 'new'); + + $this->o_pages($this->numObj, 'mediaBox', $pageSize); + $this->currentNode = 3; + + $this->numObj++; + $this->o_procset($this->numObj, 'new'); + + $this->numObj++; + $this->o_info($this->numObj, 'new'); + + $this->numObj++; + $this->o_page($this->numObj, 'new'); + + // need to store the first page id as there is no way to get it to the user during + // startup + $this->firstPageId = $this->currentContents; + } + + /** + * open the font file and return a php structure containing it. + * first check if this one has been done before and saved in a form more suited to php + * note that if a php serialized version does not exist it will try and make one, but will + * require write access to the directory to do it... it is MUCH faster to have these serialized + * files. + * + * @param $font + */ + private function openFont($font) + { + // assume that $font contains the path and file but not the extension + $name = basename($font); + $dir = dirname($font); + + $fontcache = $this->fontcache; + if ($fontcache == '') { + $fontcache = $dir; + } + + //$name filename without folder and extension of font metrics + //$dir folder of font metrics + //$fontcache folder of runtime created php serialized version of font metrics. + // If this is not given, the same folder as the font metrics will be used. + // Storing and reusing serialized versions improves speed much + + $this->addMessage("openFont: $font - $name"); + + if (!$this->isUnicode || in_array(mb_strtolower(basename($name)), self::$coreFonts)) { + $metrics_name = "$name.afm"; + } else { + $metrics_name = "$name.ufm"; + } + + $cache_name = "$metrics_name.json"; + $this->addMessage("metrics: $metrics_name, cache: $cache_name"); + + if (file_exists($fontcache . '/' . $cache_name)) { + $this->addMessage("openFont: json metrics file exists $fontcache/$cache_name"); + $cached_font_info = json_decode(file_get_contents($fontcache . '/' . $cache_name), true); + if (!isset($cached_font_info['_version_']) || $cached_font_info['_version_'] != $this->fontcacheVersion) { + $this->addMessage('openFont: font cache is out of date, regenerating'); + } else { + $this->fonts[$font] = $cached_font_info; + } + } + + if (!isset($this->fonts[$font]) && file_exists("$dir/$metrics_name")) { + // then rebuild the php_.afm file from the .afm file + $this->addMessage("openFont: build php file from $dir/$metrics_name"); + $data = []; + + // 20 => 'space' + $data['codeToName'] = []; + + // Since we're not going to enable Unicode for the core fonts we need to use a font-based + // setting for Unicode support rather than a global setting. + $data['isUnicode'] = (strtolower(substr($metrics_name, -3)) !== 'afm'); + + $cidtogid = ''; + if ($data['isUnicode']) { + $cidtogid = str_pad('', 256 * 256 * 2, "\x00"); + } + + $file = file("$dir/$metrics_name"); + + foreach ($file as $rowA) { + $row = trim($rowA); + $pos = strpos($row, ' '); + + if ($pos) { + // then there must be some keyword + $key = substr($row, 0, $pos); + switch ($key) { + case 'FontName': + case 'FullName': + case 'FamilyName': + case 'PostScriptName': + case 'Weight': + case 'ItalicAngle': + case 'IsFixedPitch': + case 'CharacterSet': + case 'UnderlinePosition': + case 'UnderlineThickness': + case 'Version': + case 'EncodingScheme': + case 'CapHeight': + case 'XHeight': + case 'Ascender': + case 'Descender': + case 'StdHW': + case 'StdVW': + case 'StartCharMetrics': + case 'FontHeightOffset': // OAR - Added so we can offset the height calculation of a Windows font. Otherwise it's too big. + $data[$key] = trim(substr($row, $pos)); + break; + + case 'FontBBox': + $data[$key] = explode(' ', trim(substr($row, $pos))); + break; + + //C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ; + case 'C': // Found in AFM files + $bits = explode(';', trim($row)); + $dtmp = ['C' => null, 'N' => null, 'WX' => null, 'B' => []]; + + foreach ($bits as $bit) { + $bits2 = explode(' ', trim($bit)); + if (mb_strlen($bits2[0], '8bit') == 0) { + continue; + } + + if (count($bits2) > 2) { + $dtmp[$bits2[0]] = []; + for ($i = 1; $i < count($bits2); $i++) { + $dtmp[$bits2[0]][] = $bits2[$i]; + } + } else { + if (count($bits2) == 2) { + $dtmp[$bits2[0]] = $bits2[1]; + } + } + } + + $c = (int)$dtmp['C']; + $n = $dtmp['N']; + $width = floatval($dtmp['WX']); + + if ($c >= 0) { + if (!ctype_xdigit($n) || $c != hexdec($n)) { + $data['codeToName'][$c] = $n; + } + $data['C'][$c] = $width; + } elseif (isset($n)) { + $data['C'][$n] = $width; + } + + if (!isset($data['MissingWidth']) && $c === -1 && $n === '.notdef') { + $data['MissingWidth'] = $width; + } + + break; + + // U 827 ; WX 0 ; N squaresubnosp ; G 675 ; + case 'U': // Found in UFM files + if (!$data['isUnicode']) { + break; + } + + $bits = explode(';', trim($row)); + $dtmp = ['G' => null, 'N' => null, 'U' => null, 'WX' => null]; + + foreach ($bits as $bit) { + $bits2 = explode(' ', trim($bit)); + if (mb_strlen($bits2[0], '8bit') === 0) { + continue; + } + + if (count($bits2) > 2) { + $dtmp[$bits2[0]] = []; + for ($i = 1; $i < count($bits2); $i++) { + $dtmp[$bits2[0]][] = $bits2[$i]; + } + } else { + if (count($bits2) == 2) { + $dtmp[$bits2[0]] = $bits2[1]; + } + } + } + + $c = (int)$dtmp['U']; + $n = $dtmp['N']; + $glyph = $dtmp['G']; + $width = floatval($dtmp['WX']); + + if ($c >= 0) { + // Set values in CID to GID map + if ($c >= 0 && $c < 0xFFFF && $glyph) { + $cidtogid[$c * 2] = chr($glyph >> 8); + $cidtogid[$c * 2 + 1] = chr($glyph & 0xFF); + } + + if (!ctype_xdigit($n) || $c != hexdec($n)) { + $data['codeToName'][$c] = $n; + } + $data['C'][$c] = $width; + } elseif (isset($n)) { + $data['C'][$n] = $width; + } + + if (!isset($data['MissingWidth']) && $c === -1 && $n === '.notdef') { + $data['MissingWidth'] = $width; + } + + break; + + case 'KPX': + break; // don't include them as they are not used yet + //KPX Adieresis yacute -40 + /*$bits = explode(' ', trim($row)); + $data['KPX'][$bits[1]][$bits[2]] = $bits[3]; + break;*/ + } + } + } + + if ($this->compressionReady && $this->options['compression']) { + // then implement ZLIB based compression on CIDtoGID string + $data['CIDtoGID_Compressed'] = true; + $cidtogid = gzcompress($cidtogid, 6); + } + $data['CIDtoGID'] = base64_encode($cidtogid); + $data['_version_'] = $this->fontcacheVersion; + $this->fonts[$font] = $data; + + //Because of potential trouble with php safe mode, expect that the folder already exists. + //If not existing, this will hit performance because of missing cached results. + if (is_dir($fontcache) && is_writable($fontcache)) { + file_put_contents("$fontcache/$cache_name", json_encode($data, JSON_PRETTY_PRINT)); + } + $data = null; + } + + if (!isset($this->fonts[$font])) { + $this->addMessage("openFont: no font file found for $font. Do you need to run load_font.php?"); + } + } + + /** + * if the font is not loaded then load it and make the required object + * else just make it the current font + * the encoding array can contain 'encoding'=> 'none','WinAnsiEncoding','MacRomanEncoding' or 'MacExpertEncoding' + * note that encoding='none' will need to be used for symbolic fonts + * and 'differences' => an array of mappings between numbers 0->255 and character names. + * + * @param string $fontName + * @param string $encoding + * @param bool $set + * @param bool $isSubsetting + * @return int + * @throws FontNotFoundException + */ + function selectFont($fontName, $encoding = '', $set = true, $isSubsetting = true) + { + if ($fontName === null || $fontName === '') { + return $this->currentFontNum; + } + + $ext = substr($fontName, -4); + if ($ext === '.afm' || $ext === '.ufm') { + $fontName = substr($fontName, 0, mb_strlen($fontName) - 4); + } + + if (!isset($this->fonts[$fontName])) { + $this->addMessage("selectFont: selecting - $fontName - $encoding, $set"); + + // load the file + $this->openFont($fontName); + + if (isset($this->fonts[$fontName])) { + $this->numObj++; + $this->numFonts++; + + $font = &$this->fonts[$fontName]; + + $name = basename($fontName); + $options = ['name' => $name, 'fontFileName' => $fontName, 'isSubsetting' => $isSubsetting]; + + if (is_array($encoding)) { + // then encoding and differences might be set + if (isset($encoding['encoding'])) { + $options['encoding'] = $encoding['encoding']; + } + + if (isset($encoding['differences'])) { + $options['differences'] = $encoding['differences']; + } + } else { + if (mb_strlen($encoding, '8bit')) { + // then perhaps only the encoding has been set + $options['encoding'] = $encoding; + } + } + + $this->o_font($this->numObj, 'new', $options); + + if (file_exists("$fontName.ttf")) { + $fileSuffix = 'ttf'; + } elseif (file_exists("$fontName.TTF")) { + $fileSuffix = 'TTF'; + } elseif (file_exists("$fontName.pfb")) { + $fileSuffix = 'pfb'; + } elseif (file_exists("$fontName.PFB")) { + $fileSuffix = 'PFB'; + } else { + $fileSuffix = ''; + } + + $font['fileSuffix'] = $fileSuffix; + + $font['fontNum'] = $this->numFonts; + $font['isSubsetting'] = $isSubsetting && $font['isUnicode'] && strtolower($fileSuffix) === 'ttf'; + + // also set the differences here, note that this means that these will take effect only the + //first time that a font is selected, else they are ignored + if (isset($options['differences'])) { + $font['differences'] = $options['differences']; + } + } + } + + if ($set && isset($this->fonts[$fontName])) { + // so if for some reason the font was not set in the last one then it will not be selected + $this->currentBaseFont = $fontName; + + // the next lines mean that if a new font is selected, then the current text state will be + // applied to it as well. + $this->currentFont = $this->currentBaseFont; + $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum']; + } + + return $this->currentFontNum; + } + + /** + * sets up the current font, based on the font families, and the current text state + * note that this system is quite flexible, a bold-italic font can be completely different to a + * italic-bold font, and even bold-bold will have to be defined within the family to have meaning + * This function is to be called whenever the currentTextState is changed, it will update + * the currentFont setting to whatever the appropriate family one is. + * If the user calls selectFont themselves then that will reset the currentBaseFont, and the currentFont + * This function will change the currentFont to whatever it should be, but will not change the + * currentBaseFont. + */ + private function setCurrentFont() + { + // if (strlen($this->currentBaseFont) == 0){ + // // then assume an initial font + // $this->selectFont($this->defaultFont); + // } + // $cf = substr($this->currentBaseFont,strrpos($this->currentBaseFont,'/')+1); + // if (strlen($this->currentTextState) + // && isset($this->fontFamilies[$cf]) + // && isset($this->fontFamilies[$cf][$this->currentTextState])){ + // // then we are in some state or another + // // and this font has a family, and the current setting exists within it + // // select the font, then return it + // $nf = substr($this->currentBaseFont,0,strrpos($this->currentBaseFont,'/')+1).$this->fontFamilies[$cf][$this->currentTextState]; + // $this->selectFont($nf,'',0); + // $this->currentFont = $nf; + // $this->currentFontNum = $this->fonts[$nf]['fontNum']; + // } else { + // // the this font must not have the right family member for the current state + // // simply assume the base font + $this->currentFont = $this->currentBaseFont; + $this->currentFontNum = $this->fonts[$this->currentFont]['fontNum']; + // } + } + + /** + * function for the user to find out what the ID is of the first page that was created during + * startup - useful if they wish to add something to it later. + * + * @return int + */ + function getFirstPageId() + { + return $this->firstPageId; + } + + /** + * add content to the currently active object + * + * @param $content + */ + private function addContent($content) + { + $this->objects[$this->currentContents]['c'] .= $content; + } + + /** + * sets the color for fill operations + * + * @param array $color + * @param bool $force + */ + function setColor($color, $force = false) + { + $new_color = [$color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null]; + + if (!$force && $this->currentColor == $new_color) { + return; + } + + if (isset($new_color[3])) { + $this->currentColor = $new_color; + $this->addContent(vsprintf("\n%.3F %.3F %.3F %.3F k", $this->currentColor)); + } else { + if (isset($new_color[2])) { + $this->currentColor = $new_color; + $this->addContent(vsprintf("\n%.3F %.3F %.3F rg", $this->currentColor)); + } + } + } + + /** + * sets the color for fill operations + * + * @param string $fillRule + */ + function setFillRule($fillRule) + { + if (!in_array($fillRule, ["nonzero", "evenodd"])) { + return; + } + + $this->fillRule = $fillRule; + } + + /** + * sets the color for stroke operations + * + * @param array $color + * @param bool $force + */ + function setStrokeColor($color, $force = false) + { + $new_color = [$color[0], $color[1], $color[2], isset($color[3]) ? $color[3] : null]; + + if (!$force && $this->currentStrokeColor == $new_color) { + return; + } + + if (isset($new_color[3])) { + $this->currentStrokeColor = $new_color; + $this->addContent(vsprintf("\n%.3F %.3F %.3F %.3F K", $this->currentStrokeColor)); + } else { + if (isset($new_color[2])) { + $this->currentStrokeColor = $new_color; + $this->addContent(vsprintf("\n%.3F %.3F %.3F RG", $this->currentStrokeColor)); + } + } + } + + /** + * Set the graphics state for compositions + * + * @param $parameters + */ + function setGraphicsState($parameters) + { + // Create a new graphics state object if necessary + if (($gstate = array_search($parameters, $this->gstates)) === false) { + $this->numObj++; + $this->o_extGState($this->numObj, 'new', $parameters); + $gstate = $this->numStates; + $this->gstates[$gstate] = $parameters; + } + $this->addContent("\n/GS$gstate gs"); + } + + /** + * Set current blend mode & opacity for lines. + * + * Valid blend modes are: + * + * Normal, Multiply, Screen, Overlay, Darken, Lighten, + * ColorDogde, ColorBurn, HardLight, SoftLight, Difference, + * Exclusion + * + * @param string $mode the blend mode to use + * @param float $opacity 0.0 fully transparent, 1.0 fully opaque + */ + function setLineTransparency($mode, $opacity) + { + static $blend_modes = [ + "Normal", + "Multiply", + "Screen", + "Overlay", + "Darken", + "Lighten", + "ColorDogde", + "ColorBurn", + "HardLight", + "SoftLight", + "Difference", + "Exclusion" + ]; + + if (!in_array($mode, $blend_modes)) { + $mode = "Normal"; + } + + if (is_null($this->currentLineTransparency)) { + $this->currentLineTransparency = []; + } + + if ($mode === (key_exists('mode', $this->currentLineTransparency) ? + $this->currentLineTransparency['mode'] : '') && + $opacity === (key_exists('opacity', $this->currentLineTransparency) ? + $this->currentLineTransparency["opacity"] : '')) { + return; + } + + $this->currentLineTransparency["mode"] = $mode; + $this->currentLineTransparency["opacity"] = $opacity; + + $options = [ + "BM" => "/$mode", + "CA" => (float)$opacity + ]; + + $this->setGraphicsState($options); + } + + /** + * Set current blend mode & opacity for filled objects. + * + * Valid blend modes are: + * + * Normal, Multiply, Screen, Overlay, Darken, Lighten, + * ColorDogde, ColorBurn, HardLight, SoftLight, Difference, + * Exclusion + * + * @param string $mode the blend mode to use + * @param float $opacity 0.0 fully transparent, 1.0 fully opaque + */ + function setFillTransparency($mode, $opacity) + { + static $blend_modes = [ + "Normal", + "Multiply", + "Screen", + "Overlay", + "Darken", + "Lighten", + "ColorDogde", + "ColorBurn", + "HardLight", + "SoftLight", + "Difference", + "Exclusion" + ]; + + if (!in_array($mode, $blend_modes)) { + $mode = "Normal"; + } + + if (is_null($this->currentFillTransparency)) { + $this->currentFillTransparency = []; + } + + if ($mode === (key_exists('mode', $this->currentFillTransparency) ? + $this->currentFillTransparency['mode'] : '') && + $opacity === (key_exists('opacity', $this->currentFillTransparency) ? + $this->currentFillTransparency["opacity"] : '')) { + return; + } + + $this->currentFillTransparency["mode"] = $mode; + $this->currentFillTransparency["opacity"] = $opacity; + + $options = [ + "BM" => "/$mode", + "ca" => (float)$opacity, + ]; + + $this->setGraphicsState($options); + } + + /** + * draw a line from one set of coordinates to another + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @param bool $stroke + */ + function line($x1, $y1, $x2, $y2, $stroke = true) + { + $this->addContent(sprintf("\n%.3F %.3F m %.3F %.3F l", $x1, $y1, $x2, $y2)); + + if ($stroke) { + $this->addContent(' S'); + } + } + + /** + * draw a bezier curve based on 4 control points + * + * @param float $x0 + * @param float $y0 + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @param float $x3 + * @param float $y3 + */ + function curve($x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3) + { + // in the current line style, draw a bezier curve from (x0,y0) to (x3,y3) using the other two points + // as the control points for the curve. + $this->addContent( + sprintf("\n%.3F %.3F m %.3F %.3F %.3F %.3F %.3F %.3F c S", $x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3) + ); + } + + /** + * draw a part of an ellipse + * + * @param float $x0 + * @param float $y0 + * @param float $astart + * @param float $afinish + * @param float $r1 + * @param float $r2 + * @param float $angle + * @param int $nSeg + */ + function partEllipse($x0, $y0, $astart, $afinish, $r1, $r2 = 0, $angle = 0, $nSeg = 8) + { + $this->ellipse($x0, $y0, $r1, $r2, $angle, $nSeg, $astart, $afinish, false); + } + + /** + * draw a filled ellipse + * + * @param float $x0 + * @param float $y0 + * @param float $r1 + * @param float $r2 + * @param float $angle + * @param int $nSeg + * @param float $astart + * @param float $afinish + */ + function filledEllipse($x0, $y0, $r1, $r2 = 0, $angle = 0, $nSeg = 8, $astart = 0, $afinish = 360) + { + $this->ellipse($x0, $y0, $r1, $r2, $angle, $nSeg, $astart, $afinish, true, true); + } + + /** + * @param float $x + * @param float $y + */ + function lineTo($x, $y) + { + $this->addContent(sprintf("\n%.3F %.3F l", $x, $y)); + } + + /** + * @param float $x + * @param float $y + */ + function moveTo($x, $y) + { + $this->addContent(sprintf("\n%.3F %.3F m", $x, $y)); + } + + /** + * draw a bezier curve based on 4 control points + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @param float $x3 + * @param float $y3 + */ + function curveTo($x1, $y1, $x2, $y2, $x3, $y3) + { + $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F %.3F %.3F c", $x1, $y1, $x2, $y2, $x3, $y3)); + } + + /** + * draw a bezier curve based on 4 control points + * + * @param float $cpx + * @param float $cpy + * @param float $x + * @param float $y + */ + function quadTo($cpx, $cpy, $x, $y) + { + $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F v", $cpx, $cpy, $x, $y)); + } + + function closePath() + { + $this->addContent(' h'); + } + + function endPath() + { + $this->addContent(' n'); + } + + /** + * draw an ellipse + * note that the part and filled ellipse are just special cases of this function + * + * draws an ellipse in the current line style + * centered at $x0,$y0, radii $r1,$r2 + * if $r2 is not set, then a circle is drawn + * from $astart to $afinish, measured in degrees, running anti-clockwise from the right hand side of the ellipse. + * nSeg is not allowed to be less than 2, as this will simply draw a line (and will even draw a + * pretty crappy shape at 2, as we are approximating with bezier curves. + * + * @param float $x0 + * @param float $y0 + * @param float $r1 + * @param float $r2 + * @param float $angle + * @param int $nSeg + * @param float $astart + * @param float $afinish + * @param bool $close + * @param bool $fill + * @param bool $stroke + * @param bool $incomplete + */ + function ellipse( + $x0, + $y0, + $r1, + $r2 = 0, + $angle = 0, + $nSeg = 8, + $astart = 0, + $afinish = 360, + $close = true, + $fill = false, + $stroke = true, + $incomplete = false + ) { + if ($r1 == 0) { + return; + } + + if ($r2 == 0) { + $r2 = $r1; + } + + if ($nSeg < 2) { + $nSeg = 2; + } + + $astart = deg2rad((float)$astart); + $afinish = deg2rad((float)$afinish); + $totalAngle = $afinish - $astart; + + $dt = $totalAngle / $nSeg; + $dtm = $dt / 3; + + if ($angle != 0) { + $a = -1 * deg2rad((float)$angle); + + $this->addContent( + sprintf("\n q %.3F %.3F %.3F %.3F %.3F %.3F cm", cos($a), -sin($a), sin($a), cos($a), $x0, $y0) + ); + + $x0 = 0; + $y0 = 0; + } + + $t1 = $astart; + $a0 = $x0 + $r1 * cos($t1); + $b0 = $y0 + $r2 * sin($t1); + $c0 = -$r1 * sin($t1); + $d0 = $r2 * cos($t1); + + if (!$incomplete) { + $this->addContent(sprintf("\n%.3F %.3F m ", $a0, $b0)); + } + + for ($i = 1; $i <= $nSeg; $i++) { + // draw this bit of the total curve + $t1 = $i * $dt + $astart; + $a1 = $x0 + $r1 * cos($t1); + $b1 = $y0 + $r2 * sin($t1); + $c1 = -$r1 * sin($t1); + $d1 = $r2 * cos($t1); + + $this->addContent( + sprintf( + "\n%.3F %.3F %.3F %.3F %.3F %.3F c", + ($a0 + $c0 * $dtm), + ($b0 + $d0 * $dtm), + ($a1 - $c1 * $dtm), + ($b1 - $d1 * $dtm), + $a1, + $b1 + ) + ); + + $a0 = $a1; + $b0 = $b1; + $c0 = $c1; + $d0 = $d1; + } + + if (!$incomplete) { + if ($fill) { + $this->addContent(' f'); + } + + if ($stroke) { + if ($close) { + $this->addContent(' s'); // small 's' signifies closing the path as well + } else { + $this->addContent(' S'); + } + } + } + + if ($angle != 0) { + $this->addContent(' Q'); + } + } + + /** + * this sets the line drawing style. + * width, is the thickness of the line in user units + * cap is the type of cap to put on the line, values can be 'butt','round','square' + * where the diffference between 'square' and 'butt' is that 'square' projects a flat end past the + * end of the line. + * join can be 'miter', 'round', 'bevel' + * dash is an array which sets the dash pattern, is a series of length values, which are the lengths of the + * on and off dashes. + * (2) represents 2 on, 2 off, 2 on , 2 off ... + * (2,1) is 2 on, 1 off, 2 on, 1 off.. etc + * phase is a modifier on the dash pattern which is used to shift the point at which the pattern starts. + * + * @param float $width + * @param string $cap + * @param string $join + * @param array $dash + * @param int $phase + */ + function setLineStyle($width = 1, $cap = '', $join = '', $dash = '', $phase = 0) + { + // this is quite inefficient in that it sets all the parameters whenever 1 is changed, but will fix another day + $string = ''; + + if ($width > 0) { + $string .= "$width w"; + } + + $ca = ['butt' => 0, 'round' => 1, 'square' => 2]; + + if (isset($ca[$cap])) { + $string .= " $ca[$cap] J"; + } + + $ja = ['miter' => 0, 'round' => 1, 'bevel' => 2]; + + if (isset($ja[$join])) { + $string .= " $ja[$join] j"; + } + + if (is_array($dash)) { + $string .= ' [ ' . implode(' ', $dash) . " ] $phase d"; + } + + $this->currentLineStyle = $string; + $this->addContent("\n$string"); + } + + /** + * draw a polygon, the syntax for this is similar to the GD polygon command + * + * @param float[] $p + * @param bool $fill + */ + public function polygon(array $p, bool $fill = false): void + { + $this->addContent(sprintf("\n%.3F %.3F m ", $p[0], $p[1])); + + $n = count($p); + for ($i = 2; $i < $n; $i = $i + 2) { + $this->addContent(sprintf("%.3F %.3F l ", $p[$i], $p[$i + 1])); + } + + if ($fill) { + $this->addContent(' f'); + } else { + $this->addContent(' S'); + } + } + + /** + * a filled rectangle, note that it is the width and height of the rectangle which are the secondary parameters, not + * the coordinates of the upper-right corner + * + * @param float $x1 + * @param float $y1 + * @param float $width + * @param float $height + */ + function filledRectangle($x1, $y1, $width, $height) + { + $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re f", $x1, $y1, $width, $height)); + } + + /** + * draw a rectangle, note that it is the width and height of the rectangle which are the secondary parameters, not + * the coordinates of the upper-right corner + * + * @param float $x1 + * @param float $y1 + * @param float $width + * @param float $height + */ + function rectangle($x1, $y1, $width, $height) + { + $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re S", $x1, $y1, $width, $height)); + } + + /** + * draw a rectangle, note that it is the width and height of the rectangle which are the secondary parameters, not + * the coordinates of the upper-right corner + * + * @param float $x1 + * @param float $y1 + * @param float $width + * @param float $height + */ + function rect($x1, $y1, $width, $height) + { + $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re", $x1, $y1, $width, $height)); + } + + function stroke(bool $close = false) + { + $this->addContent("\n" . ($close ? "s" : "S")); + } + + function fill() + { + $this->addContent("\nf" . ($this->fillRule === "evenodd" ? "*" : "")); + } + + function fillStroke(bool $close = false) + { + $this->addContent("\n" . ($close ? "b" : "B") . ($this->fillRule === "evenodd" ? "*" : "")); + } + + /** + * @param string $subtype + * @param integer $x + * @param integer $y + * @param integer $w + * @param integer $h + * @return int + */ + function addXObject($subtype, $x, $y, $w, $h) + { + $id = ++$this->numObj; + $this->o_xobject($id, 'new', ['Subtype' => $subtype, 'bbox' => [$x, $y, $w, $h]]); + return $id; + } + + /** + * @param integer $numXObject + * @param string $type + * @param array $options + */ + function setXObjectResource($numXObject, $type, $options) + { + if (in_array($type, ['procset', 'font', 'xObject'])) { + $this->o_xobject($numXObject, $type, $options); + } + } + + /** + * add signature + * + * $fieldSigId = $cpdf->addFormField(Cpdf::ACROFORM_FIELD_SIG, 'Signature1', 0, 0, 0, 0, 0); + * + * $signatureId = $cpdf->addSignature([ + * 'signcert' => file_get_contents('dompdf.crt'), + * 'privkey' => file_get_contents('dompdf.key'), + * 'password' => 'password', + * 'name' => 'DomPDF DEMO', + * 'location' => 'Home', + * 'reason' => 'First Form', + * 'contactinfo' => 'info' + * ]); + * $cpdf->setFormFieldValue($fieldSigId, "$signatureId 0 R"); + * + * @param string $signcert + * @param string $privkey + * @param string $password + * @param string|null $name + * @param string|null $location + * @param string|null $reason + * @param string|null $contactinfo + * @return int + */ + function addSignature($signcert, $privkey, $password = '', $name = null, $location = null, $reason = null, $contactinfo = null) { + $sigId = ++$this->numObj; + $this->o_sig($sigId, 'new', [ + 'SignCert' => $signcert, + 'PrivKey' => $privkey, + 'Password' => $password, + 'Name' => $name, + 'Location' => $location, + 'Reason' => $reason, + 'ContactInfo' => $contactinfo + ]); + + return $sigId; + } + + /** + * add field to form + * + * @param string $type ACROFORM_FIELD_* + * @param string $name + * @param $x0 + * @param $y0 + * @param $x1 + * @param $y1 + * @param integer $ff Field Flag ACROFORM_FIELD_*_* + * @param float $size + * @param array $color + * @return int + */ + public function addFormField($type, $name, $x0, $y0, $x1, $y1, $ff = 0, $size = 10.0, $color = [0, 0, 0]) + { + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + $color = implode(' ', $color) . ' rg'; + + $currentFontNum = $this->currentFontNum; + $font = array_filter( + $this->objects[$this->currentNode]['info']['fonts'], + function ($item) use ($currentFontNum) { return $item['fontNum'] == $currentFontNum; } + ); + + $this->o_acroform($this->acroFormId, 'font', + ['objNum' => $font[0]['objNum'], 'fontNum' => $font[0]['fontNum']]); + + $fieldId = ++$this->numObj; + $this->o_field($fieldId, 'new', [ + 'rect' => [$x0, $y0, $x1, $y1], + 'F' => 4, + 'FT' => "/$type", + 'T' => $name, + 'Ff' => $ff, + 'pageid' => $this->currentPage, + 'da' => "$color /F$this->currentFontNum " . sprintf('%.1F Tf ', $size) + ]); + + return $fieldId; + } + + /** + * set Field value + * + * @param integer $numFieldObj + * @param string $value + */ + public function setFormFieldValue($numFieldObj, $value) + { + $this->o_field($numFieldObj, 'set', ['value' => $value]); + } + + /** + * set Field value (reference) + * + * @param integer $numFieldObj + * @param integer $numObj Object number + */ + public function setFormFieldRefValue($numFieldObj, $numObj) + { + $this->o_field($numFieldObj, 'set', ['refvalue' => $numObj]); + } + + /** + * set Field Appearanc (reference) + * + * @param integer $numFieldObj + * @param integer $normalNumObj + * @param integer|null $rolloverNumObj + * @param integer|null $downNumObj + */ + public function setFormFieldAppearance($numFieldObj, $normalNumObj, $rolloverNumObj = null, $downNumObj = null) + { + $appearance['N'] = $normalNumObj; + + if ($rolloverNumObj !== null) { + $appearance['R'] = $rolloverNumObj; + } + + if ($downNumObj !== null) { + $appearance['D'] = $downNumObj; + } + + $this->o_field($numFieldObj, 'set', ['appearance' => $appearance]); + } + + /** + * set Choice Field option values + * + * @param integer $numFieldObj + * @param array $value + */ + public function setFormFieldOpt($numFieldObj, $value) + { + $this->o_field($numFieldObj, 'set', ['options' => $value]); + } + + /** + * add form to document + * + * @param integer $sigFlags + * @param boolean $needAppearances + */ + public function addForm($sigFlags = 0, $needAppearances = false) + { + $this->acroFormId = ++$this->numObj; + $this->o_acroform($this->acroFormId, 'new', [ + 'NeedAppearances' => $needAppearances ? 'true' : 'false', + 'SigFlags' => $sigFlags + ]); + } + + /** + * save the current graphic state + */ + function save() + { + // we must reset the color cache or it will keep bad colors after clipping + $this->currentColor = null; + $this->currentStrokeColor = null; + $this->addContent("\nq"); + } + + /** + * restore the last graphic state + */ + function restore() + { + // we must reset the color cache or it will keep bad colors after clipping + $this->currentColor = null; + $this->currentStrokeColor = null; + $this->addContent("\nQ"); + } + + /** + * draw a clipping rectangle, all the elements added after this will be clipped + * + * @param float $x1 + * @param float $y1 + * @param float $width + * @param float $height + */ + function clippingRectangle($x1, $y1, $width, $height) + { + $this->save(); + $this->addContent(sprintf("\n%.3F %.3F %.3F %.3F re W n", $x1, $y1, $width, $height)); + } + + /** + * draw a clipping rounded rectangle, all the elements added after this will be clipped + * + * @param float $x1 + * @param float $y1 + * @param float $w + * @param float $h + * @param float $rTL + * @param float $rTR + * @param float $rBR + * @param float $rBL + */ + function clippingRectangleRounded($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL) + { + $this->save(); + + // start: top edge, left end + $this->addContent(sprintf("\n%.3F %.3F m ", $x1, $y1 - $rTL + $h)); + + // line: bottom edge, left end + $this->addContent(sprintf("\n%.3F %.3F l ", $x1, $y1 + $rBL)); + + // curve: bottom-left corner + $this->ellipse($x1 + $rBL, $y1 + $rBL, $rBL, 0, 0, 8, 180, 270, false, false, false, true); + + // line: right edge, bottom end + $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $w - $rBR, $y1)); + + // curve: bottom-right corner + $this->ellipse($x1 + $w - $rBR, $y1 + $rBR, $rBR, 0, 0, 8, 270, 360, false, false, false, true); + + // line: right edge, top end + $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $w, $y1 + $h - $rTR)); + + // curve: bottom-right corner + $this->ellipse($x1 + $w - $rTR, $y1 + $h - $rTR, $rTR, 0, 0, 8, 0, 90, false, false, false, true); + + // line: bottom edge, right end + $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $rTL, $y1 + $h)); + + // curve: top-right corner + $this->ellipse($x1 + $rTL, $y1 + $h - $rTL, $rTL, 0, 0, 8, 90, 180, false, false, false, true); + + // line: top edge, left end + $this->addContent(sprintf("\n%.3F %.3F l ", $x1 + $rBL, $y1)); + + // Close & clip + $this->addContent(" W n"); + } + + /** + * draw a clipping polygon, the syntax for this is similar to the GD polygon command + * + * @param float[] $p + */ + public function clippingPolygon(array $p): void + { + $this->save(); + + $this->addContent(sprintf("\n%.3F %.3F m ", $p[0], $p[1])); + + $n = count($p); + for ($i = 2; $i < $n; $i = $i + 2) { + $this->addContent(sprintf("%.3F %.3F l ", $p[$i], $p[$i + 1])); + } + + $this->addContent("W n"); + } + + /** + * ends the last clipping shape + */ + function clippingEnd() + { + $this->restore(); + } + + /** + * scale + * + * @param float $s_x scaling factor for width as percent + * @param float $s_y scaling factor for height as percent + * @param float $x Origin abscissa + * @param float $y Origin ordinate + */ + function scale($s_x, $s_y, $x, $y) + { + $y = $this->currentPageSize["height"] - $y; + + $tm = [ + $s_x, + 0, + 0, + $s_y, + $x * (1 - $s_x), + $y * (1 - $s_y) + ]; + + $this->transform($tm); + } + + /** + * translate + * + * @param float $t_x movement to the right + * @param float $t_y movement to the bottom + */ + function translate($t_x, $t_y) + { + $tm = [ + 1, + 0, + 0, + 1, + $t_x, + -$t_y + ]; + + $this->transform($tm); + } + + /** + * rotate + * + * @param float $angle angle in degrees for counter-clockwise rotation + * @param float $x Origin abscissa + * @param float $y Origin ordinate + */ + function rotate($angle, $x, $y) + { + $y = $this->currentPageSize["height"] - $y; + + $a = deg2rad($angle); + $cos_a = cos($a); + $sin_a = sin($a); + + $tm = [ + $cos_a, + -$sin_a, + $sin_a, + $cos_a, + $x - $sin_a * $y - $cos_a * $x, + $y - $cos_a * $y + $sin_a * $x, + ]; + + $this->transform($tm); + } + + /** + * skew + * + * @param float $angle_x + * @param float $angle_y + * @param float $x Origin abscissa + * @param float $y Origin ordinate + */ + function skew($angle_x, $angle_y, $x, $y) + { + $y = $this->currentPageSize["height"] - $y; + + $tan_x = tan(deg2rad($angle_x)); + $tan_y = tan(deg2rad($angle_y)); + + $tm = [ + 1, + -$tan_y, + -$tan_x, + 1, + $tan_x * $y, + $tan_y * $x, + ]; + + $this->transform($tm); + } + + /** + * apply graphic transformations + * + * @param array $tm transformation matrix + */ + function transform($tm) + { + $this->addContent(vsprintf("\n %.3F %.3F %.3F %.3F %.3F %.3F cm", $tm)); + } + + /** + * add a new page to the document + * this also makes the new page the current active object + * + * @param int $insert + * @param int $id + * @param string $pos + * @return int + */ + function newPage($insert = 0, $id = 0, $pos = 'after') + { + // if there is a state saved, then go up the stack closing them + // then on the new page, re-open them with the right setings + + if ($this->nStateStack) { + for ($i = $this->nStateStack; $i >= 1; $i--) { + $this->restoreState($i); + } + } + + $this->numObj++; + + if ($insert) { + // the id from the ezPdf class is the id of the contents of the page, not the page object itself + // query that object to find the parent + $rid = $this->objects[$id]['onPage']; + $opt = ['rid' => $rid, 'pos' => $pos]; + $this->o_page($this->numObj, 'new', $opt); + } else { + $this->o_page($this->numObj, 'new'); + } + + // if there is a stack saved, then put that onto the page + if ($this->nStateStack) { + for ($i = 1; $i <= $this->nStateStack; $i++) { + $this->saveState($i); + } + } + + // and if there has been a stroke or fill color set, then transfer them + if (isset($this->currentColor)) { + $this->setColor($this->currentColor, true); + } + + if (isset($this->currentStrokeColor)) { + $this->setStrokeColor($this->currentStrokeColor, true); + } + + // if there is a line style set, then put this in too + if (mb_strlen($this->currentLineStyle, '8bit')) { + $this->addContent("\n$this->currentLineStyle"); + } + + // the call to the o_page object set currentContents to the present page, so this can be returned as the page id + return $this->currentContents; + } + + /** + * Streams the PDF to the client. + * + * @param string $filename The filename to present to the client. + * @param array $options Associative array: 'compress' => 1 or 0 (default 1); 'Attachment' => 1 or 0 (default 1). + */ + function stream($filename = "document.pdf", $options = []) + { + if (headers_sent()) { + die("Unable to stream pdf: headers already sent"); + } + + if (!isset($options["compress"])) $options["compress"] = true; + if (!isset($options["Attachment"])) $options["Attachment"] = true; + + $debug = !$options['compress']; + $tmp = ltrim($this->output($debug)); + + header("Cache-Control: private"); + header("Content-Type: application/pdf"); + header("Content-Length: " . mb_strlen($tmp, "8bit")); + + $filename = str_replace(["\n", "'"], "", basename($filename, ".pdf")) . ".pdf"; + $attachment = $options["Attachment"] ? "attachment" : "inline"; + + $encoding = mb_detect_encoding($filename); + $fallbackfilename = mb_convert_encoding($filename, "ISO-8859-1", $encoding); + $fallbackfilename = str_replace("\"", "", $fallbackfilename); + $encodedfilename = rawurlencode($filename); + + $contentDisposition = "Content-Disposition: $attachment; filename=\"$fallbackfilename\""; + if ($fallbackfilename !== $filename) { + $contentDisposition .= "; filename*=UTF-8''$encodedfilename"; + } + header($contentDisposition); + + echo $tmp; + flush(); + } + + /** + * return the height in units of the current font in the given size + * + * @param float $size + * + * @return float + */ + public function getFontHeight(float $size): float + { + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + $font = $this->fonts[$this->currentFont]; + + // for the current font, and the given size, what is the height of the font in user units + if (isset($font['Ascender']) && isset($font['Descender'])) { + $h = $font['Ascender'] - $font['Descender']; + } else { + $h = $font['FontBBox'][3] - $font['FontBBox'][1]; + } + + // have to adjust by a font offset for Windows fonts. unfortunately it looks like + // the bounding box calculations are wrong and I don't know why. + if (isset($font['FontHeightOffset'])) { + // For CourierNew from Windows this needs to be -646 to match the + // Adobe native Courier font. + // + // For FreeMono from GNU this needs to be -337 to match the + // Courier font. + // + // Both have been added manually to the .afm and .ufm files. + $h += (int)$font['FontHeightOffset']; + } + + return $size * $h / 1000; + } + + /** + * @param float $size + * + * @return float + */ + public function getFontXHeight(float $size): float + { + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + $font = $this->fonts[$this->currentFont]; + + // for the current font, and the given size, what is the height of the font in user units + if (isset($font['XHeight'])) { + $xh = $font['Ascender'] - $font['Descender']; + } else { + $xh = $this->getFontHeight($size) / 2; + } + + return $size * $xh / 1000; + } + + /** + * return the font descender, this will normally return a negative number + * if you add this number to the baseline, you get the level of the bottom of the font + * it is in the pdf user units + * + * @param float $size + * + * @return float + */ + public function getFontDescender(float $size): float + { + // note that this will most likely return a negative value + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + //$h = $this->fonts[$this->currentFont]['FontBBox'][1]; + $h = $this->fonts[$this->currentFont]['Descender']; + + return $size * $h / 1000; + } + + /** + * filter the text, this is applied to all text just before being inserted into the pdf document + * it escapes the various things that need to be escaped, and so on + * + * @param $text + * @param bool $bom + * @param bool $convert_encoding + * @return string + */ + function filterText($text, $bom = true, $convert_encoding = true) + { + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + if ($convert_encoding) { + $cf = $this->currentFont; + if (isset($this->fonts[$cf]) && $this->fonts[$cf]['isUnicode']) { + $text = $this->utf8toUtf16BE($text, $bom); + } else { + //$text = html_entity_decode($text, ENT_QUOTES); + $text = mb_convert_encoding($text, self::$targetEncoding, 'UTF-8'); + } + } elseif ($bom) { + $text = $this->utf8toUtf16BE($text, $bom); + } + + // the chr(13) substitution fixes a bug seen in TCPDF (bug #1421290) + return strtr($text, [')' => '\\)', '(' => '\\(', '\\' => '\\\\', chr(13) => '\r']); + } + + /** + * return array containing codepoints (UTF-8 character values) for the + * string passed in. + * + * based on the excellent TCPDF code by Nicola Asuni and the + * RFC for UTF-8 at http://www.faqs.org/rfcs/rfc3629.html + * + * @param string $text UTF-8 string to process + * @return array UTF-8 codepoints array for the string + */ + function utf8toCodePointsArray(&$text) + { + $length = mb_strlen($text, '8bit'); // http://www.php.net/manual/en/function.mb-strlen.php#77040 + $unicode = []; // array containing unicode values + $bytes = []; // array containing single character byte sequences + $numbytes = 1; // number of octets needed to represent the UTF-8 character + + for ($i = 0; $i < $length; $i++) { + $c = ord($text[$i]); // get one string character at time + if (count($bytes) === 0) { // get starting octect + if ($c <= 0x7F) { + $unicode[] = $c; // use the character "as is" because is ASCII + $numbytes = 1; + } elseif (($c >> 0x05) === 0x06) { // 2 bytes character (0x06 = 110 BIN) + $bytes[] = ($c - 0xC0) << 0x06; + $numbytes = 2; + } elseif (($c >> 0x04) === 0x0E) { // 3 bytes character (0x0E = 1110 BIN) + $bytes[] = ($c - 0xE0) << 0x0C; + $numbytes = 3; + } elseif (($c >> 0x03) === 0x1E) { // 4 bytes character (0x1E = 11110 BIN) + $bytes[] = ($c - 0xF0) << 0x12; + $numbytes = 4; + } else { + // use replacement character for other invalid sequences + $unicode[] = 0xFFFD; + $bytes = []; + $numbytes = 1; + } + } elseif (($c >> 0x06) === 0x02) { // bytes 2, 3 and 4 must start with 0x02 = 10 BIN + $bytes[] = $c - 0x80; + if (count($bytes) === $numbytes) { + // compose UTF-8 bytes to a single unicode value + $c = $bytes[0]; + for ($j = 1; $j < $numbytes; $j++) { + $c += ($bytes[$j] << (($numbytes - $j - 1) * 0x06)); + } + if ((($c >= 0xD800) and ($c <= 0xDFFF)) or ($c >= 0x10FFFF)) { + // The definition of UTF-8 prohibits encoding character numbers between + // U+D800 and U+DFFF, which are reserved for use with the UTF-16 + // encoding form (as surrogate pairs) and do not directly represent + // characters. + $unicode[] = 0xFFFD; // use replacement character + } else { + $unicode[] = $c; // add char to array + } + // reset data for next char + $bytes = []; + $numbytes = 1; + } + } else { + // use replacement character for other invalid sequences + $unicode[] = 0xFFFD; + $bytes = []; + $numbytes = 1; + } + } + + return $unicode; + } + + /** + * convert UTF-8 to UTF-16 with an additional byte order marker + * at the front if required. + * + * based on the excellent TCPDF code by Nicola Asuni and the + * RFC for UTF-8 at http://www.faqs.org/rfcs/rfc3629.html + * + * @param string $text UTF-8 string to process + * @param boolean $bom whether to add the byte order marker + * @return string UTF-16 result string + */ + function utf8toUtf16BE(&$text, $bom = true) + { + $out = $bom ? "\xFE\xFF" : ''; + + $unicode = $this->utf8toCodePointsArray($text); + foreach ($unicode as $c) { + if ($c === 0xFFFD) { + $out .= "\xFF\xFD"; // replacement character + } elseif ($c < 0x10000) { + $out .= chr($c >> 0x08) . chr($c & 0xFF); + } else { + $c -= 0x10000; + $w1 = 0xD800 | ($c >> 0x10); + $w2 = 0xDC00 | ($c & 0x3FF); + $out .= chr($w1 >> 0x08) . chr($w1 & 0xFF) . chr($w2 >> 0x08) . chr($w2 & 0xFF); + } + } + + return $out; + } + + /** + * given a start position and information about how text is to be laid out, calculate where + * on the page the text will end + * + * @param $x + * @param $y + * @param $angle + * @param $size + * @param $wa + * @param $text + * @return array + */ + private function getTextPosition($x, $y, $angle, $size, $wa, $text) + { + // given this information return an array containing x and y for the end position as elements 0 and 1 + $w = $this->getTextWidth($size, $text); + + // need to adjust for the number of spaces in this text + $words = explode(' ', $text); + $nspaces = count($words) - 1; + $w += $wa * $nspaces; + $a = deg2rad((float)$angle); + + return [cos($a) * $w + $x, -sin($a) * $w + $y]; + } + + /** + * Callback method used by smallCaps + * + * @param array $matches + * + * @return string + */ + function toUpper($matches) + { + return mb_strtoupper($matches[0]); + } + + function concatMatches($matches) + { + $str = ""; + foreach ($matches as $match) { + $str .= $match[0]; + } + + return $str; + } + + /** + * register text for font subsetting + * + * @param string $font + * @param string $text + */ + function registerText($font, $text) + { + if (!$this->isUnicode || in_array(mb_strtolower(basename($font)), self::$coreFonts)) { + return; + } + + if (!isset($this->stringSubsets[$font])) { + $base_subset = "\u{fffd}\u{fffe}\u{ffff}"; + $this->stringSubsets[$font] = $this->utf8toCodePointsArray($base_subset); + } + + $this->stringSubsets[$font] = array_unique( + array_merge($this->stringSubsets[$font], $this->utf8toCodePointsArray($text)) + ); + } + + /** + * add text to the document, at a specified location, size and angle on the page + * + * @param float $x + * @param float $y + * @param float $size + * @param string $text + * @param float $angle + * @param float $wordSpaceAdjust + * @param float $charSpaceAdjust + * @param bool $smallCaps + */ + function addText($x, $y, $size, $text, $angle = 0, $wordSpaceAdjust = 0, $charSpaceAdjust = 0, $smallCaps = false) + { + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + $text = str_replace(["\r", "\n"], "", $text); + + // if ($smallCaps) { + // preg_match_all("/(\P{Ll}+)/u", $text, $matches, PREG_SET_ORDER); + // $lower = $this->concatMatches($matches); + // d($lower); + + // preg_match_all("/(\p{Ll}+)/u", $text, $matches, PREG_SET_ORDER); + // $other = $this->concatMatches($matches); + // d($other); + + // $text = preg_replace_callback("/\p{Ll}/u", array($this, "toUpper"), $text); + // } + + // if there are any open callbacks, then they should be called, to show the start of the line + if ($this->nCallback > 0) { + for ($i = $this->nCallback; $i > 0; $i--) { + // call each function + $info = [ + 'x' => $x, + 'y' => $y, + 'angle' => $angle, + 'status' => 'sol', + 'p' => $this->callback[$i]['p'], + 'nCallback' => $this->callback[$i]['nCallback'], + 'height' => $this->callback[$i]['height'], + 'descender' => $this->callback[$i]['descender'] + ]; + + $func = $this->callback[$i]['f']; + $this->$func($info); + } + } + + if ($angle == 0) { + $this->addContent(sprintf("\nBT %.3F %.3F Td", $x, $y)); + } else { + $a = deg2rad((float)$angle); + $this->addContent( + sprintf("\nBT %.3F %.3F %.3F %.3F %.3F %.3F Tm", cos($a), -sin($a), sin($a), cos($a), $x, $y) + ); + } + + if ($wordSpaceAdjust != 0) { + $this->addContent(sprintf(" %.3F Tw", $wordSpaceAdjust)); + } + + if ($charSpaceAdjust != 0) { + $this->addContent(sprintf(" %.3F Tc", $charSpaceAdjust)); + } + + $len = mb_strlen($text); + $start = 0; + + if ($start < $len) { + $part = $text; // OAR - Don't need this anymore, given that $start always equals zero. substr($text, $start); + $place_text = $this->filterText($part, false); + // modify unicode text so that extra word spacing is manually implemented (bug #) + if ($this->fonts[$this->currentFont]['isUnicode'] && $wordSpaceAdjust != 0) { + $space_scale = 1000 / $size; + $place_text = str_replace("\x00\x20", "\x00\x20)\x00\x20" . (-round($space_scale * $wordSpaceAdjust)) . "\x00\x20(", $place_text); + } + $this->addContent(" /F$this->currentFontNum " . sprintf('%.1F Tf ', $size)); + $this->addContent(" [($place_text)] TJ"); + } + + if ($wordSpaceAdjust != 0) { + $this->addContent(sprintf(" %.3F Tw", 0)); + } + + if ($charSpaceAdjust != 0) { + $this->addContent(sprintf(" %.3F Tc", 0)); + } + + $this->addContent(' ET'); + + // if there are any open callbacks, then they should be called, to show the end of the line + if ($this->nCallback > 0) { + for ($i = $this->nCallback; $i > 0; $i--) { + // call each function + $tmp = $this->getTextPosition($x, $y, $angle, $size, $wordSpaceAdjust, $text); + $info = [ + 'x' => $tmp[0], + 'y' => $tmp[1], + 'angle' => $angle, + 'status' => 'eol', + 'p' => $this->callback[$i]['p'], + 'nCallback' => $this->callback[$i]['nCallback'], + 'height' => $this->callback[$i]['height'], + 'descender' => $this->callback[$i]['descender'] + ]; + $func = $this->callback[$i]['f']; + $this->$func($info); + } + } + + if ($this->fonts[$this->currentFont]['isSubsetting']) { + $this->registerText($this->currentFont, $text); + } + } + + /** + * calculate how wide a given text string will be on a page, at a given size. + * this can be called externally, but is also used by the other class functions + * + * @param float $size + * @param string $text + * @param float $wordSpacing + * @param float $charSpacing + * + * @return float + */ + public function getTextWidth(float $size, string $text, float $wordSpacing = 0.0, float $charSpacing = 0.0): float + { + static $ord_cache = []; + + // this function should not change any of the settings, though it will need to + // track any directives which change during calculation, so copy them at the start + // and put them back at the end. + $store_currentTextState = $this->currentTextState; + + if (!$this->numFonts) { + $this->selectFont($this->defaultFont); + } + + $text = str_replace(["\r", "\n"], "", $text); + + // hmm, this is where it all starts to get tricky - use the font information to + // calculate the width of each character, add them up and convert to user units + $w = 0; + $cf = $this->currentFont; + $current_font = $this->fonts[$cf]; + $space_scale = 1000 / ($size > 0 ? $size : 1); + + if ($current_font['isUnicode']) { + // for Unicode, use the code points array to calculate width rather + // than just the string itself + $unicode = $this->utf8toCodePointsArray($text); + + foreach ($unicode as $char) { + // check if we have to replace character + if (isset($current_font['differences'][$char])) { + $char = $current_font['differences'][$char]; + } + + if (isset($current_font['C'][$char])) { + $char_width = $current_font['C'][$char]; + + // add the character width + $w += $char_width; + + // add additional padding for space + if (isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space') { // Space + $w += $wordSpacing * $space_scale; + } + } + } + + // add additional char spacing + if ($charSpacing != 0) { + $w += $charSpacing * $space_scale * count($unicode); + } + + } else { + // If CPDF is in Unicode mode but the current font does not support Unicode we need to convert the character set to Windows-1252 + if ($this->isUnicode) { + $text = mb_convert_encoding($text, 'Windows-1252', 'UTF-8'); + } + + $len = mb_strlen($text, 'Windows-1252'); + + for ($i = 0; $i < $len; $i++) { + $c = $text[$i]; + $char = isset($ord_cache[$c]) ? $ord_cache[$c] : ($ord_cache[$c] = ord($c)); + + // check if we have to replace character + if (isset($current_font['differences'][$char])) { + $char = $current_font['differences'][$char]; + } + + if (isset($current_font['C'][$char])) { + $char_width = $current_font['C'][$char]; + + // add the character width + $w += $char_width; + + // add additional padding for space + if (isset($current_font['codeToName'][$char]) && $current_font['codeToName'][$char] === 'space') { // Space + $w += $wordSpacing * $space_scale; + } + } + } + + // add additional char spacing + if ($charSpacing != 0) { + $w += $charSpacing * $space_scale * $len; + } + } + + $this->currentTextState = $store_currentTextState; + $this->setCurrentFont(); + + return $w * $size / 1000; + } + + /** + * this will be called at a new page to return the state to what it was on the + * end of the previous page, before the stack was closed down + * This is to get around not being able to have open 'q' across pages + * + * @param int $pageEnd + */ + function saveState($pageEnd = 0) + { + if ($pageEnd) { + // this will be called at a new page to return the state to what it was on the + // end of the previous page, before the stack was closed down + // This is to get around not being able to have open 'q' across pages + $opt = $this->stateStack[$pageEnd]; + // ok to use this as stack starts numbering at 1 + $this->setColor($opt['col'], true); + $this->setStrokeColor($opt['str'], true); + $this->addContent("\n" . $opt['lin']); + // $this->currentLineStyle = $opt['lin']; + } else { + $this->nStateStack++; + $this->stateStack[$this->nStateStack] = [ + 'col' => $this->currentColor, + 'str' => $this->currentStrokeColor, + 'lin' => $this->currentLineStyle + ]; + } + + $this->save(); + } + + /** + * restore a previously saved state + * + * @param int $pageEnd + */ + function restoreState($pageEnd = 0) + { + if (!$pageEnd) { + $n = $this->nStateStack; + $this->currentColor = $this->stateStack[$n]['col']; + $this->currentStrokeColor = $this->stateStack[$n]['str']; + $this->addContent("\n" . $this->stateStack[$n]['lin']); + $this->currentLineStyle = $this->stateStack[$n]['lin']; + $this->stateStack[$n] = null; + unset($this->stateStack[$n]); + $this->nStateStack--; + } + + $this->restore(); + } + + /** + * make a loose object, the output will go into this object, until it is closed, then will revert to + * the current one. + * this object will not appear until it is included within a page. + * the function will return the object number + * + * @return int + */ + function openObject() + { + $this->nStack++; + $this->stack[$this->nStack] = ['c' => $this->currentContents, 'p' => $this->currentPage]; + // add a new object of the content type, to hold the data flow + $this->numObj++; + $this->o_contents($this->numObj, 'new'); + $this->currentContents = $this->numObj; + $this->looseObjects[$this->numObj] = 1; + + return $this->numObj; + } + + /** + * open an existing object for editing + * + * @param $id + */ + function reopenObject($id) + { + $this->nStack++; + $this->stack[$this->nStack] = ['c' => $this->currentContents, 'p' => $this->currentPage]; + $this->currentContents = $id; + + // also if this object is the primary contents for a page, then set the current page to its parent + if (isset($this->objects[$id]['onPage'])) { + $this->currentPage = $this->objects[$id]['onPage']; + } + } + + /** + * close an object + */ + function closeObject() + { + // close the object, as long as there was one open in the first place, which will be indicated by + // an objectId on the stack. + if ($this->nStack > 0) { + $this->currentContents = $this->stack[$this->nStack]['c']; + $this->currentPage = $this->stack[$this->nStack]['p']; + $this->nStack--; + // easier to probably not worry about removing the old entries, they will be overwritten + // if there are new ones. + } + } + + /** + * stop an object from appearing on pages from this point on + * + * @param $id + */ + function stopObject($id) + { + // if an object has been appearing on pages up to now, then stop it, this page will + // be the last one that could contain it. + if (isset($this->addLooseObjects[$id])) { + $this->addLooseObjects[$id] = ''; + } + } + + /** + * after an object has been created, it wil only show if it has been added, using this function. + * + * @param $id + * @param string $options + */ + function addObject($id, $options = 'add') + { + // add the specified object to the page + if (isset($this->looseObjects[$id]) && $this->currentContents != $id) { + // then it is a valid object, and it is not being added to itself + switch ($options) { + case 'all': + // then this object is to be added to this page (done in the next block) and + // all future new pages. + $this->addLooseObjects[$id] = 'all'; + + case 'add': + if (isset($this->objects[$this->currentContents]['onPage'])) { + // then the destination contents is the primary for the page + // (though this object is actually added to that page) + $this->o_page($this->objects[$this->currentContents]['onPage'], 'content', $id); + } + break; + + case 'even': + $this->addLooseObjects[$id] = 'even'; + $pageObjectId = $this->objects[$this->currentContents]['onPage']; + if ($this->objects[$pageObjectId]['info']['pageNum'] % 2 == 0) { + $this->addObject($id); + // hacky huh :) + } + break; + + case 'odd': + $this->addLooseObjects[$id] = 'odd'; + $pageObjectId = $this->objects[$this->currentContents]['onPage']; + if ($this->objects[$pageObjectId]['info']['pageNum'] % 2 == 1) { + $this->addObject($id); + // hacky huh :) + } + break; + + case 'next': + $this->addLooseObjects[$id] = 'all'; + break; + + case 'nexteven': + $this->addLooseObjects[$id] = 'even'; + break; + + case 'nextodd': + $this->addLooseObjects[$id] = 'odd'; + break; + } + } + } + + /** + * return a storable representation of a specific object + * + * @param $id + * @return string|null + */ + function serializeObject($id) + { + if (array_key_exists($id, $this->objects)) { + return serialize($this->objects[$id]); + } + + return null; + } + + /** + * restore an object from its stored representation. Returns its new object id. + * + * @param $obj + * @return int + */ + function restoreSerializedObject($obj) + { + $obj_id = $this->openObject(); + $this->objects[$obj_id] = unserialize($obj); + $this->closeObject(); + + return $obj_id; + } + + /** + * Embeds a file inside the PDF + * + * @param string $filepath path to the file to store inside the PDF + * @param string $embeddedFilename the filename displayed in the list of embedded files + * @param string $description a description in the list of embedded files + */ + public function addEmbeddedFile(string $filepath, string $embeddedFilename, string $description): void + { + $this->numObj++; + $this->o_embedded_file_dictionary( + $this->numObj, + 'new', + [ + 'filepath' => $filepath, + 'filename' => $embeddedFilename, + 'description' => $description + ] + ); + } + + /** + * Add content to the documents info object + * + * @param string|array $label + * @param string $value + */ + public function addInfo($label, string $value = ""): void + { + // this will only work if the label is one of the valid ones. + // modify this so that arrays can be passed as well. + // if $label is an array then assume that it is key => value pairs + // else assume that they are both scalar, anything else will probably error + if (is_array($label)) { + foreach ($label as $l => $v) { + $this->o_info($this->infoObject, $l, (string) $v); + } + } else { + $this->o_info($this->infoObject, $label, $value); + } + } + + /** + * set the viewer preferences of the document, it is up to the browser to obey these. + * + * @param $label + * @param int $value + */ + function setPreferences($label, $value = 0) + { + // this will only work if the label is one of the valid ones. + if (is_array($label)) { + foreach ($label as $l => $v) { + $this->o_catalog($this->catalogId, 'viewerPreferences', [$l => $v]); + } + } else { + $this->o_catalog($this->catalogId, 'viewerPreferences', [$label => $value]); + } + } + + /** + * extract an integer from a position in a byte stream + * + * @param $data + * @param $pos + * @param $num + * @return int + */ + private function getBytes(&$data, $pos, $num) + { + // return the integer represented by $num bytes from $pos within $data + $ret = 0; + for ($i = 0; $i < $num; $i++) { + $ret *= 256; + $ret += ord($data[$pos + $i]); + } + + return $ret; + } + + /** + * Check if image already added to pdf image directory. + * If yes, need not to create again (pass empty data) + * + * @param string $imgname + * @return bool + */ + function image_iscached($imgname) + { + return isset($this->imagelist[$imgname]); + } + + /** + * add a PNG image into the document, from a GD object + * this should work with remote files + * + * @param \GdImage|resource $img A GD resource + * @param string $file The PNG file + * @param float $x X position + * @param float $y Y position + * @param float $w Width + * @param float $h Height + * @param bool $is_mask true if the image is a mask + * @param bool $mask true if the image is masked + * @throws Exception + */ + function addImagePng(&$img, $file, $x, $y, $w = 0.0, $h = 0.0, $is_mask = false, $mask = null) + { + if (!function_exists("imagepng")) { + throw new \Exception("The PHP GD extension is required, but is not installed."); + } + + //if already cached, need not to read again + if (isset($this->imagelist[$file])) { + $data = null; + } else { + // Example for transparency handling on new image. Retain for current image + // $tIndex = imagecolortransparent($img); + // if ($tIndex > 0) { + // $tColor = imagecolorsforindex($img, $tIndex); + // $new_tIndex = imagecolorallocate($new_img, $tColor['red'], $tColor['green'], $tColor['blue']); + // imagefill($new_img, 0, 0, $new_tIndex); + // imagecolortransparent($new_img, $new_tIndex); + // } + // blending mode (literal/blending) on drawing into current image. not relevant when not saved or not drawn + //imagealphablending($img, true); + + //default, but explicitely set to ensure pdf compatibility + imagesavealpha($img, false/*!$is_mask && !$mask*/); + + $error = 0; + //DEBUG_IMG_TEMP + //debugpng + if (defined("DEBUGPNG") && DEBUGPNG) { + print '[addImagePng ' . $file . ']'; + } + + ob_start(); + @imagepng($img); + $data = ob_get_clean(); + + if ($data == '') { + $error = 1; + $errormsg = 'trouble writing file from GD'; + //DEBUG_IMG_TEMP + //debugpng + if (defined("DEBUGPNG") && DEBUGPNG) { + print 'trouble writing file from GD'; + } + } + + if ($error) { + $this->addMessage('PNG error - (' . $file . ') ' . $errormsg); + + return; + } + } //End isset($this->imagelist[$file]) (png Duplicate removal) + + $this->addPngFromBuf($data, $file, $x, $y, $w, $h, $is_mask, $mask); + } + + /** + * @param $file + * @param $x + * @param $y + * @param $w + * @param $h + * @param $byte + */ + protected function addImagePngAlpha($file, $x, $y, $w, $h, $byte) + { + // generate images + $img = @imagecreatefrompng($file); + + if ($img === false) { + return; + } + + // FIXME The pixel transformation doesn't work well with 8bit PNGs + $eight_bit = ($byte & 4) !== 4; + + $wpx = imagesx($img); + $hpx = imagesy($img); + + imagesavealpha($img, false); + + // create temp alpha file + $tempfile_alpha = @tempnam($this->tmp, "cpdf_img_"); + @unlink($tempfile_alpha); + $tempfile_alpha = "$tempfile_alpha.png"; + + // create temp plain file + $tempfile_plain = @tempnam($this->tmp, "cpdf_img_"); + @unlink($tempfile_plain); + $tempfile_plain = "$tempfile_plain.png"; + + $imgalpha = imagecreate($wpx, $hpx); + imagesavealpha($imgalpha, false); + + // generate gray scale palette (0 -> 255) + for ($c = 0; $c < 256; ++$c) { + imagecolorallocate($imgalpha, $c, $c, $c); + } + + // Use PECL gmagick + Graphics Magic to process transparent PNG images + if (extension_loaded("gmagick")) { + $gmagick = new \Gmagick($file); + $gmagick->setimageformat('png'); + + // Get opacity channel (negative of alpha channel) + $alpha_channel_neg = clone $gmagick; + $alpha_channel_neg->separateimagechannel(\Gmagick::CHANNEL_OPACITY); + + // Negate opacity channel + $alpha_channel = new \Gmagick(); + $alpha_channel->newimage($wpx, $hpx, "#FFFFFF", "png"); + $alpha_channel->compositeimage($alpha_channel_neg, \Gmagick::COMPOSITE_DIFFERENCE, 0, 0); + $alpha_channel->separateimagechannel(\Gmagick::CHANNEL_RED); + $alpha_channel->writeimage($tempfile_alpha); + + // Cast to 8bit+palette + $imgalpha_ = @imagecreatefrompng($tempfile_alpha); + imagecopy($imgalpha, $imgalpha_, 0, 0, 0, 0, $wpx, $hpx); + imagedestroy($imgalpha_); + imagepng($imgalpha, $tempfile_alpha); + + // Make opaque image + $color_channels = new \Gmagick(); + $color_channels->newimage($wpx, $hpx, "#FFFFFF", "png"); + $color_channels->compositeimage($gmagick, \Gmagick::COMPOSITE_COPYRED, 0, 0); + $color_channels->compositeimage($gmagick, \Gmagick::COMPOSITE_COPYGREEN, 0, 0); + $color_channels->compositeimage($gmagick, \Gmagick::COMPOSITE_COPYBLUE, 0, 0); + $color_channels->writeimage($tempfile_plain); + + $imgplain = @imagecreatefrompng($tempfile_plain); + } + // Use PECL imagick + ImageMagic to process transparent PNG images + elseif (extension_loaded("imagick")) { + // Native cloning was added to pecl-imagick in svn commit 263814 + // the first version containing it was 3.0.1RC1 + static $imagickClonable = null; + if ($imagickClonable === null) { + $imagickClonable = true; + if (defined('Imagick::IMAGICK_EXTVER')) { + $imagickVersion = \Imagick::IMAGICK_EXTVER; + } else { + $imagickVersion = '0'; + } + if (version_compare($imagickVersion, '0.0.1', '>=')) { + $imagickClonable = version_compare($imagickVersion, '3.0.1rc1', '>='); + } + } + + $imagick = new \Imagick($file); + $imagick->setFormat('png'); + + // Get opacity channel (negative of alpha channel) + if ($imagick->getImageAlphaChannel()) { + $alpha_channel = $imagickClonable ? clone $imagick : $imagick->clone(); + $alpha_channel->separateImageChannel(\Imagick::CHANNEL_ALPHA); + // Since ImageMagick7 negate invert transparency as default + if (\Imagick::getVersion()['versionNumber'] < 1800) { + $alpha_channel->negateImage(true); + } + $alpha_channel->writeImage($tempfile_alpha); + + // Cast to 8bit+palette + $imgalpha_ = @imagecreatefrompng($tempfile_alpha); + imagecopy($imgalpha, $imgalpha_, 0, 0, 0, 0, $wpx, $hpx); + imagedestroy($imgalpha_); + imagepng($imgalpha, $tempfile_alpha); + } else { + $tempfile_alpha = null; + } + + // Make opaque image + $color_channels = new \Imagick(); + $color_channels->newImage($wpx, $hpx, "#FFFFFF", "png"); + $color_channels->compositeImage($imagick, \Imagick::COMPOSITE_COPYRED, 0, 0); + $color_channels->compositeImage($imagick, \Imagick::COMPOSITE_COPYGREEN, 0, 0); + $color_channels->compositeImage($imagick, \Imagick::COMPOSITE_COPYBLUE, 0, 0); + $color_channels->writeImage($tempfile_plain); + + $imgplain = @imagecreatefrompng($tempfile_plain); + } else { + // allocated colors cache + $allocated_colors = []; + + // extract alpha channel + for ($xpx = 0; $xpx < $wpx; ++$xpx) { + for ($ypx = 0; $ypx < $hpx; ++$ypx) { + $color = imagecolorat($img, $xpx, $ypx); + $col = imagecolorsforindex($img, $color); + $alpha = $col['alpha']; + + if ($eight_bit) { + // with gamma correction + $gammacorr = 2.2; + $pixel = round(pow((((127 - $alpha) * 255 / 127) / 255), $gammacorr) * 255); + } else { + // without gamma correction + $pixel = (127 - $alpha) * 2; + + $key = $col['red'] . $col['green'] . $col['blue']; + + if (!isset($allocated_colors[$key])) { + $pixel_img = imagecolorallocate($img, $col['red'], $col['green'], $col['blue']); + $allocated_colors[$key] = $pixel_img; + } else { + $pixel_img = $allocated_colors[$key]; + } + + imagesetpixel($img, $xpx, $ypx, $pixel_img); + } + + imagesetpixel($imgalpha, $xpx, $ypx, $pixel); + } + } + + // extract image without alpha channel + $imgplain = imagecreatetruecolor($wpx, $hpx); + imagecopy($imgplain, $img, 0, 0, 0, 0, $wpx, $hpx); + imagedestroy($img); + + imagepng($imgalpha, $tempfile_alpha); + imagepng($imgplain, $tempfile_plain); + } + + $this->imageAlphaList[$file] = [$tempfile_alpha, $tempfile_plain]; + + // embed mask image + if ($tempfile_alpha) { + $this->addImagePng($imgalpha, $tempfile_alpha, $x, $y, $w, $h, true); + imagedestroy($imgalpha); + $this->imageCache[] = $tempfile_alpha; + } + + // embed image, masked with previously embedded mask + $this->addImagePng($imgplain, $tempfile_plain, $x, $y, $w, $h, false, ($tempfile_alpha !== null)); + imagedestroy($imgplain); + $this->imageCache[] = $tempfile_plain; + } + + /** + * add a PNG image into the document, from a file + * this should work with remote files + * + * @param $file + * @param $x + * @param $y + * @param int $w + * @param int $h + * @throws Exception + */ + function addPngFromFile($file, $x, $y, $w = 0, $h = 0) + { + if (!function_exists("imagecreatefrompng")) { + throw new \Exception("The PHP GD extension is required, but is not installed."); + } + + if (isset($this->imageAlphaList[$file])) { + [$alphaFile, $plainFile] = $this->imageAlphaList[$file]; + + if ($alphaFile) { + $img = null; + $this->addImagePng($img, $alphaFile, $x, $y, $w, $h, true); + } + + $img = null; + $this->addImagePng($img, $plainFile, $x, $y, $w, $h, false, ($plainFile !== null)); + return; + } + + //if already cached, need not to read again + if (isset($this->imagelist[$file])) { + $img = null; + } else { + $info = file_get_contents($file, false, null, 24, 5); + $meta = unpack("CbitDepth/CcolorType/CcompressionMethod/CfilterMethod/CinterlaceMethod", $info); + $bit_depth = $meta["bitDepth"]; + $color_type = $meta["colorType"]; + + // http://www.w3.org/TR/PNG/#11IHDR + // 3 => indexed + // 4 => greyscale with alpha + // 6 => fullcolor with alpha + $is_alpha = in_array($color_type, [4, 6]) || ($color_type == 3 && $bit_depth != 4); + + if ($is_alpha) { // exclude grayscale alpha + $this->addImagePngAlpha($file, $x, $y, $w, $h, $color_type); + return; + } + + //png files typically contain an alpha channel. + //pdf file format or class.pdf does not support alpha blending. + //on alpha blended images, more transparent areas have a color near black. + //This appears in the result on not storing the alpha channel. + //Correct would be the box background image or its parent when transparent. + //But this would make the image dependent on the background. + //Therefore create an image with white background and copy in + //A more natural background than black is white. + //Therefore create an empty image with white background and merge the + //image in with alpha blending. + $imgtmp = @imagecreatefrompng($file); + if (!$imgtmp) { + return; + } + $sx = imagesx($imgtmp); + $sy = imagesy($imgtmp); + $img = imagecreatetruecolor($sx, $sy); + imagealphablending($img, true); + + // @todo is it still needed ?? + $ti = imagecolortransparent($imgtmp); + if ($ti >= 0) { + $tc = imagecolorsforindex($imgtmp, $ti); + $ti = imagecolorallocate($img, $tc['red'], $tc['green'], $tc['blue']); + imagefill($img, 0, 0, $ti); + imagecolortransparent($img, $ti); + } else { + imagefill($img, 1, 1, imagecolorallocate($img, 255, 255, 255)); + } + + imagecopy($img, $imgtmp, 0, 0, 0, 0, $sx, $sy); + imagedestroy($imgtmp); + } + $this->addImagePng($img, $file, $x, $y, $w, $h); + + if ($img) { + imagedestroy($img); + } + } + + /** + * add a PNG image into the document, from a memory buffer of the file + * + * @param $data + * @param $file + * @param $x + * @param $y + * @param float $w + * @param float $h + * @param bool $is_mask + * @param null $mask + */ + function addPngFromBuf(&$data, $file, $x, $y, $w = 0.0, $h = 0.0, $is_mask = false, $mask = null) + { + if (isset($this->imagelist[$file])) { + $data = null; + $info['width'] = $this->imagelist[$file]['w']; + $info['height'] = $this->imagelist[$file]['h']; + $label = $this->imagelist[$file]['label']; + } else { + if ($data == null) { + $this->addMessage('addPngFromBuf error - data not present!'); + + return; + } + + $error = 0; + + if (!$error) { + $header = chr(137) . chr(80) . chr(78) . chr(71) . chr(13) . chr(10) . chr(26) . chr(10); + + if (mb_substr($data, 0, 8, '8bit') != $header) { + $error = 1; + + if (defined("DEBUGPNG") && DEBUGPNG) { + print '[addPngFromFile this file does not have a valid header ' . $file . ']'; + } + + $errormsg = 'this file does not have a valid header'; + } + } + + if (!$error) { + // set pointer + $p = 8; + $len = mb_strlen($data, '8bit'); + + // cycle through the file, identifying chunks + $haveHeader = 0; + $info = []; + $idata = ''; + $pdata = ''; + + while ($p < $len) { + $chunkLen = $this->getBytes($data, $p, 4); + $chunkType = mb_substr($data, $p + 4, 4, '8bit'); + + switch ($chunkType) { + case 'IHDR': + // this is where all the file information comes from + $info['width'] = $this->getBytes($data, $p + 8, 4); + $info['height'] = $this->getBytes($data, $p + 12, 4); + $info['bitDepth'] = ord($data[$p + 16]); + $info['colorType'] = ord($data[$p + 17]); + $info['compressionMethod'] = ord($data[$p + 18]); + $info['filterMethod'] = ord($data[$p + 19]); + $info['interlaceMethod'] = ord($data[$p + 20]); + + //print_r($info); + $haveHeader = 1; + if ($info['compressionMethod'] != 0) { + $error = 1; + + //debugpng + if (defined("DEBUGPNG") && DEBUGPNG) { + print '[addPngFromFile unsupported compression method ' . $file . ']'; + } + + $errormsg = 'unsupported compression method'; + } + + if ($info['filterMethod'] != 0) { + $error = 1; + + //debugpng + if (defined("DEBUGPNG") && DEBUGPNG) { + print '[addPngFromFile unsupported filter method ' . $file . ']'; + } + + $errormsg = 'unsupported filter method'; + } + break; + + case 'PLTE': + $pdata .= mb_substr($data, $p + 8, $chunkLen, '8bit'); + break; + + case 'IDAT': + $idata .= mb_substr($data, $p + 8, $chunkLen, '8bit'); + break; + + case 'tRNS': + //this chunk can only occur once and it must occur after the PLTE chunk and before IDAT chunk + //print "tRNS found, color type = ".$info['colorType']."\n"; + $transparency = []; + + switch ($info['colorType']) { + // indexed color, rbg + case 3: + /* corresponding to entries in the plte chunk + Alpha for palette index 0: 1 byte + Alpha for palette index 1: 1 byte + ...etc... + */ + // there will be one entry for each palette entry. up until the last non-opaque entry. + // set up an array, stretching over all palette entries which will be o (opaque) or 1 (transparent) + $transparency['type'] = 'indexed'; + $trans = 0; + + for ($i = $chunkLen; $i >= 0; $i--) { + if (ord($data[$p + 8 + $i]) == 0) { + $trans = $i; + } + } + + $transparency['data'] = $trans; + break; + + // grayscale + case 0: + /* corresponding to entries in the plte chunk + Gray: 2 bytes, range 0 .. (2^bitdepth)-1 + */ + // $transparency['grayscale'] = $this->PRVT_getBytes($data,$p+8,2); // g = grayscale + $transparency['type'] = 'indexed'; + $transparency['data'] = ord($data[$p + 8 + 1]); + break; + + // truecolor + case 2: + /* corresponding to entries in the plte chunk + Red: 2 bytes, range 0 .. (2^bitdepth)-1 + Green: 2 bytes, range 0 .. (2^bitdepth)-1 + Blue: 2 bytes, range 0 .. (2^bitdepth)-1 + */ + $transparency['r'] = $this->getBytes($data, $p + 8, 2); + // r from truecolor + $transparency['g'] = $this->getBytes($data, $p + 10, 2); + // g from truecolor + $transparency['b'] = $this->getBytes($data, $p + 12, 2); + // b from truecolor + + $transparency['type'] = 'color-key'; + break; + + //unsupported transparency type + default: + if (defined("DEBUGPNG") && DEBUGPNG) { + print '[addPngFromFile unsupported transparency type ' . $file . ']'; + } + break; + } + + // KS End new code + break; + + default: + break; + } + + $p += $chunkLen + 12; + } + + if (!$haveHeader) { + $error = 1; + + //debugpng + if (defined("DEBUGPNG") && DEBUGPNG) { + print '[addPngFromFile information header is missing ' . $file . ']'; + } + + $errormsg = 'information header is missing'; + } + + if (isset($info['interlaceMethod']) && $info['interlaceMethod']) { + $error = 1; + + //debugpng + if (defined("DEBUGPNG") && DEBUGPNG) { + print '[addPngFromFile no support for interlaced images in pdf ' . $file . ']'; + } + + $errormsg = 'There appears to be no support for interlaced images in pdf.'; + } + } + + if (!$error && $info['bitDepth'] > 8) { + $error = 1; + + //debugpng + if (defined("DEBUGPNG") && DEBUGPNG) { + print '[addPngFromFile bit depth of 8 or less is supported ' . $file . ']'; + } + + $errormsg = 'only bit depth of 8 or less is supported'; + } + + if (!$error) { + switch ($info['colorType']) { + case 3: + $color = 'DeviceRGB'; + $ncolor = 1; + break; + + case 2: + $color = 'DeviceRGB'; + $ncolor = 3; + break; + + case 0: + $color = 'DeviceGray'; + $ncolor = 1; + break; + + default: + $error = 1; + + //debugpng + if (defined("DEBUGPNG") && DEBUGPNG) { + print '[addPngFromFile alpha channel not supported: ' . $info['colorType'] . ' ' . $file . ']'; + } + + $errormsg = 'transparency alpha channel not supported, transparency only supported for palette images.'; + } + } + + if ($error) { + $this->addMessage('PNG error - (' . $file . ') ' . $errormsg); + + return; + } + + //print_r($info); + // so this image is ok... add it in. + $this->numImages++; + $im = $this->numImages; + $label = "I$im"; + $this->numObj++; + + // $this->o_image($this->numObj,'new',array('label' => $label,'data' => $idata,'iw' => $w,'ih' => $h,'type' => 'png','ic' => $info['width'])); + $options = [ + 'label' => $label, + 'data' => $idata, + 'bitsPerComponent' => $info['bitDepth'], + 'pdata' => $pdata, + 'iw' => $info['width'], + 'ih' => $info['height'], + 'type' => 'png', + 'color' => $color, + 'ncolor' => $ncolor, + 'masked' => $mask, + 'isMask' => $is_mask + ]; + + if (isset($transparency)) { + $options['transparency'] = $transparency; + } + + $this->o_image($this->numObj, 'new', $options); + $this->imagelist[$file] = ['label' => $label, 'w' => $info['width'], 'h' => $info['height']]; + } + + if ($is_mask) { + return; + } + + if ($w <= 0 && $h <= 0) { + $w = $info['width']; + $h = $info['height']; + } + + if ($w <= 0) { + $w = $h / $info['height'] * $info['width']; + } + + if ($h <= 0) { + $h = $w * $info['height'] / $info['width']; + } + + $this->addContent(sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\nQ", $w, $h, $x, $y, $label)); + } + + /** + * add a JPEG image into the document, from a file + * + * @param $img + * @param $x + * @param $y + * @param int $w + * @param int $h + */ + function addJpegFromFile($img, $x, $y, $w = 0, $h = 0) + { + // attempt to add a jpeg image straight from a file, using no GD commands + // note that this function is unable to operate on a remote file. + + if (!file_exists($img)) { + return; + } + + if ($this->image_iscached($img)) { + $data = null; + $imageWidth = $this->imagelist[$img]['w']; + $imageHeight = $this->imagelist[$img]['h']; + $channels = $this->imagelist[$img]['c']; + } else { + $tmp = getimagesize($img); + $imageWidth = $tmp[0]; + $imageHeight = $tmp[1]; + + if (isset($tmp['channels'])) { + $channels = $tmp['channels']; + } else { + $channels = 3; + } + + $data = file_get_contents($img); + } + + if ($w <= 0 && $h <= 0) { + $w = $imageWidth; + } + + if ($w == 0) { + $w = $h / $imageHeight * $imageWidth; + } + + if ($h == 0) { + $h = $w * $imageHeight / $imageWidth; + } + + $this->addJpegImage_common($data, $img, $imageWidth, $imageHeight, $x, $y, $w, $h, $channels); + } + + /** + * common code used by the two JPEG adding functions + * @param $data + * @param $imgname + * @param $imageWidth + * @param $imageHeight + * @param $x + * @param $y + * @param int $w + * @param int $h + * @param int $channels + */ + private function addJpegImage_common( + &$data, + $imgname, + $imageWidth, + $imageHeight, + $x, + $y, + $w = 0, + $h = 0, + $channels = 3 + ) { + if ($this->image_iscached($imgname)) { + $label = $this->imagelist[$imgname]['label']; + //debugpng + //if (DEBUGPNG) print '[addJpegImage_common Duplicate '.$imgname.']'; + + } else { + if ($data == null) { + $this->addMessage('addJpegImage_common error - (' . $imgname . ') data not present!'); + + return; + } + + // note that this function is not to be called externally + // it is just the common code between the GD and the file options + $this->numImages++; + $im = $this->numImages; + $label = "I$im"; + $this->numObj++; + + $this->o_image( + $this->numObj, + 'new', + [ + 'label' => $label, + 'data' => &$data, + 'iw' => $imageWidth, + 'ih' => $imageHeight, + 'channels' => $channels + ] + ); + + $this->imagelist[$imgname] = [ + 'label' => $label, + 'w' => $imageWidth, + 'h' => $imageHeight, + 'c' => $channels + ]; + } + + $this->addContent(sprintf("\nq\n%.3F 0 0 %.3F %.3F %.3F cm /%s Do\nQ ", $w, $h, $x, $y, $label)); + } + + /** + * specify where the document should open when it first starts + * + * @param $style + * @param int $a + * @param int $b + * @param int $c + */ + function openHere($style, $a = 0, $b = 0, $c = 0) + { + // this function will open the document at a specified page, in a specified style + // the values for style, and the required parameters are: + // 'XYZ' left, top, zoom + // 'Fit' + // 'FitH' top + // 'FitV' left + // 'FitR' left,bottom,right + // 'FitB' + // 'FitBH' top + // 'FitBV' left + $this->numObj++; + $this->o_destination( + $this->numObj, + 'new', + ['page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c] + ); + $id = $this->catalogId; + $this->o_catalog($id, 'openHere', $this->numObj); + } + + /** + * Add JavaScript code to the PDF document + * + * @param string $code + */ + function addJavascript($code) + { + $this->javascript .= $code; + } + + /** + * create a labelled destination within the document + * + * @param $label + * @param $style + * @param int $a + * @param int $b + * @param int $c + */ + function addDestination($label, $style, $a = 0, $b = 0, $c = 0) + { + // associates the given label with the destination, it is done this way so that a destination can be specified after + // it has been linked to + // styles are the same as the 'openHere' function + $this->numObj++; + $this->o_destination( + $this->numObj, + 'new', + ['page' => $this->currentPage, 'type' => $style, 'p1' => $a, 'p2' => $b, 'p3' => $c] + ); + $id = $this->numObj; + + // store the label->idf relationship, note that this means that labels can be used only once + $this->destinations["$label"] = $id; + } + + /** + * define font families, this is used to initialize the font families for the default fonts + * and for the user to add new ones for their fonts. The default bahavious can be overridden should + * that be desired. + * + * @param $family + * @param string $options + */ + function setFontFamily($family, $options = '') + { + if (!is_array($options)) { + if ($family === 'init') { + // set the known family groups + // these font families will be used to enable bold and italic markers to be included + // within text streams. html forms will be used... + $this->fontFamilies['Helvetica.afm'] = + [ + 'b' => 'Helvetica-Bold.afm', + 'i' => 'Helvetica-Oblique.afm', + 'bi' => 'Helvetica-BoldOblique.afm', + 'ib' => 'Helvetica-BoldOblique.afm' + ]; + + $this->fontFamilies['Courier.afm'] = + [ + 'b' => 'Courier-Bold.afm', + 'i' => 'Courier-Oblique.afm', + 'bi' => 'Courier-BoldOblique.afm', + 'ib' => 'Courier-BoldOblique.afm' + ]; + + $this->fontFamilies['Times-Roman.afm'] = + [ + 'b' => 'Times-Bold.afm', + 'i' => 'Times-Italic.afm', + 'bi' => 'Times-BoldItalic.afm', + 'ib' => 'Times-BoldItalic.afm' + ]; + } + } else { + + // the user is trying to set a font family + // note that this can also be used to set the base ones to something else + if (mb_strlen($family)) { + $this->fontFamilies[$family] = $options; + } + } + } + + /** + * used to add messages for use in debugging + * + * @param $message + */ + function addMessage($message) + { + $this->messages .= $message . "\n"; + } + + /** + * a few functions which should allow the document to be treated transactionally. + * + * @param $action + */ + function transaction($action) + { + switch ($action) { + case 'start': + // store all the data away into the checkpoint variable + $data = get_object_vars($this); + $this->checkpoint = $data; + unset($data); + break; + + case 'commit': + if (is_array($this->checkpoint) && isset($this->checkpoint['checkpoint'])) { + $tmp = $this->checkpoint['checkpoint']; + $this->checkpoint = $tmp; + unset($tmp); + } else { + $this->checkpoint = ''; + } + break; + + case 'rewind': + // do not destroy the current checkpoint, but move us back to the state then, so that we can try again + if (is_array($this->checkpoint)) { + // can only abort if were inside a checkpoint + $tmp = $this->checkpoint; + + foreach ($tmp as $k => $v) { + if ($k !== 'checkpoint') { + $this->$k = $v; + } + } + unset($tmp); + } + break; + + case 'abort': + if (is_array($this->checkpoint)) { + // can only abort if were inside a checkpoint + $tmp = $this->checkpoint; + foreach ($tmp as $k => $v) { + $this->$k = $v; + } + unset($tmp); + } + break; + } + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Surface/SurfaceCpdf.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Surface/SurfaceCpdf.php new file mode 100644 index 0000000..7169e0e --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Surface/SurfaceCpdf.php @@ -0,0 +1,494 @@ +getDimensions(); + $w = $dimensions["width"]; + $h = $dimensions["height"]; + + if (!$canvas) { + $canvas = new \Svg\Surface\CPdf(array(0, 0, $w, $h)); + $refl = new \ReflectionClass($canvas); + $canvas->fontcache = realpath(dirname($refl->getFileName()) . "/../../fonts/")."/"; + } + + // Flip PDF coordinate system so that the origin is in + // the top left rather than the bottom left + $canvas->transform(array( + 1, 0, + 0, -1, + 0, $h + )); + + $this->width = $w; + $this->height = $h; + + $this->canvas = $canvas; + } + + function out() + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + return $this->canvas->output(); + } + + public function save() + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->save(); + } + + public function restore() + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->restore(); + } + + public function scale($x, $y) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + + $this->transform($x, 0, 0, $y, 0, 0); + } + + public function rotate($angle) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + + $a = deg2rad($angle); + $cos_a = cos($a); + $sin_a = sin($a); + + $this->transform( + $cos_a, $sin_a, + -$sin_a, $cos_a, + 0, 0 + ); + } + + public function translate($x, $y) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + + $this->transform( + 1, 0, + 0, 1, + $x, $y + ); + } + + public function transform($a, $b, $c, $d, $e, $f) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + + $this->canvas->transform(array($a, $b, $c, $d, $e, $f)); + } + + public function beginPath() + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + // TODO: Implement beginPath() method. + } + + public function closePath() + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->closePath(); + } + + public function fillStroke(bool $close = false) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->fillStroke($close); + } + + public function clip() + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->clip(); + } + + public function fillText($text, $x, $y, $maxWidth = null) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->addText($x, $y, $this->style->fontSize, $text); + } + + public function strokeText($text, $x, $y, $maxWidth = null) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->addText($x, $y, $this->style->fontSize, $text); + } + + public function drawImage($image, $sx, $sy, $sw = null, $sh = null, $dx = null, $dy = null, $dw = null, $dh = null) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + + if (strpos($image, "data:") === 0) { + $parts = explode(',', $image, 2); + + $data = $parts[1]; + $base64 = false; + + $token = strtok($parts[0], ';'); + while ($token !== false) { + if ($token == 'base64') { + $base64 = true; + } + + $token = strtok(';'); + } + + if ($base64) { + $data = base64_decode($data); + } + } + else { + $data = file_get_contents($image); + } + + $image = tempnam(sys_get_temp_dir(), "svg"); + file_put_contents($image, $data); + + $img = $this->image($image, $sx, $sy, $sw, $sh, "normal"); + + + unlink($image); + } + + public static function getimagesize($filename) + { + static $cache = array(); + + if (isset($cache[$filename])) { + return $cache[$filename]; + } + + list($width, $height, $type) = getimagesize($filename); + + if ($width == null || $height == null) { + $data = file_get_contents($filename, null, null, 0, 26); + + if (substr($data, 0, 2) === "BM") { + $meta = unpack('vtype/Vfilesize/Vreserved/Voffset/Vheadersize/Vwidth/Vheight', $data); + $width = (int)$meta['width']; + $height = (int)$meta['height']; + $type = IMAGETYPE_BMP; + } + } + + return $cache[$filename] = array($width, $height, $type); + } + + function image($img, $x, $y, $w, $h, $resolution = "normal") + { + list($width, $height, $type) = $this->getimagesize($img); + + switch ($type) { + case IMAGETYPE_JPEG: + $this->canvas->addJpegFromFile($img, $x, $y - $h, $w, $h); + break; + + case IMAGETYPE_GIF: + case IMAGETYPE_BMP: + // @todo use cache for BMP and GIF + $img = $this->_convert_gif_bmp_to_png($img, $type); + + case IMAGETYPE_PNG: + $this->canvas->addPngFromFile($img, $x, $y - $h, $w, $h); + break; + + default: + } + } + + public function lineTo($x, $y) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->lineTo($x, $y); + } + + public function moveTo($x, $y) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->moveTo($x, $y); + } + + public function quadraticCurveTo($cpx, $cpy, $x, $y) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + + // FIXME not accurate + $this->canvas->quadTo($cpx, $cpy, $x, $y); + } + + public function bezierCurveTo($cp1x, $cp1y, $cp2x, $cp2y, $x, $y) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->curveTo($cp1x, $cp1y, $cp2x, $cp2y, $x, $y); + } + + public function arcTo($x1, $y1, $x2, $y2, $radius) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + } + + public function arc($x, $y, $radius, $startAngle, $endAngle, $anticlockwise = false) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->ellipse($x, $y, $radius, $radius, 0, 8, $startAngle, $endAngle, false, false, false, true); + } + + public function circle($x, $y, $radius) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->ellipse($x, $y, $radius, $radius, 0, 8, 0, 360, true, false, false, false); + } + + public function ellipse($x, $y, $radiusX, $radiusY, $rotation, $startAngle, $endAngle, $anticlockwise) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->ellipse($x, $y, $radiusX, $radiusY, 0, 8, 0, 360, false, false, false, false); + } + + public function fillRect($x, $y, $w, $h) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->rect($x, $y, $w, $h); + $this->fill(); + } + + public function rect($x, $y, $w, $h, $rx = 0, $ry = 0) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + + $canvas = $this->canvas; + + if ($rx <= 0.000001/* && $ry <= 0.000001*/) { + $canvas->rect($x, $y, $w, $h); + + return; + } + + $rx = min($rx, $w / 2); + $rx = min($rx, $h / 2); + + /* Define a path for a rectangle with corners rounded by a given radius. + * Start from the lower left corner and proceed counterclockwise. + */ + $this->moveTo($x + $rx, $y); + + /* Start of the arc segment in the lower right corner */ + $this->lineTo($x + $w - $rx, $y); + + /* Arc segment in the lower right corner */ + $this->arc($x + $w - $rx, $y + $rx, $rx, 270, 360); + + /* Start of the arc segment in the upper right corner */ + $this->lineTo($x + $w, $y + $h - $rx ); + + /* Arc segment in the upper right corner */ + $this->arc($x + $w - $rx, $y + $h - $rx, $rx, 0, 90); + + /* Start of the arc segment in the upper left corner */ + $this->lineTo($x + $rx, $y + $h); + + /* Arc segment in the upper left corner */ + $this->arc($x + $rx, $y + $h - $rx, $rx, 90, 180); + + /* Start of the arc segment in the lower left corner */ + $this->lineTo($x , $y + $rx); + + /* Arc segment in the lower left corner */ + $this->arc($x + $rx, $y + $rx, $rx, 180, 270); + } + + public function fill() + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->fill(); + } + + public function strokeRect($x, $y, $w, $h) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->rect($x, $y, $w, $h); + $this->stroke(); + } + + public function stroke(bool $close = false) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->stroke($close); + } + + public function endPath() + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->endPath(); + } + + public function measureText($text) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $style = $this->getStyle(); + $this->setFont($style->fontFamily, $style->fontStyle, $style->fontWeight); + + return $this->canvas->getTextWidth($this->getStyle()->fontSize, $text); + } + + public function getStyle() + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + return $this->style; + } + + public function setStyle(Style $style) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + + $this->style = $style; + $canvas = $this->canvas; + + if (is_array($style->stroke) && $stroke = $style->stroke) { + $canvas->setStrokeColor(array((float)$stroke[0]/255, (float)$stroke[1]/255, (float)$stroke[2]/255), true); + } + + if (is_array($style->fill) && $fill = $style->fill) { + $canvas->setColor(array((float)$fill[0]/255, (float)$fill[1]/255, (float)$fill[2]/255), true); + } + + if ($fillRule = strtolower($style->fillRule)) { + $canvas->setFillRule($fillRule); + } + + $opacity = $style->opacity; + if ($opacity !== null && $opacity < 1.0) { + $canvas->setLineTransparency("Normal", $opacity); + $canvas->currentLineTransparency = null; + + $canvas->setFillTransparency("Normal", $opacity); + $canvas->currentFillTransparency = null; + } + else { + $fillOpacity = $style->fillOpacity; + if ($fillOpacity !== null && $fillOpacity < 1.0) { + $canvas->setFillTransparency("Normal", $fillOpacity); + $canvas->currentFillTransparency = null; + } + + $strokeOpacity = $style->strokeOpacity; + if ($strokeOpacity !== null && $strokeOpacity < 1.0) { + $canvas->setLineTransparency("Normal", $strokeOpacity); + $canvas->currentLineTransparency = null; + } + } + + $dashArray = null; + if ($style->strokeDasharray) { + $dashArray = preg_split('/\s*,\s*/', $style->strokeDasharray); + } + + + $phase=0; + if ($style->strokeDashoffset) { + $phase = $style->strokeDashoffset; + } + + + $canvas->setLineStyle( + $style->strokeWidth, + $style->strokeLinecap, + $style->strokeLinejoin, + $dashArray, + $phase + ); + + $this->setFont($style->fontFamily, $style->fontStyle, $style->fontWeight); + } + + public function setFont($family, $style, $weight) + { + $map = [ + "serif" => "times", + "sans-serif" => "helvetica", + "fantasy" => "symbol", + "cursive" => "times", + "monospace" => "courier" + ]; + + $styleMap = [ + "courier" => [ + "" => "Courier", + "b" => "Courier-Bold", + "i" => "Courier-Oblique", + "bi" => "Courier-BoldOblique", + ], + "helvetica" => [ + "" => "Helvetica", + "b" => "Helvetica-Bold", + "i" => "Helvetica-Oblique", + "bi" => "Helvetica-BoldOblique", + ], + "symbol" => [ + "" => "Symbol" + ], + "times" => [ + "" => "Times-Roman", + "b" => "Times-Bold", + "i" => "Times-Italic", + "bi" => "Times-BoldItalic", + ], + ]; + + $family_lc = strtolower($family); + if (isset($map[$family_lc])) { + $family = $map[$family_lc]; + } + + if (isset($styleMap[$family])) { + $key = ""; + + $weight = strtolower($weight); + if ($weight === "bold" || $weight === "bolder" || (is_numeric($weight) && $weight >= 600)) { + $key .= "b"; + } + + $style = strtolower($style); + if ($style === "italic" || $style === "oblique") { + $key .= "i"; + } + + if (isset($styleMap[$family][$key])) { + $family = $styleMap[$family][$key]; + } + } + + $this->canvas->selectFont("$family.afm"); + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Surface/SurfaceInterface.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Surface/SurfaceInterface.php new file mode 100644 index 0000000..ed2807e --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Surface/SurfaceInterface.php @@ -0,0 +1,89 @@ +getDimensions(); + $w = $dimensions["width"]; + $h = $dimensions["height"]; + + if (!$canvas) { + $canvas = new \PDFlib(); + + /* all strings are expected as utf8 */ + $canvas->set_option("stringformat=utf8"); + $canvas->set_option("errorpolicy=return"); + + /* open new PDF file; insert a file name to create the PDF on disk */ + if ($canvas->begin_document("", "") == 0) { + die("Error: " . $canvas->get_errmsg()); + } + $canvas->set_info("Creator", "PDFlib starter sample"); + $canvas->set_info("Title", "starter_graphics"); + + $canvas->begin_page_ext($w, $h, ""); + } + + // Flip PDF coordinate system so that the origin is in + // the top left rather than the bottom left + $canvas->setmatrix( + 1, 0, + 0, -1, + 0, $h + ); + + $this->width = $w; + $this->height = $h; + + $this->canvas = $canvas; + } + + function out() + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + + $this->canvas->end_page_ext(""); + $this->canvas->end_document(""); + + return $this->canvas->get_buffer(); + } + + public function save() + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->save(); + } + + public function restore() + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->restore(); + } + + public function scale($x, $y) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->scale($x, $y); + } + + public function rotate($angle) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->rotate($angle); + } + + public function translate($x, $y) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->translate($x, $y); + } + + public function transform($a, $b, $c, $d, $e, $f) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->concat($a, $b, $c, $d, $e, $f); + } + + public function beginPath() + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + // TODO: Implement beginPath() method. + } + + public function closePath() + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->closepath(); + } + + public function fillStroke(bool $close = false) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + if ($close) { + $this->canvas->closepath_fill_stroke(); + } else { + $this->canvas->fill_stroke(); + } + } + + public function clip() + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->clip(); + } + + public function fillText($text, $x, $y, $maxWidth = null) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->set_text_pos($x, $y); + $this->canvas->show($text); + } + + public function strokeText($text, $x, $y, $maxWidth = null) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + // TODO: Implement drawImage() method. + } + + public function drawImage($image, $sx, $sy, $sw = null, $sh = null, $dx = null, $dy = null, $dw = null, $dh = null) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + + if (strpos($image, "data:") === 0) { + $data = substr($image, strpos($image, ";") + 1); + if (strpos($data, "base64") === 0) { + $data = base64_decode(substr($data, 7)); + } + } + else { + $data = file_get_contents($image); + } + + $image = tempnam(sys_get_temp_dir(), "svg"); + file_put_contents($image, $data); + + $img = $this->canvas->load_image("auto", $image, ""); + + $sy = $sy - $sh; + $this->canvas->fit_image($img, $sx, $sy, 'boxsize={' . "$sw $sh" . '} fitmethod=entire'); + + unlink($image); + } + + public function lineTo($x, $y) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->lineto($x, $y); + } + + public function moveTo($x, $y) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->moveto($x, $y); + } + + public function quadraticCurveTo($cpx, $cpy, $x, $y) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + + // FIXME not accurate + $this->canvas->curveTo($cpx, $cpy, $cpx, $cpy, $x, $y); + } + + public function bezierCurveTo($cp1x, $cp1y, $cp2x, $cp2y, $x, $y) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->curveto($cp1x, $cp1y, $cp2x, $cp2y, $x, $y); + } + + public function arcTo($x1, $y1, $x2, $y2, $radius) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + } + + public function arc($x, $y, $radius, $startAngle, $endAngle, $anticlockwise = false) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->arc($x, $y, $radius, $startAngle, $endAngle); + } + + public function circle($x, $y, $radius) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->circle($x, $y, $radius); + } + + public function ellipse($x, $y, $radiusX, $radiusY, $rotation, $startAngle, $endAngle, $anticlockwise) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->ellipse($x, $y, $radiusX, $radiusY); + } + + public function fillRect($x, $y, $w, $h) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->rect($x, $y, $w, $h); + $this->fill(); + } + + public function rect($x, $y, $w, $h, $rx = 0, $ry = 0) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + + $canvas = $this->canvas; + + if ($rx <= 0.000001/* && $ry <= 0.000001*/) { + $canvas->rect($x, $y, $w, $h); + + return; + } + + /* Define a path for a rectangle with corners rounded by a given radius. + * Start from the lower left corner and proceed counterclockwise. + */ + $canvas->moveto($x + $rx, $y); + + /* Start of the arc segment in the lower right corner */ + $canvas->lineto($x + $w - $rx, $y); + + /* Arc segment in the lower right corner */ + $canvas->arc($x + $w - $rx, $y + $rx, $rx, 270, 360); + + /* Start of the arc segment in the upper right corner */ + $canvas->lineto($x + $w, $y + $h - $rx ); + + /* Arc segment in the upper right corner */ + $canvas->arc($x + $w - $rx, $y + $h - $rx, $rx, 0, 90); + + /* Start of the arc segment in the upper left corner */ + $canvas->lineto($x + $rx, $y + $h); + + /* Arc segment in the upper left corner */ + $canvas->arc($x + $rx, $y + $h - $rx, $rx, 90, 180); + + /* Start of the arc segment in the lower left corner */ + $canvas->lineto($x , $y + $rx); + + /* Arc segment in the lower left corner */ + $canvas->arc($x + $rx, $y + $rx, $rx, 180, 270); + } + + public function fill() + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->fill(); + } + + public function strokeRect($x, $y, $w, $h) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->rect($x, $y, $w, $h); + $this->stroke(); + } + + public function stroke(bool $close = false) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + if ($close) { + $this->canvas->closepath_stroke(); + } else { + $this->canvas->stroke(); + } + } + + public function endPath() + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $this->canvas->endPath(); + } + + public function measureText($text) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + $style = $this->getStyle(); + $font = $this->getFont($style->fontFamily, $style->fontStyle); + + return $this->canvas->stringwidth($text, $font, $this->getStyle()->fontSize); + } + + public function getStyle() + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + return $this->style; + } + + public function setStyle(Style $style) + { + if (self::DEBUG) echo __FUNCTION__ . "\n"; + + $this->style = $style; + $canvas = $this->canvas; + + if (is_array($style->stroke) && $stroke = $style->stroke) { + $canvas->setcolor( + "stroke", + "rgb", + $stroke[0] / 255, + $stroke[1] / 255, + $stroke[2] / 255, + null + ); + } + + if (is_array($style->fill) && $fill = $style->fill) { + $canvas->setcolor( + "fill", + "rgb", + $fill[0] / 255, + $fill[1] / 255, + $fill[2] / 255, + null + ); + } + + if ($fillRule = strtolower($style->fillRule)) { + $map = array( + "nonzero" => "winding", + "evenodd" => "evenodd", + ); + + if (isset($map[$fillRule])) { + $fillRule = $map[$fillRule]; + + $canvas->set_parameter("fillrule", $fillRule); + } + } + + $opts = array(); + if ($style->strokeWidth > 0.000001) { + $opts[] = "linewidth=$style->strokeWidth"; + } + + if (in_array($style->strokeLinecap, array("butt", "round", "projecting"))) { + $opts[] = "linecap=$style->strokeLinecap"; + } + + if (in_array($style->strokeLinejoin, array("miter", "round", "bevel"))) { + $opts[] = "linejoin=$style->strokeLinejoin"; + } + + $canvas->set_graphics_option(implode(" ", $opts)); + + $opts = array(); + $opacity = $style->opacity; + if ($opacity !== null && $opacity < 1.0) { + $opts[] = "opacityfill=$opacity"; + $opts[] = "opacitystroke=$opacity"; + } + else { + $fillOpacity = $style->fillOpacity; + if ($fillOpacity !== null && $fillOpacity < 1.0) { + $opts[] = "opacityfill=$fillOpacity"; + } + + $strokeOpacity = $style->strokeOpacity; + if ($strokeOpacity !== null && $strokeOpacity < 1.0) { + $opts[] = "opacitystroke=$strokeOpacity"; + } + } + + if (count($opts)) { + $gs = $canvas->create_gstate(implode(" ", $opts)); + $canvas->set_gstate($gs); + } + + $font = $this->getFont($style->fontFamily, $style->fontStyle); + if ($font) { + $canvas->setfont($font, $style->fontSize); + } + } + + private function getFont($family, $style) + { + $map = array( + "serif" => "Times", + "sans-serif" => "Helvetica", + "fantasy" => "Symbol", + "cursive" => "Times", + "monospace" => "Courier", + + "arial" => "Helvetica", + "verdana" => "Helvetica", + ); + + $family = strtolower($family); + if (isset($map[$family])) { + $family = $map[$family]; + } + + return $this->canvas->load_font($family, "unicode", "fontstyle=$style"); + } + + public function setFont($family, $style, $weight) + { + // TODO: Implement setFont() method. + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/AbstractTag.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/AbstractTag.php new file mode 100644 index 0000000..872d971 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/AbstractTag.php @@ -0,0 +1,326 @@ +document = $document; + $this->tagName = $tagName; + } + + public function getDocument(){ + return $this->document; + } + + /** + * @return Group|null + */ + public function getParentGroup() { + $stack = $this->getDocument()->getStack(); + for ($i = count($stack)-2; $i >= 0; $i--) { + $tag = $stack[$i]; + + if ($tag instanceof Group || $tag instanceof Document) { + return $tag; + } + } + + return null; + } + + public function handle($attributes) + { + $this->attributes = $attributes; + + if (!$this->getDocument()->inDefs || $this instanceof StyleTag) { + $this->before($attributes); + $this->start($attributes); + } + } + + public function handleEnd() + { + if (!$this->getDocument()->inDefs || $this instanceof StyleTag) { + $this->end(); + $this->after(); + } + } + + protected function before($attributes) + { + } + + protected function start($attributes) + { + } + + protected function end() + { + } + + protected function after() + { + } + + public function getAttributes() + { + return $this->attributes; + } + + protected function setStyle(Style $style) + { + $this->style = $style; + + if ($style->display === "none") { + $this->hasShape = false; + } + } + + /** + * @return Style + */ + public function getStyle() + { + return $this->style; + } + + /** + * Make a style object from the tag and its attributes + * + * @param array $attributes + * + * @return Style + */ + protected function makeStyle($attributes) { + $style = new Style($this->document); + $style->inherit($this); + $style->fromStyleSheets($this, $attributes); + $style->fromAttributes($attributes); + + return $style; + } + + protected function applyTransform($attributes) + { + + if (isset($attributes["transform"])) { + $surface = $this->document->getSurface(); + + $transform = $attributes["transform"]; + + $matches = array(); + preg_match_all( + '/(matrix|translate|scale|rotate|skew|skewX|skewY)\((.*?)\)/is', + $transform, + $matches, + PREG_SET_ORDER + ); + + $transformations = array(); + foreach ($matches as $match) { + $arguments = preg_split('/[ ,]+/', $match[2]); + array_unshift($arguments, $match[1]); + $transformations[] = $arguments; + } + + foreach ($transformations as $t) { + switch ($t[0]) { + case "matrix": + $surface->transform($t[1], $t[2], $t[3], $t[4], $t[5], $t[6]); + break; + + case "translate": + $surface->translate($t[1], isset($t[2]) ? $t[2] : 0); + break; + + case "scale": + $surface->scale($t[1], isset($t[2]) ? $t[2] : $t[1]); + break; + + case "rotate": + if (isset($t[2])) { + $t[3] = isset($t[3]) ? $t[3] : 0; + $surface->translate($t[2], $t[3]); + $surface->rotate($t[1]); + $surface->translate(-$t[2], -$t[3]); + } else { + $surface->rotate($t[1]); + } + break; + + case "skewX": + $tan_x = tan(deg2rad($t[1])); + $surface->transform(1, 0, $tan_x, 1, 0, 0); + break; + + case "skewY": + $tan_y = tan(deg2rad($t[1])); + $surface->transform(1, $tan_y, 0, 1, 0, 0); + break; + } + } + } + } + + /** + * Apply a viewBox transform to the element + * + * @param array $attributes + */ + protected function applyViewbox($attributes) { + if (!isset($attributes["viewbox"])) { + return; + } + + $surface = $this->document->getSurface(); + $viewBox = preg_split('/[\s,]+/is', trim($attributes['viewbox'])); + if (count($viewBox) != 4) { + return; + } + + // Computing the equivalent transform of an SVG viewport + // https://svgwg.org/svg2-draft/coords.html#ComputingAViewportsTransform + + // 1. Let vb-x, vb-y, vb-width, vb-height be the min-x, min-y, width and height values of the viewBox attribute respectively. + [$vbX, $vbY, $vbWidth, $vbHeight] = $viewBox; + + if ($vbWidth < 0 || $vbHeight < 0) { + return; + } + + // correct solution is to not render, for now scaling to 0 below + //if ($vbWidth == 0 || $vbHeight == 0) { + //} + + // 2. Let e-x, e-y, e-width, e-height be the position and size of the element respectively. + $eX = $attributes["x"] ?? 0; + $eY = $attributes["y"] ?? 0; + $eWidth = $attributes["width"] ?? $this->document->getWidth(); + $eHeight = $attributes["height"] ?? $this->document->getHeight(); + + // 3. Let align be the align value of preserveAspectRatio, or 'xMidYMid' if preserveAspectRatio is not defined. + $preserveAspectRatio = explode(" ", $attributes["preserveAspectRatio"] ?? "xMidYMid meet"); + $align = $preserveAspectRatio[0]; + + // 4. Let meetOrSlice be the meetOrSlice value of preserveAspectRatio, or 'meet' if preserveAspectRatio is not defined or if meetOrSlice is missing from this value. + $meetOrSlice = $meetOrSlice ?? "meet"; + + // 5. Initialize scale-x to e-width/vb-width. + $scaleX = $vbWidth == 0 ? 0 : ($eWidth / $vbWidth); + + // 6. Initialize scale-y to e-height/vb-height. + $scaleY = $vbHeight == 0 ? 0 : ($eHeight / $vbHeight); + + // 7. If align is not 'none' and meetOrSlice is 'meet', set the larger of scale-x and scale-y to the smaller. + if ($align !== "none" && $meetOrSlice === "meet") { + $scaleX = min($scaleX, $scaleY); + $scaleY = min($scaleX, $scaleY); + } + + // 8. Otherwise, if align is not 'none' and meetOrSlice is 'slice', set the smaller of scale-x and scale-y to the larger. + elseif ($align !== "none" && $meetOrSlice === "slice") { + $scaleX = max($scaleX, $scaleY); + $scaleY = max($scaleX, $scaleY); + } + + // 9. Initialize translate-x to e-x - (vb-x * scale-x). + $translateX = $eX - ($vbX * $scaleX); + + // 10. Initialize translate-y to e-y - (vb-y * scale-y) + $translateY = $eY - ($vbY * $scaleY); + + // 11. If align contains 'xMid', add (e-width - vb-width * scale-x) / 2 to translate-x. + if (strpos($align, "xMid") !== false) { + $translateX += ($eWidth - $vbWidth * $scaleX) / 2; + } + + // 12. If align contains 'xMax', add (e-width - vb-width * scale-x) to translate-x. + if (strpos($align, "xMax") !== false) { + $translateX += ($eWidth - $vbWidth * $scaleX); + } + + // 13. If align contains 'yMid', add (e-height - vb-height * scale-y) / 2 to translate-y. + if (strpos($align, "yMid") !== false) { + $translateX += ($eHeight - $vbHeight * $scaleY) / 2; + } + + // 14. If align contains 'yMax', add (e-height - vb-height * scale-y) to translate-y. + if (strpos($align, "yMid") !== false) { + $translateX += ($eHeight - $vbHeight * $scaleY); + } + + $surface->translate($translateX, $translateY); + $surface->scale($scaleX, $scaleY); + } + + /** + * Convert the given size for the context of this current tag. + * Takes a pixel-based reference, which is usually specific to the context of the size, + * but the actual reference size will be decided based upon the unit used. + * + * @param string $size + * @param float $pxReference + * + * @return float + */ + protected function convertSize(string $size, float $pxReference): float + { + $length = new CssLength($size); + $reference = $pxReference; + $defaultFontSize = 12; + + switch ($length->getUnit()) { + case "em": + $reference = $this->style->fontSize ?? $defaultFontSize; + break; + case "rem": + $reference = $this->document->style->fontSize ?? $defaultFontSize; + break; + case "ex": + case "ch": + $emRef = $this->style->fontSize ?? $defaultFontSize; + $reference = $emRef * 0.5; + break; + case "vw": + $reference = $this->getDocument()->getWidth(); + break; + case "vh": + $reference = $this->getDocument()->getHeight(); + break; + case "vmin": + $reference = min($this->getDocument()->getHeight(), $this->getDocument()->getWidth()); + break; + case "vmax": + $reference = max($this->getDocument()->getHeight(), $this->getDocument()->getWidth()); + break; + } + + return (new CssLength($size))->toPixels($reference); + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Anchor.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Anchor.php new file mode 100644 index 0000000..349bfa8 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Anchor.php @@ -0,0 +1,13 @@ +document->getWidth(); + $this->cx = $this->convertSize($attributes['cx'], $width); + } + if (isset($attributes['cy'])) { + $height = $this->document->getHeight(); + $this->cy = $this->convertSize($attributes['cy'], $height); + } + if (isset($attributes['r'])) { + $diagonal = $this->document->getDiagonal(); + $this->r = $this->convertSize($attributes['r'], $diagonal); + } + + $this->document->getSurface()->circle($this->cx, $this->cy, $this->r); + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/ClipPath.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/ClipPath.php new file mode 100644 index 0000000..991a4db --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/ClipPath.php @@ -0,0 +1,32 @@ +document->getSurface(); + + $surface->save(); + + $style = $this->makeStyle($attributes); + + $this->setStyle($style); + $surface->setStyle($style); + + $this->applyTransform($attributes); + } + + protected function after() + { + $this->document->getSurface()->restore(); + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Ellipse.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Ellipse.php new file mode 100644 index 0000000..f61dfd2 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Ellipse.php @@ -0,0 +1,41 @@ +document->getWidth(); + $height = $this->document->getHeight(); + + if (isset($attributes['cx'])) { + $this->cx = $this->convertSize($attributes['cx'], $width); + } + if (isset($attributes['cy'])) { + $this->cy = $this->convertSize($attributes['cy'], $height); + } + if (isset($attributes['rx'])) { + $this->rx = $this->convertSize($attributes['rx'], $width); + } + if (isset($attributes['ry'])) { + $this->ry = $this->convertSize($attributes['ry'], $height); + } + + $this->document->getSurface()->ellipse($this->cx, $this->cy, $this->rx, $this->ry, 0, 0, 360, false); + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Group.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Group.php new file mode 100644 index 0000000..73d7a45 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Group.php @@ -0,0 +1,32 @@ +document->getSurface(); + + $surface->save(); + + $style = $this->makeStyle($attributes); + + $this->setStyle($style); + $surface->setStyle($style); + + $this->applyTransform($attributes); + } + + protected function after() + { + $this->document->getSurface()->restore(); + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Image.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Image.php new file mode 100644 index 0000000..45d51e5 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Image.php @@ -0,0 +1,75 @@ +document->getSurface(); + $surface->save(); + + $this->applyTransform($attributes); + } + + public function start($attributes) + { + $height = $this->document->getHeight(); + $width = $this->document->getWidth(); + $this->y = $height; + + if (isset($attributes['x'])) { + $this->x = $this->convertSize($attributes['x'], $width); + } + if (isset($attributes['y'])) { + $this->y = $height - $this->convertSize($attributes['y'], $height); + } + + if (isset($attributes['width'])) { + $this->width = $this->convertSize($attributes['width'], $width); + } + if (isset($attributes['height'])) { + $this->height = $this->convertSize($attributes['height'], $height); + } + + if (isset($attributes['xlink:href'])) { + $this->href = $attributes['xlink:href']; + } + + if (isset($attributes['href'])) { + $this->href = $attributes['href']; + } + + $this->document->getSurface()->transform(1, 0, 0, -1, 0, $height); + + $scheme = \strtolower(parse_url($this->href, PHP_URL_SCHEME) ?: ""); + if ( + $scheme === "phar" || \strtolower(\substr($this->href, 0, 7)) === "phar://" + || ($this->document->allowExternalReferences === false && $scheme !== "data") + ) { + return; + } + + $this->document->getSurface()->drawImage($this->href, $this->x, $this->y, $this->width, $this->height); + } + + protected function after() + { + $this->document->getSurface()->restore(); + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Line.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Line.php new file mode 100644 index 0000000..4f6a276 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Line.php @@ -0,0 +1,42 @@ +document->getHeight(); + $width = $this->document->getWidth(); + + if (isset($attributes['x1'])) { + $this->x1 = $this->convertSize($attributes['x1'], $width); + } + if (isset($attributes['y1'])) { + $this->y1 = $this->convertSize($attributes['y1'], $height); + } + if (isset($attributes['x2'])) { + $this->x2 = $this->convertSize($attributes['x2'], $width); + } + if (isset($attributes['y2'])) { + $this->y2 = $this->convertSize($attributes['y2'], $height); + } + + $surface = $this->document->getSurface(); + $surface->moveTo($this->x1, $this->y1); + $surface->lineTo($this->x2, $this->y2); + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/LinearGradient.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/LinearGradient.php new file mode 100644 index 0000000..2a42686 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/LinearGradient.php @@ -0,0 +1,82 @@ +x1 = $attributes['x1']; + } + if (isset($attributes['y1'])) { + $this->y1 = $attributes['y1']; + } + if (isset($attributes['x2'])) { + $this->x2 = $attributes['x2']; + } + if (isset($attributes['y2'])) { + $this->y2 = $attributes['y2']; + } + } + + public function getStops() { + if (empty($this->stops)) { + foreach ($this->children as $_child) { + if ($_child->tagName != "stop") { + continue; + } + + $_stop = new Gradient\Stop(); + $_attributes = $_child->attributes; + + // Style + if (isset($_attributes["style"])) { + $_style = Style::parseCssStyle($_attributes["style"]); + + if (isset($_style["stop-color"])) { + $_stop->color = Style::parseColor($_style["stop-color"]); + } + + if (isset($_style["stop-opacity"])) { + $_stop->opacity = max(0, min(1.0, $_style["stop-opacity"])); + } + } + + // Attributes + if (isset($_attributes["offset"])) { + $_stop->offset = $_attributes["offset"]; + } + if (isset($_attributes["stop-color"])) { + $_stop->color = Style::parseColor($_attributes["stop-color"]); + } + if (isset($_attributes["stop-opacity"])) { + $_stop->opacity = max(0, min(1.0, $_attributes["stop-opacity"])); + } + + $this->stops[] = $_stop; + } + } + + return $this->stops; + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Path.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Path.php new file mode 100644 index 0000000..b792b3a --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Path.php @@ -0,0 +1,580 @@ + 2, + 'l' => 2, + 'h' => 1, + 'v' => 1, + 'c' => 6, + 's' => 4, + 'q' => 4, + 't' => 2, + 'a' => 7, + ); + + static $repeatedCommands = array( + 'm' => 'l', + 'M' => 'L', + ); + + public static function parse(string $commandSequence): array + { + $commands = array(); + preg_match_all('/([MZLHVCSQTAmzlhvcsqta])([eE ,\-.\d]+)*/', $commandSequence, $commands, PREG_SET_ORDER); + + $path = array(); + foreach ($commands as $c) { + if (count($c) == 3) { + $commandLower = strtolower($c[1]); + + // arcs have special flags that apparently don't require spaces. + if ($commandLower === 'a' && preg_match_all(static::ARC_REGEXP, $c[2], $matches, PREG_PATTERN_ORDER)) { + $numberOfMatches = count($matches[0]); + for ($k = 0; $k < $numberOfMatches; ++$k) { + $path[] = [ + $c[1], + $matches[1][$k], + $matches[2][$k], + $matches[3][$k], + $matches[4][$k], + $matches[5][$k], + $matches[6][$k], + $matches[7][$k], + ]; + } + continue; + } + + $arguments = array(); + preg_match_all('/([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:e[-+]?\d+)?)/i', $c[2], $arguments, PREG_PATTERN_ORDER); + $item = $arguments[0]; + + if ( + isset(self::$commandLengths[$commandLower]) && + ($commandLength = self::$commandLengths[$commandLower]) && + count($item) > $commandLength + ) { + $repeatedCommand = isset(self::$repeatedCommands[$c[1]]) ? self::$repeatedCommands[$c[1]] : $c[1]; + $command = $c[1]; + + for ($k = 0, $klen = count($item); $k < $klen; $k += $commandLength) { + $_item = array_slice($item, $k, $k + $commandLength); + array_unshift($_item, $command); + $path[] = $_item; + + $command = $repeatedCommand; + } + } else { + array_unshift($item, $c[1]); + $path[] = $item; + } + + } else { + $item = array($c[1]); + + $path[] = $item; + } + } + + return $path; + } + + public function start($attributes) + { + if (!isset($attributes['d'])) { + $this->hasShape = false; + + return; + } + + $path = static::parse($attributes['d']); + $surface = $this->document->getSurface(); + + // From https://github.com/kangax/fabric.js/blob/master/src/shapes/path.class.js + $current = null; // current instruction + $previous = null; + $subpathStartX = 0; + $subpathStartY = 0; + $x = 0; // current x + $y = 0; // current y + $controlX = 0; // current control point x + $controlY = 0; // current control point y + $tempX = null; + $tempY = null; + $tempControlX = null; + $tempControlY = null; + $l = 0; //-((this.width / 2) + $this.pathOffset.x), + $t = 0; //-((this.height / 2) + $this.pathOffset.y), + + foreach ($path as $current) { + switch ($current[0]) { // first letter + case 'l': // lineto, relative + $x += $current[1]; + $y += $current[2]; + $surface->lineTo($x + $l, $y + $t); + break; + + case 'L': // lineto, absolute + $x = $current[1]; + $y = $current[2]; + $surface->lineTo($x + $l, $y + $t); + break; + + case 'h': // horizontal lineto, relative + $x += $current[1]; + $surface->lineTo($x + $l, $y + $t); + break; + + case 'H': // horizontal lineto, absolute + $x = $current[1]; + $surface->lineTo($x + $l, $y + $t); + break; + + case 'v': // vertical lineto, relative + $y += $current[1]; + $surface->lineTo($x + $l, $y + $t); + break; + + case 'V': // verical lineto, absolute + $y = $current[1]; + $surface->lineTo($x + $l, $y + $t); + break; + + case 'm': // moveTo, relative + $x += $current[1]; + $y += $current[2]; + $subpathStartX = $x; + $subpathStartY = $y; + $surface->moveTo($x + $l, $y + $t); + break; + + case 'M': // moveTo, absolute + $x = $current[1]; + $y = $current[2]; + $subpathStartX = $x; + $subpathStartY = $y; + $surface->moveTo($x + $l, $y + $t); + break; + + case 'c': // bezierCurveTo, relative + $tempX = $x + $current[5]; + $tempY = $y + $current[6]; + $controlX = $x + $current[3]; + $controlY = $y + $current[4]; + $surface->bezierCurveTo( + $x + $current[1] + $l, // x1 + $y + $current[2] + $t, // y1 + $controlX + $l, // x2 + $controlY + $t, // y2 + $tempX + $l, + $tempY + $t + ); + $x = $tempX; + $y = $tempY; + break; + + case 'C': // bezierCurveTo, absolute + $x = $current[5]; + $y = $current[6]; + $controlX = $current[3]; + $controlY = $current[4]; + $surface->bezierCurveTo( + $current[1] + $l, + $current[2] + $t, + $controlX + $l, + $controlY + $t, + $x + $l, + $y + $t + ); + break; + + case 's': // shorthand cubic bezierCurveTo, relative + + // transform to absolute x,y + $tempX = $x + $current[3]; + $tempY = $y + $current[4]; + + if (!preg_match('/[CcSs]/', $previous[0])) { + // If there is no previous command or if the previous command was not a C, c, S, or s, + // the control point is coincident with the current point + $controlX = $x; + $controlY = $y; + } else { + // calculate reflection of previous control points + $controlX = 2 * $x - $controlX; + $controlY = 2 * $y - $controlY; + } + + $surface->bezierCurveTo( + $controlX + $l, + $controlY + $t, + $x + $current[1] + $l, + $y + $current[2] + $t, + $tempX + $l, + $tempY + $t + ); + // set control point to 2nd one of this command + // "... the first control point is assumed to be + // the reflection of the second control point on + // the previous command relative to the current point." + $controlX = $x + $current[1]; + $controlY = $y + $current[2]; + + $x = $tempX; + $y = $tempY; + break; + + case 'S': // shorthand cubic bezierCurveTo, absolute + $tempX = $current[3]; + $tempY = $current[4]; + + if (!preg_match('/[CcSs]/', $previous[0])) { + // If there is no previous command or if the previous command was not a C, c, S, or s, + // the control point is coincident with the current point + $controlX = $x; + $controlY = $y; + } else { + // calculate reflection of previous control points + $controlX = 2 * $x - $controlX; + $controlY = 2 * $y - $controlY; + } + + $surface->bezierCurveTo( + $controlX + $l, + $controlY + $t, + $current[1] + $l, + $current[2] + $t, + $tempX + $l, + $tempY + $t + ); + $x = $tempX; + $y = $tempY; + + // set control point to 2nd one of this command + // "... the first control point is assumed to be + // the reflection of the second control point on + // the previous command relative to the current point." + $controlX = $current[1]; + $controlY = $current[2]; + + break; + + case 'q': // quadraticCurveTo, relative + // transform to absolute x,y + $tempX = $x + $current[3]; + $tempY = $y + $current[4]; + + $controlX = $x + $current[1]; + $controlY = $y + $current[2]; + + $surface->quadraticCurveTo( + $controlX + $l, + $controlY + $t, + $tempX + $l, + $tempY + $t + ); + $x = $tempX; + $y = $tempY; + break; + + case 'Q': // quadraticCurveTo, absolute + $tempX = $current[3]; + $tempY = $current[4]; + + $surface->quadraticCurveTo( + $current[1] + $l, + $current[2] + $t, + $tempX + $l, + $tempY + $t + ); + $x = $tempX; + $y = $tempY; + $controlX = $current[1]; + $controlY = $current[2]; + break; + + case 't': // shorthand quadraticCurveTo, relative + + // transform to absolute x,y + $tempX = $x + $current[1]; + $tempY = $y + $current[2]; + + // calculate reflection of previous control points + if (preg_match('/[QqT]/', $previous[0])) { + $controlX = 2 * $x - $controlX; + $controlY = 2 * $y - $controlY; + } elseif ($previous[0] === 't') { + $controlX = 2 * $x - $tempControlX; + $controlY = 2 * $y - $tempControlY; + } else { + $controlX = $x; + $controlY = $y; + } + + $tempControlX = $controlX; + $tempControlY = $controlY; + + $surface->quadraticCurveTo( + $controlX + $l, + $controlY + $t, + $tempX + $l, + $tempY + $t + ); + $x = $tempX; + $y = $tempY; + break; + + case 'T': + $tempX = $current[1]; + $tempY = $current[2]; + + // calculate reflection of previous control points + if (preg_match('/[QqTt]/', $previous[0])) { + $controlX = 2 * $x - $controlX; + $controlY = 2 * $y - $controlY; + } else { + $controlX = $x; + $controlY = $y; + } + + $surface->quadraticCurveTo( + $controlX + $l, + $controlY + $t, + $tempX + $l, + $tempY + $t + ); + $x = $tempX; + $y = $tempY; + break; + + case 'a': + $this->drawArc( + $surface, + $x + $l, + $y + $t, + array( + $current[1], + $current[2], + $current[3], + $current[4], + $current[5], + $current[6] + $x + $l, + $current[7] + $y + $t + ) + ); + $x += $current[6]; + $y += $current[7]; + break; + + case 'A': + // TODO: optimize this + $this->drawArc( + $surface, + $x + $l, + $y + $t, + array( + $current[1], + $current[2], + $current[3], + $current[4], + $current[5], + $current[6] + $l, + $current[7] + $t + ) + ); + $x = $current[6]; + $y = $current[7]; + break; + + case 'z': + case 'Z': + $x = $subpathStartX; + $y = $subpathStartY; + $surface->closePath(); + break; + } + $previous = $current; + } + } + + function drawArc(SurfaceInterface $surface, $fx, $fy, $coords) + { + $rx = $coords[0]; + $ry = $coords[1]; + $rot = $coords[2]; + $large = $coords[3]; + $sweep = $coords[4]; + $tx = $coords[5]; + $ty = $coords[6]; + $segs = array( + array(), + array(), + array(), + array(), + ); + + $toX = $tx - $fx; + $toY = $ty - $fy; + + if ((float)($toX + $toY) === 0.0) { + return; + } + + if ((float)abs($rx) == 0.0 || (float)abs($ry) === 0.0) { + $surface->lineTo($tx, $ty); + return; + } + + $segsNorm = $this->arcToSegments($toX, $toY, $rx, $ry, $large, $sweep, $rot); + + for ($i = 0, $len = count($segsNorm); $i < $len; $i++) { + $segs[$i][0] = $segsNorm[$i][0] + $fx; + $segs[$i][1] = $segsNorm[$i][1] + $fy; + $segs[$i][2] = $segsNorm[$i][2] + $fx; + $segs[$i][3] = $segsNorm[$i][3] + $fy; + $segs[$i][4] = $segsNorm[$i][4] + $fx; + $segs[$i][5] = $segsNorm[$i][5] + $fy; + + call_user_func_array(array($surface, "bezierCurveTo"), $segs[$i]); + } + } + + function arcToSegments($toX, $toY, $rx, $ry, $large, $sweep, $rotateX) + { + $th = $rotateX * M_PI / 180; + $sinTh = sin($th); + $cosTh = cos($th); + $fromX = 0; + $fromY = 0; + + $rx = abs($rx); + $ry = abs($ry); + + $px = -$cosTh * $toX * 0.5 - $sinTh * $toY * 0.5; + $py = -$cosTh * $toY * 0.5 + $sinTh * $toX * 0.5; + $rx2 = $rx * $rx; + $ry2 = $ry * $ry; + $py2 = $py * $py; + $px2 = $px * $px; + $pl = $rx2 * $ry2 - $rx2 * $py2 - $ry2 * $px2; + $root = 0; + + if ($pl < 0) { + $s = sqrt(1 - $pl / ($rx2 * $ry2)); + $rx *= $s; + $ry *= $s; + } else { + $root = ($large == $sweep ? -1.0 : 1.0) * sqrt($pl / ($rx2 * $py2 + $ry2 * $px2)); + } + + $cx = $root * $rx * $py / $ry; + $cy = -$root * $ry * $px / $rx; + $cx1 = $cosTh * $cx - $sinTh * $cy + $toX * 0.5; + $cy1 = $sinTh * $cx + $cosTh * $cy + $toY * 0.5; + $mTheta = $this->calcVectorAngle(1, 0, ($px - $cx) / $rx, ($py - $cy) / $ry); + $dtheta = $this->calcVectorAngle(($px - $cx) / $rx, ($py - $cy) / $ry, (-$px - $cx) / $rx, (-$py - $cy) / $ry); + + if ($sweep == 0 && $dtheta > 0) { + $dtheta -= 2 * M_PI; + } else { + if ($sweep == 1 && $dtheta < 0) { + $dtheta += 2 * M_PI; + } + } + + // $Convert $into $cubic $bezier $segments <= 90deg + $segments = ceil(abs($dtheta / M_PI * 2)); + $result = array(); + $mDelta = $dtheta / $segments; + $mT = 8 / 3 * sin($mDelta / 4) * sin($mDelta / 4) / sin($mDelta / 2); + $th3 = $mTheta + $mDelta; + + for ($i = 0; $i < $segments; $i++) { + $result[$i] = $this->segmentToBezier( + $mTheta, + $th3, + $cosTh, + $sinTh, + $rx, + $ry, + $cx1, + $cy1, + $mT, + $fromX, + $fromY + ); + $fromX = $result[$i][4]; + $fromY = $result[$i][5]; + $mTheta = $th3; + $th3 += $mDelta; + } + + return $result; + } + + function segmentToBezier($th2, $th3, $cosTh, $sinTh, $rx, $ry, $cx1, $cy1, $mT, $fromX, $fromY) + { + $costh2 = cos($th2); + $sinth2 = sin($th2); + $costh3 = cos($th3); + $sinth3 = sin($th3); + $toX = $cosTh * $rx * $costh3 - $sinTh * $ry * $sinth3 + $cx1; + $toY = $sinTh * $rx * $costh3 + $cosTh * $ry * $sinth3 + $cy1; + $cp1X = $fromX + $mT * (-$cosTh * $rx * $sinth2 - $sinTh * $ry * $costh2); + $cp1Y = $fromY + $mT * (-$sinTh * $rx * $sinth2 + $cosTh * $ry * $costh2); + $cp2X = $toX + $mT * ($cosTh * $rx * $sinth3 + $sinTh * $ry * $costh3); + $cp2Y = $toY + $mT * ($sinTh * $rx * $sinth3 - $cosTh * $ry * $costh3); + + return array( + $cp1X, + $cp1Y, + $cp2X, + $cp2Y, + $toX, + $toY + ); + } + + function calcVectorAngle($ux, $uy, $vx, $vy) + { + $ta = atan2($uy, $ux); + $tb = atan2($vy, $vx); + if ($tb >= $ta) { + return $tb - $ta; + } else { + return 2 * M_PI - ($ta - $tb); + } + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Polygon.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Polygon.php new file mode 100644 index 0000000..72437af --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Polygon.php @@ -0,0 +1,41 @@ +document->getSurface(); + list($x, $y) = $points; + $surface->moveTo($x, $y); + + for ($i = 2; $i < $count; $i += 2) { + if ($i + 1 === $count) { + // invalid trailing point + continue; + } + $x = $points[$i]; + $y = $points[$i + 1]; + $surface->lineTo($x, $y); + } + + $surface->closePath(); + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Polyline.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Polyline.php new file mode 100644 index 0000000..fce3458 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Polyline.php @@ -0,0 +1,39 @@ +document->getSurface(); + list($x, $y) = $points; + $surface->moveTo($x, $y); + + for ($i = 2; $i < $count; $i += 2) { + if ($i + 1 === $count) { + // invalid trailing point + continue; + } + $x = $points[$i]; + $y = $points[$i + 1]; + $surface->lineTo($x, $y); + } + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/RadialGradient.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/RadialGradient.php new file mode 100644 index 0000000..80c9879 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/RadialGradient.php @@ -0,0 +1,16 @@ +document->getWidth(); + $height = $this->document->getHeight(); + + if (isset($attributes['x'])) { + $this->x = $this->convertSize($attributes['x'], $width); + } + if (isset($attributes['y'])) { + $this->y = $this->convertSize($attributes['y'], $height); + } + + if (isset($attributes['width'])) { + $this->width = $this->convertSize($attributes['width'], $width); + } + if (isset($attributes['height'])) { + $this->height = $this->convertSize($attributes['height'], $height); + } + + if (isset($attributes['rx'])) { + $this->rx = $attributes['rx']; + } + if (isset($attributes['ry'])) { + $this->ry = $attributes['ry']; + } + + $this->document->getSurface()->rect($this->x, $this->y, $this->width, $this->height, $this->rx, $this->ry); + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Shape.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Shape.php new file mode 100644 index 0000000..e9342a2 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Shape.php @@ -0,0 +1,62 @@ +document->getSurface(); + + $surface->save(); + + $style = $this->makeStyle($attributes); + + $this->setStyle($style); + $surface->setStyle($style); + + $this->applyTransform($attributes); + } + + protected function after() + { + $surface = $this->document->getSurface(); + + if ($this->hasShape) { + $style = $surface->getStyle(); + + $fill = $style->fill && is_array($style->fill); + $stroke = $style->stroke && is_array($style->stroke); + + if ($fill) { + if ($stroke) { + $surface->fillStroke(false); + } else { +// if (is_string($style->fill)) { +// /** @var LinearGradient|RadialGradient $gradient */ +// $gradient = $this->getDocument()->getDef($style->fill); +// +// var_dump($gradient->getStops()); +// } + + $surface->fill(); + } + } + elseif ($stroke) { + $surface->stroke(false); + } + else { + $surface->endPath(); + } + } + + $surface->restore(); + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Stop.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Stop.php new file mode 100644 index 0000000..b7414f9 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Stop.php @@ -0,0 +1,16 @@ +text); + $this->document->appendStyleSheet($parser->parse()); + } + + public function appendText($text) + { + $this->text .= $text; + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Symbol.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Symbol.php new file mode 100644 index 0000000..3668a44 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Symbol.php @@ -0,0 +1,33 @@ +document->getSurface(); + + $surface->save(); + + $style = $this->makeStyle($attributes); + + $this->setStyle($style); + $surface->setStyle($style); + + $this->applyViewbox($attributes); + $this->applyTransform($attributes); + } + + protected function after() + { + $this->document->getSurface()->restore(); + } +} \ No newline at end of file diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Text.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Text.php new file mode 100644 index 0000000..0433658 --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/Text.php @@ -0,0 +1,71 @@ +document->getHeight(); + $this->y = $height; + + if (isset($attributes['x'])) { + $width = $this->document->getWidth(); + $this->x = $this->convertSize($attributes['x'], $width); + } + if (isset($attributes['y'])) { + $this->y = $height - $this->convertSize($attributes['y'], $height); + } + + $this->document->getSurface()->transform(1, 0, 0, -1, 0, $height); + } + + public function end() + { + $surface = $this->document->getSurface(); + $x = $this->x; + $y = $this->y; + $style = $surface->getStyle(); + $surface->setFont($style->fontFamily, $style->fontStyle, $style->fontWeight); + + switch ($style->textAnchor) { + case "middle": + $width = $surface->measureText($this->text); + $x -= $width / 2; + break; + + case "end": + $width = $surface->measureText($this->text); + $x -= $width; + break; + } + + $surface->fillText($this->getText(), $x, $y); + } + + protected function after() + { + $this->document->getSurface()->restore(); + } + + public function appendText($text) + { + $this->text .= $text; + } + + public function getText() + { + return trim($this->text); + } +} diff --git a/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/UseTag.php b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/UseTag.php new file mode 100644 index 0000000..66c460b --- /dev/null +++ b/dompdf/vendor/dompdf/php-svg-lib/src/Svg/Tag/UseTag.php @@ -0,0 +1,131 @@ +instances++; + if ($this->instances > 1) { + //TODO: log circular reference error state + return; + } + + if (isset($attributes['x'])) { + $this->x = $attributes['x']; + } + if (isset($attributes['y'])) { + $this->y = $attributes['y']; + } + + if (isset($attributes['width'])) { + $this->width = $attributes['width']; + } + if (isset($attributes['height'])) { + $this->height = $attributes['height']; + } + + parent::before($attributes); + + $document = $this->getDocument(); + + $link = $attributes["href"] ?? $attributes["xlink:href"]; + $this->reference = $document->getDef($link); + + $surface = $document->getSurface(); + $surface->save(); + + $surface->translate($this->x, $this->y); + } + + protected function after() { + if ($this->instances > 0) { + return; + } + parent::after(); + $this->getDocument()->getSurface()->restore(); + } + + public function handle($attributes) + { + if ($this->instances > 1) { + //TODO: log circular reference error state + return; + } + + parent::handle($attributes); + + if (!$this->reference) { + return; + } + + $originalAttributes = array_merge($this->reference->attributes); + $originalStyle = $this->reference->getStyle(); + $mergedAttributes = $this->reference->attributes; + $attributesToNotMerge = ['x', 'y', 'width', 'height', 'href', 'xlink:href', 'id', 'style']; + foreach ($attributes as $attrKey => $attrVal) { + if (!in_array($attrKey, $attributesToNotMerge) && !isset($mergedAttributes[$attrKey])) { + $mergedAttributes[$attrKey] = $attrVal; + } + } + $mergedAttributes['style'] = ($attributes['style'] ?? '') . ';' . ($mergedAttributes['style'] ?? ''); + + $this->_handle($this->reference, $mergedAttributes); + + $this->reference->attributes = $originalAttributes; + if ($originalStyle !== null) { + $this->reference->setStyle($originalStyle); + } + } + + public function handleEnd() + { + $this->instances--; + if ($this->instances > 0) { + return; + } + + if ($this->reference) { + $this->_handleEnd($this->reference); + } + + parent::handleEnd(); + } + + private function _handle($tag, $attributes) { + $tag->handle($attributes); + foreach ($tag->children as $child) { + $originalAttributes = array_merge($child->attributes); + $originalStyle = $child->getStyle(); + $mergedAttributes = $child->attributes; + $mergedAttributes['style'] = ($attributes['style'] ?? '') . ';' . ($mergedAttributes['style'] ?? ''); + $this->_handle($child, $mergedAttributes); + $child->attributes = $originalAttributes; + if ($originalStyle !== null) { + $child->setStyle($originalStyle); + } + } + } + + private function _handleEnd($tag) { + foreach ($tag->children as $child) { + $this->_handleEnd($child); + } + $tag->handleEnd(); + } +} diff --git a/dompdf/vendor/masterminds/html5/CREDITS b/dompdf/vendor/masterminds/html5/CREDITS new file mode 100644 index 0000000..c2dbc4b --- /dev/null +++ b/dompdf/vendor/masterminds/html5/CREDITS @@ -0,0 +1,11 @@ +Matt Butcher [technosophos] (lead) +Matt Farina [mattfarina] (lead) +Asmir Mustafic [goetas] (contributor) +Edward Z. Yang [ezyang] (contributor) +Geoffrey Sneddon [gsnedders] (contributor) +Kukhar Vasily [ngreduce] (contributor) +Rune Christensen [MrElectronic] (contributor) +Mišo Belica [miso-belica] (contributor) +Asmir Mustafic [goetas] (contributor) +KITAITI Makoto [KitaitiMakoto] (contributor) +Jacob Floyd [cognifloyd] (contributor) diff --git a/dompdf/vendor/masterminds/html5/LICENSE.txt b/dompdf/vendor/masterminds/html5/LICENSE.txt new file mode 100644 index 0000000..3c275b5 --- /dev/null +++ b/dompdf/vendor/masterminds/html5/LICENSE.txt @@ -0,0 +1,66 @@ +## HTML5-PHP License + +Copyright (c) 2013 The Authors of HTML5-PHP + +Matt Butcher - mattbutcher@google.com +Matt Farina - matt@mattfarina.com +Asmir Mustafic - goetas@gmail.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## HTML5Lib License + +Portions of this are based on html5lib's PHP version, which was a +sub-project of html5lib. The following is the list of contributors from +html5lib: + +html5lib: + +Copyright (c) 2006-2009 The Authors + +Contributors: +James Graham - jg307@cam.ac.uk +Anne van Kesteren - annevankesteren@gmail.com +Lachlan Hunt - lachlan.hunt@lachy.id.au +Matt McDonald - kanashii@kanashii.ca +Sam Ruby - rubys@intertwingly.net +Ian Hickson (Google) - ian@hixie.ch +Thomas Broyer - t.broyer@ltgt.net +Jacques Distler - distler@golem.ph.utexas.edu +Henri Sivonen - hsivonen@iki.fi +Adam Barth - abarth@webkit.org +Eric Seidel - eric@webkit.org +The Mozilla Foundation (contributions from Henri Sivonen since 2008) +David Flanagan (Mozilla) - dflanagan@mozilla.com + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/dompdf/vendor/masterminds/html5/README.md b/dompdf/vendor/masterminds/html5/README.md new file mode 100644 index 0000000..fb6e562 --- /dev/null +++ b/dompdf/vendor/masterminds/html5/README.md @@ -0,0 +1,270 @@ +> # UKRAINE NEEDS YOUR HELP NOW! +> +> On 24 February 2022, Russian [President Vladimir Putin ordered an invasion of Ukraine by Russian Armed Forces](https://www.bbc.com/news/world-europe-60504334). +> +> Your support is urgently needed. +> +> - Donate to the volunteers. Here is the volunteer fund helping the Ukrainian army to provide all the necessary equipment: +> https://bank.gov.ua/en/news/all/natsionalniy-bank-vidkriv-spetsrahunok-dlya-zboru-koshtiv-na-potrebi-armiyi or https://savelife.in.ua/en/donate/ +> - Triple-check social media sources. Russian disinformation is attempting to coverup and distort the reality in Ukraine. +> - Help Ukrainian refugees who are fleeing Russian attacks and shellings: https://www.globalcitizen.org/en/content/ways-to-help-ukraine-conflict/ +> - Put pressure on your political representatives to provide help to Ukraine. +> - Believe in the Ukrainian people, they will not surrender, they don't have another Ukraine. +> +> THANK YOU! +---- + +# HTML5-PHP + +HTML5 is a standards-compliant HTML5 parser and writer written entirely in PHP. +It is stable and used in many production websites, and has +well over [five million downloads](https://packagist.org/packages/masterminds/html5). + +HTML5 provides the following features. + +- An HTML5 serializer +- Support for PHP namespaces +- Composer support +- Event-based (SAX-like) parser +- A DOM tree builder +- Interoperability with [QueryPath](https://github.com/technosophos/querypath) +- Runs on **PHP** 5.3.0 or newer + +[![CI](https://github.com/Masterminds/html5-php/actions/workflows/ci.yaml/badge.svg)](https://github.com/Masterminds/html5-php/actions/workflows/ci.yaml) +[![Latest Stable Version](https://poser.pugx.org/masterminds/html5/v/stable.png)](https://packagist.org/packages/masterminds/html5) +[![Code Coverage](https://scrutinizer-ci.com/g/Masterminds/html5-php/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/Masterminds/html5-php/?branch=master) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/Masterminds/html5-php/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/Masterminds/html5-php/?branch=master) +[![Stability: Sustained](https://masterminds.github.io/stability/sustained.svg)](https://masterminds.github.io/stability/sustained.html) + +## Installation + +Install HTML5-PHP using [composer](http://getcomposer.org/). + +By adding the `masterminds/html5` dependency to your `composer.json` file: + +```json +{ + "require" : { + "masterminds/html5": "^2.0" + }, +} +``` + +By invoking require command via composer executable: + +```bash +composer require masterminds/html5 +``` + +## Basic Usage + +HTML5-PHP has a high-level API and a low-level API. + +Here is how you use the high-level `HTML5` library API: + +```php + + + TEST + + +

Hello World

+

This is a test of the HTML5 parser.

+ + +HERE; + +// Parse the document. $dom is a DOMDocument. +$html5 = new HTML5(); +$dom = $html5->loadHTML($html); + +// Render it as HTML5: +print $html5->saveHTML($dom); + +// Or save it to a file: +$html5->save($dom, 'out.html'); +``` + +The `$dom` created by the parser is a full `DOMDocument` object. And the +`save()` and `saveHTML()` methods will take any DOMDocument. + +### Options + +It is possible to pass in an array of configuration options when loading +an HTML5 document. + +```php +// An associative array of options +$options = array( + 'option_name' => 'option_value', +); + +// Provide the options to the constructor +$html5 = new HTML5($options); + +$dom = $html5->loadHTML($html); +``` + +The following options are supported: + +* `encode_entities` (boolean): Indicates that the serializer should aggressively + encode characters as entities. Without this, it only encodes the bare + minimum. +* `disable_html_ns` (boolean): Prevents the parser from automatically + assigning the HTML5 namespace to the DOM document. This is for + non-namespace aware DOM tools. +* `target_document` (\DOMDocument): A DOM document that will be used as the + destination for the parsed nodes. +* `implicit_namespaces` (array): An assoc array of namespaces that should be + used by the parser. Name is tag prefix, value is NS URI. + +## The Low-Level API + +This library provides the following low-level APIs that you can use to +create more customized HTML5 tools: + +- A SAX-like event-based parser that you can hook into for special kinds +of parsing. +- A flexible error-reporting mechanism that can be tuned to document +syntax checking. +- A DOM implementation that uses PHP's built-in DOM library. + +The unit tests exercise each piece of the API, and every public function +is well-documented. + +### Parser Design + +The parser is designed as follows: + +- The `Scanner` handles scanning on behalf of the parser. +- The `Tokenizer` requests data off of the scanner, parses it, clasifies +it, and sends it to an `EventHandler`. It is a *recursive descent parser.* +- The `EventHandler` receives notifications and data for each specific +semantic event that occurs during tokenization. +- The `DOMBuilder` is an `EventHandler` that listens for tokenizing +events and builds a document tree (`DOMDocument`) based on the events. + +### Serializer Design + +The serializer takes a data structure (the `DOMDocument`) and transforms +it into a character representation -- an HTML5 document. + +The serializer is broken into three parts: + +- The `OutputRules` contain the rules to turn DOM elements into strings. The +rules are an implementation of the interface `RulesInterface` allowing for +different rule sets to be used. +- The `Traverser`, which is a special-purpose tree walker. It visits +each node node in the tree and uses the `OutputRules` to transform the node +into a string. +- `HTML5` manages the `Traverser` and stores the resultant data +in the correct place. + +The serializer (`save()`, `saveHTML()`) follows the +[section 8.9 of the HTML 5.0 spec](http://www.w3.org/TR/2012/CR-html5-20121217/syntax.html#serializing-html-fragments). +So tags are serialized according to these rules: + +- A tag with children: <foo>CHILDREN</foo> +- A tag that cannot have content: <foo> (no closing tag) +- A tag that could have content, but doesn't: <foo></foo> + +## Known Issues (Or, Things We Designed Against the Spec) + +Please check the issue queue for a full list, but the following are +issues known issues that are not presently on the roadmap: + +- Namespaces: HTML5 only [supports a selected list of namespaces](http://www.w3.org/TR/html5/infrastructure.html#namespaces) + and they do not operate in the same way as XML namespaces. A `:` has no special + meaning. + By default the parser does not support XML style namespaces via `:`; + to enable the XML namespaces see the [XML Namespaces section](#xml-namespaces) +- Scripts: This parser does not contain a JavaScript or a CSS + interpreter. While one may be supplied, not all features will be + supported. +- Reentrance: The current parser is not re-entrant. (Thus you can't pause + the parser to modify the HTML string mid-parse.) +- Validation: The current tree builder is **not** a validating parser. + While it will correct some HTML, it does not check that the HTML + conforms to the standard. (Should you wish, you can build a validating + parser by extending DOMTree or building your own EventHandler + implementation.) + * There is limited support for insertion modes. + * Some autocorrection is done automatically. + * Per the spec, many legacy tags are admitted and correctly handled, + even though they are technically not part of HTML5. +- Attribute names and values: Due to the implementation details of the + PHP implementation of DOM, attribute names that do not follow the + XML 1.0 standard are not inserted into the DOM. (Effectively, they + are ignored.) If you've got a clever fix for this, jump in! +- Processor Instructions: The HTML5 spec does not allow processor + instructions. We do. Since this is a server-side library, we think + this is useful. And that means, dear reader, that in some cases you + can parse the HTML from a mixed PHP/HTML document. This, however, + is an incidental feature, not a core feature. +- HTML manifests: Unsupported. +- PLAINTEXT: Unsupported. +- Adoption Agency Algorithm: Not yet implemented. (8.2.5.4.7) + +## XML Namespaces + +To use XML style namespaces you have to configure well the main `HTML5` instance. + +```php +use Masterminds\HTML5; +$html = new HTML5(array( + "xmlNamespaces" => true +)); + +$dom = $html->loadHTML(''); + +$dom->documentElement->namespaceURI; // http://www.example.com + +``` + +You can also add some default prefixes that will not require the namespace declaration, +but its elements will be namespaced. + +```php +use Masterminds\HTML5; +$html = new HTML5(array( + "implicitNamespaces"=>array( + "t"=>"http://www.example.com" + ) +)); + +$dom = $html->loadHTML(''); + +$dom->documentElement->namespaceURI; // http://www.example.com + +``` + +## Thanks to... + +The dedicated (and patient) contributors of patches small and large, +who have already made this library better.See the CREDITS file for +a list of contributors. + +We owe a huge debt of gratitude to the original authors of html5lib. + +While not much of the original parser remains, we learned a lot from +reading the html5lib library. And some pieces remain here. In +particular, much of the UTF-8 and Unicode handling is derived from the +html5lib project. + +## License + +This software is released under the MIT license. The original html5lib +library was also released under the MIT license. + +See LICENSE.txt + +Certain files contain copyright assertions by specific individuals +involved with html5lib. Those have been retained where appropriate. diff --git a/dompdf/vendor/masterminds/html5/RELEASE.md b/dompdf/vendor/masterminds/html5/RELEASE.md new file mode 100644 index 0000000..33007ed --- /dev/null +++ b/dompdf/vendor/masterminds/html5/RELEASE.md @@ -0,0 +1,157 @@ +# Release Notes + +2.7.6 (2021-08-18) + +- #218: Address comment handling issues + +2.7.5 (2021-07-01) + +- #204: Travis: Enable tests on PHP 8.0 +- #207: Fix PHP 8.1 deprecations + +2.7.4 (2020-10-01) + +- #191: Fix travisci build +- #195: Add .gitattributes file with export-ignore rules +- #194: Fix query parameter parsed as character entity + +2.7.3 (2020-07-05) + +- #190: mitigate cyclic reference between output rules and the traverser objects + +2.7.2 (2020-07-01) + +- #187: Fixed memory leak in HTML5::saveHTML() +- #186: Add special case for end tag
+ +2.7.1 (2020-06-14) + +- #171: add PHP 7.4 job +- #178: Prevent infinite loop on un-terminated entity declaration at EOF + +2.7.0 (2019-07-25) + +- #164: Drop HHVM support +- #168: Set default encoding in the DOMDocument object + +2.6.0 (2019-03-10) + +- #163: Allow to pass a charset to the Scanner + +2.5.0 (2018-12-27) + +- #162, #161, #155, #154, #153, #151: big performance improvements +- #156: fixed typos +- #160: adopt and enforce code style +- #159: remove deprecated php unit base test case +- #150: backport changes from old master branch + +2.4.0 (2018-11-17) + +- #148: Improve performance by moving sequence matching +- #147: Improve the Tokenizer performance +- #146: Improve performance by relying on a native string instead of InputStream +- #144: Add DOM extension in composer.json +- #145: Add more extensions on composer.json, improve phpdocs and remove dead code +- #143: Remove experimental comment + +2.3.1 (2018-10-18) + +- #121: Audio is not a block tag (fixed by #141) +- #136: Handle illegal self-closing according to spec (fixed by #137) +- #141: Minor fixes in the README + +2.3.0 (2017-09-04) + +- #129: image within inline svg breaks system (fixed by #133) +- #131: ² does not work (fixed by #132) +- #134: Improve tokenizer performance by 20% (alternative version of #130 thanks to @MichaelHeerklotz) +- #135: Raw & in attributes + +2.2.2 (2016-09-22) + +- #116: In XML mode, tags are case sensitive +- #115: Fix PHP Notice in OutputRules +- #112: fix parsing of options of an optgroup +- #111: Adding test for the address tag + +2.2.1 (2016-05-10) + +- #109: Fixed issue where address tag could be written without closing tag (thanks sylus) + +2.2.0 (2016-04-11) + +- #105: Enable composer cache (for CI/CD) +- #100: Use mb_substitute_character inset of ini_set for environments where ini_set is disable (e.g., shared hosting) +- #98: Allow link, meta, style tags in noscript tags +- #96: Fixed xml:href on svgs that use the "use" breaking +- #94: Counting UTF8 characters performance improvement +- #93: Use newer version of coveralls package +- #90: Remove duplicate test +- #87: Allow multiple root nodes + +2.1.2 (2015-06-07) +- #82: Support for PHP7 +- #84: Improved boolean attribute handling + +2.1.1 (2015-03-23) +- #78: Fixes bug where unmatched entity like string drops everything after &. + +2.1.0 (2015-02-01) +- #74: Added `disable_html_ns` and `target_doc` dom parsing options +- Unified option names +- #73: Fixed alphabet, ß now can be detected +- #75 and #76: Allow whitespace in RCDATA tags +- #77: Fixed parsing blunder for json embeds +- #72: Add options to HTML methods + +2.0.2 (2014-12-17) +- #50: empty document handling +- #63: tags with strange capitalization +- #65: dashes and underscores as allowed characters in tag names +- #68: Fixed issue with non-inline elements inside inline containers + +2.0.1 (2014-09-23) +- #59: Fixed issue parsing some fragments. +- #56: Incorrectly saw 0 as empty string +- Sami as new documentation generator + +2.0.0 (2014-07-28) +- #53: Improved boolean attributes handling +- #52: Facebook HHVM compatibility +- #48: Adopted PSR-2 as coding standard +- #47: Moved everything to Masterminds namespace +- #45: Added custom namespaces +- #44: Added support to XML-style namespaces +- #37: Refactored HTML5 class removing static methods + +1.0.5 (2014-06-10) +- #38: Set the dev-master branch as the 1.0.x branch for composer (goetas) +- #34: Tests use PSR-4 for autoloading. (goetas) +- #40, #41: Fix entity handling in RCDATA sections. (KitaitiMakoto) +- #32: Fixed issue where wharacter references were being incorrectly encoded in style tags. + +1.0.4 (2014-04-29) +- #30/#31 Don't throw an exception for invalid tag names. + +1.0.3 (2014-02-28) +- #23 and #29: Ignore attributes with illegal chars in name for the PHP DOM. + +1.0.2 (2014-02-12) +- #23: Handle missing tag close in attribute list. +- #25: Fixed text escaping in the serializer (HTML% 8.3). +- #27: Fixed tests on Windows: changed "\n" -> PHP_EOL. +- #28: Fixed infinite loop for char "&" in unquoted attribute in parser. +- #26: Updated tag name case handling to deal with uppercase usage. +- #24: Newlines and tabs are allowed inside quoted attributes (HTML5 8.2.4). +- Fixed Travis CI testing. + +1.0.1 (2013-11-07) +- CDATA encoding is improved. (Non-standard; Issue #19) +- Some parser rules were not returning the new current element. (Issue #20) +- Added, to the README, details on code test coverage and to packagist version. +- Fixed processor instructions. +- Improved test coverage and documentation coverage. + +1.0.0 (2013-10-02) +- Initial release. diff --git a/dompdf/vendor/masterminds/html5/UPGRADING.md b/dompdf/vendor/masterminds/html5/UPGRADING.md new file mode 100644 index 0000000..76e3a19 --- /dev/null +++ b/dompdf/vendor/masterminds/html5/UPGRADING.md @@ -0,0 +1,21 @@ +From 1.x to 2.x +================= + +- All classes uses `Masterminds` namespace. +- All public static methods has been removed from `HTML5` class and the general API to access the HTML5 functionalities has changed. + + Before: + + $dom = \HTML5::loadHTML('....'); + \HTML5::saveHTML($dom); + + After: + + use Masterminds\HTML5; + + $html5 = new HTML5(); + + $dom = $html5->loadHTML('....'); + echo $html5->saveHTML($dom); + + diff --git a/dompdf/vendor/masterminds/html5/bin/entities.php b/dompdf/vendor/masterminds/html5/bin/entities.php new file mode 100644 index 0000000..56323a3 --- /dev/null +++ b/dompdf/vendor/masterminds/html5/bin/entities.php @@ -0,0 +1,26 @@ + $obj) { + $sname = substr($name, 1, -1); + $table[$sname] = $obj->characters; +} + +echo '=5.3.0" + }, + "require-dev": { + "phpunit/phpunit" : "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" + }, + "autoload": { + "psr-4": {"Masterminds\\": "src"} + }, + "autoload-dev": { + "psr-4": {"Masterminds\\HTML5\\Tests\\": "test/HTML5"} + }, + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + } +} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5.php b/dompdf/vendor/masterminds/html5/src/HTML5.php new file mode 100644 index 0000000..49a90da --- /dev/null +++ b/dompdf/vendor/masterminds/html5/src/HTML5.php @@ -0,0 +1,245 @@ + false, + + // Prevents the parser from automatically assigning the HTML5 namespace to the DOM document. + 'disable_html_ns' => false, + ); + + protected $errors = array(); + + public function __construct(array $defaultOptions = array()) + { + $this->defaultOptions = array_merge($this->defaultOptions, $defaultOptions); + } + + /** + * Get the current default options. + * + * @return array + */ + public function getOptions() + { + return $this->defaultOptions; + } + + /** + * Load and parse an HTML file. + * + * This will apply the HTML5 parser, which is tolerant of many + * varieties of HTML, including XHTML 1, HTML 4, and well-formed HTML + * 3. Note that in these cases, not all of the old data will be + * preserved. For example, XHTML's XML declaration will be removed. + * + * The rules governing parsing are set out in the HTML 5 spec. + * + * @param string|resource $file The path to the file to parse. If this is a resource, it is + * assumed to be an open stream whose pointer is set to the first + * byte of input. + * @param array $options Configuration options when parsing the HTML. + * + * @return \DOMDocument A DOM document. These object type is defined by the libxml + * library, and should have been included with your version of PHP. + */ + public function load($file, array $options = array()) + { + // Handle the case where file is a resource. + if (is_resource($file)) { + return $this->parse(stream_get_contents($file), $options); + } + + return $this->parse(file_get_contents($file), $options); + } + + /** + * Parse a HTML Document from a string. + * + * Take a string of HTML 5 (or earlier) and parse it into a + * DOMDocument. + * + * @param string $string A html5 document as a string. + * @param array $options Configuration options when parsing the HTML. + * + * @return \DOMDocument A DOM document. DOM is part of libxml, which is included with + * almost all distribtions of PHP. + */ + public function loadHTML($string, array $options = array()) + { + return $this->parse($string, $options); + } + + /** + * Convenience function to load an HTML file. + * + * This is here to provide backwards compatibility with the + * PHP DOM implementation. It simply calls load(). + * + * @param string $file The path to the file to parse. If this is a resource, it is + * assumed to be an open stream whose pointer is set to the first + * byte of input. + * @param array $options Configuration options when parsing the HTML. + * + * @return \DOMDocument A DOM document. These object type is defined by the libxml + * library, and should have been included with your version of PHP. + */ + public function loadHTMLFile($file, array $options = array()) + { + return $this->load($file, $options); + } + + /** + * Parse a HTML fragment from a string. + * + * @param string $string the HTML5 fragment as a string + * @param array $options Configuration options when parsing the HTML + * + * @return \DOMDocumentFragment A DOM fragment. The DOM is part of libxml, which is included with + * almost all distributions of PHP. + */ + public function loadHTMLFragment($string, array $options = array()) + { + return $this->parseFragment($string, $options); + } + + /** + * Return all errors encountered into parsing phase. + * + * @return array + */ + public function getErrors() + { + return $this->errors; + } + + /** + * Return true it some errors were encountered into parsing phase. + * + * @return bool + */ + public function hasErrors() + { + return count($this->errors) > 0; + } + + /** + * Parse an input string. + * + * @param string $input + * + * @return \DOMDocument + */ + public function parse($input, array $options = array()) + { + $this->errors = array(); + $options = array_merge($this->defaultOptions, $options); + $events = new DOMTreeBuilder(false, $options); + $scanner = new Scanner($input, !empty($options['encoding']) ? $options['encoding'] : 'UTF-8'); + $parser = new Tokenizer($scanner, $events, !empty($options['xmlNamespaces']) ? Tokenizer::CONFORMANT_XML : Tokenizer::CONFORMANT_HTML); + + $parser->parse(); + $this->errors = $events->getErrors(); + + return $events->document(); + } + + /** + * Parse an input stream where the stream is a fragment. + * + * Lower-level loading function. This requires an input stream instead + * of a string, file, or resource. + * + * @param string $input The input data to parse in the form of a string. + * @param array $options An array of options. + * + * @return \DOMDocumentFragment + */ + public function parseFragment($input, array $options = array()) + { + $options = array_merge($this->defaultOptions, $options); + $events = new DOMTreeBuilder(true, $options); + $scanner = new Scanner($input, !empty($options['encoding']) ? $options['encoding'] : 'UTF-8'); + $parser = new Tokenizer($scanner, $events, !empty($options['xmlNamespaces']) ? Tokenizer::CONFORMANT_XML : Tokenizer::CONFORMANT_HTML); + + $parser->parse(); + $this->errors = $events->getErrors(); + + return $events->fragment(); + } + + /** + * Save a DOM into a given file as HTML5. + * + * @param mixed $dom The DOM to be serialized. + * @param string|resource $file The filename to be written or resource to write to. + * @param array $options Configuration options when serializing the DOM. These include: + * - encode_entities: Text written to the output is escaped by default and not all + * entities are encoded. If this is set to true all entities will be encoded. + * Defaults to false. + */ + public function save($dom, $file, $options = array()) + { + $close = true; + if (is_resource($file)) { + $stream = $file; + $close = false; + } else { + $stream = fopen($file, 'wb'); + } + $options = array_merge($this->defaultOptions, $options); + $rules = new OutputRules($stream, $options); + $trav = new Traverser($dom, $stream, $rules, $options); + + $trav->walk(); + /* + * release the traverser to avoid cyclic references and allow PHP to free memory without waiting for gc_collect_cycles + */ + $rules->unsetTraverser(); + if ($close) { + fclose($stream); + } + } + + /** + * Convert a DOM into an HTML5 string. + * + * @param mixed $dom The DOM to be serialized. + * @param array $options Configuration options when serializing the DOM. These include: + * - encode_entities: Text written to the output is escaped by default and not all + * entities are encoded. If this is set to true all entities will be encoded. + * Defaults to false. + * + * @return string A HTML5 documented generated from the DOM. + */ + public function saveHTML($dom, $options = array()) + { + $stream = fopen('php://temp', 'wb'); + $this->save($dom, $stream, array_merge($this->defaultOptions, $options)); + + $html = stream_get_contents($stream, -1, 0); + + fclose($stream); + + return $html; + } +} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Elements.php b/dompdf/vendor/masterminds/html5/src/HTML5/Elements.php new file mode 100644 index 0000000..5d8cfd4 --- /dev/null +++ b/dompdf/vendor/masterminds/html5/src/HTML5/Elements.php @@ -0,0 +1,637 @@ + [PARENT-TAG-NAME-TO-CLOSE1, PARENT-TAG-NAME-TO-CLOSE2, ...]. + * + * Order is important, after auto-closing one parent with might have to close also their parent. + * + * @var array + */ + public static $optionalEndElementsParentsToClose = array( + 'tr' => array('td', 'tr'), + 'td' => array('td', 'th'), + 'th' => array('td', 'th'), + 'tfoot' => array('td', 'th', 'tr', 'tbody', 'thead'), + 'tbody' => array('td', 'th', 'tr', 'thead'), + ); + + /** + * The HTML5 elements as defined in http://dev.w3.org/html5/markup/elements.html. + * + * @var array + */ + public static $html5 = array( + 'a' => 1, + 'abbr' => 1, + 'address' => 65, // NORMAL | BLOCK_TAG + 'area' => 9, // NORMAL | VOID_TAG + 'article' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'aside' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'audio' => 1, // NORMAL + 'b' => 1, + 'base' => 9, // NORMAL | VOID_TAG + 'bdi' => 1, + 'bdo' => 1, + 'blockquote' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'body' => 1, + 'br' => 9, // NORMAL | VOID_TAG + 'button' => 1, + 'canvas' => 65, // NORMAL | BLOCK_TAG + 'caption' => 1, + 'cite' => 1, + 'code' => 1, + 'col' => 9, // NORMAL | VOID_TAG + 'colgroup' => 1, + 'command' => 9, // NORMAL | VOID_TAG + // "data" => 1, // This is highly experimental and only part of the whatwg spec (not w3c). See https://developer.mozilla.org/en-US/docs/HTML/Element/data + 'datalist' => 1, + 'dd' => 65, // NORMAL | BLOCK_TAG + 'del' => 1, + 'details' => 17, // NORMAL | AUTOCLOSE_P, + 'dfn' => 1, + 'dialog' => 17, // NORMAL | AUTOCLOSE_P, + 'div' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'dl' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'dt' => 1, + 'em' => 1, + 'embed' => 9, // NORMAL | VOID_TAG + 'fieldset' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'figcaption' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'figure' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'footer' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'form' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'h1' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'h2' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'h3' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'h4' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'h5' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'h6' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'head' => 1, + 'header' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'hgroup' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'hr' => 73, // NORMAL | VOID_TAG + 'html' => 1, + 'i' => 1, + 'iframe' => 3, // NORMAL | TEXT_RAW + 'img' => 9, // NORMAL | VOID_TAG + 'input' => 9, // NORMAL | VOID_TAG + 'kbd' => 1, + 'ins' => 1, + 'keygen' => 9, // NORMAL | VOID_TAG + 'label' => 1, + 'legend' => 1, + 'li' => 1, + 'link' => 9, // NORMAL | VOID_TAG + 'map' => 1, + 'mark' => 1, + 'menu' => 17, // NORMAL | AUTOCLOSE_P, + 'meta' => 9, // NORMAL | VOID_TAG + 'meter' => 1, + 'nav' => 17, // NORMAL | AUTOCLOSE_P, + 'noscript' => 65, // NORMAL | BLOCK_TAG + 'object' => 1, + 'ol' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'optgroup' => 1, + 'option' => 1, + 'output' => 65, // NORMAL | BLOCK_TAG + 'p' => 209, // NORMAL | AUTOCLOSE_P | BLOCK_TAG | BLOCK_ONLY_INLINE + 'param' => 9, // NORMAL | VOID_TAG + 'pre' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'progress' => 1, + 'q' => 1, + 'rp' => 1, + 'rt' => 1, + 'ruby' => 1, + 's' => 1, + 'samp' => 1, + 'script' => 3, // NORMAL | TEXT_RAW + 'section' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'select' => 1, + 'small' => 1, + 'source' => 9, // NORMAL | VOID_TAG + 'span' => 1, + 'strong' => 1, + 'style' => 3, // NORMAL | TEXT_RAW + 'sub' => 1, + 'summary' => 17, // NORMAL | AUTOCLOSE_P, + 'sup' => 1, + 'table' => 65, // NORMAL | BLOCK_TAG + 'tbody' => 1, + 'td' => 1, + 'textarea' => 5, // NORMAL | TEXT_RCDATA + 'tfoot' => 65, // NORMAL | BLOCK_TAG + 'th' => 1, + 'thead' => 1, + 'time' => 1, + 'title' => 5, // NORMAL | TEXT_RCDATA + 'tr' => 1, + 'track' => 9, // NORMAL | VOID_TAG + 'u' => 1, + 'ul' => 81, // NORMAL | AUTOCLOSE_P | BLOCK_TAG + 'var' => 1, + 'video' => 1, + 'wbr' => 9, // NORMAL | VOID_TAG + + // Legacy? + 'basefont' => 8, // VOID_TAG + 'bgsound' => 8, // VOID_TAG + 'noframes' => 2, // RAW_TEXT + 'frame' => 9, // NORMAL | VOID_TAG + 'frameset' => 1, + 'center' => 16, + 'dir' => 16, + 'listing' => 16, // AUTOCLOSE_P + 'plaintext' => 48, // AUTOCLOSE_P | TEXT_PLAINTEXT + 'applet' => 0, + 'marquee' => 0, + 'isindex' => 8, // VOID_TAG + 'xmp' => 20, // AUTOCLOSE_P | VOID_TAG | RAW_TEXT + 'noembed' => 2, // RAW_TEXT + ); + + /** + * The MathML elements. + * See http://www.w3.org/wiki/MathML/Elements. + * + * In our case we are only concerned with presentation MathML and not content + * MathML. There is a nice list of this subset at https://developer.mozilla.org/en-US/docs/MathML/Element. + * + * @var array + */ + public static $mathml = array( + 'maction' => 1, + 'maligngroup' => 1, + 'malignmark' => 1, + 'math' => 1, + 'menclose' => 1, + 'merror' => 1, + 'mfenced' => 1, + 'mfrac' => 1, + 'mglyph' => 1, + 'mi' => 1, + 'mlabeledtr' => 1, + 'mlongdiv' => 1, + 'mmultiscripts' => 1, + 'mn' => 1, + 'mo' => 1, + 'mover' => 1, + 'mpadded' => 1, + 'mphantom' => 1, + 'mroot' => 1, + 'mrow' => 1, + 'ms' => 1, + 'mscarries' => 1, + 'mscarry' => 1, + 'msgroup' => 1, + 'msline' => 1, + 'mspace' => 1, + 'msqrt' => 1, + 'msrow' => 1, + 'mstack' => 1, + 'mstyle' => 1, + 'msub' => 1, + 'msup' => 1, + 'msubsup' => 1, + 'mtable' => 1, + 'mtd' => 1, + 'mtext' => 1, + 'mtr' => 1, + 'munder' => 1, + 'munderover' => 1, + ); + + /** + * The svg elements. + * + * The Mozilla documentation has a good list at https://developer.mozilla.org/en-US/docs/SVG/Element. + * The w3c list appears to be lacking in some areas like filter effect elements. + * That list can be found at http://www.w3.org/wiki/SVG/Elements. + * + * Note, FireFox appears to do a better job rendering filter effects than chrome. + * While they are in the spec I'm not sure how widely implemented they are. + * + * @var array + */ + public static $svg = array( + 'a' => 1, + 'altGlyph' => 1, + 'altGlyphDef' => 1, + 'altGlyphItem' => 1, + 'animate' => 1, + 'animateColor' => 1, + 'animateMotion' => 1, + 'animateTransform' => 1, + 'circle' => 1, + 'clipPath' => 1, + 'color-profile' => 1, + 'cursor' => 1, + 'defs' => 1, + 'desc' => 1, + 'ellipse' => 1, + 'feBlend' => 1, + 'feColorMatrix' => 1, + 'feComponentTransfer' => 1, + 'feComposite' => 1, + 'feConvolveMatrix' => 1, + 'feDiffuseLighting' => 1, + 'feDisplacementMap' => 1, + 'feDistantLight' => 1, + 'feFlood' => 1, + 'feFuncA' => 1, + 'feFuncB' => 1, + 'feFuncG' => 1, + 'feFuncR' => 1, + 'feGaussianBlur' => 1, + 'feImage' => 1, + 'feMerge' => 1, + 'feMergeNode' => 1, + 'feMorphology' => 1, + 'feOffset' => 1, + 'fePointLight' => 1, + 'feSpecularLighting' => 1, + 'feSpotLight' => 1, + 'feTile' => 1, + 'feTurbulence' => 1, + 'filter' => 1, + 'font' => 1, + 'font-face' => 1, + 'font-face-format' => 1, + 'font-face-name' => 1, + 'font-face-src' => 1, + 'font-face-uri' => 1, + 'foreignObject' => 1, + 'g' => 1, + 'glyph' => 1, + 'glyphRef' => 1, + 'hkern' => 1, + 'image' => 1, + 'line' => 1, + 'linearGradient' => 1, + 'marker' => 1, + 'mask' => 1, + 'metadata' => 1, + 'missing-glyph' => 1, + 'mpath' => 1, + 'path' => 1, + 'pattern' => 1, + 'polygon' => 1, + 'polyline' => 1, + 'radialGradient' => 1, + 'rect' => 1, + 'script' => 3, // NORMAL | RAW_TEXT + 'set' => 1, + 'stop' => 1, + 'style' => 3, // NORMAL | RAW_TEXT + 'svg' => 1, + 'switch' => 1, + 'symbol' => 1, + 'text' => 1, + 'textPath' => 1, + 'title' => 1, + 'tref' => 1, + 'tspan' => 1, + 'use' => 1, + 'view' => 1, + 'vkern' => 1, + ); + + /** + * Some attributes in SVG are case sensitive. + * + * This map contains key/value pairs with the key as the lowercase attribute + * name and the value with the correct casing. + */ + public static $svgCaseSensitiveAttributeMap = array( + 'attributename' => 'attributeName', + 'attributetype' => 'attributeType', + 'basefrequency' => 'baseFrequency', + 'baseprofile' => 'baseProfile', + 'calcmode' => 'calcMode', + 'clippathunits' => 'clipPathUnits', + 'contentscripttype' => 'contentScriptType', + 'contentstyletype' => 'contentStyleType', + 'diffuseconstant' => 'diffuseConstant', + 'edgemode' => 'edgeMode', + 'externalresourcesrequired' => 'externalResourcesRequired', + 'filterres' => 'filterRes', + 'filterunits' => 'filterUnits', + 'glyphref' => 'glyphRef', + 'gradienttransform' => 'gradientTransform', + 'gradientunits' => 'gradientUnits', + 'kernelmatrix' => 'kernelMatrix', + 'kernelunitlength' => 'kernelUnitLength', + 'keypoints' => 'keyPoints', + 'keysplines' => 'keySplines', + 'keytimes' => 'keyTimes', + 'lengthadjust' => 'lengthAdjust', + 'limitingconeangle' => 'limitingConeAngle', + 'markerheight' => 'markerHeight', + 'markerunits' => 'markerUnits', + 'markerwidth' => 'markerWidth', + 'maskcontentunits' => 'maskContentUnits', + 'maskunits' => 'maskUnits', + 'numoctaves' => 'numOctaves', + 'pathlength' => 'pathLength', + 'patterncontentunits' => 'patternContentUnits', + 'patterntransform' => 'patternTransform', + 'patternunits' => 'patternUnits', + 'pointsatx' => 'pointsAtX', + 'pointsaty' => 'pointsAtY', + 'pointsatz' => 'pointsAtZ', + 'preservealpha' => 'preserveAlpha', + 'preserveaspectratio' => 'preserveAspectRatio', + 'primitiveunits' => 'primitiveUnits', + 'refx' => 'refX', + 'refy' => 'refY', + 'repeatcount' => 'repeatCount', + 'repeatdur' => 'repeatDur', + 'requiredextensions' => 'requiredExtensions', + 'requiredfeatures' => 'requiredFeatures', + 'specularconstant' => 'specularConstant', + 'specularexponent' => 'specularExponent', + 'spreadmethod' => 'spreadMethod', + 'startoffset' => 'startOffset', + 'stddeviation' => 'stdDeviation', + 'stitchtiles' => 'stitchTiles', + 'surfacescale' => 'surfaceScale', + 'systemlanguage' => 'systemLanguage', + 'tablevalues' => 'tableValues', + 'targetx' => 'targetX', + 'targety' => 'targetY', + 'textlength' => 'textLength', + 'viewbox' => 'viewBox', + 'viewtarget' => 'viewTarget', + 'xchannelselector' => 'xChannelSelector', + 'ychannelselector' => 'yChannelSelector', + 'zoomandpan' => 'zoomAndPan', + ); + + /** + * Some SVG elements are case sensitive. + * This map contains these. + * + * The map contains key/value store of the name is lowercase as the keys and + * the correct casing as the value. + */ + public static $svgCaseSensitiveElementMap = array( + 'altglyph' => 'altGlyph', + 'altglyphdef' => 'altGlyphDef', + 'altglyphitem' => 'altGlyphItem', + 'animatecolor' => 'animateColor', + 'animatemotion' => 'animateMotion', + 'animatetransform' => 'animateTransform', + 'clippath' => 'clipPath', + 'feblend' => 'feBlend', + 'fecolormatrix' => 'feColorMatrix', + 'fecomponenttransfer' => 'feComponentTransfer', + 'fecomposite' => 'feComposite', + 'feconvolvematrix' => 'feConvolveMatrix', + 'fediffuselighting' => 'feDiffuseLighting', + 'fedisplacementmap' => 'feDisplacementMap', + 'fedistantlight' => 'feDistantLight', + 'feflood' => 'feFlood', + 'fefunca' => 'feFuncA', + 'fefuncb' => 'feFuncB', + 'fefuncg' => 'feFuncG', + 'fefuncr' => 'feFuncR', + 'fegaussianblur' => 'feGaussianBlur', + 'feimage' => 'feImage', + 'femerge' => 'feMerge', + 'femergenode' => 'feMergeNode', + 'femorphology' => 'feMorphology', + 'feoffset' => 'feOffset', + 'fepointlight' => 'fePointLight', + 'fespecularlighting' => 'feSpecularLighting', + 'fespotlight' => 'feSpotLight', + 'fetile' => 'feTile', + 'feturbulence' => 'feTurbulence', + 'foreignobject' => 'foreignObject', + 'glyphref' => 'glyphRef', + 'lineargradient' => 'linearGradient', + 'radialgradient' => 'radialGradient', + 'textpath' => 'textPath', + ); + + /** + * Check whether the given element meets the given criterion. + * + * Example: + * + * Elements::isA('script', Elements::TEXT_RAW); // Returns true. + * + * Elements::isA('script', Elements::TEXT_RCDATA); // Returns false. + * + * @param string $name The element name. + * @param int $mask One of the constants on this class. + * + * @return bool true if the element matches the mask, false otherwise. + */ + public static function isA($name, $mask) + { + return (static::element($name) & $mask) === $mask; + } + + /** + * Test if an element is a valid html5 element. + * + * @param string $name The name of the element. + * + * @return bool true if a html5 element and false otherwise. + */ + public static function isHtml5Element($name) + { + // html5 element names are case insensitive. Forcing lowercase for the check. + // Do we need this check or will all data passed here already be lowercase? + return isset(static::$html5[strtolower($name)]); + } + + /** + * Test if an element name is a valid MathML presentation element. + * + * @param string $name The name of the element. + * + * @return bool true if a MathML name and false otherwise. + */ + public static function isMathMLElement($name) + { + // MathML is case-sensitive unlike html5 elements. + return isset(static::$mathml[$name]); + } + + /** + * Test if an element is a valid SVG element. + * + * @param string $name The name of the element. + * + * @return bool true if a SVG element and false otherise. + */ + public static function isSvgElement($name) + { + // SVG is case-sensitive unlike html5 elements. + return isset(static::$svg[$name]); + } + + /** + * Is an element name valid in an html5 document. + * This includes html5 elements along with other allowed embedded content + * such as svg and mathml. + * + * @param string $name The name of the element. + * + * @return bool true if valid and false otherwise. + */ + public static function isElement($name) + { + return static::isHtml5Element($name) || static::isMathMLElement($name) || static::isSvgElement($name); + } + + /** + * Get the element mask for the given element name. + * + * @param string $name The name of the element. + * + * @return int the element mask. + */ + public static function element($name) + { + if (isset(static::$html5[$name])) { + return static::$html5[$name]; + } + if (isset(static::$svg[$name])) { + return static::$svg[$name]; + } + if (isset(static::$mathml[$name])) { + return static::$mathml[$name]; + } + + return 0; + } + + /** + * Normalize a SVG element name to its proper case and form. + * + * @param string $name The name of the element. + * + * @return string the normalized form of the element name. + */ + public static function normalizeSvgElement($name) + { + $name = strtolower($name); + if (isset(static::$svgCaseSensitiveElementMap[$name])) { + $name = static::$svgCaseSensitiveElementMap[$name]; + } + + return $name; + } + + /** + * Normalize a SVG attribute name to its proper case and form. + * + * @param string $name The name of the attribute. + * + * @return string The normalized form of the attribute name. + */ + public static function normalizeSvgAttribute($name) + { + $name = strtolower($name); + if (isset(static::$svgCaseSensitiveAttributeMap[$name])) { + $name = static::$svgCaseSensitiveAttributeMap[$name]; + } + + return $name; + } + + /** + * Normalize a MathML attribute name to its proper case and form. + * Note, all MathML element names are lowercase. + * + * @param string $name The name of the attribute. + * + * @return string The normalized form of the attribute name. + */ + public static function normalizeMathMlAttribute($name) + { + $name = strtolower($name); + + // Only one attribute has a mixed case form for MathML. + if ('definitionurl' === $name) { + $name = 'definitionURL'; + } + + return $name; + } +} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Entities.php b/dompdf/vendor/masterminds/html5/src/HTML5/Entities.php new file mode 100644 index 0000000..0e7227d --- /dev/null +++ b/dompdf/vendor/masterminds/html5/src/HTML5/Entities.php @@ -0,0 +1,2236 @@ + 'Á', + 'Aacut' => 'Á', + 'aacute' => 'á', + 'aacut' => 'á', + 'Abreve' => 'Ă', + 'abreve' => 'ă', + 'ac' => '∾', + 'acd' => '∿', + 'acE' => '∾̳', + 'Acirc' => 'Â', + 'Acir' => 'Â', + 'acirc' => 'â', + 'acir' => 'â', + 'acute' => '´', + 'acut' => '´', + 'Acy' => 'А', + 'acy' => 'а', + 'AElig' => 'Æ', + 'AEli' => 'Æ', + 'aelig' => 'æ', + 'aeli' => 'æ', + 'af' => '⁡', + 'Afr' => '𝔄', + 'afr' => '𝔞', + 'Agrave' => 'À', + 'Agrav' => 'À', + 'agrave' => 'à', + 'agrav' => 'à', + 'alefsym' => 'ℵ', + 'aleph' => 'ℵ', + 'Alpha' => 'Α', + 'alpha' => 'α', + 'Amacr' => 'Ā', + 'amacr' => 'ā', + 'amalg' => '⨿', + 'AMP' => '&', + 'AM' => '&', + 'amp' => '&', + 'am' => '&', + 'And' => '⩓', + 'and' => '∧', + 'andand' => '⩕', + 'andd' => '⩜', + 'andslope' => '⩘', + 'andv' => '⩚', + 'ang' => '∠', + 'ange' => '⦤', + 'angle' => '∠', + 'angmsd' => '∡', + 'angmsdaa' => '⦨', + 'angmsdab' => '⦩', + 'angmsdac' => '⦪', + 'angmsdad' => '⦫', + 'angmsdae' => '⦬', + 'angmsdaf' => '⦭', + 'angmsdag' => '⦮', + 'angmsdah' => '⦯', + 'angrt' => '∟', + 'angrtvb' => '⊾', + 'angrtvbd' => '⦝', + 'angsph' => '∢', + 'angst' => 'Å', + 'angzarr' => '⍼', + 'Aogon' => 'Ą', + 'aogon' => 'ą', + 'Aopf' => '𝔸', + 'aopf' => '𝕒', + 'ap' => '≈', + 'apacir' => '⩯', + 'apE' => '⩰', + 'ape' => '≊', + 'apid' => '≋', + 'apos' => '\'', + 'ApplyFunction' => '⁡', + 'approx' => '≈', + 'approxeq' => '≊', + 'Aring' => 'Å', + 'Arin' => 'Å', + 'aring' => 'å', + 'arin' => 'å', + 'Ascr' => '𝒜', + 'ascr' => '𝒶', + 'Assign' => '≔', + 'ast' => '*', + 'asymp' => '≈', + 'asympeq' => '≍', + 'Atilde' => 'Ã', + 'Atild' => 'Ã', + 'atilde' => 'ã', + 'atild' => 'ã', + 'Auml' => 'Ä', + 'Aum' => 'Ä', + 'auml' => 'ä', + 'aum' => 'ä', + 'awconint' => '∳', + 'awint' => '⨑', + 'backcong' => '≌', + 'backepsilon' => '϶', + 'backprime' => '‵', + 'backsim' => '∽', + 'backsimeq' => '⋍', + 'Backslash' => '∖', + 'Barv' => '⫧', + 'barvee' => '⊽', + 'Barwed' => '⌆', + 'barwed' => '⌅', + 'barwedge' => '⌅', + 'bbrk' => '⎵', + 'bbrktbrk' => '⎶', + 'bcong' => '≌', + 'Bcy' => 'Б', + 'bcy' => 'б', + 'bdquo' => '„', + 'becaus' => '∵', + 'Because' => '∵', + 'because' => '∵', + 'bemptyv' => '⦰', + 'bepsi' => '϶', + 'bernou' => 'ℬ', + 'Bernoullis' => 'ℬ', + 'Beta' => 'Β', + 'beta' => 'β', + 'beth' => 'ℶ', + 'between' => '≬', + 'Bfr' => '𝔅', + 'bfr' => '𝔟', + 'bigcap' => '⋂', + 'bigcirc' => '◯', + 'bigcup' => '⋃', + 'bigodot' => '⨀', + 'bigoplus' => '⨁', + 'bigotimes' => '⨂', + 'bigsqcup' => '⨆', + 'bigstar' => '★', + 'bigtriangledown' => '▽', + 'bigtriangleup' => '△', + 'biguplus' => '⨄', + 'bigvee' => '⋁', + 'bigwedge' => '⋀', + 'bkarow' => '⤍', + 'blacklozenge' => '⧫', + 'blacksquare' => '▪', + 'blacktriangle' => '▴', + 'blacktriangledown' => '▾', + 'blacktriangleleft' => '◂', + 'blacktriangleright' => '▸', + 'blank' => '␣', + 'blk12' => '▒', + 'blk14' => '░', + 'blk34' => '▓', + 'block' => '█', + 'bne' => '=⃥', + 'bnequiv' => '≡⃥', + 'bNot' => '⫭', + 'bnot' => '⌐', + 'Bopf' => '𝔹', + 'bopf' => '𝕓', + 'bot' => '⊥', + 'bottom' => '⊥', + 'bowtie' => '⋈', + 'boxbox' => '⧉', + 'boxDL' => '╗', + 'boxDl' => '╖', + 'boxdL' => '╕', + 'boxdl' => '┐', + 'boxDR' => '╔', + 'boxDr' => '╓', + 'boxdR' => '╒', + 'boxdr' => '┌', + 'boxH' => '═', + 'boxh' => '─', + 'boxHD' => '╦', + 'boxHd' => '╤', + 'boxhD' => '╥', + 'boxhd' => '┬', + 'boxHU' => '╩', + 'boxHu' => '╧', + 'boxhU' => '╨', + 'boxhu' => '┴', + 'boxminus' => '⊟', + 'boxplus' => '⊞', + 'boxtimes' => '⊠', + 'boxUL' => '╝', + 'boxUl' => '╜', + 'boxuL' => '╛', + 'boxul' => '┘', + 'boxUR' => '╚', + 'boxUr' => '╙', + 'boxuR' => '╘', + 'boxur' => '└', + 'boxV' => '║', + 'boxv' => '│', + 'boxVH' => '╬', + 'boxVh' => '╫', + 'boxvH' => '╪', + 'boxvh' => '┼', + 'boxVL' => '╣', + 'boxVl' => '╢', + 'boxvL' => '╡', + 'boxvl' => '┤', + 'boxVR' => '╠', + 'boxVr' => '╟', + 'boxvR' => '╞', + 'boxvr' => '├', + 'bprime' => '‵', + 'Breve' => '˘', + 'breve' => '˘', + 'brvbar' => '¦', + 'brvba' => '¦', + 'Bscr' => 'ℬ', + 'bscr' => '𝒷', + 'bsemi' => '⁏', + 'bsim' => '∽', + 'bsime' => '⋍', + 'bsol' => '\\', + 'bsolb' => '⧅', + 'bsolhsub' => '⟈', + 'bull' => '•', + 'bullet' => '•', + 'bump' => '≎', + 'bumpE' => '⪮', + 'bumpe' => '≏', + 'Bumpeq' => '≎', + 'bumpeq' => '≏', + 'Cacute' => 'Ć', + 'cacute' => 'ć', + 'Cap' => '⋒', + 'cap' => '∩', + 'capand' => '⩄', + 'capbrcup' => '⩉', + 'capcap' => '⩋', + 'capcup' => '⩇', + 'capdot' => '⩀', + 'CapitalDifferentialD' => 'ⅅ', + 'caps' => '∩︀', + 'caret' => '⁁', + 'caron' => 'ˇ', + 'Cayleys' => 'ℭ', + 'ccaps' => '⩍', + 'Ccaron' => 'Č', + 'ccaron' => 'č', + 'Ccedil' => 'Ç', + 'Ccedi' => 'Ç', + 'ccedil' => 'ç', + 'ccedi' => 'ç', + 'Ccirc' => 'Ĉ', + 'ccirc' => 'ĉ', + 'Cconint' => '∰', + 'ccups' => '⩌', + 'ccupssm' => '⩐', + 'Cdot' => 'Ċ', + 'cdot' => 'ċ', + 'cedil' => '¸', + 'cedi' => '¸', + 'Cedilla' => '¸', + 'cemptyv' => '⦲', + 'cent' => '¢', + 'cen' => '¢', + 'CenterDot' => '·', + 'centerdot' => '·', + 'Cfr' => 'ℭ', + 'cfr' => '𝔠', + 'CHcy' => 'Ч', + 'chcy' => 'ч', + 'check' => '✓', + 'checkmark' => '✓', + 'Chi' => 'Χ', + 'chi' => 'χ', + 'cir' => '○', + 'circ' => 'ˆ', + 'circeq' => '≗', + 'circlearrowleft' => '↺', + 'circlearrowright' => '↻', + 'circledast' => '⊛', + 'circledcirc' => '⊚', + 'circleddash' => '⊝', + 'CircleDot' => '⊙', + 'circledR' => '®', + 'circledS' => 'Ⓢ', + 'CircleMinus' => '⊖', + 'CirclePlus' => '⊕', + 'CircleTimes' => '⊗', + 'cirE' => '⧃', + 'cire' => '≗', + 'cirfnint' => '⨐', + 'cirmid' => '⫯', + 'cirscir' => '⧂', + 'ClockwiseContourIntegral' => '∲', + 'CloseCurlyDoubleQuote' => '”', + 'CloseCurlyQuote' => '’', + 'clubs' => '♣', + 'clubsuit' => '♣', + 'Colon' => '∷', + 'colon' => ':', + 'Colone' => '⩴', + 'colone' => '≔', + 'coloneq' => '≔', + 'comma' => ',', + 'commat' => '@', + 'comp' => '∁', + 'compfn' => '∘', + 'complement' => '∁', + 'complexes' => 'ℂ', + 'cong' => '≅', + 'congdot' => '⩭', + 'Congruent' => '≡', + 'Conint' => '∯', + 'conint' => '∮', + 'ContourIntegral' => '∮', + 'Copf' => 'ℂ', + 'copf' => '𝕔', + 'coprod' => '∐', + 'Coproduct' => '∐', + 'COPY' => '©', + 'COP' => '©', + 'copy' => '©', + 'cop' => '©', + 'copysr' => '℗', + 'CounterClockwiseContourIntegral' => '∳', + 'crarr' => '↵', + 'Cross' => '⨯', + 'cross' => '✗', + 'Cscr' => '𝒞', + 'cscr' => '𝒸', + 'csub' => '⫏', + 'csube' => '⫑', + 'csup' => '⫐', + 'csupe' => '⫒', + 'ctdot' => '⋯', + 'cudarrl' => '⤸', + 'cudarrr' => '⤵', + 'cuepr' => '⋞', + 'cuesc' => '⋟', + 'cularr' => '↶', + 'cularrp' => '⤽', + 'Cup' => '⋓', + 'cup' => '∪', + 'cupbrcap' => '⩈', + 'CupCap' => '≍', + 'cupcap' => '⩆', + 'cupcup' => '⩊', + 'cupdot' => '⊍', + 'cupor' => '⩅', + 'cups' => '∪︀', + 'curarr' => '↷', + 'curarrm' => '⤼', + 'curlyeqprec' => '⋞', + 'curlyeqsucc' => '⋟', + 'curlyvee' => '⋎', + 'curlywedge' => '⋏', + 'curren' => '¤', + 'curre' => '¤', + 'curvearrowleft' => '↶', + 'curvearrowright' => '↷', + 'cuvee' => '⋎', + 'cuwed' => '⋏', + 'cwconint' => '∲', + 'cwint' => '∱', + 'cylcty' => '⌭', + 'Dagger' => '‡', + 'dagger' => '†', + 'daleth' => 'ℸ', + 'Darr' => '↡', + 'dArr' => '⇓', + 'darr' => '↓', + 'dash' => '‐', + 'Dashv' => '⫤', + 'dashv' => '⊣', + 'dbkarow' => '⤏', + 'dblac' => '˝', + 'Dcaron' => 'Ď', + 'dcaron' => 'ď', + 'Dcy' => 'Д', + 'dcy' => 'д', + 'DD' => 'ⅅ', + 'dd' => 'ⅆ', + 'ddagger' => '‡', + 'ddarr' => '⇊', + 'DDotrahd' => '⤑', + 'ddotseq' => '⩷', + 'deg' => '°', + 'de' => '°', + 'Del' => '∇', + 'Delta' => 'Δ', + 'delta' => 'δ', + 'demptyv' => '⦱', + 'dfisht' => '⥿', + 'Dfr' => '𝔇', + 'dfr' => '𝔡', + 'dHar' => '⥥', + 'dharl' => '⇃', + 'dharr' => '⇂', + 'DiacriticalAcute' => '´', + 'DiacriticalDot' => '˙', + 'DiacriticalDoubleAcute' => '˝', + 'DiacriticalGrave' => '`', + 'DiacriticalTilde' => '˜', + 'diam' => '⋄', + 'Diamond' => '⋄', + 'diamond' => '⋄', + 'diamondsuit' => '♦', + 'diams' => '♦', + 'die' => '¨', + 'DifferentialD' => 'ⅆ', + 'digamma' => 'ϝ', + 'disin' => '⋲', + 'div' => '÷', + 'divide' => '÷', + 'divid' => '÷', + 'divideontimes' => '⋇', + 'divonx' => '⋇', + 'DJcy' => 'Ђ', + 'djcy' => 'ђ', + 'dlcorn' => '⌞', + 'dlcrop' => '⌍', + 'dollar' => '$', + 'Dopf' => '𝔻', + 'dopf' => '𝕕', + 'Dot' => '¨', + 'dot' => '˙', + 'DotDot' => '⃜', + 'doteq' => '≐', + 'doteqdot' => '≑', + 'DotEqual' => '≐', + 'dotminus' => '∸', + 'dotplus' => '∔', + 'dotsquare' => '⊡', + 'doublebarwedge' => '⌆', + 'DoubleContourIntegral' => '∯', + 'DoubleDot' => '¨', + 'DoubleDownArrow' => '⇓', + 'DoubleLeftArrow' => '⇐', + 'DoubleLeftRightArrow' => '⇔', + 'DoubleLeftTee' => '⫤', + 'DoubleLongLeftArrow' => '⟸', + 'DoubleLongLeftRightArrow' => '⟺', + 'DoubleLongRightArrow' => '⟹', + 'DoubleRightArrow' => '⇒', + 'DoubleRightTee' => '⊨', + 'DoubleUpArrow' => '⇑', + 'DoubleUpDownArrow' => '⇕', + 'DoubleVerticalBar' => '∥', + 'DownArrow' => '↓', + 'Downarrow' => '⇓', + 'downarrow' => '↓', + 'DownArrowBar' => '⤓', + 'DownArrowUpArrow' => '⇵', + 'DownBreve' => '̑', + 'downdownarrows' => '⇊', + 'downharpoonleft' => '⇃', + 'downharpoonright' => '⇂', + 'DownLeftRightVector' => '⥐', + 'DownLeftTeeVector' => '⥞', + 'DownLeftVector' => '↽', + 'DownLeftVectorBar' => '⥖', + 'DownRightTeeVector' => '⥟', + 'DownRightVector' => '⇁', + 'DownRightVectorBar' => '⥗', + 'DownTee' => '⊤', + 'DownTeeArrow' => '↧', + 'drbkarow' => '⤐', + 'drcorn' => '⌟', + 'drcrop' => '⌌', + 'Dscr' => '𝒟', + 'dscr' => '𝒹', + 'DScy' => 'Ѕ', + 'dscy' => 'ѕ', + 'dsol' => '⧶', + 'Dstrok' => 'Đ', + 'dstrok' => 'đ', + 'dtdot' => '⋱', + 'dtri' => '▿', + 'dtrif' => '▾', + 'duarr' => '⇵', + 'duhar' => '⥯', + 'dwangle' => '⦦', + 'DZcy' => 'Џ', + 'dzcy' => 'џ', + 'dzigrarr' => '⟿', + 'Eacute' => 'É', + 'Eacut' => 'É', + 'eacute' => 'é', + 'eacut' => 'é', + 'easter' => '⩮', + 'Ecaron' => 'Ě', + 'ecaron' => 'ě', + 'ecir' => 'ê', + 'Ecirc' => 'Ê', + 'Ecir' => 'Ê', + 'ecirc' => 'ê', + 'ecolon' => '≕', + 'Ecy' => 'Э', + 'ecy' => 'э', + 'eDDot' => '⩷', + 'Edot' => 'Ė', + 'eDot' => '≑', + 'edot' => 'ė', + 'ee' => 'ⅇ', + 'efDot' => '≒', + 'Efr' => '𝔈', + 'efr' => '𝔢', + 'eg' => '⪚', + 'Egrave' => 'È', + 'Egrav' => 'È', + 'egrave' => 'è', + 'egrav' => 'è', + 'egs' => '⪖', + 'egsdot' => '⪘', + 'el' => '⪙', + 'Element' => '∈', + 'elinters' => '⏧', + 'ell' => 'ℓ', + 'els' => '⪕', + 'elsdot' => '⪗', + 'Emacr' => 'Ē', + 'emacr' => 'ē', + 'empty' => '∅', + 'emptyset' => '∅', + 'EmptySmallSquare' => '◻', + 'emptyv' => '∅', + 'EmptyVerySmallSquare' => '▫', + 'emsp' => ' ', + 'emsp13' => ' ', + 'emsp14' => ' ', + 'ENG' => 'Ŋ', + 'eng' => 'ŋ', + 'ensp' => ' ', + 'Eogon' => 'Ę', + 'eogon' => 'ę', + 'Eopf' => '𝔼', + 'eopf' => '𝕖', + 'epar' => '⋕', + 'eparsl' => '⧣', + 'eplus' => '⩱', + 'epsi' => 'ε', + 'Epsilon' => 'Ε', + 'epsilon' => 'ε', + 'epsiv' => 'ϵ', + 'eqcirc' => '≖', + 'eqcolon' => '≕', + 'eqsim' => '≂', + 'eqslantgtr' => '⪖', + 'eqslantless' => '⪕', + 'Equal' => '⩵', + 'equals' => '=', + 'EqualTilde' => '≂', + 'equest' => '≟', + 'Equilibrium' => '⇌', + 'equiv' => '≡', + 'equivDD' => '⩸', + 'eqvparsl' => '⧥', + 'erarr' => '⥱', + 'erDot' => '≓', + 'Escr' => 'ℰ', + 'escr' => 'ℯ', + 'esdot' => '≐', + 'Esim' => '⩳', + 'esim' => '≂', + 'Eta' => 'Η', + 'eta' => 'η', + 'ETH' => 'Ð', + 'ET' => 'Ð', + 'eth' => 'ð', + 'et' => 'ð', + 'Euml' => 'Ë', + 'Eum' => 'Ë', + 'euml' => 'ë', + 'eum' => 'ë', + 'euro' => '€', + 'excl' => '!', + 'exist' => '∃', + 'Exists' => '∃', + 'expectation' => 'ℰ', + 'ExponentialE' => 'ⅇ', + 'exponentiale' => 'ⅇ', + 'fallingdotseq' => '≒', + 'Fcy' => 'Ф', + 'fcy' => 'ф', + 'female' => '♀', + 'ffilig' => 'ffi', + 'fflig' => 'ff', + 'ffllig' => 'ffl', + 'Ffr' => '𝔉', + 'ffr' => '𝔣', + 'filig' => 'fi', + 'FilledSmallSquare' => '◼', + 'FilledVerySmallSquare' => '▪', + 'fjlig' => 'fj', + 'flat' => '♭', + 'fllig' => 'fl', + 'fltns' => '▱', + 'fnof' => 'ƒ', + 'Fopf' => '𝔽', + 'fopf' => '𝕗', + 'ForAll' => '∀', + 'forall' => '∀', + 'fork' => '⋔', + 'forkv' => '⫙', + 'Fouriertrf' => 'ℱ', + 'fpartint' => '⨍', + 'frac12' => '½', + 'frac1' => '¼', + 'frac13' => '⅓', + 'frac14' => '¼', + 'frac15' => '⅕', + 'frac16' => '⅙', + 'frac18' => '⅛', + 'frac23' => '⅔', + 'frac25' => '⅖', + 'frac34' => '¾', + 'frac3' => '¾', + 'frac35' => '⅗', + 'frac38' => '⅜', + 'frac45' => '⅘', + 'frac56' => '⅚', + 'frac58' => '⅝', + 'frac78' => '⅞', + 'frasl' => '⁄', + 'frown' => '⌢', + 'Fscr' => 'ℱ', + 'fscr' => '𝒻', + 'gacute' => 'ǵ', + 'Gamma' => 'Γ', + 'gamma' => 'γ', + 'Gammad' => 'Ϝ', + 'gammad' => 'ϝ', + 'gap' => '⪆', + 'Gbreve' => 'Ğ', + 'gbreve' => 'ğ', + 'Gcedil' => 'Ģ', + 'Gcirc' => 'Ĝ', + 'gcirc' => 'ĝ', + 'Gcy' => 'Г', + 'gcy' => 'г', + 'Gdot' => 'Ġ', + 'gdot' => 'ġ', + 'gE' => '≧', + 'ge' => '≥', + 'gEl' => '⪌', + 'gel' => '⋛', + 'geq' => '≥', + 'geqq' => '≧', + 'geqslant' => '⩾', + 'ges' => '⩾', + 'gescc' => '⪩', + 'gesdot' => '⪀', + 'gesdoto' => '⪂', + 'gesdotol' => '⪄', + 'gesl' => '⋛︀', + 'gesles' => '⪔', + 'Gfr' => '𝔊', + 'gfr' => '𝔤', + 'Gg' => '⋙', + 'gg' => '≫', + 'ggg' => '⋙', + 'gimel' => 'ℷ', + 'GJcy' => 'Ѓ', + 'gjcy' => 'ѓ', + 'gl' => '≷', + 'gla' => '⪥', + 'glE' => '⪒', + 'glj' => '⪤', + 'gnap' => '⪊', + 'gnapprox' => '⪊', + 'gnE' => '≩', + 'gne' => '⪈', + 'gneq' => '⪈', + 'gneqq' => '≩', + 'gnsim' => '⋧', + 'Gopf' => '𝔾', + 'gopf' => '𝕘', + 'grave' => '`', + 'GreaterEqual' => '≥', + 'GreaterEqualLess' => '⋛', + 'GreaterFullEqual' => '≧', + 'GreaterGreater' => '⪢', + 'GreaterLess' => '≷', + 'GreaterSlantEqual' => '⩾', + 'GreaterTilde' => '≳', + 'Gscr' => '𝒢', + 'gscr' => 'ℊ', + 'gsim' => '≳', + 'gsime' => '⪎', + 'gsiml' => '⪐', + 'GT' => '>', + 'G' => '>', + 'Gt' => '≫', + 'gt' => '>', + 'g' => '>', + 'gtcc' => '⪧', + 'gtcir' => '⩺', + 'gtdot' => '⋗', + 'gtlPar' => '⦕', + 'gtquest' => '⩼', + 'gtrapprox' => '⪆', + 'gtrarr' => '⥸', + 'gtrdot' => '⋗', + 'gtreqless' => '⋛', + 'gtreqqless' => '⪌', + 'gtrless' => '≷', + 'gtrsim' => '≳', + 'gvertneqq' => '≩︀', + 'gvnE' => '≩︀', + 'Hacek' => 'ˇ', + 'hairsp' => ' ', + 'half' => '½', + 'hamilt' => 'ℋ', + 'HARDcy' => 'Ъ', + 'hardcy' => 'ъ', + 'hArr' => '⇔', + 'harr' => '↔', + 'harrcir' => '⥈', + 'harrw' => '↭', + 'Hat' => '^', + 'hbar' => 'ℏ', + 'Hcirc' => 'Ĥ', + 'hcirc' => 'ĥ', + 'hearts' => '♥', + 'heartsuit' => '♥', + 'hellip' => '…', + 'hercon' => '⊹', + 'Hfr' => 'ℌ', + 'hfr' => '𝔥', + 'HilbertSpace' => 'ℋ', + 'hksearow' => '⤥', + 'hkswarow' => '⤦', + 'hoarr' => '⇿', + 'homtht' => '∻', + 'hookleftarrow' => '↩', + 'hookrightarrow' => '↪', + 'Hopf' => 'ℍ', + 'hopf' => '𝕙', + 'horbar' => '―', + 'HorizontalLine' => '─', + 'Hscr' => 'ℋ', + 'hscr' => '𝒽', + 'hslash' => 'ℏ', + 'Hstrok' => 'Ħ', + 'hstrok' => 'ħ', + 'HumpDownHump' => '≎', + 'HumpEqual' => '≏', + 'hybull' => '⁃', + 'hyphen' => '‐', + 'Iacute' => 'Í', + 'Iacut' => 'Í', + 'iacute' => 'í', + 'iacut' => 'í', + 'ic' => '⁣', + 'Icirc' => 'Î', + 'Icir' => 'Î', + 'icirc' => 'î', + 'icir' => 'î', + 'Icy' => 'И', + 'icy' => 'и', + 'Idot' => 'İ', + 'IEcy' => 'Е', + 'iecy' => 'е', + 'iexcl' => '¡', + 'iexc' => '¡', + 'iff' => '⇔', + 'Ifr' => 'ℑ', + 'ifr' => '𝔦', + 'Igrave' => 'Ì', + 'Igrav' => 'Ì', + 'igrave' => 'ì', + 'igrav' => 'ì', + 'ii' => 'ⅈ', + 'iiiint' => '⨌', + 'iiint' => '∭', + 'iinfin' => '⧜', + 'iiota' => '℩', + 'IJlig' => 'IJ', + 'ijlig' => 'ij', + 'Im' => 'ℑ', + 'Imacr' => 'Ī', + 'imacr' => 'ī', + 'image' => 'ℑ', + 'ImaginaryI' => 'ⅈ', + 'imagline' => 'ℐ', + 'imagpart' => 'ℑ', + 'imath' => 'ı', + 'imof' => '⊷', + 'imped' => 'Ƶ', + 'Implies' => '⇒', + 'in' => '∈', + 'incare' => '℅', + 'infin' => '∞', + 'infintie' => '⧝', + 'inodot' => 'ı', + 'Int' => '∬', + 'int' => '∫', + 'intcal' => '⊺', + 'integers' => 'ℤ', + 'Integral' => '∫', + 'intercal' => '⊺', + 'Intersection' => '⋂', + 'intlarhk' => '⨗', + 'intprod' => '⨼', + 'InvisibleComma' => '⁣', + 'InvisibleTimes' => '⁢', + 'IOcy' => 'Ё', + 'iocy' => 'ё', + 'Iogon' => 'Į', + 'iogon' => 'į', + 'Iopf' => '𝕀', + 'iopf' => '𝕚', + 'Iota' => 'Ι', + 'iota' => 'ι', + 'iprod' => '⨼', + 'iquest' => '¿', + 'iques' => '¿', + 'Iscr' => 'ℐ', + 'iscr' => '𝒾', + 'isin' => '∈', + 'isindot' => '⋵', + 'isinE' => '⋹', + 'isins' => '⋴', + 'isinsv' => '⋳', + 'isinv' => '∈', + 'it' => '⁢', + 'Itilde' => 'Ĩ', + 'itilde' => 'ĩ', + 'Iukcy' => 'І', + 'iukcy' => 'і', + 'Iuml' => 'Ï', + 'Ium' => 'Ï', + 'iuml' => 'ï', + 'ium' => 'ï', + 'Jcirc' => 'Ĵ', + 'jcirc' => 'ĵ', + 'Jcy' => 'Й', + 'jcy' => 'й', + 'Jfr' => '𝔍', + 'jfr' => '𝔧', + 'jmath' => 'ȷ', + 'Jopf' => '𝕁', + 'jopf' => '𝕛', + 'Jscr' => '𝒥', + 'jscr' => '𝒿', + 'Jsercy' => 'Ј', + 'jsercy' => 'ј', + 'Jukcy' => 'Є', + 'jukcy' => 'є', + 'Kappa' => 'Κ', + 'kappa' => 'κ', + 'kappav' => 'ϰ', + 'Kcedil' => 'Ķ', + 'kcedil' => 'ķ', + 'Kcy' => 'К', + 'kcy' => 'к', + 'Kfr' => '𝔎', + 'kfr' => '𝔨', + 'kgreen' => 'ĸ', + 'KHcy' => 'Х', + 'khcy' => 'х', + 'KJcy' => 'Ќ', + 'kjcy' => 'ќ', + 'Kopf' => '𝕂', + 'kopf' => '𝕜', + 'Kscr' => '𝒦', + 'kscr' => '𝓀', + 'lAarr' => '⇚', + 'Lacute' => 'Ĺ', + 'lacute' => 'ĺ', + 'laemptyv' => '⦴', + 'lagran' => 'ℒ', + 'Lambda' => 'Λ', + 'lambda' => 'λ', + 'Lang' => '⟪', + 'lang' => '⟨', + 'langd' => '⦑', + 'langle' => '⟨', + 'lap' => '⪅', + 'Laplacetrf' => 'ℒ', + 'laquo' => '«', + 'laqu' => '«', + 'Larr' => '↞', + 'lArr' => '⇐', + 'larr' => '←', + 'larrb' => '⇤', + 'larrbfs' => '⤟', + 'larrfs' => '⤝', + 'larrhk' => '↩', + 'larrlp' => '↫', + 'larrpl' => '⤹', + 'larrsim' => '⥳', + 'larrtl' => '↢', + 'lat' => '⪫', + 'lAtail' => '⤛', + 'latail' => '⤙', + 'late' => '⪭', + 'lates' => '⪭︀', + 'lBarr' => '⤎', + 'lbarr' => '⤌', + 'lbbrk' => '❲', + 'lbrace' => '{', + 'lbrack' => '[', + 'lbrke' => '⦋', + 'lbrksld' => '⦏', + 'lbrkslu' => '⦍', + 'Lcaron' => 'Ľ', + 'lcaron' => 'ľ', + 'Lcedil' => 'Ļ', + 'lcedil' => 'ļ', + 'lceil' => '⌈', + 'lcub' => '{', + 'Lcy' => 'Л', + 'lcy' => 'л', + 'ldca' => '⤶', + 'ldquo' => '“', + 'ldquor' => '„', + 'ldrdhar' => '⥧', + 'ldrushar' => '⥋', + 'ldsh' => '↲', + 'lE' => '≦', + 'le' => '≤', + 'LeftAngleBracket' => '⟨', + 'LeftArrow' => '←', + 'Leftarrow' => '⇐', + 'leftarrow' => '←', + 'LeftArrowBar' => '⇤', + 'LeftArrowRightArrow' => '⇆', + 'leftarrowtail' => '↢', + 'LeftCeiling' => '⌈', + 'LeftDoubleBracket' => '⟦', + 'LeftDownTeeVector' => '⥡', + 'LeftDownVector' => '⇃', + 'LeftDownVectorBar' => '⥙', + 'LeftFloor' => '⌊', + 'leftharpoondown' => '↽', + 'leftharpoonup' => '↼', + 'leftleftarrows' => '⇇', + 'LeftRightArrow' => '↔', + 'Leftrightarrow' => '⇔', + 'leftrightarrow' => '↔', + 'leftrightarrows' => '⇆', + 'leftrightharpoons' => '⇋', + 'leftrightsquigarrow' => '↭', + 'LeftRightVector' => '⥎', + 'LeftTee' => '⊣', + 'LeftTeeArrow' => '↤', + 'LeftTeeVector' => '⥚', + 'leftthreetimes' => '⋋', + 'LeftTriangle' => '⊲', + 'LeftTriangleBar' => '⧏', + 'LeftTriangleEqual' => '⊴', + 'LeftUpDownVector' => '⥑', + 'LeftUpTeeVector' => '⥠', + 'LeftUpVector' => '↿', + 'LeftUpVectorBar' => '⥘', + 'LeftVector' => '↼', + 'LeftVectorBar' => '⥒', + 'lEg' => '⪋', + 'leg' => '⋚', + 'leq' => '≤', + 'leqq' => '≦', + 'leqslant' => '⩽', + 'les' => '⩽', + 'lescc' => '⪨', + 'lesdot' => '⩿', + 'lesdoto' => '⪁', + 'lesdotor' => '⪃', + 'lesg' => '⋚︀', + 'lesges' => '⪓', + 'lessapprox' => '⪅', + 'lessdot' => '⋖', + 'lesseqgtr' => '⋚', + 'lesseqqgtr' => '⪋', + 'LessEqualGreater' => '⋚', + 'LessFullEqual' => '≦', + 'LessGreater' => '≶', + 'lessgtr' => '≶', + 'LessLess' => '⪡', + 'lesssim' => '≲', + 'LessSlantEqual' => '⩽', + 'LessTilde' => '≲', + 'lfisht' => '⥼', + 'lfloor' => '⌊', + 'Lfr' => '𝔏', + 'lfr' => '𝔩', + 'lg' => '≶', + 'lgE' => '⪑', + 'lHar' => '⥢', + 'lhard' => '↽', + 'lharu' => '↼', + 'lharul' => '⥪', + 'lhblk' => '▄', + 'LJcy' => 'Љ', + 'ljcy' => 'љ', + 'Ll' => '⋘', + 'll' => '≪', + 'llarr' => '⇇', + 'llcorner' => '⌞', + 'Lleftarrow' => '⇚', + 'llhard' => '⥫', + 'lltri' => '◺', + 'Lmidot' => 'Ŀ', + 'lmidot' => 'ŀ', + 'lmoust' => '⎰', + 'lmoustache' => '⎰', + 'lnap' => '⪉', + 'lnapprox' => '⪉', + 'lnE' => '≨', + 'lne' => '⪇', + 'lneq' => '⪇', + 'lneqq' => '≨', + 'lnsim' => '⋦', + 'loang' => '⟬', + 'loarr' => '⇽', + 'lobrk' => '⟦', + 'LongLeftArrow' => '⟵', + 'Longleftarrow' => '⟸', + 'longleftarrow' => '⟵', + 'LongLeftRightArrow' => '⟷', + 'Longleftrightarrow' => '⟺', + 'longleftrightarrow' => '⟷', + 'longmapsto' => '⟼', + 'LongRightArrow' => '⟶', + 'Longrightarrow' => '⟹', + 'longrightarrow' => '⟶', + 'looparrowleft' => '↫', + 'looparrowright' => '↬', + 'lopar' => '⦅', + 'Lopf' => '𝕃', + 'lopf' => '𝕝', + 'loplus' => '⨭', + 'lotimes' => '⨴', + 'lowast' => '∗', + 'lowbar' => '_', + 'LowerLeftArrow' => '↙', + 'LowerRightArrow' => '↘', + 'loz' => '◊', + 'lozenge' => '◊', + 'lozf' => '⧫', + 'lpar' => '(', + 'lparlt' => '⦓', + 'lrarr' => '⇆', + 'lrcorner' => '⌟', + 'lrhar' => '⇋', + 'lrhard' => '⥭', + 'lrm' => '‎', + 'lrtri' => '⊿', + 'lsaquo' => '‹', + 'Lscr' => 'ℒ', + 'lscr' => '𝓁', + 'Lsh' => '↰', + 'lsh' => '↰', + 'lsim' => '≲', + 'lsime' => '⪍', + 'lsimg' => '⪏', + 'lsqb' => '[', + 'lsquo' => '‘', + 'lsquor' => '‚', + 'Lstrok' => 'Ł', + 'lstrok' => 'ł', + 'LT' => '<', + 'L' => '<', + 'Lt' => '≪', + 'lt' => '<', + 'l' => '<', + 'ltcc' => '⪦', + 'ltcir' => '⩹', + 'ltdot' => '⋖', + 'lthree' => '⋋', + 'ltimes' => '⋉', + 'ltlarr' => '⥶', + 'ltquest' => '⩻', + 'ltri' => '◃', + 'ltrie' => '⊴', + 'ltrif' => '◂', + 'ltrPar' => '⦖', + 'lurdshar' => '⥊', + 'luruhar' => '⥦', + 'lvertneqq' => '≨︀', + 'lvnE' => '≨︀', + 'macr' => '¯', + 'mac' => '¯', + 'male' => '♂', + 'malt' => '✠', + 'maltese' => '✠', + 'Map' => '⤅', + 'map' => '↦', + 'mapsto' => '↦', + 'mapstodown' => '↧', + 'mapstoleft' => '↤', + 'mapstoup' => '↥', + 'marker' => '▮', + 'mcomma' => '⨩', + 'Mcy' => 'М', + 'mcy' => 'м', + 'mdash' => '—', + 'mDDot' => '∺', + 'measuredangle' => '∡', + 'MediumSpace' => ' ', + 'Mellintrf' => 'ℳ', + 'Mfr' => '𝔐', + 'mfr' => '𝔪', + 'mho' => '℧', + 'micro' => 'µ', + 'micr' => 'µ', + 'mid' => '∣', + 'midast' => '*', + 'midcir' => '⫰', + 'middot' => '·', + 'middo' => '·', + 'minus' => '−', + 'minusb' => '⊟', + 'minusd' => '∸', + 'minusdu' => '⨪', + 'MinusPlus' => '∓', + 'mlcp' => '⫛', + 'mldr' => '…', + 'mnplus' => '∓', + 'models' => '⊧', + 'Mopf' => '𝕄', + 'mopf' => '𝕞', + 'mp' => '∓', + 'Mscr' => 'ℳ', + 'mscr' => '𝓂', + 'mstpos' => '∾', + 'Mu' => 'Μ', + 'mu' => 'μ', + 'multimap' => '⊸', + 'mumap' => '⊸', + 'nabla' => '∇', + 'Nacute' => 'Ń', + 'nacute' => 'ń', + 'nang' => '∠⃒', + 'nap' => '≉', + 'napE' => '⩰̸', + 'napid' => '≋̸', + 'napos' => 'ʼn', + 'napprox' => '≉', + 'natur' => '♮', + 'natural' => '♮', + 'naturals' => 'ℕ', + 'nbsp' => ' ', + 'nbs' => ' ', + 'nbump' => '≎̸', + 'nbumpe' => '≏̸', + 'ncap' => '⩃', + 'Ncaron' => 'Ň', + 'ncaron' => 'ň', + 'Ncedil' => 'Ņ', + 'ncedil' => 'ņ', + 'ncong' => '≇', + 'ncongdot' => '⩭̸', + 'ncup' => '⩂', + 'Ncy' => 'Н', + 'ncy' => 'н', + 'ndash' => '–', + 'ne' => '≠', + 'nearhk' => '⤤', + 'neArr' => '⇗', + 'nearr' => '↗', + 'nearrow' => '↗', + 'nedot' => '≐̸', + 'NegativeMediumSpace' => '​', + 'NegativeThickSpace' => '​', + 'NegativeThinSpace' => '​', + 'NegativeVeryThinSpace' => '​', + 'nequiv' => '≢', + 'nesear' => '⤨', + 'nesim' => '≂̸', + 'NestedGreaterGreater' => '≫', + 'NestedLessLess' => '≪', + 'NewLine' => ' +', + 'nexist' => '∄', + 'nexists' => '∄', + 'Nfr' => '𝔑', + 'nfr' => '𝔫', + 'ngE' => '≧̸', + 'nge' => '≱', + 'ngeq' => '≱', + 'ngeqq' => '≧̸', + 'ngeqslant' => '⩾̸', + 'nges' => '⩾̸', + 'nGg' => '⋙̸', + 'ngsim' => '≵', + 'nGt' => '≫⃒', + 'ngt' => '≯', + 'ngtr' => '≯', + 'nGtv' => '≫̸', + 'nhArr' => '⇎', + 'nharr' => '↮', + 'nhpar' => '⫲', + 'ni' => '∋', + 'nis' => '⋼', + 'nisd' => '⋺', + 'niv' => '∋', + 'NJcy' => 'Њ', + 'njcy' => 'њ', + 'nlArr' => '⇍', + 'nlarr' => '↚', + 'nldr' => '‥', + 'nlE' => '≦̸', + 'nle' => '≰', + 'nLeftarrow' => '⇍', + 'nleftarrow' => '↚', + 'nLeftrightarrow' => '⇎', + 'nleftrightarrow' => '↮', + 'nleq' => '≰', + 'nleqq' => '≦̸', + 'nleqslant' => '⩽̸', + 'nles' => '⩽̸', + 'nless' => '≮', + 'nLl' => '⋘̸', + 'nlsim' => '≴', + 'nLt' => '≪⃒', + 'nlt' => '≮', + 'nltri' => '⋪', + 'nltrie' => '⋬', + 'nLtv' => '≪̸', + 'nmid' => '∤', + 'NoBreak' => '⁠', + 'NonBreakingSpace' => ' ', + 'Nopf' => 'ℕ', + 'nopf' => '𝕟', + 'Not' => '⫬', + 'not' => '¬', + 'no' => '¬', + 'NotCongruent' => '≢', + 'NotCupCap' => '≭', + 'NotDoubleVerticalBar' => '∦', + 'NotElement' => '∉', + 'NotEqual' => '≠', + 'NotEqualTilde' => '≂̸', + 'NotExists' => '∄', + 'NotGreater' => '≯', + 'NotGreaterEqual' => '≱', + 'NotGreaterFullEqual' => '≧̸', + 'NotGreaterGreater' => '≫̸', + 'NotGreaterLess' => '≹', + 'NotGreaterSlantEqual' => '⩾̸', + 'NotGreaterTilde' => '≵', + 'NotHumpDownHump' => '≎̸', + 'NotHumpEqual' => '≏̸', + 'notin' => '∉', + 'notindot' => '⋵̸', + 'notinE' => '⋹̸', + 'notinva' => '∉', + 'notinvb' => '⋷', + 'notinvc' => '⋶', + 'NotLeftTriangle' => '⋪', + 'NotLeftTriangleBar' => '⧏̸', + 'NotLeftTriangleEqual' => '⋬', + 'NotLess' => '≮', + 'NotLessEqual' => '≰', + 'NotLessGreater' => '≸', + 'NotLessLess' => '≪̸', + 'NotLessSlantEqual' => '⩽̸', + 'NotLessTilde' => '≴', + 'NotNestedGreaterGreater' => '⪢̸', + 'NotNestedLessLess' => '⪡̸', + 'notni' => '∌', + 'notniva' => '∌', + 'notnivb' => '⋾', + 'notnivc' => '⋽', + 'NotPrecedes' => '⊀', + 'NotPrecedesEqual' => '⪯̸', + 'NotPrecedesSlantEqual' => '⋠', + 'NotReverseElement' => '∌', + 'NotRightTriangle' => '⋫', + 'NotRightTriangleBar' => '⧐̸', + 'NotRightTriangleEqual' => '⋭', + 'NotSquareSubset' => '⊏̸', + 'NotSquareSubsetEqual' => '⋢', + 'NotSquareSuperset' => '⊐̸', + 'NotSquareSupersetEqual' => '⋣', + 'NotSubset' => '⊂⃒', + 'NotSubsetEqual' => '⊈', + 'NotSucceeds' => '⊁', + 'NotSucceedsEqual' => '⪰̸', + 'NotSucceedsSlantEqual' => '⋡', + 'NotSucceedsTilde' => '≿̸', + 'NotSuperset' => '⊃⃒', + 'NotSupersetEqual' => '⊉', + 'NotTilde' => '≁', + 'NotTildeEqual' => '≄', + 'NotTildeFullEqual' => '≇', + 'NotTildeTilde' => '≉', + 'NotVerticalBar' => '∤', + 'npar' => '∦', + 'nparallel' => '∦', + 'nparsl' => '⫽⃥', + 'npart' => '∂̸', + 'npolint' => '⨔', + 'npr' => '⊀', + 'nprcue' => '⋠', + 'npre' => '⪯̸', + 'nprec' => '⊀', + 'npreceq' => '⪯̸', + 'nrArr' => '⇏', + 'nrarr' => '↛', + 'nrarrc' => '⤳̸', + 'nrarrw' => '↝̸', + 'nRightarrow' => '⇏', + 'nrightarrow' => '↛', + 'nrtri' => '⋫', + 'nrtrie' => '⋭', + 'nsc' => '⊁', + 'nsccue' => '⋡', + 'nsce' => '⪰̸', + 'Nscr' => '𝒩', + 'nscr' => '𝓃', + 'nshortmid' => '∤', + 'nshortparallel' => '∦', + 'nsim' => '≁', + 'nsime' => '≄', + 'nsimeq' => '≄', + 'nsmid' => '∤', + 'nspar' => '∦', + 'nsqsube' => '⋢', + 'nsqsupe' => '⋣', + 'nsub' => '⊄', + 'nsubE' => '⫅̸', + 'nsube' => '⊈', + 'nsubset' => '⊂⃒', + 'nsubseteq' => '⊈', + 'nsubseteqq' => '⫅̸', + 'nsucc' => '⊁', + 'nsucceq' => '⪰̸', + 'nsup' => '⊅', + 'nsupE' => '⫆̸', + 'nsupe' => '⊉', + 'nsupset' => '⊃⃒', + 'nsupseteq' => '⊉', + 'nsupseteqq' => '⫆̸', + 'ntgl' => '≹', + 'Ntilde' => 'Ñ', + 'Ntild' => 'Ñ', + 'ntilde' => 'ñ', + 'ntild' => 'ñ', + 'ntlg' => '≸', + 'ntriangleleft' => '⋪', + 'ntrianglelefteq' => '⋬', + 'ntriangleright' => '⋫', + 'ntrianglerighteq' => '⋭', + 'Nu' => 'Ν', + 'nu' => 'ν', + 'num' => '#', + 'numero' => '№', + 'numsp' => ' ', + 'nvap' => '≍⃒', + 'nVDash' => '⊯', + 'nVdash' => '⊮', + 'nvDash' => '⊭', + 'nvdash' => '⊬', + 'nvge' => '≥⃒', + 'nvgt' => '>⃒', + 'nvHarr' => '⤄', + 'nvinfin' => '⧞', + 'nvlArr' => '⤂', + 'nvle' => '≤⃒', + 'nvlt' => '<⃒', + 'nvltrie' => '⊴⃒', + 'nvrArr' => '⤃', + 'nvrtrie' => '⊵⃒', + 'nvsim' => '∼⃒', + 'nwarhk' => '⤣', + 'nwArr' => '⇖', + 'nwarr' => '↖', + 'nwarrow' => '↖', + 'nwnear' => '⤧', + 'Oacute' => 'Ó', + 'Oacut' => 'Ó', + 'oacute' => 'ó', + 'oacut' => 'ó', + 'oast' => '⊛', + 'ocir' => 'ô', + 'Ocirc' => 'Ô', + 'Ocir' => 'Ô', + 'ocirc' => 'ô', + 'Ocy' => 'О', + 'ocy' => 'о', + 'odash' => '⊝', + 'Odblac' => 'Ő', + 'odblac' => 'ő', + 'odiv' => '⨸', + 'odot' => '⊙', + 'odsold' => '⦼', + 'OElig' => 'Œ', + 'oelig' => 'œ', + 'ofcir' => '⦿', + 'Ofr' => '𝔒', + 'ofr' => '𝔬', + 'ogon' => '˛', + 'Ograve' => 'Ò', + 'Ograv' => 'Ò', + 'ograve' => 'ò', + 'ograv' => 'ò', + 'ogt' => '⧁', + 'ohbar' => '⦵', + 'ohm' => 'Ω', + 'oint' => '∮', + 'olarr' => '↺', + 'olcir' => '⦾', + 'olcross' => '⦻', + 'oline' => '‾', + 'olt' => '⧀', + 'Omacr' => 'Ō', + 'omacr' => 'ō', + 'Omega' => 'Ω', + 'omega' => 'ω', + 'Omicron' => 'Ο', + 'omicron' => 'ο', + 'omid' => '⦶', + 'ominus' => '⊖', + 'Oopf' => '𝕆', + 'oopf' => '𝕠', + 'opar' => '⦷', + 'OpenCurlyDoubleQuote' => '“', + 'OpenCurlyQuote' => '‘', + 'operp' => '⦹', + 'oplus' => '⊕', + 'Or' => '⩔', + 'or' => '∨', + 'orarr' => '↻', + 'ord' => 'º', + 'order' => 'ℴ', + 'orderof' => 'ℴ', + 'ordf' => 'ª', + 'ordm' => 'º', + 'origof' => '⊶', + 'oror' => '⩖', + 'orslope' => '⩗', + 'orv' => '⩛', + 'oS' => 'Ⓢ', + 'Oscr' => '𝒪', + 'oscr' => 'ℴ', + 'Oslash' => 'Ø', + 'Oslas' => 'Ø', + 'oslash' => 'ø', + 'oslas' => 'ø', + 'osol' => '⊘', + 'Otilde' => 'Õ', + 'Otild' => 'Õ', + 'otilde' => 'õ', + 'otild' => 'õ', + 'Otimes' => '⨷', + 'otimes' => '⊗', + 'otimesas' => '⨶', + 'Ouml' => 'Ö', + 'Oum' => 'Ö', + 'ouml' => 'ö', + 'oum' => 'ö', + 'ovbar' => '⌽', + 'OverBar' => '‾', + 'OverBrace' => '⏞', + 'OverBracket' => '⎴', + 'OverParenthesis' => '⏜', + 'par' => '¶', + 'para' => '¶', + 'parallel' => '∥', + 'parsim' => '⫳', + 'parsl' => '⫽', + 'part' => '∂', + 'PartialD' => '∂', + 'Pcy' => 'П', + 'pcy' => 'п', + 'percnt' => '%', + 'period' => '.', + 'permil' => '‰', + 'perp' => '⊥', + 'pertenk' => '‱', + 'Pfr' => '𝔓', + 'pfr' => '𝔭', + 'Phi' => 'Φ', + 'phi' => 'φ', + 'phiv' => 'ϕ', + 'phmmat' => 'ℳ', + 'phone' => '☎', + 'Pi' => 'Π', + 'pi' => 'π', + 'pitchfork' => '⋔', + 'piv' => 'ϖ', + 'planck' => 'ℏ', + 'planckh' => 'ℎ', + 'plankv' => 'ℏ', + 'plus' => '+', + 'plusacir' => '⨣', + 'plusb' => '⊞', + 'pluscir' => '⨢', + 'plusdo' => '∔', + 'plusdu' => '⨥', + 'pluse' => '⩲', + 'PlusMinus' => '±', + 'plusmn' => '±', + 'plusm' => '±', + 'plussim' => '⨦', + 'plustwo' => '⨧', + 'pm' => '±', + 'Poincareplane' => 'ℌ', + 'pointint' => '⨕', + 'Popf' => 'ℙ', + 'popf' => '𝕡', + 'pound' => '£', + 'poun' => '£', + 'Pr' => '⪻', + 'pr' => '≺', + 'prap' => '⪷', + 'prcue' => '≼', + 'prE' => '⪳', + 'pre' => '⪯', + 'prec' => '≺', + 'precapprox' => '⪷', + 'preccurlyeq' => '≼', + 'Precedes' => '≺', + 'PrecedesEqual' => '⪯', + 'PrecedesSlantEqual' => '≼', + 'PrecedesTilde' => '≾', + 'preceq' => '⪯', + 'precnapprox' => '⪹', + 'precneqq' => '⪵', + 'precnsim' => '⋨', + 'precsim' => '≾', + 'Prime' => '″', + 'prime' => '′', + 'primes' => 'ℙ', + 'prnap' => '⪹', + 'prnE' => '⪵', + 'prnsim' => '⋨', + 'prod' => '∏', + 'Product' => '∏', + 'profalar' => '⌮', + 'profline' => '⌒', + 'profsurf' => '⌓', + 'prop' => '∝', + 'Proportion' => '∷', + 'Proportional' => '∝', + 'propto' => '∝', + 'prsim' => '≾', + 'prurel' => '⊰', + 'Pscr' => '𝒫', + 'pscr' => '𝓅', + 'Psi' => 'Ψ', + 'psi' => 'ψ', + 'puncsp' => ' ', + 'Qfr' => '𝔔', + 'qfr' => '𝔮', + 'qint' => '⨌', + 'Qopf' => 'ℚ', + 'qopf' => '𝕢', + 'qprime' => '⁗', + 'Qscr' => '𝒬', + 'qscr' => '𝓆', + 'quaternions' => 'ℍ', + 'quatint' => '⨖', + 'quest' => '?', + 'questeq' => '≟', + 'QUOT' => '"', + 'QUO' => '"', + 'quot' => '"', + 'quo' => '"', + 'rAarr' => '⇛', + 'race' => '∽̱', + 'Racute' => 'Ŕ', + 'racute' => 'ŕ', + 'radic' => '√', + 'raemptyv' => '⦳', + 'Rang' => '⟫', + 'rang' => '⟩', + 'rangd' => '⦒', + 'range' => '⦥', + 'rangle' => '⟩', + 'raquo' => '»', + 'raqu' => '»', + 'Rarr' => '↠', + 'rArr' => '⇒', + 'rarr' => '→', + 'rarrap' => '⥵', + 'rarrb' => '⇥', + 'rarrbfs' => '⤠', + 'rarrc' => '⤳', + 'rarrfs' => '⤞', + 'rarrhk' => '↪', + 'rarrlp' => '↬', + 'rarrpl' => '⥅', + 'rarrsim' => '⥴', + 'Rarrtl' => '⤖', + 'rarrtl' => '↣', + 'rarrw' => '↝', + 'rAtail' => '⤜', + 'ratail' => '⤚', + 'ratio' => '∶', + 'rationals' => 'ℚ', + 'RBarr' => '⤐', + 'rBarr' => '⤏', + 'rbarr' => '⤍', + 'rbbrk' => '❳', + 'rbrace' => '}', + 'rbrack' => ']', + 'rbrke' => '⦌', + 'rbrksld' => '⦎', + 'rbrkslu' => '⦐', + 'Rcaron' => 'Ř', + 'rcaron' => 'ř', + 'Rcedil' => 'Ŗ', + 'rcedil' => 'ŗ', + 'rceil' => '⌉', + 'rcub' => '}', + 'Rcy' => 'Р', + 'rcy' => 'р', + 'rdca' => '⤷', + 'rdldhar' => '⥩', + 'rdquo' => '”', + 'rdquor' => '”', + 'rdsh' => '↳', + 'Re' => 'ℜ', + 'real' => 'ℜ', + 'realine' => 'ℛ', + 'realpart' => 'ℜ', + 'reals' => 'ℝ', + 'rect' => '▭', + 'REG' => '®', + 'RE' => '®', + 'reg' => '®', + 're' => '®', + 'ReverseElement' => '∋', + 'ReverseEquilibrium' => '⇋', + 'ReverseUpEquilibrium' => '⥯', + 'rfisht' => '⥽', + 'rfloor' => '⌋', + 'Rfr' => 'ℜ', + 'rfr' => '𝔯', + 'rHar' => '⥤', + 'rhard' => '⇁', + 'rharu' => '⇀', + 'rharul' => '⥬', + 'Rho' => 'Ρ', + 'rho' => 'ρ', + 'rhov' => 'ϱ', + 'RightAngleBracket' => '⟩', + 'RightArrow' => '→', + 'Rightarrow' => '⇒', + 'rightarrow' => '→', + 'RightArrowBar' => '⇥', + 'RightArrowLeftArrow' => '⇄', + 'rightarrowtail' => '↣', + 'RightCeiling' => '⌉', + 'RightDoubleBracket' => '⟧', + 'RightDownTeeVector' => '⥝', + 'RightDownVector' => '⇂', + 'RightDownVectorBar' => '⥕', + 'RightFloor' => '⌋', + 'rightharpoondown' => '⇁', + 'rightharpoonup' => '⇀', + 'rightleftarrows' => '⇄', + 'rightleftharpoons' => '⇌', + 'rightrightarrows' => '⇉', + 'rightsquigarrow' => '↝', + 'RightTee' => '⊢', + 'RightTeeArrow' => '↦', + 'RightTeeVector' => '⥛', + 'rightthreetimes' => '⋌', + 'RightTriangle' => '⊳', + 'RightTriangleBar' => '⧐', + 'RightTriangleEqual' => '⊵', + 'RightUpDownVector' => '⥏', + 'RightUpTeeVector' => '⥜', + 'RightUpVector' => '↾', + 'RightUpVectorBar' => '⥔', + 'RightVector' => '⇀', + 'RightVectorBar' => '⥓', + 'ring' => '˚', + 'risingdotseq' => '≓', + 'rlarr' => '⇄', + 'rlhar' => '⇌', + 'rlm' => '‏', + 'rmoust' => '⎱', + 'rmoustache' => '⎱', + 'rnmid' => '⫮', + 'roang' => '⟭', + 'roarr' => '⇾', + 'robrk' => '⟧', + 'ropar' => '⦆', + 'Ropf' => 'ℝ', + 'ropf' => '𝕣', + 'roplus' => '⨮', + 'rotimes' => '⨵', + 'RoundImplies' => '⥰', + 'rpar' => ')', + 'rpargt' => '⦔', + 'rppolint' => '⨒', + 'rrarr' => '⇉', + 'Rrightarrow' => '⇛', + 'rsaquo' => '›', + 'Rscr' => 'ℛ', + 'rscr' => '𝓇', + 'Rsh' => '↱', + 'rsh' => '↱', + 'rsqb' => ']', + 'rsquo' => '’', + 'rsquor' => '’', + 'rthree' => '⋌', + 'rtimes' => '⋊', + 'rtri' => '▹', + 'rtrie' => '⊵', + 'rtrif' => '▸', + 'rtriltri' => '⧎', + 'RuleDelayed' => '⧴', + 'ruluhar' => '⥨', + 'rx' => '℞', + 'Sacute' => 'Ś', + 'sacute' => 'ś', + 'sbquo' => '‚', + 'Sc' => '⪼', + 'sc' => '≻', + 'scap' => '⪸', + 'Scaron' => 'Š', + 'scaron' => 'š', + 'sccue' => '≽', + 'scE' => '⪴', + 'sce' => '⪰', + 'Scedil' => 'Ş', + 'scedil' => 'ş', + 'Scirc' => 'Ŝ', + 'scirc' => 'ŝ', + 'scnap' => '⪺', + 'scnE' => '⪶', + 'scnsim' => '⋩', + 'scpolint' => '⨓', + 'scsim' => '≿', + 'Scy' => 'С', + 'scy' => 'с', + 'sdot' => '⋅', + 'sdotb' => '⊡', + 'sdote' => '⩦', + 'searhk' => '⤥', + 'seArr' => '⇘', + 'searr' => '↘', + 'searrow' => '↘', + 'sect' => '§', + 'sec' => '§', + 'semi' => ';', + 'seswar' => '⤩', + 'setminus' => '∖', + 'setmn' => '∖', + 'sext' => '✶', + 'Sfr' => '𝔖', + 'sfr' => '𝔰', + 'sfrown' => '⌢', + 'sharp' => '♯', + 'SHCHcy' => 'Щ', + 'shchcy' => 'щ', + 'SHcy' => 'Ш', + 'shcy' => 'ш', + 'ShortDownArrow' => '↓', + 'ShortLeftArrow' => '←', + 'shortmid' => '∣', + 'shortparallel' => '∥', + 'ShortRightArrow' => '→', + 'ShortUpArrow' => '↑', + 'shy' => '­', + 'sh' => '­', + 'Sigma' => 'Σ', + 'sigma' => 'σ', + 'sigmaf' => 'ς', + 'sigmav' => 'ς', + 'sim' => '∼', + 'simdot' => '⩪', + 'sime' => '≃', + 'simeq' => '≃', + 'simg' => '⪞', + 'simgE' => '⪠', + 'siml' => '⪝', + 'simlE' => '⪟', + 'simne' => '≆', + 'simplus' => '⨤', + 'simrarr' => '⥲', + 'slarr' => '←', + 'SmallCircle' => '∘', + 'smallsetminus' => '∖', + 'smashp' => '⨳', + 'smeparsl' => '⧤', + 'smid' => '∣', + 'smile' => '⌣', + 'smt' => '⪪', + 'smte' => '⪬', + 'smtes' => '⪬︀', + 'SOFTcy' => 'Ь', + 'softcy' => 'ь', + 'sol' => '/', + 'solb' => '⧄', + 'solbar' => '⌿', + 'Sopf' => '𝕊', + 'sopf' => '𝕤', + 'spades' => '♠', + 'spadesuit' => '♠', + 'spar' => '∥', + 'sqcap' => '⊓', + 'sqcaps' => '⊓︀', + 'sqcup' => '⊔', + 'sqcups' => '⊔︀', + 'Sqrt' => '√', + 'sqsub' => '⊏', + 'sqsube' => '⊑', + 'sqsubset' => '⊏', + 'sqsubseteq' => '⊑', + 'sqsup' => '⊐', + 'sqsupe' => '⊒', + 'sqsupset' => '⊐', + 'sqsupseteq' => '⊒', + 'squ' => '□', + 'Square' => '□', + 'square' => '□', + 'SquareIntersection' => '⊓', + 'SquareSubset' => '⊏', + 'SquareSubsetEqual' => '⊑', + 'SquareSuperset' => '⊐', + 'SquareSupersetEqual' => '⊒', + 'SquareUnion' => '⊔', + 'squarf' => '▪', + 'squf' => '▪', + 'srarr' => '→', + 'Sscr' => '𝒮', + 'sscr' => '𝓈', + 'ssetmn' => '∖', + 'ssmile' => '⌣', + 'sstarf' => '⋆', + 'Star' => '⋆', + 'star' => '☆', + 'starf' => '★', + 'straightepsilon' => 'ϵ', + 'straightphi' => 'ϕ', + 'strns' => '¯', + 'Sub' => '⋐', + 'sub' => '⊂', + 'subdot' => '⪽', + 'subE' => '⫅', + 'sube' => '⊆', + 'subedot' => '⫃', + 'submult' => '⫁', + 'subnE' => '⫋', + 'subne' => '⊊', + 'subplus' => '⪿', + 'subrarr' => '⥹', + 'Subset' => '⋐', + 'subset' => '⊂', + 'subseteq' => '⊆', + 'subseteqq' => '⫅', + 'SubsetEqual' => '⊆', + 'subsetneq' => '⊊', + 'subsetneqq' => '⫋', + 'subsim' => '⫇', + 'subsub' => '⫕', + 'subsup' => '⫓', + 'succ' => '≻', + 'succapprox' => '⪸', + 'succcurlyeq' => '≽', + 'Succeeds' => '≻', + 'SucceedsEqual' => '⪰', + 'SucceedsSlantEqual' => '≽', + 'SucceedsTilde' => '≿', + 'succeq' => '⪰', + 'succnapprox' => '⪺', + 'succneqq' => '⪶', + 'succnsim' => '⋩', + 'succsim' => '≿', + 'SuchThat' => '∋', + 'Sum' => '∑', + 'sum' => '∑', + 'sung' => '♪', + 'Sup' => '⋑', + 'sup' => '³', + 'sup1' => '¹', + 'sup2' => '²', + 'sup3' => '³', + 'supdot' => '⪾', + 'supdsub' => '⫘', + 'supE' => '⫆', + 'supe' => '⊇', + 'supedot' => '⫄', + 'Superset' => '⊃', + 'SupersetEqual' => '⊇', + 'suphsol' => '⟉', + 'suphsub' => '⫗', + 'suplarr' => '⥻', + 'supmult' => '⫂', + 'supnE' => '⫌', + 'supne' => '⊋', + 'supplus' => '⫀', + 'Supset' => '⋑', + 'supset' => '⊃', + 'supseteq' => '⊇', + 'supseteqq' => '⫆', + 'supsetneq' => '⊋', + 'supsetneqq' => '⫌', + 'supsim' => '⫈', + 'supsub' => '⫔', + 'supsup' => '⫖', + 'swarhk' => '⤦', + 'swArr' => '⇙', + 'swarr' => '↙', + 'swarrow' => '↙', + 'swnwar' => '⤪', + 'szlig' => 'ß', + 'szli' => 'ß', + 'Tab' => ' ', + 'target' => '⌖', + 'Tau' => 'Τ', + 'tau' => 'τ', + 'tbrk' => '⎴', + 'Tcaron' => 'Ť', + 'tcaron' => 'ť', + 'Tcedil' => 'Ţ', + 'tcedil' => 'ţ', + 'Tcy' => 'Т', + 'tcy' => 'т', + 'tdot' => '⃛', + 'telrec' => '⌕', + 'Tfr' => '𝔗', + 'tfr' => '𝔱', + 'there4' => '∴', + 'Therefore' => '∴', + 'therefore' => '∴', + 'Theta' => 'Θ', + 'theta' => 'θ', + 'thetasym' => 'ϑ', + 'thetav' => 'ϑ', + 'thickapprox' => '≈', + 'thicksim' => '∼', + 'ThickSpace' => '  ', + 'thinsp' => ' ', + 'ThinSpace' => ' ', + 'thkap' => '≈', + 'thksim' => '∼', + 'THORN' => 'Þ', + 'THOR' => 'Þ', + 'thorn' => 'þ', + 'thor' => 'þ', + 'Tilde' => '∼', + 'tilde' => '˜', + 'TildeEqual' => '≃', + 'TildeFullEqual' => '≅', + 'TildeTilde' => '≈', + 'times' => '×', + 'time' => '×', + 'timesb' => '⊠', + 'timesbar' => '⨱', + 'timesd' => '⨰', + 'tint' => '∭', + 'toea' => '⤨', + 'top' => '⊤', + 'topbot' => '⌶', + 'topcir' => '⫱', + 'Topf' => '𝕋', + 'topf' => '𝕥', + 'topfork' => '⫚', + 'tosa' => '⤩', + 'tprime' => '‴', + 'TRADE' => '™', + 'trade' => '™', + 'triangle' => '▵', + 'triangledown' => '▿', + 'triangleleft' => '◃', + 'trianglelefteq' => '⊴', + 'triangleq' => '≜', + 'triangleright' => '▹', + 'trianglerighteq' => '⊵', + 'tridot' => '◬', + 'trie' => '≜', + 'triminus' => '⨺', + 'TripleDot' => '⃛', + 'triplus' => '⨹', + 'trisb' => '⧍', + 'tritime' => '⨻', + 'trpezium' => '⏢', + 'Tscr' => '𝒯', + 'tscr' => '𝓉', + 'TScy' => 'Ц', + 'tscy' => 'ц', + 'TSHcy' => 'Ћ', + 'tshcy' => 'ћ', + 'Tstrok' => 'Ŧ', + 'tstrok' => 'ŧ', + 'twixt' => '≬', + 'twoheadleftarrow' => '↞', + 'twoheadrightarrow' => '↠', + 'Uacute' => 'Ú', + 'Uacut' => 'Ú', + 'uacute' => 'ú', + 'uacut' => 'ú', + 'Uarr' => '↟', + 'uArr' => '⇑', + 'uarr' => '↑', + 'Uarrocir' => '⥉', + 'Ubrcy' => 'Ў', + 'ubrcy' => 'ў', + 'Ubreve' => 'Ŭ', + 'ubreve' => 'ŭ', + 'Ucirc' => 'Û', + 'Ucir' => 'Û', + 'ucirc' => 'û', + 'ucir' => 'û', + 'Ucy' => 'У', + 'ucy' => 'у', + 'udarr' => '⇅', + 'Udblac' => 'Ű', + 'udblac' => 'ű', + 'udhar' => '⥮', + 'ufisht' => '⥾', + 'Ufr' => '𝔘', + 'ufr' => '𝔲', + 'Ugrave' => 'Ù', + 'Ugrav' => 'Ù', + 'ugrave' => 'ù', + 'ugrav' => 'ù', + 'uHar' => '⥣', + 'uharl' => '↿', + 'uharr' => '↾', + 'uhblk' => '▀', + 'ulcorn' => '⌜', + 'ulcorner' => '⌜', + 'ulcrop' => '⌏', + 'ultri' => '◸', + 'Umacr' => 'Ū', + 'umacr' => 'ū', + 'uml' => '¨', + 'um' => '¨', + 'UnderBar' => '_', + 'UnderBrace' => '⏟', + 'UnderBracket' => '⎵', + 'UnderParenthesis' => '⏝', + 'Union' => '⋃', + 'UnionPlus' => '⊎', + 'Uogon' => 'Ų', + 'uogon' => 'ų', + 'Uopf' => '𝕌', + 'uopf' => '𝕦', + 'UpArrow' => '↑', + 'Uparrow' => '⇑', + 'uparrow' => '↑', + 'UpArrowBar' => '⤒', + 'UpArrowDownArrow' => '⇅', + 'UpDownArrow' => '↕', + 'Updownarrow' => '⇕', + 'updownarrow' => '↕', + 'UpEquilibrium' => '⥮', + 'upharpoonleft' => '↿', + 'upharpoonright' => '↾', + 'uplus' => '⊎', + 'UpperLeftArrow' => '↖', + 'UpperRightArrow' => '↗', + 'Upsi' => 'ϒ', + 'upsi' => 'υ', + 'upsih' => 'ϒ', + 'Upsilon' => 'Υ', + 'upsilon' => 'υ', + 'UpTee' => '⊥', + 'UpTeeArrow' => '↥', + 'upuparrows' => '⇈', + 'urcorn' => '⌝', + 'urcorner' => '⌝', + 'urcrop' => '⌎', + 'Uring' => 'Ů', + 'uring' => 'ů', + 'urtri' => '◹', + 'Uscr' => '𝒰', + 'uscr' => '𝓊', + 'utdot' => '⋰', + 'Utilde' => 'Ũ', + 'utilde' => 'ũ', + 'utri' => '▵', + 'utrif' => '▴', + 'uuarr' => '⇈', + 'Uuml' => 'Ü', + 'Uum' => 'Ü', + 'uuml' => 'ü', + 'uum' => 'ü', + 'uwangle' => '⦧', + 'vangrt' => '⦜', + 'varepsilon' => 'ϵ', + 'varkappa' => 'ϰ', + 'varnothing' => '∅', + 'varphi' => 'ϕ', + 'varpi' => 'ϖ', + 'varpropto' => '∝', + 'vArr' => '⇕', + 'varr' => '↕', + 'varrho' => 'ϱ', + 'varsigma' => 'ς', + 'varsubsetneq' => '⊊︀', + 'varsubsetneqq' => '⫋︀', + 'varsupsetneq' => '⊋︀', + 'varsupsetneqq' => '⫌︀', + 'vartheta' => 'ϑ', + 'vartriangleleft' => '⊲', + 'vartriangleright' => '⊳', + 'Vbar' => '⫫', + 'vBar' => '⫨', + 'vBarv' => '⫩', + 'Vcy' => 'В', + 'vcy' => 'в', + 'VDash' => '⊫', + 'Vdash' => '⊩', + 'vDash' => '⊨', + 'vdash' => '⊢', + 'Vdashl' => '⫦', + 'Vee' => '⋁', + 'vee' => '∨', + 'veebar' => '⊻', + 'veeeq' => '≚', + 'vellip' => '⋮', + 'Verbar' => '‖', + 'verbar' => '|', + 'Vert' => '‖', + 'vert' => '|', + 'VerticalBar' => '∣', + 'VerticalLine' => '|', + 'VerticalSeparator' => '❘', + 'VerticalTilde' => '≀', + 'VeryThinSpace' => ' ', + 'Vfr' => '𝔙', + 'vfr' => '𝔳', + 'vltri' => '⊲', + 'vnsub' => '⊂⃒', + 'vnsup' => '⊃⃒', + 'Vopf' => '𝕍', + 'vopf' => '𝕧', + 'vprop' => '∝', + 'vrtri' => '⊳', + 'Vscr' => '𝒱', + 'vscr' => '𝓋', + 'vsubnE' => '⫋︀', + 'vsubne' => '⊊︀', + 'vsupnE' => '⫌︀', + 'vsupne' => '⊋︀', + 'Vvdash' => '⊪', + 'vzigzag' => '⦚', + 'Wcirc' => 'Ŵ', + 'wcirc' => 'ŵ', + 'wedbar' => '⩟', + 'Wedge' => '⋀', + 'wedge' => '∧', + 'wedgeq' => '≙', + 'weierp' => '℘', + 'Wfr' => '𝔚', + 'wfr' => '𝔴', + 'Wopf' => '𝕎', + 'wopf' => '𝕨', + 'wp' => '℘', + 'wr' => '≀', + 'wreath' => '≀', + 'Wscr' => '𝒲', + 'wscr' => '𝓌', + 'xcap' => '⋂', + 'xcirc' => '◯', + 'xcup' => '⋃', + 'xdtri' => '▽', + 'Xfr' => '𝔛', + 'xfr' => '𝔵', + 'xhArr' => '⟺', + 'xharr' => '⟷', + 'Xi' => 'Ξ', + 'xi' => 'ξ', + 'xlArr' => '⟸', + 'xlarr' => '⟵', + 'xmap' => '⟼', + 'xnis' => '⋻', + 'xodot' => '⨀', + 'Xopf' => '𝕏', + 'xopf' => '𝕩', + 'xoplus' => '⨁', + 'xotime' => '⨂', + 'xrArr' => '⟹', + 'xrarr' => '⟶', + 'Xscr' => '𝒳', + 'xscr' => '𝓍', + 'xsqcup' => '⨆', + 'xuplus' => '⨄', + 'xutri' => '△', + 'xvee' => '⋁', + 'xwedge' => '⋀', + 'Yacute' => 'Ý', + 'Yacut' => 'Ý', + 'yacute' => 'ý', + 'yacut' => 'ý', + 'YAcy' => 'Я', + 'yacy' => 'я', + 'Ycirc' => 'Ŷ', + 'ycirc' => 'ŷ', + 'Ycy' => 'Ы', + 'ycy' => 'ы', + 'yen' => '¥', + 'ye' => '¥', + 'Yfr' => '𝔜', + 'yfr' => '𝔶', + 'YIcy' => 'Ї', + 'yicy' => 'ї', + 'Yopf' => '𝕐', + 'yopf' => '𝕪', + 'Yscr' => '𝒴', + 'yscr' => '𝓎', + 'YUcy' => 'Ю', + 'yucy' => 'ю', + 'Yuml' => 'Ÿ', + 'yuml' => 'ÿ', + 'yum' => 'ÿ', + 'Zacute' => 'Ź', + 'zacute' => 'ź', + 'Zcaron' => 'Ž', + 'zcaron' => 'ž', + 'Zcy' => 'З', + 'zcy' => 'з', + 'Zdot' => 'Ż', + 'zdot' => 'ż', + 'zeetrf' => 'ℨ', + 'ZeroWidthSpace' => '​', + 'Zeta' => 'Ζ', + 'zeta' => 'ζ', + 'Zfr' => 'ℨ', + 'zfr' => '𝔷', + 'ZHcy' => 'Ж', + 'zhcy' => 'ж', + 'zigrarr' => '⇝', + 'Zopf' => 'ℤ', + 'zopf' => '𝕫', + 'Zscr' => '𝒵', + 'zscr' => '𝓏', + 'zwj' => '‍', + 'zwnj' => '‌', + ); +} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Exception.php b/dompdf/vendor/masterminds/html5/src/HTML5/Exception.php new file mode 100644 index 0000000..64e97e6 --- /dev/null +++ b/dompdf/vendor/masterminds/html5/src/HTML5/Exception.php @@ -0,0 +1,10 @@ + self::NAMESPACE_HTML, + 'svg' => self::NAMESPACE_SVG, + 'math' => self::NAMESPACE_MATHML, + ); + + /** + * Holds the always available namespaces (which does not require the XMLNS declaration). + * + * @var array + */ + protected $implicitNamespaces = array( + 'xml' => self::NAMESPACE_XML, + 'xmlns' => self::NAMESPACE_XMLNS, + 'xlink' => self::NAMESPACE_XLINK, + ); + + /** + * Holds a stack of currently active namespaces. + * + * @var array + */ + protected $nsStack = array(); + + /** + * Holds the number of namespaces declared by a node. + * + * @var array + */ + protected $pushes = array(); + + /** + * Defined in 8.2.5. + */ + const IM_INITIAL = 0; + + const IM_BEFORE_HTML = 1; + + const IM_BEFORE_HEAD = 2; + + const IM_IN_HEAD = 3; + + const IM_IN_HEAD_NOSCRIPT = 4; + + const IM_AFTER_HEAD = 5; + + const IM_IN_BODY = 6; + + const IM_TEXT = 7; + + const IM_IN_TABLE = 8; + + const IM_IN_TABLE_TEXT = 9; + + const IM_IN_CAPTION = 10; + + const IM_IN_COLUMN_GROUP = 11; + + const IM_IN_TABLE_BODY = 12; + + const IM_IN_ROW = 13; + + const IM_IN_CELL = 14; + + const IM_IN_SELECT = 15; + + const IM_IN_SELECT_IN_TABLE = 16; + + const IM_AFTER_BODY = 17; + + const IM_IN_FRAMESET = 18; + + const IM_AFTER_FRAMESET = 19; + + const IM_AFTER_AFTER_BODY = 20; + + const IM_AFTER_AFTER_FRAMESET = 21; + + const IM_IN_SVG = 22; + + const IM_IN_MATHML = 23; + + protected $options = array(); + + protected $stack = array(); + + protected $current; // Pointer in the tag hierarchy. + protected $rules; + protected $doc; + + protected $frag; + + protected $processor; + + protected $insertMode = 0; + + /** + * Track if we are in an element that allows only inline child nodes. + * + * @var string|null + */ + protected $onlyInline; + + /** + * Quirks mode is enabled by default. + * Any document that is missing the DT will be considered to be in quirks mode. + */ + protected $quirks = true; + + protected $errors = array(); + + public function __construct($isFragment = false, array $options = array()) + { + $this->options = $options; + + if (isset($options[self::OPT_TARGET_DOC])) { + $this->doc = $options[self::OPT_TARGET_DOC]; + } else { + $impl = new \DOMImplementation(); + // XXX: + // Create the doctype. For now, we are always creating HTML5 + // documents, and attempting to up-convert any older DTDs to HTML5. + $dt = $impl->createDocumentType('html'); + // $this->doc = \DOMImplementation::createDocument(NULL, 'html', $dt); + $this->doc = $impl->createDocument(null, '', $dt); + $this->doc->encoding = !empty($options['encoding']) ? $options['encoding'] : 'UTF-8'; + } + + $this->errors = array(); + + $this->current = $this->doc; // ->documentElement; + + // Create a rules engine for tags. + $this->rules = new TreeBuildingRules(); + + $implicitNS = array(); + if (isset($this->options[self::OPT_IMPLICIT_NS])) { + $implicitNS = $this->options[self::OPT_IMPLICIT_NS]; + } elseif (isset($this->options['implicitNamespaces'])) { + $implicitNS = $this->options['implicitNamespaces']; + } + + // Fill $nsStack with the defalut HTML5 namespaces, plus the "implicitNamespaces" array taken form $options + array_unshift($this->nsStack, $implicitNS + array('' => self::NAMESPACE_HTML) + $this->implicitNamespaces); + + if ($isFragment) { + $this->insertMode = static::IM_IN_BODY; + $this->frag = $this->doc->createDocumentFragment(); + $this->current = $this->frag; + } + } + + /** + * Get the document. + */ + public function document() + { + return $this->doc; + } + + /** + * Get the DOM fragment for the body. + * + * This returns a DOMNodeList because a fragment may have zero or more + * DOMNodes at its root. + * + * @see http://www.w3.org/TR/2012/CR-html5-20121217/syntax.html#concept-frag-parse-context + * + * @return \DOMDocumentFragment + */ + public function fragment() + { + return $this->frag; + } + + /** + * Provide an instruction processor. + * + * This is used for handling Processor Instructions as they are + * inserted. If omitted, PI's are inserted directly into the DOM tree. + */ + public function setInstructionProcessor(InstructionProcessor $proc) + { + $this->processor = $proc; + } + + public function doctype($name, $idType = 0, $id = null, $quirks = false) + { + // This is used solely for setting quirks mode. Currently we don't + // try to preserve the inbound DT. We convert it to HTML5. + $this->quirks = $quirks; + + if ($this->insertMode > static::IM_INITIAL) { + $this->parseError('Illegal placement of DOCTYPE tag. Ignoring: ' . $name); + + return; + } + + $this->insertMode = static::IM_BEFORE_HTML; + } + + /** + * Process the start tag. + * + * @todo - XMLNS namespace handling (we need to parse, even if it's not valid) + * - XLink, MathML and SVG namespace handling + * - Omission rules: 8.1.2.4 Optional tags + * + * @param string $name + * @param array $attributes + * @param bool $selfClosing + * + * @return int + */ + public function startTag($name, $attributes = array(), $selfClosing = false) + { + $lname = $this->normalizeTagName($name); + + // Make sure we have an html element. + if (!$this->doc->documentElement && 'html' !== $name && !$this->frag) { + $this->startTag('html'); + } + + // Set quirks mode if we're at IM_INITIAL with no doctype. + if ($this->insertMode === static::IM_INITIAL) { + $this->quirks = true; + $this->parseError('No DOCTYPE specified.'); + } + + // SPECIAL TAG HANDLING: + // Spec says do this, and "don't ask." + // find the spec where this is defined... looks problematic + if ('image' === $name && !($this->insertMode === static::IM_IN_SVG || $this->insertMode === static::IM_IN_MATHML)) { + $name = 'img'; + } + + // Autoclose p tags where appropriate. + if ($this->insertMode >= static::IM_IN_BODY && Elements::isA($name, Elements::AUTOCLOSE_P)) { + $this->autoclose('p'); + } + + // Set insert mode: + switch ($name) { + case 'html': + $this->insertMode = static::IM_BEFORE_HEAD; + break; + case 'head': + if ($this->insertMode > static::IM_BEFORE_HEAD) { + $this->parseError('Unexpected head tag outside of head context.'); + } else { + $this->insertMode = static::IM_IN_HEAD; + } + break; + case 'body': + $this->insertMode = static::IM_IN_BODY; + break; + case 'svg': + $this->insertMode = static::IM_IN_SVG; + break; + case 'math': + $this->insertMode = static::IM_IN_MATHML; + break; + case 'noscript': + if ($this->insertMode === static::IM_IN_HEAD) { + $this->insertMode = static::IM_IN_HEAD_NOSCRIPT; + } + break; + } + + // Special case handling for SVG. + if ($this->insertMode === static::IM_IN_SVG) { + $lname = Elements::normalizeSvgElement($lname); + } + + $pushes = 0; + // when we found a tag thats appears inside $nsRoots, we have to switch the defalut namespace + if (isset($this->nsRoots[$lname]) && $this->nsStack[0][''] !== $this->nsRoots[$lname]) { + array_unshift($this->nsStack, array( + '' => $this->nsRoots[$lname], + ) + $this->nsStack[0]); + ++$pushes; + } + $needsWorkaround = false; + if (isset($this->options['xmlNamespaces']) && $this->options['xmlNamespaces']) { + // when xmlNamespaces is true a and we found a 'xmlns' or 'xmlns:*' attribute, we should add a new item to the $nsStack + foreach ($attributes as $aName => $aVal) { + if ('xmlns' === $aName) { + $needsWorkaround = $aVal; + array_unshift($this->nsStack, array( + '' => $aVal, + ) + $this->nsStack[0]); + ++$pushes; + } elseif ('xmlns' === (($pos = strpos($aName, ':')) ? substr($aName, 0, $pos) : '')) { + array_unshift($this->nsStack, array( + substr($aName, $pos + 1) => $aVal, + ) + $this->nsStack[0]); + ++$pushes; + } + } + } + + if ($this->onlyInline && Elements::isA($lname, Elements::BLOCK_TAG)) { + $this->autoclose($this->onlyInline); + $this->onlyInline = null; + } + + // some elements as table related tags might have optional end tags that force us to auto close multiple tags + // https://www.w3.org/TR/html401/struct/tables.html + if ($this->current instanceof \DOMElement && isset(Elements::$optionalEndElementsParentsToClose[$lname])) { + foreach (Elements::$optionalEndElementsParentsToClose[$lname] as $parentElName) { + if ($this->current instanceof \DOMElement && $this->current->tagName === $parentElName) { + $this->autoclose($parentElName); + } + } + } + + try { + $prefix = ($pos = strpos($lname, ':')) ? substr($lname, 0, $pos) : ''; + + if (false !== $needsWorkaround) { + $xml = "<$lname xmlns=\"$needsWorkaround\" " . (strlen($prefix) && isset($this->nsStack[0][$prefix]) ? ("xmlns:$prefix=\"" . $this->nsStack[0][$prefix] . '"') : '') . '/>'; + + $frag = new \DOMDocument('1.0', 'UTF-8'); + $frag->loadXML($xml); + + $ele = $this->doc->importNode($frag->documentElement, true); + } else { + if (!isset($this->nsStack[0][$prefix]) || ('' === $prefix && isset($this->options[self::OPT_DISABLE_HTML_NS]) && $this->options[self::OPT_DISABLE_HTML_NS])) { + $ele = $this->doc->createElement($lname); + } else { + $ele = $this->doc->createElementNS($this->nsStack[0][$prefix], $lname); + } + } + } catch (\DOMException $e) { + $this->parseError("Illegal tag name: <$lname>. Replaced with ."); + $ele = $this->doc->createElement('invalid'); + } + + if (Elements::isA($lname, Elements::BLOCK_ONLY_INLINE)) { + $this->onlyInline = $lname; + } + + // When we add some namespacess, we have to track them. Later, when "endElement" is invoked, we have to remove them. + // When we are on a void tag, we do not need to care about namesapce nesting. + if ($pushes > 0 && !Elements::isA($name, Elements::VOID_TAG)) { + // PHP tends to free the memory used by DOM, + // to avoid spl_object_hash collisions whe have to avoid garbage collection of $ele storing it into $pushes + // see https://bugs.php.net/bug.php?id=67459 + $this->pushes[spl_object_hash($ele)] = array($pushes, $ele); + } + + foreach ($attributes as $aName => $aVal) { + // xmlns attributes can't be set + if ('xmlns' === $aName) { + continue; + } + + if ($this->insertMode === static::IM_IN_SVG) { + $aName = Elements::normalizeSvgAttribute($aName); + } elseif ($this->insertMode === static::IM_IN_MATHML) { + $aName = Elements::normalizeMathMlAttribute($aName); + } + + $aVal = (string) $aVal; + + try { + $prefix = ($pos = strpos($aName, ':')) ? substr($aName, 0, $pos) : false; + + if ('xmlns' === $prefix) { + $ele->setAttributeNS(self::NAMESPACE_XMLNS, $aName, $aVal); + } elseif (false !== $prefix && isset($this->nsStack[0][$prefix])) { + $ele->setAttributeNS($this->nsStack[0][$prefix], $aName, $aVal); + } else { + $ele->setAttribute($aName, $aVal); + } + } catch (\DOMException $e) { + $this->parseError("Illegal attribute name for tag $name. Ignoring: $aName"); + continue; + } + + // This is necessary on a non-DTD schema, like HTML5. + if ('id' === $aName) { + $ele->setIdAttribute('id', true); + } + } + + if ($this->frag !== $this->current && $this->rules->hasRules($name)) { + // Some elements have special processing rules. Handle those separately. + $this->current = $this->rules->evaluate($ele, $this->current); + } else { + // Otherwise, it's a standard element. + $this->current->appendChild($ele); + + if (!Elements::isA($name, Elements::VOID_TAG)) { + $this->current = $ele; + } + + // Self-closing tags should only be respected on foreign elements + // (and are implied on void elements) + // See: https://www.w3.org/TR/html5/syntax.html#start-tags + if (Elements::isHtml5Element($name)) { + $selfClosing = false; + } + } + + // This is sort of a last-ditch attempt to correct for cases where no head/body + // elements are provided. + if ($this->insertMode <= static::IM_BEFORE_HEAD && 'head' !== $name && 'html' !== $name) { + $this->insertMode = static::IM_IN_BODY; + } + + // When we are on a void tag, we do not need to care about namesapce nesting, + // but we have to remove the namespaces pushed to $nsStack. + if ($pushes > 0 && Elements::isA($name, Elements::VOID_TAG)) { + // remove the namespaced definded by current node + for ($i = 0; $i < $pushes; ++$i) { + array_shift($this->nsStack); + } + } + + if ($selfClosing) { + $this->endTag($name); + } + + // Return the element mask, which the tokenizer can then use to set + // various processing rules. + return Elements::element($name); + } + + public function endTag($name) + { + $lname = $this->normalizeTagName($name); + + // Special case within 12.2.6.4.7: An end tag whose tag name is "br" should be treated as an opening tag + if ('br' === $name) { + $this->parseError('Closing tag encountered for void element br.'); + + $this->startTag('br'); + } + // Ignore closing tags for other unary elements. + elseif (Elements::isA($name, Elements::VOID_TAG)) { + return; + } + + if ($this->insertMode <= static::IM_BEFORE_HTML) { + // 8.2.5.4.2 + if (in_array($name, array( + 'html', + 'br', + 'head', + 'title', + ))) { + $this->startTag('html'); + $this->endTag($name); + $this->insertMode = static::IM_BEFORE_HEAD; + + return; + } + + // Ignore the tag. + $this->parseError('Illegal closing tag at global scope.'); + + return; + } + + // Special case handling for SVG. + if ($this->insertMode === static::IM_IN_SVG) { + $lname = Elements::normalizeSvgElement($lname); + } + + $cid = spl_object_hash($this->current); + + // XXX: HTML has no parent. What do we do, though, + // if this element appears in the wrong place? + if ('html' === $lname) { + return; + } + + // remove the namespaced definded by current node + if (isset($this->pushes[$cid])) { + for ($i = 0; $i < $this->pushes[$cid][0]; ++$i) { + array_shift($this->nsStack); + } + unset($this->pushes[$cid]); + } + + if (!$this->autoclose($lname)) { + $this->parseError('Could not find closing tag for ' . $lname); + } + + switch ($lname) { + case 'head': + $this->insertMode = static::IM_AFTER_HEAD; + break; + case 'body': + $this->insertMode = static::IM_AFTER_BODY; + break; + case 'svg': + case 'mathml': + $this->insertMode = static::IM_IN_BODY; + break; + } + } + + public function comment($cdata) + { + // TODO: Need to handle case where comment appears outside of the HTML tag. + $node = $this->doc->createComment($cdata); + $this->current->appendChild($node); + } + + public function text($data) + { + // XXX: Hmmm.... should we really be this strict? + if ($this->insertMode < static::IM_IN_HEAD) { + // Per '8.2.5.4.3 The "before head" insertion mode' the characters + // " \t\n\r\f" should be ignored but no mention of a parse error. This is + // practical as most documents contain these characters. Other text is not + // expected here so recording a parse error is necessary. + $dataTmp = trim($data, " \t\n\r\f"); + if (!empty($dataTmp)) { + // fprintf(STDOUT, "Unexpected insert mode: %d", $this->insertMode); + $this->parseError('Unexpected text. Ignoring: ' . $dataTmp); + } + + return; + } + // fprintf(STDOUT, "Appending text %s.", $data); + $node = $this->doc->createTextNode($data); + $this->current->appendChild($node); + } + + public function eof() + { + // If the $current isn't the $root, do we need to do anything? + } + + public function parseError($msg, $line = 0, $col = 0) + { + $this->errors[] = sprintf('Line %d, Col %d: %s', $line, $col, $msg); + } + + public function getErrors() + { + return $this->errors; + } + + public function cdata($data) + { + $node = $this->doc->createCDATASection($data); + $this->current->appendChild($node); + } + + public function processingInstruction($name, $data = null) + { + // XXX: Ignore initial XML declaration, per the spec. + if ($this->insertMode === static::IM_INITIAL && 'xml' === strtolower($name)) { + return; + } + + // Important: The processor may modify the current DOM tree however it sees fit. + if ($this->processor instanceof InstructionProcessor) { + $res = $this->processor->process($this->current, $name, $data); + if (!empty($res)) { + $this->current = $res; + } + + return; + } + + // Otherwise, this is just a dumb PI element. + $node = $this->doc->createProcessingInstruction($name, $data); + + $this->current->appendChild($node); + } + + // ========================================================================== + // UTILITIES + // ========================================================================== + + /** + * Apply normalization rules to a tag name. + * See sections 2.9 and 8.1.2. + * + * @param string $tagName + * + * @return string The normalized tag name. + */ + protected function normalizeTagName($tagName) + { + /* + * Section 2.9 suggests that we should not do this. if (strpos($name, ':') !== false) { // We know from the grammar that there must be at least one other // char besides :, since : is not a legal tag start. $parts = explode(':', $name); return array_pop($parts); } + */ + return $tagName; + } + + protected function quirksTreeResolver($name) + { + throw new \Exception('Not implemented.'); + } + + /** + * Automatically climb the tree and close the closest node with the matching $tag. + * + * @param string $tagName + * + * @return bool + */ + protected function autoclose($tagName) + { + $working = $this->current; + do { + if (XML_ELEMENT_NODE !== $working->nodeType) { + return false; + } + if ($working->tagName === $tagName) { + $this->current = $working->parentNode; + + return true; + } + } while ($working = $working->parentNode); + + return false; + } + + /** + * Checks if the given tagname is an ancestor of the present candidate. + * + * If $this->current or anything above $this->current matches the given tag + * name, this returns true. + * + * @param string $tagName + * + * @return bool + */ + protected function isAncestor($tagName) + { + $candidate = $this->current; + while (XML_ELEMENT_NODE === $candidate->nodeType) { + if ($candidate->tagName === $tagName) { + return true; + } + $candidate = $candidate->parentNode; + } + + return false; + } + + /** + * Returns true if the immediate parent element is of the given tagname. + * + * @param string $tagName + * + * @return bool + */ + protected function isParent($tagName) + { + return $this->current->tagName === $tagName; + } +} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Parser/EventHandler.php b/dompdf/vendor/masterminds/html5/src/HTML5/Parser/EventHandler.php new file mode 100644 index 0000000..9893a71 --- /dev/null +++ b/dompdf/vendor/masterminds/html5/src/HTML5/Parser/EventHandler.php @@ -0,0 +1,114 @@ +). + * + * @return int one of the Tokenizer::TEXTMODE_* constants + */ + public function startTag($name, $attributes = array(), $selfClosing = false); + + /** + * An end-tag. + */ + public function endTag($name); + + /** + * A comment section (unparsed character data). + */ + public function comment($cdata); + + /** + * A unit of parsed character data. + * + * Entities in this text are *already decoded*. + */ + public function text($cdata); + + /** + * Indicates that the document has been entirely processed. + */ + public function eof(); + + /** + * Emitted when the parser encounters an error condition. + */ + public function parseError($msg, $line, $col); + + /** + * A CDATA section. + * + * @param string $data + * The unparsed character data + */ + public function cdata($data); + + /** + * This is a holdover from the XML spec. + * + * While user agents don't get PIs, server-side does. + * + * @param string $name The name of the processor (e.g. 'php'). + * @param string $data The unparsed data. + */ + public function processingInstruction($name, $data = null); +} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Parser/FileInputStream.php b/dompdf/vendor/masterminds/html5/src/HTML5/Parser/FileInputStream.php new file mode 100644 index 0000000..b081ed9 --- /dev/null +++ b/dompdf/vendor/masterminds/html5/src/HTML5/Parser/FileInputStream.php @@ -0,0 +1,33 @@ +errors = UTF8Utils::checkForIllegalCodepoints($data); + + $data = $this->replaceLinefeeds($data); + + $this->data = $data; + $this->char = 0; + $this->EOF = strlen($data); + } + + /** + * Check if upcomming chars match the given sequence. + * + * This will read the stream for the $sequence. If it's + * found, this will return true. If not, return false. + * Since this unconsumes any chars it reads, the caller + * will still need to read the next sequence, even if + * this returns true. + * + * Example: $this->scanner->sequenceMatches('') will + * see if the input stream is at the start of a + * '' string. + * + * @param string $sequence + * @param bool $caseSensitive + * + * @return bool + */ + public function sequenceMatches($sequence, $caseSensitive = true) + { + $portion = substr($this->data, $this->char, strlen($sequence)); + + return $caseSensitive ? $portion === $sequence : 0 === strcasecmp($portion, $sequence); + } + + /** + * Get the current position. + * + * @return int The current intiger byte position. + */ + public function position() + { + return $this->char; + } + + /** + * Take a peek at the next character in the data. + * + * @return string The next character. + */ + public function peek() + { + if (($this->char + 1) < $this->EOF) { + return $this->data[$this->char + 1]; + } + + return false; + } + + /** + * Get the next character. + * Note: This advances the pointer. + * + * @return string The next character. + */ + public function next() + { + ++$this->char; + + if ($this->char < $this->EOF) { + return $this->data[$this->char]; + } + + return false; + } + + /** + * Get the current character. + * Note, this does not advance the pointer. + * + * @return string The current character. + */ + public function current() + { + if ($this->char < $this->EOF) { + return $this->data[$this->char]; + } + + return false; + } + + /** + * Silently consume N chars. + * + * @param int $count + */ + public function consume($count = 1) + { + $this->char += $count; + } + + /** + * Unconsume some of the data. + * This moves the data pointer backwards. + * + * @param int $howMany The number of characters to move the pointer back. + */ + public function unconsume($howMany = 1) + { + if (($this->char - $howMany) >= 0) { + $this->char -= $howMany; + } + } + + /** + * Get the next group of that contains hex characters. + * Note, along with getting the characters the pointer in the data will be + * moved as well. + * + * @return string The next group that is hex characters. + */ + public function getHex() + { + return $this->doCharsWhile(static::CHARS_HEX); + } + + /** + * Get the next group of characters that are ASCII Alpha characters. + * Note, along with getting the characters the pointer in the data will be + * moved as well. + * + * @return string The next group of ASCII alpha characters. + */ + public function getAsciiAlpha() + { + return $this->doCharsWhile(static::CHARS_ALPHA); + } + + /** + * Get the next group of characters that are ASCII Alpha characters and numbers. + * Note, along with getting the characters the pointer in the data will be + * moved as well. + * + * @return string The next group of ASCII alpha characters and numbers. + */ + public function getAsciiAlphaNum() + { + return $this->doCharsWhile(static::CHARS_ALNUM); + } + + /** + * Get the next group of numbers. + * Note, along with getting the characters the pointer in the data will be + * moved as well. + * + * @return string The next group of numbers. + */ + public function getNumeric() + { + return $this->doCharsWhile('0123456789'); + } + + /** + * Consume whitespace. + * Whitespace in HTML5 is: formfeed, tab, newline, space. + * + * @return int The length of the matched whitespaces. + */ + public function whitespace() + { + if ($this->char >= $this->EOF) { + return false; + } + + $len = strspn($this->data, "\n\t\f ", $this->char); + + $this->char += $len; + + return $len; + } + + /** + * Returns the current line that is being consumed. + * + * @return int The current line number. + */ + public function currentLine() + { + if (empty($this->EOF) || 0 === $this->char) { + return 1; + } + + // Add one to $this->char because we want the number for the next + // byte to be processed. + return substr_count($this->data, "\n", 0, min($this->char, $this->EOF)) + 1; + } + + /** + * Read chars until something in the mask is encountered. + * + * @param string $mask + * + * @return mixed + */ + public function charsUntil($mask) + { + return $this->doCharsUntil($mask); + } + + /** + * Read chars as long as the mask matches. + * + * @param string $mask + * + * @return int + */ + public function charsWhile($mask) + { + return $this->doCharsWhile($mask); + } + + /** + * Returns the current column of the current line that the tokenizer is at. + * + * Newlines are column 0. The first char after a newline is column 1. + * + * @return int The column number. + */ + public function columnOffset() + { + // Short circuit for the first char. + if (0 === $this->char) { + return 0; + } + + // strrpos is weird, and the offset needs to be negative for what we + // want (i.e., the last \n before $this->char). This needs to not have + // one (to make it point to the next character, the one we want the + // position of) added to it because strrpos's behaviour includes the + // final offset byte. + $backwardFrom = $this->char - 1 - strlen($this->data); + $lastLine = strrpos($this->data, "\n", $backwardFrom); + + // However, for here we want the length up until the next byte to be + // processed, so add one to the current byte ($this->char). + if (false !== $lastLine) { + $findLengthOf = substr($this->data, $lastLine + 1, $this->char - 1 - $lastLine); + } else { + // After a newline. + $findLengthOf = substr($this->data, 0, $this->char); + } + + return UTF8Utils::countChars($findLengthOf); + } + + /** + * Get all characters until EOF. + * + * This consumes characters until the EOF. + * + * @return int The number of characters remaining. + */ + public function remainingChars() + { + if ($this->char < $this->EOF) { + $data = substr($this->data, $this->char); + $this->char = $this->EOF; + + return $data; + } + + return ''; // false; + } + + /** + * Replace linefeed characters according to the spec. + * + * @param $data + * + * @return string + */ + private function replaceLinefeeds($data) + { + /* + * U+000D CARRIAGE RETURN (CR) characters and U+000A LINE FEED (LF) characters are treated specially. + * Any CR characters that are followed by LF characters must be removed, and any CR characters not + * followed by LF characters must be converted to LF characters. Thus, newlines in HTML DOMs are + * represented by LF characters, and there are never any CR characters in the input to the tokenization + * stage. + */ + $crlfTable = array( + "\0" => "\xEF\xBF\xBD", + "\r\n" => "\n", + "\r" => "\n", + ); + + return strtr($data, $crlfTable); + } + + /** + * Read to a particular match (or until $max bytes are consumed). + * + * This operates on byte sequences, not characters. + * + * Matches as far as possible until we reach a certain set of bytes + * and returns the matched substring. + * + * @param string $bytes Bytes to match. + * @param int $max Maximum number of bytes to scan. + * + * @return mixed Index or false if no match is found. You should use strong + * equality when checking the result, since index could be 0. + */ + private function doCharsUntil($bytes, $max = null) + { + if ($this->char >= $this->EOF) { + return false; + } + + if (0 === $max || $max) { + $len = strcspn($this->data, $bytes, $this->char, $max); + } else { + $len = strcspn($this->data, $bytes, $this->char); + } + + $string = (string) substr($this->data, $this->char, $len); + $this->char += $len; + + return $string; + } + + /** + * Returns the string so long as $bytes matches. + * + * Matches as far as possible with a certain set of bytes + * and returns the matched substring. + * + * @param string $bytes A mask of bytes to match. If ANY byte in this mask matches the + * current char, the pointer advances and the char is part of the + * substring. + * @param int $max The max number of chars to read. + * + * @return string + */ + private function doCharsWhile($bytes, $max = null) + { + if ($this->char >= $this->EOF) { + return false; + } + + if (0 === $max || $max) { + $len = strspn($this->data, $bytes, $this->char, $max); + } else { + $len = strspn($this->data, $bytes, $this->char); + } + + $string = (string) substr($this->data, $this->char, $len); + $this->char += $len; + + return $string; + } +} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php b/dompdf/vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php new file mode 100644 index 0000000..75b0886 --- /dev/null +++ b/dompdf/vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php @@ -0,0 +1,336 @@ + + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +*/ + +// Some conventions: +// - /* */ indicates verbatim text from the HTML 5 specification +// MPB: Not sure which version of the spec. Moving from HTML5lib to +// HTML5-PHP, I have been using this version: +// http://www.w3.org/TR/2012/CR-html5-20121217/Overview.html#contents +// +// - // indicates regular comments + +/** + * @deprecated since 2.4, to remove in 3.0. Use a string in the scanner instead. + */ +class StringInputStream implements InputStream +{ + /** + * The string data we're parsing. + */ + private $data; + + /** + * The current integer byte position we are in $data. + */ + private $char; + + /** + * Length of $data; when $char === $data, we are at the end-of-file. + */ + private $EOF; + + /** + * Parse errors. + */ + public $errors = array(); + + /** + * Create a new InputStream wrapper. + * + * @param string $data Data to parse. + * @param string $encoding The encoding to use for the data. + * @param string $debug A fprintf format to use to echo the data on stdout. + */ + public function __construct($data, $encoding = 'UTF-8', $debug = '') + { + $data = UTF8Utils::convertToUTF8($data, $encoding); + if ($debug) { + fprintf(STDOUT, $debug, $data, strlen($data)); + } + + // There is good reason to question whether it makes sense to + // do this here, since most of these checks are done during + // parsing, and since this check doesn't actually *do* anything. + $this->errors = UTF8Utils::checkForIllegalCodepoints($data); + + $data = $this->replaceLinefeeds($data); + + $this->data = $data; + $this->char = 0; + $this->EOF = strlen($data); + } + + public function __toString() + { + return $this->data; + } + + /** + * Replace linefeed characters according to the spec. + */ + protected function replaceLinefeeds($data) + { + /* + * U+000D CARRIAGE RETURN (CR) characters and U+000A LINE FEED (LF) characters are treated specially. + * Any CR characters that are followed by LF characters must be removed, and any CR characters not + * followed by LF characters must be converted to LF characters. Thus, newlines in HTML DOMs are + * represented by LF characters, and there are never any CR characters in the input to the tokenization + * stage. + */ + $crlfTable = array( + "\0" => "\xEF\xBF\xBD", + "\r\n" => "\n", + "\r" => "\n", + ); + + return strtr($data, $crlfTable); + } + + /** + * Returns the current line that the tokenizer is at. + */ + public function currentLine() + { + if (empty($this->EOF) || 0 === $this->char) { + return 1; + } + // Add one to $this->char because we want the number for the next + // byte to be processed. + return substr_count($this->data, "\n", 0, min($this->char, $this->EOF)) + 1; + } + + /** + * @deprecated + */ + public function getCurrentLine() + { + return $this->currentLine(); + } + + /** + * Returns the current column of the current line that the tokenizer is at. + * Newlines are column 0. The first char after a newline is column 1. + * + * @return int The column number. + */ + public function columnOffset() + { + // Short circuit for the first char. + if (0 === $this->char) { + return 0; + } + // strrpos is weird, and the offset needs to be negative for what we + // want (i.e., the last \n before $this->char). This needs to not have + // one (to make it point to the next character, the one we want the + // position of) added to it because strrpos's behaviour includes the + // final offset byte. + $backwardFrom = $this->char - 1 - strlen($this->data); + $lastLine = strrpos($this->data, "\n", $backwardFrom); + + // However, for here we want the length up until the next byte to be + // processed, so add one to the current byte ($this->char). + if (false !== $lastLine) { + $findLengthOf = substr($this->data, $lastLine + 1, $this->char - 1 - $lastLine); + } else { + // After a newline. + $findLengthOf = substr($this->data, 0, $this->char); + } + + return UTF8Utils::countChars($findLengthOf); + } + + /** + * @deprecated + */ + public function getColumnOffset() + { + return $this->columnOffset(); + } + + /** + * Get the current character. + * + * @return string The current character. + */ + #[\ReturnTypeWillChange] + public function current() + { + return $this->data[$this->char]; + } + + /** + * Advance the pointer. + * This is part of the Iterator interface. + */ + #[\ReturnTypeWillChange] + public function next() + { + ++$this->char; + } + + /** + * Rewind to the start of the string. + */ + #[\ReturnTypeWillChange] + public function rewind() + { + $this->char = 0; + } + + /** + * Is the current pointer location valid. + * + * @return bool Whether the current pointer location is valid. + */ + #[\ReturnTypeWillChange] + public function valid() + { + return $this->char < $this->EOF; + } + + /** + * Get all characters until EOF. + * + * This reads to the end of the file, and sets the read marker at the + * end of the file. + * + * Note this performs bounds checking. + * + * @return string Returns the remaining text. If called when the InputStream is + * already exhausted, it returns an empty string. + */ + public function remainingChars() + { + if ($this->char < $this->EOF) { + $data = substr($this->data, $this->char); + $this->char = $this->EOF; + + return $data; + } + + return ''; // false; + } + + /** + * Read to a particular match (or until $max bytes are consumed). + * + * This operates on byte sequences, not characters. + * + * Matches as far as possible until we reach a certain set of bytes + * and returns the matched substring. + * + * @param string $bytes Bytes to match. + * @param int $max Maximum number of bytes to scan. + * + * @return mixed Index or false if no match is found. You should use strong + * equality when checking the result, since index could be 0. + */ + public function charsUntil($bytes, $max = null) + { + if ($this->char >= $this->EOF) { + return false; + } + + if (0 === $max || $max) { + $len = strcspn($this->data, $bytes, $this->char, $max); + } else { + $len = strcspn($this->data, $bytes, $this->char); + } + + $string = (string) substr($this->data, $this->char, $len); + $this->char += $len; + + return $string; + } + + /** + * Returns the string so long as $bytes matches. + * + * Matches as far as possible with a certain set of bytes + * and returns the matched substring. + * + * @param string $bytes A mask of bytes to match. If ANY byte in this mask matches the + * current char, the pointer advances and the char is part of the + * substring. + * @param int $max The max number of chars to read. + * + * @return string + */ + public function charsWhile($bytes, $max = null) + { + if ($this->char >= $this->EOF) { + return false; + } + + if (0 === $max || $max) { + $len = strspn($this->data, $bytes, $this->char, $max); + } else { + $len = strspn($this->data, $bytes, $this->char); + } + $string = (string) substr($this->data, $this->char, $len); + $this->char += $len; + + return $string; + } + + /** + * Unconsume characters. + * + * @param int $howMany The number of characters to unconsume. + */ + public function unconsume($howMany = 1) + { + if (($this->char - $howMany) >= 0) { + $this->char -= $howMany; + } + } + + /** + * Look ahead without moving cursor. + */ + public function peek() + { + if (($this->char + 1) <= $this->EOF) { + return $this->data[$this->char + 1]; + } + + return false; + } + + #[\ReturnTypeWillChange] + public function key() + { + return $this->char; + } +} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php b/dompdf/vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php new file mode 100644 index 0000000..77e268f --- /dev/null +++ b/dompdf/vendor/masterminds/html5/src/HTML5/Parser/Tokenizer.php @@ -0,0 +1,1215 @@ +scanner = $scanner; + $this->events = $eventHandler; + $this->mode = $mode; + } + + /** + * Begin parsing. + * + * This will begin scanning the document, tokenizing as it goes. + * Tokens are emitted into the event handler. + * + * Tokenizing will continue until the document is completely + * read. Errors are emitted into the event handler, but + * the parser will attempt to continue parsing until the + * entire input stream is read. + */ + public function parse() + { + do { + $this->consumeData(); + // FIXME: Add infinite loop protection. + } while ($this->carryOn); + } + + /** + * Set the text mode for the character data reader. + * + * HTML5 defines three different modes for reading text: + * - Normal: Read until a tag is encountered. + * - RCDATA: Read until a tag is encountered, but skip a few otherwise- + * special characters. + * - Raw: Read until a special closing tag is encountered (viz. pre, script) + * + * This allows those modes to be set. + * + * Normally, setting is done by the event handler via a special return code on + * startTag(), but it can also be set manually using this function. + * + * @param int $textmode One of Elements::TEXT_*. + * @param string $untilTag The tag that should stop RAW or RCDATA mode. Normal mode does not + * use this indicator. + */ + public function setTextMode($textmode, $untilTag = null) + { + $this->textMode = $textmode & (Elements::TEXT_RAW | Elements::TEXT_RCDATA); + $this->untilTag = $untilTag; + } + + /** + * Consume a character and make a move. + * HTML5 8.2.4.1. + */ + protected function consumeData() + { + $tok = $this->scanner->current(); + + if ('&' === $tok) { + // Character reference + $ref = $this->decodeCharacterReference(); + $this->buffer($ref); + + $tok = $this->scanner->current(); + } + + // Parse tag + if ('<' === $tok) { + // Any buffered text data can go out now. + $this->flushBuffer(); + + $tok = $this->scanner->next(); + + if (false === $tok) { + // end of string + $this->parseError('Illegal tag opening'); + } elseif ('!' === $tok) { + $this->markupDeclaration(); + } elseif ('/' === $tok) { + $this->endTag(); + } elseif ('?' === $tok) { + $this->processingInstruction(); + } elseif ($this->is_alpha($tok)) { + $this->tagName(); + } else { + $this->parseError('Illegal tag opening'); + // TODO is this necessary ? + $this->characterData(); + } + + $tok = $this->scanner->current(); + } + + if (false === $tok) { + // Handle end of document + $this->eof(); + } else { + // Parse character + switch ($this->textMode) { + case Elements::TEXT_RAW: + $this->rawText($tok); + break; + + case Elements::TEXT_RCDATA: + $this->rcdata($tok); + break; + + default: + if ('<' === $tok || '&' === $tok) { + break; + } + + // NULL character + if ("\00" === $tok) { + $this->parseError('Received null character.'); + + $this->text .= $tok; + $this->scanner->consume(); + + break; + } + + $this->text .= $this->scanner->charsUntil("<&\0"); + } + } + + return $this->carryOn; + } + + /** + * Parse anything that looks like character data. + * + * Different rules apply based on the current text mode. + * + * @see Elements::TEXT_RAW Elements::TEXT_RCDATA. + */ + protected function characterData() + { + $tok = $this->scanner->current(); + if (false === $tok) { + return false; + } + switch ($this->textMode) { + case Elements::TEXT_RAW: + return $this->rawText($tok); + case Elements::TEXT_RCDATA: + return $this->rcdata($tok); + default: + if ('<' === $tok || '&' === $tok) { + return false; + } + + return $this->text($tok); + } + } + + /** + * This buffers the current token as character data. + * + * @param string $tok The current token. + * + * @return bool + */ + protected function text($tok) + { + // This should never happen... + if (false === $tok) { + return false; + } + + // NULL character + if ("\00" === $tok) { + $this->parseError('Received null character.'); + } + + $this->buffer($tok); + $this->scanner->consume(); + + return true; + } + + /** + * Read text in RAW mode. + * + * @param string $tok The current token. + * + * @return bool + */ + protected function rawText($tok) + { + if (is_null($this->untilTag)) { + return $this->text($tok); + } + + $sequence = 'untilTag . '>'; + $txt = $this->readUntilSequence($sequence); + $this->events->text($txt); + $this->setTextMode(0); + + return $this->endTag(); + } + + /** + * Read text in RCDATA mode. + * + * @param string $tok The current token. + * + * @return bool + */ + protected function rcdata($tok) + { + if (is_null($this->untilTag)) { + return $this->text($tok); + } + + $sequence = 'untilTag; + $txt = ''; + + $caseSensitive = !Elements::isHtml5Element($this->untilTag); + while (false !== $tok && !('<' == $tok && ($this->scanner->sequenceMatches($sequence, $caseSensitive)))) { + if ('&' == $tok) { + $txt .= $this->decodeCharacterReference(); + $tok = $this->scanner->current(); + } else { + $txt .= $tok; + $tok = $this->scanner->next(); + } + } + $len = strlen($sequence); + $this->scanner->consume($len); + $len += $this->scanner->whitespace(); + if ('>' !== $this->scanner->current()) { + $this->parseError('Unclosed RCDATA end tag'); + } + + $this->scanner->unconsume($len); + $this->events->text($txt); + $this->setTextMode(0); + + return $this->endTag(); + } + + /** + * If the document is read, emit an EOF event. + */ + protected function eof() + { + // fprintf(STDOUT, "EOF"); + $this->flushBuffer(); + $this->events->eof(); + $this->carryOn = false; + } + + /** + * Look for markup. + */ + protected function markupDeclaration() + { + $tok = $this->scanner->next(); + + // Comment: + if ('-' == $tok && '-' == $this->scanner->peek()) { + $this->scanner->consume(2); + + return $this->comment(); + } elseif ('D' == $tok || 'd' == $tok) { // Doctype + return $this->doctype(); + } elseif ('[' == $tok) { // CDATA section + return $this->cdataSection(); + } + + // FINISH + $this->parseError('Expected . Emit an empty comment because 8.2.4.46 says to. + if ('>' == $tok) { + // Parse error. Emit the comment token. + $this->parseError("Expected comment data, got '>'"); + $this->events->comment(''); + $this->scanner->consume(); + + return true; + } + + // Replace NULL with the replacement char. + if ("\0" == $tok) { + $tok = UTF8Utils::FFFD; + } + while (!$this->isCommentEnd()) { + $comment .= $tok; + $tok = $this->scanner->next(); + } + + $this->events->comment($comment); + $this->scanner->consume(); + + return true; + } + + /** + * Check if the scanner has reached the end of a comment. + * + * @return bool + */ + protected function isCommentEnd() + { + $tok = $this->scanner->current(); + + // EOF + if (false === $tok) { + // Hit the end. + $this->parseError('Unexpected EOF in a comment.'); + + return true; + } + + // If next two tokens are not '--', not the end. + if ('-' != $tok || '-' != $this->scanner->peek()) { + return false; + } + + $this->scanner->consume(2); // Consume '-' and one of '!' or '>' + + // Test for '>' + if ('>' == $this->scanner->current()) { + return true; + } + // Test for '!>' + if ('!' == $this->scanner->current() && '>' == $this->scanner->peek()) { + $this->scanner->consume(); // Consume the last '>' + + return true; + } + // Unread '-' and one of '!' or '>'; + $this->scanner->unconsume(2); + + return false; + } + + /** + * Parse a DOCTYPE. + * + * Parse a DOCTYPE declaration. This method has strong bearing on whether or + * not Quirksmode is enabled on the event handler. + * + * @todo This method is a little long. Should probably refactor. + * + * @return bool + */ + protected function doctype() + { + // Check that string is DOCTYPE. + if ($this->scanner->sequenceMatches('DOCTYPE', false)) { + $this->scanner->consume(7); + } else { + $chars = $this->scanner->charsWhile('DOCTYPEdoctype'); + $this->parseError('Expected DOCTYPE, got %s', $chars); + + return $this->bogusComment('scanner->whitespace(); + $tok = $this->scanner->current(); + + // EOF: die. + if (false === $tok) { + $this->events->doctype('html5', EventHandler::DOCTYPE_NONE, '', true); + $this->eof(); + + return true; + } + + // NULL char: convert. + if ("\0" === $tok) { + $this->parseError('Unexpected null character in DOCTYPE.'); + } + + $stop = " \n\f>"; + $doctypeName = $this->scanner->charsUntil($stop); + // Lowercase ASCII, replace \0 with FFFD + $doctypeName = strtolower(strtr($doctypeName, "\0", UTF8Utils::FFFD)); + + $tok = $this->scanner->current(); + + // If false, emit a parse error, DOCTYPE, and return. + if (false === $tok) { + $this->parseError('Unexpected EOF in DOCTYPE declaration.'); + $this->events->doctype($doctypeName, EventHandler::DOCTYPE_NONE, null, true); + + return true; + } + + // Short DOCTYPE, like + if ('>' == $tok) { + // DOCTYPE without a name. + if (0 == strlen($doctypeName)) { + $this->parseError('Expected a DOCTYPE name. Got nothing.'); + $this->events->doctype($doctypeName, 0, null, true); + $this->scanner->consume(); + + return true; + } + $this->events->doctype($doctypeName); + $this->scanner->consume(); + + return true; + } + $this->scanner->whitespace(); + + $pub = strtoupper($this->scanner->getAsciiAlpha()); + $white = $this->scanner->whitespace(); + + // Get ID, and flag it as pub or system. + if (('PUBLIC' == $pub || 'SYSTEM' == $pub) && $white > 0) { + // Get the sys ID. + $type = 'PUBLIC' == $pub ? EventHandler::DOCTYPE_PUBLIC : EventHandler::DOCTYPE_SYSTEM; + $id = $this->quotedString("\0>"); + if (false === $id) { + $this->events->doctype($doctypeName, $type, $pub, false); + + return true; + } + + // Premature EOF. + if (false === $this->scanner->current()) { + $this->parseError('Unexpected EOF in DOCTYPE'); + $this->events->doctype($doctypeName, $type, $id, true); + + return true; + } + + // Well-formed complete DOCTYPE. + $this->scanner->whitespace(); + if ('>' == $this->scanner->current()) { + $this->events->doctype($doctypeName, $type, $id, false); + $this->scanner->consume(); + + return true; + } + + // If we get here, we have scanner->charsUntil('>'); + $this->parseError('Malformed DOCTYPE.'); + $this->events->doctype($doctypeName, $type, $id, true); + $this->scanner->consume(); + + return true; + } + + // Else it's a bogus DOCTYPE. + // Consume to > and trash. + $this->scanner->charsUntil('>'); + + $this->parseError('Expected PUBLIC or SYSTEM. Got %s.', $pub); + $this->events->doctype($doctypeName, 0, null, true); + $this->scanner->consume(); + + return true; + } + + /** + * Utility for reading a quoted string. + * + * @param string $stopchars Characters (in addition to a close-quote) that should stop the string. + * E.g. sometimes '>' is higher precedence than '"' or "'". + * + * @return mixed String if one is found (quotations omitted). + */ + protected function quotedString($stopchars) + { + $tok = $this->scanner->current(); + if ('"' == $tok || "'" == $tok) { + $this->scanner->consume(); + $ret = $this->scanner->charsUntil($tok . $stopchars); + if ($this->scanner->current() == $tok) { + $this->scanner->consume(); + } else { + // Parse error because no close quote. + $this->parseError('Expected %s, got %s', $tok, $this->scanner->current()); + } + + return $ret; + } + + return false; + } + + /** + * Handle a CDATA section. + * + * @return bool + */ + protected function cdataSection() + { + $cdata = ''; + $this->scanner->consume(); + + $chars = $this->scanner->charsWhile('CDAT'); + if ('CDATA' != $chars || '[' != $this->scanner->current()) { + $this->parseError('Expected [CDATA[, got %s', $chars); + + return $this->bogusComment('scanner->next(); + do { + if (false === $tok) { + $this->parseError('Unexpected EOF inside CDATA.'); + $this->bogusComment('scanner->next(); + } while (!$this->scanner->sequenceMatches(']]>')); + + // Consume ]]> + $this->scanner->consume(3); + + $this->events->cdata($cdata); + + return true; + } + + // ================================================================ + // Non-HTML5 + // ================================================================ + + /** + * Handle a processing instruction. + * + * XML processing instructions are supposed to be ignored in HTML5, + * treated as "bogus comments". However, since we're not a user + * agent, we allow them. We consume until ?> and then issue a + * EventListener::processingInstruction() event. + * + * @return bool + */ + protected function processingInstruction() + { + if ('?' != $this->scanner->current()) { + return false; + } + + $tok = $this->scanner->next(); + $procName = $this->scanner->getAsciiAlpha(); + $white = $this->scanner->whitespace(); + + // If not a PI, send to bogusComment. + if (0 == strlen($procName) || 0 == $white || false == $this->scanner->current()) { + $this->parseError("Expected processing instruction name, got $tok"); + $this->bogusComment('. + while (!('?' == $this->scanner->current() && '>' == $this->scanner->peek())) { + $data .= $this->scanner->current(); + + $tok = $this->scanner->next(); + if (false === $tok) { + $this->parseError('Unexpected EOF in processing instruction.'); + $this->events->processingInstruction($procName, $data); + + return true; + } + } + + $this->scanner->consume(2); // Consume the closing tag + $this->events->processingInstruction($procName, $data); + + return true; + } + + // ================================================================ + // UTILITY FUNCTIONS + // ================================================================ + + /** + * Read from the input stream until we get to the desired sequene + * or hit the end of the input stream. + * + * @param string $sequence + * + * @return string + */ + protected function readUntilSequence($sequence) + { + $buffer = ''; + + // Optimization for reading larger blocks faster. + $first = substr($sequence, 0, 1); + while (false !== $this->scanner->current()) { + $buffer .= $this->scanner->charsUntil($first); + + // Stop as soon as we hit the stopping condition. + if ($this->scanner->sequenceMatches($sequence, false)) { + return $buffer; + } + $buffer .= $this->scanner->current(); + $this->scanner->consume(); + } + + // If we get here, we hit the EOF. + $this->parseError('Unexpected EOF during text read.'); + + return $buffer; + } + + /** + * Check if upcomming chars match the given sequence. + * + * This will read the stream for the $sequence. If it's + * found, this will return true. If not, return false. + * Since this unconsumes any chars it reads, the caller + * will still need to read the next sequence, even if + * this returns true. + * + * Example: $this->scanner->sequenceMatches('') will + * see if the input stream is at the start of a + * '' string. + * + * @param string $sequence + * @param bool $caseSensitive + * + * @return bool + */ + protected function sequenceMatches($sequence, $caseSensitive = true) + { + @trigger_error(__METHOD__ . ' method is deprecated since version 2.4 and will be removed in 3.0. Use Scanner::sequenceMatches() instead.', E_USER_DEPRECATED); + + return $this->scanner->sequenceMatches($sequence, $caseSensitive); + } + + /** + * Send a TEXT event with the contents of the text buffer. + * + * This emits an EventHandler::text() event with the current contents of the + * temporary text buffer. (The buffer is used to group as much PCDATA + * as we can instead of emitting lots and lots of TEXT events.) + */ + protected function flushBuffer() + { + if ('' === $this->text) { + return; + } + $this->events->text($this->text); + $this->text = ''; + } + + /** + * Add text to the temporary buffer. + * + * @see flushBuffer() + * + * @param string $str + */ + protected function buffer($str) + { + $this->text .= $str; + } + + /** + * Emit a parse error. + * + * A parse error always returns false because it never consumes any + * characters. + * + * @param string $msg + * + * @return string + */ + protected function parseError($msg) + { + $args = func_get_args(); + + if (count($args) > 1) { + array_shift($args); + $msg = vsprintf($msg, $args); + } + + $line = $this->scanner->currentLine(); + $col = $this->scanner->columnOffset(); + $this->events->parseError($msg, $line, $col); + + return false; + } + + /** + * Decode a character reference and return the string. + * + * If $inAttribute is set to true, a bare & will be returned as-is. + * + * @param bool $inAttribute Set to true if the text is inside of an attribute value. + * false otherwise. + * + * @return string + */ + protected function decodeCharacterReference($inAttribute = false) + { + // Next char after &. + $tok = $this->scanner->next(); + $start = $this->scanner->position(); + + if (false === $tok) { + return '&'; + } + + // These indicate not an entity. We return just + // the &. + if ("\t" === $tok || "\n" === $tok || "\f" === $tok || ' ' === $tok || '&' === $tok || '<' === $tok) { + // $this->scanner->next(); + return '&'; + } + + // Numeric entity + if ('#' === $tok) { + $tok = $this->scanner->next(); + + if (false === $tok) { + $this->parseError('Expected &#DEC; &#HEX;, got EOF'); + $this->scanner->unconsume(1); + + return '&'; + } + + // Hexadecimal encoding. + // X[0-9a-fA-F]+; + // x[0-9a-fA-F]+; + if ('x' === $tok || 'X' === $tok) { + $tok = $this->scanner->next(); // Consume x + + // Convert from hex code to char. + $hex = $this->scanner->getHex(); + if (empty($hex)) { + $this->parseError('Expected &#xHEX;, got &#x%s', $tok); + // We unconsume because we don't know what parser rules might + // be in effect for the remaining chars. For example. '&#>' + // might result in a specific parsing rule inside of tag + // contexts, while not inside of pcdata context. + $this->scanner->unconsume(2); + + return '&'; + } + $entity = CharacterReference::lookupHex($hex); + } // Decimal encoding. + // [0-9]+; + else { + // Convert from decimal to char. + $numeric = $this->scanner->getNumeric(); + if (false === $numeric) { + $this->parseError('Expected &#DIGITS;, got &#%s', $tok); + $this->scanner->unconsume(2); + + return '&'; + } + $entity = CharacterReference::lookupDecimal($numeric); + } + } elseif ('=' === $tok && $inAttribute) { + return '&'; + } else { // String entity. + // Attempt to consume a string up to a ';'. + // [a-zA-Z0-9]+; + $cname = $this->scanner->getAsciiAlphaNum(); + $entity = CharacterReference::lookupName($cname); + + // When no entity is found provide the name of the unmatched string + // and continue on as the & is not part of an entity. The & will + // be converted to & elsewhere. + if (null === $entity) { + if (!$inAttribute || '' === $cname) { + $this->parseError("No match in entity table for '%s'", $cname); + } + $this->scanner->unconsume($this->scanner->position() - $start); + + return '&'; + } + } + + // The scanner has advanced the cursor for us. + $tok = $this->scanner->current(); + + // We have an entity. We're done here. + if (';' === $tok) { + $this->scanner->consume(); + + return $entity; + } + + // Failing to match ; means unconsume the entire string. + $this->scanner->unconsume($this->scanner->position() - $start); + + $this->parseError('Expected &ENTITY;, got &ENTITY%s (no trailing ;) ', $tok); + + return '&'; + } + + /** + * Checks whether a (single-byte) character is an ASCII letter or not. + * + * @param string $input A single-byte string + * + * @return bool True if it is a letter, False otherwise + */ + protected function is_alpha($input) + { + $code = ord($input); + + return ($code >= 97 && $code <= 122) || ($code >= 65 && $code <= 90); + } +} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php b/dompdf/vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php new file mode 100644 index 0000000..4c6983b --- /dev/null +++ b/dompdf/vendor/masterminds/html5/src/HTML5/Parser/TreeBuildingRules.php @@ -0,0 +1,126 @@ + 1, + 'dd' => 1, + 'dt' => 1, + 'rt' => 1, + 'rp' => 1, + 'tr' => 1, + 'th' => 1, + 'td' => 1, + 'thead' => 1, + 'tfoot' => 1, + 'tbody' => 1, + 'table' => 1, + 'optgroup' => 1, + 'option' => 1, + ); + + /** + * Returns true if the given tagname has special processing rules. + */ + public function hasRules($tagname) + { + return isset(static::$tags[$tagname]); + } + + /** + * Evaluate the rule for the current tag name. + * + * This may modify the existing DOM. + * + * @return \DOMElement The new Current DOM element. + */ + public function evaluate($new, $current) + { + switch ($new->tagName) { + case 'li': + return $this->handleLI($new, $current); + case 'dt': + case 'dd': + return $this->handleDT($new, $current); + case 'rt': + case 'rp': + return $this->handleRT($new, $current); + case 'optgroup': + return $this->closeIfCurrentMatches($new, $current, array( + 'optgroup', + )); + case 'option': + return $this->closeIfCurrentMatches($new, $current, array( + 'option', + )); + case 'tr': + return $this->closeIfCurrentMatches($new, $current, array( + 'tr', + )); + case 'td': + case 'th': + return $this->closeIfCurrentMatches($new, $current, array( + 'th', + 'td', + )); + case 'tbody': + case 'thead': + case 'tfoot': + case 'table': // Spec isn't explicit about this, but it's necessary. + return $this->closeIfCurrentMatches($new, $current, array( + 'thead', + 'tfoot', + 'tbody', + )); + } + + return $current; + } + + protected function handleLI($ele, $current) + { + return $this->closeIfCurrentMatches($ele, $current, array( + 'li', + )); + } + + protected function handleDT($ele, $current) + { + return $this->closeIfCurrentMatches($ele, $current, array( + 'dt', + 'dd', + )); + } + + protected function handleRT($ele, $current) + { + return $this->closeIfCurrentMatches($ele, $current, array( + 'rt', + 'rp', + )); + } + + protected function closeIfCurrentMatches($ele, $current, $match) + { + if (in_array($current->tagName, $match, true)) { + $current->parentNode->appendChild($ele); + } else { + $current->appendChild($ele); + } + + return $ele; + } +} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Parser/UTF8Utils.php b/dompdf/vendor/masterminds/html5/src/HTML5/Parser/UTF8Utils.php new file mode 100644 index 0000000..4405e4c --- /dev/null +++ b/dompdf/vendor/masterminds/html5/src/HTML5/Parser/UTF8Utils.php @@ -0,0 +1,177 @@ + + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +use Masterminds\HTML5\Exception; + +class UTF8Utils +{ + /** + * The Unicode replacement character. + */ + const FFFD = "\xEF\xBF\xBD"; + + /** + * Count the number of characters in a string. + * UTF-8 aware. This will try (in order) iconv, MB, and finally a custom counter. + * + * @param string $string + * + * @return int + */ + public static function countChars($string) + { + // Get the length for the string we need. + if (function_exists('mb_strlen')) { + return mb_strlen($string, 'utf-8'); + } + + if (function_exists('iconv_strlen')) { + return iconv_strlen($string, 'utf-8'); + } + + $count = count_chars($string); + + // 0x80 = 0x7F - 0 + 1 (one added to get inclusive range) + // 0x33 = 0xF4 - 0x2C + 1 (one added to get inclusive range) + return array_sum(array_slice($count, 0, 0x80)) + array_sum(array_slice($count, 0xC2, 0x33)); + } + + /** + * Convert data from the given encoding to UTF-8. + * + * This has not yet been tested with charactersets other than UTF-8. + * It should work with ISO-8859-1/-13 and standard Latin Win charsets. + * + * @param string $data The data to convert + * @param string $encoding A valid encoding. Examples: http://www.php.net/manual/en/mbstring.supported-encodings.php + * + * @return string + */ + public static function convertToUTF8($data, $encoding = 'UTF-8') + { + /* + * From the HTML5 spec: Given an encoding, the bytes in the input stream must be converted + * to Unicode characters for the tokeniser, as described by the rules for that encoding, + * except that the leading U+FEFF BYTE ORDER MARK character, if any, must not be stripped + * by the encoding layer (it is stripped by the rule below). Bytes or sequences of bytes + * in the original byte stream that could not be converted to Unicode characters must be + * converted to U+FFFD REPLACEMENT CHARACTER code points. + */ + + // mb_convert_encoding is chosen over iconv because of a bug. The best + // details for the bug are on http://us1.php.net/manual/en/function.iconv.php#108643 + // which contains links to the actual but reports as well as work around + // details. + if (function_exists('mb_convert_encoding')) { + // mb library has the following behaviors: + // - UTF-16 surrogates result in false. + // - Overlongs and outside Plane 16 result in empty strings. + + // Before we run mb_convert_encoding we need to tell it what to do with + // characters it does not know. This could be different than the parent + // application executing this library so we store the value, change it + // to our needs, and then change it back when we are done. This feels + // a little excessive and it would be great if there was a better way. + $save = mb_substitute_character(); + mb_substitute_character('none'); + $data = mb_convert_encoding($data, 'UTF-8', $encoding); + mb_substitute_character($save); + } + // @todo Get iconv running in at least some environments if that is possible. + elseif (function_exists('iconv') && 'auto' !== $encoding) { + // fprintf(STDOUT, "iconv found\n"); + // iconv has the following behaviors: + // - Overlong representations are ignored. + // - Beyond Plane 16 is replaced with a lower char. + // - Incomplete sequences generate a warning. + $data = @iconv($encoding, 'UTF-8//IGNORE', $data); + } else { + throw new Exception('Not implemented, please install mbstring or iconv'); + } + + /* + * One leading U+FEFF BYTE ORDER MARK character must be ignored if any are present. + */ + if ("\xEF\xBB\xBF" === substr($data, 0, 3)) { + $data = substr($data, 3); + } + + return $data; + } + + /** + * Checks for Unicode code points that are not valid in a document. + * + * @param string $data A string to analyze + * + * @return array An array of (string) error messages produced by the scanning + */ + public static function checkForIllegalCodepoints($data) + { + // Vestigal error handling. + $errors = array(); + + /* + * All U+0000 null characters in the input must be replaced by U+FFFD REPLACEMENT CHARACTERs. + * Any occurrences of such characters is a parse error. + */ + for ($i = 0, $count = substr_count($data, "\0"); $i < $count; ++$i) { + $errors[] = 'null-character'; + } + + /* + * Any occurrences of any characters in the ranges U+0001 to U+0008, U+000B, U+000E to U+001F, U+007F + * to U+009F, U+D800 to U+DFFF , U+FDD0 to U+FDEF, and characters U+FFFE, U+FFFF, U+1FFFE, U+1FFFF, + * U+2FFFE, U+2FFFF, U+3FFFE, U+3FFFF, U+4FFFE, U+4FFFF, U+5FFFE, U+5FFFF, U+6FFFE, U+6FFFF, U+7FFFE, + * U+7FFFF, U+8FFFE, U+8FFFF, U+9FFFE, U+9FFFF, U+AFFFE, U+AFFFF, U+BFFFE, U+BFFFF, U+CFFFE, U+CFFFF, + * U+DFFFE, U+DFFFF, U+EFFFE, U+EFFFF, U+FFFFE, U+FFFFF, U+10FFFE, and U+10FFFF are parse errors. + * (These are all control characters or permanently undefined Unicode characters.) + */ + // Check PCRE is loaded. + $count = preg_match_all( + '/(?: + [\x01-\x08\x0B\x0E-\x1F\x7F] # U+0001 to U+0008, U+000B, U+000E to U+001F and U+007F + | + \xC2[\x80-\x9F] # U+0080 to U+009F + | + \xED(?:\xA0[\x80-\xFF]|[\xA1-\xBE][\x00-\xFF]|\xBF[\x00-\xBF]) # U+D800 to U+DFFFF + | + \xEF\xB7[\x90-\xAF] # U+FDD0 to U+FDEF + | + \xEF\xBF[\xBE\xBF] # U+FFFE and U+FFFF + | + [\xF0-\xF4][\x8F-\xBF]\xBF[\xBE\xBF] # U+nFFFE and U+nFFFF (1 <= n <= 10_{16}) + )/x', $data, $matches); + for ($i = 0; $i < $count; ++$i) { + $errors[] = 'invalid-codepoint'; + } + + return $errors; + } +} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/HTML5Entities.php b/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/HTML5Entities.php new file mode 100644 index 0000000..e9421a1 --- /dev/null +++ b/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/HTML5Entities.php @@ -0,0 +1,1533 @@ + ' ', + "\n" => ' ', + '!' => '!', + '"' => '"', + '#' => '#', + '$' => '$', + '%' => '%', + '&' => '&', + '\'' => ''', + '(' => '(', + ')' => ')', + '*' => '*', + '+' => '+', + ',' => ',', + '.' => '.', + '/' => '/', + ':' => ':', + ';' => ';', + '<' => '<', + '<⃒' => '&nvlt', + '=' => '=', + '=⃥' => '&bne', + '>' => '>', + '>⃒' => '&nvgt', + '?' => '?', + '@' => '@', + '[' => '[', + '\\' => '\', + ']' => ']', + '^' => '^', + '_' => '_', + '`' => '`', + 'fj' => '&fjlig', + '{' => '{', + '|' => '|', + '}' => '}', + ' ' => ' ', + '¡' => '¡', + '¢' => '¢', + '£' => '£', + '¤' => '¤', + '¥' => '¥', + '¦' => '¦', + '§' => '§', + '¨' => '¨', + '©' => '©', + 'ª' => 'ª', + '«' => '«', + '¬' => '¬', + '­' => '­', + '®' => '®', + '¯' => '¯', + '°' => '°', + '±' => '±', + '²' => '²', + '³' => '³', + '´' => '´', + 'µ' => 'µ', + '¶' => '¶', + '·' => '·', + '¸' => '¸', + '¹' => '¹', + 'º' => 'º', + '»' => '»', + '¼' => '¼', + '½' => '½', + '¾' => '¾', + '¿' => '¿', + 'À' => 'À', + 'Á' => 'Á', + 'Â' => 'Â', + 'Ã' => 'Ã', + 'Ä' => 'Ä', + 'Å' => 'Å', + 'Æ' => 'Æ', + 'Ç' => 'Ç', + 'È' => 'È', + 'É' => 'É', + 'Ê' => 'Ê', + 'Ë' => 'Ë', + 'Ì' => 'Ì', + 'Í' => 'Í', + 'Î' => 'Î', + 'Ï' => 'Ï', + 'Ð' => 'Ð', + 'Ñ' => 'Ñ', + 'Ò' => 'Ò', + 'Ó' => 'Ó', + 'Ô' => 'Ô', + 'Õ' => 'Õ', + 'Ö' => 'Ö', + '×' => '×', + 'Ø' => 'Ø', + 'Ù' => 'Ù', + 'Ú' => 'Ú', + 'Û' => 'Û', + 'Ü' => 'Ü', + 'Ý' => 'Ý', + 'Þ' => 'Þ', + 'ß' => 'ß', + 'à' => 'à', + 'á' => 'á', + 'â' => 'â', + 'ã' => 'ã', + 'ä' => 'ä', + 'å' => 'å', + 'æ' => 'æ', + 'ç' => 'ç', + 'è' => 'è', + 'é' => 'é', + 'ê' => 'ê', + 'ë' => 'ë', + 'ì' => 'ì', + 'í' => 'í', + 'î' => 'î', + 'ï' => 'ï', + 'ð' => 'ð', + 'ñ' => 'ñ', + 'ò' => 'ò', + 'ó' => 'ó', + 'ô' => 'ô', + 'õ' => 'õ', + 'ö' => 'ö', + '÷' => '÷', + 'ø' => 'ø', + 'ù' => 'ù', + 'ú' => 'ú', + 'û' => 'û', + 'ü' => 'ü', + 'ý' => 'ý', + 'þ' => 'þ', + 'ÿ' => 'ÿ', + 'Ā' => 'Ā', + 'ā' => 'ā', + 'Ă' => 'Ă', + 'ă' => 'ă', + 'Ą' => 'Ą', + 'ą' => 'ą', + 'Ć' => 'Ć', + 'ć' => 'ć', + 'Ĉ' => 'Ĉ', + 'ĉ' => 'ĉ', + 'Ċ' => 'Ċ', + 'ċ' => 'ċ', + 'Č' => 'Č', + 'č' => 'č', + 'Ď' => 'Ď', + 'ď' => 'ď', + 'Đ' => 'Đ', + 'đ' => 'đ', + 'Ē' => 'Ē', + 'ē' => 'ē', + 'Ė' => 'Ė', + 'ė' => 'ė', + 'Ę' => 'Ę', + 'ę' => 'ę', + 'Ě' => 'Ě', + 'ě' => 'ě', + 'Ĝ' => 'Ĝ', + 'ĝ' => 'ĝ', + 'Ğ' => 'Ğ', + 'ğ' => 'ğ', + 'Ġ' => 'Ġ', + 'ġ' => 'ġ', + 'Ģ' => 'Ģ', + 'Ĥ' => 'Ĥ', + 'ĥ' => 'ĥ', + 'Ħ' => 'Ħ', + 'ħ' => 'ħ', + 'Ĩ' => 'Ĩ', + 'ĩ' => 'ĩ', + 'Ī' => 'Ī', + 'ī' => 'ī', + 'Į' => 'Į', + 'į' => 'į', + 'İ' => 'İ', + 'ı' => 'ı', + 'IJ' => 'IJ', + 'ij' => 'ij', + 'Ĵ' => 'Ĵ', + 'ĵ' => 'ĵ', + 'Ķ' => 'Ķ', + 'ķ' => 'ķ', + 'ĸ' => 'ĸ', + 'Ĺ' => 'Ĺ', + 'ĺ' => 'ĺ', + 'Ļ' => 'Ļ', + 'ļ' => 'ļ', + 'Ľ' => 'Ľ', + 'ľ' => 'ľ', + 'Ŀ' => 'Ŀ', + 'ŀ' => 'ŀ', + 'Ł' => 'Ł', + 'ł' => 'ł', + 'Ń' => 'Ń', + 'ń' => 'ń', + 'Ņ' => 'Ņ', + 'ņ' => 'ņ', + 'Ň' => 'Ň', + 'ň' => 'ň', + 'ʼn' => 'ʼn', + 'Ŋ' => 'Ŋ', + 'ŋ' => 'ŋ', + 'Ō' => 'Ō', + 'ō' => 'ō', + 'Ő' => 'Ő', + 'ő' => 'ő', + 'Œ' => 'Œ', + 'œ' => 'œ', + 'Ŕ' => 'Ŕ', + 'ŕ' => 'ŕ', + 'Ŗ' => 'Ŗ', + 'ŗ' => 'ŗ', + 'Ř' => 'Ř', + 'ř' => 'ř', + 'Ś' => 'Ś', + 'ś' => 'ś', + 'Ŝ' => 'Ŝ', + 'ŝ' => 'ŝ', + 'Ş' => 'Ş', + 'ş' => 'ş', + 'Š' => 'Š', + 'š' => 'š', + 'Ţ' => 'Ţ', + 'ţ' => 'ţ', + 'Ť' => 'Ť', + 'ť' => 'ť', + 'Ŧ' => 'Ŧ', + 'ŧ' => 'ŧ', + 'Ũ' => 'Ũ', + 'ũ' => 'ũ', + 'Ū' => 'Ū', + 'ū' => 'ū', + 'Ŭ' => 'Ŭ', + 'ŭ' => 'ŭ', + 'Ů' => 'Ů', + 'ů' => 'ů', + 'Ű' => 'Ű', + 'ű' => 'ű', + 'Ų' => 'Ų', + 'ų' => 'ų', + 'Ŵ' => 'Ŵ', + 'ŵ' => 'ŵ', + 'Ŷ' => 'Ŷ', + 'ŷ' => 'ŷ', + 'Ÿ' => 'Ÿ', + 'Ź' => 'Ź', + 'ź' => 'ź', + 'Ż' => 'Ż', + 'ż' => 'ż', + 'Ž' => 'Ž', + 'ž' => 'ž', + 'ƒ' => 'ƒ', + 'Ƶ' => 'Ƶ', + 'ǵ' => 'ǵ', + 'ȷ' => 'ȷ', + 'ˆ' => 'ˆ', + 'ˇ' => 'ˇ', + '˘' => '˘', + '˙' => '˙', + '˚' => '˚', + '˛' => '˛', + '˜' => '˜', + '˝' => '˝', + '̑' => '̑', + 'Α' => 'Α', + 'Β' => 'Β', + 'Γ' => 'Γ', + 'Δ' => 'Δ', + 'Ε' => 'Ε', + 'Ζ' => 'Ζ', + 'Η' => 'Η', + 'Θ' => 'Θ', + 'Ι' => 'Ι', + 'Κ' => 'Κ', + 'Λ' => 'Λ', + 'Μ' => 'Μ', + 'Ν' => 'Ν', + 'Ξ' => 'Ξ', + 'Ο' => 'Ο', + 'Π' => 'Π', + 'Ρ' => 'Ρ', + 'Σ' => 'Σ', + 'Τ' => 'Τ', + 'Υ' => 'Υ', + 'Φ' => 'Φ', + 'Χ' => 'Χ', + 'Ψ' => 'Ψ', + 'Ω' => 'Ω', + 'α' => 'α', + 'β' => 'β', + 'γ' => 'γ', + 'δ' => 'δ', + 'ε' => 'ε', + 'ζ' => 'ζ', + 'η' => 'η', + 'θ' => 'θ', + 'ι' => 'ι', + 'κ' => 'κ', + 'λ' => 'λ', + 'μ' => 'μ', + 'ν' => 'ν', + 'ξ' => 'ξ', + 'ο' => 'ο', + 'π' => 'π', + 'ρ' => 'ρ', + 'ς' => 'ς', + 'σ' => 'σ', + 'τ' => 'τ', + 'υ' => 'υ', + 'φ' => 'φ', + 'χ' => 'χ', + 'ψ' => 'ψ', + 'ω' => 'ω', + 'ϑ' => 'ϑ', + 'ϒ' => 'ϒ', + 'ϕ' => 'ϕ', + 'ϖ' => 'ϖ', + 'Ϝ' => 'Ϝ', + 'ϝ' => 'ϝ', + 'ϰ' => 'ϰ', + 'ϱ' => 'ϱ', + 'ϵ' => 'ϵ', + '϶' => '϶', + 'Ё' => 'Ё', + 'Ђ' => 'Ђ', + 'Ѓ' => 'Ѓ', + 'Є' => 'Є', + 'Ѕ' => 'Ѕ', + 'І' => 'І', + 'Ї' => 'Ї', + 'Ј' => 'Ј', + 'Љ' => 'Љ', + 'Њ' => 'Њ', + 'Ћ' => 'Ћ', + 'Ќ' => 'Ќ', + 'Ў' => 'Ў', + 'Џ' => 'Џ', + 'А' => 'А', + 'Б' => 'Б', + 'В' => 'В', + 'Г' => 'Г', + 'Д' => 'Д', + 'Е' => 'Е', + 'Ж' => 'Ж', + 'З' => 'З', + 'И' => 'И', + 'Й' => 'Й', + 'К' => 'К', + 'Л' => 'Л', + 'М' => 'М', + 'Н' => 'Н', + 'О' => 'О', + 'П' => 'П', + 'Р' => 'Р', + 'С' => 'С', + 'Т' => 'Т', + 'У' => 'У', + 'Ф' => 'Ф', + 'Х' => 'Х', + 'Ц' => 'Ц', + 'Ч' => 'Ч', + 'Ш' => 'Ш', + 'Щ' => 'Щ', + 'Ъ' => 'Ъ', + 'Ы' => 'Ы', + 'Ь' => 'Ь', + 'Э' => 'Э', + 'Ю' => 'Ю', + 'Я' => 'Я', + 'а' => 'а', + 'б' => 'б', + 'в' => 'в', + 'г' => 'г', + 'д' => 'д', + 'е' => 'е', + 'ж' => 'ж', + 'з' => 'з', + 'и' => 'и', + 'й' => 'й', + 'к' => 'к', + 'л' => 'л', + 'м' => 'м', + 'н' => 'н', + 'о' => 'о', + 'п' => 'п', + 'р' => 'р', + 'с' => 'с', + 'т' => 'т', + 'у' => 'у', + 'ф' => 'ф', + 'х' => 'х', + 'ц' => 'ц', + 'ч' => 'ч', + 'ш' => 'ш', + 'щ' => 'щ', + 'ъ' => 'ъ', + 'ы' => 'ы', + 'ь' => 'ь', + 'э' => 'э', + 'ю' => 'ю', + 'я' => 'я', + 'ё' => 'ё', + 'ђ' => 'ђ', + 'ѓ' => 'ѓ', + 'є' => 'є', + 'ѕ' => 'ѕ', + 'і' => 'і', + 'ї' => 'ї', + 'ј' => 'ј', + 'љ' => 'љ', + 'њ' => 'њ', + 'ћ' => 'ћ', + 'ќ' => 'ќ', + 'ў' => 'ў', + 'џ' => 'џ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + ' ' => ' ', + '​' => '​', + '‌' => '‌', + '‍' => '‍', + '‎' => '‎', + '‏' => '‏', + '‐' => '‐', + '–' => '–', + '—' => '—', + '―' => '―', + '‖' => '‖', + '‘' => '‘', + '’' => '’', + '‚' => '‚', + '“' => '“', + '”' => '”', + '„' => '„', + '†' => '†', + '‡' => '‡', + '•' => '•', + '‥' => '‥', + '…' => '…', + '‰' => '‰', + '‱' => '‱', + '′' => '′', + '″' => '″', + '‴' => '‴', + '‵' => '‵', + '‹' => '‹', + '›' => '›', + '‾' => '‾', + '⁁' => '⁁', + '⁃' => '⁃', + '⁄' => '⁄', + '⁏' => '⁏', + '⁗' => '⁗', + ' ' => ' ', + '  ' => '&ThickSpace', + '⁠' => '⁠', + '⁡' => '⁡', + '⁢' => '⁢', + '⁣' => '⁣', + '€' => '€', + '⃛' => '⃛', + '⃜' => '⃜', + 'ℂ' => 'ℂ', + '℅' => '℅', + 'ℊ' => 'ℊ', + 'ℋ' => 'ℋ', + 'ℌ' => 'ℌ', + 'ℍ' => 'ℍ', + 'ℎ' => 'ℎ', + 'ℏ' => 'ℏ', + 'ℐ' => 'ℐ', + 'ℑ' => 'ℑ', + 'ℒ' => 'ℒ', + 'ℓ' => 'ℓ', + 'ℕ' => 'ℕ', + '№' => '№', + '℗' => '℗', + '℘' => '℘', + 'ℙ' => 'ℙ', + 'ℚ' => 'ℚ', + 'ℛ' => 'ℛ', + 'ℜ' => 'ℜ', + 'ℝ' => 'ℝ', + '℞' => '℞', + '™' => '™', + 'ℤ' => 'ℤ', + '℧' => '℧', + 'ℨ' => 'ℨ', + '℩' => '℩', + 'ℬ' => 'ℬ', + 'ℭ' => 'ℭ', + 'ℯ' => 'ℯ', + 'ℰ' => 'ℰ', + 'ℱ' => 'ℱ', + 'ℳ' => 'ℳ', + 'ℴ' => 'ℴ', + 'ℵ' => 'ℵ', + 'ℶ' => 'ℶ', + 'ℷ' => 'ℷ', + 'ℸ' => 'ℸ', + 'ⅅ' => 'ⅅ', + 'ⅆ' => 'ⅆ', + 'ⅇ' => 'ⅇ', + 'ⅈ' => 'ⅈ', + '⅓' => '⅓', + '⅔' => '⅔', + '⅕' => '⅕', + '⅖' => '⅖', + '⅗' => '⅗', + '⅘' => '⅘', + '⅙' => '⅙', + '⅚' => '⅚', + '⅛' => '⅛', + '⅜' => '⅜', + '⅝' => '⅝', + '⅞' => '⅞', + '←' => '←', + '↑' => '↑', + '→' => '→', + '↓' => '↓', + '↔' => '↔', + '↕' => '↕', + '↖' => '↖', + '↗' => '↗', + '↘' => '↘', + '↙' => '↙', + '↚' => '↚', + '↛' => '↛', + '↝' => '↝', + '↝̸' => '&nrarrw', + '↞' => '↞', + '↟' => '↟', + '↠' => '↠', + '↡' => '↡', + '↢' => '↢', + '↣' => '↣', + '↤' => '↤', + '↥' => '↥', + '↦' => '↦', + '↧' => '↧', + '↩' => '↩', + '↪' => '↪', + '↫' => '↫', + '↬' => '↬', + '↭' => '↭', + '↮' => '↮', + '↰' => '↰', + '↱' => '↱', + '↲' => '↲', + '↳' => '↳', + '↵' => '↵', + '↶' => '↶', + '↷' => '↷', + '↺' => '↺', + '↻' => '↻', + '↼' => '↼', + '↽' => '↽', + '↾' => '↾', + '↿' => '↿', + '⇀' => '⇀', + '⇁' => '⇁', + '⇂' => '⇂', + '⇃' => '⇃', + '⇄' => '⇄', + '⇅' => '⇅', + '⇆' => '⇆', + '⇇' => '⇇', + '⇈' => '⇈', + '⇉' => '⇉', + '⇊' => '⇊', + '⇋' => '⇋', + '⇌' => '⇌', + '⇍' => '⇍', + '⇎' => '⇎', + '⇏' => '⇏', + '⇐' => '⇐', + '⇑' => '⇑', + '⇒' => '⇒', + '⇓' => '⇓', + '⇔' => '⇔', + '⇕' => '⇕', + '⇖' => '⇖', + '⇗' => '⇗', + '⇘' => '⇘', + '⇙' => '⇙', + '⇚' => '⇚', + '⇛' => '⇛', + '⇝' => '⇝', + '⇤' => '⇤', + '⇥' => '⇥', + '⇵' => '⇵', + '⇽' => '⇽', + '⇾' => '⇾', + '⇿' => '⇿', + '∀' => '∀', + '∁' => '∁', + '∂' => '∂', + '∂̸' => '&npart', + '∃' => '∃', + '∄' => '∄', + '∅' => '∅', + '∇' => '∇', + '∈' => '∈', + '∉' => '∉', + '∋' => '∋', + '∌' => '∌', + '∏' => '∏', + '∐' => '∐', + '∑' => '∑', + '−' => '−', + '∓' => '∓', + '∔' => '∔', + '∖' => '∖', + '∗' => '∗', + '∘' => '∘', + '√' => '√', + '∝' => '∝', + '∞' => '∞', + '∟' => '∟', + '∠' => '∠', + '∠⃒' => '&nang', + '∡' => '∡', + '∢' => '∢', + '∣' => '∣', + '∤' => '∤', + '∥' => '∥', + '∦' => '∦', + '∧' => '∧', + '∨' => '∨', + '∩' => '∩', + '∩︀' => '&caps', + '∪' => '∪', + '∪︀' => '&cups', + '∫' => '∫', + '∬' => '∬', + '∭' => '∭', + '∮' => '∮', + '∯' => '∯', + '∰' => '∰', + '∱' => '∱', + '∲' => '∲', + '∳' => '∳', + '∴' => '∴', + '∵' => '∵', + '∶' => '∶', + '∷' => '∷', + '∸' => '∸', + '∺' => '∺', + '∻' => '∻', + '∼' => '∼', + '∼⃒' => '&nvsim', + '∽' => '∽', + '∽̱' => '&race', + '∾' => '∾', + '∾̳' => '&acE', + '∿' => '∿', + '≀' => '≀', + '≁' => '≁', + '≂' => '≂', + '≂̸' => '&nesim', + '≃' => '≃', + '≄' => '≄', + '≅' => '≅', + '≆' => '≆', + '≇' => '≇', + '≈' => '≈', + '≉' => '≉', + '≊' => '≊', + '≋' => '≋', + '≋̸' => '&napid', + '≌' => '≌', + '≍' => '≍', + '≍⃒' => '&nvap', + '≎' => '≎', + '≎̸' => '&nbump', + '≏' => '≏', + '≏̸' => '&nbumpe', + '≐' => '≐', + '≐̸' => '&nedot', + '≑' => '≑', + '≒' => '≒', + '≓' => '≓', + '≔' => '≔', + '≕' => '≕', + '≖' => '≖', + '≗' => '≗', + '≙' => '≙', + '≚' => '≚', + '≜' => '≜', + '≟' => '≟', + '≠' => '≠', + '≡' => '≡', + '≡⃥' => '&bnequiv', + '≢' => '≢', + '≤' => '≤', + '≤⃒' => '&nvle', + '≥' => '≥', + '≥⃒' => '&nvge', + '≦' => '≦', + '≦̸' => '&nlE', + '≧' => '≧', + '≧̸' => '&NotGreaterFullEqual', + '≨' => '≨', + '≨︀' => '&lvertneqq', + '≩' => '≩', + '≩︀' => '&gvertneqq', + '≪' => '≪', + '≪̸' => '&nLtv', + '≪⃒' => '&nLt', + '≫' => '≫', + '≫̸' => '&NotGreaterGreater', + '≫⃒' => '&nGt', + '≬' => '≬', + '≭' => '≭', + '≮' => '≮', + '≯' => '≯', + '≰' => '≰', + '≱' => '≱', + '≲' => '≲', + '≳' => '≳', + '≴' => '≴', + '≵' => '≵', + '≶' => '≶', + '≷' => '≷', + '≸' => '≸', + '≹' => '≹', + '≺' => '≺', + '≻' => '≻', + '≼' => '≼', + '≽' => '≽', + '≾' => '≾', + '≿' => '≿', + '≿̸' => '&NotSucceedsTilde', + '⊀' => '⊀', + '⊁' => '⊁', + '⊂' => '⊂', + '⊂⃒' => '&vnsub', + '⊃' => '⊃', + '⊃⃒' => '&nsupset', + '⊄' => '⊄', + '⊅' => '⊅', + '⊆' => '⊆', + '⊇' => '⊇', + '⊈' => '⊈', + '⊉' => '⊉', + '⊊' => '⊊', + '⊊︀' => '&vsubne', + '⊋' => '⊋', + '⊋︀' => '&vsupne', + '⊍' => '⊍', + '⊎' => '⊎', + '⊏' => '⊏', + '⊏̸' => '&NotSquareSubset', + '⊐' => '⊐', + '⊐̸' => '&NotSquareSuperset', + '⊑' => '⊑', + '⊒' => '⊒', + '⊓' => '⊓', + '⊓︀' => '&sqcaps', + '⊔' => '⊔', + '⊔︀' => '&sqcups', + '⊕' => '⊕', + '⊖' => '⊖', + '⊗' => '⊗', + '⊘' => '⊘', + '⊙' => '⊙', + '⊚' => '⊚', + '⊛' => '⊛', + '⊝' => '⊝', + '⊞' => '⊞', + '⊟' => '⊟', + '⊠' => '⊠', + '⊡' => '⊡', + '⊢' => '⊢', + '⊣' => '⊣', + '⊤' => '⊤', + '⊥' => '⊥', + '⊧' => '⊧', + '⊨' => '⊨', + '⊩' => '⊩', + '⊪' => '⊪', + '⊫' => '⊫', + '⊬' => '⊬', + '⊭' => '⊭', + '⊮' => '⊮', + '⊯' => '⊯', + '⊰' => '⊰', + '⊲' => '⊲', + '⊳' => '⊳', + '⊴' => '⊴', + '⊴⃒' => '&nvltrie', + '⊵' => '⊵', + '⊵⃒' => '&nvrtrie', + '⊶' => '⊶', + '⊷' => '⊷', + '⊸' => '⊸', + '⊹' => '⊹', + '⊺' => '⊺', + '⊻' => '⊻', + '⊽' => '⊽', + '⊾' => '⊾', + '⊿' => '⊿', + '⋀' => '⋀', + '⋁' => '⋁', + '⋂' => '⋂', + '⋃' => '⋃', + '⋄' => '⋄', + '⋅' => '⋅', + '⋆' => '⋆', + '⋇' => '⋇', + '⋈' => '⋈', + '⋉' => '⋉', + '⋊' => '⋊', + '⋋' => '⋋', + '⋌' => '⋌', + '⋍' => '⋍', + '⋎' => '⋎', + '⋏' => '⋏', + '⋐' => '⋐', + '⋑' => '⋑', + '⋒' => '⋒', + '⋓' => '⋓', + '⋔' => '⋔', + '⋕' => '⋕', + '⋖' => '⋖', + '⋗' => '⋗', + '⋘' => '⋘', + '⋘̸' => '&nLl', + '⋙' => '⋙', + '⋙̸' => '&nGg', + '⋚' => '⋚', + '⋚︀' => '&lesg', + '⋛' => '⋛', + '⋛︀' => '&gesl', + '⋞' => '⋞', + '⋟' => '⋟', + '⋠' => '⋠', + '⋡' => '⋡', + '⋢' => '⋢', + '⋣' => '⋣', + '⋦' => '⋦', + '⋧' => '⋧', + '⋨' => '⋨', + '⋩' => '⋩', + '⋪' => '⋪', + '⋫' => '⋫', + '⋬' => '⋬', + '⋭' => '⋭', + '⋮' => '⋮', + '⋯' => '⋯', + '⋰' => '⋰', + '⋱' => '⋱', + '⋲' => '⋲', + '⋳' => '⋳', + '⋴' => '⋴', + '⋵' => '⋵', + '⋵̸' => '¬indot', + '⋶' => '⋶', + '⋷' => '⋷', + '⋹' => '⋹', + '⋹̸' => '¬inE', + '⋺' => '⋺', + '⋻' => '⋻', + '⋼' => '⋼', + '⋽' => '⋽', + '⋾' => '⋾', + '⌅' => '⌅', + '⌆' => '⌆', + '⌈' => '⌈', + '⌉' => '⌉', + '⌊' => '⌊', + '⌋' => '⌋', + '⌌' => '⌌', + '⌍' => '⌍', + '⌎' => '⌎', + '⌏' => '⌏', + '⌐' => '⌐', + '⌒' => '⌒', + '⌓' => '⌓', + '⌕' => '⌕', + '⌖' => '⌖', + '⌜' => '⌜', + '⌝' => '⌝', + '⌞' => '⌞', + '⌟' => '⌟', + '⌢' => '⌢', + '⌣' => '⌣', + '⌭' => '⌭', + '⌮' => '⌮', + '⌶' => '⌶', + '⌽' => '⌽', + '⌿' => '⌿', + '⍼' => '⍼', + '⎰' => '⎰', + '⎱' => '⎱', + '⎴' => '⎴', + '⎵' => '⎵', + '⎶' => '⎶', + '⏜' => '⏜', + '⏝' => '⏝', + '⏞' => '⏞', + '⏟' => '⏟', + '⏢' => '⏢', + '⏧' => '⏧', + '␣' => '␣', + 'Ⓢ' => 'Ⓢ', + '─' => '─', + '│' => '│', + '┌' => '┌', + '┐' => '┐', + '└' => '└', + '┘' => '┘', + '├' => '├', + '┤' => '┤', + '┬' => '┬', + '┴' => '┴', + '┼' => '┼', + '═' => '═', + '║' => '║', + '╒' => '╒', + '╓' => '╓', + '╔' => '╔', + '╕' => '╕', + '╖' => '╖', + '╗' => '╗', + '╘' => '╘', + '╙' => '╙', + '╚' => '╚', + '╛' => '╛', + '╜' => '╜', + '╝' => '╝', + '╞' => '╞', + '╟' => '╟', + '╠' => '╠', + '╡' => '╡', + '╢' => '╢', + '╣' => '╣', + '╤' => '╤', + '╥' => '╥', + '╦' => '╦', + '╧' => '╧', + '╨' => '╨', + '╩' => '╩', + '╪' => '╪', + '╫' => '╫', + '╬' => '╬', + '▀' => '▀', + '▄' => '▄', + '█' => '█', + '░' => '░', + '▒' => '▒', + '▓' => '▓', + '□' => '□', + '▪' => '▪', + '▫' => '▫', + '▭' => '▭', + '▮' => '▮', + '▱' => '▱', + '△' => '△', + '▴' => '▴', + '▵' => '▵', + '▸' => '▸', + '▹' => '▹', + '▽' => '▽', + '▾' => '▾', + '▿' => '▿', + '◂' => '◂', + '◃' => '◃', + '◊' => '◊', + '○' => '○', + '◬' => '◬', + '◯' => '◯', + '◸' => '◸', + '◹' => '◹', + '◺' => '◺', + '◻' => '◻', + '◼' => '◼', + '★' => '★', + '☆' => '☆', + '☎' => '☎', + '♀' => '♀', + '♂' => '♂', + '♠' => '♠', + '♣' => '♣', + '♥' => '♥', + '♦' => '♦', + '♪' => '♪', + '♭' => '♭', + '♮' => '♮', + '♯' => '♯', + '✓' => '✓', + '✗' => '✗', + '✠' => '✠', + '✶' => '✶', + '❘' => '❘', + '❲' => '❲', + '❳' => '❳', + '⟈' => '⟈', + '⟉' => '⟉', + '⟦' => '⟦', + '⟧' => '⟧', + '⟨' => '⟨', + '⟩' => '⟩', + '⟪' => '⟪', + '⟫' => '⟫', + '⟬' => '⟬', + '⟭' => '⟭', + '⟵' => '⟵', + '⟶' => '⟶', + '⟷' => '⟷', + '⟸' => '⟸', + '⟹' => '⟹', + '⟺' => '⟺', + '⟼' => '⟼', + '⟿' => '⟿', + '⤂' => '⤂', + '⤃' => '⤃', + '⤄' => '⤄', + '⤅' => '⤅', + '⤌' => '⤌', + '⤍' => '⤍', + '⤎' => '⤎', + '⤏' => '⤏', + '⤐' => '⤐', + '⤑' => '⤑', + '⤒' => '⤒', + '⤓' => '⤓', + '⤖' => '⤖', + '⤙' => '⤙', + '⤚' => '⤚', + '⤛' => '⤛', + '⤜' => '⤜', + '⤝' => '⤝', + '⤞' => '⤞', + '⤟' => '⤟', + '⤠' => '⤠', + '⤣' => '⤣', + '⤤' => '⤤', + '⤥' => '⤥', + '⤦' => '⤦', + '⤧' => '⤧', + '⤨' => '⤨', + '⤩' => '⤩', + '⤪' => '⤪', + '⤳' => '⤳', + '⤳̸' => '&nrarrc', + '⤵' => '⤵', + '⤶' => '⤶', + '⤷' => '⤷', + '⤸' => '⤸', + '⤹' => '⤹', + '⤼' => '⤼', + '⤽' => '⤽', + '⥅' => '⥅', + '⥈' => '⥈', + '⥉' => '⥉', + '⥊' => '⥊', + '⥋' => '⥋', + '⥎' => '⥎', + '⥏' => '⥏', + '⥐' => '⥐', + '⥑' => '⥑', + '⥒' => '⥒', + '⥓' => '⥓', + '⥔' => '⥔', + '⥕' => '⥕', + '⥖' => '⥖', + '⥗' => '⥗', + '⥘' => '⥘', + '⥙' => '⥙', + '⥚' => '⥚', + '⥛' => '⥛', + '⥜' => '⥜', + '⥝' => '⥝', + '⥞' => '⥞', + '⥟' => '⥟', + '⥠' => '⥠', + '⥡' => '⥡', + '⥢' => '⥢', + '⥣' => '⥣', + '⥤' => '⥤', + '⥥' => '⥥', + '⥦' => '⥦', + '⥧' => '⥧', + '⥨' => '⥨', + '⥩' => '⥩', + '⥪' => '⥪', + '⥫' => '⥫', + '⥬' => '⥬', + '⥭' => '⥭', + '⥮' => '⥮', + '⥯' => '⥯', + '⥰' => '⥰', + '⥱' => '⥱', + '⥲' => '⥲', + '⥳' => '⥳', + '⥴' => '⥴', + '⥵' => '⥵', + '⥶' => '⥶', + '⥸' => '⥸', + '⥹' => '⥹', + '⥻' => '⥻', + '⥼' => '⥼', + '⥽' => '⥽', + '⥾' => '⥾', + '⥿' => '⥿', + '⦅' => '⦅', + '⦆' => '⦆', + '⦋' => '⦋', + '⦌' => '⦌', + '⦍' => '⦍', + '⦎' => '⦎', + '⦏' => '⦏', + '⦐' => '⦐', + '⦑' => '⦑', + '⦒' => '⦒', + '⦓' => '⦓', + '⦔' => '⦔', + '⦕' => '⦕', + '⦖' => '⦖', + '⦚' => '⦚', + '⦜' => '⦜', + '⦝' => '⦝', + '⦤' => '⦤', + '⦥' => '⦥', + '⦦' => '⦦', + '⦧' => '⦧', + '⦨' => '⦨', + '⦩' => '⦩', + '⦪' => '⦪', + '⦫' => '⦫', + '⦬' => '⦬', + '⦭' => '⦭', + '⦮' => '⦮', + '⦯' => '⦯', + '⦰' => '⦰', + '⦱' => '⦱', + '⦲' => '⦲', + '⦳' => '⦳', + '⦴' => '⦴', + '⦵' => '⦵', + '⦶' => '⦶', + '⦷' => '⦷', + '⦹' => '⦹', + '⦻' => '⦻', + '⦼' => '⦼', + '⦾' => '⦾', + '⦿' => '⦿', + '⧀' => '⧀', + '⧁' => '⧁', + '⧂' => '⧂', + '⧃' => '⧃', + '⧄' => '⧄', + '⧅' => '⧅', + '⧉' => '⧉', + '⧍' => '⧍', + '⧎' => '⧎', + '⧏' => '⧏', + '⧏̸' => '&NotLeftTriangleBar', + '⧐' => '⧐', + '⧐̸' => '&NotRightTriangleBar', + '⧜' => '⧜', + '⧝' => '⧝', + '⧞' => '⧞', + '⧣' => '⧣', + '⧤' => '⧤', + '⧥' => '⧥', + '⧫' => '⧫', + '⧴' => '⧴', + '⧶' => '⧶', + '⨀' => '⨀', + '⨁' => '⨁', + '⨂' => '⨂', + '⨄' => '⨄', + '⨆' => '⨆', + '⨌' => '⨌', + '⨍' => '⨍', + '⨐' => '⨐', + '⨑' => '⨑', + '⨒' => '⨒', + '⨓' => '⨓', + '⨔' => '⨔', + '⨕' => '⨕', + '⨖' => '⨖', + '⨗' => '⨗', + '⨢' => '⨢', + '⨣' => '⨣', + '⨤' => '⨤', + '⨥' => '⨥', + '⨦' => '⨦', + '⨧' => '⨧', + '⨩' => '⨩', + '⨪' => '⨪', + '⨭' => '⨭', + '⨮' => '⨮', + '⨯' => '⨯', + '⨰' => '⨰', + '⨱' => '⨱', + '⨳' => '⨳', + '⨴' => '⨴', + '⨵' => '⨵', + '⨶' => '⨶', + '⨷' => '⨷', + '⨸' => '⨸', + '⨹' => '⨹', + '⨺' => '⨺', + '⨻' => '⨻', + '⨼' => '⨼', + '⨿' => '⨿', + '⩀' => '⩀', + '⩂' => '⩂', + '⩃' => '⩃', + '⩄' => '⩄', + '⩅' => '⩅', + '⩆' => '⩆', + '⩇' => '⩇', + '⩈' => '⩈', + '⩉' => '⩉', + '⩊' => '⩊', + '⩋' => '⩋', + '⩌' => '⩌', + '⩍' => '⩍', + '⩐' => '⩐', + '⩓' => '⩓', + '⩔' => '⩔', + '⩕' => '⩕', + '⩖' => '⩖', + '⩗' => '⩗', + '⩘' => '⩘', + '⩚' => '⩚', + '⩛' => '⩛', + '⩜' => '⩜', + '⩝' => '⩝', + '⩟' => '⩟', + '⩦' => '⩦', + '⩪' => '⩪', + '⩭' => '⩭', + '⩭̸' => '&ncongdot', + '⩮' => '⩮', + '⩯' => '⩯', + '⩰' => '⩰', + '⩰̸' => '&napE', + '⩱' => '⩱', + '⩲' => '⩲', + '⩳' => '⩳', + '⩴' => '⩴', + '⩵' => '⩵', + '⩷' => '⩷', + '⩸' => '⩸', + '⩹' => '⩹', + '⩺' => '⩺', + '⩻' => '⩻', + '⩼' => '⩼', + '⩽' => '⩽', + '⩽̸' => '&nles', + '⩾' => '⩾', + '⩾̸' => '&nges', + '⩿' => '⩿', + '⪀' => '⪀', + '⪁' => '⪁', + '⪂' => '⪂', + '⪃' => '⪃', + '⪄' => '⪄', + '⪅' => '⪅', + '⪆' => '⪆', + '⪇' => '⪇', + '⪈' => '⪈', + '⪉' => '⪉', + '⪊' => '⪊', + '⪋' => '⪋', + '⪌' => '⪌', + '⪍' => '⪍', + '⪎' => '⪎', + '⪏' => '⪏', + '⪐' => '⪐', + '⪑' => '⪑', + '⪒' => '⪒', + '⪓' => '⪓', + '⪔' => '⪔', + '⪕' => '⪕', + '⪖' => '⪖', + '⪗' => '⪗', + '⪘' => '⪘', + '⪙' => '⪙', + '⪚' => '⪚', + '⪝' => '⪝', + '⪞' => '⪞', + '⪟' => '⪟', + '⪠' => '⪠', + '⪡' => '⪡', + '⪡̸' => '&NotNestedLessLess', + '⪢' => '⪢', + '⪢̸' => '&NotNestedGreaterGreater', + '⪤' => '⪤', + '⪥' => '⪥', + '⪦' => '⪦', + '⪧' => '⪧', + '⪨' => '⪨', + '⪩' => '⪩', + '⪪' => '⪪', + '⪫' => '⪫', + '⪬' => '⪬', + '⪬︀' => '&smtes', + '⪭' => '⪭', + '⪭︀' => '&lates', + '⪮' => '⪮', + '⪯' => '⪯', + '⪯̸' => '&NotPrecedesEqual', + '⪰' => '⪰', + '⪰̸' => '&NotSucceedsEqual', + '⪳' => '⪳', + '⪴' => '⪴', + '⪵' => '⪵', + '⪶' => '⪶', + '⪷' => '⪷', + '⪸' => '⪸', + '⪹' => '⪹', + '⪺' => '⪺', + '⪻' => '⪻', + '⪼' => '⪼', + '⪽' => '⪽', + '⪾' => '⪾', + '⪿' => '⪿', + '⫀' => '⫀', + '⫁' => '⫁', + '⫂' => '⫂', + '⫃' => '⫃', + '⫄' => '⫄', + '⫅' => '⫅', + '⫅̸' => '&nsubE', + '⫆' => '⫆', + '⫆̸' => '&nsupseteqq', + '⫇' => '⫇', + '⫈' => '⫈', + '⫋' => '⫋', + '⫋︀' => '&vsubnE', + '⫌' => '⫌', + '⫌︀' => '&varsupsetneqq', + '⫏' => '⫏', + '⫐' => '⫐', + '⫑' => '⫑', + '⫒' => '⫒', + '⫓' => '⫓', + '⫔' => '⫔', + '⫕' => '⫕', + '⫖' => '⫖', + '⫗' => '⫗', + '⫘' => '⫘', + '⫙' => '⫙', + '⫚' => '⫚', + '⫛' => '⫛', + '⫤' => '⫤', + '⫦' => '⫦', + '⫧' => '⫧', + '⫨' => '⫨', + '⫩' => '⫩', + '⫫' => '⫫', + '⫬' => '⫬', + '⫭' => '⫭', + '⫮' => '⫮', + '⫯' => '⫯', + '⫰' => '⫰', + '⫱' => '⫱', + '⫲' => '⫲', + '⫳' => '⫳', + '⫽︀' => '&varsupsetneqq', + 'ff' => 'ff', + 'fi' => 'fi', + 'fl' => 'fl', + 'ffi' => 'ffi', + 'ffl' => 'ffl', + '𝒜' => '𝒜', + '𝒞' => '𝒞', + '𝒟' => '𝒟', + '𝒢' => '𝒢', + '𝒥' => '𝒥', + '𝒦' => '𝒦', + '𝒩' => '𝒩', + '𝒪' => '𝒪', + '𝒫' => '𝒫', + '𝒬' => '𝒬', + '𝒮' => '𝒮', + '𝒯' => '𝒯', + '𝒰' => '𝒰', + '𝒱' => '𝒱', + '𝒲' => '𝒲', + '𝒳' => '𝒳', + '𝒴' => '𝒴', + '𝒵' => '𝒵', + '𝒶' => '𝒶', + '𝒷' => '𝒷', + '𝒸' => '𝒸', + '𝒹' => '𝒹', + '𝒻' => '𝒻', + '𝒽' => '𝒽', + '𝒾' => '𝒾', + '𝒿' => '𝒿', + '𝓀' => '𝓀', + '𝓁' => '𝓁', + '𝓂' => '𝓂', + '𝓃' => '𝓃', + '𝓅' => '𝓅', + '𝓆' => '𝓆', + '𝓇' => '𝓇', + '𝓈' => '𝓈', + '𝓉' => '𝓉', + '𝓊' => '𝓊', + '𝓋' => '𝓋', + '𝓌' => '𝓌', + '𝓍' => '𝓍', + '𝓎' => '𝓎', + '𝓏' => '𝓏', + '𝔄' => '𝔄', + '𝔅' => '𝔅', + '𝔇' => '𝔇', + '𝔈' => '𝔈', + '𝔉' => '𝔉', + '𝔊' => '𝔊', + '𝔍' => '𝔍', + '𝔎' => '𝔎', + '𝔏' => '𝔏', + '𝔐' => '𝔐', + '𝔑' => '𝔑', + '𝔒' => '𝔒', + '𝔓' => '𝔓', + '𝔔' => '𝔔', + '𝔖' => '𝔖', + '𝔗' => '𝔗', + '𝔘' => '𝔘', + '𝔙' => '𝔙', + '𝔚' => '𝔚', + '𝔛' => '𝔛', + '𝔜' => '𝔜', + '𝔞' => '𝔞', + '𝔟' => '𝔟', + '𝔠' => '𝔠', + '𝔡' => '𝔡', + '𝔢' => '𝔢', + '𝔣' => '𝔣', + '𝔤' => '𝔤', + '𝔥' => '𝔥', + '𝔦' => '𝔦', + '𝔧' => '𝔧', + '𝔨' => '𝔨', + '𝔩' => '𝔩', + '𝔪' => '𝔪', + '𝔫' => '𝔫', + '𝔬' => '𝔬', + '𝔭' => '𝔭', + '𝔮' => '𝔮', + '𝔯' => '𝔯', + '𝔰' => '𝔰', + '𝔱' => '𝔱', + '𝔲' => '𝔲', + '𝔳' => '𝔳', + '𝔴' => '𝔴', + '𝔵' => '𝔵', + '𝔶' => '𝔶', + '𝔷' => '𝔷', + '𝔸' => '𝔸', + '𝔹' => '𝔹', + '𝔻' => '𝔻', + '𝔼' => '𝔼', + '𝔽' => '𝔽', + '𝔾' => '𝔾', + '𝕀' => '𝕀', + '𝕁' => '𝕁', + '𝕂' => '𝕂', + '𝕃' => '𝕃', + '𝕄' => '𝕄', + '𝕆' => '𝕆', + '𝕊' => '𝕊', + '𝕋' => '𝕋', + '𝕌' => '𝕌', + '𝕍' => '𝕍', + '𝕎' => '𝕎', + '𝕏' => '𝕏', + '𝕐' => '𝕐', + '𝕒' => '𝕒', + '𝕓' => '𝕓', + '𝕔' => '𝕔', + '𝕕' => '𝕕', + '𝕖' => '𝕖', + '𝕗' => '𝕗', + '𝕘' => '𝕘', + '𝕙' => '𝕙', + '𝕚' => '𝕚', + '𝕛' => '𝕛', + '𝕜' => '𝕜', + '𝕝' => '𝕝', + '𝕞' => '𝕞', + '𝕟' => '𝕟', + '𝕠' => '𝕠', + '𝕡' => '𝕡', + '𝕢' => '𝕢', + '𝕣' => '𝕣', + '𝕤' => '𝕤', + '𝕥' => '𝕥', + '𝕦' => '𝕦', + '𝕧' => '𝕧', + '𝕨' => '𝕨', + '𝕩' => '𝕩', + '𝕪' => '𝕪', + '𝕫' => '𝕫', + ); +} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/OutputRules.php b/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/OutputRules.php new file mode 100644 index 0000000..13cbdc6 --- /dev/null +++ b/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/OutputRules.php @@ -0,0 +1,559 @@ +'http://www.w3.org/1999/xhtml', + 'attrNamespace'=>'http://www.w3.org/1999/xhtml', + + 'nodeName'=>'img', 'nodeName'=>array('img', 'a'), + 'attrName'=>'alt', 'attrName'=>array('title', 'alt'), + ), + */ + array( + 'nodeNamespace' => 'http://www.w3.org/1999/xhtml', + 'attrName' => array('href', + 'hreflang', + 'http-equiv', + 'icon', + 'id', + 'keytype', + 'kind', + 'label', + 'lang', + 'language', + 'list', + 'maxlength', + 'media', + 'method', + 'name', + 'placeholder', + 'rel', + 'rows', + 'rowspan', + 'sandbox', + 'spellcheck', + 'scope', + 'seamless', + 'shape', + 'size', + 'sizes', + 'span', + 'src', + 'srcdoc', + 'srclang', + 'srcset', + 'start', + 'step', + 'style', + 'summary', + 'tabindex', + 'target', + 'title', + 'type', + 'value', + 'width', + 'border', + 'charset', + 'cite', + 'class', + 'code', + 'codebase', + 'color', + 'cols', + 'colspan', + 'content', + 'coords', + 'data', + 'datetime', + 'default', + 'dir', + 'dirname', + 'enctype', + 'for', + 'form', + 'formaction', + 'headers', + 'height', + 'accept', + 'accept-charset', + 'accesskey', + 'action', + 'align', + 'alt', + 'bgcolor', + ), + ), + array( + 'nodeNamespace' => 'http://www.w3.org/1999/xhtml', + 'xpath' => 'starts-with(local-name(), \'data-\')', + ), + ); + + const DOCTYPE = ''; + + public function __construct($output, $options = array()) + { + if (isset($options['encode_entities'])) { + $this->encode = $options['encode_entities']; + } + + $this->outputMode = static::IM_IN_HTML; + $this->out = $output; + $this->hasHTML5 = defined('ENT_HTML5'); + } + + public function addRule(array $rule) + { + $this->nonBooleanAttributes[] = $rule; + } + + public function setTraverser(Traverser $traverser) + { + $this->traverser = $traverser; + + return $this; + } + + public function unsetTraverser() + { + $this->traverser = null; + + return $this; + } + + public function document($dom) + { + $this->doctype(); + if ($dom->documentElement) { + foreach ($dom->childNodes as $node) { + $this->traverser->node($node); + } + $this->nl(); + } + } + + protected function doctype() + { + $this->wr(static::DOCTYPE); + $this->nl(); + } + + /** + * @param \DOMElement $ele + */ + public function element($ele) + { + $name = $ele->tagName; + + // Per spec: + // If the element has a declared namespace in the HTML, MathML or + // SVG namespaces, we use the lname instead of the tagName. + if ($this->traverser->isLocalElement($ele)) { + $name = $ele->localName; + } + + // If we are in SVG or MathML there is special handling. + // Using if/elseif instead of switch because it's faster in PHP. + if ('svg' == $name) { + $this->outputMode = static::IM_IN_SVG; + $name = Elements::normalizeSvgElement($name); + } elseif ('math' == $name) { + $this->outputMode = static::IM_IN_MATHML; + } + + $this->openTag($ele); + // The tag is already self-closed (`` or ``) in `openTag` if there are no child nodes. + $handledAsVoidTag = $this->outputMode !== static::IM_IN_HTML && !$ele->hasChildNodes(); + + if (Elements::isA($name, Elements::TEXT_RAW)) { + foreach ($ele->childNodes as $child) { + if ($child instanceof \DOMCharacterData) { + $this->wr($child->data); + } elseif ($child instanceof \DOMElement) { + $this->element($child); + } + } + } else { + // Handle children. + if ($ele->hasChildNodes()) { + $this->traverser->children($ele->childNodes); + } + + // Close out the SVG or MathML special handling. + if ('svg' == $name || 'math' == $name) { + $this->outputMode = static::IM_IN_HTML; + } + } + + // If not unary, add a closing tag. + if (!$handledAsVoidTag && !Elements::isA($name, Elements::VOID_TAG)) { + $this->closeTag($ele); + } + } + + /** + * Write a text node. + * + * @param \DOMText $ele The text node to write. + */ + public function text($ele) + { + if (isset($ele->parentNode) && isset($ele->parentNode->tagName) && Elements::isA($ele->parentNode->localName, Elements::TEXT_RAW)) { + $this->wr($ele->data); + + return; + } + + // FIXME: This probably needs some flags set. + $this->wr($this->enc($ele->data)); + } + + public function cdata($ele) + { + // This encodes CDATA. + $this->wr($ele->ownerDocument->saveXML($ele)); + } + + public function comment($ele) + { + // These produce identical output. + // $this->wr(''); + $this->wr($ele->ownerDocument->saveXML($ele)); + } + + public function processorInstruction($ele) + { + $this->wr('wr($ele->target) + ->wr(' ') + ->wr($ele->data) + ->wr('?>'); + } + + /** + * Write the namespace attributes. + * + * @param \DOMNode $ele The element being written. + */ + protected function namespaceAttrs($ele) + { + if (!$this->xpath || $this->xpath->document !== $ele->ownerDocument) { + $this->xpath = new \DOMXPath($ele->ownerDocument); + } + + foreach ($this->xpath->query('namespace::*[not(.=../../namespace::*)]', $ele) as $nsNode) { + if (!in_array($nsNode->nodeValue, $this->implicitNamespaces)) { + $this->wr(' ')->wr($nsNode->nodeName)->wr('="')->wr($nsNode->nodeValue)->wr('"'); + } + } + } + + /** + * Write the opening tag. + * + * Tags for HTML, MathML, and SVG are in the local name. Otherwise, use the + * qualified name (8.3). + * + * @param \DOMNode $ele The element being written. + */ + protected function openTag($ele) + { + $this->wr('<')->wr($this->traverser->isLocalElement($ele) ? $ele->localName : $ele->tagName); + + $this->attrs($ele); + $this->namespaceAttrs($ele); + + if ($this->outputMode == static::IM_IN_HTML) { + $this->wr('>'); + } // If we are not in html mode we are in SVG, MathML, or XML embedded content. + else { + if ($ele->hasChildNodes()) { + $this->wr('>'); + } // If there are no children this is self closing. + else { + $this->wr(' />'); + } + } + } + + protected function attrs($ele) + { + // FIXME: Needs support for xml, xmlns, xlink, and namespaced elements. + if (!$ele->hasAttributes()) { + return $this; + } + + // TODO: Currently, this always writes name="value", and does not do + // value-less attributes. + $map = $ele->attributes; + $len = $map->length; + for ($i = 0; $i < $len; ++$i) { + $node = $map->item($i); + $val = $this->enc($node->value, true); + + // XXX: The spec says that we need to ensure that anything in + // the XML, XMLNS, or XLink NS's should use the canonical + // prefix. It seems that DOM does this for us already, but there + // may be exceptions. + $name = $node->nodeName; + + // Special handling for attributes in SVG and MathML. + // Using if/elseif instead of switch because it's faster in PHP. + if ($this->outputMode == static::IM_IN_SVG) { + $name = Elements::normalizeSvgAttribute($name); + } elseif ($this->outputMode == static::IM_IN_MATHML) { + $name = Elements::normalizeMathMlAttribute($name); + } + + $this->wr(' ')->wr($name); + + if ((isset($val) && '' !== $val) || $this->nonBooleanAttribute($node)) { + $this->wr('="')->wr($val)->wr('"'); + } + } + } + + protected function nonBooleanAttribute(\DOMAttr $attr) + { + $ele = $attr->ownerElement; + foreach ($this->nonBooleanAttributes as $rule) { + if (isset($rule['nodeNamespace']) && $rule['nodeNamespace'] !== $ele->namespaceURI) { + continue; + } + if (isset($rule['attNamespace']) && $rule['attNamespace'] !== $attr->namespaceURI) { + continue; + } + if (isset($rule['nodeName']) && !is_array($rule['nodeName']) && $rule['nodeName'] !== $ele->localName) { + continue; + } + if (isset($rule['nodeName']) && is_array($rule['nodeName']) && !in_array($ele->localName, $rule['nodeName'], true)) { + continue; + } + if (isset($rule['attrName']) && !is_array($rule['attrName']) && $rule['attrName'] !== $attr->localName) { + continue; + } + if (isset($rule['attrName']) && is_array($rule['attrName']) && !in_array($attr->localName, $rule['attrName'], true)) { + continue; + } + if (isset($rule['xpath'])) { + $xp = $this->getXPath($attr); + if (isset($rule['prefixes'])) { + foreach ($rule['prefixes'] as $nsPrefix => $ns) { + $xp->registerNamespace($nsPrefix, $ns); + } + } + if (!$xp->evaluate($rule['xpath'], $attr)) { + continue; + } + } + + return true; + } + + return false; + } + + private function getXPath(\DOMNode $node) + { + if (!$this->xpath) { + $this->xpath = new \DOMXPath($node->ownerDocument); + } + + return $this->xpath; + } + + /** + * Write the closing tag. + * + * Tags for HTML, MathML, and SVG are in the local name. Otherwise, use the + * qualified name (8.3). + * + * @param \DOMNode $ele The element being written. + */ + protected function closeTag($ele) + { + if ($this->outputMode == static::IM_IN_HTML || $ele->hasChildNodes()) { + $this->wr('wr($this->traverser->isLocalElement($ele) ? $ele->localName : $ele->tagName)->wr('>'); + } + } + + /** + * Write to the output. + * + * @param string $text The string to put into the output + * + * @return $this + */ + protected function wr($text) + { + fwrite($this->out, $text); + + return $this; + } + + /** + * Write a new line character. + * + * @return $this + */ + protected function nl() + { + fwrite($this->out, PHP_EOL); + + return $this; + } + + /** + * Encode text. + * + * When encode is set to false, the default value, the text passed in is + * escaped per section 8.3 of the html5 spec. For details on how text is + * escaped see the escape() method. + * + * When encoding is set to true the text is converted to named character + * references where appropriate. Section 8.1.4 Character references of the + * html5 spec refers to using named character references. This is useful for + * characters that can't otherwise legally be used in the text. + * + * The named character references are listed in section 8.5. + * + * @see http://www.w3.org/TR/2013/CR-html5-20130806/syntax.html#named-character-references True encoding will turn all named character references into their entities. + * This includes such characters as +.# and many other common ones. By default + * encoding here will just escape &'<>". + * + * Note, PHP 5.4+ has better html5 encoding. + * + * @todo Use the Entities class in php 5.3 to have html5 entities. + * + * @param string $text Text to encode. + * @param bool $attribute True if we are encoding an attrubute, false otherwise. + * + * @return string The encoded text. + */ + protected function enc($text, $attribute = false) + { + // Escape the text rather than convert to named character references. + if (!$this->encode) { + return $this->escape($text, $attribute); + } + + // If we are in PHP 5.4+ we can use the native html5 entity functionality to + // convert the named character references. + + if ($this->hasHTML5) { + return htmlentities($text, ENT_HTML5 | ENT_SUBSTITUTE | ENT_QUOTES, 'UTF-8', false); + } // If a version earlier than 5.4 html5 entities are not entirely handled. + // This manually handles them. + else { + return strtr($text, HTML5Entities::$map); + } + } + + /** + * Escape test. + * + * According to the html5 spec section 8.3 Serializing HTML fragments, text + * within tags that are not style, script, xmp, iframe, noembed, and noframes + * need to be properly escaped. + * + * The & should be converted to &, no breaking space unicode characters + * converted to  , when in attribute mode the " should be converted to + * ", and when not in attribute mode the < and > should be converted to + * < and >. + * + * @see http://www.w3.org/TR/2013/CR-html5-20130806/syntax.html#escapingString + * + * @param string $text Text to escape. + * @param bool $attribute True if we are escaping an attrubute, false otherwise. + */ + protected function escape($text, $attribute = false) + { + // Not using htmlspecialchars because, while it does escaping, it doesn't + // match the requirements of section 8.5. For example, it doesn't handle + // non-breaking spaces. + if ($attribute) { + $replace = array( + '"' => '"', + '&' => '&', + "\xc2\xa0" => ' ', + ); + } else { + $replace = array( + '<' => '<', + '>' => '>', + '&' => '&', + "\xc2\xa0" => ' ', + ); + } + + return strtr($text, $replace); + } +} diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/README.md b/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/README.md new file mode 100644 index 0000000..849a47f --- /dev/null +++ b/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/README.md @@ -0,0 +1,33 @@ +# The Serializer (Writer) Model + +The serializer roughly follows sections _8.1 Writing HTML documents_ and section +_8.3 Serializing HTML fragments_ by converting DOMDocument, DOMDocumentFragment, +and DOMNodeList into HTML5. + + [ HTML5 ] // Interface for saving. + || + [ Traverser ] // Walk the DOM + || + [ Rules ] // Convert DOM elements into strings. + || + [ HTML5 ] // HTML5 document or fragment in text. + + +## HTML5 Class + +Provides the top level interface for saving. + +## The Traverser + +Walks the DOM finding each element and passing it off to the output rules to +convert to HTML5. + +## Output Rules + +The output rules are defined in the RulesInterface which can have multiple +implementations. Currently, the OutputRules is the default implementation that +converts a DOM as is into HTML5. + +## HTML5 String + +The output of the process it HTML5 as a string or saved to a file. \ No newline at end of file diff --git a/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/RulesInterface.php b/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/RulesInterface.php new file mode 100644 index 0000000..69a6ecd --- /dev/null +++ b/dompdf/vendor/masterminds/html5/src/HTML5/Serializer/RulesInterface.php @@ -0,0 +1,99 @@ + 'html', + 'http://www.w3.org/1998/Math/MathML' => 'math', + 'http://www.w3.org/2000/svg' => 'svg', + ); + + protected $dom; + + protected $options; + + protected $encode = false; + + protected $rules; + + protected $out; + + /** + * Create a traverser. + * + * @param \DOMNode|\DOMNodeList $dom The document or node to traverse. + * @param resource $out A stream that allows writing. The traverser will output into this + * stream. + * @param array $options An array of options for the traverser as key/value pairs. These include: + * - encode_entities: A bool to specify if full encding should happen for all named + * charachter references. Defaults to false which escapes &'<>". + * - output_rules: The path to the class handling the output rules. + */ + public function __construct($dom, $out, RulesInterface $rules, $options = array()) + { + $this->dom = $dom; + $this->out = $out; + $this->rules = $rules; + $this->options = $options; + + $this->rules->setTraverser($this); + } + + /** + * Tell the traverser to walk the DOM. + * + * @return resource $out Returns the output stream. + */ + public function walk() + { + if ($this->dom instanceof \DOMDocument) { + $this->rules->document($this->dom); + } elseif ($this->dom instanceof \DOMDocumentFragment) { + // Document fragments are a special case. Only the children need to + // be serialized. + if ($this->dom->hasChildNodes()) { + $this->children($this->dom->childNodes); + } + } // If NodeList, loop + elseif ($this->dom instanceof \DOMNodeList) { + // If this is a NodeList of DOMDocuments this will not work. + $this->children($this->dom); + } // Else assume this is a DOMNode-like datastructure. + else { + $this->node($this->dom); + } + + return $this->out; + } + + /** + * Process a node in the DOM. + * + * @param mixed $node A node implementing \DOMNode. + */ + public function node($node) + { + // A listing of types is at http://php.net/manual/en/dom.constants.php + switch ($node->nodeType) { + case XML_ELEMENT_NODE: + $this->rules->element($node); + break; + case XML_TEXT_NODE: + $this->rules->text($node); + break; + case XML_CDATA_SECTION_NODE: + $this->rules->cdata($node); + break; + case XML_PI_NODE: + $this->rules->processorInstruction($node); + break; + case XML_COMMENT_NODE: + $this->rules->comment($node); + break; + // Currently we don't support embedding DTDs. + default: + //print ''; + break; + } + } + + /** + * Walk through all the nodes on a node list. + * + * @param \DOMNodeList $nl A list of child elements to walk through. + */ + public function children($nl) + { + foreach ($nl as $node) { + $this->node($node); + } + } + + /** + * Is an element local? + * + * @param mixed $ele An element that implement \DOMNode. + * + * @return bool true if local and false otherwise. + */ + public function isLocalElement($ele) + { + $uri = $ele->namespaceURI; + if (empty($uri)) { + return false; + } + + return isset(static::$local_ns[$uri]); + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/CHANGELOG.md b/dompdf/vendor/sabberworm/php-css-parser/CHANGELOG.md new file mode 100644 index 0000000..1fe4843 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/CHANGELOG.md @@ -0,0 +1,454 @@ +# Changelog + +All notable changes to this project will be documented in this file. +This project adheres to [Semantic Versioning](https://semver.org/). + +## x.y.z + +### Added + +### Changed + +### Deprecated + +### Removed + +### Fixed + +## 8.9.0: New features, bug fixes and deprecations + +### Added + +- `RuleSet::removeMatchingRules()` method + (for the implementing classes `AtRuleSet` and `DeclarationBlock`) (#1249) +- `RuleSet::removeAllRules()` method + (for the implementing classes `AtRuleSet` and `DeclarationBlock`) (#1249) +- Add Interface `CSSElement` (#1231) +- Methods `getLineNumber` and `getColumnNumber` which return a nullable `int` + for the following classes: + `Comment`, `CSSList`, `SourceException`, `Charset`, `CSSNamespace`, `Import`, + `Rule`, `DeclarationBlock`, `RuleSet`, `CSSFunction`, `Value` (#1225, #1263) +- `Positionable` interface for CSS items that may have a position + (line and perhaps column number) in the parsed CSS (#1221) + +### Changed + +- Parameters for `getAllValues()` are deconflated, so it now takes three (all + optional), allowing `$element` and `$ruleSearchPattern` to be specified + separately (#1241) +- Implement `Positionable` in the following CSS item classes: + `Comment`, `CSSList`, `SourceException`, `Charset`, `CSSNamespace`, `Import`, + `Rule`, `DeclarationBlock`, `RuleSet`, `CSSFunction`, `Value` (#1225) + +### Deprecated + +- Support for PHP < 7.2 is deprecated; version 9.0 will require PHP 7.2 or later + (#1264) +- Passing a `string` or `null` to `RuleSet::removeRule()` is deprecated + (implementing classes are `AtRuleSet` and `DeclarationBlock`); + use `removeMatchingRules()` or `removeAllRules()` instead (#1249) +- Passing a `Rule` to `RuleSet::getRules()` or `getRulesAssoc()` is deprecated, + affecting the implementing classes `AtRuleSet` and `DeclarationBlock` + (call e.g. `getRules($rule->getRule())` instead) (#1248) +- Passing a string as the first argument to `getAllValues()` is deprecated; + the search pattern should now be passed as the second argument (#1241) +- Passing a Boolean as the second argument to `getAllValues()` is deprecated; + the flag for searching in function arguments should now be passed as the third + argument (#1241) +- `getLineNo()` is deprecated in these classes (use `getLineNumber()` instead): + `Comment`, `CSSList`, `SourceException`, `Charset`, `CSSNamespace`, `Import`, + `Rule`, `DeclarationBlock`, `RuleSet`, `CSSFunction`, `Value` (#1225, #1233) +- `Rule::getColNo()` is deprecated (use `getColumnNumber()` instead) + (#1225, #1233) +- Providing zero as the line number argument to `Rule::setPosition()` is + deprecated (pass `null` instead if there is no line number) (#1225, #1233) + +### Fixed + +- Set line number when `RuleSet::addRule()` called with only column number set + (#1265) +- Ensure first rule added with `RuleSet::addRule()` has valid position (#1262) + +## 8.8.0: Bug fixes and deprecations + +### Added + +- `OutputFormat` properties for space around specific list separators (#880) + +### Changed + +- Mark the `OutputFormat` constructor as `@internal` (#1131) +- Mark `OutputFormatter` as `@internal` (#896) +- Mark `Selector::isValid()` as `@internal` (#1037) +- Mark parsing-related methods of most CSS elements as `@internal` (#908) +- Mark `OutputFormat::nextLevel()` as `@internal` (#901) +- Make all non-private properties `@internal` (#886) + +### Deprecated + +- Deprecate extending `OutputFormat` (#1131) +- Deprecate `OutputFormat::get()` and `::set()` (#1107) +- Deprecate support for `-webkit-calc` and `-moz-calc` (#1086) +- Deprecate magic method forwarding from `OutputFormat` to `OutputFormatter` + (#894) +- Deprecate `__toString()` (#1006) +- Deprecate greedy calculation of selector specificity (#1018) +- Deprecate the IE hack in `Rule` (#993, #1003) +- `OutputFormat` properties for space around list separators as an array (#880) +- Deprecate `OutputFormat::level()` (#870) + +### Fixed + +- Include comments for all rules in declaration block (#1169) +- Render rules in line and column number order (#1059) +- Create `Size` with correct types in `expandBackgroundShorthand` (#814) +- Parse `@font-face` `src` property as comma-delimited list (#794) + +## 8.7.0: Add support for PHP 8.4 + +### Added + +- Add support for PHP 8.4 (#675, #701, #746, #751) + +### Changed + +- Mark parsing-internal classes and methods as `@internal` (#711) +- Block installations on unsupported higher PHP versions (#691) + +### Deprecated + +- Deprecate the expansion of shorthand properties (#719) +- Deprecate `Parser::setCharset()` and `Parser::getCharset()` (#703) + +### Fixed + +- Fix type errors in PHP strict mode (#695) + +## 8.6.0 + +### Added + +- Support arithmetic operators in CSS function arguments (#607) +- Add support for inserting an item in a CSS list (#545) +- Add support for the `dvh`, `lvh` and `svh` length units (#415) + +### Changed + +- Improve performance of Value::parseValue with many delimiters by refactoring + to remove `array_search()` (#413) + +## 8.5.2 + +### Changed + +- Mark all class constants as `@internal` (#500) + +### Fixed + +- Fix undefined local variable in `CalcFunction::parse()` (#593) + +## 8.5.1 + +### Fixed + +- Fix PHP notice caused by parsing invalid color values having less than + 6 characters (#485) +- Fix (regression) failure to parse at-rules with strict parsing (#456) + +## 8.5.0 + +### Added + +- Add a method to get an import's media queries (#384) +- Add more unit tests (#381, #382) + +### Fixed + +- Retain CSSList and Rule comments when rendering CSS (#351) +- Replace invalid `turns` unit with `turn` (#350) +- Also allow string values for rules (#348) +- Fix invalid calc parsing (#169) +- Handle scientific notation when parsing sizes (#179) +- Fix PHP 8.1 compatibility in `ParserState::strsplit()` (#344) + +## 8.4.0 + +### Features + +* Support for PHP 8.x +* PHPDoc annotations +* Allow usage of CSS variables inside color functions (by parsing them as + regular functions) +* Use PSR-12 code style +* *No deprecations* + +### Bugfixes + +* Improved handling of whitespace in `calc()` +* Fix parsing units whose prefix is also a valid unit, like `vmin` +* Allow passing an object to `CSSList#replace` +* Fix PHP 7.3 warnings +* Correctly parse keyframes with `%` +* Don’t convert large numbers to scientific notation +* Allow a file to end after an `@import` +* Preserve case of CSS variables as specced +* Allow identifiers to use escapes the same way as strings +* No longer use `eval` for the comparison in `getSelectorsBySpecificity`, in + case it gets passed untrusted input (CVE-2020-13756). Also fixed in 8.3.1, + 8.2.1, 8.1.1, 8.0.1, 7.0.4, 6.0.2, 5.2.1, 5.1.3, 5.0.9, 4.0.1, 3.0.1, 2.0.1, + 1.0.1. +* Prevent an infinite loop when parsing invalid grid line names +* Remove invalid unit `vm` +* Retain rule order after expanding shorthands + +### Backwards-incompatible changes + +* PHP ≥ 5.6 is now required +* HHVM compatibility target dropped + +## 8.3.0 (2019-02-22) + +* Refactor parsing logic to mostly reside in the class files whose data + structure is to be parsed (this should eventually allow us to unit-test + specific parts of the parsing logic individually). +* Fix error in parsing `calc` expessions when the first operand is a negative + number, thanks to @raxbg. +* Support parsing CSS4 colors in hex notation with alpha values, thanks to + @raxbg. +* Swallow more errors in lenient mode, thanks to @raxbg. +* Allow specifying arbitrary strings to output before and after declaration + blocks, thanks to @westonruter. +* *No backwards-incompatible changes* +* *No deprecations* + +## 8.2.0 (2018-07-13) + +* Support parsing `calc()`, thanks to @raxbg. +* Support parsing grid-lines, again thanks to @raxbg. +* Support parsing legacy IE filters (`progid:`) in lenient mode, thanks to + @FMCorz +* Performance improvements parsing large files, again thanks to @FMCorz +* *No backwards-incompatible changes* +* *No deprecations* + +## 8.1.0 (2016-07-19) + +* Comments are no longer silently ignored but stored with the object with which + they appear (no render support, though). Thanks to @FMCorz. +* The IE hacks using `\0` and `\9` can now be parsed (and rendered) in lenient + mode. Thanks (again) to @FMCorz. +* Media queries with or without spaces before the query are parsed. Still no + *real* parsing support, though. Sorry… +* PHPUnit is now listed as a dev-dependency in composer.json. +* *No backwards-incompatible changes* +* *No deprecations* + +## 8.0.0 (2016-06-30) + +* Store source CSS line numbers in tokens and parsing exceptions. +* *No deprecations* + +### Backwards-incompatible changes + +* Unrecoverable parser errors throw an exception of type + `Sabberworm\CSS\Parsing\SourceException` instead of `\Exception`. + +## 7.0.3 (2016-04-27) + +* Fixed parsing empty CSS when multibyte is off +* *No backwards-incompatible changes* +* *No deprecations* + +## 7.0.2 (2016-02-11) + +* 150 time performance boost thanks + to @[ossinkine](https://github.com/ossinkine) +* *No backwards-incompatible changes* +* *No deprecations* + +## 7.0.1 (2015-12-25) + +* No more suppressed `E_NOTICE` +* *No backwards-incompatible changes* +* *No deprecations* + +## 7.0.0 (2015-08-24) + +* Compatibility with PHP 7. Well timed, eh? +* *No deprecations* + +### Backwards-incompatible changes + +* The `Sabberworm\CSS\Value\String` class has been renamed to + `Sabberworm\CSS\Value\CSSString`. + +## 6.0.1 (2015-08-24) + +* Remove some declarations in interfaces incompatible with PHP 5.3 (< 5.3.9) +* *No deprecations* + +## 6.0.0 (2014-07-03) + +* Format output using Sabberworm\CSS\OutputFormat +* *No backwards-incompatible changes* + +### Deprecations + +* The parse() method replaces __toString with an optional argument (instance of + the OutputFormat class) + +## 5.2.0 (2014-06-30) + +* Support removing a selector from a declaration block using + `$oBlock->removeSelector($mSelector)` +* Introduce a specialized exception (Sabberworm\CSS\Parsing\OuputException) for + exceptions during output rendering + +* *No deprecations* + +#### Backwards-incompatible changes + +* Outputting a declaration block that has no selectors throws an OuputException + instead of outputting an invalid ` {…}` into the CSS document. + +## 5.1.2 (2013-10-30) + +* Remove the use of consumeUntil in comment parsing. This makes it possible to + parse comments such as `/** Perfectly valid **/` +* Add fr relative size unit +* Fix some issues with HHVM +* *No backwards-incompatible changes* +* *No deprecations* + +## 5.1.1 (2013-10-28) + +* Updated CHANGELOG.md to reflect changes since 5.0.4 +* *No backwards-incompatible changes* +* *No deprecations* + +## 5.1.0 (2013-10-24) + +* Performance enhancements by Michael M Slusarz +* More rescue entry points for lenient parsing (unexpected tokens between + declaration blocks and unclosed comments) +* *No backwards-incompatible changes* +* *No deprecations* + +## 5.0.8 (2013-08-15) + +* Make default settings’ multibyte parsing option dependent on whether or not + the mbstring extension is actually installed. +* *No backwards-incompatible changes* +* *No deprecations* + +## 5.0.7 (2013-08-04) + +* Fix broken decimal point output optimization +* *No backwards-incompatible changes* +* *No deprecations* + +## 5.0.6 (2013-05-31) + +* Fix broken unit test +* *No backwards-incompatible changes* +* *No deprecations* + +## 5.0.5 (2013-04-17) + +* Initial support for lenient parsing (setting this parser option will catch + some exceptions internally and recover the parser’s state as neatly as + possible). +* *No backwards-incompatible changes* +* *No deprecations* + +## 5.0.4 (2013-03-21) + +* Don’t output floats with locale-aware separator chars +* *No backwards-incompatible changes* +* *No deprecations* + +## 5.0.3 (2013-03-21) + +* More size units recognized +* *No backwards-incompatible changes* +* *No deprecations* + +## 5.0.2 (2013-03-21) + +* CHANGELOG.md file added to distribution +* *No backwards-incompatible changes* +* *No deprecations* + +## 5.0.1 (2013-03-20) + +* Internal cleanup +* *No backwards-incompatible changes* +* *No deprecations* + +## 5.0.0 (2013-03-20) + +* Correctly parse all known CSS 3 units (including Hz and kHz). +* Output RGB colors in short (#aaa or #ababab) notation +* Be case-insensitive when parsing identifiers. +* *No deprecations* + +### Backwards-incompatible changes + +* `Sabberworm\CSS\Value\Color`’s `__toString` method overrides `CSSList`’s to + maybe return something other than `type(value, …)` (see above). + +## 4.0.0 (2013-03-19) + +* Support for more @-rules +* Generic interface `Sabberworm\CSS\Property\AtRule`, implemented by all @-rule + classes +* *No deprecations* + +### Backwards-incompatible changes + +* `Sabberworm\CSS\RuleSet\AtRule` renamed to `Sabberworm\CSS\RuleSet\AtRuleSet` +* `Sabberworm\CSS\CSSList\MediaQuery` renamed to + `Sabberworm\CSS\RuleSet\CSSList\AtRuleBlockList` with differing semantics and + API (which also works for other block-list-based @-rules like `@supports`). + +## 3.0.0 (2013-03-06) + +* Support for lenient parsing (on by default) +* *No deprecations* + +### Backwards-incompatible changes + +* All properties (like whether or not to use `mb_`-functions, which default + charset to use and – new – whether or not to be forgiving when parsing) are + now encapsulated in an instance of `Sabberworm\CSS\Settings` which can be + passed as the second argument to `Sabberworm\CSS\Parser->__construct()`. +* Specifying a charset as the second argument to + `Sabberworm\CSS\Parser->__construct()` is no longer supported. Use + `Sabberworm\CSS\Settings::create()->withDefaultCharset('some-charset')` + instead. +* Setting `Sabberworm\CSS\Parser->bUseMbFunctions` has no effect. Use + `Sabberworm\CSS\Settings::create()->withMultibyteSupport(true/false)` instead. +* `Sabberworm\CSS\Parser->parse()` may throw a + `Sabberworm\CSS\Parsing\UnexpectedTokenException` when in strict parsing mode. + +## 2.0.0 (2013-01-29) + +* Allow multiple rules of the same type per rule set + +### Backwards-incompatible changes + +* `Sabberworm\CSS\RuleSet->getRules()` returns an index-based array instead of + an associative array. Use `Sabberworm\CSS\RuleSet->getRulesAssoc()` (which + eliminates duplicate rules and lets the later rule of the same name win). +* `Sabberworm\CSS\RuleSet->removeRule()` works as it did before except when + passed an instance of `Sabberworm\CSS\Rule\Rule`, in which case it would only + remove the exact rule given instead of all the rules of the same type. To get + the old behaviour, use `Sabberworm\CSS\RuleSet->removeRule($oRule->getRule()`; + +## 1.0 + +Initial release of a stable public API. + +## 0.9 + +Last version not to use PSR-0 project organization semantics. diff --git a/dompdf/vendor/sabberworm/php-css-parser/LICENSE b/dompdf/vendor/sabberworm/php-css-parser/LICENSE new file mode 100644 index 0000000..686a4e3 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2011 Raphael Schweikert, https://www.sabberworm.com/ + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/dompdf/vendor/sabberworm/php-css-parser/README.md b/dompdf/vendor/sabberworm/php-css-parser/README.md new file mode 100644 index 0000000..90428cb --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/README.md @@ -0,0 +1,637 @@ +# PHP CSS Parser + +[![Build Status](https://github.com/sabberworm/PHP-CSS-Parser/workflows/CI/badge.svg?branch=master)](https://github.com/sabberworm/PHP-CSS-Parser/actions/) + +A Parser for CSS Files written in PHP. Allows extraction of CSS files into a data structure, manipulation of said structure and output as (optimized) CSS. + +## Usage + +### Installation using Composer + +```bash +composer require sabberworm/php-css-parser +``` + +### Extraction + +To use the CSS Parser, create a new instance. The constructor takes the following form: + +```php +new \Sabberworm\CSS\Parser($css); +``` + +To read a file, for example, you’d do the following: + +```php +$parser = new \Sabberworm\CSS\Parser(file_get_contents('somefile.css')); +$cssDocument = $parser->parse(); +``` + +The resulting CSS document structure can be manipulated prior to being output. + +### Options + +#### Charset + +The charset option will only be used if the CSS file does not contain an `@charset` declaration. UTF-8 is the default, so you won’t have to create a settings object at all if you don’t intend to change that. + +```php +$settings = \Sabberworm\CSS\Settings::create() + ->withDefaultCharset('windows-1252'); +$parser = new \Sabberworm\CSS\Parser($css, $settings); +``` + +#### Strict parsing + +To have the parser throw an exception when encountering invalid/unknown constructs (as opposed to trying to ignore them and carry on parsing), supply a thusly configured `\Sabberworm\CSS\Settings` object: + +```php +$parser = new \Sabberworm\CSS\Parser( + file_get_contents('somefile.css'), + \Sabberworm\CSS\Settings::create()->beStrict() +); +``` + +Note that this will also disable a workaround for parsing the unquoted variant of the legacy IE-specific `filter` rule. + +#### Disable multibyte functions + +To achieve faster parsing, you can choose to have PHP-CSS-Parser use regular string functions instead of `mb_*` functions. This should work fine in most cases, even for UTF-8 files, as all the multibyte characters are in string literals. Still it’s not recommended using this with input you have no control over as it’s not thoroughly covered by test cases. + +```php +$settings = \Sabberworm\CSS\Settings::create()->withMultibyteSupport(false); +$parser = new \Sabberworm\CSS\Parser($css, $settings); +``` + +### Manipulation + +The resulting data structure consists mainly of five basic types: `CSSList`, `RuleSet`, `Rule`, `Selector` and `Value`. There are two additional types used: `Import` and `Charset`, which you won’t use often. + +#### CSSList + +`CSSList` represents a generic CSS container, most likely containing declaration blocks (rule sets with a selector), but it may also contain at-rules, charset declarations, etc. + +To access the items stored in a `CSSList` – like the document you got back when calling `$parser->parse()` –, use `getContents()`, then iterate over that collection and use `instanceof` to check whether you’re dealing with another `CSSList`, a `RuleSet`, a `Import` or a `Charset`. + +To append a new item (selector, media query, etc.) to an existing `CSSList`, construct it using the constructor for this class and use the `append($oItem)` method. + +#### RuleSet + +`RuleSet` is a container for individual rules. The most common form of a rule set is one constrained by a selector. The following concrete subtypes exist: + +* `AtRuleSet` – for generic at-rules for generic at-rules which are not covered by specific classes, i.e., not `@import`, `@charset` or `@media`. A common example for this is `@font-face`. +* `DeclarationBlock` – a `RuleSet` constrained by a `Selector`; contains an array of selector objects (comma-separated in the CSS) as well as the rules to be applied to the matching elements. + +Note: A `CSSList` can contain other `CSSList`s (and `Import`s as well as a `Charset`), while a `RuleSet` can only contain `Rule`s. + +If you want to manipulate a `RuleSet`, use the methods `addRule(Rule $rule)`, `getRules()` and `removeRule($rule)` (which accepts either a `Rule` or a rule name; optionally suffixed by a dash to remove all related rules). + +#### Rule + +`Rule`s just have a string key (the rule) and a `Value`. + +#### Value + +`Value` is an abstract class that only defines the `render` method. The concrete subclasses for atomic value types are: + +* `Size` – consists of a numeric `size` value and a unit. +* `Color` – colors can be input in the form #rrggbb, #rgb or schema(val1, val2, …) but are always stored as an array of ('s' => val1, 'c' => val2, 'h' => val3, …) and output in the second form. +* `CSSString` – this is just a wrapper for quoted strings to distinguish them from keywords; always output with double quotes. +* `URL` – URLs in CSS; always output in `URL("")` notation. + +There is another abstract subclass of `Value`, `ValueList`: A `ValueList` represents a lists of `Value`s, separated by some separation character (mostly `,`, whitespace, or `/`). + +There are two types of `ValueList`s: + +* `RuleValueList` – The default type, used to represent all multivalued rules like `font: bold 12px/3 Helvetica, Verdana, sans-serif;` (where the value would be a whitespace-separated list of the primitive value `bold`, a slash-separated list and a comma-separated list). +* `CSSFunction` – A special kind of value that also contains a function name and where the values are the function’s arguments. Also handles equals-sign-separated argument lists like `filter: alpha(opacity=90);`. + +#### Convenience methods + +There are a few convenience methods on `Document` to ease finding, manipulating and deleting rules: + +* `getAllDeclarationBlocks()` – does what it says; no matter how deeply nested the selectors are. Aliased as `getAllSelectors()`. +* `getAllRuleSets()` – does what it says; no matter how deeply nested the rule sets are. +* `getAllValues()` – finds all `Value` objects inside `Rule`s. + +## To-Do + +* More convenience methods (like `selectorsWithElement($sId/Class/TagName)`, `attributesOfType($type)`, `removeAttributesOfType($type)`) +* Real multibyte support. Currently, only multibyte charsets whose first 255 code points take up only one byte and are identical with ASCII are supported (yes, UTF-8 fits this description). +* Named color support (using `Color` instead of an anonymous string literal) + +## Use cases + +### Use `Parser` to prepend an ID to all selectors + +```php +$myId = "#my_id"; +$parser = new \Sabberworm\CSS\Parser($css); +$cssDocument = $parser->parse(); +foreach ($cssDocument->getAllDeclarationBlocks() as $block) { + foreach ($block->getSelectors() as $selector) { + // Loop over all selector parts (the comma-separated strings in a + // selector) and prepend the ID. + $selector->setSelector($myId.' '.$selector->getSelector()); + } +} +``` + +### Shrink all absolute sizes to half + +```php +$parser = new \Sabberworm\CSS\Parser($css); +$cssDocument = $parser->parse(); +foreach ($cssDocument->getAllValues() as $value) { + if ($value instanceof CSSSize && !$value->isRelative()) { + $value->setSize($value->getSize() / 2); + } +} +``` + +### Remove unwanted rules + +```php +$parser = new \Sabberworm\CSS\Parser($css); +$cssDocument = $parser->parse(); +foreach($cssDocument->getAllRuleSets() as $oRuleSet) { + // Note that the added dash will make this remove all rules starting with + // `font-` (like `font-size`, `font-weight`, etc.) as well as a potential + // `font` rule. + $oRuleSet->removeRule('font-'); + $oRuleSet->removeRule('cursor'); +} +``` + +### Output + +To output the entire CSS document into a variable, just use `->render()`: + +```php +$parser = new \Sabberworm\CSS\Parser(file_get_contents('somefile.css')); +$cssDocument = $parser->parse(); +print $cssDocument->render(); +``` + +If you want to format the output, pass an instance of type `\Sabberworm\CSS\OutputFormat`: + +```php +$format = \Sabberworm\CSS\OutputFormat::create() + ->indentWithSpaces(4)->setSpaceBetweenRules("\n"); +print $cssDocument->render($format); +``` + +Or use one of the predefined formats: + +```php +print $cssDocument->render(Sabberworm\CSS\OutputFormat::createPretty()); +print $cssDocument->render(Sabberworm\CSS\OutputFormat::createCompact()); +``` + +To see what you can do with output formatting, look at the tests in `tests/OutputFormatTest.php`. + +## Examples + +### Example 1 (At-Rules) + +#### Input + +```css +@charset "utf-8"; + +@font-face { + font-family: "CrassRoots"; + src: url("../media/cr.ttf"); +} + +html, body { + font-size: 1.6em; +} + +@keyframes mymove { + from { top: 0px; } + to { top: 200px; } +} + +``` + +
+ Structure (var_dump()) + +```php +class Sabberworm\CSS\CSSList\Document#4 (2) { + protected $aContents => + array(4) { + [0] => + class Sabberworm\CSS\Property\Charset#6 (2) { + private $sCharset => + class Sabberworm\CSS\Value\CSSString#5 (2) { + private $sString => + string(5) "utf-8" + protected $iLineNo => + int(1) + } + protected $iLineNo => + int(1) + } + [1] => + class Sabberworm\CSS\RuleSet\AtRuleSet#7 (4) { + private $sType => + string(9) "font-face" + private $sArgs => + string(0) "" + private $aRules => + array(2) { + 'font-family' => + array(1) { + [0] => + class Sabberworm\CSS\Rule\Rule#8 (4) { + private $sRule => + string(11) "font-family" + private $mValue => + class Sabberworm\CSS\Value\CSSString#9 (2) { + private $sString => + string(10) "CrassRoots" + protected $iLineNo => + int(4) + } + private $bIsImportant => + bool(false) + protected $iLineNo => + int(4) + } + } + 'src' => + array(1) { + [0] => + class Sabberworm\CSS\Rule\Rule#10 (4) { + private $sRule => + string(3) "src" + private $mValue => + class Sabberworm\CSS\Value\URL#11 (2) { + private $oURL => + class Sabberworm\CSS\Value\CSSString#12 (2) { + private $sString => + string(15) "../media/cr.ttf" + protected $iLineNo => + int(5) + } + protected $iLineNo => + int(5) + } + private $bIsImportant => + bool(false) + protected $iLineNo => + int(5) + } + } + } + protected $iLineNo => + int(3) + } + [2] => + class Sabberworm\CSS\RuleSet\DeclarationBlock#13 (3) { + private $aSelectors => + array(2) { + [0] => + class Sabberworm\CSS\Property\Selector#14 (2) { + private $sSelector => + string(4) "html" + private $iSpecificity => + NULL + } + [1] => + class Sabberworm\CSS\Property\Selector#15 (2) { + private $sSelector => + string(4) "body" + private $iSpecificity => + NULL + } + } + private $aRules => + array(1) { + 'font-size' => + array(1) { + [0] => + class Sabberworm\CSS\Rule\Rule#16 (4) { + private $sRule => + string(9) "font-size" + private $mValue => + class Sabberworm\CSS\Value\Size#17 (4) { + private $fSize => + double(1.6) + private $sUnit => + string(2) "em" + private $bIsColorComponent => + bool(false) + protected $iLineNo => + int(9) + } + private $bIsImportant => + bool(false) + protected $iLineNo => + int(9) + } + } + } + protected $iLineNo => + int(8) + } + [3] => + class Sabberworm\CSS\CSSList\KeyFrame#18 (4) { + private $vendorKeyFrame => + string(9) "keyframes" + private $animationName => + string(6) "mymove" + protected $aContents => + array(2) { + [0] => + class Sabberworm\CSS\RuleSet\DeclarationBlock#19 (3) { + private $aSelectors => + array(1) { + [0] => + class Sabberworm\CSS\Property\Selector#20 (2) { + private $sSelector => + string(4) "from" + private $iSpecificity => + NULL + } + } + private $aRules => + array(1) { + 'top' => + array(1) { + [0] => + class Sabberworm\CSS\Rule\Rule#21 (4) { + private $sRule => + string(3) "top" + private $mValue => + class Sabberworm\CSS\Value\Size#22 (4) { + private $fSize => + double(0) + private $sUnit => + string(2) "px" + private $bIsColorComponent => + bool(false) + protected $iLineNo => + int(13) + } + private $bIsImportant => + bool(false) + protected $iLineNo => + int(13) + } + } + } + protected $iLineNo => + int(13) + } + [1] => + class Sabberworm\CSS\RuleSet\DeclarationBlock#23 (3) { + private $aSelectors => + array(1) { + [0] => + class Sabberworm\CSS\Property\Selector#24 (2) { + private $sSelector => + string(2) "to" + private $iSpecificity => + NULL + } + } + private $aRules => + array(1) { + 'top' => + array(1) { + [0] => + class Sabberworm\CSS\Rule\Rule#25 (4) { + private $sRule => + string(3) "top" + private $mValue => + class Sabberworm\CSS\Value\Size#26 (4) { + private $fSize => + double(200) + private $sUnit => + string(2) "px" + private $bIsColorComponent => + bool(false) + protected $iLineNo => + int(14) + } + private $bIsImportant => + bool(false) + protected $iLineNo => + int(14) + } + } + } + protected $iLineNo => + int(14) + } + } + protected $iLineNo => + int(12) + } + } + protected $iLineNo => + int(1) +} + +``` +
+ +#### Output (`render()`) + +```css +@charset "utf-8"; +@font-face {font-family: "CrassRoots";src: url("../media/cr.ttf");} +html, body {font-size: 1.6em;} +@keyframes mymove {from {top: 0px;} to {top: 200px;}} +``` + +### Example 2 (Values) + +#### Input + +```css +#header { + margin: 10px 2em 1cm 2%; + font-family: Verdana, Helvetica, "Gill Sans", sans-serif; + color: red !important; +} + +``` + +
+ Structure (var_dump()) + +```php +class Sabberworm\CSS\CSSList\Document#4 (2) { + protected $aContents => + array(1) { + [0] => + class Sabberworm\CSS\RuleSet\DeclarationBlock#5 (3) { + private $aSelectors => + array(1) { + [0] => + class Sabberworm\CSS\Property\Selector#6 (2) { + private $sSelector => + string(7) "#header" + private $iSpecificity => + NULL + } + } + private $aRules => + array(3) { + 'margin' => + array(1) { + [0] => + class Sabberworm\CSS\Rule\Rule#7 (4) { + private $sRule => + string(6) "margin" + private $mValue => + class Sabberworm\CSS\Value\RuleValueList#12 (3) { + protected $aComponents => + array(4) { + [0] => + class Sabberworm\CSS\Value\Size#8 (4) { + private $fSize => + double(10) + private $sUnit => + string(2) "px" + private $bIsColorComponent => + bool(false) + protected $iLineNo => + int(2) + } + [1] => + class Sabberworm\CSS\Value\Size#9 (4) { + private $fSize => + double(2) + private $sUnit => + string(2) "em" + private $bIsColorComponent => + bool(false) + protected $iLineNo => + int(2) + } + [2] => + class Sabberworm\CSS\Value\Size#10 (4) { + private $fSize => + double(1) + private $sUnit => + string(2) "cm" + private $bIsColorComponent => + bool(false) + protected $iLineNo => + int(2) + } + [3] => + class Sabberworm\CSS\Value\Size#11 (4) { + private $fSize => + double(2) + private $sUnit => + string(1) "%" + private $bIsColorComponent => + bool(false) + protected $iLineNo => + int(2) + } + } + protected $sSeparator => + string(1) " " + protected $iLineNo => + int(2) + } + private $bIsImportant => + bool(false) + protected $iLineNo => + int(2) + } + } + 'font-family' => + array(1) { + [0] => + class Sabberworm\CSS\Rule\Rule#13 (4) { + private $sRule => + string(11) "font-family" + private $mValue => + class Sabberworm\CSS\Value\RuleValueList#15 (3) { + protected $aComponents => + array(4) { + [0] => + string(7) "Verdana" + [1] => + string(9) "Helvetica" + [2] => + class Sabberworm\CSS\Value\CSSString#14 (2) { + private $sString => + string(9) "Gill Sans" + protected $iLineNo => + int(3) + } + [3] => + string(10) "sans-serif" + } + protected $sSeparator => + string(1) "," + protected $iLineNo => + int(3) + } + private $bIsImportant => + bool(false) + protected $iLineNo => + int(3) + } + } + 'color' => + array(1) { + [0] => + class Sabberworm\CSS\Rule\Rule#16 (4) { + private $sRule => + string(5) "color" + private $mValue => + string(3) "red" + private $bIsImportant => + bool(true) + protected $iLineNo => + int(4) + } + } + } + protected $iLineNo => + int(1) + } + } + protected $iLineNo => + int(1) +} + +``` +
+ +#### Output (`render()`) + +```css +#header {margin: 10px 2em 1cm 2%;font-family: Verdana,Helvetica,"Gill Sans",sans-serif;color: red !important;} +``` + +## Contributors/Thanks to + +* [oliverklee](https://github.com/oliverklee) for lots of refactorings, code modernizations and CI integrations +* [raxbg](https://github.com/raxbg) for contributions to parse `calc`, grid lines, and various bugfixes. +* [westonruter](https://github.com/westonruter) for bugfixes and improvements. +* [FMCorz](https://github.com/FMCorz) for many patches and suggestions, for being able to parse comments and IE hacks (in lenient mode). +* [Lullabot](https://github.com/Lullabot) for a patch that allows to know the line number for each parsed token. +* [ju1ius](https://github.com/ju1ius) for the specificity parsing code and the ability to expand/compact shorthand properties. +* [ossinkine](https://github.com/ossinkine) for a 150 time performance boost. +* [GaryJones](https://github.com/GaryJones) for lots of input and [https://css-specificity.info/](https://css-specificity.info/). +* [docteurklein](https://github.com/docteurklein) for output formatting and `CSSList->remove()` inspiration. +* [nicolopignatelli](https://github.com/nicolopignatelli) for PSR-0 compatibility. +* [diegoembarcadero](https://github.com/diegoembarcadero) for keyframe at-rule parsing. +* [goetas](https://github.com/goetas) for @namespace at-rule support. +* [View full list](https://github.com/sabberworm/PHP-CSS-Parser/contributors) + +## Misc + +* Legacy Support: The latest pre-PSR-0 version of this project can be checked with the `0.9.0` tag. +* Running Tests: To run all unit tests for this project, run `composer install` to install phpunit and use `./vendor/bin/phpunit`. diff --git a/dompdf/vendor/sabberworm/php-css-parser/composer.json b/dompdf/vendor/sabberworm/php-css-parser/composer.json new file mode 100644 index 0000000..e3caf0c --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/composer.json @@ -0,0 +1,51 @@ +{ + "name": "sabberworm/php-css-parser", + "type": "library", + "description": "Parser for CSS Files written in PHP", + "keywords": [ + "parser", + "css", + "stylesheet" + ], + "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "license": "MIT", + "authors": [ + { + "name": "Raphael Schweikert" + }, + { + "name": "Oliver Klee", + "email": "github@oliverklee.de" + }, + { + "name": "Jake Hotson", + "email": "jake.github@qzdesign.co.uk" + } + ], + "require": { + "php": "^5.6.20 || ^7.0.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "ext-iconv": "*" + }, + "require-dev": { + "phpunit/phpunit": "5.7.27 || 6.5.14 || 7.5.20 || 8.5.41", + "rawr/cross-data-providers": "^2.0.0" + }, + "suggest": { + "ext-mbstring": "for parsing UTF-8 CSS" + }, + "autoload": { + "psr-4": { + "Sabberworm\\CSS\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Sabberworm\\CSS\\Tests\\": "tests/" + } + }, + "extra": { + "branch-alias": { + "dev-main": "9.0.x-dev" + } + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/CSSElement.php b/dompdf/vendor/sabberworm/php-css-parser/src/CSSElement.php new file mode 100644 index 0000000..944aabe --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/CSSElement.php @@ -0,0 +1,17 @@ +sType = $sType; + $this->sArgs = $sArgs; + } + + /** + * @return string + */ + public function atRuleName() + { + return $this->sType; + } + + /** + * @return string + */ + public function atRuleArgs() + { + return $this->sArgs; + } + + /** + * @return string + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->render(new OutputFormat()); + } + + /** + * @param OutputFormat|null $oOutputFormat + * + * @return string + */ + public function render($oOutputFormat) + { + $sResult = $oOutputFormat->comments($this); + $sResult .= $oOutputFormat->sBeforeAtRuleBlock; + $sArgs = $this->sArgs; + if ($sArgs) { + $sArgs = ' ' . $sArgs; + } + $sResult .= "@{$this->sType}$sArgs{$oOutputFormat->spaceBeforeOpeningBrace()}{"; + $sResult .= $this->renderListContents($oOutputFormat); + $sResult .= '}'; + $sResult .= $oOutputFormat->sAfterAtRuleBlock; + return $sResult; + } + + /** + * @return bool + */ + public function isRootList() + { + return false; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/CSSBlockList.php b/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/CSSBlockList.php new file mode 100644 index 0000000..aa0c67f --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/CSSBlockList.php @@ -0,0 +1,190 @@ + $aResult + * + * @return void + */ + protected function allDeclarationBlocks(array &$aResult) + { + foreach ($this->aContents as $mContent) { + if ($mContent instanceof DeclarationBlock) { + $aResult[] = $mContent; + } elseif ($mContent instanceof CSSBlockList) { + $mContent->allDeclarationBlocks($aResult); + } + } + } + + /** + * @param array $aResult + * + * @return void + */ + protected function allRuleSets(array &$aResult) + { + foreach ($this->aContents as $mContent) { + if ($mContent instanceof RuleSet) { + $aResult[] = $mContent; + } elseif ($mContent instanceof CSSBlockList) { + $mContent->allRuleSets($aResult); + } + } + } + + /** + * Returns all `Value` objects found recursively in `Rule`s in the tree. + * + * @param CSSElement|string|null $element + * This is the `CSSList` or `RuleSet` to start the search from (defaults to the whole document). + * If a string is given, it is used as a rule name filter. + * Passing a string for this parameter is deprecated in version 8.9.0, and will not work from v9.0; + * use the following parameter to pass a rule name filter instead. + * @param string|bool|null $ruleSearchPatternOrSearchInFunctionArguments + * This allows filtering rules by property name + * (e.g. if "color" is passed, only `Value`s from `color` properties will be returned, + * or if "font-" is provided, `Value`s from all font rules, like `font-size`, and including `font` itself, + * will be returned). + * If a Boolean is provided, it is treated as the `$searchInFunctionArguments` argument. + * Passing a Boolean for this parameter is deprecated in version 8.9.0, and will not work from v9.0; + * use the `$searchInFunctionArguments` parameter instead. + * @param bool $searchInFunctionArguments whether to also return Value objects used as Function arguments. + * + * @return array + * + * @see RuleSet->getRules() + */ + public function getAllValues( + $element = null, + $ruleSearchPatternOrSearchInFunctionArguments = null, + $searchInFunctionArguments = false + ) { + if (\is_bool($ruleSearchPatternOrSearchInFunctionArguments)) { + $searchInFunctionArguments = $ruleSearchPatternOrSearchInFunctionArguments; + $searchString = null; + } else { + $searchString = $ruleSearchPatternOrSearchInFunctionArguments; + } + + if ($element === null) { + $element = $this; + } elseif (\is_string($element)) { + $searchString = $element; + $element = $this; + } + + $result = []; + $this->allValues($element, $result, $searchString, $searchInFunctionArguments); + return $result; + } + + /** + * @param CSSElement|string $oElement + * @param array $aResult + * @param string|null $sSearchString + * @param bool $bSearchInFunctionArguments + * + * @return void + */ + protected function allValues($oElement, array &$aResult, $sSearchString = null, $bSearchInFunctionArguments = false) + { + if ($oElement instanceof CSSBlockList) { + foreach ($oElement->getContents() as $oContent) { + $this->allValues($oContent, $aResult, $sSearchString, $bSearchInFunctionArguments); + } + } elseif ($oElement instanceof RuleSet) { + foreach ($oElement->getRules($sSearchString) as $oRule) { + $this->allValues($oRule, $aResult, $sSearchString, $bSearchInFunctionArguments); + } + } elseif ($oElement instanceof Rule) { + $this->allValues($oElement->getValue(), $aResult, $sSearchString, $bSearchInFunctionArguments); + } elseif ($oElement instanceof ValueList) { + if ($bSearchInFunctionArguments || !($oElement instanceof CSSFunction)) { + foreach ($oElement->getListComponents() as $mComponent) { + $this->allValues($mComponent, $aResult, $sSearchString, $bSearchInFunctionArguments); + } + } + } else { + // Non-List `Value` or `CSSString` (CSS identifier) + $aResult[] = $oElement; + } + } + + /** + * @param array $aResult + * @param string|null $sSpecificitySearch + * + * @return void + */ + protected function allSelectors(array &$aResult, $sSpecificitySearch = null) + { + /** @var array $aDeclarationBlocks */ + $aDeclarationBlocks = []; + $this->allDeclarationBlocks($aDeclarationBlocks); + foreach ($aDeclarationBlocks as $oBlock) { + foreach ($oBlock->getSelectors() as $oSelector) { + if ($sSpecificitySearch === null) { + $aResult[] = $oSelector; + } else { + $sComparator = '==='; + $aSpecificitySearch = explode(' ', $sSpecificitySearch); + $iTargetSpecificity = $aSpecificitySearch[0]; + if (count($aSpecificitySearch) > 1) { + $sComparator = $aSpecificitySearch[0]; + $iTargetSpecificity = $aSpecificitySearch[1]; + } + $iTargetSpecificity = (int)$iTargetSpecificity; + $iSelectorSpecificity = $oSelector->getSpecificity(); + $bMatches = false; + switch ($sComparator) { + case '<=': + $bMatches = $iSelectorSpecificity <= $iTargetSpecificity; + break; + case '<': + $bMatches = $iSelectorSpecificity < $iTargetSpecificity; + break; + case '>=': + $bMatches = $iSelectorSpecificity >= $iTargetSpecificity; + break; + case '>': + $bMatches = $iSelectorSpecificity > $iTargetSpecificity; + break; + default: + $bMatches = $iSelectorSpecificity === $iTargetSpecificity; + break; + } + if ($bMatches) { + $aResult[] = $oSelector; + } + } + } + } + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/CSSList.php b/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/CSSList.php new file mode 100644 index 0000000..18d926e --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/CSSList.php @@ -0,0 +1,496 @@ + + * + * @internal since 8.8.0 + */ + protected $aComments; + + /** + * @var array + * + * @internal since 8.8.0 + */ + protected $aContents; + + /** + * @param int $iLineNo + */ + public function __construct($iLineNo = 0) + { + $this->aComments = []; + $this->aContents = []; + $this->setPosition($iLineNo); + } + + /** + * @return void + * + * @throws UnexpectedTokenException + * @throws SourceException + * + * @internal since V8.8.0 + */ + public static function parseList(ParserState $oParserState, CSSList $oList) + { + $bIsRoot = $oList instanceof Document; + if (is_string($oParserState)) { + $oParserState = new ParserState($oParserState, Settings::create()); + } + $bLenientParsing = $oParserState->getSettings()->bLenientParsing; + $aComments = []; + while (!$oParserState->isEnd()) { + $aComments = array_merge($aComments, $oParserState->consumeWhiteSpace()); + $oListItem = null; + if ($bLenientParsing) { + try { + $oListItem = self::parseListItem($oParserState, $oList); + } catch (UnexpectedTokenException $e) { + $oListItem = false; + } + } else { + $oListItem = self::parseListItem($oParserState, $oList); + } + if ($oListItem === null) { + // List parsing finished + return; + } + if ($oListItem) { + $oListItem->addComments($aComments); + $oList->append($oListItem); + } + $aComments = $oParserState->consumeWhiteSpace(); + } + $oList->addComments($aComments); + if (!$bIsRoot && !$bLenientParsing) { + throw new SourceException("Unexpected end of document", $oParserState->currentLine()); + } + } + + /** + * @return AtRuleBlockList|KeyFrame|Charset|CSSNamespace|Import|AtRuleSet|DeclarationBlock|null|false + * + * @throws SourceException + * @throws UnexpectedEOFException + * @throws UnexpectedTokenException + */ + private static function parseListItem(ParserState $oParserState, CSSList $oList) + { + $bIsRoot = $oList instanceof Document; + if ($oParserState->comes('@')) { + $oAtRule = self::parseAtRule($oParserState); + if ($oAtRule instanceof Charset) { + if (!$bIsRoot) { + throw new UnexpectedTokenException( + '@charset may only occur in root document', + '', + 'custom', + $oParserState->currentLine() + ); + } + if (count($oList->getContents()) > 0) { + throw new UnexpectedTokenException( + '@charset must be the first parseable token in a document', + '', + 'custom', + $oParserState->currentLine() + ); + } + $oParserState->setCharset($oAtRule->getCharset()); + } + return $oAtRule; + } elseif ($oParserState->comes('}')) { + if ($bIsRoot) { + if ($oParserState->getSettings()->bLenientParsing) { + return DeclarationBlock::parse($oParserState); + } else { + throw new SourceException("Unopened {", $oParserState->currentLine()); + } + } else { + // End of list + return null; + } + } else { + return DeclarationBlock::parse($oParserState, $oList); + } + } + + /** + * @param ParserState $oParserState + * + * @return AtRuleBlockList|KeyFrame|Charset|CSSNamespace|Import|AtRuleSet|null + * + * @throws SourceException + * @throws UnexpectedTokenException + * @throws UnexpectedEOFException + */ + private static function parseAtRule(ParserState $oParserState) + { + $oParserState->consume('@'); + $sIdentifier = $oParserState->parseIdentifier(); + $iIdentifierLineNum = $oParserState->currentLine(); + $oParserState->consumeWhiteSpace(); + if ($sIdentifier === 'import') { + $oLocation = URL::parse($oParserState); + $oParserState->consumeWhiteSpace(); + $sMediaQuery = null; + if (!$oParserState->comes(';')) { + $sMediaQuery = trim($oParserState->consumeUntil([';', ParserState::EOF])); + } + $oParserState->consumeUntil([';', ParserState::EOF], true, true); + return new Import($oLocation, $sMediaQuery ?: null, $iIdentifierLineNum); + } elseif ($sIdentifier === 'charset') { + $oCharsetString = CSSString::parse($oParserState); + $oParserState->consumeWhiteSpace(); + $oParserState->consumeUntil([';', ParserState::EOF], true, true); + return new Charset($oCharsetString, $iIdentifierLineNum); + } elseif (self::identifierIs($sIdentifier, 'keyframes')) { + $oResult = new KeyFrame($iIdentifierLineNum); + $oResult->setVendorKeyFrame($sIdentifier); + $oResult->setAnimationName(trim($oParserState->consumeUntil('{', false, true))); + CSSList::parseList($oParserState, $oResult); + if ($oParserState->comes('}')) { + $oParserState->consume('}'); + } + return $oResult; + } elseif ($sIdentifier === 'namespace') { + $sPrefix = null; + $mUrl = Value::parsePrimitiveValue($oParserState); + if (!$oParserState->comes(';')) { + $sPrefix = $mUrl; + $mUrl = Value::parsePrimitiveValue($oParserState); + } + $oParserState->consumeUntil([';', ParserState::EOF], true, true); + if ($sPrefix !== null && !is_string($sPrefix)) { + throw new UnexpectedTokenException('Wrong namespace prefix', $sPrefix, 'custom', $iIdentifierLineNum); + } + if (!($mUrl instanceof CSSString || $mUrl instanceof URL)) { + throw new UnexpectedTokenException( + 'Wrong namespace url of invalid type', + $mUrl, + 'custom', + $iIdentifierLineNum + ); + } + return new CSSNamespace($mUrl, $sPrefix, $iIdentifierLineNum); + } else { + // Unknown other at rule (font-face or such) + $sArgs = trim($oParserState->consumeUntil('{', false, true)); + if (substr_count($sArgs, "(") != substr_count($sArgs, ")")) { + if ($oParserState->getSettings()->bLenientParsing) { + return null; + } else { + throw new SourceException("Unmatched brace count in media query", $oParserState->currentLine()); + } + } + $bUseRuleSet = true; + foreach (explode('/', AtRule::BLOCK_RULES) as $sBlockRuleName) { + if (self::identifierIs($sIdentifier, $sBlockRuleName)) { + $bUseRuleSet = false; + break; + } + } + if ($bUseRuleSet) { + $oAtRule = new AtRuleSet($sIdentifier, $sArgs, $iIdentifierLineNum); + RuleSet::parseRuleSet($oParserState, $oAtRule); + } else { + $oAtRule = new AtRuleBlockList($sIdentifier, $sArgs, $iIdentifierLineNum); + CSSList::parseList($oParserState, $oAtRule); + if ($oParserState->comes('}')) { + $oParserState->consume('}'); + } + } + return $oAtRule; + } + } + + /** + * Tests an identifier for a given value. Since identifiers are all keywords, they can be vendor-prefixed. + * We need to check for these versions too. + * + * @param string $sIdentifier + * @param string $sMatch + * + * @return bool + */ + private static function identifierIs($sIdentifier, $sMatch) + { + return (strcasecmp($sIdentifier, $sMatch) === 0) + ?: preg_match("/^(-\\w+-)?$sMatch$/i", $sIdentifier) === 1; + } + + /** + * Prepends an item to the list of contents. + * + * @param RuleSet|CSSList|Import|Charset $oItem + * + * @return void + */ + public function prepend($oItem) + { + array_unshift($this->aContents, $oItem); + } + + /** + * Appends an item to the list of contents. + * + * @param RuleSet|CSSList|Import|Charset $oItem + * + * @return void + */ + public function append($oItem) + { + $this->aContents[] = $oItem; + } + + /** + * Splices the list of contents. + * + * @param int $iOffset + * @param int $iLength + * @param array $mReplacement + * + * @return void + */ + public function splice($iOffset, $iLength = null, $mReplacement = null) + { + array_splice($this->aContents, $iOffset, $iLength, $mReplacement); + } + + /** + * Inserts an item in the CSS list before its sibling. If the desired sibling cannot be found, + * the item is appended at the end. + * + * @param RuleSet|CSSList|Import|Charset $item + * @param RuleSet|CSSList|Import|Charset $sibling + */ + public function insertBefore($item, $sibling) + { + if (in_array($sibling, $this->aContents, true)) { + $this->replace($sibling, [$item, $sibling]); + } else { + $this->append($item); + } + } + + /** + * Removes an item from the CSS list. + * + * @param RuleSet|Import|Charset|CSSList $oItemToRemove + * May be a RuleSet (most likely a DeclarationBlock), a Import, + * a Charset or another CSSList (most likely a MediaQuery) + * + * @return bool whether the item was removed + */ + public function remove($oItemToRemove) + { + $iKey = array_search($oItemToRemove, $this->aContents, true); + if ($iKey !== false) { + unset($this->aContents[$iKey]); + return true; + } + return false; + } + + /** + * Replaces an item from the CSS list. + * + * @param RuleSet|Import|Charset|CSSList $oOldItem + * May be a `RuleSet` (most likely a `DeclarationBlock`), an `Import`, a `Charset` + * or another `CSSList` (most likely a `MediaQuery`) + * + * @return bool + */ + public function replace($oOldItem, $mNewItem) + { + $iKey = array_search($oOldItem, $this->aContents, true); + if ($iKey !== false) { + if (is_array($mNewItem)) { + array_splice($this->aContents, $iKey, 1, $mNewItem); + } else { + array_splice($this->aContents, $iKey, 1, [$mNewItem]); + } + return true; + } + return false; + } + + /** + * @param array $aContents + */ + public function setContents(array $aContents) + { + $this->aContents = []; + foreach ($aContents as $content) { + $this->append($content); + } + } + + /** + * Removes a declaration block from the CSS list if it matches all given selectors. + * + * @param DeclarationBlock|array|string $mSelector the selectors to match + * @param bool $bRemoveAll whether to stop at the first declaration block found or remove all blocks + * + * @return void + */ + public function removeDeclarationBlockBySelector($mSelector, $bRemoveAll = false) + { + if ($mSelector instanceof DeclarationBlock) { + $mSelector = $mSelector->getSelectors(); + } + if (!is_array($mSelector)) { + $mSelector = explode(',', $mSelector); + } + foreach ($mSelector as $iKey => &$mSel) { + if (!($mSel instanceof Selector)) { + if (!Selector::isValid($mSel)) { + throw new UnexpectedTokenException( + "Selector did not match '" . Selector::SELECTOR_VALIDATION_RX . "'.", + $mSel, + "custom" + ); + } + $mSel = new Selector($mSel); + } + } + foreach ($this->aContents as $iKey => $mItem) { + if (!($mItem instanceof DeclarationBlock)) { + continue; + } + if ($mItem->getSelectors() == $mSelector) { + unset($this->aContents[$iKey]); + if (!$bRemoveAll) { + return; + } + } + } + } + + /** + * @return string + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->render(new OutputFormat()); + } + + /** + * @return string + */ + protected function renderListContents(OutputFormat $oOutputFormat) + { + $sResult = ''; + $bIsFirst = true; + $oNextLevel = $oOutputFormat; + if (!$this->isRootList()) { + $oNextLevel = $oOutputFormat->nextLevel(); + } + foreach ($this->aContents as $oContent) { + $sRendered = $oOutputFormat->safely(function () use ($oNextLevel, $oContent) { + return $oContent->render($oNextLevel); + }); + if ($sRendered === null) { + continue; + } + if ($bIsFirst) { + $bIsFirst = false; + $sResult .= $oNextLevel->spaceBeforeBlocks(); + } else { + $sResult .= $oNextLevel->spaceBetweenBlocks(); + } + $sResult .= $sRendered; + } + + if (!$bIsFirst) { + // Had some output + $sResult .= $oOutputFormat->spaceAfterBlocks(); + } + + return $sResult; + } + + /** + * Return true if the list can not be further outdented. Only important when rendering. + * + * @return bool + */ + abstract public function isRootList(); + + /** + * Returns the stored items. + * + * @return array + */ + public function getContents() + { + return $this->aContents; + } + + /** + * @param array $aComments + * + * @return void + */ + public function addComments(array $aComments) + { + $this->aComments = array_merge($this->aComments, $aComments); + } + + /** + * @return array + */ + public function getComments() + { + return $this->aComments; + } + + /** + * @param array $aComments + * + * @return void + */ + public function setComments(array $aComments) + { + $this->aComments = $aComments; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/Document.php b/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/Document.php new file mode 100644 index 0000000..ed4b09b --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/Document.php @@ -0,0 +1,151 @@ +currentLine()); + CSSList::parseList($oParserState, $oDocument); + return $oDocument; + } + + /** + * Gets all `DeclarationBlock` objects recursively, no matter how deeply nested the selectors are. + * Aliased as `getAllSelectors()`. + * + * @return array + */ + public function getAllDeclarationBlocks() + { + /** @var array $aResult */ + $aResult = []; + $this->allDeclarationBlocks($aResult); + return $aResult; + } + + /** + * Gets all `DeclarationBlock` objects recursively. + * + * @return array + * + * @deprecated will be removed in version 9.0; use `getAllDeclarationBlocks()` instead + */ + public function getAllSelectors() + { + return $this->getAllDeclarationBlocks(); + } + + /** + * Returns all `RuleSet` objects recursively found in the tree, no matter how deeply nested the rule sets are. + * + * @return array + */ + public function getAllRuleSets() + { + /** @var array $aResult */ + $aResult = []; + $this->allRuleSets($aResult); + return $aResult; + } + + /** + * Returns all `Selector` objects with the requested specificity found recursively in the tree. + * + * Note that this does not yield the full `DeclarationBlock` that the selector belongs to + * (and, currently, there is no way to get to that). + * + * @param string|null $sSpecificitySearch + * An optional filter by specificity. + * May contain a comparison operator and a number or just a number (defaults to "=="). + * + * @return array + * @example `getSelectorsBySpecificity('>= 100')` + * + */ + public function getSelectorsBySpecificity($sSpecificitySearch = null) + { + /** @var array $aResult */ + $aResult = []; + $this->allSelectors($aResult, $sSpecificitySearch); + return $aResult; + } + + /** + * Expands all shorthand properties to their long value. + * + * @return void + * + * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 + */ + public function expandShorthands() + { + foreach ($this->getAllDeclarationBlocks() as $oDeclaration) { + $oDeclaration->expandShorthands(); + } + } + + /** + * Create shorthands properties whenever possible. + * + * @return void + * + * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 + */ + public function createShorthands() + { + foreach ($this->getAllDeclarationBlocks() as $oDeclaration) { + $oDeclaration->createShorthands(); + } + } + + /** + * Overrides `render()` to make format argument optional. + * + * @param OutputFormat|null $oOutputFormat + * + * @return string + */ + public function render($oOutputFormat = null) + { + if ($oOutputFormat === null) { + $oOutputFormat = new OutputFormat(); + } + return $oOutputFormat->comments($this) . $this->renderListContents($oOutputFormat); + } + + /** + * @return bool + */ + public function isRootList() + { + return true; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/KeyFrame.php b/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/KeyFrame.php new file mode 100644 index 0000000..618308a --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/CSSList/KeyFrame.php @@ -0,0 +1,109 @@ +vendorKeyFrame = null; + $this->animationName = null; + } + + /** + * @param string $vendorKeyFrame + */ + public function setVendorKeyFrame($vendorKeyFrame) + { + $this->vendorKeyFrame = $vendorKeyFrame; + } + + /** + * @return string|null + */ + public function getVendorKeyFrame() + { + return $this->vendorKeyFrame; + } + + /** + * @param string $animationName + */ + public function setAnimationName($animationName) + { + $this->animationName = $animationName; + } + + /** + * @return string|null + */ + public function getAnimationName() + { + return $this->animationName; + } + + /** + * @return string + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->render(new OutputFormat()); + } + + /** + * @param OutputFormat|null $oOutputFormat + * + * @return string + */ + public function render($oOutputFormat) + { + $sResult = $oOutputFormat->comments($this); + $sResult .= "@{$this->vendorKeyFrame} {$this->animationName}{$oOutputFormat->spaceBeforeOpeningBrace()}{"; + $sResult .= $this->renderListContents($oOutputFormat); + $sResult .= '}'; + return $sResult; + } + + /** + * @return bool + */ + public function isRootList() + { + return false; + } + + /** + * @return string|null + */ + public function atRuleName() + { + return $this->vendorKeyFrame; + } + + /** + * @return string|null + */ + public function atRuleArgs() + { + return $this->animationName; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Comment/Comment.php b/dompdf/vendor/sabberworm/php-css-parser/src/Comment/Comment.php new file mode 100644 index 0000000..fb571b4 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Comment/Comment.php @@ -0,0 +1,68 @@ +sComment = $sComment; + $this->setPosition($iLineNo); + } + + /** + * @return string + */ + public function getComment() + { + return $this->sComment; + } + + /** + * @param string $sComment + * + * @return void + */ + public function setComment($sComment) + { + $this->sComment = $sComment; + } + + /** + * @return string + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->render(new OutputFormat()); + } + + /** + * @param OutputFormat|null $oOutputFormat + * + * @return string + */ + public function render($oOutputFormat) + { + return '/*' . $this->sComment . '*/'; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Comment/Commentable.php b/dompdf/vendor/sabberworm/php-css-parser/src/Comment/Commentable.php new file mode 100644 index 0000000..5e450bf --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Comment/Commentable.php @@ -0,0 +1,25 @@ + $aComments + * + * @return void + */ + public function addComments(array $aComments); + + /** + * @return array + */ + public function getComments(); + + /** + * @param array $aComments + * + * @return void + */ + public function setComments(array $aComments); +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/OutputFormat.php b/dompdf/vendor/sabberworm/php-css-parser/src/OutputFormat.php new file mode 100644 index 0000000..9778e27 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/OutputFormat.php @@ -0,0 +1,437 @@ +set('Space*Rules', "\n");`) + * + * @var string + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $sSpaceAfterRuleName = ' '; + + /** + * @var string + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $sSpaceBeforeRules = ''; + + /** + * @var string + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $sSpaceAfterRules = ''; + + /** + * @var string + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $sSpaceBetweenRules = ''; + + /** + * @var string + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $sSpaceBeforeBlocks = ''; + + /** + * @var string + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $sSpaceAfterBlocks = ''; + + /** + * @var string + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $sSpaceBetweenBlocks = "\n"; + + /** + * Content injected in and around at-rule blocks. + * + * @var string + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $sBeforeAtRuleBlock = ''; + + /** + * @var string + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $sAfterAtRuleBlock = ''; + + /** + * This is what’s printed before and after the comma if a declaration block contains multiple selectors. + * + * @var string + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $sSpaceBeforeSelectorSeparator = ''; + + /** + * @var string + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $sSpaceAfterSelectorSeparator = ' '; + + /** + * This is what’s inserted before the separator in value lists, by default. + * + * `array` is deprecated in version 8.8.0, and will be removed in version 9.0.0. + * To set the spacing for specific separators, use {@see $aSpaceBeforeListArgumentSeparators} instead. + * + * @var string|array + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $sSpaceBeforeListArgumentSeparator = ''; + + /** + * Keys are separators (e.g. `,`). Values are the space sequence to insert, or an empty string. + * + * @var array + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $aSpaceBeforeListArgumentSeparators = []; + + /** + * This is what’s inserted after the separator in value lists, by default. + * + * `array` is deprecated in version 8.8.0, and will be removed in version 9.0.0. + * To set the spacing for specific separators, use {@see $aSpaceAfterListArgumentSeparators} instead. + * + * @var string|array + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $sSpaceAfterListArgumentSeparator = ''; + + /** + * Keys are separators (e.g. `,`). Values are the space sequence to insert, or an empty string. + * + * @var array + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $aSpaceAfterListArgumentSeparators = []; + + /** + * @var string + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $sSpaceBeforeOpeningBrace = ' '; + + /** + * Content injected in and around declaration blocks. + * + * @var string + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $sBeforeDeclarationBlock = ''; + + /** + * @var string + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $sAfterDeclarationBlockSelectors = ''; + + /** + * @var string + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $sAfterDeclarationBlock = ''; + + /** + * Indentation character(s) per level. Only applicable if newlines are used in any of the spacing settings. + * + * @var string + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $sIndentation = "\t"; + + /** + * Output exceptions. + * + * @var bool + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $bIgnoreExceptions = false; + + /** + * Render comments for lists and RuleSets + * + * @var bool + * + * @internal since 8.8.0, will be made private in 9.0.0 + */ + public $bRenderComments = false; + + /** + * @var OutputFormatter|null + */ + private $oFormatter = null; + + /** + * @var OutputFormat|null + */ + private $oNextLevelFormat = null; + + /** + * @var int + */ + private $iIndentationLevel = 0; + + /** + * @internal since V8.8.0. Use the factory methods `create()`, `createCompact()`, or `createPretty()` instead. + */ + public function __construct() + { + } + + /** + * @param string $sName + * + * @return string|null + * + * @deprecated since 8.8.0, will be removed in 9.0.0. Use specific getters instead. + */ + public function get($sName) + { + $aVarPrefixes = ['a', 's', 'm', 'b', 'f', 'o', 'c', 'i']; + foreach ($aVarPrefixes as $sPrefix) { + $sFieldName = $sPrefix . ucfirst($sName); + if (isset($this->$sFieldName)) { + return $this->$sFieldName; + } + } + return null; + } + + /** + * @param array|string $aNames + * @param mixed $mValue + * + * @return self|false + * + * @deprecated since 8.8.0, will be removed in 9.0.0. Use specific setters instead. + */ + public function set($aNames, $mValue) + { + $aVarPrefixes = ['a', 's', 'm', 'b', 'f', 'o', 'c', 'i']; + if (is_string($aNames) && strpos($aNames, '*') !== false) { + $aNames = + [ + str_replace('*', 'Before', $aNames), + str_replace('*', 'Between', $aNames), + str_replace('*', 'After', $aNames), + ]; + } elseif (!is_array($aNames)) { + $aNames = [$aNames]; + } + foreach ($aVarPrefixes as $sPrefix) { + $bDidReplace = false; + foreach ($aNames as $sName) { + $sFieldName = $sPrefix . ucfirst($sName); + if (isset($this->$sFieldName)) { + $this->$sFieldName = $mValue; + $bDidReplace = true; + } + } + if ($bDidReplace) { + return $this; + } + } + // Break the chain so the user knows this option is invalid + return false; + } + + /** + * @param string $sMethodName + * @param array $aArguments + * + * @return mixed + * + * @throws \Exception + */ + public function __call($sMethodName, array $aArguments) + { + if (strpos($sMethodName, 'set') === 0) { + return $this->set(substr($sMethodName, 3), $aArguments[0]); + } elseif (strpos($sMethodName, 'get') === 0) { + return $this->get(substr($sMethodName, 3)); + } elseif (method_exists(OutputFormatter::class, $sMethodName)) { + // @deprecated since 8.8.0, will be removed in 9.0.0. Call the method on the formatter directly instead. + return call_user_func_array([$this->getFormatter(), $sMethodName], $aArguments); + } else { + throw new \Exception('Unknown OutputFormat method called: ' . $sMethodName); + } + } + + /** + * @param int $iNumber + * + * @return self + */ + public function indentWithTabs($iNumber = 1) + { + return $this->setIndentation(str_repeat("\t", $iNumber)); + } + + /** + * @param int $iNumber + * + * @return self + */ + public function indentWithSpaces($iNumber = 2) + { + return $this->setIndentation(str_repeat(" ", $iNumber)); + } + + /** + * @return OutputFormat + * + * @internal since V8.8.0 + */ + public function nextLevel() + { + if ($this->oNextLevelFormat === null) { + $this->oNextLevelFormat = clone $this; + $this->oNextLevelFormat->iIndentationLevel++; + $this->oNextLevelFormat->oFormatter = null; + } + return $this->oNextLevelFormat; + } + + /** + * @return void + */ + public function beLenient() + { + $this->bIgnoreExceptions = true; + } + + /** + * @return OutputFormatter + * + * @internal since 8.8.0 + */ + public function getFormatter() + { + if ($this->oFormatter === null) { + $this->oFormatter = new OutputFormatter($this); + } + + return $this->oFormatter; + } + + /** + * @return int + * + * @deprecated #869 since version V8.8.0, will be removed in V9.0.0. Use `getIndentationLevel()` instead. + */ + public function level() + { + return $this->iIndentationLevel; + } + + /** + * Creates an instance of this class without any particular formatting settings. + * + * @return self + */ + public static function create() + { + return new OutputFormat(); + } + + /** + * Creates an instance of this class with a preset for compact formatting. + * + * @return self + */ + public static function createCompact() + { + $format = self::create(); + $format->set('Space*Rules', "") + ->set('Space*Blocks', "") + ->setSpaceAfterRuleName('') + ->setSpaceBeforeOpeningBrace('') + ->setSpaceAfterSelectorSeparator('') + ->setRenderComments(false); + return $format; + } + + /** + * Creates an instance of this class with a preset for pretty formatting. + * + * @return self + */ + public static function createPretty() + { + $format = self::create(); + $format->set('Space*Rules', "\n") + ->set('Space*Blocks', "\n") + ->setSpaceBetweenBlocks("\n\n") + ->set('SpaceAfterListArgumentSeparators', [',' => ' ']) + ->setRenderComments(true); + return $format; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/OutputFormatter.php b/dompdf/vendor/sabberworm/php-css-parser/src/OutputFormatter.php new file mode 100644 index 0000000..a436ee3 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/OutputFormatter.php @@ -0,0 +1,268 @@ +oFormat = $oFormat; + } + + /** + * @param string $sName + * @param string|null $sType + * + * @return string + */ + public function space($sName, $sType = null) + { + $sSpaceString = $this->oFormat->get("Space$sName"); + // If $sSpaceString is an array, we have multiple values configured + // depending on the type of object the space applies to + if (is_array($sSpaceString)) { + if ($sType !== null && isset($sSpaceString[$sType])) { + $sSpaceString = $sSpaceString[$sType]; + } else { + $sSpaceString = reset($sSpaceString); + } + } + return $this->prepareSpace($sSpaceString); + } + + /** + * @return string + */ + public function spaceAfterRuleName() + { + return $this->space('AfterRuleName'); + } + + /** + * @return string + */ + public function spaceBeforeRules() + { + return $this->space('BeforeRules'); + } + + /** + * @return string + */ + public function spaceAfterRules() + { + return $this->space('AfterRules'); + } + + /** + * @return string + */ + public function spaceBetweenRules() + { + return $this->space('BetweenRules'); + } + + /** + * @return string + */ + public function spaceBeforeBlocks() + { + return $this->space('BeforeBlocks'); + } + + /** + * @return string + */ + public function spaceAfterBlocks() + { + return $this->space('AfterBlocks'); + } + + /** + * @return string + */ + public function spaceBetweenBlocks() + { + return $this->space('BetweenBlocks'); + } + + /** + * @return string + */ + public function spaceBeforeSelectorSeparator() + { + return $this->space('BeforeSelectorSeparator'); + } + + /** + * @return string + */ + public function spaceAfterSelectorSeparator() + { + return $this->space('AfterSelectorSeparator'); + } + + /** + * @param string $sSeparator + * + * @return string + */ + public function spaceBeforeListArgumentSeparator($sSeparator) + { + $spaceForSeparator = $this->oFormat->getSpaceBeforeListArgumentSeparators(); + if (isset($spaceForSeparator[$sSeparator])) { + return $spaceForSeparator[$sSeparator]; + } + + return $this->space('BeforeListArgumentSeparator', $sSeparator); + } + + /** + * @param string $sSeparator + * + * @return string + */ + public function spaceAfterListArgumentSeparator($sSeparator) + { + $spaceForSeparator = $this->oFormat->getSpaceAfterListArgumentSeparators(); + if (isset($spaceForSeparator[$sSeparator])) { + return $spaceForSeparator[$sSeparator]; + } + + return $this->space('AfterListArgumentSeparator', $sSeparator); + } + + /** + * @return string + */ + public function spaceBeforeOpeningBrace() + { + return $this->space('BeforeOpeningBrace'); + } + + /** + * Runs the given code, either swallowing or passing exceptions, depending on the `bIgnoreExceptions` setting. + * + * @param string $cCode the name of the function to call + * + * @return string|null + */ + public function safely($cCode) + { + if ($this->oFormat->get('IgnoreExceptions')) { + // If output exceptions are ignored, run the code with exception guards + try { + return $cCode(); + } catch (OutputException $e) { + return null; + } // Do nothing + } else { + // Run the code as-is + return $cCode(); + } + } + + /** + * Clone of the `implode` function, but calls `render` with the current output format instead of `__toString()`. + * + * @param string $sSeparator + * @param array $aValues + * @param bool $bIncreaseLevel + * + * @return string + */ + public function implode($sSeparator, array $aValues, $bIncreaseLevel = false) + { + $sResult = ''; + $oFormat = $this->oFormat; + if ($bIncreaseLevel) { + $oFormat = $oFormat->nextLevel(); + } + $bIsFirst = true; + foreach ($aValues as $mValue) { + if ($bIsFirst) { + $bIsFirst = false; + } else { + $sResult .= $sSeparator; + } + if ($mValue instanceof Renderable) { + $sResult .= $mValue->render($oFormat); + } else { + $sResult .= $mValue; + } + } + return $sResult; + } + + /** + * @param string $sString + * + * @return string + */ + public function removeLastSemicolon($sString) + { + if ($this->oFormat->get('SemicolonAfterLastRule')) { + return $sString; + } + $sString = explode(';', $sString); + if (count($sString) < 2) { + return $sString[0]; + } + $sLast = array_pop($sString); + $sNextToLast = array_pop($sString); + array_push($sString, $sNextToLast . $sLast); + return implode(';', $sString); + } + + /** + * + * @param array $aComments + * + * @return string + */ + public function comments(Commentable $oCommentable) + { + if (!$this->oFormat->bRenderComments) { + return ''; + } + + $sResult = ''; + $aComments = $oCommentable->getComments(); + $iLastCommentIndex = count($aComments) - 1; + + foreach ($aComments as $i => $oComment) { + $sResult .= $oComment->render($this->oFormat); + $sResult .= $i === $iLastCommentIndex ? $this->spaceAfterBlocks() : $this->spaceBetweenBlocks(); + } + return $sResult; + } + + /** + * @param string $sSpaceString + * + * @return string + */ + private function prepareSpace($sSpaceString) + { + return str_replace("\n", "\n" . $this->indent(), $sSpaceString); + } + + /** + * @return string + */ + private function indent() + { + return str_repeat($this->oFormat->sIndentation, $this->oFormat->getIndentationLevel()); + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Parser.php b/dompdf/vendor/sabberworm/php-css-parser/src/Parser.php new file mode 100644 index 0000000..f60fc08 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Parser.php @@ -0,0 +1,70 @@ +oParserState = new ParserState($sText, $oParserSettings, $iLineNo); + } + + /** + * Sets the charset to be used if the CSS does not contain an `@charset` declaration. + * + * @param string $sCharset + * + * @return void + * + * @deprecated since 8.7.0, will be removed in version 9.0.0 with #687 + */ + public function setCharset($sCharset) + { + $this->oParserState->setCharset($sCharset); + } + + /** + * Returns the charset that is used if the CSS does not contain an `@charset` declaration. + * + * @return void + * + * @deprecated since 8.7.0, will be removed in version 9.0.0 with #687 + */ + public function getCharset() + { + // Note: The `return` statement is missing here. This is a bug that needs to be fixed. + $this->oParserState->getCharset(); + } + + /** + * Parses the CSS provided to the constructor and creates a `Document` from it. + * + * @return Document + * + * @throws SourceException + */ + public function parse() + { + return Document::parse($this->oParserState); + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/Anchor.php b/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/Anchor.php new file mode 100644 index 0000000..a42893d --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/Anchor.php @@ -0,0 +1,37 @@ +iPosition = $iPosition; + $this->oParserState = $oParserState; + } + + /** + * @return void + */ + public function backtrack() + { + $this->oParserState->setPosition($this->iPosition); + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/OutputException.php b/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/OutputException.php new file mode 100644 index 0000000..9bfbc75 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/OutputException.php @@ -0,0 +1,18 @@ + + */ + private $aText; + + /** + * @var int + */ + private $iCurrentPosition; + + /** + * will only be used if the CSS does not contain an `@charset` declaration + * + * @var string + */ + private $sCharset; + + /** + * @var int + */ + private $iLength; + + /** + * @var int + */ + private $iLineNo; + + /** + * @param string $sText the complete CSS as text (i.e., usually the contents of a CSS file) + * @param int $iLineNo + */ + public function __construct($sText, Settings $oParserSettings, $iLineNo = 1) + { + $this->oParserSettings = $oParserSettings; + $this->sText = $sText; + $this->iCurrentPosition = 0; + $this->iLineNo = $iLineNo; + $this->setCharset($this->oParserSettings->sDefaultCharset); + } + + /** + * Sets the charset to be used if the CSS does not contain an `@charset` declaration. + * + * @param string $sCharset + * + * @return void + */ + public function setCharset($sCharset) + { + $this->sCharset = $sCharset; + $this->aText = $this->strsplit($this->sText); + if (is_array($this->aText)) { + $this->iLength = count($this->aText); + } + } + + /** + * Returns the charset that is used if the CSS does not contain an `@charset` declaration. + * + * @return string + */ + public function getCharset() + { + return $this->sCharset; + } + + /** + * @return int + */ + public function currentLine() + { + return $this->iLineNo; + } + + /** + * @return int + */ + public function currentColumn() + { + return $this->iCurrentPosition; + } + + /** + * @return Settings + */ + public function getSettings() + { + return $this->oParserSettings; + } + + /** + * @return \Sabberworm\CSS\Parsing\Anchor + */ + public function anchor() + { + return new Anchor($this->iCurrentPosition, $this); + } + + /** + * @param int $iPosition + * + * @return void + */ + public function setPosition($iPosition) + { + $this->iCurrentPosition = $iPosition; + } + + /** + * @param bool $bIgnoreCase + * + * @return string + * + * @throws UnexpectedTokenException + * + * @internal since V8.8.0 + */ + public function parseIdentifier($bIgnoreCase = true) + { + if ($this->isEnd()) { + throw new UnexpectedEOFException('', '', 'identifier', $this->iLineNo); + } + $sResult = $this->parseCharacter(true); + if ($sResult === null) { + throw new UnexpectedTokenException($sResult, $this->peek(5), 'identifier', $this->iLineNo); + } + $sCharacter = null; + while (!$this->isEnd() && ($sCharacter = $this->parseCharacter(true)) !== null) { + if (preg_match('/[a-zA-Z0-9\x{00A0}-\x{FFFF}_-]/Sux', $sCharacter)) { + $sResult .= $sCharacter; + } else { + $sResult .= '\\' . $sCharacter; + } + } + if ($bIgnoreCase) { + $sResult = $this->strtolower($sResult); + } + return $sResult; + } + + /** + * @param bool $bIsForIdentifier + * + * @return string|null + * + * @throws UnexpectedEOFException + * @throws UnexpectedTokenException + * + * @internal since V8.8.0 + */ + public function parseCharacter($bIsForIdentifier) + { + if ($this->peek() === '\\') { + if ( + $bIsForIdentifier && $this->oParserSettings->bLenientParsing + && ($this->comes('\0') || $this->comes('\9')) + ) { + // Non-strings can contain \0 or \9 which is an IE hack supported in lenient parsing. + return null; + } + $this->consume('\\'); + if ($this->comes('\n') || $this->comes('\r')) { + return ''; + } + if (preg_match('/[0-9a-fA-F]/Su', $this->peek()) === 0) { + return $this->consume(1); + } + $sUnicode = $this->consumeExpression('/^[0-9a-fA-F]{1,6}/u', 6); + if ($this->strlen($sUnicode) < 6) { + // Consume whitespace after incomplete unicode escape + if (preg_match('/\\s/isSu', $this->peek())) { + if ($this->comes('\r\n')) { + $this->consume(2); + } else { + $this->consume(1); + } + } + } + $iUnicode = intval($sUnicode, 16); + $sUtf32 = ""; + for ($i = 0; $i < 4; ++$i) { + $sUtf32 .= chr($iUnicode & 0xff); + $iUnicode = $iUnicode >> 8; + } + return iconv('utf-32le', $this->sCharset, $sUtf32); + } + if ($bIsForIdentifier) { + $peek = ord($this->peek()); + // Ranges: a-z A-Z 0-9 - _ + if ( + ($peek >= 97 && $peek <= 122) + || ($peek >= 65 && $peek <= 90) + || ($peek >= 48 && $peek <= 57) + || ($peek === 45) + || ($peek === 95) + || ($peek > 0xa1) + ) { + return $this->consume(1); + } + } else { + return $this->consume(1); + } + return null; + } + + /** + * @return array|void + * + * @throws UnexpectedEOFException + * @throws UnexpectedTokenException + */ + public function consumeWhiteSpace() + { + $aComments = []; + do { + while (preg_match('/\\s/isSu', $this->peek()) === 1) { + $this->consume(1); + } + if ($this->oParserSettings->bLenientParsing) { + try { + $oComment = $this->consumeComment(); + } catch (UnexpectedEOFException $e) { + $this->iCurrentPosition = $this->iLength; + return $aComments; + } + } else { + $oComment = $this->consumeComment(); + } + if ($oComment !== false) { + $aComments[] = $oComment; + } + } while ($oComment !== false); + return $aComments; + } + + /** + * @param string $sString + * @param bool $bCaseInsensitive + * + * @return bool + */ + public function comes($sString, $bCaseInsensitive = false) + { + $sPeek = $this->peek(strlen($sString)); + return ($sPeek == '') + ? false + : $this->streql($sPeek, $sString, $bCaseInsensitive); + } + + /** + * @param int $iLength + * @param int $iOffset + * + * @return string + */ + public function peek($iLength = 1, $iOffset = 0) + { + $iOffset += $this->iCurrentPosition; + if ($iOffset >= $this->iLength) { + return ''; + } + return $this->substr($iOffset, $iLength); + } + + /** + * @param int $mValue + * + * @return string + * + * @throws UnexpectedEOFException + * @throws UnexpectedTokenException + */ + public function consume($mValue = 1) + { + if (is_string($mValue)) { + $iLineCount = substr_count($mValue, "\n"); + $iLength = $this->strlen($mValue); + if (!$this->streql($this->substr($this->iCurrentPosition, $iLength), $mValue)) { + throw new UnexpectedTokenException($mValue, $this->peek(max($iLength, 5)), $this->iLineNo); + } + $this->iLineNo += $iLineCount; + $this->iCurrentPosition += $this->strlen($mValue); + return $mValue; + } else { + if ($this->iCurrentPosition + $mValue > $this->iLength) { + throw new UnexpectedEOFException($mValue, $this->peek(5), 'count', $this->iLineNo); + } + $sResult = $this->substr($this->iCurrentPosition, $mValue); + $iLineCount = substr_count($sResult, "\n"); + $this->iLineNo += $iLineCount; + $this->iCurrentPosition += $mValue; + return $sResult; + } + } + + /** + * @param string $mExpression + * @param int|null $iMaxLength + * + * @return string + * + * @throws UnexpectedEOFException + * @throws UnexpectedTokenException + */ + public function consumeExpression($mExpression, $iMaxLength = null) + { + $aMatches = null; + $sInput = $iMaxLength !== null ? $this->peek($iMaxLength) : $this->inputLeft(); + if (preg_match($mExpression, $sInput, $aMatches, PREG_OFFSET_CAPTURE) === 1) { + return $this->consume($aMatches[0][0]); + } + throw new UnexpectedTokenException($mExpression, $this->peek(5), 'expression', $this->iLineNo); + } + + /** + * @return Comment|false + */ + public function consumeComment() + { + $mComment = false; + if ($this->comes('/*')) { + $iLineNo = $this->iLineNo; + $this->consume(1); + $mComment = ''; + while (($char = $this->consume(1)) !== '') { + $mComment .= $char; + if ($this->comes('*/')) { + $this->consume(2); + break; + } + } + } + + if ($mComment !== false) { + // We skip the * which was included in the comment. + return new Comment(substr($mComment, 1), $iLineNo); + } + + return $mComment; + } + + /** + * @return bool + */ + public function isEnd() + { + return $this->iCurrentPosition >= $this->iLength; + } + + /** + * @param array|string $aEnd + * @param string $bIncludeEnd + * @param string $consumeEnd + * @param array $comments + * + * @return string + * + * @throws UnexpectedEOFException + * @throws UnexpectedTokenException + */ + public function consumeUntil($aEnd, $bIncludeEnd = false, $consumeEnd = false, array &$comments = []) + { + $aEnd = is_array($aEnd) ? $aEnd : [$aEnd]; + $out = ''; + $start = $this->iCurrentPosition; + + while (!$this->isEnd()) { + $char = $this->consume(1); + if (in_array($char, $aEnd)) { + if ($bIncludeEnd) { + $out .= $char; + } elseif (!$consumeEnd) { + $this->iCurrentPosition -= $this->strlen($char); + } + return $out; + } + $out .= $char; + if ($comment = $this->consumeComment()) { + $comments[] = $comment; + } + } + + if (in_array(self::EOF, $aEnd)) { + return $out; + } + + $this->iCurrentPosition = $start; + throw new UnexpectedEOFException( + 'One of ("' . implode('","', $aEnd) . '")', + $this->peek(5), + 'search', + $this->iLineNo + ); + } + + /** + * @return string + */ + private function inputLeft() + { + return $this->substr($this->iCurrentPosition, -1); + } + + /** + * @param string $sString1 + * @param string $sString2 + * @param bool $bCaseInsensitive + * + * @return bool + */ + public function streql($sString1, $sString2, $bCaseInsensitive = true) + { + if ($bCaseInsensitive) { + return $this->strtolower($sString1) === $this->strtolower($sString2); + } else { + return $sString1 === $sString2; + } + } + + /** + * @param int $iAmount + * + * @return void + */ + public function backtrack($iAmount) + { + $this->iCurrentPosition -= $iAmount; + } + + /** + * @param string $sString + * + * @return int + */ + public function strlen($sString) + { + if ($this->oParserSettings->bMultibyteSupport) { + return mb_strlen($sString, $this->sCharset); + } else { + return strlen($sString); + } + } + + /** + * @param int $iStart + * @param int $iLength + * + * @return string + */ + private function substr($iStart, $iLength) + { + if ($iLength < 0) { + $iLength = $this->iLength - $iStart + $iLength; + } + if ($iStart + $iLength > $this->iLength) { + $iLength = $this->iLength - $iStart; + } + $sResult = ''; + while ($iLength > 0) { + $sResult .= $this->aText[$iStart]; + $iStart++; + $iLength--; + } + return $sResult; + } + + /** + * @param string $sString + * + * @return string + */ + private function strtolower($sString) + { + if ($this->oParserSettings->bMultibyteSupport) { + return mb_strtolower($sString, $this->sCharset); + } else { + return strtolower($sString); + } + } + + /** + * @param string $sString + * + * @return array + */ + private function strsplit($sString) + { + if ($this->oParserSettings->bMultibyteSupport) { + if ($this->streql($this->sCharset, 'utf-8')) { + return preg_split('//u', $sString, -1, PREG_SPLIT_NO_EMPTY); + } else { + $iLength = mb_strlen($sString, $this->sCharset); + $aResult = []; + for ($i = 0; $i < $iLength; ++$i) { + $aResult[] = mb_substr($sString, $i, 1, $this->sCharset); + } + return $aResult; + } + } else { + if ($sString === '') { + return []; + } else { + return str_split($sString); + } + } + } + + /** + * @param string $sString + * @param string $sNeedle + * @param int $iOffset + * + * @return int|false + */ + private function strpos($sString, $sNeedle, $iOffset) + { + if ($this->oParserSettings->bMultibyteSupport) { + return mb_strpos($sString, $sNeedle, $iOffset, $this->sCharset); + } else { + return strpos($sString, $sNeedle, $iOffset); + } + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/SourceException.php b/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/SourceException.php new file mode 100644 index 0000000..1aa27b4 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/SourceException.php @@ -0,0 +1,24 @@ +setPosition($iLineNo); + if (!empty($iLineNo)) { + $sMessage .= " [line no: $iLineNo]"; + } + parent::__construct($sMessage); + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/UnexpectedEOFException.php b/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/UnexpectedEOFException.php new file mode 100644 index 0000000..368ec70 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Parsing/UnexpectedEOFException.php @@ -0,0 +1,12 @@ +sExpected = $sExpected; + $this->sFound = $sFound; + $this->sMatchType = $sMatchType; + $sMessage = "Token “{$sExpected}” ({$sMatchType}) not found. Got “{$sFound}”."; + if ($this->sMatchType === 'search') { + $sMessage = "Search for “{$sExpected}” returned no results. Context: “{$sFound}”."; + } elseif ($this->sMatchType === 'count') { + $sMessage = "Next token was expected to have {$sExpected} chars. Context: “{$sFound}”."; + } elseif ($this->sMatchType === 'identifier') { + $sMessage = "Identifier expected. Got “{$sFound}”"; + } elseif ($this->sMatchType === 'custom') { + $sMessage = trim("$sExpected $sFound"); + } + + parent::__construct($sMessage, $iLineNo); + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Position/Position.php b/dompdf/vendor/sabberworm/php-css-parser/src/Position/Position.php new file mode 100644 index 0000000..1c4d0df --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Position/Position.php @@ -0,0 +1,72 @@ +|null + */ + protected $lineNumber; + + /** + * @var int<0, max>|null + */ + protected $columnNumber; + + /** + * @return int<1, max>|null + */ + public function getLineNumber() + { + return $this->lineNumber; + } + + /** + * @return int<0, max> + */ + public function getLineNo() + { + $lineNumber = $this->getLineNumber(); + + return $lineNumber !== null ? $lineNumber : 0; + } + + /** + * @return int<0, max>|null + */ + public function getColumnNumber() + { + return $this->columnNumber; + } + + /** + * @return int<0, max> + */ + public function getColNo() + { + $columnNumber = $this->getColumnNumber(); + + return $columnNumber !== null ? $columnNumber : 0; + } + + /** + * @param int<0, max>|null $lineNumber + * @param int<0, max>|null $columnNumber + */ + public function setPosition($lineNumber, $columnNumber = null) + { + // The conditional is for backwards compatibility (backcompat); `0` will not be allowed in future. + $this->lineNumber = $lineNumber !== 0 ? $lineNumber : null; + $this->columnNumber = $columnNumber; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Position/Positionable.php b/dompdf/vendor/sabberworm/php-css-parser/src/Position/Positionable.php new file mode 100644 index 0000000..4539c42 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Position/Positionable.php @@ -0,0 +1,45 @@ +|null + */ + public function getLineNumber(); + + /** + * @return int<0, max> + * + * @deprecated in version 8.9.0, will be removed in v9.0. Use `getLineNumber()` instead. + */ + public function getLineNo(); + + /** + * @return int<0, max>|null + */ + public function getColumnNumber(); + + /** + * @return int<0, max> + * + * @deprecated in version 8.9.0, will be removed in v9.0. Use `getColumnNumber()` instead. + */ + public function getColNo(); + + /** + * @param int<0, max>|null $lineNumber + * Providing zero for this parameter is deprecated in version 8.9.0, and will not be supported from v9.0. + * Use `null` instead when no line number is available. + * @param int<0, max>|null $columnNumber + */ + public function setPosition($lineNumber, $columnNumber = null); +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Property/AtRule.php b/dompdf/vendor/sabberworm/php-css-parser/src/Property/AtRule.php new file mode 100644 index 0000000..d946a90 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Property/AtRule.php @@ -0,0 +1,38 @@ + + * + * @internal since 8.8.0 + */ + protected $aComments; + + /** + * @param string $mUrl + * @param string|null $sPrefix + * @param int $iLineNo + */ + public function __construct($mUrl, $sPrefix = null, $iLineNo = 0) + { + $this->mUrl = $mUrl; + $this->sPrefix = $sPrefix; + $this->setPosition($iLineNo); + $this->aComments = []; + } + + /** + * @return string + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->render(new OutputFormat()); + } + + /** + * @param OutputFormat|null $oOutputFormat + * + * @return string + */ + public function render($oOutputFormat) + { + return '@namespace ' . ($this->sPrefix === null ? '' : $this->sPrefix . ' ') + . $this->mUrl->render($oOutputFormat) . ';'; + } + + /** + * @return string + */ + public function getUrl() + { + return $this->mUrl; + } + + /** + * @return string|null + */ + public function getPrefix() + { + return $this->sPrefix; + } + + /** + * @param string $mUrl + * + * @return void + */ + public function setUrl($mUrl) + { + $this->mUrl = $mUrl; + } + + /** + * @param string $sPrefix + * + * @return void + */ + public function setPrefix($sPrefix) + { + $this->sPrefix = $sPrefix; + } + + /** + * @return string + */ + public function atRuleName() + { + return 'namespace'; + } + + /** + * @return array + */ + public function atRuleArgs() + { + $aResult = [$this->mUrl]; + if ($this->sPrefix) { + array_unshift($aResult, $this->sPrefix); + } + return $aResult; + } + + /** + * @param array $aComments + * + * @return void + */ + public function addComments(array $aComments) + { + $this->aComments = array_merge($this->aComments, $aComments); + } + + /** + * @return array + */ + public function getComments() + { + return $this->aComments; + } + + /** + * @param array $aComments + * + * @return void + */ + public function setComments(array $aComments) + { + $this->aComments = $aComments; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Property/Charset.php b/dompdf/vendor/sabberworm/php-css-parser/src/Property/Charset.php new file mode 100644 index 0000000..1ebff3f --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Property/Charset.php @@ -0,0 +1,135 @@ + + * + * @internal since 8.8.0 + */ + protected $aComments; + + /** + * @param CSSString $oCharset + * @param int $iLineNo + */ + public function __construct(CSSString $oCharset, $iLineNo = 0) + { + $this->oCharset = $oCharset; + $this->setPosition($iLineNo); + $this->aComments = []; + } + + /** + * @param string|CSSString $oCharset + * + * @return void + */ + public function setCharset($sCharset) + { + $sCharset = $sCharset instanceof CSSString ? $sCharset : new CSSString($sCharset); + $this->oCharset = $sCharset; + } + + /** + * @return string + */ + public function getCharset() + { + return $this->oCharset->getString(); + } + + /** + * @return string + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->render(new OutputFormat()); + } + + /** + * @param OutputFormat|null $oOutputFormat + * + * @return string + */ + public function render($oOutputFormat) + { + return "{$oOutputFormat->comments($this)}@charset {$this->oCharset->render($oOutputFormat)};"; + } + + /** + * @return string + */ + public function atRuleName() + { + return 'charset'; + } + + /** + * @return string + */ + public function atRuleArgs() + { + return $this->oCharset; + } + + /** + * @param array $aComments + * + * @return void + */ + public function addComments(array $aComments) + { + $this->aComments = array_merge($this->aComments, $aComments); + } + + /** + * @return array + */ + public function getComments() + { + return $this->aComments; + } + + /** + * @param array $aComments + * + * @return void + */ + public function setComments(array $aComments) + { + $this->aComments = $aComments; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Property/Import.php b/dompdf/vendor/sabberworm/php-css-parser/src/Property/Import.php new file mode 100644 index 0000000..5b47449 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Property/Import.php @@ -0,0 +1,142 @@ + + * + * @internal since 8.8.0 + */ + protected $aComments; + + /** + * @param URL $oLocation + * @param string $sMediaQuery + * @param int $iLineNo + */ + public function __construct(URL $oLocation, $sMediaQuery, $iLineNo = 0) + { + $this->oLocation = $oLocation; + $this->sMediaQuery = $sMediaQuery; + $this->setPosition($iLineNo); + $this->aComments = []; + } + + /** + * @param URL $oLocation + * + * @return void + */ + public function setLocation($oLocation) + { + $this->oLocation = $oLocation; + } + + /** + * @return URL + */ + public function getLocation() + { + return $this->oLocation; + } + + /** + * @return string + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->render(new OutputFormat()); + } + + /** + * @param OutputFormat|null $oOutputFormat + * + * @return string + */ + public function render($oOutputFormat) + { + return $oOutputFormat->comments($this) . "@import " . $this->oLocation->render($oOutputFormat) + . ($this->sMediaQuery === null ? '' : ' ' . $this->sMediaQuery) . ';'; + } + + /** + * @return string + */ + public function atRuleName() + { + return 'import'; + } + + /** + * @return array + */ + public function atRuleArgs() + { + $aResult = [$this->oLocation]; + if ($this->sMediaQuery) { + array_push($aResult, $this->sMediaQuery); + } + return $aResult; + } + + /** + * @param array $aComments + * + * @return void + */ + public function addComments(array $aComments) + { + $this->aComments = array_merge($this->aComments, $aComments); + } + + /** + * @return array + */ + public function getComments() + { + return $this->aComments; + } + + /** + * @param array $aComments + * + * @return void + */ + public function setComments(array $aComments) + { + $this->aComments = $aComments; + } + + /** + * @return string + */ + public function getMediaQuery() + { + return $this->sMediaQuery; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Property/KeyframeSelector.php b/dompdf/vendor/sabberworm/php-css-parser/src/Property/KeyframeSelector.php new file mode 100644 index 0000000..2aff8d2 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Property/KeyframeSelector.php @@ -0,0 +1,25 @@ +]* # any sequence of valid unescaped characters + (?:\\\\.)? # a single escaped character + (?:([\'"]).*?(?\~]+)[\w]+ # elements + | + \:{1,2}( # pseudo-elements + after|before|first-letter|first-line|selection + )) + /ix'; + + /** + * regexp for specificity calculations + * + * @var string + * + * @internal since 8.5.2 + */ + const SELECTOR_VALIDATION_RX = '/ + ^( + (?: + [a-zA-Z0-9\x{00A0}-\x{FFFF}_^$|*="\'~\[\]()\-\s\.:#+>]* # any sequence of valid unescaped characters + (?:\\\\.)? # a single escaped character + (?:([\'"]).*?(?setSelector($sSelector); + if ($bCalculateSpecificity) { + $this->getSpecificity(); + } + } + + /** + * @return string + */ + public function getSelector() + { + return $this->sSelector; + } + + /** + * @param string $sSelector + * + * @return void + */ + public function setSelector($sSelector) + { + $this->sSelector = trim($sSelector); + $this->iSpecificity = null; + } + + /** + * @return string + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->getSelector(); + } + + /** + * @return int + */ + public function getSpecificity() + { + if ($this->iSpecificity === null) { + $a = 0; + /// @todo should exclude \# as well as "#" + $aMatches = null; + $b = substr_count($this->sSelector, '#'); + $c = preg_match_all(self::NON_ID_ATTRIBUTES_AND_PSEUDO_CLASSES_RX, $this->sSelector, $aMatches); + $d = preg_match_all(self::ELEMENTS_AND_PSEUDO_ELEMENTS_RX, $this->sSelector, $aMatches); + $this->iSpecificity = ($a * 1000) + ($b * 100) + ($c * 10) + $d; + } + return $this->iSpecificity; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Renderable.php b/dompdf/vendor/sabberworm/php-css-parser/src/Renderable.php new file mode 100644 index 0000000..1f1b475 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Renderable.php @@ -0,0 +1,25 @@ + + */ + private $aIeHack; + + /** + * @var array + * + * @internal since 8.8.0 + */ + protected $aComments; + + /** + * @param string $sRule + * @param int $iLineNo + * @param int $iColNo + */ + public function __construct($sRule, $iLineNo = 0, $iColNo = 0) + { + $this->sRule = $sRule; + $this->mValue = null; + $this->bIsImportant = false; + $this->aIeHack = []; + $this->setPosition($iLineNo, $iColNo); + $this->aComments = []; + } + + /** + * @param array $commentsBeforeRule + * + * @return Rule + * + * @throws UnexpectedEOFException + * @throws UnexpectedTokenException + * + * @internal since V8.8.0 + */ + public static function parse(ParserState $oParserState, $commentsBeforeRule = []) + { + $aComments = \array_merge($commentsBeforeRule, $oParserState->consumeWhiteSpace()); + $oRule = new Rule( + $oParserState->parseIdentifier(!$oParserState->comes("--")), + $oParserState->currentLine(), + $oParserState->currentColumn() + ); + $oRule->setComments($aComments); + $oRule->addComments($oParserState->consumeWhiteSpace()); + $oParserState->consume(':'); + $oValue = Value::parseValue($oParserState, self::listDelimiterForRule($oRule->getRule())); + $oRule->setValue($oValue); + if ($oParserState->getSettings()->bLenientParsing) { + while ($oParserState->comes('\\')) { + $oParserState->consume('\\'); + $oRule->addIeHack($oParserState->consume()); + $oParserState->consumeWhiteSpace(); + } + } + $oParserState->consumeWhiteSpace(); + if ($oParserState->comes('!')) { + $oParserState->consume('!'); + $oParserState->consumeWhiteSpace(); + $oParserState->consume('important'); + $oRule->setIsImportant(true); + } + $oParserState->consumeWhiteSpace(); + while ($oParserState->comes(';')) { + $oParserState->consume(';'); + } + + return $oRule; + } + + /** + * Returns a list of delimiters (or separators). + * The first item is the innermost separator (or, put another way, the highest-precedence operator). + * The sequence continues to the outermost separator (or lowest-precedence operator). + * + * @param string $sRule + * + * @return list + */ + private static function listDelimiterForRule($sRule) + { + if (preg_match('/^font($|-)/', $sRule)) { + return [',', '/', ' ']; + } + + switch ($sRule) { + case 'src': + return [' ', ',']; + default: + return [',', ' ', '/']; + } + } + + /** + * @param string $sRule + * + * @return void + */ + public function setRule($sRule) + { + $this->sRule = $sRule; + } + + /** + * @return string + */ + public function getRule() + { + return $this->sRule; + } + + /** + * @return RuleValueList|string|null + */ + public function getValue() + { + return $this->mValue; + } + + /** + * @param RuleValueList|string|null $mValue + * + * @return void + */ + public function setValue($mValue) + { + $this->mValue = $mValue; + } + + /** + * @param array> $aSpaceSeparatedValues + * + * @return RuleValueList + * + * @deprecated will be removed in version 9.0 + * Old-Style 2-dimensional array given. Retained for (some) backwards-compatibility. + * Use `setValue()` instead and wrap the value inside a RuleValueList if necessary. + */ + public function setValues(array $aSpaceSeparatedValues) + { + $oSpaceSeparatedList = null; + if (count($aSpaceSeparatedValues) > 1) { + $oSpaceSeparatedList = new RuleValueList(' ', $this->iLineNo); + } + foreach ($aSpaceSeparatedValues as $aCommaSeparatedValues) { + $oCommaSeparatedList = null; + if (count($aCommaSeparatedValues) > 1) { + $oCommaSeparatedList = new RuleValueList(',', $this->iLineNo); + } + foreach ($aCommaSeparatedValues as $mValue) { + if (!$oSpaceSeparatedList && !$oCommaSeparatedList) { + $this->mValue = $mValue; + return $mValue; + } + if ($oCommaSeparatedList) { + $oCommaSeparatedList->addListComponent($mValue); + } else { + $oSpaceSeparatedList->addListComponent($mValue); + } + } + if (!$oSpaceSeparatedList) { + $this->mValue = $oCommaSeparatedList; + return $oCommaSeparatedList; + } else { + $oSpaceSeparatedList->addListComponent($oCommaSeparatedList); + } + } + $this->mValue = $oSpaceSeparatedList; + return $oSpaceSeparatedList; + } + + /** + * @return array> + * + * @deprecated will be removed in version 9.0 + * Old-Style 2-dimensional array returned. Retained for (some) backwards-compatibility. + * Use `getValue()` instead and check for the existence of a (nested set of) ValueList object(s). + */ + public function getValues() + { + if (!$this->mValue instanceof RuleValueList) { + return [[$this->mValue]]; + } + if ($this->mValue->getListSeparator() === ',') { + return [$this->mValue->getListComponents()]; + } + $aResult = []; + foreach ($this->mValue->getListComponents() as $mValue) { + if (!$mValue instanceof RuleValueList || $mValue->getListSeparator() !== ',') { + $aResult[] = [$mValue]; + continue; + } + if ($this->mValue->getListSeparator() === ' ' || count($aResult) === 0) { + $aResult[] = []; + } + foreach ($mValue->getListComponents() as $mValue) { + $aResult[count($aResult) - 1][] = $mValue; + } + } + return $aResult; + } + + /** + * Adds a value to the existing value. Value will be appended if a `RuleValueList` exists of the given type. + * Otherwise, the existing value will be wrapped by one. + * + * @param RuleValueList|array $mValue + * @param string $sType + * + * @return void + */ + public function addValue($mValue, $sType = ' ') + { + if (!is_array($mValue)) { + $mValue = [$mValue]; + } + if (!$this->mValue instanceof RuleValueList || $this->mValue->getListSeparator() !== $sType) { + $mCurrentValue = $this->mValue; + $this->mValue = new RuleValueList($sType, $this->getLineNumber()); + if ($mCurrentValue) { + $this->mValue->addListComponent($mCurrentValue); + } + } + foreach ($mValue as $mValueItem) { + $this->mValue->addListComponent($mValueItem); + } + } + + /** + * @param int $iModifier + * + * @return void + * + * @deprecated since V8.8.0, will be removed in V9.0 + */ + public function addIeHack($iModifier) + { + $this->aIeHack[] = $iModifier; + } + + /** + * @param array $aModifiers + * + * @return void + * + * @deprecated since V8.8.0, will be removed in V9.0 + */ + public function setIeHack(array $aModifiers) + { + $this->aIeHack = $aModifiers; + } + + /** + * @return array + * + * @deprecated since V8.8.0, will be removed in V9.0 + */ + public function getIeHack() + { + return $this->aIeHack; + } + + /** + * @param bool $bIsImportant + * + * @return void + */ + public function setIsImportant($bIsImportant) + { + $this->bIsImportant = $bIsImportant; + } + + /** + * @return bool + */ + public function getIsImportant() + { + return $this->bIsImportant; + } + + /** + * @return string + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->render(new OutputFormat()); + } + + /** + * @param OutputFormat|null $oOutputFormat + * + * @return string + */ + public function render($oOutputFormat) + { + $sResult = "{$oOutputFormat->comments($this)}{$this->sRule}:{$oOutputFormat->spaceAfterRuleName()}"; + if ($this->mValue instanceof Value) { // Can also be a ValueList + $sResult .= $this->mValue->render($oOutputFormat); + } else { + $sResult .= $this->mValue; + } + if (!empty($this->aIeHack)) { + $sResult .= ' \\' . implode('\\', $this->aIeHack); + } + if ($this->bIsImportant) { + $sResult .= ' !important'; + } + $sResult .= ';'; + return $sResult; + } + + /** + * @param array $aComments + * + * @return void + */ + public function addComments(array $aComments) + { + $this->aComments = array_merge($this->aComments, $aComments); + } + + /** + * @return array + */ + public function getComments() + { + return $this->aComments; + } + + /** + * @param array $aComments + * + * @return void + */ + public function setComments(array $aComments) + { + $this->aComments = $aComments; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/RuleSet/AtRuleSet.php b/dompdf/vendor/sabberworm/php-css-parser/src/RuleSet/AtRuleSet.php new file mode 100644 index 0000000..e687cb9 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/RuleSet/AtRuleSet.php @@ -0,0 +1,81 @@ +sType = $sType; + $this->sArgs = $sArgs; + } + + /** + * @return string + */ + public function atRuleName() + { + return $this->sType; + } + + /** + * @return string + */ + public function atRuleArgs() + { + return $this->sArgs; + } + + /** + * @return string + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->render(new OutputFormat()); + } + + /** + * @param OutputFormat|null $oOutputFormat + * + * @return string + */ + public function render($oOutputFormat) + { + $sResult = $oOutputFormat->comments($this); + $sArgs = $this->sArgs; + if ($sArgs) { + $sArgs = ' ' . $sArgs; + } + $sResult .= "@{$this->sType}$sArgs{$oOutputFormat->spaceBeforeOpeningBrace()}{"; + $sResult .= $this->renderRules($oOutputFormat); + $sResult .= '}'; + return $sResult; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/RuleSet/DeclarationBlock.php b/dompdf/vendor/sabberworm/php-css-parser/src/RuleSet/DeclarationBlock.php new file mode 100644 index 0000000..9cc14eb --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/RuleSet/DeclarationBlock.php @@ -0,0 +1,871 @@ + + */ + private $aSelectors; + + /** + * @param int $iLineNo + */ + public function __construct($iLineNo = 0) + { + parent::__construct($iLineNo); + $this->aSelectors = []; + } + + /** + * @param CSSList|null $oList + * + * @return DeclarationBlock|false + * + * @throws UnexpectedTokenException + * @throws UnexpectedEOFException + * + * @internal since V8.8.0 + */ + public static function parse(ParserState $oParserState, $oList = null) + { + $aComments = []; + $oResult = new DeclarationBlock($oParserState->currentLine()); + try { + $aSelectorParts = []; + $sStringWrapperChar = false; + do { + $aSelectorParts[] = $oParserState->consume(1) + . $oParserState->consumeUntil(['{', '}', '\'', '"'], false, false, $aComments); + if (in_array($oParserState->peek(), ['\'', '"']) && substr(end($aSelectorParts), -1) != "\\") { + if ($sStringWrapperChar === false) { + $sStringWrapperChar = $oParserState->peek(); + } elseif ($sStringWrapperChar == $oParserState->peek()) { + $sStringWrapperChar = false; + } + } + } while (!in_array($oParserState->peek(), ['{', '}']) || $sStringWrapperChar !== false); + $oResult->setSelectors(implode('', $aSelectorParts), $oList); + if ($oParserState->comes('{')) { + $oParserState->consume(1); + } + } catch (UnexpectedTokenException $e) { + if ($oParserState->getSettings()->bLenientParsing) { + if (!$oParserState->comes('}')) { + $oParserState->consumeUntil('}', false, true); + } + return false; + } else { + throw $e; + } + } + $oResult->setComments($aComments); + RuleSet::parseRuleSet($oParserState, $oResult); + return $oResult; + } + + /** + * @param array|string $mSelector + * @param CSSList|null $oList + * + * @throws UnexpectedTokenException + */ + public function setSelectors($mSelector, $oList = null) + { + if (is_array($mSelector)) { + $this->aSelectors = $mSelector; + } else { + $this->aSelectors = explode(',', $mSelector); + } + foreach ($this->aSelectors as $iKey => $mSelector) { + if (!($mSelector instanceof Selector)) { + if ($oList === null || !($oList instanceof KeyFrame)) { + if (!Selector::isValid($mSelector)) { + throw new UnexpectedTokenException( + "Selector did not match '" . Selector::SELECTOR_VALIDATION_RX . "'.", + $mSelector, + "custom" + ); + } + $this->aSelectors[$iKey] = new Selector($mSelector); + } else { + if (!KeyframeSelector::isValid($mSelector)) { + throw new UnexpectedTokenException( + "Selector did not match '" . KeyframeSelector::SELECTOR_VALIDATION_RX . "'.", + $mSelector, + "custom" + ); + } + $this->aSelectors[$iKey] = new KeyframeSelector($mSelector); + } + } + } + } + + /** + * Remove one of the selectors of the block. + * + * @param Selector|string $mSelector + * + * @return bool + */ + public function removeSelector($mSelector) + { + if ($mSelector instanceof Selector) { + $mSelector = $mSelector->getSelector(); + } + foreach ($this->aSelectors as $iKey => $oSelector) { + if ($oSelector->getSelector() === $mSelector) { + unset($this->aSelectors[$iKey]); + return true; + } + } + return false; + } + + /** + * @return array + * + * @deprecated will be removed in version 9.0; use `getSelectors()` instead + */ + public function getSelector() + { + return $this->getSelectors(); + } + + /** + * @param Selector|string $mSelector + * @param CSSList|null $oList + * + * @return void + * + * @deprecated will be removed in version 9.0; use `setSelectors()` instead + */ + public function setSelector($mSelector, $oList = null) + { + $this->setSelectors($mSelector, $oList); + } + + /** + * @return array + */ + public function getSelectors() + { + return $this->aSelectors; + } + + /** + * Splits shorthand declarations (e.g. `margin` or `font`) into their constituent parts. + * + * @return void + * + * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 + */ + public function expandShorthands() + { + // border must be expanded before dimensions + $this->expandBorderShorthand(); + $this->expandDimensionsShorthand(); + $this->expandFontShorthand(); + $this->expandBackgroundShorthand(); + $this->expandListStyleShorthand(); + } + + /** + * Creates shorthand declarations (e.g. `margin` or `font`) whenever possible. + * + * @return void + * + * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 + */ + public function createShorthands() + { + $this->createBackgroundShorthand(); + $this->createDimensionsShorthand(); + // border must be shortened after dimensions + $this->createBorderShorthand(); + $this->createFontShorthand(); + $this->createListStyleShorthand(); + } + + /** + * Splits shorthand border declarations (e.g. `border: 1px red;`). + * + * Additional splitting happens in expandDimensionsShorthand. + * + * Multiple borders are not yet supported as of 3. + * + * @return void + * + * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 + */ + public function expandBorderShorthand() + { + $aBorderRules = [ + 'border', + 'border-left', + 'border-right', + 'border-top', + 'border-bottom', + ]; + $aBorderSizes = [ + 'thin', + 'medium', + 'thick', + ]; + $aRules = $this->getRulesAssoc(); + foreach ($aBorderRules as $sBorderRule) { + if (!isset($aRules[$sBorderRule])) { + continue; + } + $oRule = $aRules[$sBorderRule]; + $mRuleValue = $oRule->getValue(); + $aValues = []; + if (!$mRuleValue instanceof RuleValueList) { + $aValues[] = $mRuleValue; + } else { + $aValues = $mRuleValue->getListComponents(); + } + foreach ($aValues as $mValue) { + if ($mValue instanceof Value) { + $mNewValue = clone $mValue; + } else { + $mNewValue = $mValue; + } + if ($mValue instanceof Size) { + $sNewRuleName = $sBorderRule . "-width"; + } elseif ($mValue instanceof Color) { + $sNewRuleName = $sBorderRule . "-color"; + } else { + if (in_array($mValue, $aBorderSizes)) { + $sNewRuleName = $sBorderRule . "-width"; + } else { + $sNewRuleName = $sBorderRule . "-style"; + } + } + $oNewRule = new Rule($sNewRuleName, $oRule->getLineNo(), $oRule->getColNo()); + $oNewRule->setIsImportant($oRule->getIsImportant()); + $oNewRule->addValue([$mNewValue]); + $this->addRule($oNewRule); + } + $this->removeRule($sBorderRule); + } + } + + /** + * Splits shorthand dimensional declarations (e.g. `margin: 0px auto;`) + * into their constituent parts. + * + * Handles `margin`, `padding`, `border-color`, `border-style` and `border-width`. + * + * @return void + * + * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 + */ + public function expandDimensionsShorthand() + { + $aExpansions = [ + 'margin' => 'margin-%s', + 'padding' => 'padding-%s', + 'border-color' => 'border-%s-color', + 'border-style' => 'border-%s-style', + 'border-width' => 'border-%s-width', + ]; + $aRules = $this->getRulesAssoc(); + foreach ($aExpansions as $sProperty => $sExpanded) { + if (!isset($aRules[$sProperty])) { + continue; + } + $oRule = $aRules[$sProperty]; + $mRuleValue = $oRule->getValue(); + $aValues = []; + if (!$mRuleValue instanceof RuleValueList) { + $aValues[] = $mRuleValue; + } else { + $aValues = $mRuleValue->getListComponents(); + } + $top = $right = $bottom = $left = null; + switch (count($aValues)) { + case 1: + $top = $right = $bottom = $left = $aValues[0]; + break; + case 2: + $top = $bottom = $aValues[0]; + $left = $right = $aValues[1]; + break; + case 3: + $top = $aValues[0]; + $left = $right = $aValues[1]; + $bottom = $aValues[2]; + break; + case 4: + $top = $aValues[0]; + $right = $aValues[1]; + $bottom = $aValues[2]; + $left = $aValues[3]; + break; + } + foreach (['top', 'right', 'bottom', 'left'] as $sPosition) { + $oNewRule = new Rule(sprintf($sExpanded, $sPosition), $oRule->getLineNo(), $oRule->getColNo()); + $oNewRule->setIsImportant($oRule->getIsImportant()); + $oNewRule->addValue(${$sPosition}); + $this->addRule($oNewRule); + } + $this->removeRule($sProperty); + } + } + + /** + * Converts shorthand font declarations + * (e.g. `font: 300 italic 11px/14px verdana, helvetica, sans-serif;`) + * into their constituent parts. + * + * @return void + * + * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 + */ + public function expandFontShorthand() + { + $aRules = $this->getRulesAssoc(); + if (!isset($aRules['font'])) { + return; + } + $oRule = $aRules['font']; + // reset properties to 'normal' per http://www.w3.org/TR/21/fonts.html#font-shorthand + $aFontProperties = [ + 'font-style' => 'normal', + 'font-variant' => 'normal', + 'font-weight' => 'normal', + 'font-size' => 'normal', + 'line-height' => 'normal', + ]; + $mRuleValue = $oRule->getValue(); + $aValues = []; + if (!$mRuleValue instanceof RuleValueList) { + $aValues[] = $mRuleValue; + } else { + $aValues = $mRuleValue->getListComponents(); + } + foreach ($aValues as $mValue) { + if (!$mValue instanceof Value) { + $mValue = mb_strtolower($mValue); + } + if (in_array($mValue, ['normal', 'inherit'])) { + foreach (['font-style', 'font-weight', 'font-variant'] as $sProperty) { + if (!isset($aFontProperties[$sProperty])) { + $aFontProperties[$sProperty] = $mValue; + } + } + } elseif (in_array($mValue, ['italic', 'oblique'])) { + $aFontProperties['font-style'] = $mValue; + } elseif ($mValue == 'small-caps') { + $aFontProperties['font-variant'] = $mValue; + } elseif ( + in_array($mValue, ['bold', 'bolder', 'lighter']) + || ($mValue instanceof Size + && in_array($mValue->getSize(), range(100, 900, 100))) + ) { + $aFontProperties['font-weight'] = $mValue; + } elseif ($mValue instanceof RuleValueList && $mValue->getListSeparator() == '/') { + list($oSize, $oHeight) = $mValue->getListComponents(); + $aFontProperties['font-size'] = $oSize; + $aFontProperties['line-height'] = $oHeight; + } elseif ($mValue instanceof Size && $mValue->getUnit() !== null) { + $aFontProperties['font-size'] = $mValue; + } else { + $aFontProperties['font-family'] = $mValue; + } + } + foreach ($aFontProperties as $sProperty => $mValue) { + $oNewRule = new Rule($sProperty, $oRule->getLineNo(), $oRule->getColNo()); + $oNewRule->addValue($mValue); + $oNewRule->setIsImportant($oRule->getIsImportant()); + $this->addRule($oNewRule); + } + $this->removeRule('font'); + } + + /** + * Converts shorthand background declarations + * (e.g. `background: url("chess.png") gray 50% repeat fixed;`) + * into their constituent parts. + * + * @see http://www.w3.org/TR/21/colors.html#propdef-background + * + * @return void + * + * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 + */ + public function expandBackgroundShorthand() + { + $aRules = $this->getRulesAssoc(); + if (!isset($aRules['background'])) { + return; + } + $oRule = $aRules['background']; + $aBgProperties = [ + 'background-color' => ['transparent'], + 'background-image' => ['none'], + 'background-repeat' => ['repeat'], + 'background-attachment' => ['scroll'], + 'background-position' => [ + new Size(0, '%', false, $this->getLineNo()), + new Size(0, '%', false, $this->getLineNo()), + ], + ]; + $mRuleValue = $oRule->getValue(); + $aValues = []; + if (!$mRuleValue instanceof RuleValueList) { + $aValues[] = $mRuleValue; + } else { + $aValues = $mRuleValue->getListComponents(); + } + if (count($aValues) == 1 && $aValues[0] == 'inherit') { + foreach ($aBgProperties as $sProperty => $mValue) { + $oNewRule = new Rule($sProperty, $oRule->getLineNo(), $oRule->getColNo()); + $oNewRule->addValue('inherit'); + $oNewRule->setIsImportant($oRule->getIsImportant()); + $this->addRule($oNewRule); + } + $this->removeRule('background'); + return; + } + $iNumBgPos = 0; + foreach ($aValues as $mValue) { + if (!$mValue instanceof Value) { + $mValue = mb_strtolower($mValue); + } + if ($mValue instanceof URL) { + $aBgProperties['background-image'] = $mValue; + } elseif ($mValue instanceof Color) { + $aBgProperties['background-color'] = $mValue; + } elseif (in_array($mValue, ['scroll', 'fixed'])) { + $aBgProperties['background-attachment'] = $mValue; + } elseif (in_array($mValue, ['repeat', 'no-repeat', 'repeat-x', 'repeat-y'])) { + $aBgProperties['background-repeat'] = $mValue; + } elseif ( + in_array($mValue, ['left', 'center', 'right', 'top', 'bottom']) + || $mValue instanceof Size + ) { + if ($iNumBgPos == 0) { + $aBgProperties['background-position'][0] = $mValue; + $aBgProperties['background-position'][1] = 'center'; + } else { + $aBgProperties['background-position'][$iNumBgPos] = $mValue; + } + $iNumBgPos++; + } + } + foreach ($aBgProperties as $sProperty => $mValue) { + $oNewRule = new Rule($sProperty, $oRule->getLineNo(), $oRule->getColNo()); + $oNewRule->setIsImportant($oRule->getIsImportant()); + $oNewRule->addValue($mValue); + $this->addRule($oNewRule); + } + $this->removeRule('background'); + } + + /** + * @return void + * + * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 + */ + public function expandListStyleShorthand() + { + $aListProperties = [ + 'list-style-type' => 'disc', + 'list-style-position' => 'outside', + 'list-style-image' => 'none', + ]; + $aListStyleTypes = [ + 'none', + 'disc', + 'circle', + 'square', + 'decimal-leading-zero', + 'decimal', + 'lower-roman', + 'upper-roman', + 'lower-greek', + 'lower-alpha', + 'lower-latin', + 'upper-alpha', + 'upper-latin', + 'hebrew', + 'armenian', + 'georgian', + 'cjk-ideographic', + 'hiragana', + 'hira-gana-iroha', + 'katakana-iroha', + 'katakana', + ]; + $aListStylePositions = [ + 'inside', + 'outside', + ]; + $aRules = $this->getRulesAssoc(); + if (!isset($aRules['list-style'])) { + return; + } + $oRule = $aRules['list-style']; + $mRuleValue = $oRule->getValue(); + $aValues = []; + if (!$mRuleValue instanceof RuleValueList) { + $aValues[] = $mRuleValue; + } else { + $aValues = $mRuleValue->getListComponents(); + } + if (count($aValues) == 1 && $aValues[0] == 'inherit') { + foreach ($aListProperties as $sProperty => $mValue) { + $oNewRule = new Rule($sProperty, $oRule->getLineNo(), $oRule->getColNo()); + $oNewRule->addValue('inherit'); + $oNewRule->setIsImportant($oRule->getIsImportant()); + $this->addRule($oNewRule); + } + $this->removeRule('list-style'); + return; + } + foreach ($aValues as $mValue) { + if (!$mValue instanceof Value) { + $mValue = mb_strtolower($mValue); + } + if ($mValue instanceof Url) { + $aListProperties['list-style-image'] = $mValue; + } elseif (in_array($mValue, $aListStyleTypes)) { + $aListProperties['list-style-types'] = $mValue; + } elseif (in_array($mValue, $aListStylePositions)) { + $aListProperties['list-style-position'] = $mValue; + } + } + foreach ($aListProperties as $sProperty => $mValue) { + $oNewRule = new Rule($sProperty, $oRule->getLineNo(), $oRule->getColNo()); + $oNewRule->setIsImportant($oRule->getIsImportant()); + $oNewRule->addValue($mValue); + $this->addRule($oNewRule); + } + $this->removeRule('list-style'); + } + + /** + * @param array $aProperties + * @param string $sShorthand + * + * @return void + * + * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 + */ + public function createShorthandProperties(array $aProperties, $sShorthand) + { + $aRules = $this->getRulesAssoc(); + $oRule = null; + $aNewValues = []; + foreach ($aProperties as $sProperty) { + if (!isset($aRules[$sProperty])) { + continue; + } + $oRule = $aRules[$sProperty]; + if (!$oRule->getIsImportant()) { + $mRuleValue = $oRule->getValue(); + $aValues = []; + if (!$mRuleValue instanceof RuleValueList) { + $aValues[] = $mRuleValue; + } else { + $aValues = $mRuleValue->getListComponents(); + } + foreach ($aValues as $mValue) { + $aNewValues[] = $mValue; + } + $this->removeRule($sProperty); + } + } + if ($aNewValues !== [] && $oRule instanceof Rule) { + $oNewRule = new Rule($sShorthand, $oRule->getLineNo(), $oRule->getColNo()); + foreach ($aNewValues as $mValue) { + $oNewRule->addValue($mValue); + } + $this->addRule($oNewRule); + } + } + + /** + * @return void + * + * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 + */ + public function createBackgroundShorthand() + { + $aProperties = [ + 'background-color', + 'background-image', + 'background-repeat', + 'background-position', + 'background-attachment', + ]; + $this->createShorthandProperties($aProperties, 'background'); + } + + /** + * @return void + * + * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 + */ + public function createListStyleShorthand() + { + $aProperties = [ + 'list-style-type', + 'list-style-position', + 'list-style-image', + ]; + $this->createShorthandProperties($aProperties, 'list-style'); + } + + /** + * Combines `border-color`, `border-style` and `border-width` into `border`. + * + * Should be run after `create_dimensions_shorthand`! + * + * @return void + * + * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 + */ + public function createBorderShorthand() + { + $aProperties = [ + 'border-width', + 'border-style', + 'border-color', + ]; + $this->createShorthandProperties($aProperties, 'border'); + } + + /** + * Looks for long format CSS dimensional properties + * (margin, padding, border-color, border-style and border-width) + * and converts them into shorthand CSS properties. + * + * @return void + * + * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 + */ + public function createDimensionsShorthand() + { + $aPositions = ['top', 'right', 'bottom', 'left']; + $aExpansions = [ + 'margin' => 'margin-%s', + 'padding' => 'padding-%s', + 'border-color' => 'border-%s-color', + 'border-style' => 'border-%s-style', + 'border-width' => 'border-%s-width', + ]; + $aRules = $this->getRulesAssoc(); + foreach ($aExpansions as $sProperty => $sExpanded) { + $aFoldable = []; + foreach ($aRules as $sRuleName => $oRule) { + foreach ($aPositions as $sPosition) { + if ($sRuleName == sprintf($sExpanded, $sPosition)) { + $aFoldable[$sRuleName] = $oRule; + } + } + } + // All four dimensions must be present + if (count($aFoldable) == 4) { + $aValues = []; + foreach ($aPositions as $sPosition) { + $oRule = $aRules[sprintf($sExpanded, $sPosition)]; + $mRuleValue = $oRule->getValue(); + $aRuleValues = []; + if (!$mRuleValue instanceof RuleValueList) { + $aRuleValues[] = $mRuleValue; + } else { + $aRuleValues = $mRuleValue->getListComponents(); + } + $aValues[$sPosition] = $aRuleValues; + } + $oNewRule = new Rule($sProperty, $oRule->getLineNo(), $oRule->getColNo()); + if ((string)$aValues['left'][0] == (string)$aValues['right'][0]) { + if ((string)$aValues['top'][0] == (string)$aValues['bottom'][0]) { + if ((string)$aValues['top'][0] == (string)$aValues['left'][0]) { + // All 4 sides are equal + $oNewRule->addValue($aValues['top']); + } else { + // Top and bottom are equal, left and right are equal + $oNewRule->addValue($aValues['top']); + $oNewRule->addValue($aValues['left']); + } + } else { + // Only left and right are equal + $oNewRule->addValue($aValues['top']); + $oNewRule->addValue($aValues['left']); + $oNewRule->addValue($aValues['bottom']); + } + } else { + // No sides are equal + $oNewRule->addValue($aValues['top']); + $oNewRule->addValue($aValues['left']); + $oNewRule->addValue($aValues['bottom']); + $oNewRule->addValue($aValues['right']); + } + $this->addRule($oNewRule); + foreach ($aPositions as $sPosition) { + $this->removeRule(sprintf($sExpanded, $sPosition)); + } + } + } + } + + /** + * Looks for long format CSS font properties (e.g. `font-weight`) and + * tries to convert them into a shorthand CSS `font` property. + * + * At least `font-size` AND `font-family` must be present in order to create a shorthand declaration. + * + * @return void + * + * @deprecated since 8.7.0, will be removed without substitution in version 9.0 in #511 + */ + public function createFontShorthand() + { + $aFontProperties = [ + 'font-style', + 'font-variant', + 'font-weight', + 'font-size', + 'line-height', + 'font-family', + ]; + $aRules = $this->getRulesAssoc(); + if (!isset($aRules['font-size']) || !isset($aRules['font-family'])) { + return; + } + $oOldRule = isset($aRules['font-size']) ? $aRules['font-size'] : $aRules['font-family']; + $oNewRule = new Rule('font', $oOldRule->getLineNo(), $oOldRule->getColNo()); + unset($oOldRule); + foreach (['font-style', 'font-variant', 'font-weight'] as $sProperty) { + if (isset($aRules[$sProperty])) { + $oRule = $aRules[$sProperty]; + $mRuleValue = $oRule->getValue(); + $aValues = []; + if (!$mRuleValue instanceof RuleValueList) { + $aValues[] = $mRuleValue; + } else { + $aValues = $mRuleValue->getListComponents(); + } + if ($aValues[0] !== 'normal') { + $oNewRule->addValue($aValues[0]); + } + } + } + // Get the font-size value + $oRule = $aRules['font-size']; + $mRuleValue = $oRule->getValue(); + $aFSValues = []; + if (!$mRuleValue instanceof RuleValueList) { + $aFSValues[] = $mRuleValue; + } else { + $aFSValues = $mRuleValue->getListComponents(); + } + // But wait to know if we have line-height to add it + if (isset($aRules['line-height'])) { + $oRule = $aRules['line-height']; + $mRuleValue = $oRule->getValue(); + $aLHValues = []; + if (!$mRuleValue instanceof RuleValueList) { + $aLHValues[] = $mRuleValue; + } else { + $aLHValues = $mRuleValue->getListComponents(); + } + if ($aLHValues[0] !== 'normal') { + $val = new RuleValueList('/', $this->getLineNo()); + $val->addListComponent($aFSValues[0]); + $val->addListComponent($aLHValues[0]); + $oNewRule->addValue($val); + } + } else { + $oNewRule->addValue($aFSValues[0]); + } + $oRule = $aRules['font-family']; + $mRuleValue = $oRule->getValue(); + $aFFValues = []; + if (!$mRuleValue instanceof RuleValueList) { + $aFFValues[] = $mRuleValue; + } else { + $aFFValues = $mRuleValue->getListComponents(); + } + $oFFValue = new RuleValueList(',', $this->getLineNo()); + $oFFValue->setListComponents($aFFValues); + $oNewRule->addValue($oFFValue); + + $this->addRule($oNewRule); + foreach ($aFontProperties as $sProperty) { + $this->removeRule($sProperty); + } + } + + /** + * @return string + * + * @throws OutputException + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->render(new OutputFormat()); + } + + /** + * @param OutputFormat|null $oOutputFormat + * + * @return string + * + * @throws OutputException + */ + public function render($oOutputFormat) + { + $sResult = $oOutputFormat->comments($this); + if (count($this->aSelectors) === 0) { + // If all the selectors have been removed, this declaration block becomes invalid + throw new OutputException( + 'Attempt to print declaration block with missing selector', + $this->getLineNumber() + ); + } + $sResult .= $oOutputFormat->sBeforeDeclarationBlock; + $sResult .= $oOutputFormat->implode( + $oOutputFormat->spaceBeforeSelectorSeparator() . ',' . $oOutputFormat->spaceAfterSelectorSeparator(), + $this->aSelectors + ); + $sResult .= $oOutputFormat->sAfterDeclarationBlockSelectors; + $sResult .= $oOutputFormat->spaceBeforeOpeningBrace() . '{'; + $sResult .= $this->renderRules($oOutputFormat); + $sResult .= '}'; + $sResult .= $oOutputFormat->sAfterDeclarationBlock; + return $sResult; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/RuleSet/RuleSet.php b/dompdf/vendor/sabberworm/php-css-parser/src/RuleSet/RuleSet.php new file mode 100644 index 0000000..0110f50 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/RuleSet/RuleSet.php @@ -0,0 +1,357 @@ +, Rule>> + */ + private $aRules; + + /** + * @var array + * + * @internal since 8.8.0 + */ + protected $aComments; + + /** + * @param int $iLineNo + */ + public function __construct($iLineNo = 0) + { + $this->aRules = []; + $this->setPosition($iLineNo); + $this->aComments = []; + } + + /** + * @return void + * + * @throws UnexpectedTokenException + * @throws UnexpectedEOFException + * + * @internal since V8.8.0 + */ + public static function parseRuleSet(ParserState $oParserState, RuleSet $oRuleSet) + { + while ($oParserState->comes(';')) { + $oParserState->consume(';'); + } + while (true) { + $commentsBeforeRule = $oParserState->consumeWhiteSpace(); + if ($oParserState->comes('}')) { + break; + } + $oRule = null; + if ($oParserState->getSettings()->bLenientParsing) { + try { + $oRule = Rule::parse($oParserState, $commentsBeforeRule); + } catch (UnexpectedTokenException $e) { + try { + $sConsume = $oParserState->consumeUntil(["\n", ";", '}'], true); + // We need to “unfind” the matches to the end of the ruleSet as this will be matched later + if ($oParserState->streql(substr($sConsume, -1), '}')) { + $oParserState->backtrack(1); + } else { + while ($oParserState->comes(';')) { + $oParserState->consume(';'); + } + } + } catch (UnexpectedTokenException $e) { + // We’ve reached the end of the document. Just close the RuleSet. + return; + } + } + } else { + $oRule = Rule::parse($oParserState, $commentsBeforeRule); + } + if ($oRule) { + $oRuleSet->addRule($oRule); + } + } + $oParserState->consume('}'); + } + + /** + * @param Rule|null $oSibling + * + * @return void + */ + public function addRule(Rule $oRule, $oSibling = null) + { + $sRule = $oRule->getRule(); + if (!isset($this->aRules[$sRule])) { + $this->aRules[$sRule] = []; + } + + $iPosition = count($this->aRules[$sRule]); + + if ($oSibling !== null) { + $iSiblingPos = array_search($oSibling, $this->aRules[$sRule], true); + if ($iSiblingPos !== false) { + $iPosition = $iSiblingPos; + $oRule->setPosition($oSibling->getLineNo(), $oSibling->getColNo() - 1); + } + } + if ($oRule->getLineNumber() === null) { + //this node is added manually, give it the next best line + $columnNumber = $oRule->getColNo(); + $rules = $this->getRules(); + $pos = count($rules); + if ($pos > 0) { + $last = $rules[$pos - 1]; + $oRule->setPosition($last->getLineNo() + 1, $columnNumber); + } else { + $oRule->setPosition(1, $columnNumber); + } + } elseif ($oRule->getColumnNumber() === null) { + $oRule->setPosition($oRule->getLineNumber(), 0); + } + + array_splice($this->aRules[$sRule], $iPosition, 0, [$oRule]); + } + + /** + * Returns all rules matching the given rule name + * + * @example $oRuleSet->getRules('font') // returns array(0 => $oRule, …) or array(). + * + * @example $oRuleSet->getRules('font-') + * //returns an array of all rules either beginning with font- or matching font. + * + * @param Rule|string|null $mRule + * Pattern to search for. If null, returns all rules. + * If the pattern ends with a dash, all rules starting with the pattern are returned + * as well as one matching the pattern with the dash excluded. + * Passing a `Rule` for this parameter is deprecated in version 8.9.0, and will not work from v9.0. + * Call `getRules($rule->getRule())` instead. + * + * @return array + */ + public function getRules($mRule = null) + { + if ($mRule instanceof Rule) { + $mRule = $mRule->getRule(); + } + /** @var array $aResult */ + $aResult = []; + foreach ($this->aRules as $sName => $aRules) { + // Either no search rule is given or the search rule matches the found rule exactly + // or the search rule ends in “-” and the found rule starts with the search rule. + if ( + !$mRule || $sName === $mRule + || ( + strrpos($mRule, '-') === strlen($mRule) - strlen('-') + && (strpos($sName, $mRule) === 0 || $sName === substr($mRule, 0, -1)) + ) + ) { + $aResult = array_merge($aResult, $aRules); + } + } + usort($aResult, function (Rule $first, Rule $second) { + if ($first->getLineNo() === $second->getLineNo()) { + return $first->getColNo() - $second->getColNo(); + } + return $first->getLineNo() - $second->getLineNo(); + }); + return $aResult; + } + + /** + * Overrides all the rules of this set. + * + * @param array $aRules The rules to override with. + * + * @return void + */ + public function setRules(array $aRules) + { + $this->aRules = []; + foreach ($aRules as $rule) { + $this->addRule($rule); + } + } + + /** + * Returns all rules matching the given pattern and returns them in an associative array with the rule’s name + * as keys. This method exists mainly for backwards-compatibility and is really only partially useful. + * + * Note: This method loses some information: Calling this (with an argument of `background-`) on a declaration block + * like `{ background-color: green; background-color; rgba(0, 127, 0, 0.7); }` will only yield an associative array + * containing the rgba-valued rule while `getRules()` would yield an indexed array containing both. + * + * @param Rule|string|null $mRule $mRule + * Pattern to search for. If null, returns all rules. If the pattern ends with a dash, + * all rules starting with the pattern are returned as well as one matching the pattern with the dash + * excluded. + * Passing a `Rule` for this parameter is deprecated in version 8.9.0, and will not work from v9.0. + * Call `getRulesAssoc($rule->getRule())` instead. + * + * @return array + */ + public function getRulesAssoc($mRule = null) + { + /** @var array $aResult */ + $aResult = []; + foreach ($this->getRules($mRule) as $oRule) { + $aResult[$oRule->getRule()] = $oRule; + } + return $aResult; + } + + /** + * Removes a `Rule` from this `RuleSet` by identity. + * + * @param Rule|string|null $mRule + * `Rule` to remove. + * Passing a `string` or `null` is deprecated in version 8.9.0, and will no longer work from v9.0. + * Use `removeMatchingRules()` or `removeAllRules()` instead. + */ + public function removeRule($mRule) + { + if ($mRule instanceof Rule) { + $sRule = $mRule->getRule(); + if (!isset($this->aRules[$sRule])) { + return; + } + foreach ($this->aRules[$sRule] as $iKey => $oRule) { + if ($oRule === $mRule) { + unset($this->aRules[$sRule][$iKey]); + } + } + } elseif ($mRule !== null) { + $this->removeMatchingRules($mRule); + } else { + $this->removeAllRules(); + } + } + + /** + * Removes rules by property name or search pattern. + * + * @param string $searchPattern + * pattern to remove. + * If the pattern ends in a dash, + * all rules starting with the pattern are removed as well as one matching the pattern with the dash + * excluded. + */ + public function removeMatchingRules($searchPattern) + { + foreach ($this->aRules as $propertyName => $rules) { + // Either the search rule matches the found rule exactly + // or the search rule ends in “-” and the found rule starts with the search rule or equals it + // (without the trailing dash). + if ( + $propertyName === $searchPattern + || (\strrpos($searchPattern, '-') === \strlen($searchPattern) - \strlen('-') + && (\strpos($propertyName, $searchPattern) === 0 + || $propertyName === \substr($searchPattern, 0, -1))) + ) { + unset($this->aRules[$propertyName]); + } + } + } + + public function removeAllRules() + { + $this->aRules = []; + } + + /** + * @return string + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->render(new OutputFormat()); + } + + /** + * @return string + */ + protected function renderRules(OutputFormat $oOutputFormat) + { + $sResult = ''; + $bIsFirst = true; + $oNextLevel = $oOutputFormat->nextLevel(); + foreach ($this->getRules() as $oRule) { + $sRendered = $oNextLevel->safely(function () use ($oRule, $oNextLevel) { + return $oRule->render($oNextLevel); + }); + if ($sRendered === null) { + continue; + } + if ($bIsFirst) { + $bIsFirst = false; + $sResult .= $oNextLevel->spaceBeforeRules(); + } else { + $sResult .= $oNextLevel->spaceBetweenRules(); + } + $sResult .= $sRendered; + } + + if (!$bIsFirst) { + // Had some output + $sResult .= $oOutputFormat->spaceAfterRules(); + } + + return $oOutputFormat->removeLastSemicolon($sResult); + } + + /** + * @param array $aComments + * + * @return void + */ + public function addComments(array $aComments) + { + $this->aComments = array_merge($this->aComments, $aComments); + } + + /** + * @return array + */ + public function getComments() + { + return $this->aComments; + } + + /** + * @param array $aComments + * + * @return void + */ + public function setComments(array $aComments) + { + $this->aComments = $aComments; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Settings.php b/dompdf/vendor/sabberworm/php-css-parser/src/Settings.php new file mode 100644 index 0000000..8d4bd46 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Settings.php @@ -0,0 +1,106 @@ +bMultibyteSupport = extension_loaded('mbstring'); + } + + /** + * @return self new instance + */ + public static function create() + { + return new Settings(); + } + + /** + * Enables/disables multi-byte string support. + * + * If `true` (`mbstring` extension must be enabled), will use (slower) `mb_strlen`, `mb_convert_case`, `mb_substr` + * and `mb_strpos` functions. Otherwise, the normal (ASCII-Only) functions will be used. + * + * @param bool $bMultibyteSupport + * + * @return self fluent interface + */ + public function withMultibyteSupport($bMultibyteSupport = true) + { + $this->bMultibyteSupport = $bMultibyteSupport; + return $this; + } + + /** + * Sets the charset to be used if the CSS does not contain an `@charset` declaration. + * + * @param string $sDefaultCharset + * + * @return self fluent interface + */ + public function withDefaultCharset($sDefaultCharset) + { + $this->sDefaultCharset = $sDefaultCharset; + return $this; + } + + /** + * Configures whether the parser should silently ignore invalid rules. + * + * @param bool $bLenientParsing + * + * @return self fluent interface + */ + public function withLenientParsing($bLenientParsing = true) + { + $this->bLenientParsing = $bLenientParsing; + return $this; + } + + /** + * Configures the parser to choke on invalid rules. + * + * @return self fluent interface + */ + public function beStrict() + { + return $this->withLenientParsing(false); + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/CSSFunction.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/CSSFunction.php new file mode 100644 index 0000000..703f665 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Value/CSSFunction.php @@ -0,0 +1,109 @@ + $aArguments + * @param string $sSeparator + * @param int $iLineNo + */ + public function __construct($sName, $aArguments, $sSeparator = ',', $iLineNo = 0) + { + if ($aArguments instanceof RuleValueList) { + $sSeparator = $aArguments->getListSeparator(); + $aArguments = $aArguments->getListComponents(); + } + $this->sName = $sName; + $this->setPosition($iLineNo); // TODO: redundant? + parent::__construct($aArguments, $sSeparator, $iLineNo); + } + + /** + * @param ParserState $oParserState + * @param bool $bIgnoreCase + * + * @return CSSFunction + * + * @throws SourceException + * @throws UnexpectedEOFException + * @throws UnexpectedTokenException + * + * @internal since V8.8.0 + */ + public static function parse(ParserState $oParserState, $bIgnoreCase = false) + { + $mResult = $oParserState->parseIdentifier($bIgnoreCase); + $oParserState->consume('('); + $aArguments = Value::parseValue($oParserState, ['=', ' ', ',']); + $mResult = new CSSFunction($mResult, $aArguments, ',', $oParserState->currentLine()); + $oParserState->consume(')'); + return $mResult; + } + + /** + * @return string + */ + public function getName() + { + return $this->sName; + } + + /** + * @param string $sName + * + * @return void + */ + public function setName($sName) + { + $this->sName = $sName; + } + + /** + * @return array + */ + public function getArguments() + { + return $this->aComponents; + } + + /** + * @return string + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->render(new OutputFormat()); + } + + /** + * @param OutputFormat|null $oOutputFormat + * + * @return string + */ + public function render($oOutputFormat) + { + $aArguments = parent::render($oOutputFormat); + return "{$this->sName}({$aArguments})"; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/CSSString.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/CSSString.php new file mode 100644 index 0000000..a6a705b --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Value/CSSString.php @@ -0,0 +1,116 @@ +sString = $sString; + parent::__construct($iLineNo); + } + + /** + * @return CSSString + * + * @throws SourceException + * @throws UnexpectedEOFException + * @throws UnexpectedTokenException + * + * @internal since V8.8.0 + */ + public static function parse(ParserState $oParserState) + { + $sBegin = $oParserState->peek(); + $sQuote = null; + if ($sBegin === "'") { + $sQuote = "'"; + } elseif ($sBegin === '"') { + $sQuote = '"'; + } + if ($sQuote !== null) { + $oParserState->consume($sQuote); + } + $sResult = ""; + $sContent = null; + if ($sQuote === null) { + // Unquoted strings end in whitespace or with braces, brackets, parentheses + while (!preg_match('/[\\s{}()<>\\[\\]]/isu', $oParserState->peek())) { + $sResult .= $oParserState->parseCharacter(false); + } + } else { + while (!$oParserState->comes($sQuote)) { + $sContent = $oParserState->parseCharacter(false); + if ($sContent === null) { + throw new SourceException( + "Non-well-formed quoted string {$oParserState->peek(3)}", + $oParserState->currentLine() + ); + } + $sResult .= $sContent; + } + $oParserState->consume($sQuote); + } + return new CSSString($sResult, $oParserState->currentLine()); + } + + /** + * @param string $sString + * + * @return void + */ + public function setString($sString) + { + $this->sString = $sString; + } + + /** + * @return string + */ + public function getString() + { + return $this->sString; + } + + /** + * @return string + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->render(new OutputFormat()); + } + + /** + * @param OutputFormat|null $oOutputFormat + * + * @return string + */ + public function render($oOutputFormat) + { + $sString = addslashes($this->sString); + $sString = str_replace("\n", '\A', $sString); + return $oOutputFormat->getStringQuotingType() . $sString . $oOutputFormat->getStringQuotingType(); + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/CalcFunction.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/CalcFunction.php new file mode 100644 index 0000000..c3ed0a0 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Value/CalcFunction.php @@ -0,0 +1,115 @@ +parseIdentifier(); + if ($oParserState->peek() != '(') { + // Found ; or end of line before an opening bracket + throw new UnexpectedTokenException('(', $oParserState->peek(), 'literal', $oParserState->currentLine()); + } elseif (!in_array($sFunction, ['calc', '-moz-calc', '-webkit-calc'])) { + // Found invalid calc definition. Example calc (... + throw new UnexpectedTokenException('calc', $sFunction, 'literal', $oParserState->currentLine()); + } + $oParserState->consume('('); + $oCalcList = new CalcRuleValueList($oParserState->currentLine()); + $oList = new RuleValueList(',', $oParserState->currentLine()); + $iNestingLevel = 0; + $iLastComponentType = null; + while (!$oParserState->comes(')') || $iNestingLevel > 0) { + if ($oParserState->isEnd() && $iNestingLevel === 0) { + break; + } + + $oParserState->consumeWhiteSpace(); + if ($oParserState->comes('(')) { + $iNestingLevel++; + $oCalcList->addListComponent($oParserState->consume(1)); + $oParserState->consumeWhiteSpace(); + continue; + } elseif ($oParserState->comes(')')) { + $iNestingLevel--; + $oCalcList->addListComponent($oParserState->consume(1)); + $oParserState->consumeWhiteSpace(); + continue; + } + if ($iLastComponentType != CalcFunction::T_OPERAND) { + $oVal = Value::parsePrimitiveValue($oParserState); + $oCalcList->addListComponent($oVal); + $iLastComponentType = CalcFunction::T_OPERAND; + } else { + if (in_array($oParserState->peek(), $aOperators)) { + if (($oParserState->comes('-') || $oParserState->comes('+'))) { + if ( + $oParserState->peek(1, -1) != ' ' + || !($oParserState->comes('- ') + || $oParserState->comes('+ ')) + ) { + throw new UnexpectedTokenException( + " {$oParserState->peek()} ", + $oParserState->peek(1, -1) . $oParserState->peek(2), + 'literal', + $oParserState->currentLine() + ); + } + } + $oCalcList->addListComponent($oParserState->consume(1)); + $iLastComponentType = CalcFunction::T_OPERATOR; + } else { + throw new UnexpectedTokenException( + sprintf( + 'Next token was expected to be an operand of type %s. Instead "%s" was found.', + implode(', ', $aOperators), + $oParserState->peek() + ), + '', + 'custom', + $oParserState->currentLine() + ); + } + } + $oParserState->consumeWhiteSpace(); + } + $oList->addListComponent($oCalcList); + if (!$oParserState->isEnd()) { + $oParserState->consume(')'); + } + return new CalcFunction($sFunction, $oList, ',', $oParserState->currentLine()); + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/CalcRuleValueList.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/CalcRuleValueList.php new file mode 100644 index 0000000..17fbe7c --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Value/CalcRuleValueList.php @@ -0,0 +1,26 @@ +implode(' ', $this->aComponents); + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/Color.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/Color.php new file mode 100644 index 0000000..d4b7caf --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Value/Color.php @@ -0,0 +1,186 @@ + val1, 'c' => val2, 'h' => val3, …) and output in the second form. + */ +class Color extends CSSFunction +{ + /** + * @param array $aColor + * @param int $iLineNo + */ + public function __construct(array $aColor, $iLineNo = 0) + { + parent::__construct(implode('', array_keys($aColor)), $aColor, ',', $iLineNo); + } + + /** + * @param ParserState $oParserState + * @param bool $bIgnoreCase + * + * @return Color|CSSFunction + * + * @throws UnexpectedEOFException + * @throws UnexpectedTokenException + * + * @internal since V8.8.0 + */ + public static function parse(ParserState $oParserState, $bIgnoreCase = false) + { + $aColor = []; + if ($oParserState->comes('#')) { + $oParserState->consume('#'); + $sValue = $oParserState->parseIdentifier(false); + if ($oParserState->strlen($sValue) === 3) { + $sValue = $sValue[0] . $sValue[0] . $sValue[1] . $sValue[1] . $sValue[2] . $sValue[2]; + } elseif ($oParserState->strlen($sValue) === 4) { + $sValue = $sValue[0] . $sValue[0] . $sValue[1] . $sValue[1] . $sValue[2] . $sValue[2] . $sValue[3] + . $sValue[3]; + } + + if ($oParserState->strlen($sValue) === 8) { + $aColor = [ + 'r' => new Size(intval($sValue[0] . $sValue[1], 16), null, true, $oParserState->currentLine()), + 'g' => new Size(intval($sValue[2] . $sValue[3], 16), null, true, $oParserState->currentLine()), + 'b' => new Size(intval($sValue[4] . $sValue[5], 16), null, true, $oParserState->currentLine()), + 'a' => new Size( + round(self::mapRange(intval($sValue[6] . $sValue[7], 16), 0, 255, 0, 1), 2), + null, + true, + $oParserState->currentLine() + ), + ]; + } elseif ($oParserState->strlen($sValue) === 6) { + $aColor = [ + 'r' => new Size(intval($sValue[0] . $sValue[1], 16), null, true, $oParserState->currentLine()), + 'g' => new Size(intval($sValue[2] . $sValue[3], 16), null, true, $oParserState->currentLine()), + 'b' => new Size(intval($sValue[4] . $sValue[5], 16), null, true, $oParserState->currentLine()), + ]; + } else { + throw new UnexpectedTokenException( + 'Invalid hex color value', + $sValue, + 'custom', + $oParserState->currentLine() + ); + } + } else { + $sColorMode = $oParserState->parseIdentifier(true); + $oParserState->consumeWhiteSpace(); + $oParserState->consume('('); + + $bContainsVar = false; + $iLength = $oParserState->strlen($sColorMode); + for ($i = 0; $i < $iLength; ++$i) { + $oParserState->consumeWhiteSpace(); + if ($oParserState->comes('var')) { + $aColor[$sColorMode[$i]] = CSSFunction::parseIdentifierOrFunction($oParserState); + $bContainsVar = true; + } else { + $aColor[$sColorMode[$i]] = Size::parse($oParserState, true); + } + + if ($bContainsVar && $oParserState->comes(')')) { + // With a var argument the function can have fewer arguments + break; + } + + $oParserState->consumeWhiteSpace(); + if ($i < ($iLength - 1)) { + $oParserState->consume(','); + } + } + $oParserState->consume(')'); + + if ($bContainsVar) { + return new CSSFunction($sColorMode, array_values($aColor), ',', $oParserState->currentLine()); + } + } + return new Color($aColor, $oParserState->currentLine()); + } + + /** + * @param float $fVal + * @param float $fFromMin + * @param float $fFromMax + * @param float $fToMin + * @param float $fToMax + * + * @return float + */ + private static function mapRange($fVal, $fFromMin, $fFromMax, $fToMin, $fToMax) + { + $fFromRange = $fFromMax - $fFromMin; + $fToRange = $fToMax - $fToMin; + $fMultiplier = $fToRange / $fFromRange; + $fNewVal = $fVal - $fFromMin; + $fNewVal *= $fMultiplier; + return $fNewVal + $fToMin; + } + + /** + * @return array + */ + public function getColor() + { + return $this->aComponents; + } + + /** + * @param array $aColor + * + * @return void + */ + public function setColor(array $aColor) + { + $this->setName(implode('', array_keys($aColor))); + $this->aComponents = $aColor; + } + + /** + * @return string + */ + public function getColorDescription() + { + return $this->getName(); + } + + /** + * @return string + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->render(new OutputFormat()); + } + + /** + * @param OutputFormat|null $oOutputFormat + * + * @return string + */ + public function render($oOutputFormat) + { + // Shorthand RGB color values + if ($oOutputFormat->getRGBHashNotation() && implode('', array_keys($this->aComponents)) === 'rgb') { + $sResult = sprintf( + '%02x%02x%02x', + $this->aComponents['r']->getSize(), + $this->aComponents['g']->getSize(), + $this->aComponents['b']->getSize() + ); + return '#' . (($sResult[0] == $sResult[1]) && ($sResult[2] == $sResult[3]) && ($sResult[4] == $sResult[5]) + ? "$sResult[0]$sResult[2]$sResult[4]" : $sResult); + } + return parent::render($oOutputFormat); + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/LineName.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/LineName.php new file mode 100644 index 0000000..effc827 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Value/LineName.php @@ -0,0 +1,71 @@ + $aComponents + * @param int $iLineNo + */ + public function __construct(array $aComponents = [], $iLineNo = 0) + { + parent::__construct($aComponents, ' ', $iLineNo); + } + + /** + * @return LineName + * + * @throws UnexpectedTokenException + * @throws UnexpectedEOFException + * + * @internal since V8.8.0 + */ + public static function parse(ParserState $oParserState) + { + $oParserState->consume('['); + $oParserState->consumeWhiteSpace(); + $aNames = []; + do { + if ($oParserState->getSettings()->bLenientParsing) { + try { + $aNames[] = $oParserState->parseIdentifier(); + } catch (UnexpectedTokenException $e) { + if (!$oParserState->comes(']')) { + throw $e; + } + } + } else { + $aNames[] = $oParserState->parseIdentifier(); + } + $oParserState->consumeWhiteSpace(); + } while (!$oParserState->comes(']')); + $oParserState->consume(']'); + return new LineName($aNames, $oParserState->currentLine()); + } + + /** + * @return string + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->render(new OutputFormat()); + } + + /** + * @param OutputFormat|null $oOutputFormat + * + * @return string + */ + public function render($oOutputFormat) + { + return '[' . parent::render(OutputFormat::createCompact()) . ']'; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/PrimitiveValue.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/PrimitiveValue.php new file mode 100644 index 0000000..055a439 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Value/PrimitiveValue.php @@ -0,0 +1,14 @@ + + * + * @internal + */ + const ABSOLUTE_SIZE_UNITS = [ + 'px', + 'pt', + 'pc', + 'cm', + 'mm', + 'mozmm', + 'in', + 'vh', + 'dvh', + 'svh', + 'lvh', + 'vw', + 'vmin', + 'vmax', + 'rem', + ]; + + /** + * @var array + * + * @internal + */ + const RELATIVE_SIZE_UNITS = ['%', 'em', 'ex', 'ch', 'fr']; + + /** + * @var array + * + * @internal + */ + const NON_SIZE_UNITS = ['deg', 'grad', 'rad', 's', 'ms', 'turn', 'Hz', 'kHz']; + + /** + * @var array>|null + */ + private static $SIZE_UNITS = null; + + /** + * @var float + */ + private $fSize; + + /** + * @var string|null + */ + private $sUnit; + + /** + * @var bool + */ + private $bIsColorComponent; + + /** + * @param float|int|string $fSize + * @param string|null $sUnit + * @param bool $bIsColorComponent + * @param int $iLineNo + */ + public function __construct($fSize, $sUnit = null, $bIsColorComponent = false, $iLineNo = 0) + { + parent::__construct($iLineNo); + $this->fSize = (float)$fSize; + $this->sUnit = $sUnit; + $this->bIsColorComponent = $bIsColorComponent; + } + + /** + * @param bool $bIsColorComponent + * + * @return Size + * + * @throws UnexpectedEOFException + * @throws UnexpectedTokenException + * + * @internal since V8.8.0 + */ + public static function parse(ParserState $oParserState, $bIsColorComponent = false) + { + $sSize = ''; + if ($oParserState->comes('-')) { + $sSize .= $oParserState->consume('-'); + } + while (is_numeric($oParserState->peek()) || $oParserState->comes('.') || $oParserState->comes('e', true)) { + if ($oParserState->comes('.')) { + $sSize .= $oParserState->consume('.'); + } elseif ($oParserState->comes('e', true)) { + $sLookahead = $oParserState->peek(1, 1); + if (is_numeric($sLookahead) || $sLookahead === '+' || $sLookahead === '-') { + $sSize .= $oParserState->consume(2); + } else { + break; // Reached the unit part of the number like "em" or "ex" + } + } else { + $sSize .= $oParserState->consume(1); + } + } + + $sUnit = null; + $aSizeUnits = self::getSizeUnits(); + foreach ($aSizeUnits as $iLength => &$aValues) { + $sKey = strtolower($oParserState->peek($iLength)); + if (array_key_exists($sKey, $aValues)) { + if (($sUnit = $aValues[$sKey]) !== null) { + $oParserState->consume($iLength); + break; + } + } + } + return new Size((float)$sSize, $sUnit, $bIsColorComponent, $oParserState->currentLine()); + } + + /** + * @return array> + */ + private static function getSizeUnits() + { + if (!is_array(self::$SIZE_UNITS)) { + self::$SIZE_UNITS = []; + foreach (array_merge(self::ABSOLUTE_SIZE_UNITS, self::RELATIVE_SIZE_UNITS, self::NON_SIZE_UNITS) as $val) { + $iSize = strlen($val); + if (!isset(self::$SIZE_UNITS[$iSize])) { + self::$SIZE_UNITS[$iSize] = []; + } + self::$SIZE_UNITS[$iSize][strtolower($val)] = $val; + } + + krsort(self::$SIZE_UNITS, SORT_NUMERIC); + } + + return self::$SIZE_UNITS; + } + + /** + * @param string $sUnit + * + * @return void + */ + public function setUnit($sUnit) + { + $this->sUnit = $sUnit; + } + + /** + * @return string|null + */ + public function getUnit() + { + return $this->sUnit; + } + + /** + * @param float|int|string $fSize + */ + public function setSize($fSize) + { + $this->fSize = (float)$fSize; + } + + /** + * @return float + */ + public function getSize() + { + return $this->fSize; + } + + /** + * @return bool + */ + public function isColorComponent() + { + return $this->bIsColorComponent; + } + + /** + * Returns whether the number stored in this Size really represents a size (as in a length of something on screen). + * + * @return false if the unit an angle, a duration, a frequency or the number is a component in a Color object. + */ + public function isSize() + { + if (in_array($this->sUnit, self::NON_SIZE_UNITS, true)) { + return false; + } + return !$this->isColorComponent(); + } + + /** + * @return bool + */ + public function isRelative() + { + if (in_array($this->sUnit, self::RELATIVE_SIZE_UNITS, true)) { + return true; + } + if ($this->sUnit === null && $this->fSize != 0) { + return true; + } + return false; + } + + /** + * @return string + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->render(new OutputFormat()); + } + + /** + * @param OutputFormat|null $oOutputFormat + * + * @return string + */ + public function render($oOutputFormat) + { + $l = localeconv(); + $sPoint = preg_quote($l['decimal_point'], '/'); + $sSize = preg_match("/[\d\.]+e[+-]?\d+/i", (string)$this->fSize) + ? preg_replace("/$sPoint?0+$/", "", sprintf("%f", $this->fSize)) : (string)$this->fSize; + return preg_replace(["/$sPoint/", "/^(-?)0\./"], ['.', '$1.'], $sSize) + . ($this->sUnit === null ? '' : $this->sUnit); + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/URL.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/URL.php new file mode 100644 index 0000000..1f2a0af --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Value/URL.php @@ -0,0 +1,101 @@ +oURL = $oURL; + } + + /** + * @return URL + * + * @throws SourceException + * @throws UnexpectedEOFException + * @throws UnexpectedTokenException + * + * @internal since V8.8.0 + */ + public static function parse(ParserState $oParserState) + { + $oAnchor = $oParserState->anchor(); + $sIdentifier = ''; + for ($i = 0; $i < 3; $i++) { + $sChar = $oParserState->parseCharacter(true); + if ($sChar === null) { + break; + } + $sIdentifier .= $sChar; + } + $bUseUrl = $oParserState->streql($sIdentifier, 'url'); + if ($bUseUrl) { + $oParserState->consumeWhiteSpace(); + $oParserState->consume('('); + } else { + $oAnchor->backtrack(); + } + $oParserState->consumeWhiteSpace(); + $oResult = new URL(CSSString::parse($oParserState), $oParserState->currentLine()); + if ($bUseUrl) { + $oParserState->consumeWhiteSpace(); + $oParserState->consume(')'); + } + return $oResult; + } + + /** + * @return void + */ + public function setURL(CSSString $oURL) + { + $this->oURL = $oURL; + } + + /** + * @return CSSString + */ + public function getURL() + { + return $this->oURL; + } + + /** + * @return string + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->render(new OutputFormat()); + } + + /** + * @param OutputFormat|null $oOutputFormat + * + * @return string + */ + public function render($oOutputFormat) + { + return "url({$this->oURL->render($oOutputFormat)})"; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/Value.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/Value.php new file mode 100644 index 0000000..3025566 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Value/Value.php @@ -0,0 +1,218 @@ +setPosition($iLineNo); + } + + /** + * @param array $aListDelimiters + * + * @return RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string + * + * @throws UnexpectedTokenException + * @throws UnexpectedEOFException + * + * @internal since V8.8.0 + */ + public static function parseValue(ParserState $oParserState, array $aListDelimiters = []) + { + /** @var array $aStack */ + $aStack = []; + $oParserState->consumeWhiteSpace(); + //Build a list of delimiters and parsed values + while ( + !($oParserState->comes('}') || $oParserState->comes(';') || $oParserState->comes('!') + || $oParserState->comes(')') + || $oParserState->comes('\\') + || $oParserState->isEnd()) + ) { + if (count($aStack) > 0) { + $bFoundDelimiter = false; + foreach ($aListDelimiters as $sDelimiter) { + if ($oParserState->comes($sDelimiter)) { + array_push($aStack, $oParserState->consume($sDelimiter)); + $oParserState->consumeWhiteSpace(); + $bFoundDelimiter = true; + break; + } + } + if (!$bFoundDelimiter) { + //Whitespace was the list delimiter + array_push($aStack, ' '); + } + } + array_push($aStack, self::parsePrimitiveValue($oParserState)); + $oParserState->consumeWhiteSpace(); + } + // Convert the list to list objects + foreach ($aListDelimiters as $sDelimiter) { + $iStackLength = count($aStack); + if ($iStackLength === 1) { + return $aStack[0]; + } + $aNewStack = []; + for ($iStartPosition = 0; $iStartPosition < $iStackLength; ++$iStartPosition) { + if ($iStartPosition === ($iStackLength - 1) || $sDelimiter !== $aStack[$iStartPosition + 1]) { + $aNewStack[] = $aStack[$iStartPosition]; + continue; + } + $iLength = 2; //Number of elements to be joined + for ($i = $iStartPosition + 3; $i < $iStackLength; $i += 2, ++$iLength) { + if ($sDelimiter !== $aStack[$i]) { + break; + } + } + $oList = new RuleValueList($sDelimiter, $oParserState->currentLine()); + for ($i = $iStartPosition; $i - $iStartPosition < $iLength * 2; $i += 2) { + $oList->addListComponent($aStack[$i]); + } + $aNewStack[] = $oList; + $iStartPosition += $iLength * 2 - 2; + } + $aStack = $aNewStack; + } + if (!isset($aStack[0])) { + throw new UnexpectedTokenException( + " {$oParserState->peek()} ", + $oParserState->peek(1, -1) . $oParserState->peek(2), + 'literal', + $oParserState->currentLine() + ); + } + return $aStack[0]; + } + + /** + * @param bool $bIgnoreCase + * + * @return CSSFunction|string + * + * @throws UnexpectedEOFException + * @throws UnexpectedTokenException + * + * @internal since V8.8.0 + */ + public static function parseIdentifierOrFunction(ParserState $oParserState, $bIgnoreCase = false) + { + $oAnchor = $oParserState->anchor(); + $mResult = $oParserState->parseIdentifier($bIgnoreCase); + + if ($oParserState->comes('(')) { + $oAnchor->backtrack(); + if ($oParserState->streql('url', $mResult)) { + $mResult = URL::parse($oParserState); + } elseif ( + $oParserState->streql('calc', $mResult) + || $oParserState->streql('-webkit-calc', $mResult) + || $oParserState->streql('-moz-calc', $mResult) + ) { + $mResult = CalcFunction::parse($oParserState); + } else { + $mResult = CSSFunction::parse($oParserState, $bIgnoreCase); + } + } + + return $mResult; + } + + /** + * @return CSSFunction|CSSString|LineName|Size|URL|string + * + * @throws UnexpectedEOFException + * @throws UnexpectedTokenException + * @throws SourceException + * + * @internal since V8.8.0 + */ + public static function parsePrimitiveValue(ParserState $oParserState) + { + $oValue = null; + $oParserState->consumeWhiteSpace(); + if ( + is_numeric($oParserState->peek()) + || ($oParserState->comes('-.') + && is_numeric($oParserState->peek(1, 2))) + || (($oParserState->comes('-') || $oParserState->comes('.')) && is_numeric($oParserState->peek(1, 1))) + ) { + $oValue = Size::parse($oParserState); + } elseif ($oParserState->comes('#') || $oParserState->comes('rgb', true) || $oParserState->comes('hsl', true)) { + $oValue = Color::parse($oParserState); + } elseif ($oParserState->comes("'") || $oParserState->comes('"')) { + $oValue = CSSString::parse($oParserState); + } elseif ($oParserState->comes("progid:") && $oParserState->getSettings()->bLenientParsing) { + $oValue = self::parseMicrosoftFilter($oParserState); + } elseif ($oParserState->comes("[")) { + $oValue = LineName::parse($oParserState); + } elseif ($oParserState->comes("U+")) { + $oValue = self::parseUnicodeRangeValue($oParserState); + } else { + $sNextChar = $oParserState->peek(1); + try { + $oValue = self::parseIdentifierOrFunction($oParserState); + } catch (UnexpectedTokenException $e) { + if (\in_array($sNextChar, ['+', '-', '*', '/'], true)) { + $oValue = $oParserState->consume(1); + } else { + throw $e; + } + } + } + $oParserState->consumeWhiteSpace(); + return $oValue; + } + + /** + * @return CSSFunction + * + * @throws UnexpectedEOFException + * @throws UnexpectedTokenException + */ + private static function parseMicrosoftFilter(ParserState $oParserState) + { + $sFunction = $oParserState->consumeUntil('(', false, true); + $aArguments = Value::parseValue($oParserState, [',', '=']); + return new CSSFunction($sFunction, $aArguments, ',', $oParserState->currentLine()); + } + + /** + * @return string + * + * @throws UnexpectedEOFException + * @throws UnexpectedTokenException + */ + private static function parseUnicodeRangeValue(ParserState $oParserState) + { + $iCodepointMaxLength = 6; // Code points outside BMP can use up to six digits + $sRange = ""; + $oParserState->consume("U+"); + do { + if ($oParserState->comes('-')) { + $iCodepointMaxLength = 13; // Max length is 2 six digit code points + the dash(-) between them + } + $sRange .= $oParserState->consume(1); + } while (strlen($sRange) < $iCodepointMaxLength && preg_match("/[A-Fa-f0-9\?-]/", $oParserState->peek())); + return "U+{$sRange}"; + } +} diff --git a/dompdf/vendor/sabberworm/php-css-parser/src/Value/ValueList.php b/dompdf/vendor/sabberworm/php-css-parser/src/Value/ValueList.php new file mode 100644 index 0000000..6196225 --- /dev/null +++ b/dompdf/vendor/sabberworm/php-css-parser/src/Value/ValueList.php @@ -0,0 +1,114 @@ + + * + * @internal since 8.8.0 + */ + protected $aComponents; + + /** + * @var string + * + * @internal since 8.8.0 + */ + protected $sSeparator; + + /** + * phpcs:ignore Generic.Files.LineLength + * @param array|RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string $aComponents + * @param string $sSeparator + * @param int $iLineNo + */ + public function __construct($aComponents = [], $sSeparator = ',', $iLineNo = 0) + { + parent::__construct($iLineNo); + if (!is_array($aComponents)) { + $aComponents = [$aComponents]; + } + $this->aComponents = $aComponents; + $this->sSeparator = $sSeparator; + } + + /** + * @param RuleValueList|CSSFunction|CSSString|LineName|Size|URL|string $mComponent + * + * @return void + */ + public function addListComponent($mComponent) + { + $this->aComponents[] = $mComponent; + } + + /** + * @return array + */ + public function getListComponents() + { + return $this->aComponents; + } + + /** + * @param array $aComponents + * + * @return void + */ + public function setListComponents(array $aComponents) + { + $this->aComponents = $aComponents; + } + + /** + * @return string + */ + public function getListSeparator() + { + return $this->sSeparator; + } + + /** + * @param string $sSeparator + * + * @return void + */ + public function setListSeparator($sSeparator) + { + $this->sSeparator = $sSeparator; + } + + /** + * @return string + * + * @deprecated in V8.8.0, will be removed in V9.0.0. Use `render` instead. + */ + public function __toString() + { + return $this->render(new OutputFormat()); + } + + /** + * @param OutputFormat|null $oOutputFormat + * + * @return string + */ + public function render($oOutputFormat) + { + return $oOutputFormat->implode( + $oOutputFormat->spaceBeforeListArgumentSeparator($this->sSeparator) . $this->sSeparator + . $oOutputFormat->spaceAfterListArgumentSeparator($this->sSeparator), + $this->aComponents + ); + } +} diff --git a/generate_certificate.php b/generate_certificate.php new file mode 100644 index 0000000..ed9e2d6 --- /dev/null +++ b/generate_certificate.php @@ -0,0 +1,97 @@ +prepare("SELECT s.title, s.artist, s.file_path, s.uploaded_at, u.name as user_name FROM songs s JOIN users u ON s.user_id = u.id WHERE s.id = ? AND s.user_id = ?"); + $stmt->execute([$song_id, $user_id]); + $song = $stmt->fetch(); + + if (!$song) { + die("Song not found or you don't have permission to access it."); + } +} catch (PDOException $e) { + die("Database error: " . $e->getMessage()); +} + +// Check daily limit +$today = date('Y-m-d'); +$stmt = db()->prepare("SELECT upload_count FROM daily_uploads WHERE user_id = ? AND upload_date = ?"); +$stmt->execute([$user_id, $today]); +$daily_upload = $stmt->fetch(); + +if ($daily_upload && $daily_upload['upload_count'] >= 20) { + // Check if user has a pro plan + $stmt = db()->prepare("SELECT status FROM subscriptions WHERE user_id = ? AND status = 'active'"); + $stmt->execute([$user_id]); + $subscription = $stmt->fetch(); + if (!$subscription) { + die("You have reached your daily limit of 20 free certificates. Please upgrade to a Pro plan for unlimited certificates."); + } +} + +// Generate certificate +$certificate_hash = hash('sha256', $song['file_path'] . $song['uploaded_at'] . uniqid()); +$certificate_path = 'certificates/' . $certificate_hash . '.pdf'; + +// Generate PDF +$dompdf = new Dompdf(); +$html = "

Certificate of Copyright

"; +$html .= "

This certificate is awarded to " . htmlspecialchars($song['user_name']) . "

"; +$html .= "

for the song titled \"" . htmlspecialchars($song['title']) . "\"

"; +if ($song['artist']) { + $html .= "

by artist " . htmlspecialchars($song['artist']) . "

"; +} +$html .= "

Uploaded on: " . date('M d, Y', strtotime($song['uploaded_at'])) . "

"; +$html .= "

Certificate ID: " . $certificate_hash . "

"; + +$dompdf->loadHtml($html); +$dompdf->setPaper('A4', 'portrait'); +$dompdf->render(); +$pdf_output = $dompdf->output(); + +file_put_contents($certificate_path, $pdf_output); + +// Save certificate to database +try { + $stmt = db()->prepare("INSERT INTO certificates (song_id, certificate_hash, file_path) VALUES (?, ?, ?)"); + $stmt->execute([$song_id, $certificate_hash, $certificate_path]); +} catch (PDOException $e) { + die("Database error: " . $e->getMessage()); +} + +// Increment daily upload count +if ($daily_upload) { + $stmt = db()->prepare("UPDATE daily_uploads SET upload_count = upload_count + 1 WHERE user_id = ? AND upload_date = ?"); + $stmt->execute([$user_id, $today]); +} else { + $stmt = db()->prepare("INSERT INTO daily_uploads (user_id, upload_date, upload_count) VALUES (?, ?, 1)"); + $stmt->execute([$user_id, $today]); +} + +// Force download +header('Content-Description: File Transfer'); +header('Content-Type: application/pdf'); +header('Content-Disposition: attachment; filename="' . basename($certificate_path) . '"'); +header('Expires: 0'); +header('Cache-Control: must-revalidate'); +header('Pragma: public'); +header('Content-Length: ' . filesize($certificate_path)); +readfile($certificate_path); +exit; \ No newline at end of file diff --git a/includes/header.php b/includes/header.php new file mode 100644 index 0000000..0f341b4 --- /dev/null +++ b/includes/header.php @@ -0,0 +1,38 @@ + + diff --git a/index.php b/index.php index b72b964..99d490c 100644 --- a/index.php +++ b/index.php @@ -1,4 +1,4 @@ - + @@ -41,31 +41,7 @@ - - +
@@ -142,7 +118,7 @@ @@ -161,7 +137,7 @@ diff --git a/login.php b/login.php new file mode 100644 index 0000000..7a436f1 --- /dev/null +++ b/login.php @@ -0,0 +1,73 @@ +prepare("SELECT id, name, password FROM users WHERE email = ?"); + $stmt->execute([$email]); + $user = $stmt->fetch(); + + if ($user && password_verify($password, $user['password'])) { + $_SESSION['user_id'] = $user['id']; + $_SESSION['user_name'] = $user['name']; + header("Location: dashboard.php"); + exit(); + } else { + $error = 'Invalid email or password.'; + } + } catch (PDOException $e) { + $error = "Error: " . $e->getMessage(); + } + } +} +?> + + + + + + Login - Veritune + + + + + + +
+
+

Login to Your Account

+ +

+ +
+
+ + +
+
+ + +
+ +
+

+ Don't have an account? Register +

+
+
+ +
+
+

© Veritune. All rights reserved.

+
+
+ + \ No newline at end of file diff --git a/logout.php b/logout.php new file mode 100644 index 0000000..ba48427 --- /dev/null +++ b/logout.php @@ -0,0 +1,6 @@ +prepare("SELECT id FROM users WHERE email = ?"); + $stmt->execute([$email]); + if ($stmt->fetch()) { + $error = 'Email already exists.'; + } else { + $hashed_password = password_hash($password, PASSWORD_DEFAULT); + $stmt = db()->prepare("INSERT INTO users (name, email, password) VALUES (?, ?, ?)"); + $stmt->execute([$name, $email, $hashed_password]); + $_SESSION['user_id'] = db()->lastInsertId(); + $_SESSION['user_name'] = $name; + header("Location: dashboard.php"); + exit(); + } + } catch (PDOException $e) { + $error = "Error: " . $e->getMessage(); + } + } +} +?> + + + + + + Register - Veritune + + + + + + +
+
+

Create Your Account

+ +

+ +
+
+ + +
+
+ + +
+
+ + +
+ +
+

+ Already have an account? Login +

+
+
+ +
+
+

© Veritune. All rights reserved.

+
+
+ + \ No newline at end of file diff --git a/stripe-php/.gitignore b/stripe-php/.gitignore new file mode 100644 index 0000000..2049c20 --- /dev/null +++ b/stripe-php/.gitignore @@ -0,0 +1,32 @@ +# Ignore build files +build/* + +# Mac OS X dumps these all over the place. +.DS_Store + +# Ignore the SimpleTest library if it is installed to /test/. +/test/simpletest/ + +# Ignore the /vendor/ directory for people using composer +/vendor/ + +# If the vendor directory isn't being commited the composer.lock file should also be ignored +composer.lock + +# Ignore IDE's configuration files +.idea + +# Ignore PHP CS Fixer local config and cache +.php_cs +.php_cs.cache +.php-cs-fixer.cache + +# Ignore PHPStan local config +.phpstan.neon + +# Ignore phpDocumentor's local config and artifacts +.phpdoc/* +phpdoc.xml + +# Ignore cached PHPUnit results. +.phpunit.result.cache diff --git a/stripe-php/API_VERSION b/stripe-php/API_VERSION new file mode 100644 index 0000000..93be1ce --- /dev/null +++ b/stripe-php/API_VERSION @@ -0,0 +1 @@ +88aa59022b32620f4d66d6196e3b42d5a0f86bbb \ No newline at end of file diff --git a/stripe-php/CHANGELOG.md b/stripe-php/CHANGELOG.md new file mode 100644 index 0000000..f64e577 --- /dev/null +++ b/stripe-php/CHANGELOG.md @@ -0,0 +1,2965 @@ +# Changelog +## 19.1.0 - 2025-12-16 +This release changes the pinned API version to `2025-12-15.clover`. + +* [#1975](https://github.com/stripe/stripe-php/pull/1975) Update generated code + * Add support for new resources `V2.Core.AccountLink`, `V2.Core.AccountPersonToken`, `V2.Core.AccountPerson`, `V2.Core.AccountToken`, and `V2.Core.Account` + * Add support for `create` and `retrieve` methods on resources `V2.Core.AccountPersonToken` and `V2.Core.AccountToken` + * Add support for `create` method on resource `V2.Core.AccountLink` + * Add support for `all`, `close`, `create`, `retrieve`, and `update` methods on resource `V2.Core.Account` + * Add support for `all`, `create`, `delete`, `retrieve`, and `update` methods on resource `V2.Core.AccountPerson` + * Add support for `customer_account` on `Billing.CreditBalanceSummary`, `Billing.CreditGrant`, `BillingPortal.Session`, `BillingPortal\Session.create().$params`, `Billing\CreditBalanceSummary.retrieve().$params`, `Billing\CreditBalanceTransaction.all().$params`, `Billing\CreditGrant.all().$params`, `Billing\CreditGrant.create().$params`, `CashBalance`, `Checkout.Session`, `Checkout\Session.all().$params`, `Checkout\Session.create().$params`, `ConfirmationToken.payment_method_preview`, `CreditNote.all().$params`, `CreditNote`, `CustomerBalanceTransaction`, `CustomerCashBalanceTransaction`, `CustomerSession.create().$params`, `CustomerSession`, `Customer`, `Discount`, `FinancialConnections.Account.account_holder`, `FinancialConnections.Session.account_holder`, `FinancialConnections\Account.all().$params.account_holder`, `FinancialConnections\Session.create().$params.account_holder`, `Invoice.all().$params`, `Invoice.create().$params`, `Invoice.create_preview().$params`, `InvoiceItem.all().$params`, `InvoiceItem.create().$params`, `InvoiceItem`, `Invoice`, `PaymentIntent.all().$params`, `PaymentIntent.create().$params`, `PaymentIntent.update().$params`, `PaymentIntent`, `PaymentMethod.all().$params`, `PaymentMethod.attach().$params`, `PaymentMethod`, `PromotionCode.all().$params`, `PromotionCode.create().$params`, `PromotionCode`, `Quote.all().$params`, `Quote.create().$params`, `Quote.update().$params`, `Quote`, `SetupAttempt`, `SetupIntent.all().$params`, `SetupIntent.create().$params`, `SetupIntent.update().$params`, `SetupIntent`, `Subscription.all().$params`, `Subscription.create().$params`, `SubscriptionSchedule.all().$params`, `SubscriptionSchedule.create().$params`, `SubscriptionSchedule`, `Subscription`, `TaxId.all().$params.owner`, `TaxId.create().$params.owner`, `TaxId.owner`, and `TaxId` + * Add support for `metadata` on `Checkout\Session.create().$params.line_item` and `LineItem` + * Add support for `payto_payments` on `Account.capabilities`, `Account.create().$params.capability`, and `Account.update().$params.capability` + * Add support for `signer` on `Account.create().$params.document.proof_of_registration`, `Account.create().$params.document.proof_of_ultimate_beneficial_ownership`, `Account.update().$params.document.proof_of_registration`, and `Account.update().$params.document.proof_of_ultimate_beneficial_ownership` + * Change `BillingPortal\Session.create().$params.customer`, `Billing\CreditBalanceSummary.retrieve().$params.customer`, `Billing\CreditBalanceTransaction.all().$params.customer`, `Billing\CreditGrant.create().$params.customer`, `CustomerSession.create().$params.customer`, `InvoiceItem.create().$params.customer`, `PaymentMethod.attach().$params.customer`, and `Subscription.create().$params.customer` to be optional + * Add support for `billing_cycle_anchor` on `BillingPortal.Configuration.features.subscription_update`, `BillingPortal\Configuration.create().$params.feature.subscription_update`, and `BillingPortal\Configuration.update().$params.feature.subscription_update` + * Add support for `payto` on `Charge.payment_method_details`, `Checkout.Session.payment_method_options`, `Checkout\Session.create().$params.payment_method_option`, `ConfirmationToken.create().$params.payment_method_datum`, `ConfirmationToken.payment_method_preview`, `Invoice.create().$params.payment_setting.payment_method_option`, `Invoice.payment_settings.payment_method_options`, `Invoice.update().$params.payment_setting.payment_method_option`, `Mandate.payment_method_details`, `PaymentAttemptRecord.payment_method_details`, `PaymentIntent.confirm().$params.payment_method_datum`, `PaymentIntent.confirm().$params.payment_method_option`, `PaymentIntent.create().$params.payment_method_datum`, `PaymentIntent.create().$params.payment_method_option`, `PaymentIntent.payment_method_options`, `PaymentIntent.update().$params.payment_method_datum`, `PaymentIntent.update().$params.payment_method_option`, `PaymentMethod.create().$params`, `PaymentMethod.update().$params`, `PaymentMethodConfiguration.create().$params`, `PaymentMethodConfiguration.update().$params`, `PaymentMethodConfiguration`, `PaymentMethod`, `PaymentRecord.payment_method_details`, `SetupAttempt.payment_method_details`, `SetupIntent.confirm().$params.payment_method_datum`, `SetupIntent.confirm().$params.payment_method_option`, `SetupIntent.create().$params.payment_method_datum`, `SetupIntent.create().$params.payment_method_option`, `SetupIntent.payment_method_options`, `SetupIntent.update().$params.payment_method_datum`, `SetupIntent.update().$params.payment_method_option`, `Subscription.create().$params.payment_setting.payment_method_option`, `Subscription.payment_settings.payment_method_options`, and `Subscription.update().$params.payment_setting.payment_method_option` + * Add support for `expected_debit_date` on `Charge.payment_method_details.acss_debit`, `Charge.payment_method_details.au_becs_debit`, `Charge.payment_method_details.bacs_debit`, `Charge.payment_method_details.nz_bank_account`, `Charge.payment_method_details.sepa_debit`, `Charge.payment_method_details.us_bank_account`, `PaymentAttemptRecord.payment_method_details.acss_debit`, `PaymentAttemptRecord.payment_method_details.au_becs_debit`, `PaymentAttemptRecord.payment_method_details.bacs_debit`, `PaymentAttemptRecord.payment_method_details.nz_bank_account`, `PaymentAttemptRecord.payment_method_details.sepa_debit`, `PaymentAttemptRecord.payment_method_details.us_bank_account`, `PaymentRecord.payment_method_details.acss_debit`, `PaymentRecord.payment_method_details.au_becs_debit`, `PaymentRecord.payment_method_details.bacs_debit`, `PaymentRecord.payment_method_details.nz_bank_account`, `PaymentRecord.payment_method_details.sepa_debit`, and `PaymentRecord.payment_method_details.us_bank_account` + * Add support for new value `mollie` on enums `Charge.payment_method_details.ideal.bank`, `ConfirmationToken.payment_method_preview.ideal.bank`, `PaymentAttemptRecord.payment_method_details.ideal.bank`, `PaymentMethod.ideal.bank`, `PaymentRecord.payment_method_details.ideal.bank`, and `SetupAttempt.payment_method_details.ideal.bank` + * Add support for new value `MLLENL2A` on enums `Charge.payment_method_details.ideal.bic`, `ConfirmationToken.payment_method_preview.ideal.bic`, `PaymentAttemptRecord.payment_method_details.ideal.bic`, `PaymentMethod.ideal.bic`, `PaymentRecord.payment_method_details.ideal.bic`, and `SetupAttempt.payment_method_details.ideal.bic` + * Add support for `line_items` on `Checkout\Session.update().$params` + * Add support for new value `payto` on enums `ConfirmationToken.payment_method_preview.type` and `PaymentMethod.type` + * Add support for `invoice` on `CustomerBalanceTransaction.all().$params` + * Add support for `related_customer_account` on `Identity.VerificationSession`, `Identity\VerificationSession.all().$params`, and `Identity\VerificationSession.create().$params` + * Change type of `InvoiceItem.pricing.price_details.price` and `InvoiceLineItem.pricing.price_details.price` from `string` to `expandable($Price)` + * Add support for new value `payto` on enums `Invoice.payment_settings.payment_method_types` and `Subscription.payment_settings.payment_method_types` + * Add support for `subtotal` on `InvoiceLineItem` + * Add support for `authorization_code`, `description`, `iin`, `installments`, `issuer`, `network_advice_code`, `network_decline_code`, and `stored_credential_usage` on `PaymentAttemptRecord.payment_method_details.card` and `PaymentRecord.payment_method_details.card` + * Add support for new value `payto` on enums `PaymentIntent.excluded_payment_method_types` and `SetupIntent.excluded_payment_method_types` + * Change `PaymentIntent.transfer_data` to be optional + * Add support for new value `payto` on enum `PaymentLink.payment_method_types` + * Add support for `allow_redisplay` on `PaymentMethod.all().$params` + * Add support for `reported_by` on `PaymentRecord` + * Change `Product.tax_code` to be optional + * Add support for `changes` on `V2.Core.Event` + * Add support for error code `account_token_required_for_v2_account` on `Invoice.last_finalization_error`, `PaymentIntent.last_payment_error`, `SetupAttempt.setup_error`, `SetupIntent.last_setup_error`, and `StripeError` +* [#1976](https://github.com/stripe/stripe-php/pull/1976) Updated bundled CA certs +* [#1973](https://github.com/stripe/stripe-php/pull/1973) Remove deprecated usage of curl_close() for PHP versions > 8.0 + +## 19.0.0 - 2025-11-18 +This release changes the pinned API version to `2025-11-17.clover`. + +* [#1961](https://github.com/stripe/stripe-php/pull/1961) Update generated code + * ⚠️ Remove `gt`, `gte`, `lt`, and `lte` on `V2\Core\Event.all().$params` in favor of `created`. +* [#1958](https://github.com/stripe/stripe-php/pull/1958) Update v2 array parameter serialization to use indexed format + - `Retrieve` and `List` calls for `/v2` endpoints now use indexed format (e.g., `?include[0]=foo&include[1]=bar`) instead of repeated parameter format (e.g., `?include=foo&include=bar`) when communicating with the Stripe API. This may break any unit tests that expect the latter behavior when setting up a mock server. Instead, they should now expect the former. +* [#1956](https://github.com/stripe/stripe-php/pull/1956) Update generated code + * Add support for new resources `Tax.Association` and `Terminal.OnboardingLink` + * Add support for `find` method on resource `Tax.Association` + * Add support for `create` method on resource `Terminal.OnboardingLink` + * Add support for `payment_method_configuration` on `BillingPortal.Configuration.features.payment_method_update` + * Add support for `transaction_id` on `Charge.payment_method_details.ideal`, `PaymentAttemptRecord.payment_method_details.ideal`, and `PaymentRecord.payment_method_details.ideal` + * Add support for new value `finom` on enums `Charge.payment_method_details.ideal.bank`, `ConfirmationToken.payment_method_preview.ideal.bank`, `PaymentAttemptRecord.payment_method_details.ideal.bank`, `PaymentMethod.ideal.bank`, `PaymentRecord.payment_method_details.ideal.bank`, and `SetupAttempt.payment_method_details.ideal.bank` + * Add support for new value `FNOMNL22` on enums `Charge.payment_method_details.ideal.bic`, `ConfirmationToken.payment_method_preview.ideal.bic`, `PaymentAttemptRecord.payment_method_details.ideal.bic`, `PaymentMethod.ideal.bic`, `PaymentRecord.payment_method_details.ideal.bic`, and `SetupAttempt.payment_method_details.ideal.bic` + * Add support for new value `tokenized_account_number_deactivated` on enums `ConfirmationToken.payment_method_preview.us_bank_account.status_details.blocked.reason` and `PaymentMethod.us_bank_account.status_details.blocked.reason` + * Add support for `created` on `CustomerBalanceTransaction.all().$params` and `InvoicePayment.all().$params` + * Add support for new values `financial_connections.account.account_numbers_updated` and `financial_connections.account.upcoming_account_number_expiry` on enum `Event.type` + * Add support for `account_numbers` on `FinancialConnections.Account` + * Change type of `FinancialConnections.Session.client_secret` from `string` to `nullable(string)` + * Add support for `fraud_risk` on `Issuing\Authorization.create().$params.risk_assessment` + * Add support for `latest_fraud_warning` on `Issuing.Card` + * Add support for `hooks` on `PaymentIntent.capture().$params`, `PaymentIntent.confirm().$params`, `PaymentIntent.create().$params`, `PaymentIntent.increment_authorization().$params`, `PaymentIntent.update().$params`, and `PaymentIntent` + * Add support for `mb_way` and `twint` on `Refund.destination_details` + * Add support for snapshot events `FINANCIAL_CONNECTIONS_ACCOUNT_ACCOUNT_NUMBERS_UPDATED` and `FINANCIAL_CONNECTIONS_ACCOUNT_UPCOMING_ACCOUNT_NUMBER_EXPIRY` with resource `FinancialConnections.Account` + +## 18.2.0 - 2025-11-05 +* [#1953](https://github.com/stripe/stripe-php/pull/1953) Update generated code + * Add support for `capture_method` on `PaymentIntent.confirm().$params.payment_method_option.card_present`, `PaymentIntent.create().$params.payment_method_option.card_present`, `PaymentIntent.payment_method_options.card_present`, and `PaymentIntent.update().$params.payment_method_option.card_present` + +## 18.1.0 - 2025-10-29 + +This release changes the pinned API version to `2025-10-29.clover`. + +* [#1946](https://github.com/stripe/stripe-php/pull/1946) Update generated code + * Improve docs for PaymentIntent related endpoints +* [#1942](https://github.com/stripe/stripe-php/pull/1942) Update generated code + * Add support for new resources `PaymentAttemptRecord`, `PaymentIntentAmountDetailsLineItem`, and `PaymentRecord` + * Add support for `all` and `retrieve` methods on resource `PaymentAttemptRecord` + * Add support for `report_payment_attempt_canceled`, `report_payment_attempt_failed`, `report_payment_attempt_guaranteed`, `report_payment_attempt_informational`, `report_payment_attempt`, `report_payment`, `report_refund`, and `retrieve` methods on resource `PaymentRecord` + * Add support for `all` method on resource `PaymentIntentAmountDetailsLineItem` + * Add support for `representative_declaration` on `Account.company`, `Account.create().$params.company`, `Account.update().$params.company`, and `Token.create().$params.account.company` + * Change `Billing\CreditGrant.create().$params.category` to be optional + * Add support for `payment_method_configuration` on `BillingPortal\Configuration.create().$params.feature.payment_method_update` and `BillingPortal\Configuration.update().$params.feature.payment_method_update` + * Add support for new value `solana` on enum `Charge.payment_method_details.crypto.network` + * Add support for `twint` on `Checkout.Session.payment_method_options` and `Checkout\Session.create().$params.payment_method_option` + * Add support for new value `custom` on enums `ConfirmationToken.payment_method_preview.type` and `PaymentMethod.type` + * Add support for `payment_record_refund` and `type` on `CreditNote.create().$params.refund`, `CreditNote.preview().$params.refund`, `CreditNote.preview_lines().$params.refund`, and `CreditNote.refunds[]` + * Add support for `customer_sheet` and `mobile_payment_element` on `CustomerSession.components` and `CustomerSession.create().$params.component` + * Add support for `provider` on `Customer.tax` + * Add support for new values `balance_settings.updated` and `invoice.payment_attempt_required` on enum `Event.type` + * Add support for new value `platform_terms_of_service` on enum `File.purpose` + * Add support for `payment_record` on `Invoice.attach_payment().$params`, `InvoicePayment.all().$params.payment`, and `InvoicePayment.payment` + * Change type of `InvoicePayment.all().$params.payment.type` from `literal('payment_intent')` to `enum('payment_intent'|'payment_record')` + * Add support for new value `custom` on enums `Invoice.payment_settings.payment_method_types` and `Subscription.payment_settings.payment_method_types` + * Add support for `amount_details` on `PaymentIntent.capture().$params`, `PaymentIntent.confirm().$params`, `PaymentIntent.create().$params`, `PaymentIntent.increment_authorization().$params`, and `PaymentIntent.update().$params` + * Add support for `payment_details` on `PaymentIntent.capture().$params`, `PaymentIntent.confirm().$params`, `PaymentIntent.create().$params`, `PaymentIntent.increment_authorization().$params`, `PaymentIntent.update().$params`, and `PaymentIntent` + * Add support for `discount_amount`, `line_items`, `shipping`, and `tax` on `PaymentIntent.amount_details` + * Add support for `name_collection` on `PaymentLink.create().$params`, `PaymentLink.update().$params`, and `PaymentLink` + * Add support for new value `mb_way` on enum `PaymentLink.payment_method_types` + * Add support for `crypto` on `PaymentMethodConfiguration.create().$params`, `PaymentMethodConfiguration.update().$params`, `PaymentMethodConfiguration`, and `Refund.destination_details` + * Add support for `mb_way` on `PaymentMethodConfiguration.create().$params`, `PaymentMethodConfiguration.update().$params`, and `PaymentMethodConfiguration` + * Add support for `custom` on `PaymentMethod.create().$params` and `PaymentMethod` + * Add support for `excluded_payment_method_types` on `SetupIntent.create().$params`, `SetupIntent.update().$params`, and `SetupIntent` + * Add support for `tw` on `Tax.Registration.country_options` and `Tax\Registration.create().$params.country_option` + * Add support for `gip` on `Terminal.Configuration.tipping`, `Terminal\Configuration.create().$params.tipping`, and `Terminal\Configuration.update().$params.tipping` + * Add support for `last_seen_at` on `Terminal.Reader` + * Add support for `gt`, `gte`, `lt`, `lte`, and `types` on `V2\Core\Event.all().$params` + * Change `V2\Core\Event.all().$params.object_id` to be optional + * Add support for snapshot event `BALANCE_SETTINGS_UPDATED` with resource `BalanceSettings` + * Add support for snapshot event `INVOICE_PAYMENT_ATTEMPT_REQUIRED` with resource `Invoice` + * Add support for error code `payment_intent_rate_limit_exceeded` on `Invoice.last_finalization_error`, `PaymentIntent.last_payment_error`, `SetupAttempt.setup_error`, `SetupIntent.last_setup_error`, and `StripeError` + +## 18.0.0 - 2025-09-30 + +This release changes the pinned API version to `2025-09-30.clover` and contains breaking changes (prefixed with ⚠️ below) + +* [#1903](https://github.com/stripe/stripe-php/pull/1903) ⚠️ Add strongly typed EventNotifications + We've overhauled how V2 Events are handled in the SDK! This approach should provide a lot more information at authoring and compile time, leading to more robust integrations. As part of this process, there are a number of changes to be aware of. + - Added matching `EventNotification` classes for every v2 `Event`. For example, there's now a `V1BillingMeterErrorReportTriggeredEventNotification` to match the existing `V1BillingMeterErrorReportTriggeredEvent`. Each of these interfaces defines a `fetchEvent()` method to retrieve its corresponding event. For events with related objects, there's a `fetchRelatedObject()` method that performs the API call and casts the response to the correct type. + - ⚠️ Rename function `StripeClient->parseThinEvent` to `StripeClient->parseEventNotification` and remove the `ThinEvent` class. + - This function now returns a `Stripe\V2\Core\EventNotification` (which is the shared base class that all of the more specific `Stripe\*EventNotifications` classes share) instead of `ThinEvent`. When applicable, these event notifications will have the `relatedObject` property and a `fetchRelatedObject()` function. They also have a `fetchEvent()` method to retrieve their corresponding `Stripe\Event\*Event` instance. + - If you parse an event the SDK doesn't have types for (e.g. it's newer than the SDK you're using), you'll get an instance of `Stripe\Events\UnknownEventNotification` instead of a more specific type. It has both the `relatedObject` property and the `FetchRelatedObject()` function (but they may be/return `null`) + - ⚠️ removed the `Util::json_decode_thin_event_object`. Its functionality was folded into the new `\Stripe\V2\EventNotification::fromJson` method. +* [#1925](https://github.com/stripe/stripe-php/pull/1925) add version deprecation note to README + - NOTE: we'll be dropping support for PHP 5.6, 7.0, and 7.1 in the next major version (March 2026). The README has been updated with a link to our new [language version support policy](https://docs.stripe.com/sdks/versioning?lang=php#stripe-sdk-language-version-support-policy) +* [#1921](https://github.com/stripe/stripe-php/pull/1921) Update generated code + * Change `Invoice.id` to be required. +* [#1923](https://github.com/stripe/stripe-php/pull/1923) Update generated code + * Remove support for `balance_report` and `payout_reconciliation_report` on `AccountSession.components` and `AccountSession.create().$params.component` +* [#1920](https://github.com/stripe/stripe-php/pull/1920) Move `V2.Event` API resources to `V2.Core.Events` + - ⚠️ Move all V2 Event-related resources (`Event`, `RelatedObject`, etc) from `Stripe\V2` to `Stripe\V2\Core`. They now correctly match their API path and are in line with all other resources. To update your code: + ```diff + -Stripe\V2\Event + +Stripe\V2\Core\Event + ``` +* [#1916](https://github.com/stripe/stripe-php/pull/1916) Add `StripeContext` object + - Add the `StripeContext` class. Previously you could only send a string for `stripe-context` header. + - ⚠️ Change `EventNotification` (formerly known as `ThinEvent`)'s `context` property from `string` to `StripeContext` +* [#1905](https://github.com/stripe/stripe-php/pull/1905) Added StripeContext, StripeAccount and StripeVersion to BaseStripeClientInterface + - ⚠️ Add getter methods `getStripeContext`, `getStripeVersion` and `getStripeAccount` to `BaseStripeClientInterface`. Users with custom StripeClient that implement `StripeClientInterface`, `StripeStreamingClientInterface` or `BaseStripeClientInterface` will have to add implementations for these methods. +* [#1898](https://github.com/stripe/stripe-php/pull/1898) ⚠️ Build SDK w/ V2 OpenAPI spec + - ⚠️ The delete methods for v2 APIs (the ones in the `StripeClient.v2` namespace) now return a `V2DeletedObject` which has the id of the object that has been deleted and a string representing the type of the object that has been deleted. + - the generated types of some properties in `EventDestination` changed from `something: null|string` to `something?: string` + +* [#1900](https://github.com/stripe/stripe-php/pull/1900), [#1912](https://github.com/stripe/stripe-php/pull/1912) Update generated code based on incoming API changes in the `2025-09-30.clover` API version. + * ⚠️ Remove support for `link` and `pay_by_bank` on `PaymentMethod.update().$params` + * ⚠️ Remove support for `coupon` on `Discount`, `PromotionCode.create().$params`, and `PromotionCode`. Use `Discount.source.coupon`, `PromotionCode.create().$params.promotion.code`, and `PromotionCode.promotion.code` instead. + * ⚠️ Remove support for values `saturday` and `sunday` from enum `Account.settings.payouts.schedule.weekly_payout_days` + * ⚠️ Remove support for `iterations` on `Invoice.create_preview().$params.schedule_detail.phase`, `SubscriptionSchedule.create().$params.phase`, and `SubscriptionSchedule.update().$params.phase` + * Add support for new value `prevented` on enum `Dispute.status` + * Add support for new resource `BalanceSettings` + * Add support for `retrieve` and `update` methods on resource `BalanceSettings` + * Add support for new values `external_request` and `unsupported_business_type` on enums `Account.future_requirements.errors[].code`, `Account.requirements.errors[].code`, `BankAccount.future_requirements.errors[].code`, `BankAccount.requirements.errors[].code`, `Capability.future_requirements.errors[].code`, `Capability.requirements.errors[].code`, `Person.future_requirements.errors[].code`, and `Person.requirements.errors[].code` + * Add support for `source` on `Discount` + * Add support for `mb_way_payments` on `Account.capabilities`, `Account.create().$params.capability`, and `Account.update().$params.capability` + * Add support for `trial_update_behavior` on `BillingPortal.Configuration.features.subscription_update`, `BillingPortal\Configuration.create().$params.feature.subscription_update`, and `BillingPortal\Configuration.update().$params.feature.subscription_update` + * Add support for `mb_way` on `Charge.payment_method_details`, `ConfirmationToken.create().$params.payment_method_datum`, `ConfirmationToken.payment_method_preview`, `PaymentIntent.confirm().$params.payment_method_datum`, `PaymentIntent.confirm().$params.payment_method_option`, `PaymentIntent.create().$params.payment_method_datum`, `PaymentIntent.create().$params.payment_method_option`, `PaymentIntent.payment_method_options`, `PaymentIntent.update().$params.payment_method_datum`, `PaymentIntent.update().$params.payment_method_option`, `PaymentMethod.create().$params`, `PaymentMethod`, `SetupIntent.confirm().$params.payment_method_datum`, `SetupIntent.create().$params.payment_method_datum`, and `SetupIntent.update().$params.payment_method_datum` + * Add support for `branding_settings` and `name_collection` on `Checkout.Session` and `Checkout\Session.create().$params` + * Add support for `excluded_payment_method_types` on `Checkout.Session`, `Checkout\Session.create().$params`, `PaymentIntent.confirm().$params`, and `PaymentIntent.update().$params` + * Add support for `unit_label` on `Checkout\Session.create().$params.line_item.price_datum.product_datum`, `Invoice.add_lines().$params.line.price_datum.product_datum`, `Invoice.update_lines().$params.line.price_datum.product_datum`, `InvoiceLineItem.update().$params.price_datum.product_datum`, and `PaymentLink.create().$params.line_item.price_datum.product_datum` + * Add support for `alma`, `billie`, and `satispay` on `Checkout.Session.payment_method_options` and `Checkout\Session.create().$params.payment_method_option` + * Add support for `demo_pay` on `Checkout\Session.create().$params.payment_method_option` + * Add support for `capture_method` on `Checkout.Session.payment_method_options.affirm`, `Checkout.Session.payment_method_options.afterpay_clearpay`, `Checkout.Session.payment_method_options.amazon_pay`, `Checkout.Session.payment_method_options.card`, `Checkout.Session.payment_method_options.cashapp`, `Checkout.Session.payment_method_options.klarna`, `Checkout.Session.payment_method_options.link`, `Checkout.Session.payment_method_options.mobilepay`, `Checkout.Session.payment_method_options.revolut_pay`, `Checkout\Session.create().$params.payment_method_option.affirm`, `Checkout\Session.create().$params.payment_method_option.afterpay_clearpay`, `Checkout\Session.create().$params.payment_method_option.amazon_pay`, `Checkout\Session.create().$params.payment_method_option.card`, `Checkout\Session.create().$params.payment_method_option.cashapp`, `Checkout\Session.create().$params.payment_method_option.klarna`, `Checkout\Session.create().$params.payment_method_option.link`, `Checkout\Session.create().$params.payment_method_option.mobilepay`, and `Checkout\Session.create().$params.payment_method_option.revolut_pay` + * Add support for `flexible` on `Checkout\Session.create().$params.subscription_datum.billing_mode`, `Invoice.create_preview().$params.schedule_detail.billing_mode`, `Invoice.create_preview().$params.subscription_detail.billing_mode`, `Quote.create().$params.subscription_datum.billing_mode`, `Quote.subscription_data.billing_mode`, `Subscription.billing_mode`, `Subscription.create().$params.billing_mode`, `Subscription.migrate().$params.billing_mode`, `SubscriptionSchedule.billing_mode`, and `SubscriptionSchedule.create().$params.billing_mode` + * Add support for `business_name` and `individual_name` on `Checkout.Session.collected_information`, `Checkout.Session.customer_details`, `Customer.create().$params`, `Customer.update().$params`, and `Customer` + * Add support for new values `mb_way` on enums `ConfirmationToken.payment_method_preview.type` and `PaymentMethod.type` + * Add support for `chargeback_loss_reason_code` on `Dispute.payment_method_details.klarna` + * Add support for `net_amount` and `proration_details` on `InvoiceItem` + * Add support for `fraud_disputability_likelihood` and `risk_assessment` on `Issuing\Authorization.create().$params` + * Add support for `second_line` on `Issuing.Card` + * Add support for new values `mb_way` on enum `PaymentIntent.excluded_payment_method_types` + * Add support for `fr_meal_voucher_conecs` on `PaymentMethodConfiguration.create().$params` and `PaymentMethodConfiguration.update().$params` + * Add support for `promotion` on `PromotionCode.create().$params` and `PromotionCode` + * Add support for new values `acknowledged` and `payment_never_settled` on enum `Review.closed_reason` + * Add support for `provider` on `Tax.Settings.defaults` + * Add support for `bbpos_wisepad3` on `Terminal.Configuration`, `Terminal\Configuration.create().$params`, and `Terminal\Configuration.update().$params` + * Add support for `address_kana`, `address_kanji`, `display_name_kana`, `display_name_kanji`, and `phone` on `Terminal.Location`, `Terminal\Location.create().$params`, and `Terminal\Location.update().$params` + * Change `Terminal\Location.create().$params.address` to be optional + * Change `Terminal\Location.create().$params.display_name` to be optional + * Add support for error codes `financial_connections_account_pending_account_numbers` and `financial_connections_account_unavailable_account_numbers` on `Invoice.last_finalization_error`, `PaymentIntent.last_payment_error`, `SetupAttempt.setup_error`, `SetupIntent.last_setup_error`, and `StripeError` + + +## 17.6.0 - 2025-08-27 +* [#1895](https://github.com/stripe/stripe-php/pull/1895) Add section on private preview SDKs in readme +* [#1890](https://github.com/stripe/stripe-php/pull/1890) Update generated code. This release changes the pinned API version to `2025-08-27.basil`. + * Add support for `balance_report`, `payout_details`, and `payout_reconciliation_report` on `AccountSession.components` and `AccountSession.create().$params.component` + * Add support for `name` on `BillingPortal.Configuration`, `BillingPortal\Configuration.create().$params`, and `BillingPortal\Configuration.update().$params` + * Add support for `installments` on `Charge.payment_method_details.alma` + * Add support for `transaction_id` on `Charge.payment_method_details.alma`, `Charge.payment_method_details.amazon_pay`, `Charge.payment_method_details.billie`, `Charge.payment_method_details.kakao_pay`, `Charge.payment_method_details.kr_card`, `Charge.payment_method_details.naver_pay`, `Charge.payment_method_details.payco`, `Charge.payment_method_details.revolut_pay`, `Charge.payment_method_details.samsung_pay`, and `Charge.payment_method_details.satispay` + * Add support for `location` and `reader` on `Charge.payment_method_details.paynow` + * Add support for `amount_includes_iof` on `Checkout.Session.payment_method_options.pix`, `Checkout\Session.create().$params.payment_method_option.pix`, `PaymentIntent.confirm().$params.payment_method_option.pix`, `PaymentIntent.create().$params.payment_method_option.pix`, `PaymentIntent.payment_method_options.pix`, and `PaymentIntent.update().$params.payment_method_option.pix` + * Add support for new values `block` and `resolution` on enum `Dispute.payment_method_details.card.case_type` + * Add support for new value `terminal_android_apk` on enum `File.purpose` + * Add support for `metadata` and `period` on `Invoice.create_preview().$params.schedule_detail.phase.add_invoice_item`, `Subscription.create().$params.add_invoice_item`, `Subscription.update().$params.add_invoice_item`, `SubscriptionSchedule.create().$params.phase.add_invoice_item`, `SubscriptionSchedule.phases[].add_invoice_items[]`, and `SubscriptionSchedule.update().$params.phase.add_invoice_item` + * Add support for `exp_month` and `exp_year` on `Issuing\Card.create().$params` + * Add support for `excluded_payment_method_types` on `PaymentIntent.create().$params` and `PaymentIntent` + * Add support for `payout_method` on `Payout.create().$params` and `Payout` + * Add support for `mxn` on `Terminal.Configuration.tipping`, `Terminal\Configuration.create().$params.tipping`, and `Terminal\Configuration.update().$params.tipping` + * Add support for `card` on `Terminal\Reader.present_payment_method().$params` + * Add support for error codes `customer_session_expired` and `india_recurring_payment_mandate_canceled` on `Invoice.last_finalization_error`, `PaymentIntent.last_payment_error`, `SetupAttempt.setup_error`, `SetupIntent.last_setup_error`, and `StripeError` +* [#1894](https://github.com/stripe/stripe-php/pull/1894) Add getter for Stripe Account on BaseStripeClient + - Add `getStripeAccount` method on `BaseStripeClient` to retrieve [Stripe Account ID](https://docs.stripe.com/connect/authentication?lang=php) from a `StripeClient` instance. + +## 17.5.0 - 2025-07-30 +This release changes the pinned API version to `2025-07-30.basil`. + +* [#1887](https://github.com/stripe/stripe-php/pull/1887) Update generated code + * Add support for `origin_context` on `Checkout.Session` +* [#1881](https://github.com/stripe/stripe-php/pull/1881) Ensure compatibility with POST on older versions of libcurl + * Fixes an issue with older versions of php/libcurl where certain SDK calls that have empty POST bodies will result in a 400 Bad Request returned from the server. + +## 17.4.0 - 2025-07-01 +This release changes the pinned API version to `2025-06-30.basil`. + +* [#1880](https://github.com/stripe/stripe-php/pull/1880) Update generated code + * Add support for `migrate` method on resource `Subscription` + * Add support for `collect_payment_method` and `confirm_payment_intent` methods on resource `Terminal.Reader` + * Add support for new value `crypto` on enums `ConfirmationToken.payment_method_preview.type` and `PaymentMethod.type` + * Change type of `Dispute.enhanced_eligibility_types` from `literal('visa_compelling_evidence_3')` to `enum('visa_compelling_evidence_3'|'visa_compliance')` + * Add support for new value `terminal.reader.action_updated` on enum `Event.type` + * Add support for `related_person` on `Identity.VerificationSession` + * Add support for new value `crypto` on enums `Invoice.payment_settings.payment_method_types` and `Subscription.payment_settings.payment_method_types` + * Add support for `crypto` on `PaymentMethod` + * Add support for new value `buut` on enum `PaymentMethod.ideal.bank` + * Add support for new value `BUUTNL2A` on enum `PaymentMethod.ideal.bic` + * Add support for `billing_mode` on `SubscriptionSchedule` and `Subscription` + * Add support for new values `collect_payment_method` and `confirm_payment_intent` on enum `Terminal.Reader.action.type` + * Add support for snapshot event `TERMINAL_READER_ACTION_UPDATED` with resource `Terminal.Reader` +* [#1878](https://github.com/stripe/stripe-php/pull/1878) Update generated code + * Add constant `CURRENT_MAJOR` in `ApiVersion` + +## 17.3.0 - 2025-05-29 + This release changes the pinned API version to `2025-05-28.basil`. + +* [#1871](https://github.com/stripe/stripe-php/pull/1871) Update generated code + * Add support for `attach_payment` method on resource `Invoice` + * Add support for `collect_inputs` method on resource `Terminal.Reader` + * Add support for `succeed_input_collection` and `timeout_input_collection` test helper methods on resource `Terminal.Reader` + * Add support for `refund_and_dispute_prefunding` on `Balance` + * Add support for `balance_type` on `BalanceTransaction` + * Add support for `post_payment_amount` and `pre_payment_amount` on `CreditNote` + * Add support for new value `mixed` on enum `CreditNote.type` + * Add support for new value `invoice_payment.paid` on enum `Event.type` + * Add support for `kakao_pay`, `kr_card`, `naver_pay`, `payco`, and `samsung_pay` on `PaymentMethodConfiguration` + * Add support for `billing_thresholds` on `SubscriptionItem` and `Subscription` + * Add support for `metadata` on `Tax.CalculationLineItem` + * Add support for new value `collect_inputs` on enum `Terminal.Reader.action.type` + * Add support for new value `simulated_stripe_s700` on enum `Terminal.Reader.device_type` + * Add support for snapshot event `INVOICE_PAYMENT_PAID` with resource `InvoicePayment` + * Add support for error code `forwarding_api_upstream_error` on `Invoice.last_finalization_error`, `PaymentIntent.last_payment_error`, `SetupAttempt.setup_error`, `SetupIntent.last_setup_error`, and `StripeError` + +## 17.2.1 - 2025-05-19 +* [#1869](https://github.com/stripe/stripe-php/pull/1869) Fixed type of map parameters(eg. metadata, currency_options) from `StripeObject` to `array` in all methods. +* [#1866](https://github.com/stripe/stripe-php/pull/1866) Adds CONTRIBUTING.md + +## 17.2.0 - 2025-04-30 + + This release changes the pinned API version to `2025-04-30.basil`. + +* [#1839](https://github.com/stripe/stripe-php/pull/1839) Update generated code + * Add support for new value `tax_id_prohibited` on enums `Invoice.last_finalization_error.code`, `PaymentIntent.last_payment_error.code`, `SetupAttempt.setup_error.code`, `SetupIntent.last_setup_error.code`, and `StripeError.code` + * Add support for `wallet_options` on `Checkout.Session` + * Add support for `context` on `Event` + * Add support for new values `aw_tin`, `az_tin`, `bd_bin`, `bf_ifu`, `bj_ifu`, `cm_niu`, `cv_nif`, `et_tin`, `kg_tin`, and `la_tin` on enums `Invoice.customer_tax_ids[].type` and `TaxId.type` + * Add support for new value `affirm` on enums `Invoice.payment_settings.payment_method_types` and `Subscription.payment_settings.payment_method_types` + * Add support for `pix` on `PaymentMethodConfiguration` + * Add support for `klarna` on `PaymentMethodDomain` + * Add support for `us_cfpb_data` on `Person` + * Add support for `pending_reason` on `Refund` + * Change type of `Tax.CalculationLineItem.reference` from `nullable(string)` to `string` +* [#1857](https://github.com/stripe/stripe-php/pull/1857) Include new PHP 8.3 and 8.4 in CI +* [#1856](https://github.com/stripe/stripe-php/pull/1856) Faster parallel runner for PHP formatter + +## 17.1.1 - 2025-04-04 +* [#1847](https://github.com/stripe/stripe-php/pull/1847) Remove stdClass from object shapes + * Remove intersection with `stdClass` in resource properties and fixed `instanceof` checks. + +## 17.1.0 - 2025-04-02 +* [#1843](https://github.com/stripe/stripe-php/pull/1843) Add null type in resource fields to non required objects + * Fixes nullable resource properties that were incorrectly set as required in PHPDocs + +## 17.0.0 - 2025-04-01 +* [#1837](https://github.com/stripe/stripe-php/pull/1837) Better type hints in your editor!! + * Added type hints for method parameters + * PHPStorm IDE with array type hints + * Improved type hints for resource properties that are not primitive types. Take for example, the invoice settings in Customer resource. Previously, you could not reference inner fields like `custom_fields` on `customer->invoice_settings` without PHPStan complaining. This is now fixed. + +* [#1818](https://github.com/stripe/stripe-php/pull/1818) Support for APIs in the new API version 2025-03-31.basil + + This release changes the pinned API version to `2025-03-31.basil`. + + ### ⚠️ Breaking changes due to changes in the Stripe API + + Please review details for the breaking changes and alternatives in the [Stripe API changelog](https://docs.stripe.com/changelog/basil#2025-03-31.basil) before upgrading. + + * Remove support for resources `UsageRecordSummary` and `UsageRecord` + * Remove support for `create` method on resource `UsageRecord` + * Remove support for `all` method on resource `UsageRecordSummary` + * Remove support for `upcomingLines` and `upcoming` methods on resource `Invoice` + * Remove support for `invoice` on `Charge` and `PaymentIntent` + * Remove support for `shipping_details` on `Checkout.Session` + * Remove support for `refund` on `CreditNote` + * Remove support for `tax_amounts` on `CreditNoteLineItem`, `CreditNote`, and `InvoiceLineItem` + * Remove support for `amount_excluding_tax` and `unit_amount_excluding_tax` on `CreditNoteLineItem` and `InvoiceLineItem` + * Remove support for `application_fee_amount`, `charge`, `paid_out_of_band`, `paid`, `payment_intent`, `quote`, `subscription`, `subscription_details`, `subscription_proration_date`, `tax`, `total_tax_amounts`, and `transfer_data` on `Invoice` + * Remove support for `discount` on `Invoice` and `Subscription` + * Remove support for `invoice_item`, `proration_details`, `proration`, `tax_rates`, and `type` on `InvoiceLineItem` + * Remove support for `plan`, `price`, and `subscription_item` on `InvoiceItem` and `InvoiceLineItem` + * Remove support for `subscription`, `unit_amount_decimal`, and `unit_amount` on `InvoiceItem` + * Remove support for `aggregate_usage` on `Plan` + * Remove support for `billing_thresholds` on `SubscriptionItem` and `Subscription` + * Remove support for `current_period_end` and `current_period_start` on `Subscription` + + ### ⚠️ Other Breaking changes in the SDK + * [#1826](https://github.com/stripe/stripe-php/pull/1826) configure max_nextwork_retries at the client level + * Allow setting `maxNetworkRetries` at the `StripeClient` level via a new argument to the `RequestOptions` constructor + * ⚠️ (potentially breaking) a client's configuration for `maxNetworkRetries` is set during client initialization. Subsequent calls to `Stripe::setMaxNetworkRetries()` after client creation **won't** affect that client. + * Allow setting `maxNetworkRetries` per-request via the `max_network_retries` config argument. This works for both the service and resource based patterns. In both cases, an explicitly passed value takes precedence over the global (or client) value. + * [#1835](https://github.com/stripe/stripe-php/pull/1835) Removed the protected method _searchResource as it is no longer used + * ⚠️ Removed `_searchResource` method and `Search` trait. Use the public `search` method on `Charge`, `Customer`, `Invoice`, `PaymentIntent`, `Price`, `Product`, and `Subscription` resource. + * [#1832](https://github.com/stripe/stripe-php/pull/1832) Added requestCollection and requestSearchResult to StripeClientInterface + * ⚠️ Added `requestSearchResult`, `requestCollection` to `StripeClientInterface`. Developers building custom StripeClient will now have to implement these new methods. + * Refer to our implementation in [BaseStripeClient](https://github.com/stripe/stripe-php/blob/f65c497d0bc175aaa04538602fd49645f44f9384/lib/BaseStripeClient.php#L259-L315) for guidance. + + + ### Additions + + * Add support for new resource `InvoicePayment` + * Add support for `all` and `retrieve` methods on resource `InvoicePayment` + * Add support for new values `forwarding_api_retryable_upstream_error` and `setup_intent_mobile_wallet_unsupported` on enums `Invoice.last_finalization_error.code`, `PaymentIntent.last_payment_error.code`, `SetupAttempt.setup_error.code`, `SetupIntent.last_setup_error.code`, and `StripeError.code` + * Add support for new values `stripe_balance_payment_debit_reversal` and `stripe_balance_payment_debit` on enum `BalanceTransaction.type` + * Add support for new value `last` on enum `Billing.Meter.default_aggregation.formula` + * Add support for `presentment_details` on `Charge`, `Checkout.Session`, `PaymentIntent`, and `Refund` + * Add support for `optional_items` on `Checkout.Session` and `PaymentLink` + * Add support for `permissions` on `Checkout.Session` + * Add support for new value `custom` on enum `Checkout.Session.ui_mode` + * Add support for new values `billie`, `nz_bank_account`, and `satispay` on enums `ConfirmationToken.payment_method_preview.type` and `PaymentMethod.type` + * Add support for `refunds` on `CreditNote` + * Add support for `total_taxes` on `CreditNote` and `Invoice` + * Add support for `taxes` on `CreditNoteLineItem` and `InvoiceLineItem` + * Add support for `checkout_session` on `CustomerBalanceTransaction` + * Add support for new values `checkout_session_subscription_payment_canceled` and `checkout_session_subscription_payment` on enum `CustomerBalanceTransaction.type` + * Add support for new value `invoice.overpaid` on enum `Event.type` + * Add support for `amount_overpaid`, `confirmation_secret`, and `payments` on `Invoice` + * Add support for `parent` on `InvoiceItem`, `InvoiceLineItem`, and `Invoice` + * Add support for new values `klarna` and `nz_bank_account` on enums `Invoice.payment_settings.payment_method_types` and `Subscription.payment_settings.payment_method_types` + * Add support for `pricing` on `InvoiceItem` and `InvoiceLineItem` + * Add support for new value `network_fallback` on enum `Issuing.Authorization.request_history[].reason` + * Add support for new value `expired` on enum `Issuing.Authorization.status` + * Add support for new value `expired` on enum `PaymentIntent.cancellation_reason` + * Add support for new values `billie` and `satispay` on enum `PaymentLink.payment_method_types` + * Add support for `billie`, `nz_bank_account`, and `satispay` on `PaymentMethodConfiguration` and `PaymentMethod` + * Add support for new value `canceled` on enum `Review.closed_reason` + * Add support for `current_period_end` and `current_period_start` on `SubscriptionItem` + * Add support for `wifi` on `Terminal.Configuration` + +## 16.6.0 - 2025-02-24 +* [#1809](https://github.com/stripe/stripe-php/pull/1809) Update generated code + * Add support for `priority` on `Billing.CreditGrant` + * Add support for `collected_information` on `Checkout.Session` +* [#1816](https://github.com/stripe/stripe-php/pull/1816) add codeowners file + +## 16.5.1 - 2025-02-07 +* [#1811](https://github.com/stripe/stripe-php/pull/1811) Include a useful error message when a null byte is found in the URL path +* [#1810](https://github.com/stripe/stripe-php/pull/1810) Make `httpClient()` a public, static method + +## 16.5.0 - 2025-01-27 +* [#1804](https://github.com/stripe/stripe-php/pull/1804) Update generated code + * Add support for `close` method on resource `Treasury.FinancialAccount` + * Add support for `discounts` on `Checkout.Session` + * Add support for new value `pay_by_bank` on enum `PaymentLink.payment_method_types[]` + * Add support for `pay_by_bank` on `PaymentMethodConfiguration` and `PaymentMethod` + * Add support for new value `pay_by_bank` on enum `PaymentMethod.type` + * Add support for `is_default` and `nickname` on `Treasury.FinancialAccount` +* [#1805](https://github.com/stripe/stripe-php/pull/1805) Restore testCoreEventsGet generated test +* [#1807](https://github.com/stripe/stripe-php/pull/1807) minor justfile fixes +* [#1806](https://github.com/stripe/stripe-php/pull/1806) Added CONTRIBUTING.md file +* [#1802](https://github.com/stripe/stripe-php/pull/1802) ensure dependencies are installed for format and test recipes +* [#1801](https://github.com/stripe/stripe-php/pull/1801) Add justfile, remove coveralls, and fix AUTOLOAD in CI +* [#1797](https://github.com/stripe/stripe-php/pull/1797) Added pull request template + +## 16.4.0 - 2024-12-18 +* [#1793](https://github.com/stripe/stripe-php/pull/1793) This release changes the pinned API version to `2024-12-18.acacia`. + * Add support for new values `payout_minimum_balance_hold` and `payout_minimum_balance_release` on enum `BalanceTransaction.type` + * Add support for `allow_redisplay` on `Card` and `Source` + * Add support for `regulated_status` on `Card` + * Add support for new value `request_signature` on enum `Forwarding.Request.replacements[]` + * Change type of `LineItem.description` from `string` to `nullable(string)` + * Add support for new values `al_tin`, `am_tin`, `ao_tin`, `ba_tin`, `bb_tin`, `bs_tin`, `cd_nif`, `gn_nif`, `kh_tin`, `me_pib`, `mk_vat`, `mr_nif`, `np_pan`, `sn_ninea`, `sr_fin`, `tj_tin`, `ug_tin`, `zm_tin`, and `zw_tin` on enum `TaxId.type` + +## 16.3.0 - 2024-11-20 +* [#1786](https://github.com/stripe/stripe-php/pull/1786) This release changes the pinned API version to `2024-11-20.acacia`. + * Add support for `respond` test helper method on resource `Issuing.Authorization` + * Add support for `adaptive_pricing` on `Checkout.Session` + * Add support for new value `subscribe` on enums `Checkout.Session.submit_type` and `PaymentLink.submit_type` + * Add support for new value `financial_account_statement` on enum `File.purpose` + * Add support for `fraud_challenges` and `verified_by_fraud_challenge` on `Issuing.Authorization` + * Add support for `trace_id` on `Payout` + * Add support for new value `li_vat` on enum `TaxId.type` + * Add support for new value `service_tax` on enum `TaxRate.tax_type` + * Change type of `Treasury.InboundTransfer.origin_payment_method` from `string` to `nullable(string)` + +## 16.2.0 - 2024-10-29 +* [#1772](https://github.com/stripe/stripe-php/pull/1772) This release changes the pinned API version to `2024-10-28.acacia`. + * Add support for new resource `V2.EventDestinations` + * Add support for `create`, `retrieve`, `update`, `list`, `delete`, `disable`, `enable` and `ping` methods on resource `V2.EventDestinations` + * Add support for `submit_card` test helper method on resource `Issuing.Card` + * Add support for `groups` on `Account` + * Add support for `enhanced_eligibility_types` on `Dispute` + * Add support for new values `issuing_transaction.purchase_details_receipt_updated` and `refund.failed` on enum `Event.type` + * Add support for `metadata` on `Forwarding.Request` + * Add support for new value `alma` on enum `PaymentLink.payment_method_types[]` + * Add support for `alma` on `PaymentMethodConfiguration` and `PaymentMethod` + * Add support for `kakao_pay`, `kr_card`, `naver_pay`, `payco`, and `samsung_pay` on `PaymentMethod` + * Add support for new values `alma`, `kakao_pay`, `kr_card`, `naver_pay`, `payco`, and `samsung_pay` on enum `PaymentMethod.type` + * Add support for `amazon_pay` on `PaymentMethodDomain` + * Add support for new values `by_tin`, `ma_vat`, `md_vat`, `tz_vat`, `uz_tin`, and `uz_vat` on enum `TaxId.type` + * Add support for `flat_amount` and `rate_type` on `TaxRate` + * Add support for new value `retail_delivery_fee` on enum `TaxRate.tax_type` + +## 16.1.1 - 2024-10-18 +* [#1775](https://github.com/stripe/stripe-php/pull/1775) Deserialize into correct v2 EventData types + * Fixes a bug where v2 EventData was not being deserialized into the appropriate type for `V1BillingMeterErrorReportTriggeredEvent` and `V1BillingMeterNoMeterFoundEvent` +* [#1776](https://github.com/stripe/stripe-php/pull/1776) update object tags for meter-related classes + + - fixes a bug where the `object` property of the `MeterEvent`, `MeterEventAdjustment`, and `MeterEventSession` didn't match the server. +* [#1773](https://github.com/stripe/stripe-php/pull/1773) Clean up examples +* [#1771](https://github.com/stripe/stripe-php/pull/1771) Renamed example file names + +## 16.1.0 - 2024-10-03 +* [#1765](https://github.com/stripe/stripe-php/pull/1765) Update generated code + * Remove the support for resource `Margin` that was accidentally made public in the last release + +## 16.0.0 - 2024-10-01 +* [#1756](https://github.com/stripe/stripe-php/pull/1756) Support for APIs in the new API version 2024-09-30.acacia + + This release changes the pinned API version to `2024-09-30.acacia`. Please read the [API Changelog](https://docs.stripe.com/changelog/acacia#2024-09-30.acacia) and carefully review the API changes before upgrading. + + ### ⚠️ Breaking changes + + * Rename `usage_threshold_config` to `usage_threshold` on `Billing.Alert` + * Remove support for `filter` on `Billing.Alert`. Use the filters on the `usage_threshold` instead + + + ### Additions + + * Add support for new value `international_transaction` on enum `Treasury.ReceivedCredit.failure_code` + * Add support for new Usage Billing APIs `Billing.MeterEvent`, `Billing.MeterEventAdjustments`, `Billing.MeterEventSession`, `Billing.MeterEventStream` and the new Events API `Core.Events` under the [v2 namespace ](https://docs.corp.stripe.com/api-v2-overview) + * Add new method `parseThinEvent()` on the `StripeClient` class to parse [thin events](https://docs.corp.stripe.com/event-destinations#events-overview). + * Add a new method [rawRequest()](https://github.com/stripe/stripe-node/tree/master?tab=readme-ov-file#custom-requests) on the `StripeClient` class that takes a HTTP method type, url and relevant parameters to make requests to the Stripe API that are not yet supported in the SDK. + + +## 15.10.0 - 2024-09-18 +* [#1747](https://github.com/stripe/stripe-php/pull/1747) Update generated code + * Add support for new value `international_transaction` on enum `Treasury.ReceivedDebit.failure_code` +* [#1745](https://github.com/stripe/stripe-php/pull/1745) Update generated code + * Add support for new value `terminal_reader_invalid_location_for_activation` on enum `StripeError.code` + * Add support for `automatically_finalizes_at` on `Invoice` + +## 15.9.0 - 2024-09-12 +* [#1737](https://github.com/stripe/stripe-php/pull/1737) Update generated code + * Add support for new resource `InvoiceRenderingTemplate` + * Add support for `all`, `archive`, `retrieve`, and `unarchive` methods on resource `InvoiceRenderingTemplate` + +## 15.8.0 - 2024-08-29 +* [#1742](https://github.com/stripe/stripe-php/pull/1742) Generate SDK for OpenAPI spec version 1230 + * Add support for new value `issuing_regulatory_reporting` on enum `File.purpose` + * Add support for new value `hr_oib` on enum `TaxId.type` + * Add support for `status_details` on `TestHelpers.TestClock` + +## 15.7.0 - 2024-08-15 +* [#1736](https://github.com/stripe/stripe-php/pull/1736) Update generated code + + +## 15.6.0 - 2024-08-08 +* [#1729](https://github.com/stripe/stripe-php/pull/1729) Update generated code + * Add support for `activate`, `all`, `archive`, `create`, `deactivate`, and `retrieve` methods on resource `Billing.Alert` + * Add support for `retrieve` method on resource `Tax.Calculation` + * Add support for new value `invalid_mandate_reference_prefix_format` on enum `StripeError.code` + * Add support for `related_customer` on `Identity.VerificationSession` + * Add support for new value `financial_addresses.aba.forwarding` on enums `Treasury.FinancialAccount.active_features[]`, `Treasury.FinancialAccount.pending_features[]`, and `Treasury.FinancialAccount.restricted_features[]` + +## 15.5.0 - 2024-08-01 +* [#1727](https://github.com/stripe/stripe-php/pull/1727) Update generated code + * Add support for new resources `Billing.AlertTriggered` and `Billing.Alert` + * Add support for new value `charge_exceeds_transaction_limit` on enum `StripeError.code` + * Add support for new value `billing.alert.triggered` on enum `Event.type` + +## 15.4.0 - 2024-07-25 +* [#1726](https://github.com/stripe/stripe-php/pull/1726) Update generated code + * Add support for `update` method on resource `Checkout.Session` + * Add support for new values `invoice.overdue` and `invoice.will_be_due` on enum `Event.type` + * Add support for `twint` on `PaymentMethodConfiguration` + +## 15.3.0 - 2024-07-18 +* [#1724](https://github.com/stripe/stripe-php/pull/1724) Update generated code + * Add support for new value `issuing_dispute.funds_rescinded` on enum `Event.type` + * Add support for new value `stripe_s700` on enum `Terminal.Reader.device_type` +* [#1722](https://github.com/stripe/stripe-php/pull/1722) Update changelog + +## 15.2.0 - 2024-07-11 +* [#1721](https://github.com/stripe/stripe-php/pull/1721) Update generated code + * ⚠️ Remove support for values `billing_policy_remote_function_response_invalid`, `billing_policy_remote_function_timeout`, `billing_policy_remote_function_unexpected_status_code`, and `billing_policy_remote_function_unreachable` from enum `StripeError.code`. + * ⚠️ Remove support for value `payment_intent_fx_quote_invalid` from enum `StripeError.code`. The was mistakenly released last week. + * Add support for `payment_method_options` on `ConfirmationToken` + +## 15.1.0 - 2024-07-05 +* [#1718](https://github.com/stripe/stripe-php/pull/1718) Update generated code + * Add support for `add_lines`, `remove_lines`, and `update_lines` methods on resource `Invoice` + * Add support for new value `payment_intent_fx_quote_invalid` on enum `StripeError.code` + * Add support for new values `multibanco`, `twint`, and `zip` on enum `PaymentLink.payment_method_types[]` + * Add support for `posted_at` on `Tax.Transaction` + * Add support for `reboot_window` on `Terminal.Configuration` + +## 15.0.0 - 2024-06-24 +* [#1714](https://github.com/stripe/stripe-php/pull/1714) + + This release changes the pinned API version to 2024-06-20. Please read the [API Changelog](https://docs.stripe.com/changelog/2024-06-20) and carefully review the API changes before upgrading. + + ### ⚠️ Breaking changes + + * Remove the unused resource `PlatformTaxFee` + * Remove the protected method `_searchResource` on resources Charge, Customer, Invoice, PaymentIntent, Price, Product, and Subscription as it is no longer used. + + ### Additions + + * Add support for `finalize_amount` test helper method on resource `Issuing.Authorization` + * Add support for `fleet` and `fuel` on `Issuing.Authorization` + * Add support for new value `ch_uid` on enum `TaxId.type` + +## 14.10.0 - 2024-06-13 +* [#1706](https://github.com/stripe/stripe-php/pull/1706) Update generated code + * Add support for `multibanco` on `PaymentMethodConfiguration` and `PaymentMethod` + * Add support for `twint` on `PaymentMethod` + * Add support for new values `multibanco` and `twint` on enum `PaymentMethod.type` + * Add support for `invoice_settings` on `Subscription` + * Add support for new value `de_stn` on enum `TaxId.type` + +## 14.9.0 - 2024-05-30 +* [#1702](https://github.com/stripe/stripe-php/pull/1702) Update generated code + * Add support for new values `issuing_personalization_design.activated`, `issuing_personalization_design.deactivated`, `issuing_personalization_design.rejected`, and `issuing_personalization_design.updated` on enum `Event.type` +* [#1701](https://github.com/stripe/stripe-php/pull/1701) Added PHPDocs for `create`, `update`, `delete`, `all`, `retrieve` methods after moving them out of traits. +* [#1700](https://github.com/stripe/stripe-php/pull/1700) Add optional appInfo to StripeClient config + * `StripeClient` can now accept `$appInfo` as a `$config` option, so AppInfo can be set per-client. If not passed in, will fall back on the global AppInfo set by `Stripe::setAppInfo()`. + * The config expects `$appInfo` to be of type `array{name: string, version?: string, url?: string, partner_id?: string}` + +## 14.8.0 - 2024-05-23 +* [#1698](https://github.com/stripe/stripe-php/pull/1698) Update generated code + * Add support for new value `terminal_reader_invalid_location_for_payment` on enum `StripeError.code` +* [#1697](https://github.com/stripe/stripe-php/pull/1697) Rename section for object type generation + +## 14.7.0 - 2024-05-16 +* [#1694](https://github.com/stripe/stripe-php/pull/1694) Update generated code + * Add support for `fee_source` on `ApplicationFee` + * Add support for `loss_reason` on `Issuing.Dispute` + * Add support for `application_fee_amount` and `application_fee` on `Payout` + * Add support for `stripe_s700` on `Terminal.Configuration` + +## 14.6.0 - 2024-05-09 +* [#1692](https://github.com/stripe/stripe-php/pull/1692) Update generated code + * Add support for `update` test helper method on resources `Treasury.OutboundPayment` and `Treasury.OutboundTransfer` + * Add support for new values `treasury.outbound_payment.tracking_details_updated` and `treasury.outbound_transfer.tracking_details_updated` on enum `Event.type` + * Add support for `allow_redisplay` on `PaymentMethod` + * Add support for `tracking_details` on `Treasury.OutboundPayment` and `Treasury.OutboundTransfer` + +## 14.5.0 - 2024-05-02 +* [#1688](https://github.com/stripe/stripe-php/pull/1688) Update generated code + * Add support for new value `shipping_address_invalid` on enum `StripeError.code` + * Add support for `ship_from_details` on `Tax.Calculation` and `Tax.Transaction` + +## 14.4.0 - 2024-04-25 +* [#1684](https://github.com/stripe/stripe-php/pull/1684) Update generated code + * Change type of `Entitlements.ActiveEntitlement.feature` from `string` to `expandable($Entitlements.Feature)` + * Add support for `mobilepay` on `PaymentMethodConfiguration` + +## 14.3.0 - 2024-04-18 +* [#1681](https://github.com/stripe/stripe-php/pull/1681) Update generated code + * Add support for `create_preview` method on resource `Invoice` + * Add support for `saved_payment_method_options` on `Checkout.Session` +* [#1682](https://github.com/stripe/stripe-php/pull/1682) Added @throws to autoPagingIterator. Fixes [#1678](https://github.com/stripe/stripe-php/issues/1678) + +## 14.2.0 - 2024-04-16 +* [#1680](https://github.com/stripe/stripe-php/pull/1680) Update generated code + * Add support for new resource `Entitlements.ActiveEntitlementSummary` + * Add support for new value `entitlements.active_entitlement_summary.updated` on enum `Event.type` + * Remove support for `config` on `Forwarding.Request`. This field is no longer used by the Forwarding Request API. + * Add support for `swish` on `PaymentMethodConfiguration` + +## 14.1.0 - 2024-04-11 +* [#1677](https://github.com/stripe/stripe-php/pull/1677) Update generated code + * Add support for new values `billing_policy_remote_function_response_invalid`, `billing_policy_remote_function_timeout`, `billing_policy_remote_function_unexpected_status_code`, and `billing_policy_remote_function_unreachable` on enum `StripeError.code` + * Change type of `Billing.MeterEventAdjustment.cancel` from `BillingMeterResourceBillingMeterEventAdjustmentCancel` to `nullable(BillingMeterResourceBillingMeterEventAdjustmentCancel)` + * Add support for `amazon_pay` on `PaymentMethodConfiguration` and `PaymentMethod` + * Add support for new value `amazon_pay` on enum `PaymentMethod.type` + * Add support for new values `bh_vat`, `kz_bin`, `ng_tin`, and `om_vat` on enum `TaxId.type` + +## 14.0.0 - 2024-04-10 +* [#1673](https://github.com/stripe/stripe-php/pull/1673) + + * This release changes the pinned API version to `2024-04-10`. Please read the [API Changelog](https://docs.stripe.com/changelog/2024-04-10) and carefully review the API changes before upgrading. + + ### ⚠️ Breaking changes + + * Rename `features` to `marketing_features` on `Product` + * Do not force resolution to IPv4 - Forcing IPv4 was causing hard-to-understand failures for users in IPv6-only environments. If you want to force IPv4 yourself, you can do so by telling the API client to use a CurlClient other than the default + ```php + $curl = new \Stripe\HttpClient\CurlClient([ + CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4 + ]); + \Stripe\ApiRequestor::setHttpClient($curl); + ``` + + #### ⚠️ Removal of enum values, properties and events that are no longer part of the publicly documented Stripe API + + * Remove the below deprecated values on the enum `BalanceTransaction.Type` + * `obligation_inbound` + * `obligation_payout` + * `obligation_payout_failure` + * `obligation_reversal_outbound` + * Remove the deprecated value `various` on the enum `Climate.Supplier.RemovalPathway` + * Remove deprecated events + * `invoiceitem.updated` + * `order.created` + * `recipient.created` + * `recipient.deleted` + * `recipient.updated` + * `sku.created` + * `sku.deleted` + * `sku.updated` + * Remove the deprecated value `service_tax` on the enum `TaxRate.TaxType` + * Remove support for `id_bank_transfer`, `multibanco`, `netbanking`, `pay_by_bank`, and `upi` on `PaymentMethodConfiguration` + * Remove the legacy field `rendering_options` in `Invoice`. Use `rendering` instead. + +## 13.18.0 - 2024-04-09 +* [#1675](https://github.com/stripe/stripe-php/pull/1675) Update generated code + * Add support for new resources `Entitlements.ActiveEntitlement` and `Entitlements.Feature` + * Add support for `all` and `retrieve` methods on resource `ActiveEntitlement` + * Add support for `all`, `create`, `retrieve`, and `update` methods on resource `Feature` + * Add support for new value `none` on enum `Account.type` + * Add support for `cancel`, `event_name`, and `type` on `Billing.MeterEventAdjustment` + +## 13.17.0 - 2024-04-04 +* [#1670](https://github.com/stripe/stripe-php/pull/1670) Update generated code + * Add support for `subscription_item` on `Discount` + * Add support for `email` and `phone` on `Identity.VerificationReport` + * Add support for `verification_flow` on `Identity.VerificationReport` and `Identity.VerificationSession` + * Add support for new value `verification_flow` on enums `Identity.VerificationReport.type` and `Identity.VerificationSession.type` + * Add support for `provided_details` on `Identity.VerificationSession` + * Change type of `Invoice.discounts` from `nullable(array(expandable(deletable($Discount))))` to `array(expandable(deletable($Discount)))` + * Add support for `zip` on `PaymentMethodConfiguration` + * Add support for `discounts` on `SubscriptionItem` and `Subscription` + * Add support for new value `mobile_phone_reader` on enum `Terminal.Reader.device_type` + +## 13.16.0 - 2024-03-28 +* [#1666](https://github.com/stripe/stripe-php/pull/1666) Update generated code + * Add support for new resources `Billing.MeterEventAdjustment`, `Billing.MeterEvent`, and `Billing.Meter` + * Add support for `all`, `create`, `deactivate`, `reactivate`, `retrieve`, and `update` methods on resource `Meter` + * Add support for `create` method on resources `MeterEventAdjustment` and `MeterEvent` + * Add support for `meter` on `Plan` + +## 13.15.0 - 2024-03-21 +* [#1664](https://github.com/stripe/stripe-php/pull/1664) Update generated code + * Add support for new resources `ConfirmationToken` and `Forwarding.Request` + * Add support for `retrieve` method on resource `ConfirmationToken` + * Add support for `all`, `create`, and `retrieve` methods on resource `Request` + * Add support for new values `forwarding_api_inactive`, `forwarding_api_invalid_parameter`, `forwarding_api_upstream_connection_error`, and `forwarding_api_upstream_connection_timeout` on enum `StripeError.code` + * Add support for `mobilepay` on `PaymentMethod` + * Add support for new value `mobilepay` on enum `PaymentMethod.type` + * Add support for `name` on `Terminal.Configuration` + +## 13.14.0 - 2024-03-14 +* [#1660](https://github.com/stripe/stripe-php/pull/1660) Update generated code + * Add support for new resources `Issuing.PersonalizationDesign` and `Issuing.PhysicalBundle` + * Add support for `all`, `create`, `retrieve`, and `update` methods on resource `PersonalizationDesign` + * Add support for `all` and `retrieve` methods on resource `PhysicalBundle` + * Add support for `personalization_design` on `Issuing.Card` + +## 13.13.0 - 2024-02-29 +* [#1654](https://github.com/stripe/stripe-php/pull/1654) Update generated code + * Change type of `Identity.VerificationSession.type` from `nullable(enum('document'|'id_number'))` to `enum('document'|'id_number')` + * Add resources `Application`, `ConnectCollectionTransfer`, `PlatformTaxFee`, `ReserveTransaction`, `SourceMandateNotification`, and `TaxDeductedAtSource`. These classes have no methods on them, and are used to provide more complete types for PHPDocs. +* [#1657](https://github.com/stripe/stripe-php/pull/1657) Update readme to use addBetaVersion + +## 13.12.0 - 2024-02-22 +* [#1651](https://github.com/stripe/stripe-php/pull/1651) Update generated code + * Add support for `client_reference_id` on `Identity.VerificationReport` and `Identity.VerificationSession` + * Remove support for value `service_tax` from enum `TaxRate.tax_type` +* [#1650](https://github.com/stripe/stripe-php/pull/1650) Add TaxIds API + * Add support for `all`, `create`, `delete`, and `retrieve` methods on resource `TaxId` + * The `instanceUrl` function on `TaxId` now returns the top-level `/v1/tax_ids/{id}` path instead of the `/v1/customers/{customer}/tax_ids/{id}` path. + +## 13.11.0 - 2024-02-15 +* [#1639](https://github.com/stripe/stripe-php/pull/1639) Update generated code + * Add support for `networks` on `Card` + * Add support for new value `financial_connections.account.refreshed_ownership` on enum `Event.type` +* [#1648](https://github.com/stripe/stripe-php/pull/1648) Remove broken methods on CustomerCashBalanceTransaction + * Bugfix: remove support for `CustomerCashBalanceTransaction::all` and `CustomerCashBalanceTransaction::retrieve`. These methods were included in the library unintentionally and never functioned. +* [#1647](https://github.com/stripe/stripe-php/pull/1647) Fix \Stripe\Tax\Settings::update +* [#1646](https://github.com/stripe/stripe-php/pull/1646) Add more specific PHPDoc and Psalm type for RequestOptions arrays on services + +## 13.10.0 - 2024-02-01 +* [#1636](https://github.com/stripe/stripe-php/pull/1636) Update generated code + * Add support for new value `swish` on enum `PaymentLink.payment_method_types[]` + * Add support for `swish` on `PaymentMethod` + * Add support for new value `swish` on enum `PaymentMethod.type` + * Add support for `jurisdiction_level` on `TaxRate` + * Change type of `Terminal.Reader.status` from `string` to `enum('offline'|'online')` +* [#1633](https://github.com/stripe/stripe-php/pull/1633) Update generated code + * Add support for `issuer` on `Invoice` + * Add support for `customer_balance` on `PaymentMethodConfiguration` +* [#1630](https://github.com/stripe/stripe-php/pull/1630) Add paginated requests helper function and use in Search and All + +## 13.9.0 - 2024-01-12 +* [#1629](https://github.com/stripe/stripe-php/pull/1629) Update generated code + * Add support for new resource `CustomerSession` + * Add support for `create` method on resource `CustomerSession` + * Remove support for values `obligation_inbound`, `obligation_payout_failure`, `obligation_payout`, and `obligation_reversal_outbound` from enum `BalanceTransaction.type` + * Add support for `billing_cycle_anchor_config` on `Subscription` + +## 13.8.0 - 2024-01-04 +* [#1627](https://github.com/stripe/stripe-php/pull/1627) Update generated code + * Add support for `retrieve` method on resource `Tax.Registration` + +## 13.7.0 - 2023-12-22 +* [#1621](https://github.com/stripe/stripe-php/pull/1621) Update generated code + * Add support for new resource `FinancialConnections.Transaction` + * Add support for `all` and `retrieve` methods on resource `Transaction` + * Add support for `subscribe` and `unsubscribe` methods on resource `FinancialConnections.Account` + * Add support for new value `financial_connections.account.refreshed_transactions` on enum `Event.type` + * Add support for `subscriptions` and `transaction_refresh` on `FinancialConnections.Account` + * Add support for new value `transactions` on enum `FinancialConnections.Session.prefetch[]` + * Add support for `revolut_pay` on `PaymentMethodConfiguration` + * Remove support for `id_bank_transfer`, `multibanco`, `netbanking`, `pay_by_bank`, and `upi` on `PaymentMethodConfiguration` + * Change type of `Quote.invoice_settings` from `nullable(InvoiceSettingQuoteSetting)` to `InvoiceSettingQuoteSetting` + * Add support for `destination_details` on `Refund` + +## 13.6.0 - 2023-12-07 +* [#1613](https://github.com/stripe/stripe-php/pull/1613) Update generated code + * Add support for new values `customer_tax_location_invalid` and `financial_connections_no_successful_transaction_refresh` on enum `StripeError.code` + * Add support for new values `payment_network_reserve_hold` and `payment_network_reserve_release` on enum `BalanceTransaction.type` + * Remove support for value `various` from enum `Climate.Supplier.removal_pathway` + * Add support for `inactive_message` and `restrictions` on `PaymentLink` +* [#1612](https://github.com/stripe/stripe-php/pull/1612) Report usage of .save and StripeClient + * Reports uses of the deprecated `.save` and of `StripeClient` in `X-Stripe-Client-Telemetry`. (You can disable telemetry via `\Stripe\Stripe::setEnableTelemetry(false);`, see the [README](https://github.com/stripe/stripe-php/blob/master/README.md#telemetry).) + +## 13.5.0 - 2023-11-30 +* [#1611](https://github.com/stripe/stripe-php/pull/1611) Update generated code + * Add support for new resources `Climate.Order`, `Climate.Product`, and `Climate.Supplier` + * Add support for `all`, `cancel`, `create`, `retrieve`, and `update` methods on resource `Order` + * Add support for `all` and `retrieve` methods on resources `Product` and `Supplier` + * Add support for new value `financial_connections_account_inactive` on enum `StripeError.code` + * Add support for new values `climate_order_purchase` and `climate_order_refund` on enum `BalanceTransaction.type` + * Add support for new values `climate.order.canceled`, `climate.order.created`, `climate.order.delayed`, `climate.order.delivered`, `climate.order.product_substituted`, `climate.product.created`, and `climate.product.pricing_updated` on enum `Event.type` + +## 13.4.0 - 2023-11-21 +* [#1608](https://github.com/stripe/stripe-php/pull/1608) Update generated code + Add support for `transferred_to_balance` to `CustomerCashBalanceTransaction` +* [#1605](https://github.com/stripe/stripe-php/pull/1605) Update generated code + * Add support for `network_data` on `Issuing.Transaction` + +## 13.3.0 - 2023-11-09 +* [#1603](https://github.com/stripe/stripe-php/pull/1603) Update generated code + * Add support for new value `terminal_reader_hardware_fault` on enum `StripeError.code` + +## 13.2.1 - 2023-11-06 +* [#1602](https://github.com/stripe/stripe-php/pull/1602) Fix error when "id" is not a string. + +## 13.2.0 - 2023-11-02 +* [#1599](https://github.com/stripe/stripe-php/pull/1599) Update generated code + * Add support for new resource `Tax.Registration` + * Add support for `all`, `create`, and `update` methods on resource `Registration` + * Add support for new value `token_card_network_invalid` on enum `StripeError.code` + * Add support for new value `payment_unreconciled` on enum `BalanceTransaction.type` + * Add support for `revolut_pay` on `PaymentMethod` + * Add support for new value `revolut_pay` on enum `PaymentMethod.type` + +## 13.1.0 - 2023-10-26 +* [#1595](https://github.com/stripe/stripe-php/pull/1595) Update generated code + * Add support for new value `balance_invalid_parameter` on enum `StripeError.code` + +## 13.0.0 - 2023-10-16 +* This release changes the pinned API version to `2023-10-16`. Please read the [API Changelog](https://docs.stripe.com/changelog/2023-10-16) and carefully review the API changes before upgrading `stripe-php` package. +* [#1593](https://github.com/stripe/stripe-php/pull/1593) Update generated code + - Added `additional_tos_acceptances` field on `Person` + +## 12.8.0 - 2023-10-16 +* [#1590](https://github.com/stripe/stripe-php/pull/1590) Update generated code + * Add support for new values `issuing_token.created` and `issuing_token.updated` on enum `Event.type` + +## 12.7.0 - 2023-10-11 +* [#1589](https://github.com/stripe/stripe-php/pull/1589) Update generated code + * Add support for `client_secret`, `redirect_on_completion`, `return_url`, and `ui_mode` on `Checkout.Session` + * Add support for `offline` on `Terminal.Configuration` + +## 12.6.0 - 2023-10-05 +* [#1586](https://github.com/stripe/stripe-php/pull/1586) Update generated code + * Add support for new resource `Issuing.Token` + * Add support for `all`, `retrieve`, and `update` methods on resource `Token` + * Add support for `token` on `Issuing.Authorization` and `Issuing.Transaction` +* [#1569](https://github.com/stripe/stripe-php/pull/1569) Fix: Do not bother removing `friendsofphp/php-cs-fixer` + +## 12.5.0 - 2023-09-28 +* [#1582](https://github.com/stripe/stripe-php/pull/1582) Generate Discount, SourceTransaction and use sections in more places +* [#1584](https://github.com/stripe/stripe-php/pull/1584) Update generated code + * Add support for `rendering` on `Invoice` + +## 12.4.0 - 2023-09-21 +* [#1579](https://github.com/stripe/stripe-php/pull/1579) Update generated code + * Add back constant for `invoiceitem.updated` webhook event. This was mistakenly removed in v12.2.0. +* [#1566](https://github.com/stripe/stripe-php/pull/1566) Fix: Remove `squizlabs/php_codesniffer` +* [#1568](https://github.com/stripe/stripe-php/pull/1568) Enhancement: Reference `phpunit.xsd` as installed with `composer` +* [#1565](https://github.com/stripe/stripe-php/pull/1565) Enhancement: Use PHP 8.2 as leading PHP version + +## 12.3.0 - 2023-09-14 +* [#1577](https://github.com/stripe/stripe-php/pull/1577) Update generated code + * Add support for new resource `PaymentMethodConfiguration` + * Add support for `all`, `create`, `retrieve`, and `update` methods on resource `PaymentMethodConfiguration` + * Add support for `payment_method_configuration_details` on `Checkout.Session`, `PaymentIntent`, and `SetupIntent` +* [#1573](https://github.com/stripe/stripe-php/pull/1573) Update generated code + * Add support for `capture`, `create`, `expire`, `increment`, and `reverse` test helper methods on resource `Issuing.Authorization` + * Add support for `create_force_capture`, `create_unlinked_refund`, and `refund` test helper methods on resource `Issuing.Transaction` + * Add support for new value `stripe_tax_inactive` on enum `StripeError.code` + +## 12.2.0 - 2023-09-07 +* [#1571](https://github.com/stripe/stripe-php/pull/1571) Update generated code + * Add support for new resource `PaymentMethodDomain` + * Add support for `all`, `create`, `retrieve`, `update`, and `validate` methods on resource `PaymentMethodDomain` + * Add support for new values `treasury.credit_reversal.created`, `treasury.credit_reversal.posted`, `treasury.debit_reversal.completed`, `treasury.debit_reversal.created`, `treasury.debit_reversal.initial_credit_granted`, `treasury.financial_account.closed`, `treasury.financial_account.created`, `treasury.financial_account.features_status_updated`, `treasury.inbound_transfer.canceled`, `treasury.inbound_transfer.created`, `treasury.inbound_transfer.failed`, `treasury.inbound_transfer.succeeded`, `treasury.outbound_payment.canceled`, `treasury.outbound_payment.created`, `treasury.outbound_payment.expected_arrival_date_updated`, `treasury.outbound_payment.failed`, `treasury.outbound_payment.posted`, `treasury.outbound_payment.returned`, `treasury.outbound_transfer.canceled`, `treasury.outbound_transfer.created`, `treasury.outbound_transfer.expected_arrival_date_updated`, `treasury.outbound_transfer.failed`, `treasury.outbound_transfer.posted`, `treasury.outbound_transfer.returned`, `treasury.received_credit.created`, `treasury.received_credit.failed`, `treasury.received_credit.succeeded`, and `treasury.received_debit.created` on enum `Event.type` + * Remove support for value `invoiceitem.updated` from enum `Event.type` + * Add support for `features` on `Product` + +## 12.1.0 - 2023-08-31 +* [#1560](https://github.com/stripe/stripe-php/pull/1560) Update generated code + * Add support for new resource `AccountSession` + * Add support for `create` method on resource `AccountSession` + * Add support for new values `obligation_inbound`, `obligation_outbound`, `obligation_payout_failure`, `obligation_payout`, `obligation_reversal_inbound`, and `obligation_reversal_outbound` on enum `BalanceTransaction.type` + * Change type of `Event.type` from `string` to `enum` + * Add support for `application` on `PaymentLink` +* [#1562](https://github.com/stripe/stripe-php/pull/1562) Nicer ApiErrorException::__toString() +* [#1558](https://github.com/stripe/stripe-php/pull/1558) Update generated code + * Add support for `payment_method_details` on `Dispute` + * Add support for `prefetch` on `FinancialConnections.Session` + +## 12.0.0 - 2023-08-18 +**⚠️ ACTION REQUIRED: the breaking change in this release likely affects you ⚠️** + +### Version pinning + +In this release, Stripe API Version `2023-08-16` (the latest at time of release) will be sent by default on all requests. This is a significant change with wide ramifications. The API version affects the properties you see on responses, the parameters you are allowed to send on requests, and so on. The previous default was to use your [Stripe account's default API version](https://stripe.com/docs/development/dashboard/request-logs#view-your-default-api-version). + +To successfully upgrade to stripe-php v12, you must either + +1. **(Recommended) Upgrade your integration to be compatible with API Version `2023-08-16`.** + + Please read the API Changelog carefully for each API Version from `2023-08-16` back to your [Stripe account's default API version](https://stripe.com/docs/development/dashboard/request-logs#view-your-default-api-version). Determine if you are using any of the APIs that have changed in a breaking way, and adjust your integration accordingly. Carefully test your changes with Stripe [Test Mode](https://stripe.com/docs/keys#test-live-modes) before deploying them to production. + + You can read the [v12 migration guide](https://github.com/stripe/stripe-php/wiki/Migration-guide-for-v12) for more detailed instructions. +2. **(Alternative option) Specify a version other than `2023-08-16` when initializing `stripe-php`.** + + If you were previously initializing stripe-php without an explicit API Version, you can postpone modifying your integration by specifying a version equal to your [Stripe account's default API version](https://stripe.com/docs/development/dashboard/request-logs#view-your-default-api-version). For example: + + ```diff + // if using StripeClient + - $stripe = new \Stripe\StripeClient('sk_test_xyz'); + + $stripe = new \Stripe\StripeClient([ + + 'api_key' => 'sk_test_xyz', + 'stripe_version' => '2020-08-27', + + ]); + + // if using the global client + Stripe.apiKey = "sk_test_xyz"; + + Stripe::setApiVersion('2020-08-27'); + ``` + + If you were already initializing stripe-php with an explicit API Version, upgrading to v12 will not affect your integration. + + Read the [v12 migration guide](https://github.com/stripe/stripe-php/wiki/Migration-guide-for-v12) for more details. + + Going forward, each major release of this library will be *pinned* by default to the latest Stripe API Version at the time of release. + + That is, instead of upgrading stripe-php and separately upgrading your Stripe API Version through the Stripe Dashboard, whenever you upgrade major versions of stripe-php, you should also upgrade your integration to be compatible with the latest Stripe API version. + +### Other changes +" ⚠️" symbol highlights breaking changes. +* [#1553](https://github.com/stripe/stripe-php/pull/1553)⚠️ Remove deprecated enum value `Invoice.STATUS_DELETE` + +* [#1550](https://github.com/stripe/stripe-php/pull/1550) PHPDoc changes + * Remove support for `alternate_statement_descriptors`, `destination`, and `dispute` on `Charge` + * Remove support for value `charge_refunded` from enum `Dispute.status` + * Remove support for `rendering` on `Invoice` + * Remove support for `attributes`, `caption`, and `deactivate_on` on `Product` + +## 11.0.0 - 2023-08-16 +Please do not use stripe-php v11. It did not correctly apply the [pinning behavior](https://github.com/stripe/stripe-php/blob/master/CHANGELOG.md#version-pinning) and was removed from packagist + +## 10.21.0 - 2023-08-10 +* [#1546](https://github.com/stripe/stripe-php/pull/1546) Update generated code + * Add support for new value `payment_reversal` on enum `BalanceTransaction.type` + * Add support for new value `adjusted_for_overdraft` on enum `CustomerBalanceTransaction.type` + +## 10.20.0 - 2023-08-03 +* [#1539](https://github.com/stripe/stripe-php/pull/1539) Update generated code + * Add support for `subscription_details` on `Invoice` + * Add support for new values `sepa_debit_fingerprint` and `us_bank_account_fingerprint` on enum `Radar.ValueList.item_type` + +## 10.19.0 - 2023-07-27 +* [#1534](https://github.com/stripe/stripe-php/pull/1534) Update generated code + * Improve PHPDoc type for `ApplicationFee.refunds` + * Add support for `deleted` on `Apps.Secret` +* [#1526](https://github.com/stripe/stripe-php/pull/1526) Add constants for payment intent cancellation reasons +* [#1533](https://github.com/stripe/stripe-php/pull/1533) Update generated code + * Add support for new value `service_tax` on enum `TaxRate.tax_type` +* [#1487](https://github.com/stripe/stripe-php/pull/1487) PHPDoc: use union of literals for $method parameter throughout + +## 10.18.0 - 2023-07-20 +* [#1533](https://github.com/stripe/stripe-php/pull/1533) Update generated code + * Add support for new value `service_tax` on enum `TaxRate.tax_type` +* [#1526](https://github.com/stripe/stripe-php/pull/1526) Add constants for payment intent cancellation reasons +* [#1487](https://github.com/stripe/stripe-php/pull/1487) PHPDoc: use union of literals for $method parameter throughout + +## 10.17.0 - 2023-07-13 +* [#1525](https://github.com/stripe/stripe-php/pull/1525) Update generated code + * Add support for new resource `Tax.Settings` + * Add support for `retrieve` and `update` methods on resource `Settings` + * Add support for new value `invalid_tax_location` on enum `StripeError.code` + * Add support for `product` on `Tax.TransactionLineItem` + * Add constant for `tax.settings.updated` webhook event +* [#1520](https://github.com/stripe/stripe-php/pull/1520) Update generated code + * Release specs are identical. + +## 10.16.0 - 2023-06-29 +* [#1517](https://github.com/stripe/stripe-php/pull/1517) Update generated code + * Add support for new value `application_fees_not_allowed` on enum `StripeError.code` + * Add support for `effective_at` on `CreditNote` and `Invoice` + * Add support for `on_behalf_of` on `Mandate` +* [#1514](https://github.com/stripe/stripe-php/pull/1514) Update generated code + * Release specs are identical. +* [#1512](https://github.com/stripe/stripe-php/pull/1512) Update generated code + * Change type of `Checkout.Session.success_url` from `string` to `nullable(string)` + +## 10.15.0 - 2023-06-08 +* [#1506](https://github.com/stripe/stripe-php/pull/1506) Update generated code + * Add support for `preferred_locales` on `Issuing.Cardholder` + +## 10.14.0 - 2023-05-25 +* [#1503](https://github.com/stripe/stripe-php/pull/1503) Update generated code + * Add support for `zip` on `PaymentMethod` + * Add support for new value `zip` on enum `PaymentMethod.type` +* [#1502](https://github.com/stripe/stripe-php/pull/1502) Generate error codes +* [#1501](https://github.com/stripe/stripe-php/pull/1501) Update generated code + +* [#1499](https://github.com/stripe/stripe-php/pull/1499) Update generated code + * Add support for new values `amusement_tax` and `communications_tax` on enum `TaxRate.tax_type` + +## 10.13.0 - 2023-05-11 +* [#1490](https://github.com/stripe/stripe-php/pull/1490) Update generated code + * Add support for `paypal` on `PaymentMethod` + * Add support for `effective_percentage` on `TaxRate` +* [#1488](https://github.com/stripe/stripe-php/pull/1488) Increment PHPStan to strictness level 2 +* [#1483](https://github.com/stripe/stripe-php/pull/1483) Update generated code + +* [#1480](https://github.com/stripe/stripe-php/pull/1480) Update generated code + * Change type of `Identity.VerificationSession.options` from `VerificationSessionOptions` to `nullable(VerificationSessionOptions)` + * Change type of `Identity.VerificationSession.type` from `enum('document'|'id_number')` to `nullable(enum('document'|'id_number'))` +* [#1478](https://github.com/stripe/stripe-php/pull/1478) Update generated code + * Release specs are identical. +* [#1475](https://github.com/stripe/stripe-php/pull/1475) Update generated code + + +## 10.12.1 - 2023-04-04 +* [#1473](https://github.com/stripe/stripe-php/pull/1473) Update generated code + * Add back `deleted` from `Invoice.status`. + +## 10.12.0 - 2023-03-30 +* [#1470](https://github.com/stripe/stripe-php/pull/1470) Update generated code + * Remove support for `create` method on resource `Tax.Transaction` + * This is not a breaking change, as this method was deprecated before the Tax Transactions API was released in favor of the `createFromCalculation` method. + * Remove support for value `deleted` from enum `Invoice.status` + * This is not a breaking change, as the value was never returned or accepted as input. +* [#1468](https://github.com/stripe/stripe-php/pull/1468) Trigger workflow for tags +* [#1467](https://github.com/stripe/stripe-php/pull/1467) Update generated code (new) + * Release specs are identical. + +## 10.11.0 - 2023-03-23 +* [#1458](https://github.com/stripe/stripe-php/pull/1458) Update generated code + * Add support for new resources `Tax.CalculationLineItem`, `Tax.Calculation`, `Tax.TransactionLineItem`, and `Tax.Transaction` + * Add support for `create` and `list_line_items` methods on resource `Calculation` + * Add support for `create_from_calculation`, `create_reversal`, `create`, `list_line_items`, and `retrieve` methods on resource `Transaction` + * Add support for `currency_conversion` on `Checkout.Session` + * Add support for new value `automatic_async` on enum `PaymentIntent.capture_method` + * Add support for new value `link` on enum `PaymentLink.payment_method_types[]` + * Add support for `automatic_payment_methods` on `SetupIntent` + +## 10.10.0 - 2023-03-16 +* [#1457](https://github.com/stripe/stripe-php/pull/1457) API Updates + * Add support for `future_requirements` and `requirements` on `BankAccount` + * Add support for new value `automatic_async` on enum `PaymentIntent.capture_method` + * Add support for new value `cashapp` on enum `PaymentLink.payment_method_types[]` + * Add support for `cashapp` on `PaymentMethod` + * Add support for new value `cashapp` on enum `PaymentMethod.type` +* [#1454](https://github.com/stripe/stripe-php/pull/1454) Update generated code (new) + * Add support for new value `cashapp` on enum `PaymentLink.payment_method_types[]` + * Add support for `cashapp` on `PaymentMethod` + * Add support for new value `cashapp` on enum `PaymentMethod.type` + +## 10.9.1 - 2023-03-14 +* [#1453](https://github.com/stripe/stripe-php/pull/1453) Restore StripeClient.getService + +## 10.9.0 - 2023-03-09 +* [#1450](https://github.com/stripe/stripe-php/pull/1450) API Updates + * Add support for `cancellation_details` on `Subscription` + * Fix return types on custom methods (extends https://github.com/stripe/stripe-php/pull/1446) + +* [#1446](https://github.com/stripe/stripe-php/pull/1446) stripe->customers->retrievePaymentMethod returns the wrong class (type hint) + +## 10.8.0 - 2023-03-02 +* [#1447](https://github.com/stripe/stripe-php/pull/1447) API Updates + * Add support for `reconciliation_status` on `Payout` + * Add support for new value `lease_tax` on enum `TaxRate.tax_type` + +## 10.7.0 - 2023-02-23 +* [#1444](https://github.com/stripe/stripe-php/pull/1444) API Updates + * Add support for new value `igst` on enum `TaxRate.tax_type` + +## 10.6.1 - 2023-02-21 +* [#1443](https://github.com/stripe/stripe-php/pull/1443) Remove init.php from the list of ignored files + +## 10.6.0 - 2023-02-16 +* [#1441](https://github.com/stripe/stripe-php/pull/1441) API Updates + * Add support for `refund_payment` method on resource `Terminal.Reader` + * Add support for `custom_fields` on `Checkout.Session` and `PaymentLink` +* [#1236](https://github.com/stripe/stripe-php/pull/1236) subscription_proration_date not always presented in Invoice +* [#1431](https://github.com/stripe/stripe-php/pull/1431) Fix: Do not use unbounded version constraint for `actions/checkout` +* [#1436](https://github.com/stripe/stripe-php/pull/1436) Enhancement: Enable and configure `visibility_required` fixer +* [#1432](https://github.com/stripe/stripe-php/pull/1432) Enhancement: Update `actions/cache` +* [#1434](https://github.com/stripe/stripe-php/pull/1434) Fix: Remove parentheses +* [#1433](https://github.com/stripe/stripe-php/pull/1433) Enhancement: Run tests on PHP 8.2 +* [#1438](https://github.com/stripe/stripe-php/pull/1438) Update .gitattributes + +## 10.5.0 - 2023-02-02 +* [#1439](https://github.com/stripe/stripe-php/pull/1439) API Updates + * Add support for `resume` method on resource `Subscription` + * Add support for `amount_shipping` and `shipping_cost` on `CreditNote` and `Invoice` + * Add support for `shipping_details` on `Invoice` + * Add support for `invoice_creation` on `PaymentLink` + * Add support for `trial_settings` on `Subscription` + * Add support for new value `paused` on enum `Subscription.status` + +## 10.4.0 - 2023-01-19 +* [#1381](https://github.com/stripe/stripe-php/pull/1381) Add getService methods to StripeClient and AbstractServiceFactory to allow mocking +* [#1424](https://github.com/stripe/stripe-php/pull/1424) API Updates + + * Added `REFUND_CREATED`, `REFUND_UPDATED` event definitions. +* [#1426](https://github.com/stripe/stripe-php/pull/1426) Ignore PHP version for formatting +* [#1425](https://github.com/stripe/stripe-php/pull/1425) Fix Stripe::setAccountId parameter type +* [#1418](https://github.com/stripe/stripe-php/pull/1418) Switch to mb_convert_encoding to fix utf8_encode deprecation warning + +## 10.3.0 - 2022-12-22 +* [#1413](https://github.com/stripe/stripe-php/pull/1413) API Updates + Change `CheckoutSession.cancel_url` to be nullable. + +## 10.2.0 - 2022-12-15 +* [#1411](https://github.com/stripe/stripe-php/pull/1411) API Updates + * Add support for new value `invoice_overpaid` on enum `CustomerBalanceTransaction.type` +* [#1407](https://github.com/stripe/stripe-php/pull/1407) API Updates + + +## 10.1.0 - 2022-12-06 +* [#1405](https://github.com/stripe/stripe-php/pull/1405) API Updates + * Add support for `flow` on `BillingPortal.Session` +* [#1404](https://github.com/stripe/stripe-php/pull/1404) API Updates + * Remove support for resources `Order` and `Sku` + * Remove support for `all`, `cancel`, `create`, `list_line_items`, `reopen`, `retrieve`, `submit`, and `update` methods on resource `Order` + * Remove support for `all`, `create`, `delete`, `retrieve`, and `update` methods on resource `Sku` + * Add support for `custom_text` on `Checkout.Session` and `PaymentLink` + * Add support for `invoice_creation` and `invoice` on `Checkout.Session` + * Remove support for `product` on `LineItem` + * Add support for `latest_charge` on `PaymentIntent` + * Remove support for `charges` on `PaymentIntent` + +## 10.0.0 - 2022-11-16 +* [#1392](https://github.com/stripe/stripe-php/pull/1392) Next major release changes + +Breaking changes that arose during code generation of the library that we postponed for the next major version. For changes to the Stripe products, read more at https://docs.stripe.com/changelog/2022-11-15. + +"⚠️" symbol highlights breaking changes. + +### Deprecated +* [#1382](https://github.com/stripe/stripe-php/pull/1382) Mark `resource.save` as deprecated. Prefer the static update method that doesn't require retrieval of the resource to update it. +```PHP +// before +$resource = Price::retrieve(self::TEST_RESOURCE_ID); +$resource->metadata['key'] = 'value'; +$resource->save(); + +// after +$resource = Price::update('price_123', [ + 'metadata' => ['key' => 'value'], +]); +``` + +### ⚠️ Removed +- [#1377](https://github.com/stripe/stripe-php/pull/1377) Removed deprecated `Sku` resource and service +- [#1375](https://github.com/stripe/stripe-php/pull/1375) Removed deprecated `Orders` resource and service +- [#1375](https://github.com/stripe/stripe-php/pull/1375) Removed deprecated `Product` field from the `LineItem` +- [#1388](https://github.com/stripe/stripe-php/pull/1388) Removed deprecated `AlipayAccount` resource +- [#1396](https://github.com/stripe/stripe-php/pull/1396) Removed `charges` field on `PaymentIntent` and replace it with `latest_charge`. + + +## 9.9.0 - 2022-11-08 +* [#1394](https://github.com/stripe/stripe-php/pull/1394) API Updates + * Add support for new values `eg_tin`, `ph_tin`, and `tr_tin` on enum `TaxId.type` +* [#1389](https://github.com/stripe/stripe-php/pull/1389) API Updates + * Add support for `on_behalf_of` on `Subscription` +* [#1379](https://github.com/stripe/stripe-php/pull/1379) Do not run Coveralls in PR-s + +## 9.8.0 - 2022-10-20 +* [#1383](https://github.com/stripe/stripe-php/pull/1383) API Updates + * Add support for new values `jp_trn` and `ke_pin` on enum `TaxId.type` +* [#1293](https://github.com/stripe/stripe-php/pull/1293) Install deps in the install step of CI +* [#1291](https://github.com/stripe/stripe-php/pull/1291) Fix: Configure finder for `friendsofphp/php-cs-fixer` + +## 9.7.0 - 2022-10-13 +* [#1376](https://github.com/stripe/stripe-php/pull/1376) API Updates + * Add support for `network_data` on `Issuing.Authorization` +* [#1374](https://github.com/stripe/stripe-php/pull/1374) Add request_log_url on ErrorObject +* [#1370](https://github.com/stripe/stripe-php/pull/1370) API Updates + * Add support for `created` on `Checkout.Session` + +## 9.6.0 - 2022-09-15 +* [#1365](https://github.com/stripe/stripe-php/pull/1365) API Updates + * Add support for `from_invoice` and `latest_revision` on `Invoice` + * Add support for new value `pix` on enum `PaymentLink.payment_method_types[]` + * Add support for `pix` on `PaymentMethod` + * Add support for new value `pix` on enum `PaymentMethod.type` + * Add support for `created` on `Treasury.CreditReversal` and `Treasury.DebitReversal` + +## 9.5.0 - 2022-09-06 +* [#1364](https://github.com/stripe/stripe-php/pull/1364) API Updates + * Add support for new value `terminal_reader_splashscreen` on enum `File.purpose` +* [#1363](https://github.com/stripe/stripe-php/pull/1363) chore: Update PHP tests to handle search methods. + +## 9.4.0 - 2022-08-26 +* [#1362](https://github.com/stripe/stripe-php/pull/1362) API Updates + * Add support for `login_page` on `BillingPortal.Configuration` +* [#1360](https://github.com/stripe/stripe-php/pull/1360) Add test coverage using Coveralls +* [#1361](https://github.com/stripe/stripe-php/pull/1361) fix: Fix type hints for error objects. + * Update `Invoice.last_finalization_error`, `PaymentIntent.last_payment_error`, `SetupAttempt.setup_error` and `SetupIntent.setup_error` type to be `StripeObject`. + * Addresses https://github.com/stripe/stripe-php/issues/1353. The library today does not actually return a `ErrorObject` for these fields, so the type annotation was incorrect. +* [#1356](https://github.com/stripe/stripe-php/pull/1356) Add beta readme.md section + +## 9.3.0 - 2022-08-23 +* [#1355](https://github.com/stripe/stripe-php/pull/1355) API Updates + * Change type of `Treasury.OutboundTransfer.destination_payment_method` from `string` to `string | null` + * Change the return type of `CustomerService.fundCashBalance` test helper from `CustomerBalanceTransaction` to `CustomerCashBalanceTransaction`. + * This would generally be considered a breaking change, but we've worked with all existing users to migrate and are comfortable releasing this as a minor as it is solely a test helper method. This was essentially broken prior to this change. + +## 9.2.0 - 2022-08-19 +* [#1352](https://github.com/stripe/stripe-php/pull/1352) API Updates + * Add support for new resource `CustomerCashBalanceTransaction` + * Add support for `currency` on `PaymentLink` + * Add constant for `customer_cash_balance_transaction.created` webhook event. +* [#1351](https://github.com/stripe/stripe-php/pull/1351) Add a support section to the readme +* [#1304](https://github.com/stripe/stripe-php/pull/1304) Allow passing PSR-3 loggers to setLogger as they are compatible + +## 9.1.0 - 2022-08-11 +* [#1348](https://github.com/stripe/stripe-php/pull/1348) API Updates + * Add support for `payment_method_collection` on `Checkout.Session` and `PaymentLink` + +* [#1346](https://github.com/stripe/stripe-php/pull/1346) API Updates + * Add support for `expires_at` on `Apps.Secret` + +## 9.0.0 - 2022-08-02 + +Breaking changes that arose during code generation of the library that we postponed for the next major version. For changes to the SDK, read more detailed description at https://github.com/stripe/stripe-php/wiki/Migration-guide-for-v9. For changes to the Stripe products, read more at https://docs.stripe.com/changelog/2022-08-01. + +"⚠️" symbol highlights breaking changes. + +* [#1344](https://github.com/stripe/stripe-php/pull/1344) API Updates +* [#1337](https://github.com/stripe/stripe-php/pull/1337) API Updates +* [#1273](https://github.com/stripe/stripe-php/pull/1273) Add some PHPDoc return types and fixes +* [#1341](https://github.com/stripe/stripe-php/pull/1341) Next major release changes + +### Added +* Add `alternate_statement_descriptors`, `authorization_code`, and `level3` properties to `Charge` resource. +* Add `previewLines` method to `CreditNote` resource. +* Add `transfer_data` property to `Subscription` resource. +* Add `SOURCE_TYPE_FPX` constant to `Transfer` resource. +* Add new error code constants to `ErrorObject`. +* Add support for `shipping_cost` and `shipping_details` on `Checkout.Session` + +### ⚠️ Changed +* Updated certificate bundle ([#1314](https://github.com/stripe/stripe-php/pull/1314)) +* Add `params` parameter to `close` method in `Dispute` resource. + +### ⚠️ Removed +* Remove deprecated `AlipayAccount`, `BitcoinReceiver`, `BitcoinTransaction`, `Recipient`, `RecipientTransfer`, and `ThreeDSecure` resources. +* Remove `CAPABILITY_CARD_PAYMENTS`, `CAPABILITY_LEGACY_PAYMENTS`, `CAPABILITY_PLATFORM_PAYMENTS`, `CAPABILITY_TRANSFERS`, `CAPABILITY_STATUS_ACTIVE`, `CAPABILITY_STATUS_INACTIVE`, and `CAPABILITY_STATUS_PENDING` constants from `Account` resource. Please use up-to-date values from https://stripe.com/docs/connect/account-capabilities. +* Remove `AssociatedObjects` array property from `EphemeralKey` resource. The field was undocumented and unsupported. +* Remove `details` method from `Card` resource. The endpoint was deprecated and no longer exists. +* Remove `recipient` property from `Card` resource. The property was deprecated. +* Remove ability to list `Card` resources for a particular `Recipient`. +* Remove `sources` property from `Card` resource. The property was deprecated. +* Remove `FAILURE_REASON` constant from `Refund` resource. The value was deprecated. +* Remove `Recipient` resource. The resource was deprecated. +* Remove `OrderItem` resource. The resource was deprecated. +* Remove `all` method from `LineItem`. +* Remove `cancel` method from `Transfer` and `TransferService`. This method is deprecated. +* Remove `allTransactions` method from `SourceService` service. Please use `allSourceTransactions` method instead. +* Remove `persons` method from `Account` resource. Please use `allPersons` method instead. +* Remove `sourceTransactions` method from `Source` resource. Please use `allSourceTransactions` method instead. +* Remove `usageRecordSummaries` method from `SubscriptionItem` resource. Please use `allUsageRecordSummaries` method instead. +* Remove `SOURCE_TYPE_ALIPAY_ACCOUNT` and `SOURCE_TYPE_FINANCING` constants from `Transfer` resource. The values were deprecated and are no longer in use. +* Remove deprecated error code constants from `ErrorObject`: `CODE_ACCOUNT_ALREADY_EXISTS`, `CODE_ORDER_CREATION_FAILED`, `CODE_ORDER_REQUIRED_SETTINGS`, `CODE_ORDER_STATUS_INVALID`, `CODE_ORDER_UPSTREAM_TIMEOUT`, and `CODE_UPSTREAM_ORDER_CREATION_FAILED`. +* Remove deprecated event constants from `Webhook`: `ISSUER_FRAUD_RECORD_CREATED`, ` ORDER_PAYMENT_FAILED`, `ORDER_PAYMENT_SUCCEEDED`, `ORDER_UPDATED`, `ORDER_RETURN_CREATED`, `PAYMENT_METHOD_CARD_AUTOMATICALLY_UPDATED`, `PING`, `PROMOTION_CODE_DELETED`, and `TREASURY_RECEIVED_CREDIT_REVERSED`. The events are deprecated and no longer sent by Stripe. + +## 8.12.0 - 2022-07-25 +* [#1332](https://github.com/stripe/stripe-php/pull/1332) API Updates + * Add support for `default_currency` and `invoice_credit_balance` on `Customer` + + +## 8.11.0 - 2022-07-18 +* [#1324](https://github.com/stripe/stripe-php/pull/1324) API Updates + * Add support for new value `blik` on enum `PaymentLink.payment_method_types[]` + * Add support for `blik` on `PaymentMethod` + * Add support for new value `blik` on enum `PaymentMethod.type` + * Add `Invoice.upcomingLines` method. + * Add `SourceService.allSourceTransactions` method. +* [#1322](https://github.com/stripe/stripe-php/pull/1322) API Updates + * Change type of `source_type` on `Transfer` from nullable string to string (comment-only change) + +## 8.10.0 - 2022-07-07 +* [#1319](https://github.com/stripe/stripe-php/pull/1319) API Updates + * Add support for `currency_options` on `Coupon` and `Price` + * Add support for `currency` on `Subscription` +* [#1318](https://github.com/stripe/stripe-php/pull/1318) API Updates + * Add support for new values financial_connections.account.created, financial_connections.account.deactivated, financial_connections.account.disconnected, financial_connections.account.reactivated, and financial_connections.account.refreshed_balance on `Event`. + +## 8.9.0 - 2022-06-29 +* [#1316](https://github.com/stripe/stripe-php/pull/1316) API Updates + * Add support for `deliver_card`, `fail_card`, `return_card`, and `ship_card` test helper methods on resource `Issuing.Card` + * Add support for `subtotal_excluding_tax` on `CreditNote` and `Invoice` + * Add support for `amount_excluding_tax` and `unit_amount_excluding_tax` on `CreditNoteLineItem` and `InvoiceLineItem` + * Add support for `total_excluding_tax` on `Invoice` + * Change type of `PaymentLink.payment_method_types[]` from `literal('card')` to `enum` + * Add support for `promptpay` on `PaymentMethod` + * Add support for new value `promptpay` on enum `PaymentMethod.type` + * Add support for `hosted_regulatory_receipt_url` and `reversal_details` on `Treasury.ReceivedCredit` and `Treasury.ReceivedDebit` + +## 8.8.0 - 2022-06-23 +* [#1302](https://github.com/stripe/stripe-php/pull/1302) API Updates + * Add support for `custom_unit_amount` on `Price` +* [#1301](https://github.com/stripe/stripe-php/pull/1301) API Updates + + Documentation updates. + +## 8.7.0 - 2022-06-17 +* [#1306](https://github.com/stripe/stripe-php/pull/1306) API Updates + * Add support for `fund_cash_balance` test helper method on resource `Customer` + * Add support for `total_excluding_tax` on `CreditNote` + * Add support for `rendering_options` on `Invoice` +* [#1307](https://github.com/stripe/stripe-php/pull/1307) Support updating pre-release versions +* [#1305](https://github.com/stripe/stripe-php/pull/1305) Trigger workflows on beta branches +* [#1302](https://github.com/stripe/stripe-php/pull/1302) API Updates + * Add support for `custom_unit_amount` on `Price` +* [#1301](https://github.com/stripe/stripe-php/pull/1301) API Updates + + Documentation updates. + +## 8.6.0 - 2022-06-08 +* [#1300](https://github.com/stripe/stripe-php/pull/1300) API Updates + * Add support for `attach_to_self` and `flow_directions` on `SetupAttempt` + +## 8.5.0 - 2022-06-01 +* [#1298](https://github.com/stripe/stripe-php/pull/1298) API Updates + * Add support for `radar_options` on `Charge` and `PaymentMethod` + * Add support for new value `simulated_wisepos_e` on enum `Terminal.Reader.device_type` + +## 8.4.0 - 2022-05-26 +* [#1296](https://github.com/stripe/stripe-php/pull/1296) API Updates + * Add support for `persons` method on resource `Account` + * Add support for `balance_transactions` method on resource `Customer` + * Add support for `id_number_secondary_provided` on `Person` +* [#1295](https://github.com/stripe/stripe-php/pull/1295) API Updates + + +## 8.3.0 - 2022-05-23 +* [#1294](https://github.com/stripe/stripe-php/pull/1294) API Updates + * Add support for new resource `Apps.Secret` + * Add support for `affirm` and `link` on `PaymentMethod` + * Add support for new values `affirm` and `link` on enum `PaymentMethod.type` +* [#1289](https://github.com/stripe/stripe-php/pull/1289) fix: Update RequestOptions#redactedApiKey to stop exploding null. + +## 8.2.0 - 2022-05-19 +* [#1286](https://github.com/stripe/stripe-php/pull/1286) API Updates + * Add support for new resources `Treasury.CreditReversal`, `Treasury.DebitReversal`, `Treasury.FinancialAccountFeatures`, `Treasury.FinancialAccount`, `Treasury.FlowDetails`, `Treasury.InboundTransfer`, `Treasury.OutboundPayment`, `Treasury.OutboundTransfer`, `Treasury.ReceivedCredit`, `Treasury.ReceivedDebit`, `Treasury.TransactionEntry`, and `Treasury.Transaction` + * Add support for `retrieve_payment_method` method on resource `Customer` + * Add support for `all` and `list_owners` methods on resource `FinancialConnections.Account` + * Add support for `treasury` on `Issuing.Authorization`, `Issuing.Dispute`, and `Issuing.Transaction` + * Add support for `financial_account` on `Issuing.Card` + * Add support for `client_secret` on `Order` + * Add support for `attach_to_self` and `flow_directions` on `SetupIntent` + +## 8.1.0 - 2022-05-11 +* [#1284](https://github.com/stripe/stripe-php/pull/1284) API Updates + * Add support for `consent_collection`, `customer_creation`, `payment_intent_data`, `shipping_options`, `submit_type`, and `tax_id_collection` on `PaymentLink` + * Add support for `description` on `Subscription` + +## 8.0.0 - 2022-05-09 +* [#1283](https://github.com/stripe/stripe-php/pull/1283) Major version release of v8.0.0. The [migration guide](https://github.com/stripe/stripe-php/wiki/Migration-Guide-for-v8) contains more information. + (⚠️ = breaking changes): + * ⚠️ Replace the legacy `Order` API with the new `Order` API. + * Resource modified: `Order`. + * New methods: `cancel`, `list_line_items`, `reopen`, and `submit` + * Removed methods: `pay` and `return_order` + * Removed resources: `OrderItem` and `OrderReturn` + * Removed references from other resources: `Charge.order` + * ⚠️ Rename `\FinancialConnections\Account.refresh` method to `\FinancialConnections\Account.refresh_account` + * Add support for `amount_discount`, `amount_tax`, and `product` on `LineItem` + +## 7.128.0 - 2022-05-05 +* [#1282](https://github.com/stripe/stripe-php/pull/1282) API Updates + * Add support for `default_price` on `Product` + * Add support for `instructions_email` on `Refund` + + +## 7.127.0 - 2022-05-05 +* [#1281](https://github.com/stripe/stripe-php/pull/1281) API Updates + * Add support for new resources `FinancialConnections.AccountOwner`, `FinancialConnections.AccountOwnership`, `FinancialConnections.Account`, and `FinancialConnections.Session` +* [#1278](https://github.com/stripe/stripe-php/pull/1278) Pin setup-php action version. +* [#1277](https://github.com/stripe/stripe-php/pull/1277) API Updates + * Add support for `registered_address` on `Person` + +## 7.126.0 - 2022-05-03 +* [#1276](https://github.com/stripe/stripe-php/pull/1276) API Updates + * Add support for new resource `CashBalance` + * Change type of `BillingPortal.Configuration.application` from `$Application` to `deletable($Application)` + * Add support for `cash_balance` on `Customer` + * Add support for `application` on `Invoice`, `Quote`, `SubscriptionSchedule`, and `Subscription` + * Add support for new value `eu_oss_vat` on enum `TaxId.type` +* [#1274](https://github.com/stripe/stripe-php/pull/1274) Fix PHPDoc on Discount for nullable properties +* [#1272](https://github.com/stripe/stripe-php/pull/1272) Allow users to pass a custom IPRESOLVE cURL option. + +## 7.125.0 - 2022-04-21 +* [#1270](https://github.com/stripe/stripe-php/pull/1270) API Updates + * Add support for `expire` test helper method on resource `Refund` + +## 7.124.0 - 2022-04-18 +* [#1265](https://github.com/stripe/stripe-php/pull/1265) API Updates + * Add support for new resources `FundingInstructions` and `Terminal.Configuration` + * Add support for `create_funding_instructions` method on resource `Customer` + * Add support for `amount_details` on `PaymentIntent` + * Add support for `customer_balance` on `PaymentMethod` + * Add support for new value `customer_balance` on enum `PaymentMethod.type` + * Add support for `configuration_overrides` on `Terminal.Location` + + +## 7.123.0 - 2022-04-13 +* [#1263](https://github.com/stripe/stripe-php/pull/1263) API Updates + * Add support for `increment_authorization` method on resource `PaymentIntent` +* [#1262](https://github.com/stripe/stripe-php/pull/1262) Add support for updating the version of the repo +* [#1230](https://github.com/stripe/stripe-php/pull/1230) Add PHPDoc return types +* [#1242](https://github.com/stripe/stripe-php/pull/1242) Fix some PHPDoc in tests + +## 7.122.0 - 2022-04-08 +* [#1261](https://github.com/stripe/stripe-php/pull/1261) API Updates + * Add support for `apply_customer_balance` method on resource `PaymentIntent` +* [#1259](https://github.com/stripe/stripe-php/pull/1259) API Updates + + * Add `payment_intent.partially_funded`, `terminal.reader.action_failed`, and `terminal.reader.action_succeeded` events. + +## 7.121.0 - 2022-03-30 +* [#1258](https://github.com/stripe/stripe-php/pull/1258) API Updates + * Add support for `cancel_action`, `process_payment_intent`, `process_setup_intent`, and `set_reader_display` methods on resource `Terminal.Reader` + * Add support for `action` on `Terminal.Reader` + +## 7.120.0 - 2022-03-29 +* [#1257](https://github.com/stripe/stripe-php/pull/1257) API Updates + * Add support for Search API + * Add support for `search` method on resources `Charge`, `Customer`, `Invoice`, `PaymentIntent`, `Price`, `Product`, and `Subscription` + +## 7.119.0 - 2022-03-25 +* [#1256](https://github.com/stripe/stripe-php/pull/1256) API Updates + * Add support for PayNow and US Bank Accounts Debits payments + * Add support for `paynow` and `us_bank_account` on `PaymentMethod` + * Add support for new values `paynow` and `us_bank_account` on enum `PaymentMethod.type` + * Add support for `failure_balance_transaction` on `Charge` + +## 7.118.0 - 2022-03-23 +* [#1255](https://github.com/stripe/stripe-php/pull/1255) API Updates + * Add support for `cancel` method on resource `Refund` + * Add support for new values `bg_uic`, `hu_tin`, and `si_tin` on enum `TaxId.type` + * Add `test_helpers.test_clock.advancing`, `test_helpers.test_clock.created`, `test_helpers.test_clock.deleted`, `test_helpers.test_clock.internal_failure`, and `test_helpers.test_clock.ready` events. + + +## 7.117.0 - 2022-03-18 +* [#1254](https://github.com/stripe/stripe-php/pull/1254) API Updates + * Add support for `status` on `Card` +* [#1251](https://github.com/stripe/stripe-php/pull/1251) Add support for SearchResult objects. +* [#1249](https://github.com/stripe/stripe-php/pull/1249) Add missing constant for payment_behavior + +## 7.116.0 - 2022-03-02 +* [#1248](https://github.com/stripe/stripe-php/pull/1248) API Updates + * Add support for `proration_details` on `InvoiceLineItem` + + +## 7.115.0 - 2022-03-01 +* [#1245](https://github.com/stripe/stripe-php/pull/1245) [#1247](https://github.com/stripe/stripe-php/pull/1247) API Updates + * Add support for new resource `TestHelpers.TestClock` + * Add support for `test_clock` on `Customer`, `Invoice`, `InvoiceItem`, `Quote`, `Subscription`, and `SubscriptionSchedule` + * Add support for `next_action` on `Refund` + * Add support for `konbini` on `PaymentMethod` +* [#1244](https://github.com/stripe/stripe-php/pull/1244) API Updates + * Add support for new values `bbpos_wisepad3` and `stripe_m2` on enum `Terminal.Reader.device_type` + +## 7.114.0 - 2022-02-15 +* [#1243](https://github.com/stripe/stripe-php/pull/1243) Add test +* [#1240](https://github.com/stripe/stripe-php/pull/1240) API Updates + * Add support for `verify_microdeposits` method on resources `PaymentIntent` and `SetupIntent` +* [#1241](https://github.com/stripe/stripe-php/pull/1241) Add generic parameter to \Stripe\Collection usages + +## 7.113.0 - 2022-02-03 +* [#1239](https://github.com/stripe/stripe-php/pull/1239) API Updates + * Add `REASON_EXPIRED_UNCAPTURED_CHARGE` enum value on `Refund`. + +## 7.112.0 - 2022-01-25 +* [#1235](https://github.com/stripe/stripe-php/pull/1235) API Updates + * Add support for `phone_number_collection` on `PaymentLink` + * Add support for new value `is_vat` on enum `TaxId.type` + + +## 7.111.0 - 2022-01-20 +* [#1233](https://github.com/stripe/stripe-php/pull/1233) API Updates + * Add support for new resource `PaymentLink` + * Add support for `payment_link` on `Checkout.Session` + +## 7.110.0 - 2022-01-13 +* [#1232](https://github.com/stripe/stripe-php/pull/1232) API Updates + * Add support for `paid_out_of_band` on `Invoice` + +## 7.109.0 - 2022-01-12 +* [#1231](https://github.com/stripe/stripe-php/pull/1231) API Updates + * Add support for `customer_creation` on `Checkout.Session` +* [#1227](https://github.com/stripe/stripe-php/pull/1227) Update docs URLs + +## 7.108.0 - 2021-12-22 +* [#1226](https://github.com/stripe/stripe-php/pull/1226) Upgrade php-cs-fixer to 3.4.0. +* [#1222](https://github.com/stripe/stripe-php/pull/1222) API Updates + * Add support for `processing` on `PaymentIntent` +* [#1220](https://github.com/stripe/stripe-php/pull/1220) API Updates + +## 7.107.0 - 2021-12-09 +* [#1219](https://github.com/stripe/stripe-php/pull/1219) API Updates + * Add support for `metadata` on `BillingPortal.Configuration` + * Add support for `wallets` on `Issuing.Card` + +## 7.106.0 - 2021-12-09 +* [#1218](https://github.com/stripe/stripe-php/pull/1218) API Updates + * Add support for new values `ge_vat` and `ua_vat` on enum `TaxId.type` +* [#1216](https://github.com/stripe/stripe-php/pull/1216) Fix namespaced classes in @return PHPDoc. +* [#1214](https://github.com/stripe/stripe-php/pull/1214) Announce PHP8 support in CHANGELOG.md + +## 7.105.0 - 2021-12-06 +* [#1213](https://github.com/stripe/stripe-php/pull/1213) PHP 8.1 missing ReturnTypeWillChange annotations. +* As of this version, PHP 8.1 is officially supported. + +## 7.104.0 - 2021-12-01 +* [#1211](https://github.com/stripe/stripe-php/pull/1211) PHPStan compatibility with PHP8.x +* [#1209](https://github.com/stripe/stripe-php/pull/1209) PHPUnit compatibility with PHP 8.x + +## 7.103.0 - 2021-11-19 +* [#1206](https://github.com/stripe/stripe-php/pull/1206) API Updates + * Add support for new value `jct` on enum `TaxRate.tax_type` + +## 7.102.0 - 2021-11-17 +* [#1205](https://github.com/stripe/stripe-php/pull/1205) API Updates + * Add support for `automatic_payment_methods` on `PaymentIntent` + +## 7.101.0 - 2021-11-16 +* [#1203](https://github.com/stripe/stripe-php/pull/1203) API Updates + * Add support for new resource `ShippingRate` + * Add support for `shipping_options` and `shipping_rate` on `Checkout.Session` + * Add support for `expire` method on resource `Checkout.Session` + * Add support for `status` on `Checkout.Session` + +## 7.100.0 - 2021-10-11 +* [#1190](https://github.com/stripe/stripe-php/pull/1190) API Updates + * Add support for `klarna` on `PaymentMethod`. + +## 7.99.0 - 2021-10-11 +* [#1188](https://github.com/stripe/stripe-php/pull/1188) API Updates + * Add support for `list_payment_methods` method on resource `Customer` + +## 7.98.0 - 2021-10-07 +* [#1187](https://github.com/stripe/stripe-php/pull/1187) API Updates + * Add support for `phone_number_collection` on `Checkout.Session` + * Add support for new value `customer_id` on enum `Radar.ValueList.item_type` + * Add support for new value `bbpos_wisepos_e` on enum `Terminal.Reader.device_type` + +## 7.97.0 - 2021-09-16 +* [#1181](https://github.com/stripe/stripe-php/pull/1181) API Updates + * Add support for `full_name_aliases` on `Person` + +## 7.96.0 - 2021-09-15 +* [#1178](https://github.com/stripe/stripe-php/pull/1178) API Updates + * Add support for livemode on Reporting.ReportType + * Add support for new value `rst` on enum `TaxRate.tax_type` + +## 7.95.0 - 2021-09-01 +* [#1177](https://github.com/stripe/stripe-php/pull/1177) API Updates + * Add support for `future_requirements` on `Account`, `Capability`, and `Person` + * Add support for `after_expiration`, `consent`, `consent_collection`, `expires_at`, and `recovered_from` on `Checkout.Session` + +## 7.94.0 - 2021-08-19 +* [#1173](https://github.com/stripe/stripe-php/pull/1173) API Updates + * Add support for new value `fil` on enum `Checkout.Session.locale` + * Add support for new value `au_arn` on enum `TaxId.type` + +## 7.93.0 - 2021-08-11 +* [#1172](https://github.com/stripe/stripe-php/pull/1172) API Updates + * Add support for `locale` on `BillingPortal.Session` + +* [#1171](https://github.com/stripe/stripe-php/pull/1171) Fix typo in docblock `CurlClient::executeStreamingRequestWithRetries` + +## 7.92.0 - 2021-07-28 +* [#1167](https://github.com/stripe/stripe-php/pull/1167) API Updates + * Add support for `account_type` on `BankAccount` + * Add support for new value `redacted` on enum `Review.closed_reason` + +## 7.91.0 - 2021-07-22 +* [#1164](https://github.com/stripe/stripe-php/pull/1164) API Updates + * Add support for new values `hr`, `ko`, and `vi` on enum `Checkout.Session.locale` + * Add support for `payment_settings` on `Subscription` + +## 7.90.0 - 2021-07-20 +* [#1163](https://github.com/stripe/stripe-php/pull/1163) API Updates + * Add support for `wallet` on `Issuing.Transaction` +* [#1160](https://github.com/stripe/stripe-php/pull/1160) Remove unused API error types from docs. + +## 7.89.0 - 2021-07-14 +* [#1158](https://github.com/stripe/stripe-php/pull/1158) API Updates + * Add support for `list_computed_upfront_line_items` method on resource `Quote` +* [#1157](https://github.com/stripe/stripe-php/pull/1157) Improve readme for old PHP versions + +## 7.88.0 - 2021-07-09 +* [#1152](https://github.com/stripe/stripe-php/pull/1152) API Updates + * Add support for new resource `Quote` + * Add support for `quote` on `Invoice` + * Add support for new value `quote_accept` on enum `Invoice.billing_reason` +* [#1155](https://github.com/stripe/stripe-php/pull/1155) Add streaming methods to Service infra + * Add support for `setStreamingHttpClient` and `streamingHttpClient` to `ApiRequestor` + * Add support for `getStreamingClient` and `requestStream` to `AbstractService` + * Add support for `requestStream` to `BaseStripeClient` + * `\Stripe\RequestOptions::parse` now clones its input if it is already a `RequestOptions` object, to prevent accidental mutation. +* [#1151](https://github.com/stripe/stripe-php/pull/1151) Add `mode` constants into Checkout\Session + +## 7.87.0 - 2021-06-30 +* [#1149](https://github.com/stripe/stripe-php/pull/1149) API Updates + * Add support for `wechat_pay` on `PaymentMethod` +* [#1143](https://github.com/stripe/stripe-php/pull/1143) Streaming requests +* [#1138](https://github.com/stripe/stripe-php/pull/1138) Deprecate travis + +## 7.86.0 - 2021-06-25 +* [#1145](https://github.com/stripe/stripe-php/pull/1145) API Updates + * Add support for `boleto` on `PaymentMethod`. + * Add support for `il_vat` as a member of the `TaxID.Type` enum. + +## 7.85.0 - 2021-06-18 +* [#1142](https://github.com/stripe/stripe-php/pull/1142) API Updates + * Add support for new TaxId types: `ca_pst_mb`, `ca_pst_bc`, `ca_gst_hst`, and `ca_pst_sk`. + +## 7.84.0 - 2021-06-16 +* [#1141](https://github.com/stripe/stripe-php/pull/1141) Update PHPDocs + * Add support for `url` on `Checkout\Session` + + +## 7.83.0 - 2021-06-07 +* [#1140](https://github.com/stripe/stripe-php/pull/1140) API Updates + * Added support for `tax_id_collection` on `Checkout\Session` and `Checkout\Session#create` + * Update `Location` to be expandable on `Terminal\Reader` + +## 7.82.0 - 2021-06-04 +* [#1136](https://github.com/stripe/stripe-php/pull/1136) Update PHPDocs + * Add support for `controller` on `Account`. + +## 7.81.0 - 2021-06-04 +* [#1135](https://github.com/stripe/stripe-php/pull/1135) API Updates + * Add support for new resource `TaxCode` + * Add support for `automatic_tax` `Invoice` and`Checkout.Session`. + * Add support for `tax_behavior` on `Price` + * Add support for `tax_code` on `Product` + * Add support for `tax` on `Customer` + * Add support for `tax_type` enum on `TaxRate` + +## 7.80.0 - 2021-05-26 +* [#1130](https://github.com/stripe/stripe-php/pull/1130) Update PHPDocs + +## 7.79.0 - 2021-05-19 +* [#1126](https://github.com/stripe/stripe-php/pull/1126) API Updates + * Added support for new resource `Identity.VerificationReport` + * Added support for new resource `Identity.VerificationSession` + * `File#list.purpose` and `File.purpose` added new enum members: `identity_document_downloadable` and `selfie`. + +## 7.78.0 - 2021-05-05 +* [#1120](https://github.com/stripe/stripe-php/pull/1120) Update PHPDocs + * Add support for `Radar.EarlyFraudWarning.payment_intent` + +## 7.77.0 - 2021-04-12 +* [#1110](https://github.com/stripe/stripe-php/pull/1110) Update PHPDocs + * Add support for `acss_debit` on `PaymentMethod` + * Add support for `payment_method_options` on `Checkout\Session` +* [#1107](https://github.com/stripe/stripe-php/pull/1107) Remove duplicate object phpdoc + +## 7.76.0 - 2021-03-22 +* [#1100](https://github.com/stripe/stripe-php/pull/1100) Update PHPDocs + * Added support for `amount_shipping` on `Checkout.Session.total_details` +* [#1088](https://github.com/stripe/stripe-php/pull/1088) Make possibility to extend CurlClient + +## 7.75.0 - 2021-02-22 +* [#1094](https://github.com/stripe/stripe-php/pull/1094) Add support for Billing Portal Configuration API + +## 7.74.0 - 2021-02-17 +* [#1093](https://github.com/stripe/stripe-php/pull/1093) Update PHPDocs + * Add support for on_behalf_of to Invoice + +## 7.73.0 - 2021-02-16 +* [#1091](https://github.com/stripe/stripe-php/pull/1091) Update PHPDocs + * Add support for `afterpay_clearpay` on `PaymentMethod`. + +## 7.72.0 - 2021-02-08 +* [#1089](https://github.com/stripe/stripe-php/pull/1089) Update PHPDocs + * Add support for `afterpay_clearpay_payments` on `Account.capabilities` + * Add support for `payment_settings` on `Invoice` + +## 7.71.0 - 2021-02-05 +* [#1087](https://github.com/stripe/stripe-php/pull/1087) Update PHPDocs +* [#1086](https://github.com/stripe/stripe-php/pull/1086) Update CA cert bundle URL + +## 7.70.0 - 2021-02-03 +* [#1085](https://github.com/stripe/stripe-php/pull/1085) Update PHPDocs + * Add support for `nationality` on `Person` + * Add member `gb_vat` of `TaxID` enum + + +## 7.69.0 - 2021-01-21 +* [#1079](https://github.com/stripe/stripe-php/pull/1079) Update PHPDocs + +## 7.68.0 - 2021-01-14 +* [#1063](https://github.com/stripe/stripe-php/pull/1063) Multiple API changes +* [#1061](https://github.com/stripe/stripe-php/pull/1061) Bump phpDocumentor to 3.0.0 + +## 7.67.0 - 2020-12-09 +* [#1060](https://github.com/stripe/stripe-php/pull/1060) Improve PHPDocs for `Discount` +* [#1059](https://github.com/stripe/stripe-php/pull/1059) Upgrade PHPStan to 0.12.59 +* [#1057](https://github.com/stripe/stripe-php/pull/1057) Bump PHP-CS-Fixer and update code + +## 7.66.1 - 2020-12-01 +* [#1054](https://github.com/stripe/stripe-php/pull/1054) Improve error message for invalid keys in StripeClient + +## 7.66.0 - 2020-11-24 +* [#1053](https://github.com/stripe/stripe-php/pull/1053) Update PHPDocs + +## 7.65.0 - 2020-11-19 +* [#1050](https://github.com/stripe/stripe-php/pull/1050) Added constants for `proration_behavior` on `Subscription` + +## 7.64.0 - 2020-11-18 +* [#1049](https://github.com/stripe/stripe-php/pull/1049) Update PHPDocs + +## 7.63.0 - 2020-11-17 +* [#1048](https://github.com/stripe/stripe-php/pull/1048) Update PHPDocs +* [#1046](https://github.com/stripe/stripe-php/pull/1046) Force IPv4 resolving + +## 7.62.0 - 2020-11-09 +* [#1041](https://github.com/stripe/stripe-php/pull/1041) Add missing constants on `Event` +* [#1038](https://github.com/stripe/stripe-php/pull/1038) Update PHPDocs + +## 7.61.0 - 2020-10-20 +* [#1030](https://github.com/stripe/stripe-php/pull/1030) Add support for `jp_rn` and `ru_kpp` as a `type` on `TaxId` + +## 7.60.0 - 2020-10-15 +* [#1027](https://github.com/stripe/stripe-php/pull/1027) Warn if opts are in params + +## 7.58.0 - 2020-10-14 +* [#1026](https://github.com/stripe/stripe-php/pull/1026) Add support for the Payout Reverse API + +## 7.57.0 - 2020-09-29 +* [#1020](https://github.com/stripe/stripe-php/pull/1020) Add support for the `SetupAttempt` resource and List API + +## 7.56.0 - 2020-09-25 +* [#1019](https://github.com/stripe/stripe-php/pull/1019) Update PHPDocs + +## 7.55.0 - 2020-09-24 +* [#1018](https://github.com/stripe/stripe-php/pull/1018) Multiple API changes + * Updated PHPDocs + * Added `TYPE_CONTRIBUTION` as a constant on `BalanceTransaction` + +## 7.54.0 - 2020-09-23 +* [#1017](https://github.com/stripe/stripe-php/pull/1017) Updated PHPDoc + +## 7.53.1 - 2020-09-22 +* [#1015](https://github.com/stripe/stripe-php/pull/1015) Bugfix: don't error on systems with php_uname in disablefunctions with whitespace + +## 7.53.0 - 2020-09-21 +* [#1016](https://github.com/stripe/stripe-php/pull/1016) Updated PHPDocs + +## 7.52.0 - 2020-09-08 +* [#1010](https://github.com/stripe/stripe-php/pull/1010) Update PHPDocs + +## 7.51.0 - 2020-09-02 +* [#1007](https://github.com/stripe/stripe-php/pull/1007) Multiple API changes + * Add support for the Issuing Dispute Submit API + * Add constants for `payment_status` on Checkout `Session` +* [#1003](https://github.com/stripe/stripe-php/pull/1003) Add trim to getSignatures to allow for leading whitespace. + +## 7.50.0 - 2020-08-28 +* [#1005](https://github.com/stripe/stripe-php/pull/1005) Updated PHPDocs + +## 7.49.0 - 2020-08-19 +* [#998](https://github.com/stripe/stripe-php/pull/998) PHPDocs updated + +## 7.48.0 - 2020-08-17 +* [#997](https://github.com/stripe/stripe-php/pull/997) PHPDocs updated +* [#996](https://github.com/stripe/stripe-php/pull/996) Fixing telemetry + +## 7.47.0 - 2020-08-13 +* [#994](https://github.com/stripe/stripe-php/pull/994) Nullable balance_transactions on issuing disputes +* [#991](https://github.com/stripe/stripe-php/pull/991) Fix invalid return types in OAuthService + +## 7.46.1 - 2020-08-07 +* [#990](https://github.com/stripe/stripe-php/pull/990) PHPdoc changes + +## 7.46.0 - 2020-08-05 +* [#989](https://github.com/stripe/stripe-php/pull/989) Add support for the `PromotionCode` resource and APIs + +## 7.45.0 - 2020-07-28 +* [#981](https://github.com/stripe/stripe-php/pull/981) PHPdoc updates + +## 7.44.0 - 2020-07-20 +* [#948](https://github.com/stripe/stripe-php/pull/948) Add `first()` and `last()` functions to `Collection` + +## 7.43.0 - 2020-07-17 +* [#975](https://github.com/stripe/stripe-php/pull/975) Add support for `political_exposure` on `Person` + +## 7.42.0 - 2020-07-15 +* [#974](https://github.com/stripe/stripe-php/pull/974) Add new constants for `purpose` on `File` + +## 7.41.1 - 2020-07-15 +* [#973](https://github.com/stripe/stripe-php/pull/973) Multiple PHPDoc fixes + +## 7.41.0 - 2020-07-14 +* [#971](https://github.com/stripe/stripe-php/pull/971) Adds enum values for `billing_address_collection` on Checkout `Session` + +## 7.40.0 - 2020-07-06 +* [#964](https://github.com/stripe/stripe-php/pull/964) Add OAuthService + +## 7.39.0 - 2020-06-25 +* [#960](https://github.com/stripe/stripe-php/pull/960) Add constants for `payment_behavior` on `Subscription` + +## 7.38.0 - 2020-06-24 +* [#959](https://github.com/stripe/stripe-php/pull/959) Add multiple constants missing for `Event` + +## 7.37.2 - 2020-06-23 +* [#957](https://github.com/stripe/stripe-php/pull/957) Updated PHPDocs + +## 7.37.1 - 2020-06-11 +* [#952](https://github.com/stripe/stripe-php/pull/952) Improve PHPDoc + +## 7.37.0 - 2020-06-09 +* [#950](https://github.com/stripe/stripe-php/pull/950) Add support for `id_npwp` and `my_frp` as `type` on `TaxId` + +## 7.36.2 - 2020-06-03 +* [#946](https://github.com/stripe/stripe-php/pull/946) Update PHPDoc + +## 7.36.1 - 2020-05-28 +* [#938](https://github.com/stripe/stripe-php/pull/938) Remove extra array_keys() call. +* [#942](https://github.com/stripe/stripe-php/pull/942) fix autopagination for service methods + +## 7.36.0 - 2020-05-21 +* [#937](https://github.com/stripe/stripe-php/pull/937) Add support for `ae_trn`, `cl_tin` and `sa_vat` as `type` on `TaxId` + +## 7.35.0 - 2020-05-20 +* [#936](https://github.com/stripe/stripe-php/pull/936) Add `anticipation_repayment` as a `type` on `BalanceTransaction` + +## 7.34.0 - 2020-05-18 +* [#934](https://github.com/stripe/stripe-php/pull/934) Add support for `issuing_dispute` as a `type` on `BalanceTransaction` + +## 7.33.1 - 2020-05-15 +* [#933](https://github.com/stripe/stripe-php/pull/933) Services bugfix: convert nested null params to empty strings + +## 7.33.0 - 2020-05-14 +* [#771](https://github.com/stripe/stripe-php/pull/771) Introduce client/services API. The [migration guide](https://github.com/stripe/stripe-php/wiki/Migration-to-StripeClient-and-services-in-7.33.0) contains before & after examples of the backwards-compatible changes. + +## 7.32.1 - 2020-05-13 +* [#932](https://github.com/stripe/stripe-php/pull/932) Fix multiple PHPDoc + +## 7.32.0 - 2020-05-11 +* [#931](https://github.com/stripe/stripe-php/pull/931) Add support for the `LineItem` resource and APIs + +## 7.31.0 - 2020-05-01 +* [#927](https://github.com/stripe/stripe-php/pull/927) Add support for new tax IDs + +## 7.30.0 - 2020-04-29 +* [#924](https://github.com/stripe/stripe-php/pull/924) Add support for the `Price` resource and APIs + +## 7.29.0 - 2020-04-22 +* [#920](https://github.com/stripe/stripe-php/pull/920) Add support for the `Session` resource and APIs on the `BillingPortal` namespace + +## 7.28.1 - 2020-04-10 +* [#915](https://github.com/stripe/stripe-php/pull/915) Improve PHPdocs for many classes + +## 7.28.0 - 2020-04-03 +* [#912](https://github.com/stripe/stripe-php/pull/912) Preserve backwards compatibility for typoed `TYPE_ADJUSTEMENT` enum. +* [#911](https://github.com/stripe/stripe-php/pull/911) Codegenerated PHPDoc for nested resources +* [#902](https://github.com/stripe/stripe-php/pull/902) Update docstrings for nested resources + +## 7.27.3 - 2020-03-18 +* [#899](https://github.com/stripe/stripe-php/pull/899) Convert keys to strings in `StripeObject::toArray()` + +## 7.27.2 - 2020-03-13 +* [#894](https://github.com/stripe/stripe-php/pull/894) Multiple PHPDocs changes + +## 7.27.1 - 2020-03-03 +* [#890](https://github.com/stripe/stripe-php/pull/890) Update PHPdoc + +## 7.27.0 - 2020-02-28 +* [#889](https://github.com/stripe/stripe-php/pull/889) Add new constants for `type` on `TaxId` + +## 7.26.0 - 2020-02-26 +* [#886](https://github.com/stripe/stripe-php/pull/886) Add support for listing Checkout `Session` +* [#883](https://github.com/stripe/stripe-php/pull/883) Add PHPDoc class descriptions + +## 7.25.0 - 2020-02-14 +* [#879](https://github.com/stripe/stripe-php/pull/879) Make `\Stripe\Collection` implement `\Countable` +* [#875](https://github.com/stripe/stripe-php/pull/875) Last set of PHP-CS-Fixer updates +* [#874](https://github.com/stripe/stripe-php/pull/874) Enable php_unit_internal_class rule +* [#873](https://github.com/stripe/stripe-php/pull/873) Add support for phpDocumentor in Makefile +* [#872](https://github.com/stripe/stripe-php/pull/872) Another batch of PHP-CS-Fixer rule updates +* [#871](https://github.com/stripe/stripe-php/pull/871) Fix a few PHPDoc comments +* [#870](https://github.com/stripe/stripe-php/pull/870) More PHP-CS-Fixer tweaks + +## 7.24.0 - 2020-02-10 +* [#862](https://github.com/stripe/stripe-php/pull/862) Better PHPDoc +* [#865](https://github.com/stripe/stripe-php/pull/865) Get closer to `@PhpCsFixer` standard ruleset + +## 7.23.0 - 2020-02-05 +* [#860](https://github.com/stripe/stripe-php/pull/860) Add PHPDoc types for expandable fields +* [#858](https://github.com/stripe/stripe-php/pull/858) Use `native_function_invocation` PHPStan rule +* [#857](https://github.com/stripe/stripe-php/pull/857) Update PHPDoc on nested resources +* [#855](https://github.com/stripe/stripe-php/pull/855) PHPDoc: `StripeObject` -> `ErrorObject` where appropriate +* [#837](https://github.com/stripe/stripe-php/pull/837) Autogen diff +* [#854](https://github.com/stripe/stripe-php/pull/854) Upgrade PHPStan and fix settings +* [#850](https://github.com/stripe/stripe-php/pull/850) Yet more PHPDoc updates + +## 7.22.0 - 2020-01-31 +* [#849](https://github.com/stripe/stripe-php/pull/849) Add new constants for `type` on `TaxId` +* [#843](https://github.com/stripe/stripe-php/pull/843) Even more PHPDoc fixes +* [#841](https://github.com/stripe/stripe-php/pull/841) More PHPDoc fixes + +## 7.21.1 - 2020-01-29 +* [#840](https://github.com/stripe/stripe-php/pull/840) Update phpdocs across multiple resources. + +## 7.21.0 - 2020-01-28 +* [#839](https://github.com/stripe/stripe-php/pull/839) Add support for `TYPE_ES_CIF` on `TaxId` + +## 7.20.0 - 2020-01-23 +* [#836](https://github.com/stripe/stripe-php/pull/836) Add new type values for `TaxId` + +## 7.19.1 - 2020-01-14 +* [#831](https://github.com/stripe/stripe-php/pull/831) Fix incorrect `UnexpectedValueException` instantiation + +## 7.19.0 - 2020-01-14 +* [#830](https://github.com/stripe/stripe-php/pull/830) Add support for `CreditNoteLineItem` + +## 7.18.0 - 2020-01-13 +* [#829](https://github.com/stripe/stripe-php/pull/829) Don't call php_uname function if disabled by php.ini + +## 7.17.0 - 2020-01-08 +* [#821](https://github.com/stripe/stripe-php/pull/821) Improve PHPDoc types for `ApiErrorException.get/setJsonBody()` methods + +## 7.16.0 - 2020-01-06 +* [#826](https://github.com/stripe/stripe-php/pull/826) Rename remaining `$options` to `$opts` +* [#825](https://github.com/stripe/stripe-php/pull/825) Update PHPDoc + +## 7.15.0 - 2020-01-06 +* [#824](https://github.com/stripe/stripe-php/pull/824) Add constant `TYPE_SG_UEN` to `TaxId` + +## 7.14.2 - 2019-12-04 +* [#816](https://github.com/stripe/stripe-php/pull/816) Disable autoloader when checking for `Throwable` + +## 7.14.1 - 2019-11-26 +* [#812](https://github.com/stripe/stripe-php/pull/812) Fix invalid PHPdoc on `Subscription` + +## 7.14.0 - 2019-11-26 +* [#811](https://github.com/stripe/stripe-php/pull/811) Add support for `CreditNote` preview. + +## 7.13.0 - 2019-11-19 +* [#808](https://github.com/stripe/stripe-php/pull/808) Add support for listing lines on an Invoice directly via `Invoice::allLines()` + +## 7.12.0 - 2019-11-08 + +- [#805](https://github.com/stripe/stripe-php/pull/805) Add Source::allSourceTransactions and SubscriptionItem::allUsageRecordSummaries +- [#798](https://github.com/stripe/stripe-php/pull/798) The argument of `array_key_exists` cannot be `null` +- [#803](https://github.com/stripe/stripe-php/pull/803) Removed unwanted got + +## 7.11.0 - 2019-11-06 + +- [#797](https://github.com/stripe/stripe-php/pull/797) Add support for reverse pagination + +## 7.10.0 - 2019-11-05 + +- [#795](https://github.com/stripe/stripe-php/pull/795) Add support for `Mandate` + +## 7.9.0 - 2019-11-05 + +- [#794](https://github.com/stripe/stripe-php/pull/794) Add PHPDoc to `ApiResponse` +- [#792](https://github.com/stripe/stripe-php/pull/792) Use single quotes for `OBJECT_NAME` constants + +## 7.8.0 - 2019-11-05 + +- [#790](https://github.com/stripe/stripe-php/pull/790) Mark nullable fields in PHPDoc +- [#788](https://github.com/stripe/stripe-php/pull/788) Early codegen fixes +- [#787](https://github.com/stripe/stripe-php/pull/787) Use PHPStan in Travis CI + +## 7.7.1 - 2019-10-25 + +- [#781](https://github.com/stripe/stripe-php/pull/781) Fix telemetry header +- [#780](https://github.com/stripe/stripe-php/pull/780) Contributor Convenant + +## 7.7.0 - 2019-10-23 + +- [#776](https://github.com/stripe/stripe-php/pull/776) Add `CAPABILITY_TRANSFERS` to `Account` +- [#778](https://github.com/stripe/stripe-php/pull/778) Add support for `TYPE_MX_RFC` type on `TaxId` + +## 7.6.0 - 2019-10-22 + +- [#770](https://github.com/stripe/stripe-php/pull/770) Add missing constants for Customer's `TaxId` + +## 7.5.0 - 2019-10-18 + +- [#768](https://github.com/stripe/stripe-php/pull/768) Redact API key in `RequestOptions` debug info + +## 7.4.0 - 2019-10-15 + +- [#764](https://github.com/stripe/stripe-php/pull/764) Add support for HTTP request monitoring callback + +## 7.3.1 - 2019-10-07 + +- [#755](https://github.com/stripe/stripe-php/pull/755) Respect Stripe-Should-Retry and Retry-After headers + +## 7.3.0 - 2019-10-02 + +- [#752](https://github.com/stripe/stripe-php/pull/752) Add `payment_intent.canceled` and `setup_intent.canceled` events +- [#749](https://github.com/stripe/stripe-php/pull/749) Call `toArray()` on objects only + +## 7.2.2 - 2019-09-24 + +- [#746](https://github.com/stripe/stripe-php/pull/746) Add missing decline codes + +## 7.2.1 - 2019-09-23 + +- [#744](https://github.com/stripe/stripe-php/pull/744) Added new PHPDoc + +## 7.2.0 - 2019-09-17 + +- [#738](https://github.com/stripe/stripe-php/pull/738) Added missing constants for `SetupIntent` events + +## 7.1.1 - 2019-09-16 + +- [#737](https://github.com/stripe/stripe-php/pull/737) Added new PHPDoc + +## 7.1.0 - 2019-09-13 + +- [#736](https://github.com/stripe/stripe-php/pull/736) Make `CaseInsensitiveArray` countable and traversable + +## 7.0.2 - 2019-09-06 + +- [#729](https://github.com/stripe/stripe-php/pull/729) Fix usage of `SignatureVerificationException` in PHPDoc blocks + +## 7.0.1 - 2019-09-05 + +- [#728](https://github.com/stripe/stripe-php/pull/728) Clean up Collection + +## 7.0.0 - 2019-09-03 + +Major version release. The [migration guide](https://github.com/stripe/stripe-php/wiki/Migration-guide-for-v7) contains a detailed list of backwards-incompatible changes with upgrade instructions. + +Pull requests included in this release (cf. [#552](https://github.com/stripe/stripe-php/pull/552)) (⚠️ = breaking changes): + +- ⚠️ Drop support for PHP 5.4 ([#551](https://github.com/stripe/stripe-php/pull/551)) +- ⚠️ Drop support for PHP 5.5 ([#554](https://github.com/stripe/stripe-php/pull/554)) +- Bump dependencies ([#553](https://github.com/stripe/stripe-php/pull/553)) +- Remove `CURLFile` check ([#555](https://github.com/stripe/stripe-php/pull/555)) +- Update constant definitions for PHP >= 5.6 ([#556](https://github.com/stripe/stripe-php/pull/556)) +- ⚠️ Remove `FileUpload` alias ([#557](https://github.com/stripe/stripe-php/pull/557)) +- Remove `curl_reset` check ([#570](https://github.com/stripe/stripe-php/pull/570)) +- Use `\Stripe\::class` constant instead of strings ([#643](https://github.com/stripe/stripe-php/pull/643)) +- Use `array_column` to flatten params ([#686](https://github.com/stripe/stripe-php/pull/686)) +- ⚠️ Remove deprecated methods ([#692](https://github.com/stripe/stripe-php/pull/692)) +- ⚠️ Remove `IssuerFraudRecord` ([#696](https://github.com/stripe/stripe-php/pull/696)) +- Update constructors of Stripe exception classes ([#559](https://github.com/stripe/stripe-php/pull/559)) +- Fix remaining TODOs ([#700](https://github.com/stripe/stripe-php/pull/700)) +- Use yield for autopagination ([#703](https://github.com/stripe/stripe-php/pull/703)) +- ⚠️ Rename fake magic methods and rewrite array conversion ([#704](https://github.com/stripe/stripe-php/pull/704)) +- Add `ErrorObject` to Stripe exceptions ([#705](https://github.com/stripe/stripe-php/pull/705)) +- Start using PHP CS Fixer ([#706](https://github.com/stripe/stripe-php/pull/706)) +- Update error messages for nested resource operations ([#708](https://github.com/stripe/stripe-php/pull/708)) +- Upgrade retry logic ([#707](https://github.com/stripe/stripe-php/pull/707)) +- ⚠️ `Collection` improvements / fixes ([#715](https://github.com/stripe/stripe-php/pull/715)) +- ⚠️ Modernize exceptions ([#709](https://github.com/stripe/stripe-php/pull/709)) +- Add constants for error codes ([#716](https://github.com/stripe/stripe-php/pull/716)) +- Update certificate bundle ([#717](https://github.com/stripe/stripe-php/pull/717)) +- Retry requests on a 429 that's a lock timeout ([#718](https://github.com/stripe/stripe-php/pull/718)) +- Fix `toArray()` calls ([#719](https://github.com/stripe/stripe-php/pull/719)) +- Couple of fixes for PHP 7.4 ([#725](https://github.com/stripe/stripe-php/pull/725)) + +## 6.43.1 - 2019-08-29 + +- [#722](https://github.com/stripe/stripe-php/pull/722) Make `LoggerInterface::error` compatible with its PSR-3 counterpart +- [#714](https://github.com/stripe/stripe-php/pull/714) Add `pending_setup_intent` property in `Subscription` +- [#713](https://github.com/stripe/stripe-php/pull/713) Add typehint to `ApiResponse` +- [#712](https://github.com/stripe/stripe-php/pull/712) Fix comment +- [#701](https://github.com/stripe/stripe-php/pull/701) Start testing PHP 7.3 + +## 6.43.0 - 2019-08-09 + +- [#694](https://github.com/stripe/stripe-php/pull/694) Add `SubscriptionItem::createUsageRecord` method + +## 6.42.0 - 2019-08-09 + +- [#688](https://github.com/stripe/stripe-php/pull/688) Remove `SubscriptionScheduleRevision` + - Note that this is technically a breaking change, however we've chosen to release it as a minor version in light of the fact that this resource and its API methods were virtually unused. + +## 6.41.0 - 2019-07-31 + +- [#683](https://github.com/stripe/stripe-php/pull/683) Move the List Balance History API to `/v1/balance_transactions` + +## 6.40.0 - 2019-06-27 + +- [#675](https://github.com/stripe/stripe-php/pull/675) Add support for `SetupIntent` resource and APIs + +## 6.39.2 - 2019-06-26 + +- [#676](https://github.com/stripe/stripe-php/pull/676) Fix exception message in `CustomerBalanceTransaction::update()` + +## 6.39.1 - 2019-06-25 + +- [#674](https://github.com/stripe/stripe-php/pull/674) Add new constants for `collection_method` on `Invoice` + +## 6.39.0 - 2019-06-24 + +- [#673](https://github.com/stripe/stripe-php/pull/673) Enable request latency telemetry by default + +## 6.38.0 - 2019-06-17 + +- [#649](https://github.com/stripe/stripe-php/pull/649) Add support for `CustomerBalanceTransaction` resource and APIs + +## 6.37.2 - 2019-06-17 + +- [#671](https://github.com/stripe/stripe-php/pull/671) Add new PHPDoc +- [#672](https://github.com/stripe/stripe-php/pull/672) Add constants for `submit_type` on Checkout `Session` + +## 6.37.1 - 2019-06-14 + +- [#670](https://github.com/stripe/stripe-php/pull/670) Add new PHPDoc + +## 6.37.0 - 2019-05-23 + +- [#663](https://github.com/stripe/stripe-php/pull/663) Add support for `radar.early_fraud_warning` resource + +## 6.36.0 - 2019-05-22 + +- [#661](https://github.com/stripe/stripe-php/pull/661) Add constants for new TaxId types +- [#662](https://github.com/stripe/stripe-php/pull/662) Add constants for BalanceTransaction types + +## 6.35.2 - 2019-05-20 + +- [#655](https://github.com/stripe/stripe-php/pull/655) Add constants for payment intent statuses +- [#659](https://github.com/stripe/stripe-php/pull/659) Fix PHPDoc for various nested Account actions +- [#660](https://github.com/stripe/stripe-php/pull/660) Fix various PHPDoc + +## 6.35.1 - 2019-05-20 + +- [#658](https://github.com/stripe/stripe-php/pull/658) Use absolute value when checking timestamp tolerance + +## 6.35.0 - 2019-05-14 + +- [#651](https://github.com/stripe/stripe-php/pull/651) Add support for the Capability resource and APIs + +## 6.34.6 - 2019-05-13 + +- [#654](https://github.com/stripe/stripe-php/pull/654) Fix typo in definition of `Event::PAYMENT_METHOD_ATTACHED` constant + +## 6.34.5 - 2019-05-06 + +- [#647](https://github.com/stripe/stripe-php/pull/647) Set the return type to static for more operations + +## 6.34.4 - 2019-05-06 + +- [#650](https://github.com/stripe/stripe-php/pull/650) Add missing constants for Event types + +## 6.34.3 - 2019-05-01 + +- [#644](https://github.com/stripe/stripe-php/pull/644) Update return type to `static` to improve static analysis +- [#645](https://github.com/stripe/stripe-php/pull/645) Fix constant for `payment_intent.payment_failed` + +## 6.34.2 - 2019-04-26 + +- [#642](https://github.com/stripe/stripe-php/pull/642) Fix an issue where existing idempotency keys would be overwritten when using automatic retries + +## 6.34.1 - 2019-04-25 + +- [#640](https://github.com/stripe/stripe-php/pull/640) Add missing phpdocs + +## 6.34.0 - 2019-04-24 + +- [#626](https://github.com/stripe/stripe-php/pull/626) Add support for the `TaxRate` resource and APIs +- [#639](https://github.com/stripe/stripe-php/pull/639) Fix multiple phpdoc issues + +## 6.33.0 - 2019-04-22 + +- [#630](https://github.com/stripe/stripe-php/pull/630) Add support for the `TaxId` resource and APIs + +## 6.32.1 - 2019-04-19 + +- [#636](https://github.com/stripe/stripe-php/pull/636) Correct type of `$personId` in PHPDoc + +## 6.32.0 - 2019-04-18 + +- [#621](https://github.com/stripe/stripe-php/pull/621) Add support for `CreditNote` + +## 6.31.5 - 2019-04-12 + +- [#628](https://github.com/stripe/stripe-php/pull/628) Add constants for `person.*` event types +- [#628](https://github.com/stripe/stripe-php/pull/628) Add missing constants for `Account` and `Person` + +## 6.31.4 - 2019-04-05 + +- [#624](https://github.com/stripe/stripe-php/pull/624) Fix encoding of nested parameters in multipart requests + +## 6.31.3 - 2019-04-02 + +- [#623](https://github.com/stripe/stripe-php/pull/623) Only use HTTP/2 with curl >= 7.60.0 + +## 6.31.2 - 2019-03-25 + +- [#619](https://github.com/stripe/stripe-php/pull/619) Fix PHPDoc return types for list methods for nested resources + +## 6.31.1 - 2019-03-22 + +- [#612](https://github.com/stripe/stripe-php/pull/612) Add a lot of constants +- [#614](https://github.com/stripe/stripe-php/pull/614) Add missing subscription status constants + +## 6.31.0 - 2019-03-18 + +- [#600](https://github.com/stripe/stripe-php/pull/600) Add support for the `PaymentMethod` resource and APIs +- [#606](https://github.com/stripe/stripe-php/pull/606) Add support for retrieving a Checkout `Session` +- [#611](https://github.com/stripe/stripe-php/pull/611) Add support for deleting a Terminal `Location` and `Reader` + +## 6.30.5 - 2019-03-11 + +- [#607](https://github.com/stripe/stripe-php/pull/607) Correctly handle case where a metadata key is called `metadata` + +## 6.30.4 - 2019-02-27 + +- [#602](https://github.com/stripe/stripe-php/pull/602) Add `subscription_schedule` to `Subscription` for PHPDoc. + +## 6.30.3 - 2019-02-26 + +- [#603](https://github.com/stripe/stripe-php/pull/603) Improve PHPDoc on the `Source` object to cover all types of Sources currently supported. + +## 6.30.2 - 2019-02-25 + +- [#601](https://github.com/stripe/stripe-php/pull/601) Fix PHPDoc across multiple resources and add support for new events. + +## 6.30.1 - 2019-02-16 + +- [#599](https://github.com/stripe/stripe-php/pull/599) Fix PHPDoc for `SubscriptionSchedule` and `SubscriptionScheduleRevision` + +## 6.30.0 - 2019-02-12 + +- [#590](https://github.com/stripe/stripe-php/pull/590) Add support for `SubscriptionSchedule` and `SubscriptionScheduleRevision` + +## 6.29.3 - 2019-01-31 + +- [#592](https://github.com/stripe/stripe-php/pull/592) Some more PHPDoc fixes + +## 6.29.2 - 2019-01-31 + +- [#591](https://github.com/stripe/stripe-php/pull/591) Fix PHPDoc for nested resources + +## 6.29.1 - 2019-01-25 + +- [#566](https://github.com/stripe/stripe-php/pull/566) Fix dangling message contents +- [#586](https://github.com/stripe/stripe-php/pull/586) Don't overwrite `CURLOPT_HTTP_VERSION` option + +## 6.29.0 - 2019-01-23 + +- [#579](https://github.com/stripe/stripe-php/pull/579) Rename `CheckoutSession` to `Session` and move it under the `Checkout` namespace. This is a breaking change, but we've reached out to affected merchants and all new merchants would use the new approach. + +## 6.28.1 - 2019-01-21 + +- [#580](https://github.com/stripe/stripe-php/pull/580) Properly serialize `individual` on `Account` objects + +## 6.28.0 - 2019-01-03 + +- [#576](https://github.com/stripe/stripe-php/pull/576) Add support for iterating directly over `Collection` instances + +## 6.27.0 - 2018-12-21 + +- [#571](https://github.com/stripe/stripe-php/pull/571) Add support for the `CheckoutSession` resource + +## 6.26.0 - 2018-12-11 + +- [#568](https://github.com/stripe/stripe-php/pull/568) Enable persistent connections + +## 6.25.0 - 2018-12-10 + +- [#567](https://github.com/stripe/stripe-php/pull/567) Add support for account links + +## 6.24.0 - 2018-11-28 + +- [#562](https://github.com/stripe/stripe-php/pull/562) Add support for the Review resource +- [#564](https://github.com/stripe/stripe-php/pull/564) Add event name constants for subscription schedule aborted/expiring + +## 6.23.0 - 2018-11-27 + +- [#542](https://github.com/stripe/stripe-php/pull/542) Add support for `ValueList` and `ValueListItem` for Radar + +## 6.22.1 - 2018-11-20 + +- [#561](https://github.com/stripe/stripe-php/pull/561) Add cast and some docs to telemetry introduced in 6.22.0/549 + +## 6.22.0 - 2018-11-15 + +- [#549](https://github.com/stripe/stripe-php/pull/549) Add support for client telemetry + +## 6.21.1 - 2018-11-12 + +- [#548](https://github.com/stripe/stripe-php/pull/548) Don't mutate `Exception` class properties from `OAuthBase` error + +## 6.21.0 - 2018-11-08 + +- [#537](https://github.com/stripe/stripe-php/pull/537) Add new API endpoints for the `Invoice` resource. + +## 6.20.1 - 2018-11-07 + +- [#546](https://github.com/stripe/stripe-php/pull/546) Drop files from the Composer package that aren't needed in the release + +## 6.20.0 - 2018-10-30 + +- [#536](https://github.com/stripe/stripe-php/pull/536) Add support for the `Person` resource +- [#541](https://github.com/stripe/stripe-php/pull/541) Add support for the `WebhookEndpoint` resource + +## 6.19.5 - 2018-10-17 + +- [#539](https://github.com/stripe/stripe-php/pull/539) Fix methods on `\Stripe\PaymentIntent` to properly pass arguments to the API. + +## 6.19.4 - 2018-10-11 + +- [#534](https://github.com/stripe/stripe-php/pull/534) Fix PSR-4 autoloading for `\Stripe\FileUpload` class alias + +## 6.19.3 - 2018-10-09 + +- [#530](https://github.com/stripe/stripe-php/pull/530) Add constants for `flow` (`FLOW_*`), `status` (`STATUS_*`) and `usage` (`USAGE_*`) on `\Stripe\Source` + +## 6.19.2 - 2018-10-08 + +- [#531](https://github.com/stripe/stripe-php/pull/531) Store HTTP response headers in case-insensitive array + +## 6.19.1 - 2018-09-25 + +- [#526](https://github.com/stripe/stripe-php/pull/526) Ignore null values in request parameters + +## 6.19.0 - 2018-09-24 + +- [#523](https://github.com/stripe/stripe-php/pull/523) Add support for Stripe Terminal + +## 6.18.0 - 2018-09-24 + +- [#520](https://github.com/stripe/stripe-php/pull/520) Rename `\Stripe\FileUpload` to `\Stripe\File` + +## 6.17.2 - 2018-09-18 + +- [#522](https://github.com/stripe/stripe-php/pull/522) Fix warning when adding a new additional owner to an existing array + +## 6.17.1 - 2018-09-14 + +- [#517](https://github.com/stripe/stripe-php/pull/517) Integer-index encode all sequential arrays + +## 6.17.0 - 2018-09-05 + +- [#514](https://github.com/stripe/stripe-php/pull/514) Add support for reporting resources + +## 6.16.0 - 2018-08-23 + +- [#509](https://github.com/stripe/stripe-php/pull/509) Add support for usage record summaries + +## 6.15.0 - 2018-08-03 + +- [#504](https://github.com/stripe/stripe-php/pull/504) Add cancel support for topups + +## 6.14.0 - 2018-08-02 + +- [#505](https://github.com/stripe/stripe-php/pull/505) Add support for file links + +## 6.13.0 - 2018-07-31 + +- [#502](https://github.com/stripe/stripe-php/pull/502) Add `isDeleted()` method to `\Stripe\StripeObject` + +## 6.12.0 - 2018-07-28 + +- [#501](https://github.com/stripe/stripe-php/pull/501) Add support for scheduled query runs (`\Stripe\Sigma\ScheduledQueryRun`) for Sigma + +## 6.11.0 - 2018-07-26 + +- [#500](https://github.com/stripe/stripe-php/pull/500) Add support for Stripe Issuing + +## 6.10.4 - 2018-07-19 + +- [#498](https://github.com/stripe/stripe-php/pull/498) Internal improvements to the `\Stripe\ApiResource.classUrl()` method + +## 6.10.3 - 2018-07-16 + +- [#497](https://github.com/stripe/stripe-php/pull/497) Use HTTP/2 only for HTTPS requests + +## 6.10.2 - 2018-07-11 + +- [#494](https://github.com/stripe/stripe-php/pull/494) Enable HTTP/2 support + +## 6.10.1 - 2018-07-10 + +- [#493](https://github.com/stripe/stripe-php/pull/493) Add PHPDoc for `auto_advance` on `\Stripe\Invoice` + +## 6.10.0 - 2018-06-28 + +- [#488](https://github.com/stripe/stripe-php/pull/488) Add support for `$appPartnerId` to `Stripe::setAppInfo()` + +## 6.9.0 - 2018-06-28 + +- [#487](https://github.com/stripe/stripe-php/pull/487) Add support for payment intents + +## 6.8.2 - 2018-06-24 + +- [#486](https://github.com/stripe/stripe-php/pull/486) Make `Account.deauthorize()` return the `StripeObject` from the API + +## 6.8.1 - 2018-06-13 + +- [#472](https://github.com/stripe/stripe-php/pull/472) Added phpDoc for `ApiRequestor` and others, especially regarding thrown errors + +## 6.8.0 - 2018-06-13 + +- [#481](https://github.com/stripe/stripe-php/pull/481) Add new `\Stripe\Discount` and `\Stripe\OrderItem` classes, add more PHPDoc describing object attributes + +## 6.7.4 - 2018-05-29 + +- [#480](https://github.com/stripe/stripe-php/pull/480) PHPDoc changes for API version 2018-05-21 and the addition of the new `CHARGE_EXPIRED` event type + +## 6.7.3 - 2018-05-28 + +- [#479](https://github.com/stripe/stripe-php/pull/479) Fix unnecessary traits on `\Stripe\InvoiceLineItem` + +## 6.7.2 - 2018-05-28 + +- [#471](https://github.com/stripe/stripe-php/pull/471) Add `OBJECT_NAME` constant to all API resource classes, add `\Stripe\InvoiceLineItem` class + +## 6.7.1 - 2018-05-13 + +- [#468](https://github.com/stripe/stripe-php/pull/468) Update fields in PHP docs for accuracy + +## 6.7.0 - 2018-05-09 + +- [#466](https://github.com/stripe/stripe-php/pull/466) Add support for issuer fraud records + +## 6.6.0 - 2018-04-11 + +- [#460](https://github.com/stripe/stripe-php/pull/460) Add support for flexible billing primitives + +## 6.5.0 - 2018-04-05 + +- [#461](https://github.com/stripe/stripe-php/pull/461) Don't zero keys on non-`metadata` subobjects + +## 6.4.2 - 2018-03-17 + +- [#458](https://github.com/stripe/stripe-php/pull/458) Add PHPDoc for `account` on `\Stripe\Event` + +## 6.4.1 - 2018-03-02 + +- [#455](https://github.com/stripe/stripe-php/pull/455) Fix namespaces in PHPDoc +- [#456](https://github.com/stripe/stripe-php/pull/456) Fix namespaces for some exceptions + +## 6.4.0 - 2018-02-28 + +- [#453](https://github.com/stripe/stripe-php/pull/453) Add constants for `reason` (`REASON_*`) and `status` (`STATUS_*`) on `\Stripe\Dispute` + +## 6.3.2 - 2018-02-27 + +- [#452](https://github.com/stripe/stripe-php/pull/452) Add PHPDoc for `amount_paid` and `amount_remaining` on `\Stripe\Invoice` + +## 6.3.1 - 2018-02-26 + +- [#443](https://github.com/stripe/stripe-php/pull/443) Add event types as constants to `\Stripe\Event` class + +## 6.3.0 - 2018-02-23 + +- [#450](https://github.com/stripe/stripe-php/pull/450) Add support for `code` attribute on all Stripe exceptions + +## 6.2.0 - 2018-02-21 + +- [#440](https://github.com/stripe/stripe-php/pull/440) Add support for topups +- [#442](https://github.com/stripe/stripe-php/pull/442) Fix PHPDoc for `\Stripe\Error\SignatureVerification` + +## 6.1.0 - 2018-02-12 + +- [#435](https://github.com/stripe/stripe-php/pull/435) Fix header persistence on `Collection` objects +- [#436](https://github.com/stripe/stripe-php/pull/436) Introduce new `Idempotency` error class + +## 6.0.0 - 2018-02-07 + +Major version release. List of backwards incompatible changes to watch out for: + +- The minimum PHP version is now 5.4.0. If you're using PHP 5.3 or older, consider upgrading to a more recent version. + +* `\Stripe\AttachedObject` no longer exists. Attributes that used to be instances of `\Stripe\AttachedObject` (such as `metadata`) are now instances of `\Stripe\StripeObject`. + +- Attributes that used to be PHP arrays (such as `legal_entity->additional_owners` on `\Stripe\Account` instances) are now instances of `\Stripe\StripeObject`, except when they are empty. `\Stripe\StripeObject` has array semantics so this should not be an issue unless you are actively checking types. + +* `\Stripe\Collection` now derives from `\Stripe\StripeObject` rather than from `\Stripe\ApiResource`. + +Pull requests included in this release: + +- [#410](https://github.com/stripe/stripe-php/pull/410) Drop support for PHP 5.3 +- [#411](https://github.com/stripe/stripe-php/pull/411) Use traits for common API operations +- [#414](https://github.com/stripe/stripe-php/pull/414) Use short array syntax +- [#404](https://github.com/stripe/stripe-php/pull/404) Fix serialization logic +- [#417](https://github.com/stripe/stripe-php/pull/417) Remove `ExternalAccount` class +- [#418](https://github.com/stripe/stripe-php/pull/418) Increase test coverage +- [#421](https://github.com/stripe/stripe-php/pull/421) Update CA bundle and add script for future updates +- [#422](https://github.com/stripe/stripe-php/pull/422) Use vendored CA bundle for all requests +- [#428](https://github.com/stripe/stripe-php/pull/428) Support for automatic request retries + +## 5.9.2 - 2018-02-07 + +- [#431](https://github.com/stripe/stripe-php/pull/431) Update PHPDoc @property tags for latest API version + +## 5.9.1 - 2018-02-06 + +- [#427](https://github.com/stripe/stripe-php/pull/427) Add and update PHPDoc @property tags on all API resources + +## 5.9.0 - 2018-01-17 + +- [#421](https://github.com/stripe/stripe-php/pull/421) Updated bundled CA certificates +- [#423](https://github.com/stripe/stripe-php/pull/423) Escape unsanitized input in OAuth example + +## 5.8.0 - 2017-12-20 + +- [#403](https://github.com/stripe/stripe-php/pull/403) Add `__debugInfo()` magic method to `StripeObject` + +## 5.7.0 - 2017-11-28 + +- [#390](https://github.com/stripe/stripe-php/pull/390) Remove some unsupported API methods +- [#391](https://github.com/stripe/stripe-php/pull/391) Alphabetize the list of API resources in `Util::convertToStripeObject()` and add missing resources +- [#393](https://github.com/stripe/stripe-php/pull/393) Fix expiry date update for card sources + +## 5.6.0 - 2017-10-31 + +- [#386](https://github.com/stripe/stripe-php/pull/386) Support for exchange rates APIs + +## 5.5.1 - 2017-10-30 + +- [#387](https://github.com/stripe/stripe-php/pull/387) Allow `personal_address_kana` and `personal_address_kanji` to be updated on an account + +## 5.5.0 - 2017-10-27 + +- [#385](https://github.com/stripe/stripe-php/pull/385) Support for listing source transactions + +## 5.4.0 - 2017-10-24 + +- [#383](https://github.com/stripe/stripe-php/pull/383) Add static methods to manipulate resources from parent + - `Account` gains methods for external accounts and login links (e.g. `createExternalAccount`, `createLoginLink`) + - `ApplicationFee` gains methods for refunds + - `Customer` gains methods for sources + - `Transfer` gains methods for reversals + +## 5.3.0 - 2017-10-11 + +- [#378](https://github.com/stripe/stripe-php/pull/378) Rename source `delete` to `detach` (and deprecate the former) + +## 5.2.3 - 2017-09-27 + +- Add PHPDoc for `Card` + +## 5.2.2 - 2017-09-20 + +- Fix deserialization mapping of `FileUpload` objects + +## 5.2.1 - 2017-09-14 + +- Serialized `shipping` nested attribute + +## 5.2.0 - 2017-08-29 + +- Add support for `InvalidClient` OAuth error + +## 5.1.3 - 2017-08-14 + +- Allow `address_kana` and `address_kanji` to be updated for custom accounts + +## 5.1.2 - 2017-08-01 + +- Fix documented return type of `autoPagingIterator()` (was missing namespace) + +## 5.1.1 - 2017-07-03 + +- Fix order returns to use the right URL `/v1/order_returns` + +## 5.1.0 - 2017-06-30 + +- Add support for OAuth + +## 5.0.0 - 2017-06-27 + +- `pay` on invoice now takes params as well as opts + +## 4.13.0 - 2017-06-19 + +- Add support for ephemeral keys + +## 4.12.0 - 2017-06-05 + +- Clients can implement `getUserAgentInfo()` to add additional user agent information + +## 4.11.0 - 2017-06-05 + +- Implement `Countable` for `AttachedObject` (`metadata` and `additional_owners`) + +## 4.10.0 - 2017-05-25 + +- Add support for login links + +## 4.9.1 - 2017-05-10 + +- Fix docs to include arrays on `$id` parameter for retrieve methods + +## 4.9.0 - 2017-04-28 + +- Support for checking webhook signatures + +## 4.8.1 - 2017-04-24 + +- Allow nested field `payout_schedule` to be updated + +## 4.8.0 - 2017-04-20 + +- Add `\Stripe\Stripe::setLogger()` to support an external PSR-3 compatible logger + +## 4.7.0 - 2017-04-10 + +- Add support for payouts and recipient transfers + +## 4.6.0 - 2017-04-06 + +- Please see 4.7.0 instead (no-op release) + +## 4.5.1 - 2017-03-22 + +- Remove hard dependency on cURL + +## 4.5.0 - 2017-03-20 + +- Support for detaching sources from customers + +## 4.4.2 - 2017-02-27 + +- Correct handling of `owner` parameter when updating sources + +## 4.4.1 - 2017-02-24 + +- Correct the error check on a bad JSON decoding + +## 4.4.0 - 2017-01-18 + +- Add support for updating sources + +## 4.3.0 - 2016-11-30 + +- Add support for verifying sources + +## 4.2.0 - 2016-11-21 + +- Add retrieve method for 3-D Secure resources + +## 4.1.1 - 2016-10-21 + +- Add docblock with model properties for `Plan` + +## 4.1.0 - 2016-10-18 + +- Support for 403 status codes (permission denied) + +## 4.0.1 - 2016-10-17 + +- Fix transfer reversal materialization +- Fixes for some property definitions in docblocks + +## 4.0.0 - 2016-09-28 + +- Support for subscription items +- Drop attempt to force TLS 1.2: please note that this could be breaking if you're using old OS distributions or packages and upgraded recently (so please make sure to test your integration!) + +## 3.23.0 - 2016-09-15 + +- Add support for Apple Pay domains + +## 3.22.0 - 2016-09-13 + +- Add `Stripe::setAppInfo` to allow plugins to register user agent information + +## 3.21.0 - 2016-08-25 + +- Add `Source` model for generic payment sources + +## 3.20.0 - 2016-08-08 + +- Add `getDeclineCode` to card errors + +## 3.19.0 - 2016-07-29 + +- Opt requests directly into TLS 1.2 where OpenSSL >= 1.0.1 (see #277 for context) + +## 3.18.0 - 2016-07-28 + +- Add new `STATUS_` constants for subscriptions + +## 3.17.1 - 2016-07-28 + +- Fix auto-paging iterator so that it plays nicely with `iterator_to_array` + +## 3.17.0 - 2016-07-14 + +- Add field annotations to model classes for better editor hinting + +## 3.16.0 - 2016-07-12 + +- Add `ThreeDSecure` model for 3-D secure payments + +## 3.15.0 - 2016-06-29 + +- Add static `update` method to all resources that can be changed. + +## 3.14.3 - 2016-06-20 + +- Make sure that cURL never sends `Expects: 100-continue`, even on large request bodies + +## 3.14.2 - 2016-06-03 + +- Add `inventory` under `SKU` to list of keys that have nested data and can be updated + +## 3.14.1 - 2016-05-27 + +- Fix some inconsistencies in PHPDoc + +## 3.14.0 - 2016-05-25 + +- Add support for returning Relay orders + +## 3.13.0 - 2016-05-04 + +- Add `list`, `create`, `update`, `retrieve`, and `delete` methods to the Subscription class + +## 3.12.1 - 2016-04-07 + +- Additional check on value arrays for some extra safety + +## 3.12.0 - 2016-03-31 + +- Fix bug `refreshFrom` on `StripeObject` would not take an `$opts` array +- Fix bug where `$opts` not passed to parent `save` method in `Account` +- Fix bug where non-existent variable was referenced in `reverse` in `Transfer` +- Update CA cert bundle for compatibility with OpenSSL versions below 1.0.1 + +## 3.11.0 - 2016-03-22 + +- Allow `CurlClient` to be initialized with default `CURLOPT_*` options + +## 3.10.1 - 2016-03-22 + +- Fix bug where request params and options were ignored in `ApplicationFee`'s `refund.` + +## 3.10.0 - 2016-03-15 + +- Add `reject` on `Account` to support the new API feature + +## 3.9.2 - 2016-03-04 + +- Fix error when an object's metadata is set more than once + +## 3.9.1 - 2016-02-24 + +- Fix encoding behavior of nested arrays for requests (see #227) + +## 3.9.0 - 2016-02-09 + +- Add automatic pagination mechanism with `autoPagingIterator()` +- Allow global account ID to be set with `Stripe::setAccountId()` + +## 3.8.0 - 2016-02-08 + +- Add `CountrySpec` model for looking up country payment information + +## 3.7.1 - 2016-02-01 + +- Update bundled CA certs + +## 3.7.0 - 2016-01-27 + +- Support deleting Relay products and SKUs + +## 3.6.0 - 2016-01-05 + +- Allow configuration of HTTP client timeouts + +## 3.5.0 - 2015-12-01 + +- Add a verification routine for external accounts + +## 3.4.0 - 2015-09-14 + +- Products, SKUs, and Orders -- https://stripe.com/relay + +## 3.3.0 - 2015-09-11 + +- Add support for 429 Rate Limit response + +## 3.2.0 - 2015-08-17 + +- Add refund listing and retrieval without an associated charge + +## 3.1.0 - 2015-08-03 + +- Add dispute listing and retrieval +- Add support for manage account deletion + +## 3.0.0 - 2015-07-28 + +- Rename `\Stripe\Object` to `\Stripe\StripeObject` (PHP 7 compatibility) +- Rename `getCode` and `getParam` in exceptions to `getStripeCode` and `getStripeParam` +- Add support for calling `json_encode` on Stripe objects in PHP 5.4+ +- Start supporting/testing PHP 7 + +## 2.3.0 - 2015-07-06 + +- Add request ID to all Stripe exceptions + +## 2.2.0 - 2015-06-01 + +- Add support for Alipay accounts as sources +- Add support for bank accounts as sources (private beta) +- Add support for bank accounts and cards as external_accounts on Account objects + +## 2.1.4 - 2015-05-13 + +- Fix CA certificate file path (thanks @lphilps & @matthewarkin) + +## 2.1.3 - 2015-05-12 + +- Fix to account updating to permit `tos_acceptance` and `personal_address` to be set properly +- Fix to Transfer reversal creation (thanks @neatness!) +- Network requests are now done through a swappable class for easier mocking + +## 2.1.2 - 2015-04-10 + +- Remove SSL cert revokation checking (all pre-Heartbleed certs have expired) +- Bug fixes to account updating + +## 2.1.1 - 2015-02-27 + +- Support transfer reversals + +## 2.1.0 - 2015-02-19 + +- Support new API version (2015-02-18) +- Added Bitcoin Receiever update and delete actions +- Edited tests to prefer "source" over "card" as per new API version + +## 2.0.1 - 2015-02-16 + +- Fix to fetching endpoints that use a non-default baseUrl (`FileUpload`) + +## 2.0.0 - 2015-02-14 + +- Bumped minimum version to 5.3.3 +- Switched to Stripe namespace instead of Stripe\_ class name prefiexes (thanks @chadicus!) +- Switched tests to PHPUnit (thanks @chadicus!) +- Switched style guide to PSR2 (thanks @chadicus!) +- Added \$opts hash to the end of most methods: this permits passing 'idempotency_key', 'stripe_account', or 'stripe_version'. The last 2 will persist across multiple object loads. +- Added support for retrieving Account by ID + +## 1.18.0 - 2015-01-21 + +- Support making bitcoin charges through BitcoinReceiver source object + +## 1.17.5 - 2014-12-23 + +- Adding support for creating file uploads. + +## 1.17.4 - 2014-12-15 + +- Saving objects fetched with a custom key now works (thanks @JustinHook & @jpasilan) +- Added methods for reporting charges as safe or fraudulent and for specifying the reason for refunds + +## 1.17.3 - 2014-11-06 + +- Better handling of HHVM support for SSL certificate blacklist checking. + +## 1.17.2 - 2014-09-23 + +- Coupons now are backed by a `Stripe_Coupon` instead of `Stripe_Object`, and support updating metadata +- Running operations (`create`, `retrieve`, `all`) on upcoming invoice items now works + +## 1.17.1 - 2014-07-31 + +- Requests now send Content-Type header + +## 1.17.0 - 2014-07-29 + +- Application Fee refunds now a list instead of array +- HHVM now works +- Small bug fixes (thanks @bencromwell & @fastest963) +- `__toString` now returns the name of the object in addition to its JSON representation + +## 1.16.0 - 2014-06-17 + +- Add metadata for refunds and disputes + +## 1.15.0 - 2014-05-28 + +- Support canceling transfers + +## 1.14.1 - 2014-05-21 + +- Support cards for recipients. + +## 1.13.1 - 2014-05-15 + +- Fix bug in account resource where `id` wasn't in the result + +## 1.13.0 - 2014-04-10 + +- Add support for certificate blacklisting +- Update ca bundle +- Drop support for HHVM (Temporarily) + +## 1.12.0 - 2014-04-01 + +- Add Stripe_RateLimitError for catching rate limit errors. +- Update to Zend coding style (thanks, @jpiasetz) + +## 1.11.0 - 2014-01-29 + +- Add support for multiple subscriptions per customer + +## 1.10.1 - 2013-12-02 + +- Add new ApplicationFee + +## 1.9.1 - 2013-11-08 + +- Fix a bug where a null nestable object causes warnings to fire. + +## 1.9.0 - 2013-10-16 + +- Add support for metadata API. + +## 1.8.4 - 2013-09-18 + +- Add support for closing disputes. + +## 1.8.3 - 2013-08-13 + +- Add new Balance and BalanceTransaction + +## 1.8.2 - 2013-08-12 + +- Add support for unsetting attributes by updating to NULL. Setting properties to a blank string is now an error. + +## 1.8.1 - 2013-07-12 + +- Add support for multiple cards API (Stripe API version 2013-07-12: https://docs.stripe.com/changelog/2013-07-05) + +## 1.8.0 - 2013-04-11 + +- Allow Transfers to be creatable +- Add new Recipient resource + +## 1.7.15 - 2013-02-21 + +- Add 'id' to the list of permanent object attributes + +## 1.7.14 - 2013-02-20 + +- Don't re-encode strings that are already encoded in UTF-8. If you were previously using plan or coupon objects with UTF-8 IDs, they may have been treated as ISO-8859-1 (Latin-1) and encoded to UTF-8 a 2nd time. You may now need to pass the IDs to utf8_encode before passing them to Stripe_Plan::retrieve or Stripe_Coupon::retrieve. +- Ensure that all input is encoded in UTF-8 before submitting it to Stripe's servers. (github issue #27) + +## 1.7.13 - 2013-02-01 + +- Add support for passing options when retrieving Stripe objects e.g., Stripe_Charge::retrieve(array("id"=>"foo", "expand" => array("customer"))); Stripe_Charge::retrieve("foo") will continue to work + +## 1.7.12 - 2013-01-15 + +- Add support for setting a Stripe API version override + +## 1.7.11 - 2012-12-30 + +- Version bump to cleanup constants and such (fix issue #26) + +## 1.7.10 - 2012-11-08 + +- Add support for updating charge disputes. +- Fix bug preventing retrieval of null attributes + +## 1.7.9 - 2012-11-08 + +- Fix usage under autoloaders such as the one generated by composer (fix issue #22) + +## 1.7.8 - 2012-10-30 + +- Add support for creating invoices. +- Add support for new invoice lines return format +- Add support for new list objects + +## 1.7.7 - 2012-09-14 + +- Get all of the various version numbers in the repo in sync (no other changes) + +## 1.7.6 - 2012-08-31 + +- Add update and pay methods to Invoice resource + +## 1.7.5 - 2012-08-23 + +- Change internal function names so that Stripe_SingletonApiRequest is E_STRICT-clean (github issue #16) + +## 1.7.4 - 2012-08-21 + +- Bugfix so that Stripe objects (e.g. Customer, Charge objects) used in API calls are transparently converted to their object IDs + +## 1.7.3 - 2012-08-15 + +- Add new Account resource + +## 1.7.2 - 2012-06-26 + +- Make clearer that you should be including lib/Stripe.php, not test/Stripe.php (github issue #14) + +## 1.7.1 - 2012-05-24 + +- Add missing argument to Stripe_InvalidRequestError constructor in Stripe_ApiResource::instanceUrl. Fixes a warning when Stripe_ApiResource::instanceUrl is called on a resource with no ID (fix issue #12) + +## 1.7.0 - 2012-05-17 + +- Support Composer and Packagist (github issue #9) +- Add new deleteDiscount method to Stripe_Customer +- Add new Transfer resource +- Switch from using HTTP Basic auth to Bearer auth. (Note: Stripe will support Basic auth for the indefinite future, but recommends Bearer auth when possible going forward) +- Numerous test suite improvements diff --git a/stripe-php/CONTRIBUTING.md b/stripe-php/CONTRIBUTING.md new file mode 100644 index 0000000..d18d5bf --- /dev/null +++ b/stripe-php/CONTRIBUTING.md @@ -0,0 +1,25 @@ + +# Contributing + +We welcome bug reports, feature requests, and code contributions in a pull request. + +For most pull requests, we request that you identify or create an associated issue that has the necessary context. We use these issues to reach agreement on an approach and save the PR author from having to redo work. Fixing typos or documentation issues likely do not need an issue; for any issue that introduces substantial code changes, changes the public interface, or if you aren't sure, please find or [create an issue](https://www.github.com/stripe/stripe-php/issues/new/choose). + +## Contributor License Agreement + +All contributors must sign the Contributor License Agreement (CLA) before we can accept their contribution. If you have not yet signed the agreement, you will be given an option to do so when you open a pull request. You can then sign by clicking on the badge in the comment from @CLAassistant. + +## Generated code + +This project has a combination of manually maintained code and code generated from our private code generator. If your contribution involves changes to generated code, please call this out in the issue or pull request as we will likely need to make a change to our code generator before accepting the contribution. + +To identify files with purely generated code, look for the comment `File generated from our OpenAPI spec.` at the start of the file. Generated blocks of code within hand-written files will be between comments that say `The beginning of the section generated from our OpenAPI spec` and `The end of the section generated from our OpenAPI spec`. + +## Compatibility with supported language and runtime versions + +This project supports [many different langauge and runtime versions](README.md#requirements) and we are unable to accept any contribution that does not work on _all_ supported versions. If, after discussing the approach in the associated issue, your change must use an API / feature that isn't available in all supported versions, please call this out explicitly in the issue or pull request so we can help figure out the best way forward. + +## Set up your dev environment + +Please refer to this project's [README.md](README.md#development) for instructions on how to set up your development environment. + diff --git a/stripe-php/LICENSE b/stripe-php/LICENSE new file mode 100644 index 0000000..847c705 --- /dev/null +++ b/stripe-php/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2010-2019 Stripe, Inc. (https://stripe.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/stripe-php/OPENAPI_VERSION b/stripe-php/OPENAPI_VERSION new file mode 100644 index 0000000..1673943 --- /dev/null +++ b/stripe-php/OPENAPI_VERSION @@ -0,0 +1 @@ +v2140 \ No newline at end of file diff --git a/stripe-php/README.md b/stripe-php/README.md new file mode 100644 index 0000000..658105b --- /dev/null +++ b/stripe-php/README.md @@ -0,0 +1,331 @@ +# Stripe PHP bindings + +[![Build Status](https://github.com/stripe/stripe-php/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/stripe/stripe-php/actions?query=branch%3Amaster) +[![Latest Stable Version](https://poser.pugx.org/stripe/stripe-php/v/stable.svg)](https://packagist.org/packages/stripe/stripe-php) +[![Total Downloads](https://poser.pugx.org/stripe/stripe-php/downloads.svg)](https://packagist.org/packages/stripe/stripe-php) +[![License](https://poser.pugx.org/stripe/stripe-php/license.svg)](https://packagist.org/packages/stripe/stripe-php) + +The Stripe PHP library provides convenient access to the Stripe API from +applications written in the PHP language. It includes a pre-defined set of +classes for API resources that initialize themselves dynamically from API +responses which makes it compatible with a wide range of versions of the Stripe +API. + +## Requirements + +PHP 5.6.0 and later. + +Note that per our [language version support policy](https://docs.stripe.com/sdks/versioning?lang=php#stripe-sdk-language-version-support-policy), support for PHP 5.6, 7.0, and 7.1 will be removed in the March 2026 major version. + +Additional PHP versions will be dropped in future major versions, so upgrade to supported versions if possible. + +## Composer + +You can install the bindings via [Composer](http://getcomposer.org/). Run the following command: + +```bash +composer require stripe/stripe-php +``` + +To use the bindings, use Composer's [autoload](https://getcomposer.org/doc/01-basic-usage.md#autoloading): + +```php +require_once 'vendor/autoload.php'; +``` + +## Manual Installation + +If you do not wish to use Composer, you can download the [latest release](https://github.com/stripe/stripe-php/releases). Then, to use the bindings, include the `init.php` file. + +```php +require_once '/path/to/stripe-php/init.php'; +``` + +## Dependencies + +The bindings require the following extensions in order to work properly: + +- [`curl`](https://secure.php.net/manual/en/book.curl.php), although you can use your own non-cURL client if you prefer +- [`json`](https://secure.php.net/manual/en/book.json.php) +- [`mbstring`](https://secure.php.net/manual/en/book.mbstring.php) (Multibyte String) + +If you use Composer, these dependencies should be handled automatically. If you install manually, you'll want to make sure that these extensions are available. + +## Getting Started + +Simple usage looks like: + +```php +$stripe = new \Stripe\StripeClient('sk_test_BQokikJOvBiI2HlWgH4olfQ2'); +$customer = $stripe->customers->create([ + 'description' => 'example customer', + 'email' => 'email@example.com', + 'payment_method' => 'pm_card_visa', +]); +echo $customer; +``` + +### Client/service patterns vs legacy patterns + +You can continue to use the legacy integration patterns used prior to version [7.33.0](https://github.com/stripe/stripe-php/blob/master/CHANGELOG.md#7330---2020-05-14). Review the [migration guide](https://github.com/stripe/stripe-php/wiki/Migration-to-StripeClient-and-services-in-7.33.0) for the backwards-compatible client/services pattern changes. + +## Documentation + +See the [PHP API docs](https://stripe.com/docs/api/?lang=php#intro). + +## Legacy Version Support + +### PHP 5.4 & 5.5 + +If you are using PHP 5.4 or 5.5, you should consider upgrading your environment as those versions have been past end of life since September 2015 and July 2016 respectively. +Otherwise, you can still use Stripe by downloading stripe-php v6.43.1 ([zip](https://github.com/stripe/stripe-php/archive/v6.43.1.zip), [tar.gz](https://github.com/stripe/stripe-php/archive/6.43.1.tar.gz)) from our [releases page](https://github.com/stripe/stripe-php/releases). This version will work but might not support recent features we added since the version was released and upgrading PHP is the best course of action. + +### PHP 5.3 + +If you are using PHP 5.3, you should upgrade your environment as this version has been past end of life since August 2014. +Otherwise, you can download v5.9.2 ([zip](https://github.com/stripe/stripe-php/archive/v5.9.2.zip), [tar.gz](https://github.com/stripe/stripe-php/archive/v5.9.2.tar.gz)) from our [releases page](https://github.com/stripe/stripe-php/releases). This version will continue to work with new versions of the Stripe API for all common uses. + +## Custom Request Timeouts + +> **Note** +> We do not recommend decreasing the timeout for non-read-only calls (e.g. charge creation), since even if you locally timeout, the request on Stripe's side can still complete. If you are decreasing timeouts on these calls, make sure to use [idempotency tokens](https://stripe.com/docs/api/?lang=php#idempotent_requests) to avoid executing the same transaction twice as a result of timeout retry logic. + +To modify request timeouts (connect or total, in seconds) you'll need to tell the API client to use a CurlClient other than its default. You'll set the timeouts in that CurlClient. + +```php +// set up your tweaked Curl client +$curl = new \Stripe\HttpClient\CurlClient(); +$curl->setTimeout(10); // default is \Stripe\HttpClient\CurlClient::DEFAULT_TIMEOUT +$curl->setConnectTimeout(5); // default is \Stripe\HttpClient\CurlClient::DEFAULT_CONNECT_TIMEOUT + +echo $curl->getTimeout(); // 10 +echo $curl->getConnectTimeout(); // 5 + +// tell Stripe to use the tweaked client +\Stripe\ApiRequestor::setHttpClient($curl); + +// use the Stripe API client as you normally would +``` + +## Custom cURL Options (e.g. proxies) + +Need to set a proxy for your requests? Pass in the requisite `CURLOPT_*` array to the CurlClient constructor, using the same syntax as `curl_stopt_array()`. This will set the default cURL options for each HTTP request made by the SDK, though many more common options (e.g. timeouts; see above on how to set those) will be overridden by the client even if set here. + +```php +// set up your tweaked Curl client +$curl = new \Stripe\HttpClient\CurlClient([CURLOPT_PROXY => 'proxy.local:80']); +// tell Stripe to use the tweaked client +\Stripe\ApiRequestor::setHttpClient($curl); +``` + +Alternately, a callable can be passed to the CurlClient constructor that returns the above array based on request inputs. See `testDefaultOptions()` in `tests/CurlClientTest.php` for an example of this behavior. Note that the callable is called at the beginning of every API request, before the request is sent. + +### Configuring a Logger + +The library does minimal logging, but it can be configured +with a [`PSR-3` compatible logger][psr3] so that messages +end up there instead of `error_log`: + +```php +\Stripe\Stripe::setLogger($logger); +``` + +### Accessing response data + +You can access the data from the last API response on any object via `getLastResponse()`. + +```php +$customer = $stripe->customers->create([ + 'description' => 'example customer', +]); +echo $customer->getLastResponse()->headers['Request-Id']; +``` + +### SSL / TLS compatibility issues + +Stripe's API now requires that [all connections use TLS 1.2](https://stripe.com/blog/upgrading-tls). Some systems (most notably some older CentOS and RHEL versions) are capable of using TLS 1.2 but will use TLS 1.0 or 1.1 by default. In this case, you'd get an `invalid_request_error` with the following error message: "Stripe no longer supports API requests made with TLS 1.0. Please initiate HTTPS connections with TLS 1.2 or later. You can learn more about this at [https://stripe.com/blog/upgrading-tls](https://stripe.com/blog/upgrading-tls).". + +The recommended course of action is to [upgrade your cURL and OpenSSL packages](https://support.stripe.com/questions/how-do-i-upgrade-my-stripe-integration-from-tls-1-0-to-tls-1-2#php) so that TLS 1.2 is used by default, but if that is not possible, you might be able to solve the issue by setting the `CURLOPT_SSLVERSION` option to either `CURL_SSLVERSION_TLSv1` or `CURL_SSLVERSION_TLSv1_2`: + +```php +$curl = new \Stripe\HttpClient\CurlClient([CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1]); +\Stripe\ApiRequestor::setHttpClient($curl); +``` + +### Per-request Configuration + +For apps that need to use multiple keys during the lifetime of a process, like +one that uses [Stripe Connect][connect], it's also possible to set a +per-request key and/or account: + +```php +$customers = $stripe->customers->all([],[ + 'api_key' => 'sk_test_...', + 'stripe_account' => 'acct_...' +]); + +$stripe->customers->retrieve('cus_123456789', [], [ + 'api_key' => 'sk_test_...', + 'stripe_account' => 'acct_...' +]); +``` + +### Configuring CA Bundles + +By default, the library will use its own internal bundle of known CA +certificates, but it's possible to configure your own: + +```php +\Stripe\Stripe::setCABundlePath("path/to/ca/bundle"); +``` + +### Configuring Automatic Retries + +The library can be configured to automatically retry requests that fail due to +an intermittent network problem: + +```php +\Stripe\Stripe::setMaxNetworkRetries(2); +``` + +[Idempotency keys][idempotency-keys] are added to requests to guarantee that +retries are safe. + +### Telemetry + +By default, the library sends telemetry to Stripe regarding request latency and feature usage. These +numbers help Stripe improve the overall latency of its API for all users, and +improve popular features. + +You can disable this behavior if you prefer: + +```php +\Stripe\Stripe::setEnableTelemetry(false); +``` + +### Public Preview SDKs + +Stripe has features in the [public preview phase](https://docs.stripe.com/release-phases) that can be accessed via versions of this package that have the `-beta.X` suffix like `12.2.0-beta.2`. +We would love for you to try these as we incrementally release new features and improve them based on your feedback. + +The public preview SDKs are a different version of the same package as the stable SDKs. These versions are appended with `-beta.X` such as `15.0.0-beta.1`. To install, pick the latest version with the `beta` suffix by reviewing the [releases page](https://github.com/stripe/stripe-dotnet/releases/) and then use it in the `composer require` command: + +```bash +composer require stripe/stripe-php:v +``` + +> **Note** +> There can be breaking changes between two versions of the public preview SDKs without a bump in the major version. Therefore we recommend pinning the package version to a specific version in your composer.json file. This way you can install the same version each time without breaking changes unless you are intentionally looking for the latest version of the public preview SDK. + +Some preview features require a name and version to be set in the `Stripe-Version` header like `feature_beta=v3`. If the preview feature you are interested in has this requirement, use the function `addBetaVersion` (available only in the public preview SDKs): + +```php +Stripe::addBetaVersion("feature_beta", "v3"); +``` + +### Private Preview SDKs + +Stripe has features in the [private preview phase](https://docs.stripe.com/release-phases) that can be accessed via versions of this package that have the `-alpha.X` suffix like `12.2.0-alpha.2`. These are invite-only features. Once invited, you can install the private preview SDKs by following the same instructions as for the [public preview SDKs](https://github.com/stripe/stripe-php?tab=readme-ov-file#public-preview-sdks) above and replacing the term `beta` with `alpha`. + +### Custom requests + +> This feature is only available from version 16 of this SDK. + +If you would like to send a request to an undocumented API (for example you are in a private beta), or if you prefer to bypass the method definitions in the library and specify your request details directly, you can use the `rawRequest` method on the StripeClient. + +```php +$stripe = new \Stripe\StripeClient('sk_test_xyz'); +$response = $stripe->rawRequest('post', '/v1/beta_endpoint', [ + "caveat": "emptor" +], [ + "stripe_version" => "2022-11_15", +]); +// $response->body is a string, you can call $stripe->deserialize to get a \Stripe\StripeObject. +$obj = $stripe->deserialize($response->body); + +// For GET requests, the params argument must be null, and you should write the query string explicitly. +$get_response = $stripe->rawRequest('get', '/v1/beta_endpoint?caveat=emptor', null, [ + "stripe_version" => "2022-11_15", +]); +``` + +## Support + +New features and bug fixes are released on the latest major version of the Stripe PHP library. If you are on an older major version, we recommend that you upgrade to the latest in order to use the new features and bug fixes including those for security vulnerabilities. Older major versions of the package will continue to be available for use, but will not be receiving any updates. + +## Development + +[Contribution guidelines for this project](CONTRIBUTING.md) + +We use [just](https://github.com/casey/just) for conveniently running development tasks. You can use them directly, or copy the commands out of the `justfile`. To our help docs, run `just`. + +To get started, install [Composer][composer]. For example, on Mac OS: + +```bash +brew install composer +``` + +Install dependencies: + +```bash +just install +# or: composer install +``` + +The test suite depends on [stripe-mock], so make sure to fetch and run it from a +background terminal ([stripe-mock's README][stripe-mock] also contains +instructions for installing via Homebrew and other methods): + +```bash +go install github.com/stripe/stripe-mock@latest +stripe-mock +``` + +Install dependencies as mentioned above (which will resolve [PHPUnit](http://packagist.org/packages/phpunit/phpunit)), then you can run the test suite: + +```bash +just test +# or: ./vendor/bin/phpunit +``` + +Or to run an individual test file: + +```bash +just test tests/Stripe/UtilTest.php +# or: ./vendor/bin/phpunit tests/Stripe/UtilTest.php +``` + +Update bundled CA certificates from the [Mozilla cURL release][curl]: + +```bash +./update_certs.php +``` + +The library uses [PHP CS Fixer][php-cs-fixer] for code formatting. Code must be formatted before PRs are submitted, otherwise CI will fail. Run the formatter with: + +```bash +just format +# or: ./vendor/bin/php-cs-fixer fix -v . +``` + +## Attention plugin developers + +Are you writing a plugin that integrates Stripe and embeds our library? Then please use the `setAppInfo` function to identify your plugin. For example: + +```php +\Stripe\Stripe::setAppInfo("MyAwesomePlugin", "1.2.34", "https://myawesomeplugin.info"); +``` + +The method should be called once, before any request is sent to the API. The second and third parameters are optional. + +### SSL / TLS configuration option + +See the "SSL / TLS compatibility issues" paragraph above for full context. If you want to ensure that your plugin can be used on all systems, you should add a configuration option to let your users choose between different values for `CURLOPT_SSLVERSION`: none (default), `CURL_SSLVERSION_TLSv1` and `CURL_SSLVERSION_TLSv1_2`. + +[composer]: https://getcomposer.org/ +[connect]: https://stripe.com/connect +[curl]: http://curl.haxx.se/docs/caextract.html +[idempotency-keys]: https://stripe.com/docs/api/?lang=php#idempotent_requests +[php-cs-fixer]: https://github.com/FriendsOfPHP/PHP-CS-Fixer +[psr3]: http://www.php-fig.org/psr/psr-3/ +[stripe-mock]: https://github.com/stripe/stripe-mock diff --git a/stripe-php/VERSION b/stripe-php/VERSION new file mode 100644 index 0000000..8bf109b --- /dev/null +++ b/stripe-php/VERSION @@ -0,0 +1 @@ +19.1.0 diff --git a/stripe-php/composer.json b/stripe-php/composer.json new file mode 100644 index 0000000..f7763d6 --- /dev/null +++ b/stripe-php/composer.json @@ -0,0 +1,46 @@ +{ + "name": "stripe/stripe-php", + "description": "Stripe PHP Library", + "keywords": [ + "stripe", + "payment processing", + "api" + ], + "homepage": "https://stripe.com/", + "license": "MIT", + "authors": [ + { + "name": "Stripe and contributors", + "homepage": "https://github.com/stripe/stripe-php/contributors" + } + ], + "require": { + "php": ">=5.6.0", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^9.0", + "friendsofphp/php-cs-fixer": "3.72.0", + "phpstan/phpstan": "^1.2" + }, + "autoload": { + "psr-4": { + "Stripe\\": "lib/" + } + }, + "autoload-dev": { + "psr-4": { + "Stripe\\": [ + "tests/", + "tests/Stripe/" + ] + } + }, + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + } +} diff --git a/stripe-php/data/ca-certificates.crt b/stripe-php/data/ca-certificates.crt new file mode 100644 index 0000000..65be891 --- /dev/null +++ b/stripe-php/data/ca-certificates.crt @@ -0,0 +1,3511 @@ +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Tue Dec 2 04:12:02 2025 GMT +## +## Find updated versions here: https://curl.se/docs/caextract.html +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## https://raw.githubusercontent.com/mozilla-firefox/firefox/refs/heads/release/security/nss/lib/ckfw/builtins/certdata.txt +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## +## Conversion done with mk-ca-bundle.pl version 1.30. +## SHA256: a903b3cd05231e39332515ef7ebe37e697262f39515a52015c23c62805b73cd0 +## + + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx +ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 +XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk +lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB +lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy +lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt +66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn +wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh +D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy +BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie +J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud +DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU +a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv +Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 +UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm +VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK ++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW +IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 +WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X +f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II +4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 +VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx +OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg +DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij +KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K +DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv +BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp +p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 +nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX +MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM +Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz +uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT +BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj +YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB +BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD +VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 +ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE +AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV +qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s +hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z +POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 +Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp +8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC +bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu +g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p +vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr +qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw +EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN +MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp +c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq +t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C +jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg +vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF +ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR +AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend +jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO +peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR +7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi +GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 +OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm +5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr +44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf +Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m +Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp +mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk +vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf +KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br +NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj +viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +======================================== +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG +EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz +MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu +QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ +03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK +ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU ++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC +PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT +OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK +F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK +0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ +0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB +leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID +AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ +SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG +NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l +Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga +kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q +hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs +g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 +aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 +nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC +ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo +Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z +WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM +BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE +AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky +MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz +IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ +wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa +by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 +zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f +YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 +oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l +EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 +hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 +EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 +jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY +iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI +WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 +JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx +K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ +Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC +4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo +2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz +lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem +OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 +vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +QuoVadis Root CA 1 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +QuoVadis Root CA 2 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +QuoVadis Root CA 3 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +DigiCert Assured ID Root G2 +=========================== +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +DigiCert Assured ID Root G3 +=========================== +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +DigiCert Global Root G2 +======================= +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +DigiCert Global Root G3 +======================= +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE----- + +DigiCert Trusted Root G4 +======================== +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn +dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ +FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ +5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG +x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX +2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL +OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 +sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C +GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 +WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt +rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ +nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg +tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW +sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp +pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA +zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq +ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 +7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz +0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j +Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn +RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O ++T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq +/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE +Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM +lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 +yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ +eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW +FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ +7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ +Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM +8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi +FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi +yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c +J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw +sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +IdenTrust Commercial Root CA 1 +============================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +IdenTrust Public Sector Root CA 1 +================================= +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy +bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug +b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw +HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT +DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx +OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP +/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz +HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU +s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y +TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 +0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z +iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi +nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ +vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO +e4pIb4tF9g== +-----END CERTIFICATE----- + +Entrust Root Certification Authority - EC1 +========================================== +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx +FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn +YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw +FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs +LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy +AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef +9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h +vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 +kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +CFCA EV ROOT +============ +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GB CA +=============================== +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG +EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw +MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds +b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX +scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP +rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk +9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o +Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg +GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI +hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD +dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 +VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui +HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +SZAFIR ROOT CA2 +=============== +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV +BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ +BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD +VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q +qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK +DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE +2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ +ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi +ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC +AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 +O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 +oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul +4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 ++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +Certum Trusted Network CA 2 +=========================== +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE +BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 +bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y +ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ +TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB +IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 +7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o +CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b +Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p +uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 +GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ +9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB +Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye +hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM +BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI +hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW +Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA +L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo +clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM +pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb +w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo +J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm +ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX +is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 +zAYspsbiDrW5viSP +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2015 +======================================================= +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT +BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 +aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx +MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg +QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV +BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw +MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv +bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh +iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ +6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd +FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr +i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F +GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 +fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu +iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI +hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ +D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM +d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y +d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn +82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb +davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F +Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt +J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa +JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q +p/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions ECC RootCA 2015 +=========================================================== +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 +aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw +MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj +IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD +VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 +Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP +dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK +Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA +GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn +dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +ISRG Root X1 +============ +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM +================ +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT +AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw +MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD +TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf +qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr +btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL +j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou +08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw +WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT +tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ +47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC +ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa +i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o +dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s +D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ +j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT +Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW ++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 +Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d +8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm +5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG +rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +Amazon Root CA 1 +================ +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 +MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH +FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ +gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t +dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce +VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 +DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM +CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy +8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa +2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 +xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +Amazon Root CA 2 +================ +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 +MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 +kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp +N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 +AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd +fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx +kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS +btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 +Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN +c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ +3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw +DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA +A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE +YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW +xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ +gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW +aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV +Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 +KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi +JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= +-----END CERTIFICATE----- + +Amazon Root CA 3 +================ +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB +f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr +Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 +rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc +eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +Amazon Root CA 4 +================ +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN +/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri +83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA +MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 +AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT +D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr +IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g +TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp +ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD +VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt +c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth +bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 +IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 +6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc +wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 +3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 +WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU +ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc +lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R +e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j +q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +GDCA TrustAUTH R5 ROOT +====================== +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw +BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD +DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow +YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs +AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p +OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr +pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ +9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ +xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM +R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ +D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 +oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx +9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 +H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 +6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd ++PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ +HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD +F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ +8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv +/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT +aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +SSL.com Root Certification Authority RSA +======================================== +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM +BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x +MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw +MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx +EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM +LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C +Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8 +P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge +oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp +k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z +fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ +gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2 +UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8 +1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s +bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr +dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf +ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl +u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq +erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj +MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ +vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI +Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y +wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI +WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +SSL.com Root Certification Authority ECC +======================================== +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv +BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy +MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO +BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ +8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR +hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT +jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW +e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z +5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority RSA R2 +============================================== +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w +DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u +MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI +DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD +VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh +hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w +cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO +Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ +B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh +CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim +9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto +RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm +JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 ++qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp +qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 +++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx +Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G +guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz +OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 +CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq +lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR +rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 +hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX +9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority ECC +=========================================== +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy +BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw +MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx +EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM +LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy +3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O +BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe +5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ +N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm +m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +GlobalSign Root CA - R6 +======================= +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX +R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i +YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs +U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss +grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE +3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF +vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM +PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ +azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O +WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy +CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP +0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN +b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV +HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 +lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY +BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym +Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr +3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 +0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T +uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK +oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t +JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GC CA +=============================== +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD +SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo +MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa +Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL +ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr +VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab +NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E +AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk +AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +UCA Global G2 Root +================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x +NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU +cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT +oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV +8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS +h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o +LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ +R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe +KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa +4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc +OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 +8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo +5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A +Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 +yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX +c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo +jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk +bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x +ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn +RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== +-----END CERTIFICATE----- + +UCA Extended Validation Root +============================ +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u +IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G +A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs +iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF +Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu +eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR +59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH +0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR +el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv +B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth +WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS +NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS +3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL +BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM +aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 +dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb ++7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW +F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi +GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc +GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi +djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr +dhh2n1ax +-----END CERTIFICATE----- + +Certigna Root CA +================ +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE +BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ +MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda +MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz +MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX +stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz +KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 +JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 +XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq +4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej +wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ +lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI +jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ +/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy +dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h +LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl +cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt +OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP +TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq +7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 +4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd +8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS +6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY +tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS +aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde +E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +emSign Root CA - G1 +=================== +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET +MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl +ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx +ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk +aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN +LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 +cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW +DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ +6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH +hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 +vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q +NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q ++Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih +U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +emSign ECC Root CA - G3 +======================= +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG +A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg +MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 +MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 +ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc +58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr +MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D +CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 +jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +emSign Root CA - C1 +=================== +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx +EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp +Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD +ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up +ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ +Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX +OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V +I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms +lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ +XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD +ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp +/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 +NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 +wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ +BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +emSign ECC Root CA - C3 +======================= +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG +A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF +Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD +ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd +6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 +SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA +B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA +MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU +ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +Hongkong Post Root CA 3 +======================= +-----BEGIN CERTIFICATE----- +MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG +A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK +Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2 +MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv +bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX +SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz +iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf +jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim +5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe +sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj +0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/ +JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u +y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h ++bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG +xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID +AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e +i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN +AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw +W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld +y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov ++BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc +eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw +9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7 +nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY +hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB +60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq +dBb9HxEGmpv0 +-----END CERTIFICATE----- + +Microsoft ECC Root Certificate Authority 2017 +============================================= +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND +IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4 +MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6 +thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB +eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM ++Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf +Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR +eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +Microsoft RSA Root Certificate Authority 2017 +============================================= +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg +UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw +NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u +MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml +7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e +S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7 +1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+ +dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F +yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS +MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr +lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ +0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ +ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og +6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80 +dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk ++ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex +/2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy +AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW +ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE +7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT +c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D +5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +e-Szigno Root CA 2017 +===================== +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw +DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt +MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa +Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE +CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp +Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx +s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G +A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv +vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA +tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO +svxyqltZ+efcMQ== +-----END CERTIFICATE----- + +certSIGN Root CA G2 +=================== +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw +EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy +MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH +TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05 +N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk +abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg +wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp +dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh +ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732 +jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf +95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc +z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL +iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud +DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB +ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB +/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5 +8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5 +BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW +atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU +Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M +NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N +0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc= +-----END CERTIFICATE----- + +Trustwave Global Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJV +UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 +ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0xNzA4MjMxOTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJV +UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 +ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALldUShLPDeS0YLOvR29 +zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0XznswuvCAAJWX/NKSqIk4cXGIDtiLK0thAf +LdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4Bq +stTnoApTAbqOl5F2brz81Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9o +WN0EACyW80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotPJqX+ +OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1lRtzuzWniTY+HKE40 +Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfwhI0Vcnyh78zyiGG69Gm7DIwLdVcE +uE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm ++9jaJXLE9gCxInm943xZYkqcBW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqj +ifLJS3tBEW1ntwiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1UdDwEB/wQEAwIB +BjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W0OhUKDtkLSGm+J1WE2pIPU/H +PinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfeuyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0H +ZJDmHvUqoai7PF35owgLEQzxPy0QlG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla +4gt5kNdXElE1GYhBaCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5R +vbbEsLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPTMaCm/zjd +zyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qequ5AvzSxnI9O4fKSTx+O +856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxhVicGaeVyQYHTtgGJoC86cnn+OjC/QezH +Yj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu +3R3y4G5OBVixwJAWKqQ9EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP +29FpHOTKyeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE----- + +Trustwave Global ECC P256 Certification Authority +================================================= +-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1 +NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj +43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm +P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt +0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz +RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE----- + +Trustwave Global ECC P384 Certification Authority +================================================= +-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4 +NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH +Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr +/TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV +HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn +ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl +CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw== +-----END CERTIFICATE----- + +NAVER Global Root Certification Authority +========================================= +-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG +A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD +DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4 +NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT +UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb +UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW ++j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7 +XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2 +aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4 +Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z +VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B +A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai +cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy +YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV +HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK +21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB +jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx +hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg +E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH +D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ +A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY +qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG +I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg +kpzNNIaRkPpkUZ3+/uul9XXeifdy +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM SERVIDORES SEGUROS +=================================== +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF +UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy +NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4 +MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt +UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB +QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2 +LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG +SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD +zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c= +-----END CERTIFICATE----- + +GlobalSign Root R46 +=================== +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv +b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX +BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es +CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/ +r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje +2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt +bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj +K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4 +12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on +ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls +eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9 +vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM +BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy +gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92 +CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm +OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq +JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye +qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz +nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7 +DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3 +QEUxeCp6 +-----END CERTIFICATE----- + +GlobalSign Root E46 +=================== +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT +AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg +RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV +BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB +jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj +QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL +gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk +vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+ +CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +GLOBALTRUST 2020 +================ +-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx +IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT +VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh +BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy +MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi +D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO +VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM +CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm +fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA +A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR +JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG +DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU +clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ +mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud +IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw +4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9 +iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS +8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2 +HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS +vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918 +oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF +YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl +gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE----- + +ANF Secure Server Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNVBAUTCUc2MzI4 +NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lv +bjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNVBAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3Qg +Q0EwHhcNMTkwOTA0MTAwMDM4WhcNMzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEw +MQswCQYDVQQGEwJFUzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQw +EgYDVQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9vdCBDQTCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCjcqQZAZ2cC4Ffc0m6p6zz +BE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9qyGFOtibBTI3/TO80sh9l2Ll49a2pcbnv +T1gdpd50IJeh7WhM3pIXS7yr/2WanvtH2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcv +B2VSAKduyK9o7PQUlrZXH1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXse +zx76W0OLzc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyRp1RM +VwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQzW7i1o0TJrH93PB0j +7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/SiOL9V8BY9KHcyi1Swr1+KuCLH5z +JTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJnLNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe +8TZBAQIvfXOn3kLMTOmJDVb3n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVO +Hj1tyRRM4y5Bu8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj +o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAOBgNVHQ8BAf8E +BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEATh65isagmD9uw2nAalxJ +UqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzx +j6ptBZNscsdW699QIyjlRRA96Gejrw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDt +dD+4E5UGUcjohybKpFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM +5gf0vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjqOknkJjCb +5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ/zo1PqVUSlJZS2Db7v54 +EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ92zg/LFis6ELhDtjTO0wugumDLmsx2d1H +hk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGy +g77FGr8H6lnco4g175x2MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3 +r5+qPeoott7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw= +-----END CERTIFICATE----- + +Certum EC-384 CA +================ +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ +TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2 +MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh +dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq +vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn +iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo +ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0 +QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +Certum Trusted Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6MQswCQYDVQQG +EwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0g +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0Ew +HhcNMTgwMzE2MTIxMDEzWhcNNDMwMzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMY +QXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZn0EGze2jusDbCSzBfN8p +fktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/qp1x4EaTByIVcJdPTsuclzxFUl6s1wB52 +HO8AU5853BSlLCIls3Jy/I2z5T4IHhQqNwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2 +fJmItdUDmj0VDT06qKhF8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGt +g/BKEiJ3HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGamqi4 +NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi7VdNIuJGmj8PkTQk +fVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSFytKAQd8FqKPVhJBPC/PgP5sZ0jeJ +P/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0PqafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSY +njYJdmZm/Bo/6khUHL4wvYBQv3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHK +HRzQ+8S1h9E6Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1 +vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIBAEii1QAL +LtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4WxmB82M+w85bj/UvXgF2Ez8s +ALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvozMrnadyHncI013nR03e4qllY/p0m+jiGPp2K +h2RX5Rc64vmNueMzeMGQ2Ljdt4NR5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8 +CYyqOhNf6DR5UMEQGfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA +4kZf5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq0Uc9Nneo +WWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7DP78v3DSk+yshzWePS/Tj +6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTMqJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmT +OPQD8rv7gmsHINFSH5pkAnuYZttcTVoP0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZck +bxJF0WddCajJFdr60qZfE2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb +-----END CERTIFICATE----- + +TunTrust Root CA +================ +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQELBQAwYTELMAkG +A1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUgQ2VydGlmaWNhdGlvbiBFbGVj +dHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJvb3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQw +NDI2MDg1NzU2WjBhMQswCQYDVQQGEwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBD +ZXJ0aWZpY2F0aW9uIEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZn56eY+hz +2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd2JQDoOw05TDENX37Jk0b +bjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgFVwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7 +NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZGoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAd +gjH8KcwAWJeRTIAAHDOFli/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViW +VSHbhlnUr8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2eY8f +Tpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIbMlEsPvLfe/ZdeikZ +juXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISgjwBUFfyRbVinljvrS5YnzWuioYas +DXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwS +VXAkPcvCFDVDXSdOvsC9qnyW5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI +04Y+oXNZtPdEITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 +90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+zxiD2BkewhpMl +0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYuQEkHDVneixCwSQXi/5E/S7fd +Ao74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRY +YdZ2vyJ/0Adqp2RT8JeNnYA/u8EH22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJp +adbGNjHh/PqAulxPxOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65x +xBzndFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5Xc0yGYuP +jCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7bnV2UqL1g52KAdoGDDIzM +MEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQCvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9z +ZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZHu/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3r +AZ3r2OvEhJn7wAzMMujjd9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= +-----END CERTIFICATE----- + +HARICA TLS RSA Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG +EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz +OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl +bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB +IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN +JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu +a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y +Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K +5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv +dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR +0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH +GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm +haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ +CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU +EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq +QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD +QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR +j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5 +vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0 +qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6 +Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/ +PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn +kf3/W9b3raYvAwtt41dU63ZTGI0RmLo= +-----END CERTIFICATE----- + +HARICA TLS ECC Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH +UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD +QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX +DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj +IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv +b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l +AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b +ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW +0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi +rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw +CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud +DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w +gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j +b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A +bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL +4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb +LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il +I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP +cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA +LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A +lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH +9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf +NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE +ZycPvEJdvSRUDewdcAZfpLz6IHxV +-----END CERTIFICATE----- + +vTrus ECC Root CA +================= +-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE +BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS +b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa +BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c +ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n +TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT +QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL +YgmRWAD5Tfs0aNoJrSEGGJTO +-----END CERTIFICATE----- + +vTrus Root CA +============= +-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG +A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv +b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG +A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots +SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI +ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF +XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA +YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70 +kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2 +AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu +/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu +1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO +9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg +scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC +AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr +jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4 +8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn +xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg +icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4 +sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW +nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc +SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H +l3s= +-----END CERTIFICATE----- + +ISRG Root X2 +============ +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV +UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT +UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT +MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS +RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H +ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb +d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF +cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5 +U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- + +HiPKI Root CA - G1 +================== +-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ +IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT +AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg +Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0 +o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k +wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE +YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA +GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd +hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj +1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4 +9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/ +Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF +8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD +AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi +7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl +tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE +wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q +JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv +5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz +jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg +hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb +yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/ +yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW +ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E +BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI +KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg +UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE----- + +GTS Root R1 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0 +xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w +B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW +nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk +9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq +kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A +K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX +V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW +cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD +ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi +ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar +J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci +NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me +LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF +fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+ +7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3 +FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3 +gm3c +-----END CERTIFICATE----- + +GTS Root R2 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl +e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb +a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS ++LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M +kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG +r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q +S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV +J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL +dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD +ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh +swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel +/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn +jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5 +9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M +7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8 +0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR +WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW +HYbL +-----END CERTIFICATE----- + +GTS Root R3 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq +Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT +L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV +11RZt+cRLInUue4X +-----END CERTIFICATE----- + +GTS Root R4 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1 +PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C +r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh +4rsUecrNIdSUtUlD +-----END CERTIFICATE----- + +Telia Root CA v2 +================ +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT +AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2 +MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK +DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7 +6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q +9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn +pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl +tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW +5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr +RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E +BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4 +M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau +BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W +xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ +8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5 +tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H +eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C +y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC +QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15 +h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70 +sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9 +xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ +raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc= +-----END CERTIFICATE----- + +D-TRUST BR Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7 +dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu +QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom +AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87 +-----END CERTIFICATE----- + +D-TRUST EV Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8 +ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ +raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR +AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW +-----END CERTIFICATE----- + +DigiCert TLS ECC P384 Root G5 +============================= +-----BEGIN CERTIFICATE----- +MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4 +NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg +Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd +lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj +n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB +/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds +Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx +AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA== +-----END CERTIFICATE----- + +DigiCert TLS RSA4096 Root G5 +============================ +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG +EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0 +MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2 +IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8 +7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU +AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces +tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa +zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV +DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q +TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy +z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/ +MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk +wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E +FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw +GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN +lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN +MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/ +u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G +OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh +47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU +FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ +yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP +bEtoL8pU9ozaMv7Da4M/OMZ+ +-----END CERTIFICATE----- + +Certainly Root R1 +================= +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE +BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN +MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy +dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O +5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl +8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl +DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI +XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN +KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ +AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb +rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1 +VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS +p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz +HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d +8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v +MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB +GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+ +gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH +JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7 +fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw +x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S +X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8= +-----END CERTIFICATE----- + +Certainly Root E1 +================= +-----BEGIN CERTIFICATE----- +MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV +UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0 +MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu +bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4 +fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9 +YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E +AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8 +rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR +-----END CERTIFICATE----- + +Security Communication ECC RootCA1 +================================== +-----BEGIN CERTIFICATE----- +MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD +VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t +dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL +MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV +BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo +5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW +BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK +BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L +snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e +N9k= +-----END CERTIFICATE----- + +BJCA Global Root CA1 +==================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG +EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK +Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG +A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD +DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm +CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS +sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn +P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW +yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj +eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn +MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b +OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh +GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK +H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB +AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 +YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ +dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8 +60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh +TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW +4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp +GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx +4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps +3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S +SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI= +-----END CERTIFICATE----- + +BJCA Global Root CA2 +==================== +-----BEGIN CERTIFICATE----- +MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD +TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg +R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE +BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC +SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl +SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK +/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI +1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8 +W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g +UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== +-----END CERTIFICATE----- + +Sectigo Public Server Authentication Root E46 +============================================= +-----BEGIN CERTIFICATE----- +MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQswCQYDVQQGEwJH +QjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBTZXJ2 +ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5 +WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0 +aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUr +gQQAIgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccCWvkEN/U0 +NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+6xnOQ6OjQjBAMB0GA1Ud +DgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAKBggqhkjOPQQDAwNnADBkAjAn7qRaqCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RH +lAFWovgzJQxC36oCMB3q4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21U +SAGKcw== +-----END CERTIFICATE----- + +Sectigo Public Server Authentication Root R46 +============================================= +-----BEGIN CERTIFICATE----- +MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBfMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT +ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1 +OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T +ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3 +DQEBAQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDaef0rty2k +1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnzSDBh+oF8HqcIStw+Kxwf +GExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xfiOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMP +FF1bFOdLvt30yNoDN9HWOaEhUTCDsG3XME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vu +ZDCQOc2TZYEhMbUjUDM3IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5Qaz +Yw6A3OASVYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgESJ/A +wSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu+Zd4KKTIRJLpfSYF +plhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt8uaZFURww3y8nDnAtOFr94MlI1fZ +EoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+LHaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW +6aWWrL3DkJiy4Pmi1KZHQ3xtzwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWI +IUkwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c +mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQYKlJfp/imTYp +E0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52gDY9hAaLMyZlbcp+nv4fjFg4 +exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZAFv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M +0ejf5lG5Nkc/kLnHvALcWxxPDkjBJYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI +84HxZmduTILA7rpXDhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9m +pFuiTdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5dHn5Hrwd +Vw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65LvKRRFHQV80MNNVIIb/b +E/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmm +J1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAYQqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL +-----END CERTIFICATE----- + +SSL.com TLS RSA Root CA 2022 +============================ +-----BEGIN CERTIFICATE----- +MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQG +EwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBSU0Eg +Um9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloXDTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMC +VVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJv +b3QgQ0EgMjAyMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u +9nTPL3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OYt6/wNr/y +7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0insS657Lb85/bRi3pZ7Qcac +oOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3PnxEX4MN8/HdIGkWCVDi1FW24IBydm5M +R7d1VVm0U3TZlMZBrViKMWYPHqIbKUBOL9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDG +D6C1vBdOSHtRwvzpXGk3R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEW +TO6Af77wdr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS+YCk +8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYSd66UNHsef8JmAOSq +g+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoGAtUjHBPW6dvbxrB6y3snm/vg1UYk +7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2fgTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsu +N+7jhHonLs0ZNbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt +hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsMQtfhWsSWTVTN +j8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvfR4iyrT7gJ4eLSYwfqUdYe5by +iB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJDPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjU +o3KUQyxi4U5cMj29TH0ZR6LDSeeWP4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqo +ENjwuSfr98t67wVylrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7Egkaib +MOlqbLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2wAgDHbICi +vRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3qr5nsLFR+jM4uElZI7xc7 +P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sjiMho6/4UIyYOf8kpIEFR3N+2ivEC+5BB0 +9+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= +-----END CERTIFICATE----- + +SSL.com TLS ECC Root CA 2022 +============================ +-----BEGIN CERTIFICATE----- +MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV +UzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBFQ0MgUm9v +dCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMx +GDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3Qg +Q0EgMjAyMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWy +JGYmacCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFNSeR7T5v1 +5wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSJjy+j6CugFFR7 +81a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NWuCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGG +MAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w +7deedWo1dlJF4AIxAMeNb0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5 +Zn6g6g== +-----END CERTIFICATE----- + +Atos TrustedRoot Root CA ECC TLS 2021 +===================================== +-----BEGIN CERTIFICATE----- +MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4wLAYDVQQDDCVB +dG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQswCQYD +VQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3Mg +VHJ1c3RlZFJvb3QgUm9vdCBDQSBFQ0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYT +AkRFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6K +DP/XtXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4AjJn8ZQS +b+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2KCXWfeBmmnoJsmo7jjPX +NtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIwW5kp85wxtolrbNa9d+F851F+ +uDrNozZffPc8dz7kUK2o59JZDCaOMDtuCCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGY +a3cpetskz2VAv9LcjBHo9H1/IISpQuQo +-----END CERTIFICATE----- + +Atos TrustedRoot Root CA RSA TLS 2021 +===================================== +-----BEGIN CERTIFICATE----- +MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBMMS4wLAYDVQQD +DCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQsw +CQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0 +b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNV +BAYTAkRFMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BB +l01Z4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYvYe+W/CBG +vevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZkmGbzSoXfduP9LVq6hdK +ZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDsGY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt +0xU6kGpn8bRrZtkh68rZYnxGEFzedUlnnkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVK +PNe0OwANwI8f4UDErmwh3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMY +sluMWuPD0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzygeBY +Br3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8ANSbhqRAvNncTFd+ +rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezBc6eUWsuSZIKmAMFwoW4sKeFYV+xa +fJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lIpw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUdEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0G +CSqGSIb3DQEBDAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS +4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPso0UvFJ/1TCpl +Q3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJqM7F78PRreBrAwA0JrRUITWX +AdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuywxfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9G +slA9hGCZcbUztVdF5kJHdWoOsAgMrr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2Vkt +afcxBPTy+av5EzH4AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9q +TFsR0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuYo7Ey7Nmj +1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5dDTedk+SKlOxJTnbPP/l +PqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcEoji2jbDwN/zIIX8/syQbPYtuzE2wFg2W +HYMfRsCbvUOZ58SWLs5fyQ== +-----END CERTIFICATE----- + +TrustAsia Global Root CA G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEMBQAwWjELMAkG +A1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMM +G1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAeFw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEw +MTlaMFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMu +MSQwIgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNST1QY4Sxz +lZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqKAtCWHwDNBSHvBm3dIZwZ +Q0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/V +P68czH5GX6zfZBCK70bwkPAPLfSIC7Epqq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1Ag +dB4SQXMeJNnKziyhWTXAyB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm +9WAPzJMshH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gXzhqc +D0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAvkV34PmVACxmZySYg +WmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msTf9FkPz2ccEblooV7WIQn3MSAPmea +mseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jAuPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCF +TIcQcf+eQxuulXUtgQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj +7zjKsK5Xf/IhMBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E +BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4wM8zAQLpw6o1 +D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2XFNFV1pF1AWZLy4jVe5jaN/T +G3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNj +duMNhXJEIlU/HHzp/LgV6FL6qj6jITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstl +cHboCoWASzY9M/eVVHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys ++TIxxHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1onAX1daBli +2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d7XB4tmBZrOFdRWOPyN9y +aFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2NtjjgKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsAS +ZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFR +JQJ6+N1rZdVtTTDIZbpoFGWsJwt0ivKH +-----END CERTIFICATE----- + +TrustAsia Global Root CA G4 +=========================== +-----BEGIN CERTIFICATE----- +MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMwWjELMAkGA1UE +BhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMMG1Ry +dXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0yMTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJa +MFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQw +IgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AATxs8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbwLxYI+hW8 +m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJijYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mDpm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/ +pDHel4NZg6ZvccveMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AA +bbd+NvBNEU/zy4k6LHiRUKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xk +dUfFVZDj/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== +-----END CERTIFICATE----- + +Telekom Security TLS ECC Root 2020 +================================== +-----BEGIN CERTIFICATE----- +MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQswCQYDVQQGEwJE +RTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJUZWxl +a29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIwMB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIz +NTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkg +R21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqG +SM49AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/OtdKPD/M1 +2kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDPf8iAC8GXs7s1J8nCG6NC +MEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6fMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZ +Mo7k+5Dck2TOrbRBR2Diz6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdU +ga/sf+Rn27iQ7t0l +-----END CERTIFICATE----- + +Telekom Security TLS RSA Root 2023 +================================== +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBjMQswCQYDVQQG +EwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJU +ZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAyMDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMy +NzIzNTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJp +dHkgR21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9cUD/h3VC +KSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHVcp6R+SPWcHu79ZvB7JPP +GeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMAU6DksquDOFczJZSfvkgdmOGjup5czQRx +UX11eKvzWarE4GC+j4NSuHUaQTXtvPM6Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWo +l8hHD/BeEIvnHRz+sTugBTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9 +FIS3R/qy8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73Jco4v +zLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg8qKrBC7m8kwOFjQg +rIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8rFEz0ciD0cmfHdRHNCk+y7AO+oML +KFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7S +WWO/gLCMk3PLNaaZlSJhZQNg+y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUtqeXgj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2 +p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQpGv7qHBFfLp+ +sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm9S3ul0A8Yute1hTWjOKWi0Fp +kzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErwM807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy +/SKE8YXJN3nptT+/XOR0so8RYgDdGGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4 +mZqTuXNnQkYRIer+CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtz +aL1txKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+w6jv/naa +oqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aKL4x35bcF7DvB7L6Gs4a8 +wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+ljX273CXE2whJdV/LItM3z7gLfEdxquVeE +HVlNjM7IDiPCtyaaEBRx/pOyiriA8A4QntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0 +o82bNSQ3+pCTE4FCxpgmdTdmQRCsu/WU48IxK63nI1bMNSWSs1A= +-----END CERTIFICATE----- + +FIRMAPROFESIONAL CA ROOT-A WEB +============================== +-----BEGIN CERTIFICATE----- +MIICejCCAgCgAwIBAgIQMZch7a+JQn81QYehZ1ZMbTAKBggqhkjOPQQDAzBuMQswCQYDVQQGEwJF +UzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25hbCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4 +MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFMIENBIFJPT1QtQSBXRUIwHhcNMjIwNDA2MDkwMTM2 +WhcNNDcwMzMxMDkwMTM2WjBuMQswCQYDVQQGEwJFUzEcMBoGA1UECgwTRmlybWFwcm9mZXNpb25h +bCBTQTEYMBYGA1UEYQwPVkFURVMtQTYyNjM0MDY4MScwJQYDVQQDDB5GSVJNQVBST0ZFU0lPTkFM +IENBIFJPT1QtQSBXRUIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARHU+osEaR3xyrq89Zfe9MEkVz6 +iMYiuYMQYneEMy3pA4jU4DP37XcsSmDq5G+tbbT4TIqk5B/K6k84Si6CcyvHZpsKjECcfIr28jlg +st7L7Ljkb+qbXbdTkBgyVcUgt5SjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUk+FD +Y1w8ndYn81LsF7Kpryz3dvgwHQYDVR0OBBYEFJPhQ2NcPJ3WJ/NS7Beyqa8s93b4MA4GA1UdDwEB +/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjAdfKR7w4l1M+E7qUW/Runpod3JIha3RxEL2Jq68cgL +cFBTApFwhVmpHqTm6iMxoAACMQD94vizrxa5HnPEluPBMBnYfubDl94cT7iJLzPrSA8Z94dGXSaQ +pYXFuXqUPoeovQA= +-----END CERTIFICATE----- + +TWCA CYBER Root CA +================== +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQMQswCQYDVQQG +EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB +IENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQG +EwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NB +IENZQkVSIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1s +Ts6P40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxFavcokPFh +V8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/34bKS1PE2Y2yHer43CdT +o0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684iJkXXYJndzk834H/nY62wuFm40AZoNWDT +Nq5xQwTxaWV4fPMf88oon1oglWa0zbfuj3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK +/c/WMw+f+5eesRycnupfXtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkH +IuNZW0CP2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDAS9TM +fAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDAoS/xUgXJP+92ZuJF +2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzCkHDXShi8fgGwsOsVHkQGzaRP6AzR +wyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83 +QOGt4A1WNzAdBgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB +AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0ttGlTITVX1olN +c79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn68xDiBaiA9a5F/gZbG0jAn/x +X9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNnTKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDR +IG4kqIQnoVesqlVYL9zZyvpoBJ7tRCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq +/p1hvIbZv97Tujqxf36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0R +FxbIQh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz8ppy6rBe +Pm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4NxKfKjLji7gh7MMrZQzv +It6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzXxeSDwWrruoBa3lwtcHb4yOWHh8qgnaHl +IhInD0Q9HWzq1MKLL295q39QpsQZp6F6t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X +-----END CERTIFICATE----- + +SecureSign Root CA12 +==================== +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUZvnHwa/swlG07VOX5uaCwysckBYwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT +ZWN1cmVTaWduIFJvb3QgQ0ExMjAeFw0yMDA0MDgwNTM2NDZaFw00MDA0MDgwNTM2NDZaMFExCzAJ +BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU +U2VjdXJlU2lnbiBSb290IENBMTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6OcE3 +emhFKxS06+QT61d1I02PJC0W6K6OyX2kVzsqdiUzg2zqMoqUm048luT9Ub+ZyZN+v/mtp7JIKwcc +J/VMvHASd6SFVLX9kHrko+RRWAPNEHl57muTH2SOa2SroxPjcf59q5zdJ1M3s6oYwlkm7Fsf0uZl +fO+TvdhYXAvA42VvPMfKWeP+bl+sg779XSVOKik71gurFzJ4pOE+lEa+Ym6b3kaosRbnhW70CEBF +EaCeVESE99g2zvVQR9wsMJvuwPWW0v4JhscGWa5Pro4RmHvzC1KqYiaqId+OJTN5lxZJjfU+1Uef +NzFJM3IFTQy2VYzxV4+Kh9GtxRESOaCtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBRXNPN0zwRL1SXm8UC2LEzZLemgrTANBgkqhkiG9w0BAQsFAAOC +AQEAPrvbFxbS8hQBICw4g0utvsqFepq2m2um4fylOqyttCg6r9cBg0krY6LdmmQOmFxv3Y67ilQi +LUoT865AQ9tPkbeGGuwAtEGBpE/6aouIs3YIcipJQMPTw4WJmBClnW8Zt7vPemVV2zfrPIpyMpce +mik+rY3moxtt9XUa5rBouVui7mlHJzWhhpmA8zNL4WukJsPvdFlseqJkth5Ew1DgDzk9qTPxpfPS +vWKErI4cqc1avTc7bgoitPQV55FYxTpE05Uo2cBl6XLK0A+9H7MV2anjpEcJnuDLN/v9vZfVvhga +aaI5gdka9at/yOPiZwud9AzqVN/Ssq+xIvEg37xEHA== +-----END CERTIFICATE----- + +SecureSign Root CA14 +==================== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEMBQAwUTELMAkG +A1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRT +ZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgwNzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJ +BgNVBAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMU +U2VjdXJlU2lnbiBSb290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh +1oq/FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOgvlIfX8xn +bacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy6pJxaeQp8E+BgQQ8sqVb +1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa +/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9JkdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOE +kJTRX45zGRBdAuVwpcAQ0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSx +jVIHvXiby8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac18iz +ju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs0Wq2XSqypWa9a4X0 +dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIABSMbHdPTGrMNASRZhdCyvjG817XsY +AFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVLApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeq +YR3r6/wtbyPk86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E +rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ibed87hwriZLoA +ymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopTzfFP7ELyk+OZpDc8h7hi2/Ds +Hzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHSDCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPG +FrojutzdfhrGe0K22VoF3Jpf1d+42kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6q +nsb58Nn4DSEC5MUoFlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/ +OfVyK4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6dB7h7sxa +OgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtlLor6CZpO2oYofaphNdgO +pygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB365jJ6UeTo3cKXhZ+PmhIIynJkBugnLN +eLLIjzwec+fBH7/PzqUqm9tEZDKgu39cJRNItX+S +-----END CERTIFICATE----- + +SecureSign Root CA15 +==================== +-----BEGIN CERTIFICATE----- +MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMwUTELMAkGA1UE +BhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBMdGQuMR0wGwYDVQQDExRTZWN1 +cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMyNTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNV +BAYTAkpQMSMwIQYDVQQKExpDeWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2Vj +dXJlU2lnbiBSb290IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5G +dCx4wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSRZHX+AezB +2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT9DAKBggqhkjOPQQDAwNoADBlAjEA2S6J +fl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJ +SwdLZrWeqrqgHkHZAXQ6bkU6iYAZezKYVWOr62Nuk22rGwlgMU4= +-----END CERTIFICATE----- + +D-TRUST BR Root CA 2 2023 +========================= +-----BEGIN CERTIFICATE----- +MIIFqTCCA5GgAwIBAgIQczswBEhb2U14LnNLyaHcZjANBgkqhkiG9w0BAQ0FADBIMQswCQYDVQQG +EwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0Eg +MiAyMDIzMB4XDTIzMDUwOTA4NTYzMVoXDTM4MDUwOTA4NTYzMFowSDELMAkGA1UEBhMCREUxFTAT +BgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDIgMjAyMzCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK7/CVmRgApKaOYkP7in5Mg6CjoWzckjYaCT +cfKri3OPoGdlYNJUa2NRb0kz4HIHE304zQaSBylSa053bATTlfrdTIzZXcFhfUvnKLNEgXtRr90z +sWh81k5M/itoucpmacTsXld/9w3HnDY25QdgrMBM6ghs7wZ8T1soegj8k12b9py0i4a6Ibn08OhZ +WiihNIQaJZG2tY/vsvmA+vk9PBFy2OMvhnbFeSzBqZCTRphny4NqoFAjpzv2gTng7fC5v2Xx2Mt6 +++9zA84A9H3X4F07ZrjcjrqDy4d2A/wl2ecjbwb9Z/Pg/4S8R7+1FhhGaRTMBffb00msa8yr5LUL +QyReS2tNZ9/WtT5PeB+UcSTq3nD88ZP+npNa5JRal1QMNXtfbO4AHyTsA7oC9Xb0n9Sa7YUsOCIv +x9gvdhFP/Wxc6PWOJ4d/GUohR5AdeY0cW/jPSoXk7bNbjb7EZChdQcRurDhaTyN0dKkSw/bSuREV +MweR2Ds3OmMwBtHFIjYoYiMQ4EbMl6zWK11kJNXuHA7e+whadSr2Y23OC0K+0bpwHJwh5Q8xaRfX +/Aq03u2AnMuStIv13lmiWAmlY0cL4UEyNEHZmrHZqLAbWt4NDfTisl01gLmB1IRpkQLLddCNxbU9 +CZEJjxShFHR5PtbJFR2kWVki3PaKRT08EtY+XTIvAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUZ5Dw1t61GNVGKX5cq/ieCLxklRAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRC +MEAwPqA8oDqGOGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfYnJfcm9vdF9jYV8y +XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQA097N3U9swFrktpSHxQCF16+tIFoE9c+CeJyrr +d6kTpGoKWloUMz1oH4Guaf2Mn2VsNELZLdB/eBaxOqwjMa1ef67nriv6uvw8l5VAk1/DLQOj7aRv +U9f6QA4w9QAgLABMjDu0ox+2v5Eyq6+SmNMW5tTRVFxDWy6u71cqqLRvpO8NVhTaIasgdp4D/Ca4 +nj8+AybmTNudX0KEPUUDAxxZiMrcLmEkWqTqJwtzEr5SswrPMhfiHocaFpVIbVrg0M8JkiZmkdij +YQ6qgYF/6FKC0ULn4B0Y+qSFNueG4A3rvNTJ1jxD8V1Jbn6Bm2m1iWKPiFLY1/4nwSPFyysCu7Ff +/vtDhQNGvl3GyiEm/9cCnnRK3PgTFbGBVzbLZVzRHTF36SXDw7IyN9XxmAnkbWOACKsGkoHU6XCP +pz+y7YaMgmo1yEJagtFSGkUPFaUA8JR7ZSdXOUPPfH/mvTWze/EZTN46ls/pdu4D58JDUjxqgejB +WoC9EV2Ta/vH5mQ/u2kc6d0li690yVRAysuTEwrt+2aSEcr1wPrYg1UDfNPFIkZ1cGt5SAYqgpq/ +5usWDiJFAbzdNpQ0qTUmiteXue4Icr80knCDgKs4qllo3UCkGJCy89UDyibK79XH4I9TjvAA46jt +n/mtd+ArY0+ew+43u3gJhJ65bvspmZDogNOfJA== +-----END CERTIFICATE----- + +TrustAsia TLS ECC Root CA +========================= +-----BEGIN CERTIFICATE----- +MIICMTCCAbegAwIBAgIUNnThTXxlE8msg1UloD5Sfi9QaMcwCgYIKoZIzj0EAwMwWDELMAkGA1UE +BhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xIjAgBgNVBAMTGVRy +dXN0QXNpYSBUTFMgRUNDIFJvb3QgQ0EwHhcNMjQwNTE1MDU0MTU2WhcNNDQwNTE1MDU0MTU1WjBY +MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAG +A1UEAxMZVHJ1c3RBc2lhIFRMUyBFQ0MgUm9vdCBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABLh/ +pVs/AT598IhtrimY4ZtcU5nb9wj/1WrgjstEpvDBjL1P1M7UiFPoXlfXTr4sP/MSpwDpguMqWzJ8 +S5sUKZ74LYO1644xST0mYekdcouJtgq7nDM1D9rs3qlKH8kzsaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQULIVTu7FDzTLqnqOH/qKYqKaT6RAwDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49 +BAMDA2gAMGUCMFRH18MtYYZI9HlaVQ01L18N9mdsd0AaRuf4aFtOJx24mH1/k78ITcTaRTChD15K +eAIxAKORh/IRM4PDwYqROkwrULG9IpRdNYlzg8WbGf60oenUoWa2AaU2+dhoYSi3dOGiMQ== +-----END CERTIFICATE----- + +TrustAsia TLS RSA Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIFgDCCA2igAwIBAgIUHBjYz+VTPyI1RlNUJDxsR9FcSpwwDQYJKoZIhvcNAQEMBQAwWDELMAkG +A1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xIjAgBgNVBAMT +GVRydXN0QXNpYSBUTFMgUlNBIFJvb3QgQ0EwHhcNMjQwNTE1MDU0MTU3WhcNNDQwNTE1MDU0MTU2 +WjBYMQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEi +MCAGA1UEAxMZVHJ1c3RBc2lhIFRMUyBSU0EgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMMWuBtqpERz5dZO9LnPWwvB0ZqB9WOwj0PBuwhaGnrhB3YmH49pVr7+NmDQDIPN +lOrnxS1cLwUWAp4KqC/lYCZUlviYQB2srp10Zy9U+5RjmOMmSoPGlbYJQ1DNDX3eRA5gEk9bNb2/ +mThtfWza4mhzH/kxpRkQcwUqwzIZheo0qt1CHjCNP561HmHVb70AcnKtEj+qpklz8oYVlQwQX1Fk +zv93uMltrOXVmPGZLmzjyUT5tUMnCE32ft5EebuyjBza00tsLtbDeLdM1aTk2tyKjg7/D8OmYCYo +zza/+lcK7Fs/6TAWe8TbxNRkoDD75f0dcZLdKY9BWN4ArTr9PXwaqLEX8E40eFgl1oUh63kd0Nyr +z2I8sMeXi9bQn9P+PN7F4/w6g3CEIR0JwqH8uyghZVNgepBtljhb//HXeltt08lwSUq6HTrQUNoy +IBnkiz/r1RYmNzz7dZ6wB3C4FGB33PYPXFIKvF1tjVEK2sUYyJtt3LCDs3+jTnhMmCWr8n4uIF6C +FabW2I+s5c0yhsj55NqJ4js+k8UTav/H9xj8Z7XvGCxUq0DTbE3txci3OE9kxJRMT6DNrqXGJyV1 +J23G2pyOsAWZ1SgRxSHUuPzHlqtKZFlhaxP8S8ySpg+kUb8OWJDZgoM5pl+z+m6Ss80zDoWo8SnT +q1mt1tve1CuBAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLgHkXlcBvRG/XtZ +ylomkadFK/hTMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQwFAAOCAgEAIZtqBSBdGBanEqT3 +Rz/NyjuujsCCztxIJXgXbODgcMTWltnZ9r96nBO7U5WS/8+S4PPFJzVXqDuiGev4iqME3mmL5Dw8 +veWv0BIb5Ylrc5tvJQJLkIKvQMKtuppgJFqBTQUYo+IzeXoLH5Pt7DlK9RME7I10nYEKqG/odv6L +TytpEoYKNDbdgptvT+Bz3Ul/KD7JO6NXBNiT2Twp2xIQaOHEibgGIOcberyxk2GaGUARtWqFVwHx +tlotJnMnlvm5P1vQiJ3koP26TpUJg3933FEFlJ0gcXax7PqJtZwuhfG5WyRasQmr2soaB82G39tp +27RIGAAtvKLEiUUjpQ7hRGU+isFqMB3iYPg6qocJQrmBktwliJiJ8Xw18WLK7nn4GS/+X/jbh87q +qA8MpugLoDzga5SYnH+tBuYc6kIQX+ImFTw3OffXvO645e8D7r0i+yiGNFjEWn9hongPXvPKnbwb +PKfILfanIhHKA9jnZwqKDss1jjQ52MjqjZ9k4DewbNfFj8GQYSbbJIweSsCI3zWQzj8C9GRh3sfI +B5XeMhg6j6JCQCTl1jNdfK7vsU1P1FeQNWrcrgSXSYk0ly4wBOeY99sLAZDBHwo/+ML+TvrbmnNz +FrwFuHnYWa8G5z9nODmxfKuU4CkUpijy323imttUQ/hHWKNddBWcwauwxzQ= +-----END CERTIFICATE----- + +D-TRUST EV Root CA 2 2023 +========================= +-----BEGIN CERTIFICATE----- +MIIFqTCCA5GgAwIBAgIQaSYJfoBLTKCnjHhiU19abzANBgkqhkiG9w0BAQ0FADBIMQswCQYDVQQG +EwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0Eg +MiAyMDIzMB4XDTIzMDUwOTA5MTAzM1oXDTM4MDUwOTA5MTAzMlowSDELMAkGA1UEBhMCREUxFTAT +BgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDIgMjAyMzCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANiOo4mAC7JXUtypU0w3uX9jFxPvp1sjW2l1 +sJkKF8GLxNuo4MwxusLyzV3pt/gdr2rElYfXR8mV2IIEUD2BCP/kPbOx1sWy/YgJ25yE7CUXFId/ +MHibaljJtnMoPDT3mfd/06b4HEV8rSyMlD/YZxBTfiLNTiVR8CUkNRFeEMbsh2aJgWi6zCudR3Mf +vc2RpHJqnKIbGKBv7FD0fUDCqDDPvXPIEysQEx6Lmqg6lHPTGGkKSv/BAQP/eX+1SH977ugpbzZM +lWGG2Pmic4ruri+W7mjNPU0oQvlFKzIbRlUWaqZLKfm7lVa/Rh3sHZMdwGWyH6FDrlaeoLGPaxK3 +YG14C8qKXO0elg6DpkiVjTujIcSuWMYAsoS0I6SWhjW42J7YrDRJmGOVxcttSEfi8i4YHtAxq910 +7PncjLgcjmgjutDzUNzPZY9zOjLHfP7KgiJPvo5iR2blzYfi6NUPGJ/lBHJLRjwQ8kTCZFZxTnXo +nMkmdMV9WdEKWw9t/p51HBjGGjp82A0EzM23RWV6sY+4roRIPrN6TagD4uJ+ARZZaBhDM7DS3LAa +QzXupdqpRlyuhoFBAUp0JuyfBr/CBTdkdXgpaP3F9ev+R/nkhbDhezGdpn9yo7nELC7MmVcOIQxF +AZRl62UJxmMiCzNJkkg8/M3OsD6Onov4/knFNXJHAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUqvyREBuHkV8Wub9PS5FeAByxMoAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRC +MEAwPqA8oDqGOGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfZXZfcm9vdF9jYV8y +XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQCTy6UfmRHsmg1fLBWTxj++EI14QvBukEdHjqOS +Mo1wj/Zbjb6JzkcBahsgIIlbyIIQbODnmaprxiqgYzWRaoUlrRc4pZt+UPJ26oUFKidBK7GB0aL2 +QHWpDsvxVUjY7NHss+jOFKE17MJeNRqrphYBBo7q3C+jisosketSjl8MmxfPy3MHGcRqwnNU73xD +UmPBEcrCRbH0O1P1aa4846XerOhUt7KR/aypH/KH5BfGSah82ApB9PI+53c0BFLd6IHyTS9URZ0V +4U/M5d40VxDJI3IXcI1QcB9WbMy5/zpaT2N6w25lBx2Eof+pDGOJbbJAiDnXH3dotfyc1dZnaVuo +dNv8ifYbMvekJKZ2t0dT741Jj6m2g1qllpBFYfXeA08mD6iL8AOWsKwV0HFaanuU5nCT2vFp4LJi +TZ6P/4mdm13NRemUAiKN4DV/6PEEeXFsVIP4M7kFMhtYVRFP0OUnR3Hs7dpn1mKmS00PaaLJvOwi +S5THaJQXfuKOKD62xur1NGyfN4gHONuGcfrNlUhDbqNPgofXNJhuS5N5YHVpD/Aa1VP6IQzCP+k/ +HxiMkl14p3ZnGbuy6n/pcAlWVqOwDAstNl7F6cTVg8uGF5csbBNvh1qvSaYd2804BC5f4ko1Di1L ++KIkBI3Y4WNeApI02phhXBxvWHZks/wCuPWdCg== +-----END CERTIFICATE----- + +SwissSign RSA TLS Root CA 2022 - 1 +================================== +-----BEGIN CERTIFICATE----- +MIIFkzCCA3ugAwIBAgIUQ/oMX04bgBhE79G0TzUfRPSA7cswDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzErMCkGA1UEAxMiU3dpc3NTaWduIFJTQSBU +TFMgUm9vdCBDQSAyMDIyIC0gMTAeFw0yMjA2MDgxMTA4MjJaFw00NzA2MDgxMTA4MjJaMFExCzAJ +BgNVBAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxKzApBgNVBAMTIlN3aXNzU2lnbiBSU0Eg +VExTIFJvb3QgQ0EgMjAyMiAtIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDLKmji +C8NXvDVjvHClO/OMPE5Xlm7DTjak9gLKHqquuN6orx122ro10JFwB9+zBvKK8i5VUXu7LCTLf5Im +gKO0lPaCoaTo+nUdWfMHamFk4saMla+ju45vVs9xzF6BYQ1t8qsCLqSX5XH8irCRIFucdFJtrhUn +WXjyCcplDn/L9Ovn3KlMd/YrFgSVrpxxpT8q2kFC5zyEEPThPYxr4iuRR1VPuFa+Rd4iUU1OKNlf +GUEGjw5NBuBwQCMBauTLE5tzrE0USJIt/m2n+IdreXXhvhCxqohAWVTXz8TQm0SzOGlkjIHRI36q +OTw7D59Ke4LKa2/KIj4x0LDQKhySio/YGZxH5D4MucLNvkEM+KRHBdvBFzA4OmnczcNpI/2aDwLO +EGrOyvi5KaM2iYauC8BPY7kGWUleDsFpswrzd34unYyzJ5jSmY0lpx+Gs6ZUcDj8fV3oT4MM0ZPl +EuRU2j7yrTrePjxF8CgPBrnh25d7mUWe3f6VWQQvdT/TromZhqwUtKiE+shdOxtYk8EXlFXIC+OC +eYSf8wCENO7cMdWP8vpPlkwGqnj73mSiI80fPsWMvDdUDrtaclXvyFu1cvh43zcgTFeRc5JzrBh3 +Q4IgaezprClG5QtO+DdziZaKHG29777YtvTKwP1H8K4LWCDFyB02rpeNUIMmJCn3nTsPBQIDAQAB +o2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBRvjmKLk0Ow +4UD2p8P98Q+4DxU4pTAdBgNVHQ4EFgQUb45ii5NDsOFA9qfD/fEPuA8VOKUwDQYJKoZIhvcNAQEL +BQADggIBAKwsKUF9+lz1GpUYvyypiqkkVHX1uECry6gkUSsYP2OprphWKwVDIqO310aewCoSPY6W +lkDfDDOLazeROpW7OSltwAJsipQLBwJNGD77+3v1dj2b9l4wBlgzHqp41eZUBDqyggmNzhYzWUUo +8aWjlw5DI/0LIICQ/+Mmz7hkkeUFjxOgdg3XNwwQiJb0Pr6VvfHDffCjw3lHC1ySFWPtUnWK50Zp +y1FVCypM9fJkT6lc/2cyjlUtMoIcgC9qkfjLvH4YoiaoLqNTKIftV+Vlek4ASltOU8liNr3Cjlvr +zG4ngRhZi0Rjn9UMZfQpZX+RLOV/fuiJz48gy20HQhFRJjKKLjpHE7iNvUcNCfAWpO2Whi4Z2L6M +OuhFLhG6rlrnub+xzI/goP+4s9GFe3lmozm1O2bYQL7Pt2eLSMkZJVX8vY3PXtpOpvJpzv1/THfQ +wUY1mFwjmwJFQ5Ra3bxHrSL+ul4vkSkphnsh3m5kt8sNjzdbowhq6/TdAo9QAwKxuDdollDruF/U +KIqlIgyKhPBZLtU30WHlQnNYKoH3dtvi4k0NX/a3vgW0rk4N3hY9A4GzJl5LuEsAz/+MF7psYC0n +hzck5npgL7XTgwSqT0N1osGDsieYK7EOgLrAhV5Cud+xYJHT6xh+cHiudoO+cVrQkOPKwRYlZ0rw +tnu64ZzZ +-----END CERTIFICATE----- + +OISTE Server Root ECC G1 +======================== +-----BEGIN CERTIFICATE----- +MIICNTCCAbqgAwIBAgIQI/nD1jWvjyhLH/BU6n6XnTAKBggqhkjOPQQDAzBLMQswCQYDVQQGEwJD +SDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UEAwwYT0lTVEUgU2VydmVyIFJvb3Qg +RUNDIEcxMB4XDTIzMDUzMTE0NDIyOFoXDTQ4MDUyNDE0NDIyN1owSzELMAkGA1UEBhMCQ0gxGTAX +BgNVBAoMEE9JU1RFIEZvdW5kYXRpb24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IEVDQyBH +MTB2MBAGByqGSM49AgEGBSuBBAAiA2IABBcv+hK8rBjzCvRE1nZCnrPoH7d5qVi2+GXROiFPqOuj +vqQycvO2Ackr/XeFblPdreqqLiWStukhEaivtUwL85Zgmjvn6hp4LrQ95SjeHIC6XG4N2xml4z+c +KrhAS93mT6NjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBQ3TYhlz/w9itWj8UnATgwQ +b0K0nDAdBgNVHQ4EFgQUN02IZc/8PYrVo/FJwE4MEG9CtJwwDgYDVR0PAQH/BAQDAgGGMAoGCCqG +SM49BAMDA2kAMGYCMQCpKjAd0MKfkFFRQD6VVCHNFmb3U2wIFjnQEnx/Yxvf4zgAOdktUyBFCxxg +ZzFDJe0CMQCSia7pXGKDYmH5LVerVrkR3SW+ak5KGoJr3M/TvEqzPNcum9v4KGm8ay3sMaE641c= +-----END CERTIFICATE----- + + OISTE Server Root RSA G1 +========================= +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIQVaXZZ5Qoxu0M+ifdWwFNGDANBgkqhkiG9w0BAQwFADBLMQswCQYDVQQG +EwJDSDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UEAwwYT0lTVEUgU2VydmVyIFJv +b3QgUlNBIEcxMB4XDTIzMDUzMTE0MzcxNloXDTQ4MDUyNDE0MzcxNVowSzELMAkGA1UEBhMCQ0gx +GTAXBgNVBAoMEE9JU1RFIEZvdW5kYXRpb24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IFJT +QSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKqu9KuCz/vlNwvn1ZatkOhLKdxV +YOPMvLO8LZK55KN68YG0nnJyQ98/qwsmtO57Gmn7KNByXEptaZnwYx4M0rH/1ow00O7brEi56rAU +jtgHqSSY3ekJvqgiG1k50SeH3BzN+Puz6+mTeO0Pzjd8JnduodgsIUzkik/HEzxux9UTl7Ko2yRp +g1bTacuCErudG/L4NPKYKyqOBGf244ehHa1uzjZ0Dl4zO8vbUZeUapU8zhhabkvG/AePLhq5Svdk +NCncpo1Q4Y2LS+VIG24ugBA/5J8bZT8RtOpXaZ+0AOuFJJkk9SGdl6r7NH8CaxWQrbueWhl/pIzY ++m0o/DjH40ytas7ZTpOSjswMZ78LS5bOZmdTaMsXEY5Z96ycG7mOaES3GK/m5Q9l3JUJsJMStR8+ +lKXHiHUhsd4JJCpM4rzsTGdHwimIuQq6+cF0zowYJmXa92/GjHtoXAvuY8BeS/FOzJ8vD+HomnqT +8eDI278n5mUpezbgMxVz8p1rhAhoKzYHKyfMeNhqhw5HdPSqoBNdZH702xSu+zrkL8Fl47l6QGzw +Brd7KJvX4V84c5Ss2XCTLdyEr0YconosP4EmQufU2MVshGYRi3drVByjtdgQ8K4p92cIiBdcuJd5 +z+orKu5YM+Vt6SmqZQENghPsJQtdLEByFSnTkCz3GkPVavBpAgMBAAGjYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHwYDVR0jBBgwFoAU8snBDw1jALvsRQ5KH7WxszbNDo0wHQYDVR0OBBYEFPLJwQ8NYwC7 +7EUOSh+1sbM2zQ6NMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQwFAAOCAgEANGd5sjrG5T33 +I3K5Ce+SrScfoE4KsvXaFwyihdJ+klH9FWXXXGtkFu6KRcoMQzZENdl//nk6HOjG5D1rd9QhEOP2 +8yBOqb6J8xycqd+8MDoX0TJD0KqKchxRKEzdNsjkLWd9kYccnbz8qyiWXmFcuCIzGEgWUOrKL+ml +Sdx/PKQZvDatkuK59EvV6wit53j+F8Bdh3foZ3dPAGav9LEDOr4SfEE15fSmG0eLy3n31r8Xbk5l +8PjaV8GUgeV6Vg27Rn9vkf195hfkgSe7BYhW3SCl95gtkRlpMV+bMPKZrXJAlszYd2abtNUOshD+ +FKrDgHGdPY3ofRRsYWSGRqbXVMW215AWRqWFyp464+YTFrYVI8ypKVL9AMb2kI5Wj4kI3Zaq5tNq +qYY19tVFeEJKRvwDyF7YZvZFZSS0vod7VSCd9521Kvy5YhnLbDuv0204bKt7ph6N/Ome/msVuduC +msuY33OhkKCgxeDoAaijFJzIwZqsFVAzje18KotzlUBDJvyBpCpfOZC3J8tRd/iWkx7P8nd9H0aT +olkelUTFLXVksNb54Dxp6gS1HAviRkRNQzuXSXERvSS2wq1yVAb+axj5d9spLFKebXd7Yv0PTY6Y +MjAwcRLWJTXjn/hvnLXrahut6hDTlhZyBiElxky8j3C7DOReIoMt0r7+hVu05L0= +-----END CERTIFICATE----- diff --git a/stripe-php/init.php b/stripe-php/init.php new file mode 100644 index 0000000..34e5dcb --- /dev/null +++ b/stripe-php/init.php @@ -0,0 +1,426 @@ + VERSION + perl -pi -e 's|VERSION = '\''[.\-\w\d]+'\''|VERSION = '\''{{ version }}'\''|' lib/Stripe.php + + +PHPDOCUMENTOR_VERSION := "v3.0.0" +# generates docs; currently broken? can unhide if working +[private] +phpdoc: + #!/usr/bin/env bash + set -euo pipefail + + if [ ! -f vendor/bin/phpdoc ]; then + curl -sfL https://github.com/phpDocumentor/phpDocumentor/releases/download/{{ PHPDOCUMENTOR_VERSION }}/phpDocumentor.phar -o vendor/bin/phpdoc + chmod +x vendor/bin/phpdoc + fi + + phpdoc diff --git a/stripe-php/lib/Account.php b/stripe-php/lib/Account.php new file mode 100644 index 0000000..b32e3a7 --- /dev/null +++ b/stripe-php/lib/Account.php @@ -0,0 +1,523 @@ +controller.requirement_collection + * is application, which includes Custom accounts, the properties below are always + * returned. + * + * For accounts where controller.requirement_collection + * is stripe, which includes Standard and Express accounts, some properties are only returned + * until you create an Account Link or Account Session + * to start Connect Onboarding. Learn about the differences between accounts. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|(object{annual_revenue?: null|(object{amount: null|int, currency: null|string, fiscal_year_end: null|string}&StripeObject), estimated_worker_count?: null|int, mcc: null|string, minority_owned_business_designation: null|string[], monthly_estimated_revenue?: (object{amount: int, currency: string}&StripeObject), name: null|string, product_description?: null|string, support_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), support_email: null|string, support_phone: null|string, support_url: null|string, url: null|string}&StripeObject) $business_profile Business information about the account. + * @property null|string $business_type The business type. + * @property null|(object{acss_debit_payments?: string, affirm_payments?: string, afterpay_clearpay_payments?: string, alma_payments?: string, amazon_pay_payments?: string, au_becs_debit_payments?: string, bacs_debit_payments?: string, bancontact_payments?: string, bank_transfer_payments?: string, billie_payments?: string, blik_payments?: string, boleto_payments?: string, card_issuing?: string, card_payments?: string, cartes_bancaires_payments?: string, cashapp_payments?: string, crypto_payments?: string, eps_payments?: string, fpx_payments?: string, gb_bank_transfer_payments?: string, giropay_payments?: string, grabpay_payments?: string, ideal_payments?: string, india_international_payments?: string, jcb_payments?: string, jp_bank_transfer_payments?: string, kakao_pay_payments?: string, klarna_payments?: string, konbini_payments?: string, kr_card_payments?: string, legacy_payments?: string, link_payments?: string, mb_way_payments?: string, mobilepay_payments?: string, multibanco_payments?: string, mx_bank_transfer_payments?: string, naver_pay_payments?: string, nz_bank_account_becs_debit_payments?: string, oxxo_payments?: string, p24_payments?: string, pay_by_bank_payments?: string, payco_payments?: string, paynow_payments?: string, payto_payments?: string, pix_payments?: string, promptpay_payments?: string, revolut_pay_payments?: string, samsung_pay_payments?: string, satispay_payments?: string, sepa_bank_transfer_payments?: string, sepa_debit_payments?: string, sofort_payments?: string, swish_payments?: string, tax_reporting_us_1099_k?: string, tax_reporting_us_1099_misc?: string, transfers?: string, treasury?: string, twint_payments?: string, us_bank_account_ach_payments?: string, us_bank_transfer_payments?: string, zip_payments?: string}&StripeObject) $capabilities + * @property null|bool $charges_enabled Whether the account can process charges. + * @property null|(object{address?: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), address_kana?: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string, town: null|string}&StripeObject), address_kanji?: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string, town: null|string}&StripeObject), directors_provided?: bool, directorship_declaration?: null|(object{date: null|int, ip: null|string, user_agent: null|string}&StripeObject), executives_provided?: bool, export_license_id?: string, export_purpose_code?: string, name?: null|string, name_kana?: null|string, name_kanji?: null|string, owners_provided?: bool, ownership_declaration?: null|(object{date: null|int, ip: null|string, user_agent: null|string}&StripeObject), ownership_exemption_reason?: string, phone?: null|string, registration_date?: (object{day: null|int, month: null|int, year: null|int}&StripeObject), representative_declaration?: null|(object{date: null|int, ip: null|string, user_agent: null|string}&StripeObject), structure?: string, tax_id_provided?: bool, tax_id_registrar?: string, vat_id_provided?: bool, verification?: null|(object{document: (object{back: null|File|string, details: null|string, details_code: null|string, front: null|File|string}&StripeObject)}&StripeObject)}&StripeObject) $company + * @property null|(object{fees?: (object{payer: string}&StripeObject), is_controller?: bool, losses?: (object{payments: string}&StripeObject), requirement_collection?: string, stripe_dashboard?: (object{type: string}&StripeObject), type: string}&StripeObject) $controller + * @property null|string $country The account's country. + * @property null|int $created Time at which the account was connected. Measured in seconds since the Unix epoch. + * @property null|string $default_currency Three-letter ISO currency code representing the default currency for the account. This must be a currency that Stripe supports in the account's country. + * @property null|bool $details_submitted Whether account details have been submitted. Accounts with Stripe Dashboard access, which includes Standard accounts, cannot receive payouts before this is true. Accounts where this is false should be directed to an onboarding flow to finish submitting account details. + * @property null|string $email An email address associated with the account. It's not used for authentication and Stripe doesn't market to this field without explicit approval from the platform. + * @property null|Collection $external_accounts External accounts (bank accounts and debit cards) currently attached to this account. External accounts are only returned for requests where controller[is_controller] is true. + * @property null|(object{alternatives: null|(object{alternative_fields_due: string[], original_fields_due: string[]}&StripeObject)[], current_deadline: null|int, currently_due: null|string[], disabled_reason: null|string, errors: null|(object{code: string, reason: string, requirement: string}&StripeObject)[], eventually_due: null|string[], past_due: null|string[], pending_verification: null|string[]}&StripeObject) $future_requirements + * @property null|(object{payments_pricing: null|string}&StripeObject) $groups The groups associated with the account. + * @property null|Person $individual

This is an object representing a person associated with a Stripe account.

A platform can only access a subset of data in a person for an account where account.controller.requirement_collection is stripe, which includes Standard and Express accounts, after creating an Account Link or Account Session to start Connect onboarding.

See the Standard onboarding or Express onboarding documentation for information about prefilling information and account onboarding steps. Learn more about handling identity verification with the API.

+ * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|bool $payouts_enabled Whether the funds in this account can be paid out. + * @property null|(object{alternatives: null|(object{alternative_fields_due: string[], original_fields_due: string[]}&StripeObject)[], current_deadline: null|int, currently_due: null|string[], disabled_reason: null|string, errors: null|(object{code: string, reason: string, requirement: string}&StripeObject)[], eventually_due: null|string[], past_due: null|string[], pending_verification: null|string[]}&StripeObject) $requirements + * @property null|(object{bacs_debit_payments?: (object{display_name: null|string, service_user_number: null|string}&StripeObject), branding: (object{icon: null|File|string, logo: null|File|string, primary_color: null|string, secondary_color: null|string}&StripeObject), card_issuing?: (object{tos_acceptance?: (object{date: null|int, ip: null|string, user_agent?: string}&StripeObject)}&StripeObject), card_payments: (object{decline_on?: (object{avs_failure: bool, cvc_failure: bool}&StripeObject), statement_descriptor_prefix: null|string, statement_descriptor_prefix_kana: null|string, statement_descriptor_prefix_kanji: null|string}&StripeObject), dashboard: (object{display_name: null|string, timezone: null|string}&StripeObject), invoices?: (object{default_account_tax_ids: null|(string|TaxId)[], hosted_payment_method_save: null|string}&StripeObject), payments: (object{statement_descriptor: null|string, statement_descriptor_kana: null|string, statement_descriptor_kanji: null|string, statement_descriptor_prefix_kana: null|string, statement_descriptor_prefix_kanji: null|string}&StripeObject), payouts?: (object{debit_negative_balances: bool, schedule: (object{delay_days: int, interval: string, monthly_anchor?: int, monthly_payout_days?: int[], weekly_anchor?: string, weekly_payout_days?: string[]}&StripeObject), statement_descriptor: null|string}&StripeObject), sepa_debit_payments?: (object{creditor_id?: string}&StripeObject), treasury?: (object{tos_acceptance?: (object{date: null|int, ip: null|string, user_agent?: string}&StripeObject)}&StripeObject)}&StripeObject) $settings Options for customizing how the account functions within Stripe. + * @property null|(object{date?: null|int, ip?: null|string, service_agreement?: string, user_agent?: null|string}&StripeObject) $tos_acceptance + * @property null|string $type The Stripe account type. Can be standard, express, custom, or none. + */ +class Account extends ApiResource +{ + const OBJECT_NAME = 'account'; + + use ApiOperations\NestedResource; + use ApiOperations\Update; + + const BUSINESS_TYPE_COMPANY = 'company'; + const BUSINESS_TYPE_GOVERNMENT_ENTITY = 'government_entity'; + const BUSINESS_TYPE_INDIVIDUAL = 'individual'; + const BUSINESS_TYPE_NON_PROFIT = 'non_profit'; + + const TYPE_CUSTOM = 'custom'; + const TYPE_EXPRESS = 'express'; + const TYPE_NONE = 'none'; + const TYPE_STANDARD = 'standard'; + + /** + * With Connect, you can create Stripe accounts for + * your users. To do this, you’ll first need to register your + * platform. + * + * If you’ve already collected information for your connected accounts, you can prefill that information + * when creating the account. Connect Onboarding won’t ask for the prefilled + * information during account onboarding. You can prefill any information on the + * account. + * + * @param null|array{account_token?: string, business_profile?: array{annual_revenue?: array{amount: int, currency: string, fiscal_year_end: string}, estimated_worker_count?: int, mcc?: string, minority_owned_business_designation?: string[], monthly_estimated_revenue?: array{amount: int, currency: string}, name?: string, product_description?: string, support_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, support_email?: string, support_phone?: string, support_url?: null|string, url?: string}, business_type?: string, capabilities?: array{acss_debit_payments?: array{requested?: bool}, affirm_payments?: array{requested?: bool}, afterpay_clearpay_payments?: array{requested?: bool}, alma_payments?: array{requested?: bool}, amazon_pay_payments?: array{requested?: bool}, au_becs_debit_payments?: array{requested?: bool}, bacs_debit_payments?: array{requested?: bool}, bancontact_payments?: array{requested?: bool}, bank_transfer_payments?: array{requested?: bool}, billie_payments?: array{requested?: bool}, blik_payments?: array{requested?: bool}, boleto_payments?: array{requested?: bool}, card_issuing?: array{requested?: bool}, card_payments?: array{requested?: bool}, cartes_bancaires_payments?: array{requested?: bool}, cashapp_payments?: array{requested?: bool}, crypto_payments?: array{requested?: bool}, eps_payments?: array{requested?: bool}, fpx_payments?: array{requested?: bool}, gb_bank_transfer_payments?: array{requested?: bool}, giropay_payments?: array{requested?: bool}, grabpay_payments?: array{requested?: bool}, ideal_payments?: array{requested?: bool}, india_international_payments?: array{requested?: bool}, jcb_payments?: array{requested?: bool}, jp_bank_transfer_payments?: array{requested?: bool}, kakao_pay_payments?: array{requested?: bool}, klarna_payments?: array{requested?: bool}, konbini_payments?: array{requested?: bool}, kr_card_payments?: array{requested?: bool}, legacy_payments?: array{requested?: bool}, link_payments?: array{requested?: bool}, mb_way_payments?: array{requested?: bool}, mobilepay_payments?: array{requested?: bool}, multibanco_payments?: array{requested?: bool}, mx_bank_transfer_payments?: array{requested?: bool}, naver_pay_payments?: array{requested?: bool}, nz_bank_account_becs_debit_payments?: array{requested?: bool}, oxxo_payments?: array{requested?: bool}, p24_payments?: array{requested?: bool}, pay_by_bank_payments?: array{requested?: bool}, payco_payments?: array{requested?: bool}, paynow_payments?: array{requested?: bool}, payto_payments?: array{requested?: bool}, pix_payments?: array{requested?: bool}, promptpay_payments?: array{requested?: bool}, revolut_pay_payments?: array{requested?: bool}, samsung_pay_payments?: array{requested?: bool}, satispay_payments?: array{requested?: bool}, sepa_bank_transfer_payments?: array{requested?: bool}, sepa_debit_payments?: array{requested?: bool}, sofort_payments?: array{requested?: bool}, swish_payments?: array{requested?: bool}, tax_reporting_us_1099_k?: array{requested?: bool}, tax_reporting_us_1099_misc?: array{requested?: bool}, transfers?: array{requested?: bool}, treasury?: array{requested?: bool}, twint_payments?: array{requested?: bool}, us_bank_account_ach_payments?: array{requested?: bool}, us_bank_transfer_payments?: array{requested?: bool}, zip_payments?: array{requested?: bool}}, company?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, directors_provided?: bool, directorship_declaration?: array{date?: int, ip?: string, user_agent?: string}, executives_provided?: bool, export_license_id?: string, export_purpose_code?: string, name?: string, name_kana?: string, name_kanji?: string, owners_provided?: bool, ownership_declaration?: array{date?: int, ip?: string, user_agent?: string}, ownership_exemption_reason?: null|string, phone?: string, registration_date?: null|array{day: int, month: int, year: int}, registration_number?: string, representative_declaration?: array{date?: int, ip?: string, user_agent?: string}, structure?: null|string, tax_id?: string, tax_id_registrar?: string, vat_id?: string, verification?: array{document?: array{back?: string, front?: string}}}, controller?: array{fees?: array{payer?: string}, losses?: array{payments?: string}, requirement_collection?: string, stripe_dashboard?: array{type?: string}}, country?: string, default_currency?: string, documents?: array{bank_account_ownership_verification?: array{files?: string[]}, company_license?: array{files?: string[]}, company_memorandum_of_association?: array{files?: string[]}, company_ministerial_decree?: array{files?: string[]}, company_registration_verification?: array{files?: string[]}, company_tax_id_verification?: array{files?: string[]}, proof_of_address?: array{files?: string[]}, proof_of_registration?: array{files?: string[], signer?: array{person?: string}}, proof_of_ultimate_beneficial_ownership?: array{files?: string[], signer?: array{person?: string}}}, email?: string, expand?: string[], external_account?: array|string, groups?: array{payments_pricing?: null|string}, individual?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, dob?: null|array{day: int, month: int, year: int}, email?: string, first_name?: string, first_name_kana?: string, first_name_kanji?: string, full_name_aliases?: null|string[], gender?: string, id_number?: string, id_number_secondary?: string, last_name?: string, last_name_kana?: string, last_name_kanji?: string, maiden_name?: string, metadata?: null|array, phone?: string, political_exposure?: string, registered_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: null|float, title?: string}, ssn_last_4?: string, verification?: array{additional_document?: array{back?: string, front?: string}, document?: array{back?: string, front?: string}}}, metadata?: null|array, settings?: array{bacs_debit_payments?: array{display_name?: string}, branding?: array{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}, card_issuing?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, card_payments?: array{decline_on?: array{avs_failure?: bool, cvc_failure?: bool}, statement_descriptor_prefix?: string, statement_descriptor_prefix_kana?: null|string, statement_descriptor_prefix_kanji?: null|string}, invoices?: array{hosted_payment_method_save?: string}, payments?: array{statement_descriptor?: string, statement_descriptor_kana?: string, statement_descriptor_kanji?: string}, payouts?: array{debit_negative_balances?: bool, schedule?: array{delay_days?: array|int|string, interval?: string, monthly_anchor?: int, monthly_payout_days?: int[], weekly_anchor?: string, weekly_payout_days?: string[]}, statement_descriptor?: string}, treasury?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}}, tos_acceptance?: array{date?: int, ip?: string, service_agreement?: string, user_agent?: string}, type?: string} $params + * @param null|array|string $options + * + * @return Account the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * With Connect, you can delete accounts you manage. + * + * Test-mode accounts can be deleted at any time. + * + * Live-mode accounts that have access to the standard dashboard and Stripe is + * responsible for negative account balances cannot be deleted, which includes + * Standard accounts. All other Live-mode accounts, can be deleted when all balances are zero. + * + * If you want to delete your own account, use the account information tab in + * your account settings instead. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return Account the deleted resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * Returns a list of accounts connected to your platform via Connect. If you’re not a platform, the list is empty. + * + * @param null|array{created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Updates a connected account by setting the + * values of the parameters passed. Any parameters not provided are left unchanged. + * + * For accounts where controller.requirement_collection + * is application, which includes Custom accounts, you can update any + * information on the account. + * + * For accounts where controller.requirement_collection + * is stripe, which includes Standard and Express accounts, you can + * update all information until you create an Account + * Link or Account Session to start Connect + * onboarding, after which some properties can no longer be updated. + * + * To update your own account, use the Dashboard. Refer to our + * Connect documentation to learn + * more about updating accounts. + * + * @param string $id the ID of the resource to update + * @param null|array{account_token?: string, business_profile?: array{annual_revenue?: array{amount: int, currency: string, fiscal_year_end: string}, estimated_worker_count?: int, mcc?: string, minority_owned_business_designation?: string[], monthly_estimated_revenue?: array{amount: int, currency: string}, name?: string, product_description?: string, support_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, support_email?: string, support_phone?: string, support_url?: null|string, url?: string}, business_type?: string, capabilities?: array{acss_debit_payments?: array{requested?: bool}, affirm_payments?: array{requested?: bool}, afterpay_clearpay_payments?: array{requested?: bool}, alma_payments?: array{requested?: bool}, amazon_pay_payments?: array{requested?: bool}, au_becs_debit_payments?: array{requested?: bool}, bacs_debit_payments?: array{requested?: bool}, bancontact_payments?: array{requested?: bool}, bank_transfer_payments?: array{requested?: bool}, billie_payments?: array{requested?: bool}, blik_payments?: array{requested?: bool}, boleto_payments?: array{requested?: bool}, card_issuing?: array{requested?: bool}, card_payments?: array{requested?: bool}, cartes_bancaires_payments?: array{requested?: bool}, cashapp_payments?: array{requested?: bool}, crypto_payments?: array{requested?: bool}, eps_payments?: array{requested?: bool}, fpx_payments?: array{requested?: bool}, gb_bank_transfer_payments?: array{requested?: bool}, giropay_payments?: array{requested?: bool}, grabpay_payments?: array{requested?: bool}, ideal_payments?: array{requested?: bool}, india_international_payments?: array{requested?: bool}, jcb_payments?: array{requested?: bool}, jp_bank_transfer_payments?: array{requested?: bool}, kakao_pay_payments?: array{requested?: bool}, klarna_payments?: array{requested?: bool}, konbini_payments?: array{requested?: bool}, kr_card_payments?: array{requested?: bool}, legacy_payments?: array{requested?: bool}, link_payments?: array{requested?: bool}, mb_way_payments?: array{requested?: bool}, mobilepay_payments?: array{requested?: bool}, multibanco_payments?: array{requested?: bool}, mx_bank_transfer_payments?: array{requested?: bool}, naver_pay_payments?: array{requested?: bool}, nz_bank_account_becs_debit_payments?: array{requested?: bool}, oxxo_payments?: array{requested?: bool}, p24_payments?: array{requested?: bool}, pay_by_bank_payments?: array{requested?: bool}, payco_payments?: array{requested?: bool}, paynow_payments?: array{requested?: bool}, payto_payments?: array{requested?: bool}, pix_payments?: array{requested?: bool}, promptpay_payments?: array{requested?: bool}, revolut_pay_payments?: array{requested?: bool}, samsung_pay_payments?: array{requested?: bool}, satispay_payments?: array{requested?: bool}, sepa_bank_transfer_payments?: array{requested?: bool}, sepa_debit_payments?: array{requested?: bool}, sofort_payments?: array{requested?: bool}, swish_payments?: array{requested?: bool}, tax_reporting_us_1099_k?: array{requested?: bool}, tax_reporting_us_1099_misc?: array{requested?: bool}, transfers?: array{requested?: bool}, treasury?: array{requested?: bool}, twint_payments?: array{requested?: bool}, us_bank_account_ach_payments?: array{requested?: bool}, us_bank_transfer_payments?: array{requested?: bool}, zip_payments?: array{requested?: bool}}, company?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, directors_provided?: bool, directorship_declaration?: array{date?: int, ip?: string, user_agent?: string}, executives_provided?: bool, export_license_id?: string, export_purpose_code?: string, name?: string, name_kana?: string, name_kanji?: string, owners_provided?: bool, ownership_declaration?: array{date?: int, ip?: string, user_agent?: string}, ownership_exemption_reason?: null|string, phone?: string, registration_date?: null|array{day: int, month: int, year: int}, registration_number?: string, representative_declaration?: array{date?: int, ip?: string, user_agent?: string}, structure?: null|string, tax_id?: string, tax_id_registrar?: string, vat_id?: string, verification?: array{document?: array{back?: string, front?: string}}}, default_currency?: string, documents?: array{bank_account_ownership_verification?: array{files?: string[]}, company_license?: array{files?: string[]}, company_memorandum_of_association?: array{files?: string[]}, company_ministerial_decree?: array{files?: string[]}, company_registration_verification?: array{files?: string[]}, company_tax_id_verification?: array{files?: string[]}, proof_of_address?: array{files?: string[]}, proof_of_registration?: array{files?: string[], signer?: array{person?: string}}, proof_of_ultimate_beneficial_ownership?: array{files?: string[], signer?: array{person?: string}}}, email?: string, expand?: string[], external_account?: null|array|string, groups?: array{payments_pricing?: null|string}, individual?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, dob?: null|array{day: int, month: int, year: int}, email?: string, first_name?: string, first_name_kana?: string, first_name_kanji?: string, full_name_aliases?: null|string[], gender?: string, id_number?: string, id_number_secondary?: string, last_name?: string, last_name_kana?: string, last_name_kanji?: string, maiden_name?: string, metadata?: null|array, phone?: string, political_exposure?: string, registered_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: null|float, title?: string}, ssn_last_4?: string, verification?: array{additional_document?: array{back?: string, front?: string}, document?: array{back?: string, front?: string}}}, metadata?: null|array, settings?: array{bacs_debit_payments?: array{display_name?: string}, branding?: array{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}, card_issuing?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, card_payments?: array{decline_on?: array{avs_failure?: bool, cvc_failure?: bool}, statement_descriptor_prefix?: string, statement_descriptor_prefix_kana?: null|string, statement_descriptor_prefix_kanji?: null|string}, invoices?: array{default_account_tax_ids?: null|string[], hosted_payment_method_save?: string}, payments?: array{statement_descriptor?: string, statement_descriptor_kana?: string, statement_descriptor_kanji?: string}, payouts?: array{debit_negative_balances?: bool, schedule?: array{delay_days?: array|int|string, interval?: string, monthly_anchor?: int, monthly_payout_days?: int[], weekly_anchor?: string, weekly_payout_days?: string[]}, statement_descriptor?: string}, treasury?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}}, tos_acceptance?: array{date?: int, ip?: string, service_agreement?: string, user_agent?: string}} $params + * @param null|array|string $opts + * + * @return Account the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + use ApiOperations\Retrieve { + retrieve as protected _retrieve; + } + + public static function getSavedNestedResources() + { + static $savedNestedResources = null; + if (null === $savedNestedResources) { + $savedNestedResources = new Util\Set([ + 'external_account', + 'bank_account', + ]); + } + + return $savedNestedResources; + } + + public function instanceUrl() + { + if (null === $this['id']) { + return '/v1/account'; + } + + return parent::instanceUrl(); + } + + /** + * @param null|array|string $id the ID of the account to retrieve, or an + * options array containing an `id` key + * @param null|array|string $opts + * + * @return Account + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id = null, $opts = null) + { + if (!$opts && \is_string($id) && 'sk_' === \substr($id, 0, 3)) { + $opts = $id; + $id = null; + } + + return self::_retrieve($id, $opts); + } + + public function serializeParameters($force = false) + { + $update = parent::serializeParameters($force); + if (isset($this->_values['legal_entity'])) { + $entity = $this['legal_entity']; + if (isset($entity->_values['additional_owners'])) { + $owners = $entity['additional_owners']; + $entityUpdate = isset($update['legal_entity']) ? $update['legal_entity'] : []; + $entityUpdate['additional_owners'] = $this->serializeAdditionalOwners($entity, $owners); + $update['legal_entity'] = $entityUpdate; + } + } + if (isset($this->_values['individual'])) { + $individual = $this['individual']; + if (($individual instanceof Person) && !isset($update['individual'])) { + $update['individual'] = $individual->serializeParameters($force); + } + } + + return $update; + } + + private function serializeAdditionalOwners($legalEntity, $additionalOwners) + { + if (isset($legalEntity->_originalValues['additional_owners'])) { + $originalValue = $legalEntity->_originalValues['additional_owners']; + } else { + $originalValue = []; + } + if ($originalValue && (\count($originalValue) > \count($additionalOwners))) { + throw new Exception\InvalidArgumentException( + 'You cannot delete an item from an array, you must instead set a new array' + ); + } + + $updateArr = []; + foreach ($additionalOwners as $i => $v) { + $update = ($v instanceof StripeObject) ? $v->serializeParameters() : $v; + + if ([] !== $update) { + if (!$originalValue + || !\array_key_exists($i, $originalValue) + || ($update !== $legalEntity->serializeParamsValue($originalValue[$i], null, false, true))) { + $updateArr[$i] = $update; + } + } + } + + return $updateArr; + } + + /** + * @param null|array $clientId + * @param null|array|string $opts + * + * @return StripeObject object containing the response from the API + * + * @throws Exception\ApiErrorException if the request fails + */ + public function deauthorize($clientId = null, $opts = null) + { + $params = [ + 'client_id' => $clientId, + 'stripe_user_id' => $this->id, + ]; + + return OAuth::deauthorize($params, $opts); + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Account the rejected account + * + * @throws Exception\ApiErrorException if the request fails + */ + public function reject($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/reject'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + const PATH_CAPABILITIES = '/capabilities'; + + /** + * @param string $id the ID of the account on which to retrieve the capabilities + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection the list of capabilities + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allCapabilities($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_CAPABILITIES, $params, $opts); + } + + /** + * @param string $id the ID of the account to which the capability belongs + * @param string $capabilityId the ID of the capability to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @return Capability + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieveCapability($id, $capabilityId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_CAPABILITIES, $capabilityId, $params, $opts); + } + + /** + * @param string $id the ID of the account to which the capability belongs + * @param string $capabilityId the ID of the capability to update + * @param null|array $params + * @param null|array|string $opts + * + * @return Capability + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function updateCapability($id, $capabilityId, $params = null, $opts = null) + { + return self::_updateNestedResource($id, static::PATH_CAPABILITIES, $capabilityId, $params, $opts); + } + const PATH_EXTERNAL_ACCOUNTS = '/external_accounts'; + + /** + * @param string $id the ID of the account on which to retrieve the external accounts + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection the list of external accounts (BankAccount or Card) + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allExternalAccounts($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_EXTERNAL_ACCOUNTS, $params, $opts); + } + + /** + * @param string $id the ID of the account on which to create the external account + * @param null|array $params + * @param null|array|string $opts + * + * @return BankAccount|Card + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function createExternalAccount($id, $params = null, $opts = null) + { + return self::_createNestedResource($id, static::PATH_EXTERNAL_ACCOUNTS, $params, $opts); + } + + /** + * @param string $id the ID of the account to which the external account belongs + * @param string $externalAccountId the ID of the external account to delete + * @param null|array $params + * @param null|array|string $opts + * + * @return BankAccount|Card + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function deleteExternalAccount($id, $externalAccountId, $params = null, $opts = null) + { + return self::_deleteNestedResource($id, static::PATH_EXTERNAL_ACCOUNTS, $externalAccountId, $params, $opts); + } + + /** + * @param string $id the ID of the account to which the external account belongs + * @param string $externalAccountId the ID of the external account to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @return BankAccount|Card + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieveExternalAccount($id, $externalAccountId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_EXTERNAL_ACCOUNTS, $externalAccountId, $params, $opts); + } + + /** + * @param string $id the ID of the account to which the external account belongs + * @param string $externalAccountId the ID of the external account to update + * @param null|array $params + * @param null|array|string $opts + * + * @return BankAccount|Card + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function updateExternalAccount($id, $externalAccountId, $params = null, $opts = null) + { + return self::_updateNestedResource($id, static::PATH_EXTERNAL_ACCOUNTS, $externalAccountId, $params, $opts); + } + const PATH_LOGIN_LINKS = '/login_links'; + + /** + * @param string $id the ID of the account on which to create the login link + * @param null|array $params + * @param null|array|string $opts + * + * @return LoginLink + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function createLoginLink($id, $params = null, $opts = null) + { + return self::_createNestedResource($id, static::PATH_LOGIN_LINKS, $params, $opts); + } + const PATH_PERSONS = '/persons'; + + /** + * @param string $id the ID of the account on which to retrieve the persons + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection the list of persons + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allPersons($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_PERSONS, $params, $opts); + } + + /** + * @param string $id the ID of the account on which to create the person + * @param null|array $params + * @param null|array|string $opts + * + * @return Person + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function createPerson($id, $params = null, $opts = null) + { + return self::_createNestedResource($id, static::PATH_PERSONS, $params, $opts); + } + + /** + * @param string $id the ID of the account to which the person belongs + * @param string $personId the ID of the person to delete + * @param null|array $params + * @param null|array|string $opts + * + * @return Person + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function deletePerson($id, $personId, $params = null, $opts = null) + { + return self::_deleteNestedResource($id, static::PATH_PERSONS, $personId, $params, $opts); + } + + /** + * @param string $id the ID of the account to which the person belongs + * @param string $personId the ID of the person to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @return Person + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrievePerson($id, $personId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_PERSONS, $personId, $params, $opts); + } + + /** + * @param string $id the ID of the account to which the person belongs + * @param string $personId the ID of the person to update + * @param null|array $params + * @param null|array|string $opts + * + * @return Person + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function updatePerson($id, $personId, $params = null, $opts = null) + { + return self::_updateNestedResource($id, static::PATH_PERSONS, $personId, $params, $opts); + } +} diff --git a/stripe-php/lib/AccountLink.php b/stripe-php/lib/AccountLink.php new file mode 100644 index 0000000..e302cff --- /dev/null +++ b/stripe-php/lib/AccountLink.php @@ -0,0 +1,45 @@ +Connect Onboarding + * + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property int $expires_at The timestamp at which this account link will expire. + * @property string $url The URL for the account link. + */ +class AccountLink extends ApiResource +{ + const OBJECT_NAME = 'account_link'; + + /** + * Creates an AccountLink object that includes a single-use Stripe URL that the + * platform can redirect their user to in order to take them through the Connect + * Onboarding flow. + * + * @param null|array{account: string, collect?: string, collection_options?: array{fields?: string, future_requirements?: string}, expand?: string[], refresh_url?: string, return_url?: string, type: string} $params + * @param null|array|string $options + * + * @return AccountLink the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/AccountSession.php b/stripe-php/lib/AccountSession.php new file mode 100644 index 0000000..5222c5b --- /dev/null +++ b/stripe-php/lib/AccountSession.php @@ -0,0 +1,49 @@ +Connect embedded components + * + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property string $account The ID of the account the AccountSession was created for + * @property string $client_secret

The client secret of this AccountSession. Used on the client to set up secure access to the given account.

The client secret can be used to provide access to account from your frontend. It should not be stored, logged, or exposed to anyone other than the connected account. Make sure that you have TLS enabled on any page that includes the client secret.

Refer to our docs to setup Connect embedded components and learn about how client_secret should be handled.

+ * @property (object{account_management: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, external_account_collection: bool}&StripeObject)}&StripeObject), account_onboarding: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, external_account_collection: bool}&StripeObject)}&StripeObject), balances: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, edit_payout_schedule: bool, external_account_collection: bool, instant_payouts: bool, standard_payouts: bool}&StripeObject)}&StripeObject), disputes_list: (object{enabled: bool, features: (object{capture_payments: bool, destination_on_behalf_of_charge_management: bool, dispute_management: bool, refund_management: bool}&StripeObject)}&StripeObject), documents: (object{enabled: bool, features: (object{}&StripeObject)}&StripeObject), financial_account: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, external_account_collection: bool, send_money: bool, transfer_balance: bool}&StripeObject)}&StripeObject), financial_account_transactions: (object{enabled: bool, features: (object{card_spend_dispute_management: bool}&StripeObject)}&StripeObject), instant_payouts_promotion: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, external_account_collection: bool, instant_payouts: bool}&StripeObject)}&StripeObject), issuing_card: (object{enabled: bool, features: (object{card_management: bool, card_spend_dispute_management: bool, cardholder_management: bool, spend_control_management: bool}&StripeObject)}&StripeObject), issuing_cards_list: (object{enabled: bool, features: (object{card_management: bool, card_spend_dispute_management: bool, cardholder_management: bool, disable_stripe_user_authentication: bool, spend_control_management: bool}&StripeObject)}&StripeObject), notification_banner: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, external_account_collection: bool}&StripeObject)}&StripeObject), payment_details: (object{enabled: bool, features: (object{capture_payments: bool, destination_on_behalf_of_charge_management: bool, dispute_management: bool, refund_management: bool}&StripeObject)}&StripeObject), payment_disputes: (object{enabled: bool, features: (object{destination_on_behalf_of_charge_management: bool, dispute_management: bool, refund_management: bool}&StripeObject)}&StripeObject), payments: (object{enabled: bool, features: (object{capture_payments: bool, destination_on_behalf_of_charge_management: bool, dispute_management: bool, refund_management: bool}&StripeObject)}&StripeObject), payout_details: (object{enabled: bool, features: (object{}&StripeObject)}&StripeObject), payouts: (object{enabled: bool, features: (object{disable_stripe_user_authentication: bool, edit_payout_schedule: bool, external_account_collection: bool, instant_payouts: bool, standard_payouts: bool}&StripeObject)}&StripeObject), payouts_list: (object{enabled: bool, features: (object{}&StripeObject)}&StripeObject), tax_registrations: (object{enabled: bool, features: (object{}&StripeObject)}&StripeObject), tax_settings: (object{enabled: bool, features: (object{}&StripeObject)}&StripeObject)}&StripeObject) $components + * @property int $expires_at The timestamp at which this AccountSession will expire. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + */ +class AccountSession extends ApiResource +{ + const OBJECT_NAME = 'account_session'; + + /** + * Creates a AccountSession object that includes a single-use token that the + * platform can use on their front-end to grant client-side API access. + * + * @param null|array{account: string, components: array{account_management?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool}}, account_onboarding?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool}}, balances?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, edit_payout_schedule?: bool, external_account_collection?: bool, instant_payouts?: bool, standard_payouts?: bool}}, disputes_list?: array{enabled: bool, features?: array{capture_payments?: bool, destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, documents?: array{enabled: bool, features?: array{}}, financial_account?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool, send_money?: bool, transfer_balance?: bool}}, financial_account_transactions?: array{enabled: bool, features?: array{card_spend_dispute_management?: bool}}, instant_payouts_promotion?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool, instant_payouts?: bool}}, issuing_card?: array{enabled: bool, features?: array{card_management?: bool, card_spend_dispute_management?: bool, cardholder_management?: bool, spend_control_management?: bool}}, issuing_cards_list?: array{enabled: bool, features?: array{card_management?: bool, card_spend_dispute_management?: bool, cardholder_management?: bool, disable_stripe_user_authentication?: bool, spend_control_management?: bool}}, notification_banner?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, external_account_collection?: bool}}, payment_details?: array{enabled: bool, features?: array{capture_payments?: bool, destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, payment_disputes?: array{enabled: bool, features?: array{destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, payments?: array{enabled: bool, features?: array{capture_payments?: bool, destination_on_behalf_of_charge_management?: bool, dispute_management?: bool, refund_management?: bool}}, payout_details?: array{enabled: bool, features?: array{}}, payouts?: array{enabled: bool, features?: array{disable_stripe_user_authentication?: bool, edit_payout_schedule?: bool, external_account_collection?: bool, instant_payouts?: bool, standard_payouts?: bool}}, payouts_list?: array{enabled: bool, features?: array{}}, tax_registrations?: array{enabled: bool, features?: array{}}, tax_settings?: array{enabled: bool, features?: array{}}}, expand?: string[]} $params + * @param null|array|string $options + * + * @return AccountSession the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/ApiOperations/All.php b/stripe-php/lib/ApiOperations/All.php new file mode 100644 index 0000000..ec72b1a --- /dev/null +++ b/stripe-php/lib/ApiOperations/All.php @@ -0,0 +1,26 @@ +json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/ApiOperations/Delete.php b/stripe-php/lib/ApiOperations/Delete.php new file mode 100644 index 0000000..e6c6f75 --- /dev/null +++ b/stripe-php/lib/ApiOperations/Delete.php @@ -0,0 +1,30 @@ +instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/ApiOperations/NestedResource.php b/stripe-php/lib/ApiOperations/NestedResource.php new file mode 100644 index 0000000..e89fb99 --- /dev/null +++ b/stripe-php/lib/ApiOperations/NestedResource.php @@ -0,0 +1,135 @@ +json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param string $id + * @param string $nestedPath + * @param null|string $nestedId + * + * @return string + */ + protected static function _nestedResourceUrl($id, $nestedPath, $nestedId = null) + { + $url = static::resourceUrl($id) . $nestedPath; + if (null !== $nestedId) { + $url .= "/{$nestedId}"; + } + + return $url; + } + + /** + * @param string $id + * @param string $nestedPath + * @param null|array $params + * @param null|array|string $options + * + * @return \Stripe\StripeObject + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + protected static function _createNestedResource($id, $nestedPath, $params = null, $options = null) + { + $url = static::_nestedResourceUrl($id, $nestedPath); + + return self::_nestedResourceOperation('post', $url, $params, $options); + } + + /** + * @param string $id + * @param string $nestedPath + * @param null|string $nestedId + * @param null|array $params + * @param null|array|string $options + * + * @return \Stripe\StripeObject + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + protected static function _retrieveNestedResource($id, $nestedPath, $nestedId, $params = null, $options = null) + { + $url = static::_nestedResourceUrl($id, $nestedPath, $nestedId); + + return self::_nestedResourceOperation('get', $url, $params, $options); + } + + /** + * @param string $id + * @param string $nestedPath + * @param null|string $nestedId + * @param null|array $params + * @param null|array|string $options + * + * @return \Stripe\StripeObject + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + protected static function _updateNestedResource($id, $nestedPath, $nestedId, $params = null, $options = null) + { + $url = static::_nestedResourceUrl($id, $nestedPath, $nestedId); + + return self::_nestedResourceOperation('post', $url, $params, $options); + } + + /** + * @param string $id + * @param string $nestedPath + * @param null|string $nestedId + * @param null|array $params + * @param null|array|string $options + * + * @return \Stripe\StripeObject + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + protected static function _deleteNestedResource($id, $nestedPath, $nestedId, $params = null, $options = null) + { + $url = static::_nestedResourceUrl($id, $nestedPath, $nestedId); + + return self::_nestedResourceOperation('delete', $url, $params, $options); + } + + /** + * @param string $id + * @param string $nestedPath + * @param null|array $params + * @param null|array|string $options + * + * @return \Stripe\StripeObject + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + protected static function _allNestedResources($id, $nestedPath, $params = null, $options = null) + { + $url = static::_nestedResourceUrl($id, $nestedPath); + + return self::_nestedResourceOperation('get', $url, $params, $options); + } +} diff --git a/stripe-php/lib/ApiOperations/Request.php b/stripe-php/lib/ApiOperations/Request.php new file mode 100644 index 0000000..b721b72 --- /dev/null +++ b/stripe-php/lib/ApiOperations/Request.php @@ -0,0 +1,134 @@ + 100, " + . "'currency' => 'usd', 'source' => 'tok_1234'])\")"; + + throw new \Stripe\Exception\InvalidArgumentException($message); + } + } + + /** + * @param 'delete'|'get'|'post' $method HTTP method ('get', 'post', etc.) + * @param string $url URL for the request + * @param array $params list of parameters for the request + * @param null|array|string $options + * @param string[] $usage names of tracked behaviors associated with this request + * @param 'v1'|'v2' $apiMode + * + * @return array tuple containing (the JSON response, $options) + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + protected function _request($method, $url, $params = [], $options = null, $usage = [], $apiMode = 'v1') + { + $opts = $this->_opts->merge($options); + list($resp, $options) = static::_staticRequest($method, $url, $params, $opts, $usage, $apiMode); + $this->setLastResponse($resp); + + return [$resp->json, $options]; + } + + /** + * @param string $url URL for the request + * @param class-string< \Stripe\Collection|\Stripe\SearchResult > $resultClass indicating what type of paginated result is returned + * @param null|array $params list of parameters for the request + * @param null|array|string $options + * @param string[] $usage names of tracked behaviors associated with this request + * + * @return \Stripe\Collection|\Stripe\SearchResult + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + protected static function _requestPage($url, $resultClass, $params = null, $options = null, $usage = []) + { + self::_validateParams($params); + + list($response, $opts) = static::_staticRequest('get', $url, $params, $options, $usage); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + if (!$obj instanceof $resultClass) { + throw new \Stripe\Exception\UnexpectedValueException( + 'Expected type ' . $resultClass . ', got "' . \get_class($obj) . '" instead.' + ); + } + $obj->setLastResponse($response); + $obj->setFilters($params); + + return $obj; + } + + /** + * @param 'delete'|'get'|'post' $method HTTP method ('get', 'post', etc.) + * @param string $url URL for the request + * @param callable $readBodyChunk function that will receive chunks of data from a successful request body + * @param array $params list of parameters for the request + * @param null|array|string $options + * @param string[] $usage names of tracked behaviors associated with this request + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + protected function _requestStream($method, $url, $readBodyChunk, $params = [], $options = null, $usage = []) + { + $opts = $this->_opts->merge($options); + static::_staticStreamingRequest($method, $url, $readBodyChunk, $params, $opts, $usage); + } + + /** + * @param 'delete'|'get'|'post' $method HTTP method ('get', 'post', etc.) + * @param string $url URL for the request + * @param array $params list of parameters for the request + * @param null|array|string $options + * @param string[] $usage names of tracked behaviors associated with this request + * @param 'v1'|'v2' $apiMode + * + * @return array tuple containing (the JSON response, $options) + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + protected static function _staticRequest($method, $url, $params, $options, $usage = [], $apiMode = 'v1') + { + $opts = \Stripe\Util\RequestOptions::parse($options); + $baseUrl = isset($opts->apiBase) ? $opts->apiBase : static::baseUrl(); + $requestor = new \Stripe\ApiRequestor($opts->apiKey, $baseUrl); + list($response, $opts->apiKey) = $requestor->request($method, $url, $params, $opts->headers, $apiMode, $usage); + $opts->discardNonPersistentHeaders(); + + return [$response, $opts]; + } + + /** + * @param 'delete'|'get'|'post' $method HTTP method ('get', 'post', etc.) + * @param string $url URL for the request + * @param callable $readBodyChunk function that will receive chunks of data from a successful request body + * @param array $params list of parameters for the request + * @param null|array|string $options + * @param string[] $usage names of tracked behaviors associated with this request + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + protected static function _staticStreamingRequest($method, $url, $readBodyChunk, $params, $options, $usage = []) + { + $opts = \Stripe\Util\RequestOptions::parse($options); + $baseUrl = isset($opts->apiBase) ? $opts->apiBase : static::baseUrl(); + $requestor = new \Stripe\ApiRequestor($opts->apiKey, $baseUrl); + $requestor->requestStream($method, $url, $readBodyChunk, $params, $opts->headers); + } +} diff --git a/stripe-php/lib/ApiOperations/Retrieve.php b/stripe-php/lib/ApiOperations/Retrieve.php new file mode 100644 index 0000000..1fc7f61 --- /dev/null +++ b/stripe-php/lib/ApiOperations/Retrieve.php @@ -0,0 +1,30 @@ +refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/ApiOperations/SingletonRetrieve.php b/stripe-php/lib/ApiOperations/SingletonRetrieve.php new file mode 100644 index 0000000..e8d9586 --- /dev/null +++ b/stripe-php/lib/ApiOperations/SingletonRetrieve.php @@ -0,0 +1,29 @@ +refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/ApiOperations/Update.php b/stripe-php/lib/ApiOperations/Update.php new file mode 100644 index 0000000..c6c1e9b --- /dev/null +++ b/stripe-php/lib/ApiOperations/Update.php @@ -0,0 +1,56 @@ +json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array|string $opts + * + * @return static the saved resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @deprecated The `save` method is deprecated and will be removed in a + * future major version of the library. Use the static method `update` + * on the resource instead. + */ + public function save($opts = null) + { + $params = $this->serializeParameters(); + if (\count($params) > 0) { + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('post', $url, $params, $opts, ['save']); + $this->refreshFrom($response, $opts); + } + + return $this; + } +} diff --git a/stripe-php/lib/ApiRequestor.php b/stripe-php/lib/ApiRequestor.php new file mode 100644 index 0000000..83f0b4f --- /dev/null +++ b/stripe-php/lib/ApiRequestor.php @@ -0,0 +1,709 @@ +_apiKey = $apiKey; + if (!$apiBase) { + $apiBase = Stripe::$apiBase; + } + $this->_apiBase = $apiBase; + $this->_appInfo = $appInfo; + } + + /** + * Creates a telemetry json blob for use in 'X-Stripe-Client-Telemetry' headers. + * + * @static + * + * @param RequestTelemetry $requestTelemetry + * + * @return string + */ + private static function _telemetryJson($requestTelemetry) + { + $payload = [ + 'last_request_metrics' => [ + 'request_id' => $requestTelemetry->requestId, + 'request_duration_ms' => $requestTelemetry->requestDuration, + ], + ]; + if (\count($requestTelemetry->usage) > 0) { + $payload['last_request_metrics']['usage'] = $requestTelemetry->usage; + } + + $result = \json_encode($payload); + if (false !== $result) { + return $result; + } + Stripe::getLogger()->error('Serializing telemetry payload failed!'); + + return '{}'; + } + + /** + * @static + * + * @param ApiResource|array|bool|mixed $d + * + * @return ApiResource|array|mixed|string + */ + private static function _encodeObjects($d) + { + if ($d instanceof ApiResource) { + return Util\Util::utf8($d->id); + } + if (true === $d) { + return 'true'; + } + if (false === $d) { + return 'false'; + } + if (\is_array($d)) { + $res = []; + foreach ($d as $k => $v) { + $res[$k] = self::_encodeObjects($v); + } + + return $res; + } + + return Util\Util::utf8($d); + } + + /** + * @param 'delete'|'get'|'post' $method + * @param string $url + * @param null|array $params + * @param null|array $headers + * @param 'v1'|'v2' $apiMode + * @param string[] $usage + * @param null|int $maxNetworkRetries + * + * @return array tuple containing (ApiReponse, API key) + * + * @throws Exception\ApiErrorException + */ + public function request($method, $url, $params = null, $headers = null, $apiMode = 'v1', $usage = [], $maxNetworkRetries = null) + { + $params = $params ?: []; + $headers = $headers ?: []; + list($rbody, $rcode, $rheaders, $myApiKey) + = $this->_requestRaw($method, $url, $params, $headers, $apiMode, $usage, $maxNetworkRetries); + $json = $this->_interpretResponse($rbody, $rcode, $rheaders, $apiMode); + $resp = new ApiResponse($rbody, $rcode, $rheaders, $json); + + return [$resp, $myApiKey]; + } + + /** + * @param 'delete'|'get'|'post' $method + * @param string $url + * @param callable $readBodyChunkCallable + * @param null|array $params + * @param null|array $headers + * @param 'v1'|'v2' $apiMode + * @param string[] $usage + * @param null|int $maxNetworkRetries + * + * @throws Exception\ApiErrorException + */ + public function requestStream($method, $url, $readBodyChunkCallable, $params = null, $headers = null, $apiMode = 'v1', $usage = [], $maxNetworkRetries = null) + { + $params = $params ?: []; + $headers = $headers ?: []; + list($rbody, $rcode, $rheaders, $myApiKey) + = $this->_requestRawStreaming($method, $url, $params, $headers, $apiMode, $usage, $readBodyChunkCallable, $maxNetworkRetries); + if ($rcode >= 300) { + $this->_interpretResponse($rbody, $rcode, $rheaders, $apiMode); + } + } + + /** + * @param string $rbody a JSON string + * @param int $rcode + * @param array $rheaders + * @param array $resp + * @param 'v1'|'v2' $apiMode + * + * @throws Exception\UnexpectedValueException + * @throws Exception\ApiErrorException + */ + public function handleErrorResponse($rbody, $rcode, $rheaders, $resp, $apiMode) + { + if (!\is_array($resp) || !isset($resp['error'])) { + $msg = "Invalid response object from API: {$rbody} " + . "(HTTP response code was {$rcode})"; + + throw new Exception\UnexpectedValueException($msg); + } + + $errorData = $resp['error']; + + $error = null; + + if (\is_string($errorData)) { + $error = self::_specificOAuthError($rbody, $rcode, $rheaders, $resp, $errorData); + } + if (!$error) { + $error = 'v1' === $apiMode ? self::_specificV1APIError($rbody, $rcode, $rheaders, $resp, $errorData) : self::_specificV2APIError($rbody, $rcode, $rheaders, $resp, $errorData); + } + + throw $error; + } + + /** + * @static + * + * @param string $rbody + * @param int $rcode + * @param array $rheaders + * @param array $resp + * @param array $errorData + * + * @return Exception\ApiErrorException + */ + private static function _specificV1APIError($rbody, $rcode, $rheaders, $resp, $errorData) + { + $msg = isset($errorData['message']) ? $errorData['message'] : null; + $param = isset($errorData['param']) ? $errorData['param'] : null; + $code = isset($errorData['code']) ? $errorData['code'] : null; + $type = isset($errorData['type']) ? $errorData['type'] : null; + $declineCode = isset($errorData['decline_code']) ? $errorData['decline_code'] : null; + + switch ($rcode) { + case 400: + // 'rate_limit' code is deprecated, but left here for backwards compatibility + // for API versions earlier than 2015-09-08 + if ('rate_limit' === $code) { + return Exception\RateLimitException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code, $param); + } + if ('idempotency_error' === $type) { + return Exception\IdempotencyException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code); + } + + // fall through in generic 400 or 404, returns InvalidRequestException by default + // no break + case 404: + return Exception\InvalidRequestException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code, $param); + + case 401: + return Exception\AuthenticationException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code); + + case 402: + return Exception\CardException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code, $declineCode, $param); + + case 403: + return Exception\PermissionException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code); + + case 429: + return Exception\RateLimitException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code, $param); + + default: + return Exception\UnknownApiErrorException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code); + } + } + + /** + * @static + * + * @param string $rbody + * @param int $rcode + * @param array $rheaders + * @param array $resp + * @param array $errorData + * + * @return Exception\ApiErrorException + */ + private static function _specificV2APIError($rbody, $rcode, $rheaders, $resp, $errorData) + { + $msg = isset($errorData['message']) ? $errorData['message'] : null; + $code = isset($errorData['code']) ? $errorData['code'] : null; + $type = isset($errorData['type']) ? $errorData['type'] : null; + + switch ($type) { + case 'idempotency_error': + return Exception\IdempotencyException::factory($msg, $rcode, $rbody, $resp, $rheaders, $code); + + // The beginning of the section generated from our OpenAPI spec + case 'temporary_session_expired': + return Exception\TemporarySessionExpiredException::factory( + $msg, + $rcode, + $rbody, + $resp, + $rheaders, + $code + ); + + // The end of the section generated from our OpenAPI spec + default: + return self::_specificV1APIError($rbody, $rcode, $rheaders, $resp, $errorData); + } + } + + /** + * @static + * + * @param bool|string $rbody + * @param int $rcode + * @param array $rheaders + * @param array $resp + * @param string $errorCode + * + * @return Exception\OAuth\OAuthErrorException + */ + private static function _specificOAuthError($rbody, $rcode, $rheaders, $resp, $errorCode) + { + $description = isset($resp['error_description']) ? $resp['error_description'] : $errorCode; + + switch ($errorCode) { + case 'invalid_client': + return Exception\OAuth\InvalidClientException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); + + case 'invalid_grant': + return Exception\OAuth\InvalidGrantException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); + + case 'invalid_request': + return Exception\OAuth\InvalidRequestException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); + + case 'invalid_scope': + return Exception\OAuth\InvalidScopeException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); + + case 'unsupported_grant_type': + return Exception\OAuth\UnsupportedGrantTypeException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); + + case 'unsupported_response_type': + return Exception\OAuth\UnsupportedResponseTypeException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); + + default: + return Exception\OAuth\UnknownOAuthErrorException::factory($description, $rcode, $rbody, $resp, $rheaders, $errorCode); + } + } + + /** + * @static + * + * @param null|array $appInfo + * + * @return null|string + */ + private static function _formatAppInfo($appInfo) + { + if (null !== $appInfo) { + $string = $appInfo['name']; + if (\array_key_exists('version', $appInfo) && null !== $appInfo['version']) { + $string .= '/' . $appInfo['version']; + } + if (\array_key_exists('url', $appInfo) && null !== $appInfo['url']) { + $string .= ' (' . $appInfo['url'] . ')'; + } + + return $string; + } + + return null; + } + + /** + * @static + * + * @param string $disableFunctionsOutput - String value of the 'disable_function' setting, as output by \ini_get('disable_functions') + * @param string $functionName - Name of the function we are interesting in seeing whether or not it is disabled + * + * @return bool + */ + private static function _isDisabled($disableFunctionsOutput, $functionName) + { + $disabledFunctions = \explode(',', $disableFunctionsOutput); + foreach ($disabledFunctions as $disabledFunction) { + if (\trim($disabledFunction) === $functionName) { + return true; + } + } + + return false; + } + + /** + * @static + * + * @param string $apiKey the Stripe API key, to be used in regular API requests + * @param null $clientInfo client user agent information + * @param null $appInfo information to identify a plugin that integrates Stripe using this library + * @param 'v1'|'v2' $apiMode + * + * @return array + */ + private static function _defaultHeaders($apiKey, $clientInfo = null, $appInfo = null, $apiMode = 'v1') + { + $uaString = "Stripe/{$apiMode} PhpBindings/" . Stripe::VERSION; + + $langVersion = \PHP_VERSION; + $uname_disabled = self::_isDisabled(\ini_get('disable_functions'), 'php_uname'); + $uname = $uname_disabled ? '(disabled)' : \php_uname(); + + // Fallback to global configuration to maintain backwards compatibility. + $appInfo = $appInfo ?: Stripe::getAppInfo(); + $ua = [ + 'bindings_version' => Stripe::VERSION, + 'lang' => 'php', + 'lang_version' => $langVersion, + 'publisher' => 'stripe', + 'uname' => $uname, + ]; + if ($clientInfo) { + $ua = \array_merge($clientInfo, $ua); + } + if (null !== $appInfo) { + $uaString .= ' ' . self::_formatAppInfo($appInfo); + $ua['application'] = $appInfo; + } + + return [ + 'X-Stripe-Client-User-Agent' => \json_encode($ua), + 'User-Agent' => $uaString, + 'Authorization' => 'Bearer ' . $apiKey, + 'Stripe-Version' => Stripe::getApiVersion(), + ]; + } + + /** + * @param 'delete'|'get'|'post' $method + * @param string $url + * @param array $params + * @param array $headers + * @param 'v1'|'v2' $apiMode + */ + private function _prepareRequest($method, $url, $params, $headers, $apiMode) + { + $myApiKey = $this->_apiKey; + if (!$myApiKey) { + $myApiKey = Stripe::$apiKey; + } + + if (!$myApiKey) { + $msg = 'No API key provided. (HINT: set your API key using ' + . '"Stripe::setApiKey()". You can generate API keys from ' + . 'the Stripe web interface. See https://stripe.com/api for ' + . 'details, or email support@stripe.com if you have any questions.'; + + throw new Exception\AuthenticationException($msg); + } + + // Clients can supply arbitrary additional keys to be included in the + // X-Stripe-Client-User-Agent header via the optional getUserAgentInfo() + // method + $clientUAInfo = null; + if (\method_exists(self::httpClient(), 'getUserAgentInfo')) { + $clientUAInfo = self::httpClient()->getUserAgentInfo(); + } + + if ($params && \is_array($params)) { + $optionKeysInParams = \array_filter( + self::$OPTIONS_KEYS, + static function ($key) use ($params) { + return \array_key_exists($key, $params); + } + ); + if (\count($optionKeysInParams) > 0) { + $message = \sprintf('Options found in $params: %s. Options should ' + . 'be passed in their own array after $params. (HINT: pass an ' + . 'empty array to $params if you do not have any.)', \implode(', ', $optionKeysInParams)); + \trigger_error($message, \E_USER_WARNING); + } + } + + $absUrl = $this->_apiBase . $url; + if ('v1' === $apiMode) { + $params = self::_encodeObjects($params); + } + $defaultHeaders = $this->_defaultHeaders($myApiKey, $clientUAInfo, $this->_appInfo, $apiMode); + + if (Stripe::$accountId) { + $defaultHeaders['Stripe-Account'] = Stripe::$accountId; + } + + if (Stripe::$enableTelemetry && null !== self::$requestTelemetry) { + $defaultHeaders['X-Stripe-Client-Telemetry'] = self::_telemetryJson(self::$requestTelemetry); + } + + $hasFile = false; + foreach ($params as $k => $v) { + if (\is_resource($v)) { + $hasFile = true; + $params[$k] = self::_processResourceParam($v); + } elseif ($v instanceof \CURLFile) { + $hasFile = true; + } + } + + if ($hasFile) { + $defaultHeaders['Content-Type'] = 'multipart/form-data'; + } elseif ('v2' === $apiMode) { + $defaultHeaders['Content-Type'] = 'application/json'; + } elseif ('v1' === $apiMode) { + $defaultHeaders['Content-Type'] = 'application/x-www-form-urlencoded'; + } else { + throw new Exception\InvalidArgumentException('Unknown API mode: ' . $apiMode); + } + + $combinedHeaders = \array_merge($defaultHeaders, $headers); + $rawHeaders = []; + + foreach ($combinedHeaders as $header => $value) { + $rawHeaders[] = $header . ': ' . $value; + } + + return [$absUrl, $rawHeaders, $params, $hasFile, $myApiKey]; + } + + /** + * @param 'delete'|'get'|'post' $method + * @param string $url + * @param array $params + * @param array $headers + * @param 'v1'|'v2' $apiMode + * @param string[] $usage + * @param null|int $maxNetworkRetries + * + * @return array + * + * @throws Exception\AuthenticationException + * @throws Exception\ApiConnectionException + */ + private function _requestRaw($method, $url, $params, $headers, $apiMode, $usage, $maxNetworkRetries) + { + list($absUrl, $rawHeaders, $params, $hasFile, $myApiKey) = $this->_prepareRequest($method, $url, $params, $headers, $apiMode); + + // for some reason, PHP users will sometimes include null bytes in their paths, which leads to cryptic server 400s. + // we'll be louder about this to help catch issues earlier. + if (false !== \strpos($absUrl, "\0") || false !== \strpos($absUrl, '%00')) { + throw new Exception\InvalidRequestException("URLs may not contain null bytes ('\\0'); double check any IDs you're including with the request."); + } + + $requestStartMs = Util\Util::currentTimeMillis(); + + list($rbody, $rcode, $rheaders) = self::httpClient()->request( + $method, + $absUrl, + $rawHeaders, + $params, + $hasFile, + $apiMode, + $maxNetworkRetries + ); + + if ( + isset($rheaders['request-id']) + && \is_string($rheaders['request-id']) + && '' !== $rheaders['request-id'] + ) { + self::$requestTelemetry = new RequestTelemetry( + $rheaders['request-id'], + Util\Util::currentTimeMillis() - $requestStartMs, + $usage + ); + } + + return [$rbody, $rcode, $rheaders, $myApiKey]; + } + + /** + * @param 'delete'|'get'|'post' $method + * @param string $url + * @param array $params + * @param array $headers + * @param string[] $usage + * @param callable $readBodyChunkCallable + * @param 'v1'|'v2' $apiMode + * @param int $maxNetworkRetries + * + * @return array + * + * @throws Exception\AuthenticationException + * @throws Exception\ApiConnectionException + */ + private function _requestRawStreaming($method, $url, $params, $headers, $apiMode, $usage, $readBodyChunkCallable, $maxNetworkRetries) + { + list($absUrl, $rawHeaders, $params, $hasFile, $myApiKey) = $this->_prepareRequest($method, $url, $params, $headers, $apiMode); + + $requestStartMs = Util\Util::currentTimeMillis(); + + list($rbody, $rcode, $rheaders) = self::streamingHttpClient()->requestStream( + $method, + $absUrl, + $rawHeaders, + $params, + $hasFile, + $readBodyChunkCallable, + $maxNetworkRetries + ); + + if ( + isset($rheaders['request-id']) + && \is_string($rheaders['request-id']) + && '' !== $rheaders['request-id'] + ) { + self::$requestTelemetry = new RequestTelemetry( + $rheaders['request-id'], + Util\Util::currentTimeMillis() - $requestStartMs + ); + } + + return [$rbody, $rcode, $rheaders, $myApiKey]; + } + + /** + * @param resource $resource + * + * @return \CURLFile|string + * + * @throws Exception\InvalidArgumentException + */ + private function _processResourceParam($resource) + { + if ('stream' !== \get_resource_type($resource)) { + throw new Exception\InvalidArgumentException( + 'Attempted to upload a resource that is not a stream' + ); + } + + $metaData = \stream_get_meta_data($resource); + if ('plainfile' !== $metaData['wrapper_type']) { + throw new Exception\InvalidArgumentException( + 'Only plainfile resource streams are supported' + ); + } + + // We don't have the filename or mimetype, but the API doesn't care + return new \CURLFile($metaData['uri']); + } + + /** + * @param string $rbody + * @param int $rcode + * @param array $rheaders + * @param 'v1'|'v2' $apiMode + * + * @return array + * + * @throws Exception\UnexpectedValueException + * @throws Exception\ApiErrorException + */ + private function _interpretResponse($rbody, $rcode, $rheaders, $apiMode) + { + $resp = \json_decode($rbody, true); + $jsonError = \json_last_error(); + if (null === $resp && \JSON_ERROR_NONE !== $jsonError) { + $msg = "Invalid response body from API: {$rbody} " + . "(HTTP response code was {$rcode}, json_last_error() was {$jsonError})"; + + throw new Exception\UnexpectedValueException($msg, $rcode); + } + + if ($rcode < 200 || $rcode >= 300) { + $this->handleErrorResponse($rbody, $rcode, $rheaders, $resp, $apiMode); + } + + return $resp; + } + + /** + * @static + * + * @param HttpClient\ClientInterface $client + */ + public static function setHttpClient($client) + { + self::$_httpClient = $client; + } + + /** + * @static + * + * @param HttpClient\StreamingClientInterface $client + */ + public static function setStreamingHttpClient($client) + { + self::$_streamingHttpClient = $client; + } + + /** + * @static + * + * Resets any stateful telemetry data + */ + public static function resetTelemetry() + { + self::$requestTelemetry = null; + } + + /** + * @return HttpClient\ClientInterface + */ + public static function httpClient() + { + if (!self::$_httpClient) { + self::$_httpClient = HttpClient\CurlClient::instance(); + } + + return self::$_httpClient; + } + + /** + * @return HttpClient\StreamingClientInterface + */ + public static function streamingHttpClient() + { + if (!self::$_streamingHttpClient) { + self::$_streamingHttpClient = HttpClient\CurlClient::instance(); + } + + return self::$_streamingHttpClient; + } +} diff --git a/stripe-php/lib/ApiResource.php b/stripe-php/lib/ApiResource.php new file mode 100644 index 0000000..33f70c6 --- /dev/null +++ b/stripe-php/lib/ApiResource.php @@ -0,0 +1,123 @@ +{$k}; + if (static::getSavedNestedResources()->includes($k) + && ($v instanceof ApiResource)) { + $v->saveWithParent = true; + } + } + + /** + * @return ApiResource the refreshed resource + * + * @throws Exception\ApiErrorException + */ + public function refresh() + { + $requestor = new ApiRequestor($this->_opts->apiKey, static::baseUrl()); + $url = $this->instanceUrl(); + + list($response, $this->_opts->apiKey) = $requestor->request( + 'get', + $url, + $this->_retrieveOptions, + $this->_opts->headers + ); + $this->setLastResponse($response); + $this->refreshFrom($response->json, $this->_opts); + + return $this; + } + + /** + * @return string the base URL for the given class + */ + public static function baseUrl() + { + return Stripe::$apiBase; + } + + /** + * @return string the endpoint URL for the given class + */ + public static function classUrl() + { + // Replace dots with slashes for namespaced resources, e.g. if the object's name is + // "foo.bar", then its URL will be "/v1/foo/bars". + + /** @phpstan-ignore-next-line */ + $base = \str_replace('.', '/', static::OBJECT_NAME); + + return "/v1/{$base}s"; + } + + /** + * @param null|string $id the ID of the resource + * + * @return string the instance endpoint URL for the given class + * + * @throws Exception\UnexpectedValueException if $id is null + */ + public static function resourceUrl($id) + { + if (null === $id) { + $class = static::class; + $message = 'Could not determine which URL to request: ' + . "{$class} instance has invalid ID: {$id}"; + + throw new Exception\UnexpectedValueException($message); + } + $id = Util\Util::utf8($id); + $base = static::classUrl(); + $extn = \urlencode($id); + + return "{$base}/{$extn}"; + } + + /** + * @return string the full API URL for this API resource + */ + public function instanceUrl() + { + return static::resourceUrl($this['id']); + } +} diff --git a/stripe-php/lib/ApiResponse.php b/stripe-php/lib/ApiResponse.php new file mode 100644 index 0000000..e7ee2e9 --- /dev/null +++ b/stripe-php/lib/ApiResponse.php @@ -0,0 +1,45 @@ +body = $body; + $this->code = $code; + $this->headers = $headers; + $this->json = $json; + } +} diff --git a/stripe-php/lib/ApplePayDomain.php b/stripe-php/lib/ApplePayDomain.php new file mode 100644 index 0000000..0aa3842 --- /dev/null +++ b/stripe-php/lib/ApplePayDomain.php @@ -0,0 +1,105 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + */ +class ApplePayDomain extends ApiResource +{ + const OBJECT_NAME = 'apple_pay_domain'; + + /** + * Create an apple pay domain. + * + * @param null|array{domain_name: string, expand?: string[]} $params + * @param null|array|string $options + * + * @return ApplePayDomain the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Delete an apple pay domain. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return ApplePayDomain the deleted resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * List apple pay domains. + * + * @param null|array{domain_name?: string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieve an apple pay domain. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return ApplePayDomain + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * @return string The class URL for this resource. It needs to be special + * cased because it doesn't fit into the standard resource pattern. + */ + public static function classUrl() + { + return '/v1/apple_pay/domains'; + } +} diff --git a/stripe-php/lib/Application.php b/stripe-php/lib/Application.php new file mode 100644 index 0000000..e74ef02 --- /dev/null +++ b/stripe-php/lib/Application.php @@ -0,0 +1,15 @@ +ISO currency code, in lowercase. Must be a supported currency. + * @property null|(object{charge?: string, payout?: string, type: string}&StripeObject) $fee_source Polymorphic source of the application fee. Includes the ID of the object the application fee was created from. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|Charge|string $originating_transaction ID of the corresponding charge on the platform account, if this fee was the result of a charge using the destination parameter. + * @property bool $refunded Whether the fee has been fully refunded. If the fee is only partially refunded, this attribute will still be false. + * @property Collection $refunds A list of refunds that have been applied to the fee. + */ +class ApplicationFee extends ApiResource +{ + const OBJECT_NAME = 'application_fee'; + + use ApiOperations\NestedResource; + + /** + * Returns a list of application fees you’ve previously collected. The application + * fees are returned in sorted order, with the most recent fees appearing first. + * + * @param null|array{charge?: string, created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an application fee that your account has collected. The + * same information is returned when refunding the application fee. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return ApplicationFee + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + const PATH_REFUNDS = '/refunds'; + + /** + * @param string $id the ID of the application fee on which to retrieve the application fee refunds + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection the list of application fee refunds + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allRefunds($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_REFUNDS, $params, $opts); + } + + /** + * @param string $id the ID of the application fee on which to create the application fee refund + * @param null|array $params + * @param null|array|string $opts + * + * @return ApplicationFeeRefund + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function createRefund($id, $params = null, $opts = null) + { + return self::_createNestedResource($id, static::PATH_REFUNDS, $params, $opts); + } + + /** + * @param string $id the ID of the application fee to which the application fee refund belongs + * @param string $refundId the ID of the application fee refund to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @return ApplicationFeeRefund + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieveRefund($id, $refundId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_REFUNDS, $refundId, $params, $opts); + } + + /** + * @param string $id the ID of the application fee to which the application fee refund belongs + * @param string $refundId the ID of the application fee refund to update + * @param null|array $params + * @param null|array|string $opts + * + * @return ApplicationFeeRefund + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function updateRefund($id, $refundId, $params = null, $opts = null) + { + return self::_updateNestedResource($id, static::PATH_REFUNDS, $refundId, $params, $opts); + } +} diff --git a/stripe-php/lib/ApplicationFeeRefund.php b/stripe-php/lib/ApplicationFeeRefund.php new file mode 100644 index 0000000..e88b8d8 --- /dev/null +++ b/stripe-php/lib/ApplicationFeeRefund.php @@ -0,0 +1,64 @@ +Application Fee Refund objects allow you to refund an application fee that + * has previously been created but not yet refunded. Funds will be refunded to + * the Stripe account from which the fee was originally collected. + * + * Related guide: Refunding application fees + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount, in cents (or local equivalent). + * @property null|BalanceTransaction|string $balance_transaction Balance transaction that describes the impact on your account balance. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property ApplicationFee|string $fee ID of the application fee that was refunded. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + */ +class ApplicationFeeRefund extends ApiResource +{ + const OBJECT_NAME = 'fee_refund'; + + use ApiOperations\Update { + save as protected _save; + } + + /** + * @return string the API URL for this Stripe refund + */ + public function instanceUrl() + { + $id = $this['id']; + $fee = $this['fee']; + if (!$id) { + throw new Exception\UnexpectedValueException( + 'Could not determine which URL to request: ' + . "class instance has invalid ID: {$id}", + null + ); + } + $id = Util\Util::utf8($id); + $fee = Util\Util::utf8($fee); + + $base = ApplicationFee::classUrl(); + $feeExtn = \urlencode($fee); + $extn = \urlencode($id); + + return "{$base}/{$feeExtn}/refunds/{$extn}"; + } + + /** + * @param null|array|string $opts + * + * @return ApplicationFeeRefund the saved refund + */ + public function save($opts = null) + { + return $this->_save($opts); + } +} diff --git a/stripe-php/lib/Apps/Secret.php b/stripe-php/lib/Apps/Secret.php new file mode 100644 index 0000000..98ace56 --- /dev/null +++ b/stripe-php/lib/Apps/Secret.php @@ -0,0 +1,106 @@ +secret. Other apps can't view secrets created by an app. Additionally, secrets are scoped to provide further permission control. + * + * All Dashboard users and the app backend share account scoped secrets. Use the account scope for secrets that don't change per-user, like a third-party API key. + * + * A user scoped secret is accessible by the app backend and one specific Dashboard user. Use the user scope for per-user secrets like per-user OAuth tokens, where different users might have different permissions. + * + * Related guide: Store data between page reloads + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|bool $deleted If true, indicates that this secret has been deleted + * @property null|int $expires_at The Unix timestamp for the expiry time of the secret, after which the secret deletes. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $name A name for the secret that's unique within the scope. + * @property null|string $payload The plaintext secret value to be stored. + * @property (object{type: string, user?: string}&\Stripe\StripeObject) $scope + */ +class Secret extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'apps.secret'; + + /** + * Create or replace a secret in the secret store. + * + * @param null|array{expand?: string[], expires_at?: int, name: string, payload: string, scope: array{type: string, user?: string}} $params + * @param null|array|string $options + * + * @return Secret the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * List all secrets stored on the given scope. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, scope: array{type: string, user?: string}, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Secret the deleted secret + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function deleteWhere($params = null, $opts = null) + { + $url = static::classUrl() . '/delete'; + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Secret the finded secret + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function find($params = null, $opts = null) + { + $url = static::classUrl() . '/find'; + list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Balance.php b/stripe-php/lib/Balance.php new file mode 100644 index 0000000..ef48832 --- /dev/null +++ b/stripe-php/lib/Balance.php @@ -0,0 +1,48 @@ +available and pending comprise your "payments balance." + * + * Related guide: Balances and settlement time, Understanding Connect account balances + * + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property (object{amount: int, currency: string, source_types?: (object{bank_account?: int, card?: int, fpx?: int}&StripeObject)}&StripeObject)[] $available Available funds that you can transfer or pay out automatically by Stripe or explicitly through the Transfers API or Payouts API. You can find the available balance for each currency and payment type in the source_types property. + * @property null|(object{amount: int, currency: string, source_types?: (object{bank_account?: int, card?: int, fpx?: int}&StripeObject)}&StripeObject)[] $connect_reserved Funds held due to negative balances on connected accounts where account.controller.requirement_collection is application, which includes Custom accounts. You can find the connect reserve balance for each currency and payment type in the source_types property. + * @property null|(object{amount: int, currency: string, net_available?: (object{amount: int, destination: string, source_types?: (object{bank_account?: int, card?: int, fpx?: int}&StripeObject)}&StripeObject)[], source_types?: (object{bank_account?: int, card?: int, fpx?: int}&StripeObject)}&StripeObject)[] $instant_available Funds that you can pay out using Instant Payouts. + * @property null|(object{available: (object{amount: int, currency: string, source_types?: (object{bank_account?: int, card?: int, fpx?: int}&StripeObject)}&StripeObject)[]}&StripeObject) $issuing + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property (object{amount: int, currency: string, source_types?: (object{bank_account?: int, card?: int, fpx?: int}&StripeObject)}&StripeObject)[] $pending Funds that aren't available in the balance yet. You can find the pending balance for each currency and each payment type in the source_types property. + * @property null|(object{available: (object{amount: int, currency: string, source_types?: (object{bank_account?: int, card?: int, fpx?: int}&StripeObject)}&StripeObject)[], pending: (object{amount: int, currency: string, source_types?: (object{bank_account?: int, card?: int, fpx?: int}&StripeObject)}&StripeObject)[]}&StripeObject) $refund_and_dispute_prefunding + */ +class Balance extends SingletonApiResource +{ + const OBJECT_NAME = 'balance'; + + /** + * Retrieves the current account balance, based on the authentication that was used + * to make the request. For a sample request, see Accounting + * for negative balances. + * + * @param null|array|string $opts + * + * @return Balance + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static(null, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/BalanceSettings.php b/stripe-php/lib/BalanceSettings.php new file mode 100644 index 0000000..72c07d6 --- /dev/null +++ b/stripe-php/lib/BalanceSettings.php @@ -0,0 +1,61 @@ +Making API calls for connected accounts. + * + * @param null|array|string $opts + * + * @return BalanceSettings + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static(null, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates balance settings for a given connected account. Related guide: Making API calls for connected accounts. + * + * @param string $id the ID of the resource to update + * @param null|array{expand?: string[], payments?: array{debit_negative_balances?: bool, payouts?: array{minimum_balance_by_currency?: null|array, schedule?: array{interval?: string, monthly_payout_days?: int[], weekly_payout_days?: string[]}, statement_descriptor?: string}, settlement_timing?: array{delay_days_override?: null|int}}} $params + * @param null|array|string $opts + * + * @return BalanceSettings the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/BalanceTransaction.php b/stripe-php/lib/BalanceTransaction.php new file mode 100644 index 0000000..36f7599 --- /dev/null +++ b/stripe-php/lib/BalanceTransaction.php @@ -0,0 +1,126 @@ +Balance transaction types + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Gross amount of this transaction (in cents (or local equivalent)). A positive value represents funds charged to another party, and a negative value represents funds sent to another party. + * @property int $available_on The date that the transaction's net funds become available in the Stripe balance. + * @property string $balance_type The balance that this transaction impacts. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|float $exchange_rate If applicable, this transaction uses an exchange rate. If money converts from currency A to currency B, then the amount in currency A, multipled by the exchange_rate, equals the amount in currency B. For example, if you charge a customer 10.00 EUR, the PaymentIntent's amount is 1000 and currency is eur. If this converts to 12.34 USD in your Stripe account, the BalanceTransaction's amount is 1234, its currency is usd, and the exchange_rate is 1.234. + * @property int $fee Fees (in cents (or local equivalent)) paid for this transaction. Represented as a positive integer when assessed. + * @property ((object{amount: int, application: null|string, currency: string, description: null|string, type: string}&StripeObject))[] $fee_details Detailed breakdown of fees (in cents (or local equivalent)) paid for this transaction. + * @property int $net Net impact to a Stripe balance (in cents (or local equivalent)). A positive value represents incrementing a Stripe balance, and a negative value decrementing a Stripe balance. You can calculate the net impact of a transaction on a balance by amount - fee + * @property string $reporting_category Learn more about how reporting categories can help you understand balance transactions from an accounting perspective. + * @property null|ApplicationFee|ApplicationFeeRefund|Charge|ConnectCollectionTransfer|CustomerCashBalanceTransaction|Dispute|Issuing\Authorization|Issuing\Dispute|Issuing\Transaction|Payout|Refund|ReserveTransaction|string|TaxDeductedAtSource|Topup|Transfer|TransferReversal $source This transaction relates to the Stripe object. + * @property string $status The transaction's net funds status in the Stripe balance, which are either available or pending. + * @property string $type Transaction type: adjustment, advance, advance_funding, anticipation_repayment, application_fee, application_fee_refund, charge, climate_order_purchase, climate_order_refund, connect_collection_transfer, contribution, issuing_authorization_hold, issuing_authorization_release, issuing_dispute, issuing_transaction, obligation_outbound, obligation_reversal_inbound, payment, payment_failure_refund, payment_network_reserve_hold, payment_network_reserve_release, payment_refund, payment_reversal, payment_unreconciled, payout, payout_cancel, payout_failure, payout_minimum_balance_hold, payout_minimum_balance_release, refund, refund_failure, reserve_transaction, reserved_funds, stripe_fee, stripe_fx_fee, stripe_balance_payment_debit, stripe_balance_payment_debit_reversal, tax_fee, topup, topup_reversal, transfer, transfer_cancel, transfer_failure, or transfer_refund. Learn more about balance transaction types and what they represent. To classify transactions for accounting purposes, consider reporting_category instead. + */ +class BalanceTransaction extends ApiResource +{ + const OBJECT_NAME = 'balance_transaction'; + + const BALANCE_TYPE_ISSUING = 'issuing'; + const BALANCE_TYPE_PAYMENTS = 'payments'; + const BALANCE_TYPE_REFUND_AND_DISPUTE_PREFUNDING = 'refund_and_dispute_prefunding'; + + const TYPE_ADJUSTMENT = 'adjustment'; + const TYPE_ADVANCE = 'advance'; + const TYPE_ADVANCE_FUNDING = 'advance_funding'; + const TYPE_ANTICIPATION_REPAYMENT = 'anticipation_repayment'; + const TYPE_APPLICATION_FEE = 'application_fee'; + const TYPE_APPLICATION_FEE_REFUND = 'application_fee_refund'; + const TYPE_CHARGE = 'charge'; + const TYPE_CLIMATE_ORDER_PURCHASE = 'climate_order_purchase'; + const TYPE_CLIMATE_ORDER_REFUND = 'climate_order_refund'; + const TYPE_CONNECT_COLLECTION_TRANSFER = 'connect_collection_transfer'; + const TYPE_CONTRIBUTION = 'contribution'; + const TYPE_ISSUING_AUTHORIZATION_HOLD = 'issuing_authorization_hold'; + const TYPE_ISSUING_AUTHORIZATION_RELEASE = 'issuing_authorization_release'; + const TYPE_ISSUING_DISPUTE = 'issuing_dispute'; + const TYPE_ISSUING_TRANSACTION = 'issuing_transaction'; + const TYPE_OBLIGATION_OUTBOUND = 'obligation_outbound'; + const TYPE_OBLIGATION_REVERSAL_INBOUND = 'obligation_reversal_inbound'; + const TYPE_PAYMENT = 'payment'; + const TYPE_PAYMENT_FAILURE_REFUND = 'payment_failure_refund'; + const TYPE_PAYMENT_NETWORK_RESERVE_HOLD = 'payment_network_reserve_hold'; + const TYPE_PAYMENT_NETWORK_RESERVE_RELEASE = 'payment_network_reserve_release'; + const TYPE_PAYMENT_REFUND = 'payment_refund'; + const TYPE_PAYMENT_REVERSAL = 'payment_reversal'; + const TYPE_PAYMENT_UNRECONCILED = 'payment_unreconciled'; + const TYPE_PAYOUT = 'payout'; + const TYPE_PAYOUT_CANCEL = 'payout_cancel'; + const TYPE_PAYOUT_FAILURE = 'payout_failure'; + const TYPE_PAYOUT_MINIMUM_BALANCE_HOLD = 'payout_minimum_balance_hold'; + const TYPE_PAYOUT_MINIMUM_BALANCE_RELEASE = 'payout_minimum_balance_release'; + const TYPE_REFUND = 'refund'; + const TYPE_REFUND_FAILURE = 'refund_failure'; + const TYPE_RESERVED_FUNDS = 'reserved_funds'; + const TYPE_RESERVE_TRANSACTION = 'reserve_transaction'; + const TYPE_STRIPE_BALANCE_PAYMENT_DEBIT = 'stripe_balance_payment_debit'; + const TYPE_STRIPE_BALANCE_PAYMENT_DEBIT_REVERSAL = 'stripe_balance_payment_debit_reversal'; + const TYPE_STRIPE_FEE = 'stripe_fee'; + const TYPE_STRIPE_FX_FEE = 'stripe_fx_fee'; + const TYPE_TAX_FEE = 'tax_fee'; + const TYPE_TOPUP = 'topup'; + const TYPE_TOPUP_REVERSAL = 'topup_reversal'; + const TYPE_TRANSFER = 'transfer'; + const TYPE_TRANSFER_CANCEL = 'transfer_cancel'; + const TYPE_TRANSFER_FAILURE = 'transfer_failure'; + const TYPE_TRANSFER_REFUND = 'transfer_refund'; + + /** + * Returns a list of transactions that have contributed to the Stripe account + * balance (e.g., charges, transfers, and so forth). The transactions are returned + * in sorted order, with the most recent transactions appearing first. + * + * Note that this endpoint was previously called “Balance history” and used the + * path /v1/balance/history. + * + * @param null|array{created?: array|int, currency?: string, ending_before?: string, expand?: string[], limit?: int, payout?: string, source?: string, starting_after?: string, type?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the balance transaction with the given ID. + * + * Note that this endpoint previously used the path + * /v1/balance/history/:id. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return BalanceTransaction + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/BankAccount.php b/stripe-php/lib/BankAccount.php new file mode 100644 index 0000000..97d388d --- /dev/null +++ b/stripe-php/lib/BankAccount.php @@ -0,0 +1,171 @@ +Customer objects. + * + * On the other hand External Accounts are transfer + * destinations on Account objects for connected accounts. + * They can be bank accounts or debit cards as well, and are documented in the links above. + * + * Related guide: Bank debits and transfers + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|Account|string $account The account this bank account belongs to. Only applicable on Accounts (not customers or recipients) This property is only available when returned as an External Account where controller.is_controller is true. + * @property null|string $account_holder_name The name of the person or business that owns the bank account. + * @property null|string $account_holder_type The type of entity that holds the account. This can be either individual or company. + * @property null|string $account_type The bank account type. This can only be checking or savings in most countries. In Japan, this can only be futsu or toza. + * @property null|string[] $available_payout_methods A set of available payout methods for this bank account. Only values from this set should be passed as the method when creating a payout. + * @property null|string $bank_name Name of the bank associated with the routing number (e.g., WELLS FARGO). + * @property string $country Two-letter ISO code representing the country the bank account is located in. + * @property string $currency Three-letter ISO code for the currency paid out to the bank account. + * @property null|Customer|string $customer The ID of the customer that the bank account is associated with. + * @property null|bool $default_for_currency Whether this bank account is the default external account for its currency. + * @property null|string $fingerprint Uniquely identifies this particular bank account. You can use this attribute to check whether two bank accounts are the same. + * @property null|(object{currently_due: null|string[], errors: null|(object{code: string, reason: string, requirement: string}&StripeObject)[], past_due: null|string[], pending_verification: null|string[]}&StripeObject) $future_requirements Information about the upcoming new requirements for the bank account, including what information needs to be collected, and by when. + * @property string $last4 The last four digits of the bank account number. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|(object{currently_due: null|string[], errors: null|(object{code: string, reason: string, requirement: string}&StripeObject)[], past_due: null|string[], pending_verification: null|string[]}&StripeObject) $requirements Information about the requirements for the bank account, including what information needs to be collected. + * @property null|string $routing_number The routing transit number for the bank account. + * @property string $status

For bank accounts, possible values are new, validated, verified, verification_failed, tokenized_account_number_deactivated or errored. A bank account that hasn't had any activity or validation performed is new. If Stripe can determine that the bank account exists, its status will be validated. Note that there often isn’t enough information to know (e.g., for smaller credit unions), and the validation is not always run. If customer bank account verification has succeeded, the bank account status will be verified. If the verification failed for any reason, such as microdeposit failure, the status will be verification_failed. If the status is tokenized_account_number_deactivated, the account utilizes a tokenized account number which has been deactivated due to expiration or revocation. This account will need to be reverified to continue using it for money movement. If a payout sent to this bank account fails, we'll set the status to errored and will not continue to send scheduled payouts until the bank details are updated.

For external accounts, possible values are new, errored, verification_failed, and tokenized_account_number_deactivated. If a payout fails, the status is set to errored and scheduled payouts are stopped until account details are updated. In the US and India, if we can't verify the owner of the bank account, we'll set the status to verification_failed. Other validations aren't run against external accounts because they're only used for payouts. This means the other statuses don't apply.

+ */ +class BankAccount extends ApiResource +{ + const OBJECT_NAME = 'bank_account'; + + /** + * Delete a specified external account for a given account. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return BankAccount the deleted resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * Possible string representations of the bank verification status. + * + * @see https://stripe.com/docs/api/external_account_bank_accounts/object#account_bank_account_object-status + */ + const STATUS_NEW = 'new'; + const STATUS_VALIDATED = 'validated'; + const STATUS_VERIFIED = 'verified'; + const STATUS_VERIFICATION_FAILED = 'verification_failed'; + const STATUS_ERRORED = 'errored'; + + /** + * @return string The instance URL for this resource. It needs to be special + * cased because it doesn't fit into the standard resource pattern. + */ + public function instanceUrl() + { + if ($this['customer']) { + $base = Customer::classUrl(); + $parent = $this['customer']; + $path = 'sources'; + } elseif ($this['account']) { + $base = Account::classUrl(); + $parent = $this['account']; + $path = 'external_accounts'; + } else { + $msg = 'Bank accounts cannot be accessed without a customer ID or account ID.'; + + throw new Exception\UnexpectedValueException($msg, null); + } + $parentExtn = \urlencode(Util\Util::utf8($parent)); + $extn = \urlencode(Util\Util::utf8($this['id'])); + + return "{$base}/{$parentExtn}/{$path}/{$extn}"; + } + + /** + * @param array|string $_id + * @param null|array|string $_opts + * + * @throws Exception\BadMethodCallException + */ + public static function retrieve($_id, $_opts = null) + { + $msg = 'Bank accounts cannot be retrieved without a customer ID or ' + . 'an account ID. Retrieve a bank account using ' + . "`Customer::retrieveSource('customer_id', " + . "'bank_account_id')` or `Account::retrieveExternalAccount(" + . "'account_id', 'bank_account_id')`."; + + throw new Exception\BadMethodCallException($msg); + } + + /** + * @param string $_id + * @param null|array $_params + * @param null|array|string $_options + * + * @throws Exception\BadMethodCallException + */ + public static function update($_id, $_params = null, $_options = null) + { + $msg = 'Bank accounts cannot be updated without a customer ID or an ' + . 'account ID. Update a bank account using ' + . "`Customer::updateSource('customer_id', 'bank_account_id', " + . '$updateParams)` or `Account::updateExternalAccount(' + . "'account_id', 'bank_account_id', \$updateParams)`."; + + throw new Exception\BadMethodCallException($msg); + } + + /** + * @param null|array|string $opts + * + * @return static the saved resource + * + * @throws Exception\ApiErrorException if the request fails + * + * @deprecated The `save` method is deprecated and will be removed in a + * future major version of the library. Use the static method `update` + * on the resource instead. + */ + public function save($opts = null) + { + $params = $this->serializeParameters(); + if (\count($params) > 0) { + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('post', $url, $params, $opts, ['save']); + $this->refreshFrom($response, $opts); + } + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return BankAccount the verified bank account + * + * @throws Exception\ApiErrorException if the request fails + */ + public function verify($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/verify'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/BaseStripeClient.php b/stripe-php/lib/BaseStripeClient.php new file mode 100644 index 0000000..f9cbd31 --- /dev/null +++ b/stripe-php/lib/BaseStripeClient.php @@ -0,0 +1,516 @@ + */ + const DEFAULT_CONFIG = [ + 'api_key' => null, + 'app_info' => null, + 'client_id' => null, + 'stripe_account' => null, + 'stripe_context' => null, + 'stripe_version' => \Stripe\Util\ApiVersion::CURRENT, + 'api_base' => self::DEFAULT_API_BASE, + 'connect_base' => self::DEFAULT_CONNECT_BASE, + 'files_base' => self::DEFAULT_FILES_BASE, + 'meter_events_base' => self::DEFAULT_METER_EVENTS_BASE, + // inherit from global + 'max_network_retries' => null, + ]; + + /** @var array */ + private $config; + + /** @var \Stripe\Util\RequestOptions */ + private $defaultOpts; + + /** + * Initializes a new instance of the {@link BaseStripeClient} class. + * + * The constructor takes a single argument. The argument can be a string, in which case it + * should be the API key. It can also be an array with various configuration settings. + * + * Configuration settings include the following options: + * + * - api_key (null|string): the Stripe API key, to be used in regular API requests. + * - app_info (null|array): information to identify a plugin that integrates Stripe using this library. + * Expects: array{name: string, version?: string, url?: string, partner_id?: string} + * - client_id (null|string): the Stripe client ID, to be used in OAuth requests. + * - stripe_account (null|string): a Stripe account ID. If set, all requests sent by the client + * will automatically use the {@code Stripe-Account} header with that account ID. + * - stripe_context (null|string|\Stripe\StripeContext): a Stripe account or compartment ID. If set, all requests sent by the client + * will automatically use the {@code Stripe-Context} header with that ID. + * - stripe_version (null|string): a Stripe API version. If set, all requests sent by the client + * will include the {@code Stripe-Version} header with that API version. + * - max_network_retries (null|int): the number of times this client should retry API failures; defaults to 0. + * + * The following configuration settings are also available, though setting these should rarely be necessary + * (only useful if you want to send requests to a mock server like stripe-mock): + * + * - api_base (string): the base URL for regular API requests. Defaults to + * {@link DEFAULT_API_BASE}. + * - connect_base (string): the base URL for OAuth requests. Defaults to + * {@link DEFAULT_CONNECT_BASE}. + * - files_base (string): the base URL for file creation requests. Defaults to + * {@link DEFAULT_FILES_BASE}. + * - meter_events_base (string): the base URL for high throughput requests. Defaults to + * {@link DEFAULT_METER_EVENTS_BASE}. + * + * @param array|string $config the API key as a string, or an array containing + * the client configuration settings + */ + public function __construct($config = []) + { + if (\is_string($config)) { + $config = ['api_key' => $config]; + } elseif (!\is_array($config)) { + throw new Exception\InvalidArgumentException('$config must be a string or an array'); + } + + if (!\array_key_exists('max_network_retries', $config)) { + // if no value is passed, inherit the global value at the time of client creation + $config['max_network_retries'] = Stripe::getMaxNetworkRetries(); + } + + $config = \array_merge(self::DEFAULT_CONFIG, $config); + $this->validateConfig($config); + + $this->config = $config; + + $this->defaultOpts = \Stripe\Util\RequestOptions::parse([ + 'stripe_account' => $config['stripe_account'], + 'stripe_context' => $config['stripe_context'], + 'stripe_version' => $config['stripe_version'], + 'max_network_retries' => $config['max_network_retries'], + ]); + } + + /** + * Gets the API key used by the client to send requests. + * + * @return null|string the API key used by the client to send requests + */ + public function getApiKey() + { + return $this->config['api_key']; + } + + /** + * Gets the client ID used by the client in OAuth requests. + * + * @return null|string the client ID used by the client in OAuth requests + */ + public function getClientId() + { + return $this->config['client_id']; + } + + /** + * Gets the Stripe account ID used by the client to send requests. + * + * @return null|string the Stripe account ID used by the client to send requests + */ + public function getStripeAccount() + { + return $this->config['stripe_account']; + } + + /** + * Gets the Stripe Context ID used by the client to send requests. + * + * @return null|string|StripeContext the Stripe Context ID used by the client to send requests + */ + public function getStripeContext() + { + return $this->config['stripe_context']; + } + + /** + * Gets the Stripe Version used by the client to send requests. + * + * @return null|string the Stripe Context ID used by the client to send requests + */ + public function getStripeVersion() + { + return $this->config['stripe_version']; + } + + /** + * Gets the base URL for Stripe's API. + * + * @return string the base URL for Stripe's API + */ + public function getApiBase() + { + return $this->config['api_base']; + } + + /** + * Gets the base URL for Stripe's OAuth API. + * + * @return string the base URL for Stripe's OAuth API + */ + public function getConnectBase() + { + return $this->config['connect_base']; + } + + /** + * Gets the base URL for Stripe's Files API. + * + * @return string the base URL for Stripe's Files API + */ + public function getFilesBase() + { + return $this->config['files_base']; + } + + /** + * Gets the base URL for Stripe's Meter Events API. + * + * @return string the base URL for Stripe's Meter Events API + */ + public function getMeterEventsBase() + { + return $this->config['meter_events_base']; + } + + /** + * Gets the configured number of retries. + * + * @return int the number of times this client will retry failed requests + */ + public function getMaxNetworkRetries() + { + return $this->config['max_network_retries']; + } + + /** + * Gets the app info for this client. + * + * @return null|array information to identify a plugin that integrates Stripe using this library + */ + public function getAppInfo() + { + return $this->config['app_info']; + } + + /** + * Sends a request to Stripe's API. + * + * @param 'delete'|'get'|'post' $method the HTTP method + * @param string $path the path of the request + * @param array $params the parameters of the request + * @param array|\Stripe\Util\RequestOptions $opts the special modifiers of the request + * + * @return StripeObject the object returned by Stripe's API + */ + public function request($method, $path, $params, $opts) + { + $defaultRequestOpts = $this->defaultOpts; + $apiMode = Util::getApiMode($path); + + $opts = $defaultRequestOpts->merge($opts, true); + + $baseUrl = $opts->apiBase ?: $this->getApiBase(); + $requestor = new ApiRequestor($this->apiKeyForRequest($opts), $baseUrl, $this->getAppInfo()); + list($response, $opts->apiKey) = $requestor->request($method, $path, $params, $opts->headers, $apiMode, ['stripe_client'], $opts->maxNetworkRetries); + $opts->discardNonPersistentHeaders(); + $obj = Util::convertToStripeObject($response->json, $opts, $apiMode, Util::isV2DeleteRequest($method, $apiMode)); + if (\is_array($obj)) { + // Edge case for v2 endpoints that return empty/void response + // Example: client->v2->billing->meterEventStream->create + $obj = new StripeObject(); + } + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Sends a raw request to Stripe's API. This is the lowest level method for interacting + * with the Stripe API. This method is useful for interacting with endpoints that are not + * covered yet in stripe-php. + * + * @param 'delete'|'get'|'post' $method the HTTP method + * @param string $path the path of the request + * @param null|array $params the parameters of the request + * @param array $opts the special modifiers of the request + * @param null|int $maxNetworkRetries + * @param null|mixed $usage used internally by the SDK + * + * @return ApiResponse + */ + public function rawRequest($method, $path, $params = null, $opts = [], $maxNetworkRetries = null, $usage = null) + { + if ('post' !== $method && null !== $params) { + throw new Exception\InvalidArgumentException('Error: rawRequest only supports $params on post requests. Please pass null and add your parameters to $path'); + } + $apiMode = Util::getApiMode($path); + $headers = []; + if (\is_array($opts) && \array_key_exists('headers', $opts)) { + $headers = $opts['headers'] ?: []; + unset($opts['headers']); + } + + $defaultRawRequestOpts = $this->defaultOpts; + + $opts = $defaultRawRequestOpts->merge($opts, true); + + // Concatenate $headers to $opts->headers, removing duplicates. + $opts->headers = \array_merge($opts->headers, $headers); + $baseUrl = $opts->apiBase ?: $this->getApiBase(); + $requestor = new ApiRequestor($this->apiKeyForRequest($opts), $baseUrl); + + if (null === $usage) { + $usage = ['raw_request']; + } + + list($response) = $requestor->request($method, $path, $params, $opts->headers, $apiMode, $usage, $maxNetworkRetries); + + return $response; + } + + /** + * Sends a request to Stripe's API, passing chunks of the streamed response + * into a user-provided $readBodyChunkCallable callback. + * + * @param 'delete'|'get'|'post' $method the HTTP method + * @param string $path the path of the request + * @param callable $readBodyChunkCallable a function that will be called + * @param array $params the parameters of the request + * @param array|\Stripe\Util\RequestOptions $opts the special modifiers of the request + * + * with chunks of bytes from the body if the request is successful + */ + public function requestStream($method, $path, $readBodyChunkCallable, $params, $opts) + { + $opts = $this->defaultOpts->merge($opts, true); + $baseUrl = $opts->apiBase ?: $this->getApiBase(); + $requestor = new ApiRequestor($this->apiKeyForRequest($opts), $baseUrl, $this->getAppInfo()); + $apiMode = Util::getApiMode($path); + list($response, $opts->apiKey) = $requestor->requestStream($method, $path, $readBodyChunkCallable, $params, $opts->headers, $apiMode, ['stripe_client']); + } + + /** + * Sends a request to Stripe's API. + * + * @param 'delete'|'get'|'post' $method the HTTP method + * @param string $path the path of the request + * @param array $params the parameters of the request + * @param array|\Stripe\Util\RequestOptions $opts the special modifiers of the request + * + * @return Collection|V2\Collection of ApiResources + */ + public function requestCollection($method, $path, $params, $opts) + { + $obj = $this->request($method, $path, $params, $opts); + $apiMode = Util::getApiMode($path); + if ('v1' === $apiMode) { + if (!$obj instanceof Collection) { + $received_class = \get_class($obj); + $msg = "Expected to receive `Stripe\\Collection` object from Stripe API. Instead received `{$received_class}`."; + + throw new Exception\UnexpectedValueException($msg); + } + $obj->setFilters($params); + } else { + if (!$obj instanceof V2\Collection) { + $received_class = \get_class($obj); + $msg = "Expected to receive `Stripe\\V2\\Collection` object from Stripe API. Instead received `{$received_class}`."; + + throw new Exception\UnexpectedValueException($msg); + } + } + + return $obj; + } + + /** + * Sends a request to Stripe's API. + * + * @param 'delete'|'get'|'post' $method the HTTP method + * @param string $path the path of the request + * @param array $params the parameters of the request + * @param array|\Stripe\Util\RequestOptions $opts the special modifiers of the request + * + * @return SearchResult of ApiResources + */ + public function requestSearchResult($method, $path, $params, $opts) + { + $obj = $this->request($method, $path, $params, $opts); + if (!$obj instanceof SearchResult) { + $received_class = \get_class($obj); + $msg = "Expected to receive `Stripe\\SearchResult` object from Stripe API. Instead received `{$received_class}`."; + + throw new Exception\UnexpectedValueException($msg); + } + $obj->setFilters($params); + + return $obj; + } + + /** + * @param \Stripe\Util\RequestOptions $opts + * + * @return string + * + * @throws Exception\AuthenticationException + */ + private function apiKeyForRequest($opts) + { + $apiKey = $opts->apiKey ?: $this->getApiKey(); + + if (null === $apiKey) { + $msg = 'No API key provided. Set your API key when constructing the ' + . 'StripeClient instance, or provide it on a per-request basis ' + . 'using the `api_key` key in the $opts argument.'; + + throw new Exception\AuthenticationException($msg); + } + + return $apiKey; + } + + /** + * @param array $config + * + * @throws Exception\InvalidArgumentException + */ + private function validateConfig($config) + { + // api_key + if (null !== $config['api_key'] && !\is_string($config['api_key'])) { + throw new Exception\InvalidArgumentException('api_key must be null or a string'); + } + + if (null !== $config['api_key'] && ('' === $config['api_key'])) { + $msg = 'api_key cannot be the empty string'; + + throw new Exception\InvalidArgumentException($msg); + } + + if (null !== $config['api_key'] && \preg_match('/\s/', $config['api_key'])) { + $msg = 'api_key cannot contain whitespace'; + + throw new Exception\InvalidArgumentException($msg); + } + + // client_id + if (null !== $config['client_id'] && !\is_string($config['client_id'])) { + throw new Exception\InvalidArgumentException('client_id must be null or a string'); + } + + // stripe_account + if (null !== $config['stripe_account'] && !\is_string($config['stripe_account'])) { + throw new Exception\InvalidArgumentException('stripe_account must be null or a string'); + } + + // stripe_context + if (null !== $config['stripe_context'] && !\is_string($config['stripe_context']) && !($config['stripe_context'] instanceof StripeContext)) { + throw new Exception\InvalidArgumentException('stripe_context must be null, a string, or a StripeContext instance'); + } + + // stripe_version + if (null !== $config['stripe_version'] && !\is_string($config['stripe_version'])) { + throw new Exception\InvalidArgumentException('stripe_version must be null or a string'); + } + + // api_base + if (!\is_string($config['api_base'])) { + throw new Exception\InvalidArgumentException('api_base must be a string'); + } + + // connect_base + if (!\is_string($config['connect_base'])) { + throw new Exception\InvalidArgumentException('connect_base must be a string'); + } + + // files_base + if (!\is_string($config['files_base'])) { + throw new Exception\InvalidArgumentException('files_base must be a string'); + } + + // app info + if (null !== $config['app_info'] && !\is_array($config['app_info'])) { + throw new Exception\InvalidArgumentException('app_info must be an array'); + } + + // max_network_retries + if (!\is_int($config['max_network_retries'])) { + throw new Exception\InvalidArgumentException('max_network_retries must an int'); + } + + $appInfoKeys = ['name', 'version', 'url', 'partner_id']; + if (null !== $config['app_info'] && array_diff_key($config['app_info'], array_flip($appInfoKeys))) { + $msg = 'app_info must be of type array{name: string, version?: string, url?: string, partner_id?: string}'; + + throw new Exception\InvalidArgumentException($msg); + } + + // check absence of extra keys + $extraConfigKeys = \array_diff(\array_keys($config), \array_keys(self::DEFAULT_CONFIG)); + if (!empty($extraConfigKeys)) { + // Wrap in single quote to more easily catch trailing spaces errors + $invalidKeys = "'" . \implode("', '", $extraConfigKeys) . "'"; + + throw new Exception\InvalidArgumentException('Found unknown key(s) in configuration array: ' . $invalidKeys); + } + } + + /** + * Deserializes the raw JSON string returned by rawRequest into a similar class. + * + * @param string $json + * @param 'v1'|'v2' $apiMode + * + * @return StripeObject + * */ + public function deserialize($json, $apiMode = 'v1') + { + return Util::convertToStripeObject(\json_decode($json, true), [], $apiMode); + } + + /** + * Returns a \Stripe\V2\Core\Events instance using the provided JSON payload. Throws an + * Exception\UnexpectedValueException if the payload is not valid JSON, and + * an Exception\SignatureVerificationException if the signature + * verification fails for any reason. + * + * @param string $payload the payload sent by Stripe + * @param string $sigHeader the contents of the signature header sent by + * Stripe + * @param string $secret secret used to generate the signature + * @param int $tolerance maximum difference allowed between the header's + * timestamp and the current time. Defaults to 300 seconds (5 min) + * + * @return EventNotification + * + * @throws Exception\SignatureVerificationException if the verification fails + * @throws Exception\UnexpectedValueException if the payload is not valid JSON, + */ + public function parseEventNotification($payload, $sigHeader, $secret, $tolerance = Webhook::DEFAULT_TOLERANCE) + { + $eventData = Util::utf8($payload); + WebhookSignature::verifyHeader($payload, $sigHeader, $secret, $tolerance); + + return EventNotification::fromJson($eventData, $this); + } +} diff --git a/stripe-php/lib/BaseStripeClientInterface.php b/stripe-php/lib/BaseStripeClientInterface.php new file mode 100644 index 0000000..5db0bd3 --- /dev/null +++ b/stripe-php/lib/BaseStripeClientInterface.php @@ -0,0 +1,72 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string $status Status of the alert. This can be active, inactive or archived. + * @property string $title Title of the alert. + * @property null|(object{filters: null|((object{customer: null|string|\Stripe\Customer, type: string}&\Stripe\StripeObject))[], gte: int, meter: Meter|string, recurrence: string}&\Stripe\StripeObject) $usage_threshold Encapsulates configuration of the alert to monitor usage on a specific Billing Meter. + */ +class Alert extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'billing.alert'; + + const STATUS_ACTIVE = 'active'; + const STATUS_ARCHIVED = 'archived'; + const STATUS_INACTIVE = 'inactive'; + + /** + * Creates a billing alert. + * + * @param null|array{alert_type: string, expand?: string[], title: string, usage_threshold?: array{filters?: array{customer?: string, type: string}[], gte: int, meter: string, recurrence: string}} $params + * @param null|array|string $options + * + * @return Alert the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Lists billing active and inactive alerts. + * + * @param null|array{alert_type?: string, ending_before?: string, expand?: string[], limit?: int, meter?: string, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a billing alert given an ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Alert + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Alert the activated alert + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function activate($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/activate'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Alert the archived alert + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function archive($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/archive'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Alert the deactivated alert + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function deactivate($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/deactivate'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/Billing/AlertTriggered.php b/stripe-php/lib/Billing/AlertTriggered.php new file mode 100644 index 0000000..8641dd3 --- /dev/null +++ b/stripe-php/lib/Billing/AlertTriggered.php @@ -0,0 +1,18 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property int $value The value triggering the alert + */ +class AlertTriggered extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'billing.alert_triggered'; +} diff --git a/stripe-php/lib/Billing/CreditBalanceSummary.php b/stripe-php/lib/Billing/CreditBalanceSummary.php new file mode 100644 index 0000000..e767650 --- /dev/null +++ b/stripe-php/lib/Billing/CreditBalanceSummary.php @@ -0,0 +1,37 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + */ +class CreditBalanceSummary extends \Stripe\SingletonApiResource +{ + const OBJECT_NAME = 'billing.credit_balance_summary'; + + /** + * Retrieves the credit balance summary for a customer. + * + * @param null|array|string $opts + * + * @return CreditBalanceSummary + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static(null, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Billing/CreditBalanceTransaction.php b/stripe-php/lib/Billing/CreditBalanceTransaction.php new file mode 100644 index 0000000..2d3be6f --- /dev/null +++ b/stripe-php/lib/Billing/CreditBalanceTransaction.php @@ -0,0 +1,63 @@ +credit. + * @property CreditGrant|string $credit_grant The credit grant associated with this credit balance transaction. + * @property null|(object{amount: (object{monetary: null|(object{currency: string, value: int}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), credits_applied: null|(object{invoice: string|\Stripe\Invoice, invoice_line_item: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject) $debit Debit details for this credit balance transaction. Only present if type is debit. + * @property int $effective_at The effective time of this credit balance transaction. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string|\Stripe\TestHelpers\TestClock $test_clock ID of the test clock this credit balance transaction belongs to. + * @property null|string $type The type of credit balance transaction (credit or debit). + */ +class CreditBalanceTransaction extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'billing.credit_balance_transaction'; + + const TYPE_CREDIT = 'credit'; + const TYPE_DEBIT = 'debit'; + + /** + * Retrieve a list of credit balance transactions. + * + * @param null|array{credit_grant?: string, customer?: string, customer_account?: string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a credit balance transaction. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return CreditBalanceTransaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Billing/CreditGrant.php b/stripe-php/lib/Billing/CreditGrant.php new file mode 100644 index 0000000..5d1f2ad --- /dev/null +++ b/stripe-php/lib/Billing/CreditGrant.php @@ -0,0 +1,153 @@ +Billing credits + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property (object{monetary: null|(object{currency: string, value: int}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject) $amount + * @property (object{scope: (object{price_type?: string, prices?: ((object{id: null|string}&\Stripe\StripeObject))[]}&\Stripe\StripeObject)}&\Stripe\StripeObject) $applicability_config + * @property string $category The category of this credit grant. This is for tracking purposes and isn't displayed to the customer. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string|\Stripe\Customer $customer ID of the customer receiving the billing credits. + * @property null|string $customer_account ID of the account representing the customer receiving the billing credits + * @property null|int $effective_at The time when the billing credits become effective-when they're eligible for use. + * @property null|int $expires_at The time when the billing credits expire. If not present, the billing credits don't expire. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $name A descriptive name shown in dashboard. + * @property null|int $priority The priority for applying this credit grant. The highest priority is 0 and the lowest is 100. + * @property null|string|\Stripe\TestHelpers\TestClock $test_clock ID of the test clock this credit grant belongs to. + * @property int $updated Time at which the object was last updated. Measured in seconds since the Unix epoch. + * @property null|int $voided_at The time when this credit grant was voided. If not present, the credit grant hasn't been voided. + */ +class CreditGrant extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'billing.credit_grant'; + + use \Stripe\ApiOperations\Update; + + const CATEGORY_PAID = 'paid'; + const CATEGORY_PROMOTIONAL = 'promotional'; + + /** + * Creates a credit grant. + * + * @param null|array{amount: array{monetary?: array{currency: string, value: int}, type: string}, applicability_config: array{scope: array{price_type?: string, prices?: array{id: string}[]}}, category?: string, customer?: string, customer_account?: string, effective_at?: int, expand?: string[], expires_at?: int, metadata?: array, name?: string, priority?: int} $params + * @param null|array|string $options + * + * @return CreditGrant the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Retrieve a list of credit grants. + * + * @param null|array{customer?: string, customer_account?: string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a credit grant. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return CreditGrant + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates a credit grant. + * + * @param string $id the ID of the resource to update + * @param null|array{expand?: string[], expires_at?: null|int, metadata?: array} $params + * @param null|array|string $opts + * + * @return CreditGrant the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return CreditGrant the expired credit grant + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function expire($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/expire'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return CreditGrant the voided credit grant + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function voidGrant($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/void'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/Billing/Meter.php b/stripe-php/lib/Billing/Meter.php new file mode 100644 index 0000000..c546585 --- /dev/null +++ b/stripe-php/lib/Billing/Meter.php @@ -0,0 +1,169 @@ +Usage based billing + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property (object{event_payload_key: string, type: string}&\Stripe\StripeObject) $customer_mapping + * @property (object{formula: string}&\Stripe\StripeObject) $default_aggregation + * @property string $display_name The meter's name. + * @property string $event_name The name of the meter event to record usage for. Corresponds with the event_name field on meter events. + * @property null|string $event_time_window The time window which meter events have been pre-aggregated for, if any. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $status The meter's status. + * @property (object{deactivated_at: null|int}&\Stripe\StripeObject) $status_transitions + * @property int $updated Time at which the object was last updated. Measured in seconds since the Unix epoch. + * @property (object{event_payload_key: string}&\Stripe\StripeObject) $value_settings + */ +class Meter extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'billing.meter'; + + use \Stripe\ApiOperations\NestedResource; + use \Stripe\ApiOperations\Update; + + const EVENT_TIME_WINDOW_DAY = 'day'; + const EVENT_TIME_WINDOW_HOUR = 'hour'; + + const STATUS_ACTIVE = 'active'; + const STATUS_INACTIVE = 'inactive'; + + /** + * Creates a billing meter. + * + * @param null|array{customer_mapping?: array{event_payload_key: string, type: string}, default_aggregation: array{formula: string}, display_name: string, event_name: string, event_time_window?: string, expand?: string[], value_settings?: array{event_payload_key: string}} $params + * @param null|array|string $options + * + * @return Meter the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Retrieve a list of billing meters. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a billing meter given an ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Meter + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates a billing meter. + * + * @param string $id the ID of the resource to update + * @param null|array{display_name?: string, expand?: string[]} $params + * @param null|array|string $opts + * + * @return Meter the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Meter the deactivated meter + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function deactivate($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/deactivate'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Meter the reactivated meter + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function reactivate($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/reactivate'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + const PATH_EVENT_SUMMARIES = '/event_summaries'; + + /** + * @param string $id the ID of the meter on which to retrieve the meter event summaries + * @param null|array $params + * @param null|array|string $opts + * + * @return \Stripe\Collection the list of meter event summaries + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function allEventSummaries($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_EVENT_SUMMARIES, $params, $opts); + } +} diff --git a/stripe-php/lib/Billing/MeterEvent.php b/stripe-php/lib/Billing/MeterEvent.php new file mode 100644 index 0000000..96c1918 --- /dev/null +++ b/stripe-php/lib/Billing/MeterEvent.php @@ -0,0 +1,43 @@ +event_name field on a meter. + * @property string $identifier A unique identifier for the event. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $payload The payload of the event. This contains the fields corresponding to a meter's customer_mapping.event_payload_key (default is stripe_customer_id) and value_settings.event_payload_key (default is value). Read more about the payload. + * @property int $timestamp The timestamp passed in when creating the event. Measured in seconds since the Unix epoch. + */ +class MeterEvent extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'billing.meter_event'; + + /** + * Creates a billing meter event. + * + * @param null|array{event_name: string, expand?: string[], identifier?: string, payload: array, timestamp?: int} $params + * @param null|array|string $options + * + * @return MeterEvent the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Billing/MeterEventAdjustment.php b/stripe-php/lib/Billing/MeterEventAdjustment.php new file mode 100644 index 0000000..a6742b4 --- /dev/null +++ b/stripe-php/lib/Billing/MeterEventAdjustment.php @@ -0,0 +1,45 @@ +event_name field on a meter. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $status The meter event adjustment's status. + * @property string $type Specifies whether to cancel a single event or a range of events for a time period. Time period cancellation is not supported yet. + */ +class MeterEventAdjustment extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'billing.meter_event_adjustment'; + + const STATUS_COMPLETE = 'complete'; + const STATUS_PENDING = 'pending'; + + /** + * Creates a billing meter event adjustment. + * + * @param null|array{cancel?: array{identifier?: string}, event_name: string, expand?: string[], type: string} $params + * @param null|array|string $options + * + * @return MeterEventAdjustment the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Billing/MeterEventSummary.php b/stripe-php/lib/Billing/MeterEventSummary.php new file mode 100644 index 0000000..008525a --- /dev/null +++ b/stripe-php/lib/Billing/MeterEventSummary.php @@ -0,0 +1,24 @@ +start_time (inclusive) and end_time (inclusive). The aggregation strategy is defined on meter via default_aggregation. + * @property int $end_time End timestamp for this event summary (exclusive). Must be aligned with minute boundaries. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $meter The meter associated with this event summary. + * @property int $start_time Start timestamp for this event summary (inclusive). Must be aligned with minute boundaries. + */ +class MeterEventSummary extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'billing.meter_event_summary'; +} diff --git a/stripe-php/lib/BillingPortal/Configuration.php b/stripe-php/lib/BillingPortal/Configuration.php new file mode 100644 index 0000000..4cc47d3 --- /dev/null +++ b/stripe-php/lib/BillingPortal/Configuration.php @@ -0,0 +1,114 @@ +Configure the customer portal. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property bool $active Whether the configuration is active and can be used to create portal sessions. + * @property null|string|\Stripe\Application $application ID of the Connect Application that created the configuration. + * @property (object{headline: null|string, privacy_policy_url: null|string, terms_of_service_url: null|string}&\Stripe\StripeObject) $business_profile + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $default_return_url The default URL to redirect customers to when they click on the portal's link to return to your website. This can be overriden when creating the session. + * @property (object{customer_update: (object{allowed_updates: string[], enabled: bool}&\Stripe\StripeObject), invoice_history: (object{enabled: bool}&\Stripe\StripeObject), payment_method_update: (object{enabled: bool, payment_method_configuration: null|string}&\Stripe\StripeObject), subscription_cancel: (object{cancellation_reason: (object{enabled: bool, options: string[]}&\Stripe\StripeObject), enabled: bool, mode: string, proration_behavior: string}&\Stripe\StripeObject), subscription_update: (object{billing_cycle_anchor: null|string, default_allowed_updates: string[], enabled: bool, products?: null|((object{adjustable_quantity: (object{enabled: bool, maximum: null|int, minimum: int}&\Stripe\StripeObject), prices: string[], product: string}&\Stripe\StripeObject))[], proration_behavior: string, schedule_at_period_end: (object{conditions: (object{type: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), trial_update_behavior: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $features + * @property bool $is_default Whether the configuration is the default. If true, this configuration can be managed in the Dashboard and portal sessions will use this configuration unless it is overriden when creating the session. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property (object{enabled: bool, url: null|string}&\Stripe\StripeObject) $login_page + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $name The name of the configuration. + * @property int $updated Time at which the object was last updated. Measured in seconds since the Unix epoch. + */ +class Configuration extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'billing_portal.configuration'; + + use \Stripe\ApiOperations\Update; + + /** + * Creates a configuration that describes the functionality and behavior of a + * PortalSession. + * + * @param null|array{business_profile?: array{headline?: null|string, privacy_policy_url?: string, terms_of_service_url?: string}, default_return_url?: null|string, expand?: string[], features: array{customer_update?: array{allowed_updates?: null|string[], enabled: bool}, invoice_history?: array{enabled: bool}, payment_method_update?: array{enabled: bool, payment_method_configuration?: null|string}, subscription_cancel?: array{cancellation_reason?: array{enabled: bool, options: null|string[]}, enabled: bool, mode?: string, proration_behavior?: string}, subscription_update?: array{billing_cycle_anchor?: string, default_allowed_updates?: null|string[], enabled: bool, products?: null|array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, prices: string[], product: string}[], proration_behavior?: string, schedule_at_period_end?: array{conditions?: array{type: string}[]}, trial_update_behavior?: string}}, login_page?: array{enabled: bool}, metadata?: array, name?: null|string} $params + * @param null|array|string $options + * + * @return Configuration the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of configurations that describe the functionality of the customer + * portal. + * + * @param null|array{active?: bool, ending_before?: string, expand?: string[], is_default?: bool, limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a configuration that describes the functionality of the customer + * portal. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Configuration + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates a configuration that describes the functionality of the customer portal. + * + * @param string $id the ID of the resource to update + * @param null|array{active?: bool, business_profile?: array{headline?: null|string, privacy_policy_url?: null|string, terms_of_service_url?: null|string}, default_return_url?: null|string, expand?: string[], features?: array{customer_update?: array{allowed_updates?: null|string[], enabled?: bool}, invoice_history?: array{enabled: bool}, payment_method_update?: array{enabled: bool, payment_method_configuration?: null|string}, subscription_cancel?: array{cancellation_reason?: array{enabled: bool, options?: null|string[]}, enabled?: bool, mode?: string, proration_behavior?: string}, subscription_update?: array{billing_cycle_anchor?: string, default_allowed_updates?: null|string[], enabled?: bool, products?: null|array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, prices: string[], product: string}[], proration_behavior?: string, schedule_at_period_end?: array{conditions?: null|array{type: string}[]}, trial_update_behavior?: string}}, login_page?: array{enabled: bool}, metadata?: null|array, name?: null|string} $params + * @param null|array|string $opts + * + * @return Configuration the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/BillingPortal/Session.php b/stripe-php/lib/BillingPortal/Session.php new file mode 100644 index 0000000..b833a6e --- /dev/null +++ b/stripe-php/lib/BillingPortal/Session.php @@ -0,0 +1,61 @@ +Customer management + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property Configuration|string $configuration The configuration used by this session, describing the features available. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $customer The ID of the customer for this session. + * @property null|string $customer_account The ID of the account for this session. + * @property null|(object{after_completion: (object{hosted_confirmation: null|(object{custom_message: null|string}&\Stripe\StripeObject), redirect: null|(object{return_url: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), subscription_cancel: null|(object{retention: null|(object{coupon_offer: null|(object{coupon: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), subscription: string}&\Stripe\StripeObject), subscription_update: null|(object{subscription: string}&\Stripe\StripeObject), subscription_update_confirm: null|(object{discounts: null|((object{coupon: null|string, promotion_code: null|string}&\Stripe\StripeObject))[], items: ((object{id: null|string, price: null|string, quantity?: int}&\Stripe\StripeObject))[], subscription: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject) $flow Information about a specific flow for the customer to go through. See the docs to learn more about using customer portal deep links and flows. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string $locale The IETF language tag of the locale Customer Portal is displayed in. If blank or auto, the customer’s preferred_locales or browser’s locale is used. + * @property null|string $on_behalf_of The account for which the session was created on behalf of. When specified, only subscriptions and invoices with this on_behalf_of account appear in the portal. For more information, see the docs. Use the Accounts API to modify the on_behalf_of account's branding settings, which the portal displays. + * @property null|string $return_url The URL to redirect customers to when they click on the portal's link to return to your website. + * @property string $url The short-lived URL of the session that gives customers access to the customer portal. + */ +class Session extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'billing_portal.session'; + + /** + * Creates a session of the customer portal. + * + * @param null|array{configuration?: string, customer?: string, customer_account?: string, expand?: string[], flow_data?: array{after_completion?: array{hosted_confirmation?: array{custom_message?: string}, redirect?: array{return_url: string}, type: string}, subscription_cancel?: array{retention?: array{coupon_offer: array{coupon: string}, type: string}, subscription: string}, subscription_update?: array{subscription: string}, subscription_update_confirm?: array{discounts?: array{coupon?: string, promotion_code?: string}[], items: array{id: string, price?: string, quantity?: int}[], subscription: string}, type: string}, locale?: string, on_behalf_of?: string, return_url?: string} $params + * @param null|array|string $options + * + * @return Session the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Capability.php b/stripe-php/lib/Capability.php new file mode 100644 index 0000000..91669f5 --- /dev/null +++ b/stripe-php/lib/Capability.php @@ -0,0 +1,107 @@ +Account capabilities + * + * @property string $id The identifier for the capability. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property Account|string $account The account for which the capability enables functionality. + * @property null|(object{alternatives: null|(object{alternative_fields_due: string[], original_fields_due: string[]}&StripeObject)[], current_deadline: null|int, currently_due: string[], disabled_reason: null|string, errors: (object{code: string, reason: string, requirement: string}&StripeObject)[], eventually_due: string[], past_due: string[], pending_verification: string[]}&StripeObject) $future_requirements + * @property bool $requested Whether the capability has been requested. + * @property null|int $requested_at Time at which the capability was requested. Measured in seconds since the Unix epoch. + * @property null|(object{alternatives: null|(object{alternative_fields_due: string[], original_fields_due: string[]}&StripeObject)[], current_deadline: null|int, currently_due: string[], disabled_reason: null|string, errors: (object{code: string, reason: string, requirement: string}&StripeObject)[], eventually_due: string[], past_due: string[], pending_verification: string[]}&StripeObject) $requirements + * @property string $status The status of the capability. + */ +class Capability extends ApiResource +{ + const OBJECT_NAME = 'capability'; + + const STATUS_ACTIVE = 'active'; + const STATUS_INACTIVE = 'inactive'; + const STATUS_PENDING = 'pending'; + const STATUS_UNREQUESTED = 'unrequested'; + + /** + * @return string the API URL for this Stripe account reversal + */ + public function instanceUrl() + { + $id = $this['id']; + $account = $this['account']; + if (!$id) { + throw new Exception\UnexpectedValueException( + 'Could not determine which URL to request: ' + . "class instance has invalid ID: {$id}", + null + ); + } + $id = Util\Util::utf8($id); + $account = Util\Util::utf8($account); + + $base = Account::classUrl(); + $accountExtn = \urlencode($account); + $extn = \urlencode($id); + + return "{$base}/{$accountExtn}/capabilities/{$extn}"; + } + + /** + * @param array|string $_id + * @param null|array|string $_opts + * + * @throws Exception\BadMethodCallException + */ + public static function retrieve($_id, $_opts = null) + { + $msg = 'Capabilities cannot be retrieved without an account ID. ' + . 'Retrieve a capability using `Account::retrieveCapability(' + . "'account_id', 'capability_id')`."; + + throw new Exception\BadMethodCallException($msg); + } + + /** + * @param string $_id + * @param null|array $_params + * @param null|array|string $_options + * + * @throws Exception\BadMethodCallException + */ + public static function update($_id, $_params = null, $_options = null) + { + $msg = 'Capabilities cannot be updated without an account ID. ' + . 'Update a capability using `Account::updateCapability(' + . "'account_id', 'capability_id', \$updateParams)`."; + + throw new Exception\BadMethodCallException($msg); + } + + /** + * @param null|array|string $opts + * + * @return static the saved resource + * + * @throws Exception\ApiErrorException if the request fails + * + * @deprecated The `save` method is deprecated and will be removed in a + * future major version of the library. Use the static method `update` + * on the resource instead. + */ + public function save($opts = null) + { + $params = $this->serializeParameters(); + if (\count($params) > 0) { + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('post', $url, $params, $opts, ['save']); + $this->refreshFrom($response, $opts); + } + + return $this; + } +} diff --git a/stripe-php/lib/Card.php b/stripe-php/lib/Card.php new file mode 100644 index 0000000..e9ee873 --- /dev/null +++ b/stripe-php/lib/Card.php @@ -0,0 +1,188 @@ +Card payments with Sources + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|Account|string $account + * @property null|string $address_city City/District/Suburb/Town/Village. + * @property null|string $address_country Billing address country, if provided when creating card. + * @property null|string $address_line1 Address line 1 (Street address/PO Box/Company name). + * @property null|string $address_line1_check If address_line1 was provided, results of the check: pass, fail, unavailable, or unchecked. + * @property null|string $address_line2 Address line 2 (Apartment/Suite/Unit/Building). + * @property null|string $address_state State/County/Province/Region. + * @property null|string $address_zip ZIP or postal code. + * @property null|string $address_zip_check If address_zip was provided, results of the check: pass, fail, unavailable, or unchecked. + * @property null|string $allow_redisplay This field indicates whether this payment method can be shown again to its customer in a checkout flow. Stripe products such as Checkout and Elements use this field to determine whether a payment method can be shown as a saved payment method in a checkout flow. The field defaults to “unspecified”. + * @property null|string[] $available_payout_methods A set of available payout methods for this card. Only values from this set should be passed as the method when creating a payout. + * @property string $brand Card brand. Can be American Express, Cartes Bancaires, Diners Club, Discover, Eftpos Australia, Girocard, JCB, MasterCard, UnionPay, Visa, or Unknown. + * @property null|string $country Two-letter ISO code representing the country of the card. You could use this attribute to get a sense of the international breakdown of cards you've collected. + * @property null|string $currency Three-letter ISO code for currency in lowercase. Must be a supported currency. Only applicable on accounts (not customers or recipients). The card can be used as a transfer destination for funds in this currency. This property is only available when returned as an External Account where controller.is_controller is true. + * @property null|Customer|string $customer The customer that this card belongs to. This attribute will not be in the card object if the card belongs to an account or recipient instead. + * @property null|string $cvc_check If a CVC was provided, results of the check: pass, fail, unavailable, or unchecked. A result of unchecked indicates that CVC was provided but hasn't been checked yet. Checks are typically performed when attaching a card to a Customer object, or when creating a charge. For more details, see Check if a card is valid without a charge. + * @property null|bool $default_for_currency Whether this card is the default external account for its currency. This property is only available for accounts where controller.requirement_collection is application, which includes Custom accounts. + * @property null|string $dynamic_last4 (For tokenized numbers only.) The last four digits of the device account number. + * @property int $exp_month Two-digit number representing the card's expiration month. + * @property int $exp_year Four-digit number representing the card's expiration year. + * @property null|string $fingerprint

Uniquely identifies this particular card number. You can use this attribute to check whether two customers who’ve signed up with you are using the same card number, for example. For payment methods that tokenize card information (Apple Pay, Google Pay), the tokenized number might be provided instead of the underlying card number.

As of May 1, 2021, card fingerprint in India for Connect changed to allow two fingerprints for the same card---one for India and one for the rest of the world.

+ * @property string $funding Card funding type. Can be credit, debit, prepaid, or unknown. + * @property string $last4 The last four digits of the card. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $name Cardholder name. + * @property null|(object{preferred: null|string}&StripeObject) $networks + * @property null|string $regulated_status Status of a card based on the card issuer. + * @property null|string $status For external accounts that are cards, possible values are new and errored. If a payout fails, the status is set to errored and scheduled payouts are stopped until account details are updated. + * @property null|string $tokenization_method If the card number is tokenized, this is the method that was used. Can be android_pay (includes Google Pay), apple_pay, masterpass, visa_checkout, or null. + */ +class Card extends ApiResource +{ + const OBJECT_NAME = 'card'; + + const ALLOW_REDISPLAY_ALWAYS = 'always'; + const ALLOW_REDISPLAY_LIMITED = 'limited'; + const ALLOW_REDISPLAY_UNSPECIFIED = 'unspecified'; + + const REGULATED_STATUS_REGULATED = 'regulated'; + const REGULATED_STATUS_UNREGULATED = 'unregulated'; + + /** + * Delete a specified external account for a given account. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return Card the deleted resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * Possible string representations of the CVC check status. + * + * @see https://stripe.com/docs/api/cards/object#card_object-cvc_check + */ + const CVC_CHECK_FAIL = 'fail'; + const CVC_CHECK_PASS = 'pass'; + const CVC_CHECK_UNAVAILABLE = 'unavailable'; + const CVC_CHECK_UNCHECKED = 'unchecked'; + + /** + * Possible string representations of the funding of the card. + * + * @see https://stripe.com/docs/api/cards/object#card_object-funding + */ + const FUNDING_CREDIT = 'credit'; + const FUNDING_DEBIT = 'debit'; + const FUNDING_PREPAID = 'prepaid'; + const FUNDING_UNKNOWN = 'unknown'; + + /** + * Possible string representations of the tokenization method when using Apple Pay or Google Pay. + * + * @see https://stripe.com/docs/api/cards/object#card_object-tokenization_method + */ + const TOKENIZATION_METHOD_APPLE_PAY = 'apple_pay'; + const TOKENIZATION_METHOD_GOOGLE_PAY = 'google_pay'; + + /** + * @return string The instance URL for this resource. It needs to be special + * cased because cards are nested resources that may belong to different + * top-level resources. + */ + public function instanceUrl() + { + if ($this['customer']) { + $base = Customer::classUrl(); + $parent = $this['customer']; + $path = 'sources'; + } elseif ($this['account']) { + $base = Account::classUrl(); + $parent = $this['account']; + $path = 'external_accounts'; + } else { + $msg = 'Cards cannot be accessed without a customer ID, or account ID.'; + + throw new Exception\UnexpectedValueException($msg); + } + $parentExtn = \urlencode(Util\Util::utf8($parent)); + $extn = \urlencode(Util\Util::utf8($this['id'])); + + return "{$base}/{$parentExtn}/{$path}/{$extn}"; + } + + /** + * @param array|string $_id + * @param null|array|string $_opts + * + * @throws Exception\BadMethodCallException + */ + public static function retrieve($_id, $_opts = null) + { + $msg = 'Cards cannot be retrieved without a customer ID or an ' + . 'account ID. Retrieve a card using ' + . "`Customer::retrieveSource('customer_id', 'card_id')` or " + . "`Account::retrieveExternalAccount('account_id', 'card_id')`."; + + throw new Exception\BadMethodCallException($msg); + } + + /** + * @param string $_id + * @param null|array $_params + * @param null|array|string $_options + * + * @throws Exception\BadMethodCallException + */ + public static function update($_id, $_params = null, $_options = null) + { + $msg = 'Cards cannot be updated without a customer ID or an ' + . 'account ID. Update a card using ' + . "`Customer::updateSource('customer_id', 'card_id', " + . '$updateParams)` or `Account::updateExternalAccount(' + . "'account_id', 'card_id', \$updateParams)`."; + + throw new Exception\BadMethodCallException($msg); + } + + /** + * @param null|array|string $opts + * + * @return static the saved resource + * + * @throws Exception\ApiErrorException if the request fails + * + * @deprecated The `save` method is deprecated and will be removed in a + * future major version of the library. Use the static method `update` + * on the resource instead. + */ + public function save($opts = null) + { + $params = $this->serializeParameters(); + if (\count($params) > 0) { + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('post', $url, $params, $opts, ['save']); + $this->refreshFrom($response, $opts); + } + + return $this; + } +} diff --git a/stripe-php/lib/CashBalance.php b/stripe-php/lib/CashBalance.php new file mode 100644 index 0000000..fd0cbfe --- /dev/null +++ b/stripe-php/lib/CashBalance.php @@ -0,0 +1,65 @@ +Cash balance represents real funds. Customers can add funds to their cash balance by sending a bank transfer. These funds can be used for payment and can eventually be paid out to your bank account. + * + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|StripeObject $available A hash of all cash balances available to this customer. You cannot delete a customer with any cash balances, even if the balance is 0. Amounts are represented in the smallest currency unit. + * @property string $customer The ID of the customer whose cash balance this object represents. + * @property null|string $customer_account The ID of an Account representing a customer whose cash balance this object represents. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property (object{reconciliation_mode: string, using_merchant_default: bool}&StripeObject) $settings + */ +class CashBalance extends ApiResource +{ + const OBJECT_NAME = 'cash_balance'; + + /** + * @return string the API URL for this balance transaction + */ + public function instanceUrl() + { + $customer = $this['customer']; + $customer = Util\Util::utf8($customer); + + $base = Customer::classUrl(); + $customerExtn = \urlencode($customer); + + return "{$base}/{$customerExtn}/cash_balance"; + } + + /** + * @param array|string $_id + * @param null|array|string $_opts + * + * @throws Exception\BadMethodCallException + */ + public static function retrieve($_id, $_opts = null) + { + $msg = 'Customer Cash Balance cannot be retrieved without a ' + . 'customer ID. Retrieve a Customer Cash Balance using ' + . "`Customer::retrieveCashBalance('customer_id')`."; + + throw new Exception\BadMethodCallException($msg); + } + + /** + * @param string $_id + * @param null|array $_params + * @param null|array|string $_options + * + * @throws Exception\BadMethodCallException + */ + public static function update($_id, $_params = null, $_options = null) + { + $msg = 'Customer Cash Balance cannot be updated without a ' + . 'customer ID. Retrieve a Customer Cash Balance using ' + . "`Customer::updateCashBalance('customer_id')`."; + + throw new Exception\BadMethodCallException($msg); + } +} diff --git a/stripe-php/lib/Charge.php b/stripe-php/lib/Charge.php new file mode 100644 index 0000000..0d86342 --- /dev/null +++ b/stripe-php/lib/Charge.php @@ -0,0 +1,276 @@ +Charge object represents a single attempt to move money into your Stripe account. + * PaymentIntent confirmation is the most common way to create Charges, but Account Debits may also create Charges. + * Some legacy payment flows create Charges directly, which is not recommended for new integrations. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount intended to be collected by this payment. A positive integer representing how much to charge in the smallest currency unit (e.g., 100 cents to charge $1.00 or 100 to charge ¥100, a zero-decimal currency). The minimum amount is $0.50 US or equivalent in charge currency. The amount value supports up to eight digits (e.g., a value of 99999999 for a USD charge of $999,999.99). + * @property int $amount_captured Amount in cents (or local equivalent) captured (can be less than the amount attribute on the charge if a partial capture was made). + * @property int $amount_refunded Amount in cents (or local equivalent) refunded (can be less than the amount attribute on the charge if a partial refund was issued). + * @property null|Application|string $application ID of the Connect application that created the charge. + * @property null|ApplicationFee|string $application_fee The application fee (if any) for the charge. See the Connect documentation for details. + * @property null|int $application_fee_amount The amount of the application fee (if any) requested for the charge. See the Connect documentation for details. + * @property null|string $authorization_code Authorization code on the charge. + * @property null|BalanceTransaction|string $balance_transaction ID of the balance transaction that describes the impact of this charge on your account balance (not including refunds or disputes). + * @property (object{address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, phone: null|string, tax_id: null|string}&StripeObject) $billing_details + * @property null|string $calculated_statement_descriptor The full statement descriptor that is passed to card networks, and that is displayed on your customers' credit card and bank statements. Allows you to see what the statement descriptor looks like after the static and dynamic portions are combined. This value only exists for card payments. + * @property bool $captured If the charge was created without capturing, this Boolean represents whether it is still uncaptured or has since been captured. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|Customer|string $customer ID of the customer this charge is for if one exists. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property bool $disputed Whether the charge has been disputed. + * @property null|BalanceTransaction|string $failure_balance_transaction ID of the balance transaction that describes the reversal of the balance on your account due to payment failure. + * @property null|string $failure_code Error code explaining reason for charge failure if available (see the errors section for a list of codes). + * @property null|string $failure_message Message to user further explaining reason for charge failure if available. + * @property null|(object{stripe_report?: string, user_report?: string}&StripeObject) $fraud_details Information on fraud assessments for the charge. + * @property null|(object{customer_reference?: string, line_items: ((object{discount_amount: null|int, product_code: string, product_description: string, quantity: null|int, tax_amount: null|int, unit_cost: null|int}&StripeObject))[], merchant_reference: string, shipping_address_zip?: string, shipping_amount?: int, shipping_from_zip?: string}&StripeObject) $level3 + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|Account|string $on_behalf_of The account (if any) the charge was made on behalf of without triggering an automatic transfer. See the Connect documentation for details. + * @property null|(object{advice_code: null|string, network_advice_code: null|string, network_decline_code: null|string, network_status: null|string, reason: null|string, risk_level?: string, risk_score?: int, rule?: (object{action: string, id: string, predicate: string}&StripeObject)|string, seller_message: null|string, type: string}&StripeObject) $outcome Details about whether the payment was accepted, and why. See understanding declines for details. + * @property bool $paid true if the charge succeeded, or was successfully authorized for later capture. + * @property null|PaymentIntent|string $payment_intent ID of the PaymentIntent associated with this charge, if one exists. + * @property null|string $payment_method ID of the payment method used in this charge. + * @property null|(object{ach_credit_transfer?: (object{account_number: null|string, bank_name: null|string, routing_number: null|string, swift_code: null|string}&StripeObject), ach_debit?: (object{account_holder_type: null|string, bank_name: null|string, country: null|string, fingerprint: null|string, last4: null|string, routing_number: null|string}&StripeObject), acss_debit?: (object{bank_name: null|string, expected_debit_date?: string, fingerprint: null|string, institution_number: null|string, last4: null|string, mandate?: string, transit_number: null|string}&StripeObject), affirm?: (object{location?: string, reader?: string, transaction_id: null|string}&StripeObject), afterpay_clearpay?: (object{order_id: null|string, reference: null|string}&StripeObject), alipay?: (object{buyer_id?: string, fingerprint: null|string, transaction_id: null|string}&StripeObject), alma?: (object{installments?: (object{count: int}&StripeObject), transaction_id: null|string}&StripeObject), amazon_pay?: (object{funding?: (object{card?: (object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, funding: null|string, last4: null|string}&StripeObject), type: null|string}&StripeObject), transaction_id: null|string}&StripeObject), au_becs_debit?: (object{bsb_number: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate?: string}&StripeObject), bacs_debit?: (object{expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate: null|string, sort_code: null|string}&StripeObject), bancontact?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), billie?: (object{transaction_id: null|string}&StripeObject), blik?: (object{buyer_id: null|string}&StripeObject), boleto?: (object{tax_id: string}&StripeObject), card?: (object{amount_authorized: null|int, authorization_code: null|string, brand: null|string, capture_before?: int, checks: null|(object{address_line1_check: null|string, address_postal_code_check: null|string, cvc_check: null|string}&StripeObject), country: null|string, description?: null|string, exp_month: int, exp_year: int, extended_authorization?: (object{status: string}&StripeObject), fingerprint?: null|string, funding: null|string, iin?: null|string, incremental_authorization?: (object{status: string}&StripeObject), installments: null|(object{plan: null|(object{count: null|int, interval: null|string, type: string}&StripeObject)}&StripeObject), issuer?: null|string, last4: null|string, mandate: null|string, moto?: null|bool, multicapture?: (object{status: string}&StripeObject), network: null|string, network_token?: null|(object{used: bool}&StripeObject), network_transaction_id: null|string, overcapture?: (object{maximum_amount_capturable: int, status: string}&StripeObject), regulated_status: null|string, three_d_secure: null|(object{authentication_flow: null|string, electronic_commerce_indicator: null|string, exemption_indicator: null|string, exemption_indicator_applied?: bool, result: null|string, result_reason: null|string, transaction_id: null|string, version: null|string}&StripeObject), wallet: null|(object{amex_express_checkout?: (object{}&StripeObject), apple_pay?: (object{}&StripeObject), dynamic_last4: null|string, google_pay?: (object{}&StripeObject), link?: (object{}&StripeObject), masterpass?: (object{billing_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject), samsung_pay?: (object{}&StripeObject), type: string, visa_checkout?: (object{billing_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject)}&StripeObject)}&StripeObject), card_present?: (object{amount_authorized: null|int, brand: null|string, brand_product: null|string, capture_before?: int, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, incremental_authorization_supported: bool, issuer?: null|string, last4: null|string, network: null|string, network_transaction_id: null|string, offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), overcapture_supported: bool, preferred_locales: null|string[], read_method: null|string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject), wallet?: (object{type: string}&StripeObject)}&StripeObject), cashapp?: (object{buyer_id: null|string, cashtag: null|string, transaction_id: null|string}&StripeObject), crypto?: (object{buyer_address?: string, network?: string, token_currency?: string, transaction_hash?: string}&StripeObject), customer_balance?: (object{}&StripeObject), eps?: (object{bank: null|string, verified_name: null|string}&StripeObject), fpx?: (object{account_holder_type: null|string, bank: string, transaction_id: null|string}&StripeObject), giropay?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, verified_name: null|string}&StripeObject), grabpay?: (object{transaction_id: null|string}&StripeObject), ideal?: (object{bank: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, transaction_id: null|string, verified_name: null|string}&StripeObject), interac_present?: (object{brand: null|string, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, issuer?: null|string, last4: null|string, network: null|string, network_transaction_id: null|string, preferred_locales: null|string[], read_method: null|string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject)}&StripeObject), kakao_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), klarna?: (object{payer_details: null|(object{address: null|(object{country: null|string}&StripeObject)}&StripeObject), payment_method_category: null|string, preferred_locale: null|string}&StripeObject), konbini?: (object{store: null|(object{chain: null|string}&StripeObject)}&StripeObject), kr_card?: (object{brand: null|string, buyer_id: null|string, last4: null|string, transaction_id: null|string}&StripeObject), link?: (object{country: null|string}&StripeObject), mb_way?: (object{}&StripeObject), mobilepay?: (object{card: null|(object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, last4: null|string}&StripeObject)}&StripeObject), multibanco?: (object{entity: null|string, reference: null|string}&StripeObject), naver_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), nz_bank_account?: (object{account_holder_name: null|string, bank_code: string, bank_name: string, branch_code: string, expected_debit_date?: string, last4: string, suffix: null|string}&StripeObject), oxxo?: (object{number: null|string}&StripeObject), p24?: (object{bank: null|string, reference: null|string, verified_name: null|string}&StripeObject), pay_by_bank?: (object{}&StripeObject), payco?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), paynow?: (object{location?: string, reader?: string, reference: null|string}&StripeObject), paypal?: (object{country: null|string, payer_email: null|string, payer_id: null|string, payer_name: null|string, seller_protection: null|(object{dispute_categories: null|string[], status: string}&StripeObject), transaction_id: null|string}&StripeObject), payto?: (object{bsb_number: null|string, last4: null|string, mandate?: string, pay_id: null|string}&StripeObject), pix?: (object{bank_transaction_id?: null|string}&StripeObject), promptpay?: (object{reference: null|string}&StripeObject), revolut_pay?: (object{funding?: (object{card?: (object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, funding: null|string, last4: null|string}&StripeObject), type: null|string}&StripeObject), transaction_id: null|string}&StripeObject), samsung_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), satispay?: (object{transaction_id: null|string}&StripeObject), sepa_credit_transfer?: (object{bank_name: null|string, bic: null|string, iban: null|string}&StripeObject), sepa_debit?: (object{bank_code: null|string, branch_code: null|string, country: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate: null|string}&StripeObject), sofort?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, country: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), stripe_account?: (object{}&StripeObject), swish?: (object{fingerprint: null|string, payment_reference: null|string, verified_phone_last4: null|string}&StripeObject), twint?: (object{}&StripeObject), type: string, us_bank_account?: (object{account_holder_type: null|string, account_type: null|string, bank_name: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate?: Mandate|string, payment_reference: null|string, routing_number: null|string}&StripeObject), wechat?: (object{}&StripeObject), wechat_pay?: (object{fingerprint: null|string, location?: string, reader?: string, transaction_id: null|string}&StripeObject), zip?: (object{}&StripeObject)}&StripeObject) $payment_method_details Details about the payment method at the time of the transaction. + * @property null|(object{presentment_amount: int, presentment_currency: string}&StripeObject) $presentment_details + * @property null|(object{session?: string}&StripeObject) $radar_options Options to configure Radar. See Radar Session for more information. + * @property null|string $receipt_email This is the email address that the receipt for this charge was sent to. + * @property null|string $receipt_number This is the transaction number that appears on email receipts sent for this charge. This attribute will be null until a receipt has been sent. + * @property null|string $receipt_url This is the URL to view the receipt for this charge. The receipt is kept up-to-date to the latest state of the charge, including any refunds. If the charge is for an Invoice, the receipt will be stylized as an Invoice receipt. + * @property bool $refunded Whether the charge has been fully refunded. If the charge is only partially refunded, this attribute will still be false. + * @property null|Collection $refunds A list of refunds that have been applied to the charge. + * @property null|Review|string $review ID of the review associated with this charge if one exists. + * @property null|(object{address?: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), carrier?: null|string, name?: string, phone?: null|string, tracking_number?: null|string}&StripeObject) $shipping Shipping information for the charge. + * @property null|Account|BankAccount|Card|Source $source This is a legacy field that will be removed in the future. It contains the Source, Card, or BankAccount object used for the charge. For details about the payment method used for this charge, refer to payment_method or payment_method_details instead. + * @property null|string|Transfer $source_transfer The transfer ID which created this charge. Only present if the charge came from another Stripe account. See the Connect documentation for details. + * @property null|string $statement_descriptor

For a non-card charge, text that appears on the customer's statement as the statement descriptor. This value overrides the account's default statement descriptor. For information about requirements, including the 22-character limit, see the Statement Descriptor docs.

For a card charge, this value is ignored unless you don't specify a statement_descriptor_suffix, in which case this value is used as the suffix.

+ * @property null|string $statement_descriptor_suffix Provides information about a card charge. Concatenated to the account's statement descriptor prefix to form the complete statement descriptor that appears on the customer's statement. If the account has no prefix value, the suffix is concatenated to the account's statement descriptor. + * @property string $status The status of the payment is either succeeded, pending, or failed. + * @property null|string|Transfer $transfer ID of the transfer to the destination account (only applicable if the charge was created using the destination parameter). + * @property null|(object{amount: null|int, destination: Account|string}&StripeObject) $transfer_data An optional dictionary including the account to automatically transfer to as part of a destination charge. See the Connect documentation for details. + * @property null|string $transfer_group A string that identifies this transaction as part of a group. See the Connect documentation for details. + */ +class Charge extends ApiResource +{ + const OBJECT_NAME = 'charge'; + + use ApiOperations\NestedResource; + use ApiOperations\Update; + + const STATUS_FAILED = 'failed'; + const STATUS_PENDING = 'pending'; + const STATUS_SUCCEEDED = 'succeeded'; + + /** + * This method is no longer recommended—use the Payment Intents API to initiate a new + * payment instead. Confirmation of the PaymentIntent creates the + * Charge object used to request payment. + * + * @param null|array{amount?: int, application_fee?: int, application_fee_amount?: int, capture?: bool, currency?: string, customer?: string, description?: string, destination?: array{account: string, amount?: int}, expand?: string[], metadata?: null|array, on_behalf_of?: string, radar_options?: array{session?: string}, receipt_email?: string, shipping?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, source?: string, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, destination: string}, transfer_group?: string} $params + * @param null|array|string $options + * + * @return Charge the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of charges you’ve previously created. The charges are returned in + * sorted order, with the most recent charges appearing first. + * + * @param null|array{created?: array|int, customer?: string, ending_before?: string, expand?: string[], limit?: int, payment_intent?: string, starting_after?: string, transfer_group?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the details of a charge that has previously been created. Supply the + * unique charge ID that was returned from your previous request, and Stripe will + * return the corresponding charge information. The same information is returned + * when creating or refunding the charge. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Charge + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the specified charge by setting the values of the parameters passed. Any + * parameters not provided will be left unchanged. + * + * @param string $id the ID of the resource to update + * @param null|array{customer?: string, description?: string, expand?: string[], fraud_details?: array{user_report: null|string}, metadata?: null|array, receipt_email?: string, shipping?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, transfer_group?: string} $params + * @param null|array|string $opts + * + * @return Charge the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Possible string representations of decline codes. + * These strings are applicable to the decline_code property of the \Stripe\Exception\CardException exception. + * + * @see https://stripe.com/docs/declines/codes + */ + const DECLINED_AUTHENTICATION_REQUIRED = 'authentication_required'; + const DECLINED_APPROVE_WITH_ID = 'approve_with_id'; + const DECLINED_CALL_ISSUER = 'call_issuer'; + const DECLINED_CARD_NOT_SUPPORTED = 'card_not_supported'; + const DECLINED_CARD_VELOCITY_EXCEEDED = 'card_velocity_exceeded'; + const DECLINED_CURRENCY_NOT_SUPPORTED = 'currency_not_supported'; + const DECLINED_DO_NOT_HONOR = 'do_not_honor'; + const DECLINED_DO_NOT_TRY_AGAIN = 'do_not_try_again'; + const DECLINED_DUPLICATED_TRANSACTION = 'duplicate_transaction'; + const DECLINED_EXPIRED_CARD = 'expired_card'; + const DECLINED_FRAUDULENT = 'fraudulent'; + const DECLINED_GENERIC_DECLINE = 'generic_decline'; + const DECLINED_INCORRECT_NUMBER = 'incorrect_number'; + const DECLINED_INCORRECT_CVC = 'incorrect_cvc'; + const DECLINED_INCORRECT_PIN = 'incorrect_pin'; + const DECLINED_INCORRECT_ZIP = 'incorrect_zip'; + const DECLINED_INSUFFICIENT_FUNDS = 'insufficient_funds'; + const DECLINED_INVALID_ACCOUNT = 'invalid_account'; + const DECLINED_INVALID_AMOUNT = 'invalid_amount'; + const DECLINED_INVALID_CVC = 'invalid_cvc'; + const DECLINED_INVALID_EXPIRY_YEAR = 'invalid_expiry_year'; + const DECLINED_INVALID_NUMBER = 'invalid_number'; + const DECLINED_INVALID_PIN = 'invalid_pin'; + const DECLINED_ISSUER_NOT_AVAILABLE = 'issuer_not_available'; + const DECLINED_LOST_CARD = 'lost_card'; + const DECLINED_MERCHANT_BLACKLIST = 'merchant_blacklist'; + const DECLINED_NEW_ACCOUNT_INFORMATION_AVAILABLE = 'new_account_information_available'; + const DECLINED_NO_ACTION_TAKEN = 'no_action_taken'; + const DECLINED_NOT_PERMITTED = 'not_permitted'; + const DECLINED_OFFLINE_PIN_REQUIRED = 'offline_pin_required'; + const DECLINED_ONLINE_OR_OFFLINE_PIN_REQUIRED = 'online_or_offline_pin_required'; + const DECLINED_PICKUP_CARD = 'pickup_card'; + const DECLINED_PIN_TRY_EXCEEDED = 'pin_try_exceeded'; + const DECLINED_PROCESSING_ERROR = 'processing_error'; + const DECLINED_REENTER_TRANSACTION = 'reenter_transaction'; + const DECLINED_RESTRICTED_CARD = 'restricted_card'; + const DECLINED_REVOCATION_OF_ALL_AUTHORIZATIONS = 'revocation_of_all_authorizations'; + const DECLINED_REVOCATION_OF_AUTHORIZATION = 'revocation_of_authorization'; + const DECLINED_SECURITY_VIOLATION = 'security_violation'; + const DECLINED_SERVICE_NOT_ALLOWED = 'service_not_allowed'; + const DECLINED_STOLEN_CARD = 'stolen_card'; + const DECLINED_STOP_PAYMENT_ORDER = 'stop_payment_order'; + const DECLINED_TESTMODE_DECLINE = 'testmode_decline'; + const DECLINED_TRANSACTION_NOT_ALLOWED = 'transaction_not_allowed'; + const DECLINED_TRY_AGAIN_LATER = 'try_again_later'; + const DECLINED_WITHDRAWAL_COUNT_LIMIT_EXCEEDED = 'withdrawal_count_limit_exceeded'; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Charge the captured charge + * + * @throws Exception\ApiErrorException if the request fails + */ + public function capture($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/capture'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return SearchResult the charge search results + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function search($params = null, $opts = null) + { + $url = '/v1/charges/search'; + + return static::_requestPage($url, SearchResult::class, $params, $opts); + } + + const PATH_REFUNDS = '/refunds'; + + /** + * @param string $id the ID of the charge on which to retrieve the refunds + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection the list of refunds + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allRefunds($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_REFUNDS, $params, $opts); + } + + /** + * @param string $id the ID of the charge to which the refund belongs + * @param string $refundId the ID of the refund to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @return Refund + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieveRefund($id, $refundId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_REFUNDS, $refundId, $params, $opts); + } +} diff --git a/stripe-php/lib/Checkout/Session.php b/stripe-php/lib/Checkout/Session.php new file mode 100644 index 0000000..b70ef16 --- /dev/null +++ b/stripe-php/lib/Checkout/Session.php @@ -0,0 +1,253 @@ +Checkout + * or Payment Links. We recommend creating a + * new Session each time your customer attempts to pay. + * + * Once payment is successful, the Checkout Session will contain a reference + * to the Customer, and either the successful + * PaymentIntent or an active + * Subscription. + * + * You can create a Checkout Session on your server and redirect to its URL + * to begin Checkout. + * + * Related guide: Checkout quickstart + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|(object{enabled: bool}&\Stripe\StripeObject) $adaptive_pricing Settings for price localization with Adaptive Pricing. + * @property null|(object{recovery: null|(object{allow_promotion_codes: bool, enabled: bool, expires_at: null|int, url: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $after_expiration When set, provides configuration for actions to take if this Checkout Session expires. + * @property null|bool $allow_promotion_codes Enables user redeemable promotion codes. + * @property null|int $amount_subtotal Total of all items before discounts or taxes are applied. + * @property null|int $amount_total Total of all items after discounts and taxes are applied. + * @property (object{enabled: bool, liability: null|(object{account?: string|\Stripe\Account, type: string}&\Stripe\StripeObject), provider: null|string, status: null|string}&\Stripe\StripeObject) $automatic_tax + * @property null|string $billing_address_collection Describes whether Checkout should collect the customer's billing address. Defaults to auto. + * @property null|(object{background_color: string, border_style: string, button_color: string, display_name: string, font_family: string, icon: null|(object{file?: string, type: string, url?: string}&\Stripe\StripeObject), logo: null|(object{file?: string, type: string, url?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $branding_settings + * @property null|string $cancel_url If set, Checkout displays a back button and customers will be directed to this URL if they decide to cancel payment and return to your website. + * @property null|string $client_reference_id A unique string to reference the Checkout Session. This can be a customer ID, a cart ID, or similar, and can be used to reconcile the Session with your internal systems. + * @property null|string $client_secret The client secret of your Checkout Session. Applies to Checkout Sessions with ui_mode: embedded or ui_mode: custom. For ui_mode: embedded, the client secret is to be used when initializing Stripe.js embedded checkout. For ui_mode: custom, use the client secret with initCheckout on your front end. + * @property null|(object{business_name: null|string, individual_name: null|string, shipping_details: null|(object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), name: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $collected_information Information about the customer collected within the Checkout Session. + * @property null|(object{promotions: null|string, terms_of_service: null|string}&\Stripe\StripeObject) $consent Results of consent_collection for this session. + * @property null|(object{payment_method_reuse_agreement: null|(object{position: string}&\Stripe\StripeObject), promotions: null|string, terms_of_service: null|string}&\Stripe\StripeObject) $consent_collection When set, provides configuration for the Checkout Session to gather active consent from customers. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|(object{amount_subtotal: int, amount_total: int, fx_rate: string, source_currency: string}&\Stripe\StripeObject) $currency_conversion Currency conversion details for Adaptive Pricing sessions created before 2025-03-31. + * @property ((object{dropdown?: (object{default_value: null|string, options: (object{label: string, value: string}&\Stripe\StripeObject)[], value: null|string}&\Stripe\StripeObject), key: string, label: (object{custom: null|string, type: string}&\Stripe\StripeObject), numeric?: (object{default_value: null|string, maximum_length: null|int, minimum_length: null|int, value: null|string}&\Stripe\StripeObject), optional: bool, text?: (object{default_value: null|string, maximum_length: null|int, minimum_length: null|int, value: null|string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject))[] $custom_fields Collect additional information from your customer using custom fields. Up to 3 fields are supported. + * @property (object{after_submit: null|(object{message: string}&\Stripe\StripeObject), shipping_address: null|(object{message: string}&\Stripe\StripeObject), submit: null|(object{message: string}&\Stripe\StripeObject), terms_of_service_acceptance: null|(object{message: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $custom_text + * @property null|string|\Stripe\Customer $customer The ID of the customer for this Session. For Checkout Sessions in subscription mode or Checkout Sessions with customer_creation set as always in payment mode, Checkout will create a new customer object based on information provided during the payment flow unless an existing customer was provided when the Session was created. + * @property null|string $customer_account The ID of the account for this Session. + * @property null|string $customer_creation Configure whether a Checkout Session creates a Customer when the Checkout Session completes. + * @property null|(object{address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), business_name: null|string, email: null|string, individual_name: null|string, name: null|string, phone: null|string, tax_exempt: null|string, tax_ids: null|((object{type: string, value: null|string}&\Stripe\StripeObject))[]}&\Stripe\StripeObject) $customer_details The customer details including the customer's tax exempt status and the customer's tax IDs. Customer's address details are not present on Sessions in setup mode. + * @property null|string $customer_email If provided, this value will be used when the Customer object is created. If not provided, customers will be asked to enter their email address. Use this parameter to prefill customer data if you already have an email on file. To access information about the customer once the payment flow is complete, use the customer attribute. + * @property null|((object{coupon: null|string|\Stripe\Coupon, promotion_code: null|string|\Stripe\PromotionCode}&\Stripe\StripeObject))[] $discounts List of coupons and promotion codes attached to the Checkout Session. + * @property null|string[] $excluded_payment_method_types A list of the types of payment methods (e.g., card) that should be excluded from this Checkout Session. This should only be used when payment methods for this Checkout Session are managed through the Stripe Dashboard. + * @property int $expires_at The timestamp at which the Checkout Session will expire. + * @property null|string|\Stripe\Invoice $invoice ID of the invoice created by the Checkout Session, if it exists. + * @property null|(object{enabled: bool, invoice_data: (object{account_tax_ids: null|(string|\Stripe\TaxId)[], custom_fields: null|(object{name: string, value: string}&\Stripe\StripeObject)[], description: null|string, footer: null|string, issuer: null|(object{account?: string|\Stripe\Account, type: string}&\Stripe\StripeObject), metadata: null|\Stripe\StripeObject, rendering_options: null|(object{amount_tax_display: null|string, template: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject) $invoice_creation Details on the state of invoice creation for the Checkout Session. + * @property null|\Stripe\Collection<\Stripe\LineItem> $line_items The line items purchased by the customer. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string $locale The IETF language tag of the locale Checkout is displayed in. If blank or auto, the browser's locale is used. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $mode The mode of the Checkout Session. + * @property null|(object{business?: (object{enabled: bool, optional: bool}&\Stripe\StripeObject), individual?: (object{enabled: bool, optional: bool}&\Stripe\StripeObject)}&\Stripe\StripeObject) $name_collection + * @property null|((object{adjustable_quantity: null|(object{enabled: bool, maximum: null|int, minimum: null|int}&\Stripe\StripeObject), price: string, quantity: int}&\Stripe\StripeObject))[] $optional_items The optional items presented to the customer at checkout. + * @property null|string $origin_context Where the user is coming from. This informs the optimizations that are applied to the session. + * @property null|string|\Stripe\PaymentIntent $payment_intent The ID of the PaymentIntent for Checkout Sessions in payment mode. You can't confirm or cancel the PaymentIntent for a Checkout Session. To cancel, expire the Checkout Session instead. + * @property null|string|\Stripe\PaymentLink $payment_link The ID of the Payment Link that created this Session. + * @property null|string $payment_method_collection Configure whether a Checkout Session should collect a payment method. Defaults to always. + * @property null|(object{id: string, parent: null|string}&\Stripe\StripeObject) $payment_method_configuration_details Information about the payment method configuration used for this Checkout session if using dynamic payment methods. + * @property null|(object{acss_debit?: (object{currency?: string, mandate_options?: (object{custom_mandate_url?: string, default_for?: string[], interval_description: null|string, payment_schedule: null|string, transaction_type: null|string}&\Stripe\StripeObject), setup_future_usage?: string, target_date?: string, verification_method?: string}&\Stripe\StripeObject), affirm?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), afterpay_clearpay?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), alipay?: (object{setup_future_usage?: string}&\Stripe\StripeObject), alma?: (object{capture_method?: string}&\Stripe\StripeObject), amazon_pay?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), au_becs_debit?: (object{setup_future_usage?: string, target_date?: string}&\Stripe\StripeObject), bacs_debit?: (object{mandate_options?: (object{reference_prefix?: string}&\Stripe\StripeObject), setup_future_usage?: string, target_date?: string}&\Stripe\StripeObject), bancontact?: (object{setup_future_usage?: string}&\Stripe\StripeObject), billie?: (object{capture_method?: string}&\Stripe\StripeObject), boleto?: (object{expires_after_days: int, setup_future_usage?: string}&\Stripe\StripeObject), card?: (object{capture_method?: string, installments?: (object{enabled?: bool}&\Stripe\StripeObject), request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure: string, restrictions?: (object{brands_blocked?: string[]}&\Stripe\StripeObject), setup_future_usage?: string, statement_descriptor_suffix_kana?: string, statement_descriptor_suffix_kanji?: string}&\Stripe\StripeObject), cashapp?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), customer_balance?: (object{bank_transfer?: (object{eu_bank_transfer?: (object{country: string}&\Stripe\StripeObject), requested_address_types?: string[], type: null|string}&\Stripe\StripeObject), funding_type: null|string, setup_future_usage?: string}&\Stripe\StripeObject), eps?: (object{setup_future_usage?: string}&\Stripe\StripeObject), fpx?: (object{setup_future_usage?: string}&\Stripe\StripeObject), giropay?: (object{setup_future_usage?: string}&\Stripe\StripeObject), grabpay?: (object{setup_future_usage?: string}&\Stripe\StripeObject), ideal?: (object{setup_future_usage?: string}&\Stripe\StripeObject), kakao_pay?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), klarna?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), konbini?: (object{expires_after_days: null|int, setup_future_usage?: string}&\Stripe\StripeObject), kr_card?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), link?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), mobilepay?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), multibanco?: (object{setup_future_usage?: string}&\Stripe\StripeObject), naver_pay?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), oxxo?: (object{expires_after_days: int, setup_future_usage?: string}&\Stripe\StripeObject), p24?: (object{setup_future_usage?: string}&\Stripe\StripeObject), payco?: (object{capture_method?: string}&\Stripe\StripeObject), paynow?: (object{setup_future_usage?: string}&\Stripe\StripeObject), paypal?: (object{capture_method?: string, preferred_locale: null|string, reference: null|string, setup_future_usage?: string}&\Stripe\StripeObject), payto?: (object{mandate_options?: (object{amount: null|int, amount_type: null|string, end_date: null|string, payment_schedule: null|string, payments_per_period: null|int, purpose: null|string, start_date: null|string}&\Stripe\StripeObject), setup_future_usage?: string}&\Stripe\StripeObject), pix?: (object{amount_includes_iof?: string, expires_after_seconds: null|int, setup_future_usage?: string}&\Stripe\StripeObject), revolut_pay?: (object{capture_method?: string, setup_future_usage?: string}&\Stripe\StripeObject), samsung_pay?: (object{capture_method?: string}&\Stripe\StripeObject), satispay?: (object{capture_method?: string}&\Stripe\StripeObject), sepa_debit?: (object{mandate_options?: (object{reference_prefix?: string}&\Stripe\StripeObject), setup_future_usage?: string, target_date?: string}&\Stripe\StripeObject), sofort?: (object{setup_future_usage?: string}&\Stripe\StripeObject), swish?: (object{reference: null|string}&\Stripe\StripeObject), twint?: (object{setup_future_usage?: string}&\Stripe\StripeObject), us_bank_account?: (object{financial_connections?: (object{filters?: (object{account_subcategories?: string[]}&\Stripe\StripeObject), permissions?: string[], prefetch: null|string[], return_url?: string}&\Stripe\StripeObject), setup_future_usage?: string, target_date?: string, verification_method?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $payment_method_options Payment-method-specific configuration for the PaymentIntent or SetupIntent of this CheckoutSession. + * @property string[] $payment_method_types A list of the types of payment methods (e.g. card) this Checkout Session is allowed to accept. + * @property string $payment_status The payment status of the Checkout Session, one of paid, unpaid, or no_payment_required. You can use this value to decide when to fulfill your customer's order. + * @property null|(object{update_shipping_details: null|string}&\Stripe\StripeObject) $permissions

This property is used to set up permissions for various actions (e.g., update) on the CheckoutSession object.

For specific permissions, please refer to their dedicated subsections, such as permissions.update_shipping_details.

+ * @property null|(object{enabled: bool}&\Stripe\StripeObject) $phone_number_collection + * @property null|(object{presentment_amount: int, presentment_currency: string}&\Stripe\StripeObject) $presentment_details + * @property null|string $recovered_from The ID of the original expired Checkout Session that triggered the recovery flow. + * @property null|string $redirect_on_completion This parameter applies to ui_mode: embedded. Learn more about the redirect behavior of embedded sessions. Defaults to always. + * @property null|string $return_url Applies to Checkout Sessions with ui_mode: embedded or ui_mode: custom. The URL to redirect your customer back to after they authenticate or cancel their payment on the payment method's app or site. + * @property null|(object{allow_redisplay_filters: null|string[], payment_method_remove: null|string, payment_method_save: null|string}&\Stripe\StripeObject) $saved_payment_method_options Controls saved payment method settings for the session. Only available in payment and subscription mode. + * @property null|string|\Stripe\SetupIntent $setup_intent The ID of the SetupIntent for Checkout Sessions in setup mode. You can't confirm or cancel the SetupIntent for a Checkout Session. To cancel, expire the Checkout Session instead. + * @property null|(object{allowed_countries: string[]}&\Stripe\StripeObject) $shipping_address_collection When set, provides configuration for Checkout to collect a shipping address from a customer. + * @property null|(object{amount_subtotal: int, amount_tax: int, amount_total: int, shipping_rate: null|string|\Stripe\ShippingRate, taxes?: ((object{amount: int, rate: \Stripe\TaxRate, taxability_reason: null|string, taxable_amount: null|int}&\Stripe\StripeObject))[]}&\Stripe\StripeObject) $shipping_cost The details of the customer cost of shipping, including the customer chosen ShippingRate. + * @property ((object{shipping_amount: int, shipping_rate: string|\Stripe\ShippingRate}&\Stripe\StripeObject))[] $shipping_options The shipping rate options applied to this Session. + * @property null|string $status The status of the Checkout Session, one of open, complete, or expired. + * @property null|string $submit_type Describes the type of transaction being performed by Checkout in order to customize relevant text on the page, such as the submit button. submit_type can only be specified on Checkout Sessions in payment mode. If blank or auto, pay is used. + * @property null|string|\Stripe\Subscription $subscription The ID of the Subscription for Checkout Sessions in subscription mode. + * @property null|string $success_url The URL the customer will be directed to after the payment or subscription creation is successful. + * @property null|(object{enabled: bool, required: string}&\Stripe\StripeObject) $tax_id_collection + * @property null|(object{amount_discount: int, amount_shipping: null|int, amount_tax: int, breakdown?: (object{discounts: (object{amount: int, discount: \Stripe\Discount}&\Stripe\StripeObject)[], taxes: ((object{amount: int, rate: \Stripe\TaxRate, taxability_reason: null|string, taxable_amount: null|int}&\Stripe\StripeObject))[]}&\Stripe\StripeObject)}&\Stripe\StripeObject) $total_details Tax and discount details for the computed total amount. + * @property null|string $ui_mode The UI mode of the Session. Defaults to hosted. + * @property null|string $url The URL to the Checkout Session. Applies to Checkout Sessions with ui_mode: hosted. Redirect customers to this URL to take them to Checkout. If you’re using Custom Domains, the URL will use your subdomain. Otherwise, it’ll use checkout.stripe.com. This value is only present when the session is active. + * @property null|(object{link?: (object{display?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $wallet_options Wallet-specific configuration for this Checkout Session. + */ +class Session extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'checkout.session'; + + use \Stripe\ApiOperations\Update; + + const BILLING_ADDRESS_COLLECTION_AUTO = 'auto'; + const BILLING_ADDRESS_COLLECTION_REQUIRED = 'required'; + + const CUSTOMER_CREATION_ALWAYS = 'always'; + const CUSTOMER_CREATION_IF_REQUIRED = 'if_required'; + + const MODE_PAYMENT = 'payment'; + const MODE_SETUP = 'setup'; + const MODE_SUBSCRIPTION = 'subscription'; + + const ORIGIN_CONTEXT_MOBILE_APP = 'mobile_app'; + const ORIGIN_CONTEXT_WEB = 'web'; + + const PAYMENT_METHOD_COLLECTION_ALWAYS = 'always'; + const PAYMENT_METHOD_COLLECTION_IF_REQUIRED = 'if_required'; + + const PAYMENT_STATUS_NO_PAYMENT_REQUIRED = 'no_payment_required'; + const PAYMENT_STATUS_PAID = 'paid'; + const PAYMENT_STATUS_UNPAID = 'unpaid'; + + const REDIRECT_ON_COMPLETION_ALWAYS = 'always'; + const REDIRECT_ON_COMPLETION_IF_REQUIRED = 'if_required'; + const REDIRECT_ON_COMPLETION_NEVER = 'never'; + + const STATUS_COMPLETE = 'complete'; + const STATUS_EXPIRED = 'expired'; + const STATUS_OPEN = 'open'; + + const SUBMIT_TYPE_AUTO = 'auto'; + const SUBMIT_TYPE_BOOK = 'book'; + const SUBMIT_TYPE_DONATE = 'donate'; + const SUBMIT_TYPE_PAY = 'pay'; + const SUBMIT_TYPE_SUBSCRIBE = 'subscribe'; + + const UI_MODE_CUSTOM = 'custom'; + const UI_MODE_EMBEDDED = 'embedded'; + const UI_MODE_HOSTED = 'hosted'; + + /** + * Creates a Checkout Session object. + * + * @param null|array{adaptive_pricing?: array{enabled?: bool}, after_expiration?: array{recovery?: array{allow_promotion_codes?: bool, enabled: bool}}, allow_promotion_codes?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_address_collection?: string, branding_settings?: array{background_color?: null|string, border_style?: null|string, button_color?: null|string, display_name?: string, font_family?: null|string, icon?: array{file?: string, type: string, url?: string}, logo?: array{file?: string, type: string, url?: string}}, cancel_url?: string, client_reference_id?: string, consent_collection?: array{payment_method_reuse_agreement?: array{position: string}, promotions?: string, terms_of_service?: string}, currency?: string, custom_fields?: array{dropdown?: array{default_value?: string, options: array{label: string, value: string}[]}, key: string, label: array{custom: string, type: string}, numeric?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, optional?: bool, text?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, type: string}[], custom_text?: array{after_submit?: null|array{message: string}, shipping_address?: null|array{message: string}, submit?: null|array{message: string}, terms_of_service_acceptance?: null|array{message: string}}, customer?: string, customer_account?: string, customer_creation?: string, customer_email?: string, customer_update?: array{address?: string, name?: string, shipping?: string}, discounts?: array{coupon?: string, promotion_code?: string}[], excluded_payment_method_types?: string[], expand?: string[], expires_at?: int, invoice_creation?: array{enabled: bool, invoice_data?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}, metadata?: array, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}}, line_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, dynamic_tax_rates?: string[], metadata?: array, price?: string, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: string[]}[], locale?: string, metadata?: array, mode?: string, name_collection?: array{business?: array{enabled: bool, optional?: bool}, individual?: array{enabled: bool, optional?: bool}}, optional_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price: string, quantity: int}[], origin_context?: string, payment_intent_data?: array{application_fee_amount?: int, capture_method?: string, description?: string, metadata?: array, on_behalf_of?: string, receipt_email?: string, setup_future_usage?: string, shipping?: array{address: array{city?: string, country?: string, line1: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, destination: string}, transfer_group?: string}, payment_method_collection?: string, payment_method_configuration?: string, payment_method_data?: array{allow_redisplay?: string}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: string, target_date?: string, verification_method?: string}, affirm?: array{capture_method?: string, setup_future_usage?: string}, afterpay_clearpay?: array{capture_method?: string, setup_future_usage?: string}, alipay?: array{setup_future_usage?: string}, alma?: array{capture_method?: string}, amazon_pay?: array{capture_method?: string, setup_future_usage?: string}, au_becs_debit?: array{setup_future_usage?: string, target_date?: string}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: string, target_date?: string}, bancontact?: array{setup_future_usage?: string}, billie?: array{capture_method?: string}, boleto?: array{expires_after_days?: int, setup_future_usage?: string}, card?: array{capture_method?: string, installments?: array{enabled?: bool}, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, restrictions?: array{brands_blocked?: string[]}, setup_future_usage?: string, statement_descriptor_suffix_kana?: string, statement_descriptor_suffix_kanji?: string}, cashapp?: array{capture_method?: string, setup_future_usage?: string}, customer_balance?: array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, demo_pay?: array{setup_future_usage?: string}, eps?: array{setup_future_usage?: string}, fpx?: array{setup_future_usage?: string}, giropay?: array{setup_future_usage?: string}, grabpay?: array{setup_future_usage?: string}, ideal?: array{setup_future_usage?: string}, kakao_pay?: array{capture_method?: string, setup_future_usage?: string}, klarna?: array{capture_method?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, konbini?: array{expires_after_days?: int, setup_future_usage?: string}, kr_card?: array{capture_method?: string, setup_future_usage?: string}, link?: array{capture_method?: string, setup_future_usage?: string}, mobilepay?: array{capture_method?: string, setup_future_usage?: string}, multibanco?: array{setup_future_usage?: string}, naver_pay?: array{capture_method?: string, setup_future_usage?: string}, oxxo?: array{expires_after_days?: int, setup_future_usage?: string}, p24?: array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: array{}, payco?: array{capture_method?: string}, paynow?: array{setup_future_usage?: string}, paypal?: array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}, setup_future_usage?: string}, pix?: array{amount_includes_iof?: string, expires_after_seconds?: int, setup_future_usage?: string}, revolut_pay?: array{capture_method?: string, setup_future_usage?: string}, samsung_pay?: array{capture_method?: string}, satispay?: array{capture_method?: string}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: string, target_date?: string}, sofort?: array{setup_future_usage?: string}, swish?: array{reference?: string}, twint?: array{setup_future_usage?: string}, us_bank_account?: array{financial_connections?: array{permissions?: string[], prefetch?: string[]}, setup_future_usage?: string, target_date?: string, verification_method?: string}, wechat_pay?: array{app_id?: string, client: string, setup_future_usage?: string}}, payment_method_types?: string[], permissions?: array{update_shipping_details?: string}, phone_number_collection?: array{enabled: bool}, redirect_on_completion?: string, return_url?: string, saved_payment_method_options?: array{allow_redisplay_filters?: string[], payment_method_remove?: string, payment_method_save?: string}, setup_intent_data?: array{description?: string, metadata?: array, on_behalf_of?: string}, shipping_address_collection?: array{allowed_countries: string[]}, shipping_options?: array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}[], submit_type?: string, subscription_data?: array{application_fee_percent?: float, billing_cycle_anchor?: int, billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, default_tax_rates?: string[], description?: string, invoice_settings?: array{issuer?: array{account?: string, type: string}}, metadata?: array, on_behalf_of?: string, proration_behavior?: string, transfer_data?: array{amount_percent?: float, destination: string}, trial_end?: int, trial_period_days?: int, trial_settings?: array{end_behavior: array{missing_payment_method: string}}}, success_url?: string, tax_id_collection?: array{enabled: bool, required?: string}, ui_mode?: string, wallet_options?: array{link?: array{display?: string}}} $params + * @param null|array|string $options + * + * @return Session the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of Checkout Sessions. + * + * @param null|array{created?: array|int, customer?: string, customer_account?: string, customer_details?: array{email: string}, ending_before?: string, expand?: string[], limit?: int, payment_intent?: string, payment_link?: string, starting_after?: string, status?: string, subscription?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a Checkout Session object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Session + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates a Checkout Session object. + * + * Related guide: Dynamically update + * Checkout + * + * @param string $id the ID of the resource to update + * @param null|array{collected_information?: array{shipping_details?: array{address: array{city?: string, country: string, line1: string, line2?: string, postal_code?: string, state?: string}, name: string}}, expand?: string[], line_items?: (array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, id?: string, metadata?: null|array, price?: string, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: null|array, shipping_options?: null|array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}[]} $params + * @param null|array|string $opts + * + * @return Session the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Session the expired session + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function expire($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/expire'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param string $id + * @param null|array $params + * @param null|array|string $opts + * + * @return \Stripe\Collection<\Stripe\LineItem> list of line items + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function allLineItems($id, $params = null, $opts = null) + { + $url = static::resourceUrl($id) . '/line_items'; + list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Climate/Order.php b/stripe-php/lib/Climate/Order.php new file mode 100644 index 0000000..ab1bf0e --- /dev/null +++ b/stripe-php/lib/Climate/Order.php @@ -0,0 +1,150 @@ +Frontier's service fees in the currency's smallest unit. + * @property int $amount_subtotal Total amount of the carbon removal in the currency's smallest unit. + * @property int $amount_total Total amount of the order including fees in the currency's smallest unit. + * @property null|(object{public_name: string}&\Stripe\StripeObject) $beneficiary + * @property null|int $canceled_at Time at which the order was canceled. Measured in seconds since the Unix epoch. + * @property null|string $cancellation_reason Reason for the cancellation of this order. + * @property null|string $certificate For delivered orders, a URL to a delivery certificate for the order. + * @property null|int $confirmed_at Time at which the order was confirmed. Measured in seconds since the Unix epoch. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase, representing the currency for this order. + * @property null|int $delayed_at Time at which the order's expected_delivery_year was delayed. Measured in seconds since the Unix epoch. + * @property null|int $delivered_at Time at which the order was delivered. Measured in seconds since the Unix epoch. + * @property ((object{delivered_at: int, location: null|(object{city: null|string, country: string, latitude: null|float, longitude: null|float, region: null|string}&\Stripe\StripeObject), metric_tons: string, registry_url: null|string, supplier: Supplier}&\Stripe\StripeObject))[] $delivery_details Details about the delivery of carbon removal for this order. + * @property int $expected_delivery_year The year this order is expected to be delivered. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $metric_tons Quantity of carbon removal that is included in this order. + * @property Product|string $product Unique ID for the Climate Product this order is purchasing. + * @property null|int $product_substituted_at Time at which the order's product was substituted for a different product. Measured in seconds since the Unix epoch. + * @property string $status The current status of this order. + */ +class Order extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'climate.order'; + + use \Stripe\ApiOperations\Update; + + const CANCELLATION_REASON_EXPIRED = 'expired'; + const CANCELLATION_REASON_PRODUCT_UNAVAILABLE = 'product_unavailable'; + const CANCELLATION_REASON_REQUESTED = 'requested'; + + const STATUS_AWAITING_FUNDS = 'awaiting_funds'; + const STATUS_CANCELED = 'canceled'; + const STATUS_CONFIRMED = 'confirmed'; + const STATUS_DELIVERED = 'delivered'; + const STATUS_OPEN = 'open'; + + /** + * Creates a Climate order object for a given Climate product. The order will be + * processed immediately after creation and payment will be deducted your Stripe + * balance. + * + * @param null|array{amount?: int, beneficiary?: array{public_name: string}, currency?: string, expand?: string[], metadata?: array, metric_tons?: string, product: string} $params + * @param null|array|string $options + * + * @return Order the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Lists all Climate order objects. The orders are returned sorted by creation + * date, with the most recently created orders appearing first. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves the details of a Climate order object with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Order + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the specified order by setting the values of the parameters passed. + * + * @param string $id the ID of the resource to update + * @param null|array{beneficiary?: null|array{public_name: null|string}, expand?: string[], metadata?: array} $params + * @param null|array|string $opts + * + * @return Order the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Order the canceled order + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/Climate/Product.php b/stripe-php/lib/Climate/Product.php new file mode 100644 index 0000000..612d385 --- /dev/null +++ b/stripe-php/lib/Climate/Product.php @@ -0,0 +1,60 @@ +climsku_. See carbon removal inventory for a list of available carbon removal products. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property \Stripe\StripeObject $current_prices_per_metric_ton Current prices for a metric ton of carbon removal in a currency's smallest unit. + * @property null|int $delivery_year The year in which the carbon removal is expected to be delivered. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $metric_tons_available The quantity of metric tons available for reservation. + * @property string $name The Climate product's name. + * @property Supplier[] $suppliers The carbon removal suppliers that fulfill orders for this Climate product. + */ +class Product extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'climate.product'; + + /** + * Lists all available Climate product objects. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves the details of a Climate product with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Product + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Climate/Supplier.php b/stripe-php/lib/Climate/Supplier.php new file mode 100644 index 0000000..0204454 --- /dev/null +++ b/stripe-php/lib/Climate/Supplier.php @@ -0,0 +1,61 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property ((object{city: null|string, country: string, latitude: null|float, longitude: null|float, region: null|string}&\Stripe\StripeObject))[] $locations The locations in which this supplier operates. + * @property string $name Name of this carbon removal supplier. + * @property string $removal_pathway The scientific pathway used for carbon removal. + */ +class Supplier extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'climate.supplier'; + + const REMOVAL_PATHWAY_BIOMASS_CARBON_REMOVAL_AND_STORAGE = 'biomass_carbon_removal_and_storage'; + const REMOVAL_PATHWAY_DIRECT_AIR_CAPTURE = 'direct_air_capture'; + const REMOVAL_PATHWAY_ENHANCED_WEATHERING = 'enhanced_weathering'; + + /** + * Lists all available Climate supplier objects. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a Climate supplier object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Supplier + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Collection.php b/stripe-php/lib/Collection.php new file mode 100644 index 0000000..b8c1d4b --- /dev/null +++ b/stripe-php/lib/Collection.php @@ -0,0 +1,322 @@ + + * + * @property string $object + * @property string $url + * @property bool $has_more + * @property TStripeObject[] $data + */ +class Collection extends StripeObject implements \Countable, \IteratorAggregate +{ + const OBJECT_NAME = 'list'; + + use ApiOperations\Request; + + /** @var array */ + protected $filters = []; + + /** + * @return string the base URL for the given class + */ + public static function baseUrl() + { + return Stripe::$apiBase; + } + + /** + * Returns the filters. + * + * @return array the filters + */ + public function getFilters() + { + return $this->filters; + } + + /** + * Sets the filters, removing paging options. + * + * @param array $filters the filters + */ + public function setFilters($filters) + { + $this->filters = $filters; + } + + /** + * @return mixed + */ + #[\ReturnTypeWillChange] + public function offsetGet($k) + { + if (\is_string($k)) { + return parent::offsetGet($k); + } + $msg = "You tried to access the {$k} index, but Collection " + . 'types only support string keys. (HINT: List calls ' + . 'return an object with a `data` (which is the data ' + . "array). You likely want to call ->data[{$k}])"; + + throw new Exception\InvalidArgumentException($msg); + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection + * + * @throws Exception\ApiErrorException + */ + public function all($params = null, $opts = null) + { + self::_validateParams($params); + list($url, $params) = $this->extractPathAndUpdateParams($params); + + list($response, $opts) = $this->_request('get', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response, $opts); + if (!$obj instanceof Collection) { + throw new Exception\UnexpectedValueException( + 'Expected type ' . Collection::class . ', got "' . \get_class($obj) . '" instead.' + ); + } + $obj->setFilters($params); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return TStripeObject + * + * @throws Exception\ApiErrorException + */ + public function create($params = null, $opts = null) + { + self::_validateParams($params); + list($url, $params) = $this->extractPathAndUpdateParams($params); + + list($response, $opts) = $this->_request('post', $url, $params, $opts); + + return Util\Util::convertToStripeObject($response, $opts); + } + + /** + * @param string $id + * @param null|array $params + * @param null|array|string $opts + * + * @return TStripeObject + * + * @throws Exception\ApiErrorException + */ + public function retrieve($id, $params = null, $opts = null) + { + self::_validateParams($params); + list($url, $params) = $this->extractPathAndUpdateParams($params); + + $id = Util\Util::utf8($id); + $extn = \urlencode($id); + list($response, $opts) = $this->_request( + 'get', + "{$url}/{$extn}", + $params, + $opts + ); + + return Util\Util::convertToStripeObject($response, $opts); + } + + /** + * @return int the number of objects in the current page + */ + #[\ReturnTypeWillChange] + public function count() + { + return \count($this->data); + } + + /** + * @return \ArrayIterator an iterator that can be used to iterate + * across objects in the current page + */ + #[\ReturnTypeWillChange] + public function getIterator() + { + return new \ArrayIterator($this->data); + } + + /** + * @return \ArrayIterator an iterator that can be used to iterate + * backwards across objects in the current page + */ + public function getReverseIterator() + { + return new \ArrayIterator(\array_reverse($this->data)); + } + + /** + * @return \Generator|TStripeObject[] A generator that can be used to + * iterate across all objects across all pages. As page boundaries are + * encountered, the next page will be fetched automatically for + * continued iteration. + * + * @throws Exception\ApiErrorException + */ + public function autoPagingIterator() + { + $page = $this; + + while (true) { + $filters = $this->filters ?: []; + if (\array_key_exists('ending_before', $filters) + && !\array_key_exists('starting_after', $filters)) { + foreach ($page->getReverseIterator() as $item) { + yield $item; + } + $page = $page->previousPage(); + } else { + foreach ($page as $item) { + yield $item; + } + $page = $page->nextPage(); + } + + if ($page->isEmpty()) { + break; + } + } + } + + /** + * Returns an empty collection. This is returned from {@see nextPage()} + * when we know that there isn't a next page in order to replicate the + * behavior of the API when it attempts to return a page beyond the last. + * + * @param null|array|string $opts + * + * @return Collection + */ + public static function emptyCollection($opts = null) + { + return Collection::constructFrom(['data' => []], $opts); + } + + /** + * Returns true if the page object contains no element. + * + * @return bool + */ + public function isEmpty() + { + return empty($this->data); + } + + /** + * Fetches the next page in the resource list (if there is one). + * + * This method will try to respect the limit of the current page. If none + * was given, the default limit will be fetched again. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection + * + * @throws Exception\ApiErrorException + */ + public function nextPage($params = null, $opts = null) + { + if (!$this->has_more) { + return static::emptyCollection($opts); + } + + $lastId = \end($this->data)->id; + + $params = \array_merge( + $this->filters ?: [], + ['starting_after' => $lastId], + $params ?: [] + ); + + return $this->all($params, $opts); + } + + /** + * Fetches the previous page in the resource list (if there is one). + * + * This method will try to respect the limit of the current page. If none + * was given, the default limit will be fetched again. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection + * + * @throws Exception\ApiErrorException + */ + public function previousPage($params = null, $opts = null) + { + if (!$this->has_more) { + return static::emptyCollection($opts); + } + + $firstId = $this->data[0]->id; + + $params = \array_merge( + $this->filters ?: [], + ['ending_before' => $firstId], + $params ?: [] + ); + + return $this->all($params, $opts); + } + + /** + * Gets the first item from the current page. Returns `null` if the current page is empty. + * + * @return null|TStripeObject + */ + public function first() + { + return \count($this->data) > 0 ? $this->data[0] : null; + } + + /** + * Gets the last item from the current page. Returns `null` if the current page is empty. + * + * @return null|TStripeObject + */ + public function last() + { + return \count($this->data) > 0 ? $this->data[\count($this->data) - 1] : null; + } + + private function extractPathAndUpdateParams($params) + { + $url = \parse_url($this->url); + if (!isset($url['path'])) { + throw new Exception\UnexpectedValueException("Could not parse list url into parts: {$url}"); + } + + if (isset($url['query'])) { + // If the URL contains a query param, parse it out into $params so they + // don't interact weirdly with each other. + $query = []; + \parse_str($url['query'], $query); + $params = \array_merge($params ?: [], $query); + } + + return [$url['path'], $params]; + } +} diff --git a/stripe-php/lib/ConfirmationToken.php b/stripe-php/lib/ConfirmationToken.php new file mode 100644 index 0000000..268e41e --- /dev/null +++ b/stripe-php/lib/ConfirmationToken.php @@ -0,0 +1,56 @@ +Finalize payments on the server + * - Build two-step confirmation. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|int $expires_at Time at which this ConfirmationToken expires and can no longer be used to confirm a PaymentIntent or SetupIntent. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|(object{customer_acceptance: (object{online: null|(object{ip_address: null|string, user_agent: null|string}&StripeObject), type: string}&StripeObject)}&StripeObject) $mandate_data Data used for generating a Mandate. + * @property null|string $payment_intent ID of the PaymentIntent that this ConfirmationToken was used to confirm, or null if this ConfirmationToken has not yet been used. + * @property null|(object{card: null|(object{cvc_token: null|string, installments?: (object{plan?: (object{count: null|int, interval: null|string, type: string}&StripeObject)}&StripeObject)}&StripeObject)}&StripeObject) $payment_method_options Payment-method-specific configuration for this ConfirmationToken. + * @property null|(object{acss_debit?: (object{bank_name: null|string, fingerprint: null|string, institution_number: null|string, last4: null|string, transit_number: null|string}&StripeObject), affirm?: (object{}&StripeObject), afterpay_clearpay?: (object{}&StripeObject), alipay?: (object{}&StripeObject), allow_redisplay?: string, alma?: (object{}&StripeObject), amazon_pay?: (object{}&StripeObject), au_becs_debit?: (object{bsb_number: null|string, fingerprint: null|string, last4: null|string}&StripeObject), bacs_debit?: (object{fingerprint: null|string, last4: null|string, sort_code: null|string}&StripeObject), bancontact?: (object{}&StripeObject), billie?: (object{}&StripeObject), billing_details: (object{address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, phone: null|string, tax_id: null|string}&StripeObject), blik?: (object{}&StripeObject), boleto?: (object{tax_id: string}&StripeObject), card?: (object{brand: string, checks: null|(object{address_line1_check: null|string, address_postal_code_check: null|string, cvc_check: null|string}&StripeObject), country: null|string, description?: null|string, display_brand: null|string, exp_month: int, exp_year: int, fingerprint?: null|string, funding: string, generated_from: null|(object{charge: null|string, payment_method_details: null|(object{card_present?: (object{amount_authorized: null|int, brand: null|string, brand_product: null|string, capture_before?: int, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, incremental_authorization_supported: bool, issuer?: null|string, last4: null|string, network: null|string, network_transaction_id: null|string, offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), overcapture_supported: bool, preferred_locales: null|string[], read_method: null|string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject), wallet?: (object{type: string}&StripeObject)}&StripeObject), type: string}&StripeObject), setup_attempt: null|SetupAttempt|string}&StripeObject), iin?: null|string, issuer?: null|string, last4: string, networks: null|(object{available: string[], preferred: null|string}&StripeObject), regulated_status: null|string, three_d_secure_usage: null|(object{supported: bool}&StripeObject), wallet: null|(object{amex_express_checkout?: (object{}&StripeObject), apple_pay?: (object{}&StripeObject), dynamic_last4: null|string, google_pay?: (object{}&StripeObject), link?: (object{}&StripeObject), masterpass?: (object{billing_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject), samsung_pay?: (object{}&StripeObject), type: string, visa_checkout?: (object{billing_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject)}&StripeObject)}&StripeObject), card_present?: (object{brand: null|string, brand_product: null|string, cardholder_name: null|string, country: null|string, description?: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, iin?: null|string, issuer?: null|string, last4: null|string, networks: null|(object{available: string[], preferred: null|string}&StripeObject), offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), preferred_locales: null|string[], read_method: null|string, wallet?: (object{type: string}&StripeObject)}&StripeObject), cashapp?: (object{buyer_id: null|string, cashtag: null|string}&StripeObject), crypto?: (object{}&StripeObject), customer: null|Customer|string, customer_account: null|string, customer_balance?: (object{}&StripeObject), eps?: (object{bank: null|string}&StripeObject), fpx?: (object{account_holder_type: null|string, bank: string}&StripeObject), giropay?: (object{}&StripeObject), grabpay?: (object{}&StripeObject), ideal?: (object{bank: null|string, bic: null|string}&StripeObject), interac_present?: (object{brand: null|string, cardholder_name: null|string, country: null|string, description?: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, iin?: null|string, issuer?: null|string, last4: null|string, networks: null|(object{available: string[], preferred: null|string}&StripeObject), preferred_locales: null|string[], read_method: null|string}&StripeObject), kakao_pay?: (object{}&StripeObject), klarna?: (object{dob?: null|(object{day: null|int, month: null|int, year: null|int}&StripeObject)}&StripeObject), konbini?: (object{}&StripeObject), kr_card?: (object{brand: null|string, last4: null|string}&StripeObject), link?: (object{email: null|string, persistent_token?: string}&StripeObject), mb_way?: (object{}&StripeObject), mobilepay?: (object{}&StripeObject), multibanco?: (object{}&StripeObject), naver_pay?: (object{buyer_id: null|string, funding: string}&StripeObject), nz_bank_account?: (object{account_holder_name: null|string, bank_code: string, bank_name: string, branch_code: string, last4: string, suffix: null|string}&StripeObject), oxxo?: (object{}&StripeObject), p24?: (object{bank: null|string}&StripeObject), pay_by_bank?: (object{}&StripeObject), payco?: (object{}&StripeObject), paynow?: (object{}&StripeObject), paypal?: (object{country: null|string, payer_email: null|string, payer_id: null|string}&StripeObject), payto?: (object{bsb_number: null|string, last4: null|string, pay_id: null|string}&StripeObject), pix?: (object{}&StripeObject), promptpay?: (object{}&StripeObject), revolut_pay?: (object{}&StripeObject), samsung_pay?: (object{}&StripeObject), satispay?: (object{}&StripeObject), sepa_debit?: (object{bank_code: null|string, branch_code: null|string, country: null|string, fingerprint: null|string, generated_from: null|(object{charge: null|Charge|string, setup_attempt: null|SetupAttempt|string}&StripeObject), last4: null|string}&StripeObject), sofort?: (object{country: null|string}&StripeObject), swish?: (object{}&StripeObject), twint?: (object{}&StripeObject), type: string, us_bank_account?: (object{account_holder_type: null|string, account_type: null|string, bank_name: null|string, financial_connections_account: null|string, fingerprint: null|string, last4: null|string, networks: null|(object{preferred: null|string, supported: string[]}&StripeObject), routing_number: null|string, status_details: null|(object{blocked?: (object{network_code: null|string, reason: null|string}&StripeObject)}&StripeObject)}&StripeObject), wechat_pay?: (object{}&StripeObject), zip?: (object{}&StripeObject)}&StripeObject) $payment_method_preview Payment details collected by the Payment Element, used to create a PaymentMethod when a PaymentIntent or SetupIntent is confirmed with this ConfirmationToken. + * @property null|string $return_url Return URL used to confirm the Intent. + * @property null|string $setup_future_usage

Indicates that you intend to make future payments with this ConfirmationToken's payment method.

The presence of this property will attach the payment method to the PaymentIntent's Customer, if present, after the PaymentIntent is confirmed and any required actions from the user are complete.

+ * @property null|string $setup_intent ID of the SetupIntent that this ConfirmationToken was used to confirm, or null if this ConfirmationToken has not yet been used. + * @property null|(object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), name: string, phone: null|string}&StripeObject) $shipping Shipping information collected on this ConfirmationToken. + * @property bool $use_stripe_sdk Indicates whether the Stripe SDK is used to handle confirmation flow. Defaults to true on ConfirmationToken. + */ +class ConfirmationToken extends ApiResource +{ + const OBJECT_NAME = 'confirmation_token'; + + const SETUP_FUTURE_USAGE_OFF_SESSION = 'off_session'; + const SETUP_FUTURE_USAGE_ON_SESSION = 'on_session'; + + /** + * Retrieves an existing ConfirmationToken object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return ConfirmationToken + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/ConnectCollectionTransfer.php b/stripe-php/lib/ConnectCollectionTransfer.php new file mode 100644 index 0000000..837547a --- /dev/null +++ b/stripe-php/lib/ConnectCollectionTransfer.php @@ -0,0 +1,18 @@ +ISO currency code, in lowercase. Must be a supported currency. + * @property Account|string $destination ID of the account that funds are being collected for. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + */ +class ConnectCollectionTransfer extends ApiResource +{ + const OBJECT_NAME = 'connect_collection_transfer'; +} diff --git a/stripe-php/lib/CountrySpec.php b/stripe-php/lib/CountrySpec.php new file mode 100644 index 0000000..1fdce38 --- /dev/null +++ b/stripe-php/lib/CountrySpec.php @@ -0,0 +1,63 @@ +an online + * guide. + * + * @property string $id Unique identifier for the object. Represented as the ISO country code for this country. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property string $default_currency The default currency for this country. This applies to both payment methods and bank accounts. + * @property StripeObject $supported_bank_account_currencies Currencies that can be accepted in the specific country (for transfers). + * @property string[] $supported_payment_currencies Currencies that can be accepted in the specified country (for payments). + * @property string[] $supported_payment_methods Payment methods available in the specified country. You may need to enable some payment methods (e.g., ACH) on your account before they appear in this list. The stripe payment method refers to charging through your platform. + * @property string[] $supported_transfer_countries Countries that can accept transfers from the specified country. + * @property (object{company: (object{additional: string[], minimum: string[]}&StripeObject), individual: (object{additional: string[], minimum: string[]}&StripeObject)}&StripeObject) $verification_fields + */ +class CountrySpec extends ApiResource +{ + const OBJECT_NAME = 'country_spec'; + + /** + * Lists all Country Spec objects available in the API. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Returns a Country Spec for a given Country code. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return CountrySpec + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Coupon.php b/stripe-php/lib/Coupon.php new file mode 100644 index 0000000..52051cf --- /dev/null +++ b/stripe-php/lib/Coupon.php @@ -0,0 +1,159 @@ +subscriptions, invoices, + * checkout sessions, quotes, and more. Coupons do not work with conventional one-off charges or payment intents. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|int $amount_off Amount (in the currency specified) that will be taken off the subtotal of any invoices for this customer. + * @property null|(object{products: string[]}&StripeObject) $applies_to + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $currency If amount_off has been set, the three-letter ISO code for the currency of the amount to take off. + * @property null|StripeObject $currency_options Coupons defined in each available currency option. Each key must be a three-letter ISO currency code and a supported currency. + * @property string $duration One of forever, once, or repeating. Describes how long a customer who applies this coupon will get the discount. + * @property null|int $duration_in_months If duration is repeating, the number of months the coupon applies. Null if coupon duration is forever or once. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|int $max_redemptions Maximum number of times this coupon can be redeemed, in total, across all customers, before it is no longer valid. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $name Name of the coupon displayed to customers on for instance invoices or receipts. + * @property null|float $percent_off Percent that will be taken off the subtotal of any invoices for this customer for the duration of the coupon. For example, a coupon with percent_off of 50 will make a $ (or local equivalent)100 invoice $ (or local equivalent)50 instead. + * @property null|int $redeem_by Date after which the coupon can no longer be redeemed. + * @property int $times_redeemed Number of times this coupon has been applied to a customer. + * @property bool $valid Taking account of the above properties, whether this coupon can still be applied to a customer. + */ +class Coupon extends ApiResource +{ + const OBJECT_NAME = 'coupon'; + + use ApiOperations\Update; + + const DURATION_FOREVER = 'forever'; + const DURATION_ONCE = 'once'; + const DURATION_REPEATING = 'repeating'; + + /** + * You can create coupons easily via the coupon management page of the + * Stripe dashboard. Coupon creation is also accessible via the API if you need to + * create coupons on the fly. + * + * A coupon has either a percent_off or an amount_off and + * currency. If you set an amount_off, that amount will + * be subtracted from any invoice’s subtotal. For example, an invoice with a + * subtotal of 100 will have a final total of + * 0 if a coupon with an amount_off of + * 200 is applied to it and an invoice with a subtotal of + * 300 will have a final total of 100 if + * a coupon with an amount_off of 200 is applied to + * it. + * + * @param null|array{amount_off?: int, applies_to?: array{products?: string[]}, currency?: string, currency_options?: array, duration?: string, duration_in_months?: int, expand?: string[], id?: string, max_redemptions?: int, metadata?: null|array, name?: string, percent_off?: float, redeem_by?: int} $params + * @param null|array|string $options + * + * @return Coupon the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * You can delete coupons via the coupon management page of the + * Stripe dashboard. However, deleting a coupon does not affect any customers who + * have already applied the coupon; it means that new customers can’t redeem the + * coupon. You can also delete coupons via the API. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return Coupon the deleted resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * Returns a list of your coupons. + * + * @param null|array{created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the coupon with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Coupon + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the metadata of a coupon. Other coupon details (currency, duration, + * amount_off) are, by design, not editable. + * + * @param string $id the ID of the resource to update + * @param null|array{currency_options?: array, expand?: string[], metadata?: null|array, name?: string} $params + * @param null|array|string $opts + * + * @return Coupon the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/CreditNote.php b/stripe-php/lib/CreditNote.php new file mode 100644 index 0000000..8606c64 --- /dev/null +++ b/stripe-php/lib/CreditNote.php @@ -0,0 +1,235 @@ +Credit notes + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount The integer amount in cents (or local equivalent) representing the total amount of the credit note, including tax. + * @property int $amount_shipping This is the sum of all the shipping amounts. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property Customer|string $customer ID of the customer. + * @property null|string $customer_account ID of the account representing the customer. + * @property null|CustomerBalanceTransaction|string $customer_balance_transaction Customer balance transaction related to this credit note. + * @property int $discount_amount The integer amount in cents (or local equivalent) representing the total amount of discount that was credited. + * @property ((object{amount: int, discount: Discount|string}&StripeObject))[] $discount_amounts The aggregate amounts calculated per discount for all line items. + * @property null|int $effective_at The date when this credit note is in effect. Same as created unless overwritten. When defined, this value replaces the system-generated 'Date of issue' printed on the credit note PDF. + * @property Invoice|string $invoice ID of the invoice. + * @property Collection $lines Line items that make up the credit note + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string $memo Customer-facing text that appears on the credit note PDF. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $number A unique number that identifies this particular credit note and appears on the PDF of the credit note and its associated invoice. + * @property null|int $out_of_band_amount Amount that was credited outside of Stripe. + * @property string $pdf The link to download the PDF of the credit note. + * @property int $post_payment_amount The amount of the credit note that was refunded to the customer, credited to the customer's balance, credited outside of Stripe, or any combination thereof. + * @property int $pre_payment_amount The amount of the credit note by which the invoice's amount_remaining and amount_due were reduced. + * @property ((object{amount: int, credit_balance_transaction?: Billing\CreditBalanceTransaction|string, discount?: Discount|string, type: string}&StripeObject))[] $pretax_credit_amounts The pretax credit amounts (ex: discount, credit grants, etc) for all line items. + * @property null|string $reason Reason for issuing this credit note, one of duplicate, fraudulent, order_change, or product_unsatisfactory + * @property ((object{amount_refunded: int, payment_record_refund: null|(object{payment_record: string, refund_group: string}&StripeObject), refund: Refund|string, type: null|string}&StripeObject))[] $refunds Refunds related to this credit note. + * @property null|(object{amount_subtotal: int, amount_tax: int, amount_total: int, shipping_rate: null|ShippingRate|string, taxes?: ((object{amount: int, rate: TaxRate, taxability_reason: null|string, taxable_amount: null|int}&StripeObject))[]}&StripeObject) $shipping_cost The details of the cost of shipping, including the ShippingRate applied to the invoice. + * @property string $status Status of this credit note, one of issued or void. Learn more about voiding credit notes. + * @property int $subtotal The integer amount in cents (or local equivalent) representing the amount of the credit note, excluding exclusive tax and invoice level discounts. + * @property null|int $subtotal_excluding_tax The integer amount in cents (or local equivalent) representing the amount of the credit note, excluding all tax and invoice level discounts. + * @property int $total The integer amount in cents (or local equivalent) representing the total amount of the credit note, including tax and all discount. + * @property null|int $total_excluding_tax The integer amount in cents (or local equivalent) representing the total amount of the credit note, excluding tax, but including discounts. + * @property null|((object{amount: int, tax_behavior: string, tax_rate_details: null|(object{tax_rate: string}&StripeObject), taxability_reason: string, taxable_amount: null|int, type: string}&StripeObject))[] $total_taxes The aggregate tax information for all line items. + * @property string $type Type of this credit note, one of pre_payment or post_payment. A pre_payment credit note means it was issued when the invoice was open. A post_payment credit note means it was issued when the invoice was paid. + * @property null|int $voided_at The time that the credit note was voided. + */ +class CreditNote extends ApiResource +{ + const OBJECT_NAME = 'credit_note'; + + use ApiOperations\NestedResource; + use ApiOperations\Update; + + const REASON_DUPLICATE = 'duplicate'; + const REASON_FRAUDULENT = 'fraudulent'; + const REASON_ORDER_CHANGE = 'order_change'; + const REASON_PRODUCT_UNSATISFACTORY = 'product_unsatisfactory'; + + const STATUS_ISSUED = 'issued'; + const STATUS_VOID = 'void'; + + const TYPE_MIXED = 'mixed'; + const TYPE_POST_PAYMENT = 'post_payment'; + const TYPE_PRE_PAYMENT = 'pre_payment'; + + /** + * Issue a credit note to adjust the amount of a finalized invoice. A credit note + * will first reduce the invoice’s amount_remaining (and + * amount_due), but not below zero. This amount is indicated by the + * credit note’s pre_payment_amount. The excess amount is indicated by + * post_payment_amount, and it can result in any combination of the + * following: + * + *
  • Refunds: create a new refund (using refund_amount) or link + * existing refunds (using refunds).
  • Customer balance credit: + * credit the customer’s balance (using credit_amount) which will be + * automatically applied to their next invoice when it’s finalized.
  • + *
  • Outside of Stripe credit: record the amount that is or will be credited + * outside of Stripe (using out_of_band_amount).
+ * + * The sum of refunds, customer balance credits, and outside of Stripe credits must + * equal the post_payment_amount. + * + * You may issue multiple credit notes for an invoice. Each credit note may + * increment the invoice’s pre_payment_credit_notes_amount, + * post_payment_credit_notes_amount, or both, depending on the + * invoice’s amount_remaining at the time of credit note creation. + * + * @param null|array{amount?: int, credit_amount?: int, effective_at?: int, email_type?: string, expand?: string[], invoice: string, lines?: (array{amount?: int, description?: string, invoice_line_item?: string, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate: string, taxable_amount: int}[], tax_rates?: null|string[], type: string, unit_amount?: int, unit_amount_decimal?: string})[], memo?: string, metadata?: array, out_of_band_amount?: int, reason?: string, refund_amount?: int, refunds?: array{amount_refunded?: int, payment_record_refund?: array{payment_record: string, refund_group: string}, refund?: string, type?: string}[], shipping_cost?: array{shipping_rate?: string}} $params + * @param null|array|string $options + * + * @return CreditNote the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of credit notes. + * + * @param null|array{created?: array|int, customer?: string, customer_account?: string, ending_before?: string, expand?: string[], invoice?: string, limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the credit note object with the given identifier. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return CreditNote + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates an existing credit note. + * + * @param string $id the ID of the resource to update + * @param null|array{expand?: string[], memo?: string, metadata?: array} $params + * @param null|array|string $opts + * + * @return CreditNote the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return CreditNote the previewed credit note + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function preview($params = null, $opts = null) + { + $url = static::classUrl() . '/preview'; + list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection list of credit note line items + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function previewLines($params = null, $opts = null) + { + $url = static::classUrl() . '/preview/lines'; + list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return CreditNote the voided credit note + * + * @throws Exception\ApiErrorException if the request fails + */ + public function voidCreditNote($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/void'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + const PATH_LINES = '/lines'; + + /** + * @param string $id the ID of the credit note on which to retrieve the credit note line items + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection the list of credit note line items + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allLines($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_LINES, $params, $opts); + } +} diff --git a/stripe-php/lib/CreditNoteLineItem.php b/stripe-php/lib/CreditNoteLineItem.php new file mode 100644 index 0000000..10b2d3d --- /dev/null +++ b/stripe-php/lib/CreditNoteLineItem.php @@ -0,0 +1,29 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property ((object{amount: int, credit_balance_transaction?: Billing\CreditBalanceTransaction|string, discount?: Discount|string, type: string}&StripeObject))[] $pretax_credit_amounts The pretax credit amounts (ex: discount, credit grants, etc) for this line item. + * @property null|int $quantity The number of units of product being credited. + * @property TaxRate[] $tax_rates The tax rates which apply to the line item. + * @property null|((object{amount: int, tax_behavior: string, tax_rate_details: null|(object{tax_rate: string}&StripeObject), taxability_reason: string, taxable_amount: null|int, type: string}&StripeObject))[] $taxes The tax information of the line item. + * @property string $type The type of the credit note line item, one of invoice_line_item or custom_line_item. When the type is invoice_line_item there is an additional invoice_line_item property on the resource the value of which is the id of the credited line item on the invoice. + * @property null|int $unit_amount The cost of each unit of product being credited. + * @property null|string $unit_amount_decimal Same as unit_amount, but contains a decimal value with at most 12 decimal places. + */ +class CreditNoteLineItem extends ApiResource +{ + const OBJECT_NAME = 'credit_note_line_item'; +} diff --git a/stripe-php/lib/Customer.php b/stripe-php/lib/Customer.php new file mode 100644 index 0000000..69f3b9d --- /dev/null +++ b/stripe-php/lib/Customer.php @@ -0,0 +1,503 @@ +create recurring charges, save payment and contact information, + * and track payments that belong to the same customer. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject) $address The customer's address. + * @property null|int $balance The current balance, if any, that's stored on the customer in their default currency. If negative, the customer has credit to apply to their next invoice. If positive, the customer has an amount owed that's added to their next invoice. The balance only considers amounts that Stripe hasn't successfully applied to any invoice. It doesn't reflect unpaid invoices. This balance is only taken into account after invoices finalize. For multi-currency balances, see invoice_credit_balance. + * @property null|string $business_name The customer's business name. + * @property null|CashBalance $cash_balance The current funds being held by Stripe on behalf of the customer. You can apply these funds towards payment intents when the source is "cash_balance". The settings[reconciliation_mode] field describes if these funds apply to these payment intents manually or automatically. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $currency Three-letter ISO code for the currency the customer can be charged in for recurring billing purposes. + * @property null|string $customer_account The ID of an Account representing a customer. You can use this ID with any v1 API that accepts a customer_account parameter. + * @property null|Account|BankAccount|Card|Source|string $default_source

ID of the default payment source for the customer.

If you use payment methods created through the PaymentMethods API, see the invoice_settings.default_payment_method field instead.

+ * @property null|bool $delinquent

Tracks the most recent state change on any invoice belonging to the customer. Paying an invoice or marking it uncollectible via the API will set this field to false. An automatic payment failure or passing the invoice.due_date will set this field to true.

If an invoice becomes uncollectible by dunning, delinquent doesn't reset to false.

If you care whether the customer has paid their most recent subscription invoice, use subscription.status instead. Paying or marking uncollectible any customer invoice regardless of whether it is the latest invoice for a subscription will always set this field to false.

+ * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|Discount $discount Describes the current discount active on the customer, if there is one. + * @property null|string $email The customer's email address. + * @property null|string $individual_name The customer's individual name. + * @property null|StripeObject $invoice_credit_balance The current multi-currency balances, if any, that's stored on the customer. If positive in a currency, the customer has a credit to apply to their next invoice denominated in that currency. If negative, the customer has an amount owed that's added to their next invoice denominated in that currency. These balances don't apply to unpaid invoices. They solely track amounts that Stripe hasn't successfully applied to any invoice. Stripe only applies a balance in a specific currency to an invoice after that invoice (which is in the same currency) finalizes. + * @property null|string $invoice_prefix The prefix for the customer used to generate unique invoice numbers. + * @property null|(object{custom_fields: null|(object{name: string, value: string}&StripeObject)[], default_payment_method: null|PaymentMethod|string, footer: null|string, rendering_options: null|(object{amount_tax_display: null|string, template: null|string}&StripeObject)}&StripeObject) $invoice_settings + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $name The customer's full name or business name. + * @property null|int $next_invoice_sequence The suffix of the customer's next invoice number (for example, 0001). When the account uses account level sequencing, this parameter is ignored in API requests and the field omitted in API responses. + * @property null|string $phone The customer's phone number. + * @property null|string[] $preferred_locales The customer's preferred locales (languages), ordered by preference. + * @property null|(object{address?: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), carrier?: null|string, name?: string, phone?: null|string, tracking_number?: null|string}&StripeObject) $shipping Mailing and shipping address for the customer. Appears on invoices emailed to this customer. + * @property null|Collection $sources The customer's payment sources, if any. + * @property null|Collection $subscriptions The customer's current subscriptions, if any. + * @property null|(object{automatic_tax: string, ip_address: null|string, location: null|(object{country: string, source: string, state: null|string}&StripeObject), provider: string}&StripeObject) $tax + * @property null|string $tax_exempt Describes the customer's tax exemption status, which is none, exempt, or reverse. When set to reverse, invoice and receipt PDFs include the following text: "Reverse charge". + * @property null|Collection $tax_ids The customer's tax IDs. + * @property null|string|TestHelpers\TestClock $test_clock ID of the test clock that this customer belongs to. + */ +class Customer extends ApiResource +{ + const OBJECT_NAME = 'customer'; + + use ApiOperations\NestedResource; + use ApiOperations\Update; + + const TAX_EXEMPT_EXEMPT = 'exempt'; + const TAX_EXEMPT_NONE = 'none'; + const TAX_EXEMPT_REVERSE = 'reverse'; + + /** + * Creates a new customer object. + * + * @param null|array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, balance?: int, business_name?: null|string, cash_balance?: array{settings?: array{reconciliation_mode?: string}}, description?: string, email?: string, expand?: string[], individual_name?: null|string, invoice_prefix?: string, invoice_settings?: array{custom_fields?: null|array{name: string, value: string}[], default_payment_method?: string, footer?: string, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}, metadata?: null|array, name?: string, next_invoice_sequence?: int, payment_method?: string, phone?: string, preferred_locales?: string[], shipping?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: string}, source?: string, tax?: array{ip_address?: null|string, validate_location?: string}, tax_exempt?: null|string, tax_id_data?: array{type: string, value: string}[], test_clock?: string, validate?: bool} $params + * @param null|array|string $options + * + * @return Customer the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Permanently deletes a customer. It cannot be undone. Also immediately cancels + * any active subscriptions on the customer. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return Customer the deleted resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * Returns a list of your customers. The customers are returned sorted by creation + * date, with the most recent customers appearing first. + * + * @param null|array{created?: array|int, email?: string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, test_clock?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves a Customer object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Customer + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the specified customer by setting the values of the parameters passed. + * Any parameters not provided will be left unchanged. For example, if you pass the + * source parameter, that becomes the customer’s active source + * (e.g., a card) to be used for all charges in the future. When you update a + * customer to a new valid card source by passing the source + * parameter: for each of the customer’s current subscriptions, if the subscription + * bills automatically and is in the past_due state, then the latest + * open invoice for the subscription with automatic collection enabled will be + * retried. This retry will not count as an automatic retry, and will not affect + * the next regularly scheduled payment for the invoice. Changing the + * default_source for a customer will not trigger this behavior. + * + * This request accepts mostly the same arguments as the customer creation call. + * + * @param string $id the ID of the resource to update + * @param null|array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, balance?: int, business_name?: null|string, cash_balance?: array{settings?: array{reconciliation_mode?: string}}, default_source?: string, description?: string, email?: string, expand?: string[], individual_name?: null|string, invoice_prefix?: string, invoice_settings?: array{custom_fields?: null|array{name: string, value: string}[], default_payment_method?: string, footer?: string, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}, metadata?: null|array, name?: string, next_invoice_sequence?: int, phone?: string, preferred_locales?: string[], shipping?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: string}, source?: string, tax?: array{ip_address?: null|string, validate_location?: string}, tax_exempt?: null|string, validate?: bool} $params + * @param null|array|string $opts + * + * @return Customer the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + public static function getSavedNestedResources() + { + static $savedNestedResources = null; + if (null === $savedNestedResources) { + $savedNestedResources = new Util\Set([ + 'source', + ]); + } + + return $savedNestedResources; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Customer the updated customer + */ + public function deleteDiscount($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/discount'; + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom(['discount' => null], $opts, true); + + return $this; + } + + /** + * @param string $id + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection list of payment methods + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allPaymentMethods($id, $params = null, $opts = null) + { + $url = static::resourceUrl($id) . '/payment_methods'; + list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param string $payment_method + * @param null|array $params + * @param null|array|string $opts + * + * @return PaymentMethod the retrieved payment method + * + * @throws Exception\ApiErrorException if the request fails + */ + public function retrievePaymentMethod($payment_method, $params = null, $opts = null) + { + $url = $this->instanceUrl() . '/payment_methods/' . $payment_method; + list($response, $opts) = $this->_request('get', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return SearchResult the customer search results + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function search($params = null, $opts = null) + { + $url = '/v1/customers/search'; + + return static::_requestPage($url, SearchResult::class, $params, $opts); + } + + const PATH_CASH_BALANCE = '/cash_balance'; + + /** + * @param string $id the ID of the customer to which the cash balance belongs + * @param null|array $params + * @param null|array|string $opts + * @param mixed $cashBalanceId + * + * @return CashBalance + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieveCashBalance($id, $cashBalanceId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_CASH_BALANCE, $params, $opts); + } + + /** + * @param string $id the ID of the customer to which the cash balance belongs + * @param null|array $params + * @param null|array|string $opts + * @param mixed $cashBalanceId + * + * @return CashBalance + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function updateCashBalance($id, $cashBalanceId, $params = null, $opts = null) + { + return self::_updateNestedResource($id, static::PATH_CASH_BALANCE, $params, $opts); + } + const PATH_BALANCE_TRANSACTIONS = '/balance_transactions'; + + /** + * @param string $id the ID of the customer on which to retrieve the customer balance transactions + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection the list of customer balance transactions + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allBalanceTransactions($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_BALANCE_TRANSACTIONS, $params, $opts); + } + + /** + * @param string $id the ID of the customer on which to create the customer balance transaction + * @param null|array $params + * @param null|array|string $opts + * + * @return CustomerBalanceTransaction + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function createBalanceTransaction($id, $params = null, $opts = null) + { + return self::_createNestedResource($id, static::PATH_BALANCE_TRANSACTIONS, $params, $opts); + } + + /** + * @param string $id the ID of the customer to which the customer balance transaction belongs + * @param string $balanceTransactionId the ID of the customer balance transaction to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @return CustomerBalanceTransaction + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieveBalanceTransaction($id, $balanceTransactionId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_BALANCE_TRANSACTIONS, $balanceTransactionId, $params, $opts); + } + + /** + * @param string $id the ID of the customer to which the customer balance transaction belongs + * @param string $balanceTransactionId the ID of the customer balance transaction to update + * @param null|array $params + * @param null|array|string $opts + * + * @return CustomerBalanceTransaction + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function updateBalanceTransaction($id, $balanceTransactionId, $params = null, $opts = null) + { + return self::_updateNestedResource($id, static::PATH_BALANCE_TRANSACTIONS, $balanceTransactionId, $params, $opts); + } + const PATH_CASH_BALANCE_TRANSACTIONS = '/cash_balance_transactions'; + + /** + * @param string $id the ID of the customer on which to retrieve the customer cash balance transactions + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection the list of customer cash balance transactions + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allCashBalanceTransactions($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_CASH_BALANCE_TRANSACTIONS, $params, $opts); + } + + /** + * @param string $id the ID of the customer to which the customer cash balance transaction belongs + * @param string $cashBalanceTransactionId the ID of the customer cash balance transaction to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @return CustomerCashBalanceTransaction + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieveCashBalanceTransaction($id, $cashBalanceTransactionId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_CASH_BALANCE_TRANSACTIONS, $cashBalanceTransactionId, $params, $opts); + } + const PATH_SOURCES = '/sources'; + + /** + * @param string $id the ID of the customer on which to retrieve the payment sources + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection the list of payment sources (BankAccount, Card or Source) + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allSources($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_SOURCES, $params, $opts); + } + + /** + * @param string $id the ID of the customer on which to create the payment source + * @param null|array $params + * @param null|array|string $opts + * + * @return BankAccount|Card|Source + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function createSource($id, $params = null, $opts = null) + { + return self::_createNestedResource($id, static::PATH_SOURCES, $params, $opts); + } + + /** + * @param string $id the ID of the customer to which the payment source belongs + * @param string $sourceId the ID of the payment source to delete + * @param null|array $params + * @param null|array|string $opts + * + * @return BankAccount|Card|Source + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function deleteSource($id, $sourceId, $params = null, $opts = null) + { + return self::_deleteNestedResource($id, static::PATH_SOURCES, $sourceId, $params, $opts); + } + + /** + * @param string $id the ID of the customer to which the payment source belongs + * @param string $sourceId the ID of the payment source to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @return BankAccount|Card|Source + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieveSource($id, $sourceId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_SOURCES, $sourceId, $params, $opts); + } + + /** + * @param string $id the ID of the customer to which the payment source belongs + * @param string $sourceId the ID of the payment source to update + * @param null|array $params + * @param null|array|string $opts + * + * @return BankAccount|Card|Source + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function updateSource($id, $sourceId, $params = null, $opts = null) + { + return self::_updateNestedResource($id, static::PATH_SOURCES, $sourceId, $params, $opts); + } + const PATH_TAX_IDS = '/tax_ids'; + + /** + * @param string $id the ID of the customer on which to retrieve the tax ids + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection the list of tax ids + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allTaxIds($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_TAX_IDS, $params, $opts); + } + + /** + * @param string $id the ID of the customer on which to create the tax id + * @param null|array $params + * @param null|array|string $opts + * + * @return TaxId + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function createTaxId($id, $params = null, $opts = null) + { + return self::_createNestedResource($id, static::PATH_TAX_IDS, $params, $opts); + } + + /** + * @param string $id the ID of the customer to which the tax id belongs + * @param string $taxIdId the ID of the tax id to delete + * @param null|array $params + * @param null|array|string $opts + * + * @return TaxId + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function deleteTaxId($id, $taxIdId, $params = null, $opts = null) + { + return self::_deleteNestedResource($id, static::PATH_TAX_IDS, $taxIdId, $params, $opts); + } + + /** + * @param string $id the ID of the customer to which the tax id belongs + * @param string $taxIdId the ID of the tax id to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @return TaxId + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieveTaxId($id, $taxIdId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_TAX_IDS, $taxIdId, $params, $opts); + } +} diff --git a/stripe-php/lib/CustomerBalanceTransaction.php b/stripe-php/lib/CustomerBalanceTransaction.php new file mode 100644 index 0000000..667d650 --- /dev/null +++ b/stripe-php/lib/CustomerBalanceTransaction.php @@ -0,0 +1,103 @@ +Balance value, + * which denotes a debit or credit that's automatically applied to their next invoice upon finalization. + * You may modify the value directly by using the update customer API, + * or by creating a Customer Balance Transaction, which increments or decrements the customer's balance by the specified amount. + * + * Related guide: Customer balance + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount The amount of the transaction. A negative value is a credit for the customer's balance, and a positive value is a debit to the customer's balance. + * @property null|Checkout\Session|string $checkout_session The ID of the checkout session (if any) that created the transaction. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|CreditNote|string $credit_note The ID of the credit note (if any) related to the transaction. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property Customer|string $customer The ID of the customer the transaction belongs to. + * @property null|string $customer_account The ID of an Account representing a customer that the transaction belongs to. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property int $ending_balance The customer's balance after the transaction was applied. A negative value decreases the amount due on the customer's next invoice. A positive value increases the amount due on the customer's next invoice. + * @property null|Invoice|string $invoice The ID of the invoice (if any) related to the transaction. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $type Transaction type: adjustment, applied_to_invoice, credit_note, initial, invoice_overpaid, invoice_too_large, invoice_too_small, unspent_receiver_credit, unapplied_from_invoice, checkout_session_subscription_payment, or checkout_session_subscription_payment_canceled. See the Customer Balance page to learn more about transaction types. + */ +class CustomerBalanceTransaction extends ApiResource +{ + const OBJECT_NAME = 'customer_balance_transaction'; + + const TYPE_ADJUSTMENT = 'adjustment'; + const TYPE_APPLIED_TO_INVOICE = 'applied_to_invoice'; + const TYPE_CHECKOUT_SESSION_SUBSCRIPTION_PAYMENT = 'checkout_session_subscription_payment'; + const TYPE_CHECKOUT_SESSION_SUBSCRIPTION_PAYMENT_CANCELED = 'checkout_session_subscription_payment_canceled'; + const TYPE_CREDIT_NOTE = 'credit_note'; + const TYPE_INITIAL = 'initial'; + const TYPE_INVOICE_OVERPAID = 'invoice_overpaid'; + const TYPE_INVOICE_TOO_LARGE = 'invoice_too_large'; + const TYPE_INVOICE_TOO_SMALL = 'invoice_too_small'; + const TYPE_UNSPENT_RECEIVER_CREDIT = 'unspent_receiver_credit'; + + const TYPE_ADJUSTEMENT = 'adjustment'; + + /** + * @return string the API URL for this balance transaction + */ + public function instanceUrl() + { + $id = $this['id']; + $customer = $this['customer']; + if (!$id) { + throw new Exception\UnexpectedValueException( + "Could not determine which URL to request: class instance has invalid ID: {$id}", + null + ); + } + $id = Util\Util::utf8($id); + $customer = Util\Util::utf8($customer); + + $base = Customer::classUrl(); + $customerExtn = \urlencode($customer); + $extn = \urlencode($id); + + return "{$base}/{$customerExtn}/balance_transactions/{$extn}"; + } + + /** + * @param array|string $_id + * @param null|array|string $_opts + * + * @throws Exception\BadMethodCallException + */ + public static function retrieve($_id, $_opts = null) + { + $msg = 'Customer Balance Transactions cannot be retrieved without a ' + . 'customer ID. Retrieve a Customer Balance Transaction using ' + . "`Customer::retrieveBalanceTransaction('customer_id', " + . "'balance_transaction_id')`."; + + throw new Exception\BadMethodCallException($msg); + } + + /** + * @param string $_id + * @param null|array $_params + * @param null|array|string $_options + * + * @throws Exception\BadMethodCallException + */ + public static function update($_id, $_params = null, $_options = null) + { + $msg = 'Customer Balance Transactions cannot be updated without a ' + . 'customer ID. Update a Customer Balance Transaction using ' + . "`Customer::updateBalanceTransaction('customer_id', " + . "'balance_transaction_id', \$updateParams)`."; + + throw new Exception\BadMethodCallException($msg); + } +} diff --git a/stripe-php/lib/CustomerCashBalanceTransaction.php b/stripe-php/lib/CustomerCashBalanceTransaction.php new file mode 100644 index 0000000..5710242 --- /dev/null +++ b/stripe-php/lib/CustomerCashBalanceTransaction.php @@ -0,0 +1,43 @@ +ISO currency code, in lowercase. Must be a supported currency. + * @property Customer|string $customer The customer whose available cash balance changed as a result of this transaction. + * @property null|string $customer_account The ID of an Account representing a customer whose available cash balance changed as a result of this transaction. + * @property int $ending_balance The total available cash balance for the specified currency after this transaction was applied. Represented in the smallest currency unit. + * @property null|(object{bank_transfer: (object{eu_bank_transfer?: (object{bic: null|string, iban_last4: null|string, sender_name: null|string}&StripeObject), gb_bank_transfer?: (object{account_number_last4: null|string, sender_name: null|string, sort_code: null|string}&StripeObject), jp_bank_transfer?: (object{sender_bank: null|string, sender_branch: null|string, sender_name: null|string}&StripeObject), reference: null|string, type: string, us_bank_transfer?: (object{network?: string, sender_name: null|string}&StripeObject)}&StripeObject)}&StripeObject) $funded + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property int $net_amount The amount by which the cash balance changed, represented in the smallest currency unit. A positive value represents funds being added to the cash balance, a negative value represents funds being removed from the cash balance. + * @property null|(object{refund: Refund|string}&StripeObject) $refunded_from_payment + * @property null|(object{balance_transaction: BalanceTransaction|string}&StripeObject) $transferred_to_balance + * @property string $type The type of the cash balance transaction. New types may be added in future. See Customer Balance to learn more about these types. + * @property null|(object{payment_intent: PaymentIntent|string}&StripeObject) $unapplied_from_payment + */ +class CustomerCashBalanceTransaction extends ApiResource +{ + const OBJECT_NAME = 'customer_cash_balance_transaction'; + + const TYPE_ADJUSTED_FOR_OVERDRAFT = 'adjusted_for_overdraft'; + const TYPE_APPLIED_TO_PAYMENT = 'applied_to_payment'; + const TYPE_FUNDED = 'funded'; + const TYPE_FUNDING_REVERSED = 'funding_reversed'; + const TYPE_REFUNDED_FROM_PAYMENT = 'refunded_from_payment'; + const TYPE_RETURN_CANCELED = 'return_canceled'; + const TYPE_RETURN_INITIATED = 'return_initiated'; + const TYPE_TRANSFERRED_TO_BALANCE = 'transferred_to_balance'; + const TYPE_UNAPPLIED_FROM_PAYMENT = 'unapplied_from_payment'; +} diff --git a/stripe-php/lib/CustomerSession.php b/stripe-php/lib/CustomerSession.php new file mode 100644 index 0000000..999b91f --- /dev/null +++ b/stripe-php/lib/CustomerSession.php @@ -0,0 +1,51 @@ +Customer Session with the Payment Element, + * Customer Session with the Pricing Table, + * Customer Session with the Buy Button. + * + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property string $client_secret

The client secret of this Customer Session. Used on the client to set up secure access to the given customer.

The client secret can be used to provide access to customer from your frontend. It should not be stored, logged, or exposed to anyone other than the relevant customer. Make sure that you have TLS enabled on any page that includes the client secret.

+ * @property null|(object{buy_button: (object{enabled: bool}&StripeObject), customer_sheet: (object{enabled: bool, features: null|(object{payment_method_allow_redisplay_filters: null|string[], payment_method_remove: null|string}&StripeObject)}&StripeObject), mobile_payment_element: (object{enabled: bool, features: null|(object{payment_method_allow_redisplay_filters: null|string[], payment_method_redisplay: null|string, payment_method_remove: null|string, payment_method_save: null|string, payment_method_save_allow_redisplay_override: null|string}&StripeObject)}&StripeObject), payment_element: (object{enabled: bool, features: null|(object{payment_method_allow_redisplay_filters: string[], payment_method_redisplay: string, payment_method_redisplay_limit: null|int, payment_method_remove: string, payment_method_save: string, payment_method_save_usage: null|string}&StripeObject)}&StripeObject), pricing_table: (object{enabled: bool}&StripeObject)}&StripeObject) $components Configuration for the components supported by this Customer Session. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property Customer|string $customer The Customer the Customer Session was created for. + * @property null|string $customer_account The Account that the Customer Session was created for. + * @property int $expires_at The timestamp at which this Customer Session will expire. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + */ +class CustomerSession extends ApiResource +{ + const OBJECT_NAME = 'customer_session'; + + /** + * Creates a Customer Session object that includes a single-use client secret that + * you can use on your front-end to grant client-side API access for certain + * customer resources. + * + * @param null|array{components: array{buy_button?: array{enabled: bool}, customer_sheet?: array{enabled: bool, features?: array{payment_method_allow_redisplay_filters?: string[], payment_method_remove?: string}}, mobile_payment_element?: array{enabled: bool, features?: array{payment_method_allow_redisplay_filters?: string[], payment_method_redisplay?: string, payment_method_remove?: string, payment_method_save?: string, payment_method_save_allow_redisplay_override?: string}}, payment_element?: array{enabled: bool, features?: array{payment_method_allow_redisplay_filters?: string[], payment_method_redisplay?: string, payment_method_redisplay_limit?: int, payment_method_remove?: string, payment_method_save?: string, payment_method_save_usage?: string}}, pricing_table?: array{enabled: bool}}, customer?: string, customer_account?: string, expand?: string[]} $params + * @param null|array|string $options + * + * @return CustomerSession the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Discount.php b/stripe-php/lib/Discount.php new file mode 100644 index 0000000..adc689e --- /dev/null +++ b/stripe-php/lib/Discount.php @@ -0,0 +1,30 @@ +coupon or promotion code. + * It contains information about when the discount began, when it will end, and what it is applied to. + * + * Related guide: Applying discounts to subscriptions + * + * @property string $id The ID of the discount object. Discounts cannot be fetched by ID. Use expand[]=discounts in API calls to expand discount IDs in an array. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|string $checkout_session The Checkout session that this coupon is applied to, if it is applied to a particular session in payment mode. Will not be present for subscription mode. + * @property null|Customer|string $customer The ID of the customer associated with this discount. + * @property null|string $customer_account The ID of the account representing the customer associated with this discount. + * @property null|int $end If the coupon has a duration of repeating, the date that this discount will end. If the coupon has a duration of once or forever, this attribute will be null. + * @property null|string $invoice The invoice that the discount's coupon was applied to, if it was applied directly to a particular invoice. + * @property null|string $invoice_item The invoice item id (or invoice line item id for invoice line items of type='subscription') that the discount's coupon was applied to, if it was applied directly to a particular invoice item or invoice line item. + * @property null|PromotionCode|string $promotion_code The promotion code applied to create this discount. + * @property (object{coupon: null|Coupon|string, type: string}&StripeObject) $source + * @property int $start Date that the coupon was applied. + * @property null|string $subscription The subscription that this coupon is applied to, if it is applied to a particular subscription. + * @property null|string $subscription_item The subscription item that this coupon is applied to, if it is applied to a particular subscription item. + */ +class Discount extends ApiResource +{ + const OBJECT_NAME = 'discount'; +} diff --git a/stripe-php/lib/Dispute.php b/stripe-php/lib/Dispute.php new file mode 100644 index 0000000..d0a3474 --- /dev/null +++ b/stripe-php/lib/Dispute.php @@ -0,0 +1,146 @@ +Disputes and fraud + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Disputed amount. Usually the amount of the charge, but it can differ (usually because of currency fluctuation or because only part of the order is disputed). + * @property BalanceTransaction[] $balance_transactions List of zero, one, or two balance transactions that show funds withdrawn and reinstated to your Stripe account as a result of this dispute. + * @property Charge|string $charge ID of the charge that's disputed. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property string[] $enhanced_eligibility_types List of eligibility types that are included in enhanced_evidence. + * @property (object{access_activity_log: null|string, billing_address: null|string, cancellation_policy: null|File|string, cancellation_policy_disclosure: null|string, cancellation_rebuttal: null|string, customer_communication: null|File|string, customer_email_address: null|string, customer_name: null|string, customer_purchase_ip: null|string, customer_signature: null|File|string, duplicate_charge_documentation: null|File|string, duplicate_charge_explanation: null|string, duplicate_charge_id: null|string, enhanced_evidence: (object{visa_compelling_evidence_3?: (object{disputed_transaction: null|(object{customer_account_id: null|string, customer_device_fingerprint: null|string, customer_device_id: null|string, customer_email_address: null|string, customer_purchase_ip: null|string, merchandise_or_services: null|string, product_description: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject), prior_undisputed_transactions: ((object{charge: string, customer_account_id: null|string, customer_device_fingerprint: null|string, customer_device_id: null|string, customer_email_address: null|string, customer_purchase_ip: null|string, product_description: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject))[]}&StripeObject), visa_compliance?: (object{fee_acknowledged: bool}&StripeObject)}&StripeObject), product_description: null|string, receipt: null|File|string, refund_policy: null|File|string, refund_policy_disclosure: null|string, refund_refusal_explanation: null|string, service_date: null|string, service_documentation: null|File|string, shipping_address: null|string, shipping_carrier: null|string, shipping_date: null|string, shipping_documentation: null|File|string, shipping_tracking_number: null|string, uncategorized_file: null|File|string, uncategorized_text: null|string}&StripeObject) $evidence + * @property (object{due_by: null|int, enhanced_eligibility: (object{visa_compelling_evidence_3?: (object{required_actions: string[], status: string}&StripeObject), visa_compliance?: (object{status: string}&StripeObject)}&StripeObject), has_evidence: bool, past_due: bool, submission_count: int}&StripeObject) $evidence_details + * @property bool $is_charge_refundable If true, it's still possible to refund the disputed payment. After the payment has been fully refunded, no further funds are withdrawn from your Stripe account as a result of this dispute. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $network_reason_code Network-dependent reason code for the dispute. + * @property null|PaymentIntent|string $payment_intent ID of the PaymentIntent that's disputed. + * @property null|(object{amazon_pay?: (object{dispute_type: null|string}&StripeObject), card?: (object{brand: string, case_type: string, network_reason_code: null|string}&StripeObject), klarna?: (object{chargeback_loss_reason_code?: string, reason_code: null|string}&StripeObject), paypal?: (object{case_id: null|string, reason_code: null|string}&StripeObject), type: string}&StripeObject) $payment_method_details + * @property string $reason Reason given by cardholder for dispute. Possible values are bank_cannot_process, check_returned, credit_not_processed, customer_initiated, debit_not_authorized, duplicate, fraudulent, general, incorrect_account_details, insufficient_funds, noncompliant, product_not_received, product_unacceptable, subscription_canceled, or unrecognized. Learn more about dispute reasons. + * @property string $status The current status of a dispute. Possible values include:warning_needs_response, warning_under_review, warning_closed, needs_response, under_review, won, lost, or prevented. + */ +class Dispute extends ApiResource +{ + const OBJECT_NAME = 'dispute'; + + use ApiOperations\Update; + + const REASON_BANK_CANNOT_PROCESS = 'bank_cannot_process'; + const REASON_CHECK_RETURNED = 'check_returned'; + const REASON_CREDIT_NOT_PROCESSED = 'credit_not_processed'; + const REASON_CUSTOMER_INITIATED = 'customer_initiated'; + const REASON_DEBIT_NOT_AUTHORIZED = 'debit_not_authorized'; + const REASON_DUPLICATE = 'duplicate'; + const REASON_FRAUDULENT = 'fraudulent'; + const REASON_GENERAL = 'general'; + const REASON_INCORRECT_ACCOUNT_DETAILS = 'incorrect_account_details'; + const REASON_INSUFFICIENT_FUNDS = 'insufficient_funds'; + const REASON_PRODUCT_NOT_RECEIVED = 'product_not_received'; + const REASON_PRODUCT_UNACCEPTABLE = 'product_unacceptable'; + const REASON_SUBSCRIPTION_CANCELED = 'subscription_canceled'; + const REASON_UNRECOGNIZED = 'unrecognized'; + + const STATUS_LOST = 'lost'; + const STATUS_NEEDS_RESPONSE = 'needs_response'; + const STATUS_PREVENTED = 'prevented'; + const STATUS_UNDER_REVIEW = 'under_review'; + const STATUS_WARNING_CLOSED = 'warning_closed'; + const STATUS_WARNING_NEEDS_RESPONSE = 'warning_needs_response'; + const STATUS_WARNING_UNDER_REVIEW = 'warning_under_review'; + const STATUS_WON = 'won'; + + /** + * Returns a list of your disputes. + * + * @param null|array{charge?: string, created?: array|int, ending_before?: string, expand?: string[], limit?: int, payment_intent?: string, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the dispute with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Dispute + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * When you get a dispute, contacting your customer is always the best first step. + * If that doesn’t work, you can submit evidence to help us resolve the dispute in + * your favor. You can do this in your dashboard, but if you prefer, + * you can use the API to submit evidence programmatically. + * + * Depending on your dispute type, different evidence fields will give you a better + * chance of winning your dispute. To figure out which evidence fields to provide, + * see our guide to dispute types. + * + * @param string $id the ID of the resource to update + * @param null|array{evidence?: array{access_activity_log?: string, billing_address?: string, cancellation_policy?: string, cancellation_policy_disclosure?: string, cancellation_rebuttal?: string, customer_communication?: string, customer_email_address?: string, customer_name?: string, customer_purchase_ip?: string, customer_signature?: string, duplicate_charge_documentation?: string, duplicate_charge_explanation?: string, duplicate_charge_id?: string, enhanced_evidence?: null|array{visa_compelling_evidence_3?: array{disputed_transaction?: array{customer_account_id?: null|string, customer_device_fingerprint?: null|string, customer_device_id?: null|string, customer_email_address?: null|string, customer_purchase_ip?: null|string, merchandise_or_services?: string, product_description?: null|string, shipping_address?: array{city?: null|string, country?: null|string, line1?: null|string, line2?: null|string, postal_code?: null|string, state?: null|string}}, prior_undisputed_transactions?: (array{charge: string, customer_account_id?: null|string, customer_device_fingerprint?: null|string, customer_device_id?: null|string, customer_email_address?: null|string, customer_purchase_ip?: null|string, product_description?: null|string, shipping_address?: array{city?: null|string, country?: null|string, line1?: null|string, line2?: null|string, postal_code?: null|string, state?: null|string}})[]}, visa_compliance?: array{fee_acknowledged?: bool}}, product_description?: string, receipt?: string, refund_policy?: string, refund_policy_disclosure?: string, refund_refusal_explanation?: string, service_date?: string, service_documentation?: string, shipping_address?: string, shipping_carrier?: string, shipping_date?: string, shipping_documentation?: string, shipping_tracking_number?: string, uncategorized_file?: string, uncategorized_text?: string}, expand?: string[], metadata?: null|array, submit?: bool} $params + * @param null|array|string $opts + * + * @return Dispute the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Dispute the closed dispute + * + * @throws Exception\ApiErrorException if the request fails + */ + public function close($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/close'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/Entitlements/ActiveEntitlement.php b/stripe-php/lib/Entitlements/ActiveEntitlement.php new file mode 100644 index 0000000..16bc27b --- /dev/null +++ b/stripe-php/lib/Entitlements/ActiveEntitlement.php @@ -0,0 +1,55 @@ +Feature that the customer is entitled to. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $lookup_key A unique key you provide as your own system identifier. This may be up to 80 characters. + */ +class ActiveEntitlement extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'entitlements.active_entitlement'; + + /** + * Retrieve a list of active entitlements for a customer. + * + * @param null|array{customer: string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieve an active entitlement. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return ActiveEntitlement + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Entitlements/ActiveEntitlementSummary.php b/stripe-php/lib/Entitlements/ActiveEntitlementSummary.php new file mode 100644 index 0000000..cfa368e --- /dev/null +++ b/stripe-php/lib/Entitlements/ActiveEntitlementSummary.php @@ -0,0 +1,18 @@ + $entitlements The list of entitlements this customer has. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + */ +class ActiveEntitlementSummary extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'entitlements.active_entitlement_summary'; +} diff --git a/stripe-php/lib/Entitlements/Feature.php b/stripe-php/lib/Entitlements/Feature.php new file mode 100644 index 0000000..61b49a2 --- /dev/null +++ b/stripe-php/lib/Entitlements/Feature.php @@ -0,0 +1,105 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $lookup_key A unique key you provide as your own system identifier. This may be up to 80 characters. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $name The feature's name, for your own purpose, not meant to be displayable to the customer. + */ +class Feature extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'entitlements.feature'; + + use \Stripe\ApiOperations\Update; + + /** + * Creates a feature. + * + * @param null|array{expand?: string[], lookup_key: string, metadata?: array, name: string} $params + * @param null|array|string $options + * + * @return Feature the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Retrieve a list of features. + * + * @param null|array{archived?: bool, ending_before?: string, expand?: string[], limit?: int, lookup_key?: string, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a feature. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Feature + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Update a feature’s metadata or permanently deactivate it. + * + * @param string $id the ID of the resource to update + * @param null|array{active?: bool, expand?: string[], metadata?: null|array, name?: string} $params + * @param null|array|string $opts + * + * @return Feature the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/EphemeralKey.php b/stripe-php/lib/EphemeralKey.php new file mode 100644 index 0000000..cd78fe6 --- /dev/null +++ b/stripe-php/lib/EphemeralKey.php @@ -0,0 +1,61 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string $secret The key's secret. You can use this value to make authorized requests to the Stripe API. + */ +class EphemeralKey extends ApiResource +{ + const OBJECT_NAME = 'ephemeral_key'; + + /** + * Invalidates a short-lived API key for a given resource. + * + * @param null|array{expand?: string[]} $params + * @param null|array|string $opts + * + * @return EphemeralKey the deleted resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + use ApiOperations\Create { + create as protected _create; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return EphemeralKey the created key + * + * @throws Exception\InvalidArgumentException if stripe_version is missing + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $opts = null) + { + if (!$opts || !isset($opts['stripe_version'])) { + throw new Exception\InvalidArgumentException('stripe_version must be specified to create an ephemeral key'); + } + + return self::_create($params, $opts); + } +} diff --git a/stripe-php/lib/ErrorObject.php b/stripe-php/lib/ErrorObject.php new file mode 100644 index 0000000..155a2ae --- /dev/null +++ b/stripe-php/lib/ErrorObject.php @@ -0,0 +1,258 @@ + null, + 'code' => null, + 'decline_code' => null, + 'doc_url' => null, + 'message' => null, + 'param' => null, + 'payment_intent' => null, + 'payment_method' => null, + 'setup_intent' => null, + 'source' => null, + 'type' => null, + ], $values); + parent::refreshFrom($values, $opts, $partial); + } +} diff --git a/stripe-php/lib/Event.php b/stripe-php/lib/Event.php new file mode 100644 index 0000000..2baf62a --- /dev/null +++ b/stripe-php/lib/Event.php @@ -0,0 +1,594 @@ +Event object that contains + * all the relevant information associated with that action, including the affected API + * resource. For example, a successful payment triggers a charge.succeeded event, which + * contains the Charge in the event's data property. Some actions trigger multiple events. + * For example, if you create a new subscription for a customer, it triggers both a + * customer.subscription.created event and a charge.succeeded event. + * + * Configure an event destination in your account to listen for events that represent actions + * your integration needs to respond to. Additionally, you can retrieve an individual event or + * a list of events from the API. + * + * Connect platforms can also receive event notifications + * that occur in their connected accounts. These events include an account attribute that + * identifies the relevant connected account. + * + * You can access events through the Retrieve Event API + * for 30 days. + * + * This class includes constants for the possible string representations of + * event types. See https://stripe.com/docs/api#event_types for more details. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|string $account The connected account that originates the event. + * @property null|string $api_version The Stripe API version used to render data when the event was created. The contents of data never change, so this value remains static regardless of the API version currently in use. This property is populated only for events created on or after October 31, 2014. + * @property null|string $context Authentication context needed to fetch the event or related object. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property (object{object: StripeObject, previous_attributes?: StripeObject}&StripeObject) $data + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property int $pending_webhooks Number of webhooks that haven't been successfully delivered (for example, to return a 20x response) to the URLs you specify. + * @property null|(object{id: null|string, idempotency_key: null|string}&StripeObject) $request Information on the API request that triggers the event. + * @property string $type Description of the event (for example, invoice.created or charge.refunded). + */ +class Event extends ApiResource +{ + const OBJECT_NAME = 'event'; + + const ACCOUNT_APPLICATION_AUTHORIZED = 'account.application.authorized'; + const ACCOUNT_APPLICATION_DEAUTHORIZED = 'account.application.deauthorized'; + const ACCOUNT_EXTERNAL_ACCOUNT_CREATED = 'account.external_account.created'; + const ACCOUNT_EXTERNAL_ACCOUNT_DELETED = 'account.external_account.deleted'; + const ACCOUNT_EXTERNAL_ACCOUNT_UPDATED = 'account.external_account.updated'; + const ACCOUNT_UPDATED = 'account.updated'; + const APPLICATION_FEE_CREATED = 'application_fee.created'; + const APPLICATION_FEE_REFUNDED = 'application_fee.refunded'; + const APPLICATION_FEE_REFUND_UPDATED = 'application_fee.refund.updated'; + const BALANCE_AVAILABLE = 'balance.available'; + const BALANCE_SETTINGS_UPDATED = 'balance_settings.updated'; + const BILLING_ALERT_TRIGGERED = 'billing.alert.triggered'; + const BILLING_CREDIT_BALANCE_TRANSACTION_CREATED = 'billing.credit_balance_transaction.created'; + const BILLING_CREDIT_GRANT_CREATED = 'billing.credit_grant.created'; + const BILLING_CREDIT_GRANT_UPDATED = 'billing.credit_grant.updated'; + const BILLING_METER_CREATED = 'billing.meter.created'; + const BILLING_METER_DEACTIVATED = 'billing.meter.deactivated'; + const BILLING_METER_REACTIVATED = 'billing.meter.reactivated'; + const BILLING_METER_UPDATED = 'billing.meter.updated'; + const BILLING_PORTAL_CONFIGURATION_CREATED = 'billing_portal.configuration.created'; + const BILLING_PORTAL_CONFIGURATION_UPDATED = 'billing_portal.configuration.updated'; + const BILLING_PORTAL_SESSION_CREATED = 'billing_portal.session.created'; + const CAPABILITY_UPDATED = 'capability.updated'; + const CASH_BALANCE_FUNDS_AVAILABLE = 'cash_balance.funds_available'; + const CHARGE_CAPTURED = 'charge.captured'; + const CHARGE_DISPUTE_CLOSED = 'charge.dispute.closed'; + const CHARGE_DISPUTE_CREATED = 'charge.dispute.created'; + const CHARGE_DISPUTE_FUNDS_REINSTATED = 'charge.dispute.funds_reinstated'; + const CHARGE_DISPUTE_FUNDS_WITHDRAWN = 'charge.dispute.funds_withdrawn'; + const CHARGE_DISPUTE_UPDATED = 'charge.dispute.updated'; + const CHARGE_EXPIRED = 'charge.expired'; + const CHARGE_FAILED = 'charge.failed'; + const CHARGE_PENDING = 'charge.pending'; + const CHARGE_REFUNDED = 'charge.refunded'; + const CHARGE_REFUND_UPDATED = 'charge.refund.updated'; + const CHARGE_SUCCEEDED = 'charge.succeeded'; + const CHARGE_UPDATED = 'charge.updated'; + const CHECKOUT_SESSION_ASYNC_PAYMENT_FAILED = 'checkout.session.async_payment_failed'; + const CHECKOUT_SESSION_ASYNC_PAYMENT_SUCCEEDED = 'checkout.session.async_payment_succeeded'; + const CHECKOUT_SESSION_COMPLETED = 'checkout.session.completed'; + const CHECKOUT_SESSION_EXPIRED = 'checkout.session.expired'; + const CLIMATE_ORDER_CANCELED = 'climate.order.canceled'; + const CLIMATE_ORDER_CREATED = 'climate.order.created'; + const CLIMATE_ORDER_DELAYED = 'climate.order.delayed'; + const CLIMATE_ORDER_DELIVERED = 'climate.order.delivered'; + const CLIMATE_ORDER_PRODUCT_SUBSTITUTED = 'climate.order.product_substituted'; + const CLIMATE_PRODUCT_CREATED = 'climate.product.created'; + const CLIMATE_PRODUCT_PRICING_UPDATED = 'climate.product.pricing_updated'; + const COUPON_CREATED = 'coupon.created'; + const COUPON_DELETED = 'coupon.deleted'; + const COUPON_UPDATED = 'coupon.updated'; + const CREDIT_NOTE_CREATED = 'credit_note.created'; + const CREDIT_NOTE_UPDATED = 'credit_note.updated'; + const CREDIT_NOTE_VOIDED = 'credit_note.voided'; + const CUSTOMER_CASH_BALANCE_TRANSACTION_CREATED = 'customer_cash_balance_transaction.created'; + const CUSTOMER_CREATED = 'customer.created'; + const CUSTOMER_DELETED = 'customer.deleted'; + const CUSTOMER_DISCOUNT_CREATED = 'customer.discount.created'; + const CUSTOMER_DISCOUNT_DELETED = 'customer.discount.deleted'; + const CUSTOMER_DISCOUNT_UPDATED = 'customer.discount.updated'; + const CUSTOMER_SOURCE_CREATED = 'customer.source.created'; + const CUSTOMER_SOURCE_DELETED = 'customer.source.deleted'; + const CUSTOMER_SOURCE_EXPIRING = 'customer.source.expiring'; + const CUSTOMER_SOURCE_UPDATED = 'customer.source.updated'; + const CUSTOMER_SUBSCRIPTION_CREATED = 'customer.subscription.created'; + const CUSTOMER_SUBSCRIPTION_DELETED = 'customer.subscription.deleted'; + const CUSTOMER_SUBSCRIPTION_PAUSED = 'customer.subscription.paused'; + const CUSTOMER_SUBSCRIPTION_PENDING_UPDATE_APPLIED = 'customer.subscription.pending_update_applied'; + const CUSTOMER_SUBSCRIPTION_PENDING_UPDATE_EXPIRED = 'customer.subscription.pending_update_expired'; + const CUSTOMER_SUBSCRIPTION_RESUMED = 'customer.subscription.resumed'; + const CUSTOMER_SUBSCRIPTION_TRIAL_WILL_END = 'customer.subscription.trial_will_end'; + const CUSTOMER_SUBSCRIPTION_UPDATED = 'customer.subscription.updated'; + const CUSTOMER_TAX_ID_CREATED = 'customer.tax_id.created'; + const CUSTOMER_TAX_ID_DELETED = 'customer.tax_id.deleted'; + const CUSTOMER_TAX_ID_UPDATED = 'customer.tax_id.updated'; + const CUSTOMER_UPDATED = 'customer.updated'; + const ENTITLEMENTS_ACTIVE_ENTITLEMENT_SUMMARY_UPDATED = 'entitlements.active_entitlement_summary.updated'; + const FILE_CREATED = 'file.created'; + const FINANCIAL_CONNECTIONS_ACCOUNT_ACCOUNT_NUMBERS_UPDATED = 'financial_connections.account.account_numbers_updated'; + const FINANCIAL_CONNECTIONS_ACCOUNT_CREATED = 'financial_connections.account.created'; + const FINANCIAL_CONNECTIONS_ACCOUNT_DEACTIVATED = 'financial_connections.account.deactivated'; + const FINANCIAL_CONNECTIONS_ACCOUNT_DISCONNECTED = 'financial_connections.account.disconnected'; + const FINANCIAL_CONNECTIONS_ACCOUNT_REACTIVATED = 'financial_connections.account.reactivated'; + const FINANCIAL_CONNECTIONS_ACCOUNT_REFRESHED_BALANCE = 'financial_connections.account.refreshed_balance'; + const FINANCIAL_CONNECTIONS_ACCOUNT_REFRESHED_OWNERSHIP = 'financial_connections.account.refreshed_ownership'; + const FINANCIAL_CONNECTIONS_ACCOUNT_REFRESHED_TRANSACTIONS = 'financial_connections.account.refreshed_transactions'; + const FINANCIAL_CONNECTIONS_ACCOUNT_UPCOMING_ACCOUNT_NUMBER_EXPIRY = 'financial_connections.account.upcoming_account_number_expiry'; + const IDENTITY_VERIFICATION_SESSION_CANCELED = 'identity.verification_session.canceled'; + const IDENTITY_VERIFICATION_SESSION_CREATED = 'identity.verification_session.created'; + const IDENTITY_VERIFICATION_SESSION_PROCESSING = 'identity.verification_session.processing'; + const IDENTITY_VERIFICATION_SESSION_REDACTED = 'identity.verification_session.redacted'; + const IDENTITY_VERIFICATION_SESSION_REQUIRES_INPUT = 'identity.verification_session.requires_input'; + const IDENTITY_VERIFICATION_SESSION_VERIFIED = 'identity.verification_session.verified'; + const INVOICEITEM_CREATED = 'invoiceitem.created'; + const INVOICEITEM_DELETED = 'invoiceitem.deleted'; + const INVOICE_CREATED = 'invoice.created'; + const INVOICE_DELETED = 'invoice.deleted'; + const INVOICE_FINALIZATION_FAILED = 'invoice.finalization_failed'; + const INVOICE_FINALIZED = 'invoice.finalized'; + const INVOICE_MARKED_UNCOLLECTIBLE = 'invoice.marked_uncollectible'; + const INVOICE_OVERDUE = 'invoice.overdue'; + const INVOICE_OVERPAID = 'invoice.overpaid'; + const INVOICE_PAID = 'invoice.paid'; + const INVOICE_PAYMENT_ACTION_REQUIRED = 'invoice.payment_action_required'; + const INVOICE_PAYMENT_ATTEMPT_REQUIRED = 'invoice.payment_attempt_required'; + const INVOICE_PAYMENT_FAILED = 'invoice.payment_failed'; + const INVOICE_PAYMENT_PAID = 'invoice_payment.paid'; + const INVOICE_PAYMENT_SUCCEEDED = 'invoice.payment_succeeded'; + const INVOICE_SENT = 'invoice.sent'; + const INVOICE_UPCOMING = 'invoice.upcoming'; + const INVOICE_UPDATED = 'invoice.updated'; + const INVOICE_VOIDED = 'invoice.voided'; + const INVOICE_WILL_BE_DUE = 'invoice.will_be_due'; + const ISSUING_AUTHORIZATION_CREATED = 'issuing_authorization.created'; + const ISSUING_AUTHORIZATION_REQUEST = 'issuing_authorization.request'; + const ISSUING_AUTHORIZATION_UPDATED = 'issuing_authorization.updated'; + const ISSUING_CARDHOLDER_CREATED = 'issuing_cardholder.created'; + const ISSUING_CARDHOLDER_UPDATED = 'issuing_cardholder.updated'; + const ISSUING_CARD_CREATED = 'issuing_card.created'; + const ISSUING_CARD_UPDATED = 'issuing_card.updated'; + const ISSUING_DISPUTE_CLOSED = 'issuing_dispute.closed'; + const ISSUING_DISPUTE_CREATED = 'issuing_dispute.created'; + const ISSUING_DISPUTE_FUNDS_REINSTATED = 'issuing_dispute.funds_reinstated'; + const ISSUING_DISPUTE_FUNDS_RESCINDED = 'issuing_dispute.funds_rescinded'; + const ISSUING_DISPUTE_SUBMITTED = 'issuing_dispute.submitted'; + const ISSUING_DISPUTE_UPDATED = 'issuing_dispute.updated'; + const ISSUING_PERSONALIZATION_DESIGN_ACTIVATED = 'issuing_personalization_design.activated'; + const ISSUING_PERSONALIZATION_DESIGN_DEACTIVATED = 'issuing_personalization_design.deactivated'; + const ISSUING_PERSONALIZATION_DESIGN_REJECTED = 'issuing_personalization_design.rejected'; + const ISSUING_PERSONALIZATION_DESIGN_UPDATED = 'issuing_personalization_design.updated'; + const ISSUING_TOKEN_CREATED = 'issuing_token.created'; + const ISSUING_TOKEN_UPDATED = 'issuing_token.updated'; + const ISSUING_TRANSACTION_CREATED = 'issuing_transaction.created'; + const ISSUING_TRANSACTION_PURCHASE_DETAILS_RECEIPT_UPDATED = 'issuing_transaction.purchase_details_receipt_updated'; + const ISSUING_TRANSACTION_UPDATED = 'issuing_transaction.updated'; + const MANDATE_UPDATED = 'mandate.updated'; + const PAYMENT_INTENT_AMOUNT_CAPTURABLE_UPDATED = 'payment_intent.amount_capturable_updated'; + const PAYMENT_INTENT_CANCELED = 'payment_intent.canceled'; + const PAYMENT_INTENT_CREATED = 'payment_intent.created'; + const PAYMENT_INTENT_PARTIALLY_FUNDED = 'payment_intent.partially_funded'; + const PAYMENT_INTENT_PAYMENT_FAILED = 'payment_intent.payment_failed'; + const PAYMENT_INTENT_PROCESSING = 'payment_intent.processing'; + const PAYMENT_INTENT_REQUIRES_ACTION = 'payment_intent.requires_action'; + const PAYMENT_INTENT_SUCCEEDED = 'payment_intent.succeeded'; + const PAYMENT_LINK_CREATED = 'payment_link.created'; + const PAYMENT_LINK_UPDATED = 'payment_link.updated'; + const PAYMENT_METHOD_ATTACHED = 'payment_method.attached'; + const PAYMENT_METHOD_AUTOMATICALLY_UPDATED = 'payment_method.automatically_updated'; + const PAYMENT_METHOD_DETACHED = 'payment_method.detached'; + const PAYMENT_METHOD_UPDATED = 'payment_method.updated'; + const PAYOUT_CANCELED = 'payout.canceled'; + const PAYOUT_CREATED = 'payout.created'; + const PAYOUT_FAILED = 'payout.failed'; + const PAYOUT_PAID = 'payout.paid'; + const PAYOUT_RECONCILIATION_COMPLETED = 'payout.reconciliation_completed'; + const PAYOUT_UPDATED = 'payout.updated'; + const PERSON_CREATED = 'person.created'; + const PERSON_DELETED = 'person.deleted'; + const PERSON_UPDATED = 'person.updated'; + const PLAN_CREATED = 'plan.created'; + const PLAN_DELETED = 'plan.deleted'; + const PLAN_UPDATED = 'plan.updated'; + const PRICE_CREATED = 'price.created'; + const PRICE_DELETED = 'price.deleted'; + const PRICE_UPDATED = 'price.updated'; + const PRODUCT_CREATED = 'product.created'; + const PRODUCT_DELETED = 'product.deleted'; + const PRODUCT_UPDATED = 'product.updated'; + const PROMOTION_CODE_CREATED = 'promotion_code.created'; + const PROMOTION_CODE_UPDATED = 'promotion_code.updated'; + const QUOTE_ACCEPTED = 'quote.accepted'; + const QUOTE_CANCELED = 'quote.canceled'; + const QUOTE_CREATED = 'quote.created'; + const QUOTE_FINALIZED = 'quote.finalized'; + const RADAR_EARLY_FRAUD_WARNING_CREATED = 'radar.early_fraud_warning.created'; + const RADAR_EARLY_FRAUD_WARNING_UPDATED = 'radar.early_fraud_warning.updated'; + const REFUND_CREATED = 'refund.created'; + const REFUND_FAILED = 'refund.failed'; + const REFUND_UPDATED = 'refund.updated'; + const REPORTING_REPORT_RUN_FAILED = 'reporting.report_run.failed'; + const REPORTING_REPORT_RUN_SUCCEEDED = 'reporting.report_run.succeeded'; + const REPORTING_REPORT_TYPE_UPDATED = 'reporting.report_type.updated'; + const REVIEW_CLOSED = 'review.closed'; + const REVIEW_OPENED = 'review.opened'; + const SETUP_INTENT_CANCELED = 'setup_intent.canceled'; + const SETUP_INTENT_CREATED = 'setup_intent.created'; + const SETUP_INTENT_REQUIRES_ACTION = 'setup_intent.requires_action'; + const SETUP_INTENT_SETUP_FAILED = 'setup_intent.setup_failed'; + const SETUP_INTENT_SUCCEEDED = 'setup_intent.succeeded'; + const SIGMA_SCHEDULED_QUERY_RUN_CREATED = 'sigma.scheduled_query_run.created'; + const SOURCE_CANCELED = 'source.canceled'; + const SOURCE_CHARGEABLE = 'source.chargeable'; + const SOURCE_FAILED = 'source.failed'; + const SOURCE_MANDATE_NOTIFICATION = 'source.mandate_notification'; + const SOURCE_REFUND_ATTRIBUTES_REQUIRED = 'source.refund_attributes_required'; + const SOURCE_TRANSACTION_CREATED = 'source.transaction.created'; + const SOURCE_TRANSACTION_UPDATED = 'source.transaction.updated'; + const SUBSCRIPTION_SCHEDULE_ABORTED = 'subscription_schedule.aborted'; + const SUBSCRIPTION_SCHEDULE_CANCELED = 'subscription_schedule.canceled'; + const SUBSCRIPTION_SCHEDULE_COMPLETED = 'subscription_schedule.completed'; + const SUBSCRIPTION_SCHEDULE_CREATED = 'subscription_schedule.created'; + const SUBSCRIPTION_SCHEDULE_EXPIRING = 'subscription_schedule.expiring'; + const SUBSCRIPTION_SCHEDULE_RELEASED = 'subscription_schedule.released'; + const SUBSCRIPTION_SCHEDULE_UPDATED = 'subscription_schedule.updated'; + const TAX_RATE_CREATED = 'tax_rate.created'; + const TAX_RATE_UPDATED = 'tax_rate.updated'; + const TAX_SETTINGS_UPDATED = 'tax.settings.updated'; + const TERMINAL_READER_ACTION_FAILED = 'terminal.reader.action_failed'; + const TERMINAL_READER_ACTION_SUCCEEDED = 'terminal.reader.action_succeeded'; + const TERMINAL_READER_ACTION_UPDATED = 'terminal.reader.action_updated'; + const TEST_HELPERS_TEST_CLOCK_ADVANCING = 'test_helpers.test_clock.advancing'; + const TEST_HELPERS_TEST_CLOCK_CREATED = 'test_helpers.test_clock.created'; + const TEST_HELPERS_TEST_CLOCK_DELETED = 'test_helpers.test_clock.deleted'; + const TEST_HELPERS_TEST_CLOCK_INTERNAL_FAILURE = 'test_helpers.test_clock.internal_failure'; + const TEST_HELPERS_TEST_CLOCK_READY = 'test_helpers.test_clock.ready'; + const TOPUP_CANCELED = 'topup.canceled'; + const TOPUP_CREATED = 'topup.created'; + const TOPUP_FAILED = 'topup.failed'; + const TOPUP_REVERSED = 'topup.reversed'; + const TOPUP_SUCCEEDED = 'topup.succeeded'; + const TRANSFER_CREATED = 'transfer.created'; + const TRANSFER_REVERSED = 'transfer.reversed'; + const TRANSFER_UPDATED = 'transfer.updated'; + const TREASURY_CREDIT_REVERSAL_CREATED = 'treasury.credit_reversal.created'; + const TREASURY_CREDIT_REVERSAL_POSTED = 'treasury.credit_reversal.posted'; + const TREASURY_DEBIT_REVERSAL_COMPLETED = 'treasury.debit_reversal.completed'; + const TREASURY_DEBIT_REVERSAL_CREATED = 'treasury.debit_reversal.created'; + const TREASURY_DEBIT_REVERSAL_INITIAL_CREDIT_GRANTED = 'treasury.debit_reversal.initial_credit_granted'; + const TREASURY_FINANCIAL_ACCOUNT_CLOSED = 'treasury.financial_account.closed'; + const TREASURY_FINANCIAL_ACCOUNT_CREATED = 'treasury.financial_account.created'; + const TREASURY_FINANCIAL_ACCOUNT_FEATURES_STATUS_UPDATED = 'treasury.financial_account.features_status_updated'; + const TREASURY_INBOUND_TRANSFER_CANCELED = 'treasury.inbound_transfer.canceled'; + const TREASURY_INBOUND_TRANSFER_CREATED = 'treasury.inbound_transfer.created'; + const TREASURY_INBOUND_TRANSFER_FAILED = 'treasury.inbound_transfer.failed'; + const TREASURY_INBOUND_TRANSFER_SUCCEEDED = 'treasury.inbound_transfer.succeeded'; + const TREASURY_OUTBOUND_PAYMENT_CANCELED = 'treasury.outbound_payment.canceled'; + const TREASURY_OUTBOUND_PAYMENT_CREATED = 'treasury.outbound_payment.created'; + const TREASURY_OUTBOUND_PAYMENT_EXPECTED_ARRIVAL_DATE_UPDATED = 'treasury.outbound_payment.expected_arrival_date_updated'; + const TREASURY_OUTBOUND_PAYMENT_FAILED = 'treasury.outbound_payment.failed'; + const TREASURY_OUTBOUND_PAYMENT_POSTED = 'treasury.outbound_payment.posted'; + const TREASURY_OUTBOUND_PAYMENT_RETURNED = 'treasury.outbound_payment.returned'; + const TREASURY_OUTBOUND_PAYMENT_TRACKING_DETAILS_UPDATED = 'treasury.outbound_payment.tracking_details_updated'; + const TREASURY_OUTBOUND_TRANSFER_CANCELED = 'treasury.outbound_transfer.canceled'; + const TREASURY_OUTBOUND_TRANSFER_CREATED = 'treasury.outbound_transfer.created'; + const TREASURY_OUTBOUND_TRANSFER_EXPECTED_ARRIVAL_DATE_UPDATED = 'treasury.outbound_transfer.expected_arrival_date_updated'; + const TREASURY_OUTBOUND_TRANSFER_FAILED = 'treasury.outbound_transfer.failed'; + const TREASURY_OUTBOUND_TRANSFER_POSTED = 'treasury.outbound_transfer.posted'; + const TREASURY_OUTBOUND_TRANSFER_RETURNED = 'treasury.outbound_transfer.returned'; + const TREASURY_OUTBOUND_TRANSFER_TRACKING_DETAILS_UPDATED = 'treasury.outbound_transfer.tracking_details_updated'; + const TREASURY_RECEIVED_CREDIT_CREATED = 'treasury.received_credit.created'; + const TREASURY_RECEIVED_CREDIT_FAILED = 'treasury.received_credit.failed'; + const TREASURY_RECEIVED_CREDIT_SUCCEEDED = 'treasury.received_credit.succeeded'; + const TREASURY_RECEIVED_DEBIT_CREATED = 'treasury.received_debit.created'; + + const TYPE_ACCOUNT_APPLICATION_AUTHORIZED = 'account.application.authorized'; + const TYPE_ACCOUNT_APPLICATION_DEAUTHORIZED = 'account.application.deauthorized'; + const TYPE_ACCOUNT_EXTERNAL_ACCOUNT_CREATED = 'account.external_account.created'; + const TYPE_ACCOUNT_EXTERNAL_ACCOUNT_DELETED = 'account.external_account.deleted'; + const TYPE_ACCOUNT_EXTERNAL_ACCOUNT_UPDATED = 'account.external_account.updated'; + const TYPE_ACCOUNT_UPDATED = 'account.updated'; + const TYPE_APPLICATION_FEE_CREATED = 'application_fee.created'; + const TYPE_APPLICATION_FEE_REFUNDED = 'application_fee.refunded'; + const TYPE_APPLICATION_FEE_REFUND_UPDATED = 'application_fee.refund.updated'; + const TYPE_BALANCE_AVAILABLE = 'balance.available'; + const TYPE_BALANCE_SETTINGS_UPDATED = 'balance_settings.updated'; + const TYPE_BILLING_ALERT_TRIGGERED = 'billing.alert.triggered'; + const TYPE_BILLING_CREDIT_BALANCE_TRANSACTION_CREATED = 'billing.credit_balance_transaction.created'; + const TYPE_BILLING_CREDIT_GRANT_CREATED = 'billing.credit_grant.created'; + const TYPE_BILLING_CREDIT_GRANT_UPDATED = 'billing.credit_grant.updated'; + const TYPE_BILLING_METER_CREATED = 'billing.meter.created'; + const TYPE_BILLING_METER_DEACTIVATED = 'billing.meter.deactivated'; + const TYPE_BILLING_METER_REACTIVATED = 'billing.meter.reactivated'; + const TYPE_BILLING_METER_UPDATED = 'billing.meter.updated'; + const TYPE_BILLING_PORTAL_CONFIGURATION_CREATED = 'billing_portal.configuration.created'; + const TYPE_BILLING_PORTAL_CONFIGURATION_UPDATED = 'billing_portal.configuration.updated'; + const TYPE_BILLING_PORTAL_SESSION_CREATED = 'billing_portal.session.created'; + const TYPE_CAPABILITY_UPDATED = 'capability.updated'; + const TYPE_CASH_BALANCE_FUNDS_AVAILABLE = 'cash_balance.funds_available'; + const TYPE_CHARGE_CAPTURED = 'charge.captured'; + const TYPE_CHARGE_DISPUTE_CLOSED = 'charge.dispute.closed'; + const TYPE_CHARGE_DISPUTE_CREATED = 'charge.dispute.created'; + const TYPE_CHARGE_DISPUTE_FUNDS_REINSTATED = 'charge.dispute.funds_reinstated'; + const TYPE_CHARGE_DISPUTE_FUNDS_WITHDRAWN = 'charge.dispute.funds_withdrawn'; + const TYPE_CHARGE_DISPUTE_UPDATED = 'charge.dispute.updated'; + const TYPE_CHARGE_EXPIRED = 'charge.expired'; + const TYPE_CHARGE_FAILED = 'charge.failed'; + const TYPE_CHARGE_PENDING = 'charge.pending'; + const TYPE_CHARGE_REFUNDED = 'charge.refunded'; + const TYPE_CHARGE_REFUND_UPDATED = 'charge.refund.updated'; + const TYPE_CHARGE_SUCCEEDED = 'charge.succeeded'; + const TYPE_CHARGE_UPDATED = 'charge.updated'; + const TYPE_CHECKOUT_SESSION_ASYNC_PAYMENT_FAILED = 'checkout.session.async_payment_failed'; + const TYPE_CHECKOUT_SESSION_ASYNC_PAYMENT_SUCCEEDED = 'checkout.session.async_payment_succeeded'; + const TYPE_CHECKOUT_SESSION_COMPLETED = 'checkout.session.completed'; + const TYPE_CHECKOUT_SESSION_EXPIRED = 'checkout.session.expired'; + const TYPE_CLIMATE_ORDER_CANCELED = 'climate.order.canceled'; + const TYPE_CLIMATE_ORDER_CREATED = 'climate.order.created'; + const TYPE_CLIMATE_ORDER_DELAYED = 'climate.order.delayed'; + const TYPE_CLIMATE_ORDER_DELIVERED = 'climate.order.delivered'; + const TYPE_CLIMATE_ORDER_PRODUCT_SUBSTITUTED = 'climate.order.product_substituted'; + const TYPE_CLIMATE_PRODUCT_CREATED = 'climate.product.created'; + const TYPE_CLIMATE_PRODUCT_PRICING_UPDATED = 'climate.product.pricing_updated'; + const TYPE_COUPON_CREATED = 'coupon.created'; + const TYPE_COUPON_DELETED = 'coupon.deleted'; + const TYPE_COUPON_UPDATED = 'coupon.updated'; + const TYPE_CREDIT_NOTE_CREATED = 'credit_note.created'; + const TYPE_CREDIT_NOTE_UPDATED = 'credit_note.updated'; + const TYPE_CREDIT_NOTE_VOIDED = 'credit_note.voided'; + const TYPE_CUSTOMER_CASH_BALANCE_TRANSACTION_CREATED = 'customer_cash_balance_transaction.created'; + const TYPE_CUSTOMER_CREATED = 'customer.created'; + const TYPE_CUSTOMER_DELETED = 'customer.deleted'; + const TYPE_CUSTOMER_DISCOUNT_CREATED = 'customer.discount.created'; + const TYPE_CUSTOMER_DISCOUNT_DELETED = 'customer.discount.deleted'; + const TYPE_CUSTOMER_DISCOUNT_UPDATED = 'customer.discount.updated'; + const TYPE_CUSTOMER_SOURCE_CREATED = 'customer.source.created'; + const TYPE_CUSTOMER_SOURCE_DELETED = 'customer.source.deleted'; + const TYPE_CUSTOMER_SOURCE_EXPIRING = 'customer.source.expiring'; + const TYPE_CUSTOMER_SOURCE_UPDATED = 'customer.source.updated'; + const TYPE_CUSTOMER_SUBSCRIPTION_CREATED = 'customer.subscription.created'; + const TYPE_CUSTOMER_SUBSCRIPTION_DELETED = 'customer.subscription.deleted'; + const TYPE_CUSTOMER_SUBSCRIPTION_PAUSED = 'customer.subscription.paused'; + const TYPE_CUSTOMER_SUBSCRIPTION_PENDING_UPDATE_APPLIED = 'customer.subscription.pending_update_applied'; + const TYPE_CUSTOMER_SUBSCRIPTION_PENDING_UPDATE_EXPIRED = 'customer.subscription.pending_update_expired'; + const TYPE_CUSTOMER_SUBSCRIPTION_RESUMED = 'customer.subscription.resumed'; + const TYPE_CUSTOMER_SUBSCRIPTION_TRIAL_WILL_END = 'customer.subscription.trial_will_end'; + const TYPE_CUSTOMER_SUBSCRIPTION_UPDATED = 'customer.subscription.updated'; + const TYPE_CUSTOMER_TAX_ID_CREATED = 'customer.tax_id.created'; + const TYPE_CUSTOMER_TAX_ID_DELETED = 'customer.tax_id.deleted'; + const TYPE_CUSTOMER_TAX_ID_UPDATED = 'customer.tax_id.updated'; + const TYPE_CUSTOMER_UPDATED = 'customer.updated'; + const TYPE_ENTITLEMENTS_ACTIVE_ENTITLEMENT_SUMMARY_UPDATED = 'entitlements.active_entitlement_summary.updated'; + const TYPE_FILE_CREATED = 'file.created'; + const TYPE_FINANCIAL_CONNECTIONS_ACCOUNT_ACCOUNT_NUMBERS_UPDATED = 'financial_connections.account.account_numbers_updated'; + const TYPE_FINANCIAL_CONNECTIONS_ACCOUNT_CREATED = 'financial_connections.account.created'; + const TYPE_FINANCIAL_CONNECTIONS_ACCOUNT_DEACTIVATED = 'financial_connections.account.deactivated'; + const TYPE_FINANCIAL_CONNECTIONS_ACCOUNT_DISCONNECTED = 'financial_connections.account.disconnected'; + const TYPE_FINANCIAL_CONNECTIONS_ACCOUNT_REACTIVATED = 'financial_connections.account.reactivated'; + const TYPE_FINANCIAL_CONNECTIONS_ACCOUNT_REFRESHED_BALANCE = 'financial_connections.account.refreshed_balance'; + const TYPE_FINANCIAL_CONNECTIONS_ACCOUNT_REFRESHED_OWNERSHIP = 'financial_connections.account.refreshed_ownership'; + const TYPE_FINANCIAL_CONNECTIONS_ACCOUNT_REFRESHED_TRANSACTIONS = 'financial_connections.account.refreshed_transactions'; + const TYPE_FINANCIAL_CONNECTIONS_ACCOUNT_UPCOMING_ACCOUNT_NUMBER_EXPIRY = 'financial_connections.account.upcoming_account_number_expiry'; + const TYPE_IDENTITY_VERIFICATION_SESSION_CANCELED = 'identity.verification_session.canceled'; + const TYPE_IDENTITY_VERIFICATION_SESSION_CREATED = 'identity.verification_session.created'; + const TYPE_IDENTITY_VERIFICATION_SESSION_PROCESSING = 'identity.verification_session.processing'; + const TYPE_IDENTITY_VERIFICATION_SESSION_REDACTED = 'identity.verification_session.redacted'; + const TYPE_IDENTITY_VERIFICATION_SESSION_REQUIRES_INPUT = 'identity.verification_session.requires_input'; + const TYPE_IDENTITY_VERIFICATION_SESSION_VERIFIED = 'identity.verification_session.verified'; + const TYPE_INVOICEITEM_CREATED = 'invoiceitem.created'; + const TYPE_INVOICEITEM_DELETED = 'invoiceitem.deleted'; + const TYPE_INVOICE_CREATED = 'invoice.created'; + const TYPE_INVOICE_DELETED = 'invoice.deleted'; + const TYPE_INVOICE_FINALIZATION_FAILED = 'invoice.finalization_failed'; + const TYPE_INVOICE_FINALIZED = 'invoice.finalized'; + const TYPE_INVOICE_MARKED_UNCOLLECTIBLE = 'invoice.marked_uncollectible'; + const TYPE_INVOICE_OVERDUE = 'invoice.overdue'; + const TYPE_INVOICE_OVERPAID = 'invoice.overpaid'; + const TYPE_INVOICE_PAID = 'invoice.paid'; + const TYPE_INVOICE_PAYMENT_ACTION_REQUIRED = 'invoice.payment_action_required'; + const TYPE_INVOICE_PAYMENT_ATTEMPT_REQUIRED = 'invoice.payment_attempt_required'; + const TYPE_INVOICE_PAYMENT_FAILED = 'invoice.payment_failed'; + const TYPE_INVOICE_PAYMENT_PAID = 'invoice_payment.paid'; + const TYPE_INVOICE_PAYMENT_SUCCEEDED = 'invoice.payment_succeeded'; + const TYPE_INVOICE_SENT = 'invoice.sent'; + const TYPE_INVOICE_UPCOMING = 'invoice.upcoming'; + const TYPE_INVOICE_UPDATED = 'invoice.updated'; + const TYPE_INVOICE_VOIDED = 'invoice.voided'; + const TYPE_INVOICE_WILL_BE_DUE = 'invoice.will_be_due'; + const TYPE_ISSUING_AUTHORIZATION_CREATED = 'issuing_authorization.created'; + const TYPE_ISSUING_AUTHORIZATION_REQUEST = 'issuing_authorization.request'; + const TYPE_ISSUING_AUTHORIZATION_UPDATED = 'issuing_authorization.updated'; + const TYPE_ISSUING_CARDHOLDER_CREATED = 'issuing_cardholder.created'; + const TYPE_ISSUING_CARDHOLDER_UPDATED = 'issuing_cardholder.updated'; + const TYPE_ISSUING_CARD_CREATED = 'issuing_card.created'; + const TYPE_ISSUING_CARD_UPDATED = 'issuing_card.updated'; + const TYPE_ISSUING_DISPUTE_CLOSED = 'issuing_dispute.closed'; + const TYPE_ISSUING_DISPUTE_CREATED = 'issuing_dispute.created'; + const TYPE_ISSUING_DISPUTE_FUNDS_REINSTATED = 'issuing_dispute.funds_reinstated'; + const TYPE_ISSUING_DISPUTE_FUNDS_RESCINDED = 'issuing_dispute.funds_rescinded'; + const TYPE_ISSUING_DISPUTE_SUBMITTED = 'issuing_dispute.submitted'; + const TYPE_ISSUING_DISPUTE_UPDATED = 'issuing_dispute.updated'; + const TYPE_ISSUING_PERSONALIZATION_DESIGN_ACTIVATED = 'issuing_personalization_design.activated'; + const TYPE_ISSUING_PERSONALIZATION_DESIGN_DEACTIVATED = 'issuing_personalization_design.deactivated'; + const TYPE_ISSUING_PERSONALIZATION_DESIGN_REJECTED = 'issuing_personalization_design.rejected'; + const TYPE_ISSUING_PERSONALIZATION_DESIGN_UPDATED = 'issuing_personalization_design.updated'; + const TYPE_ISSUING_TOKEN_CREATED = 'issuing_token.created'; + const TYPE_ISSUING_TOKEN_UPDATED = 'issuing_token.updated'; + const TYPE_ISSUING_TRANSACTION_CREATED = 'issuing_transaction.created'; + const TYPE_ISSUING_TRANSACTION_PURCHASE_DETAILS_RECEIPT_UPDATED = 'issuing_transaction.purchase_details_receipt_updated'; + const TYPE_ISSUING_TRANSACTION_UPDATED = 'issuing_transaction.updated'; + const TYPE_MANDATE_UPDATED = 'mandate.updated'; + const TYPE_PAYMENT_INTENT_AMOUNT_CAPTURABLE_UPDATED = 'payment_intent.amount_capturable_updated'; + const TYPE_PAYMENT_INTENT_CANCELED = 'payment_intent.canceled'; + const TYPE_PAYMENT_INTENT_CREATED = 'payment_intent.created'; + const TYPE_PAYMENT_INTENT_PARTIALLY_FUNDED = 'payment_intent.partially_funded'; + const TYPE_PAYMENT_INTENT_PAYMENT_FAILED = 'payment_intent.payment_failed'; + const TYPE_PAYMENT_INTENT_PROCESSING = 'payment_intent.processing'; + const TYPE_PAYMENT_INTENT_REQUIRES_ACTION = 'payment_intent.requires_action'; + const TYPE_PAYMENT_INTENT_SUCCEEDED = 'payment_intent.succeeded'; + const TYPE_PAYMENT_LINK_CREATED = 'payment_link.created'; + const TYPE_PAYMENT_LINK_UPDATED = 'payment_link.updated'; + const TYPE_PAYMENT_METHOD_ATTACHED = 'payment_method.attached'; + const TYPE_PAYMENT_METHOD_AUTOMATICALLY_UPDATED = 'payment_method.automatically_updated'; + const TYPE_PAYMENT_METHOD_DETACHED = 'payment_method.detached'; + const TYPE_PAYMENT_METHOD_UPDATED = 'payment_method.updated'; + const TYPE_PAYOUT_CANCELED = 'payout.canceled'; + const TYPE_PAYOUT_CREATED = 'payout.created'; + const TYPE_PAYOUT_FAILED = 'payout.failed'; + const TYPE_PAYOUT_PAID = 'payout.paid'; + const TYPE_PAYOUT_RECONCILIATION_COMPLETED = 'payout.reconciliation_completed'; + const TYPE_PAYOUT_UPDATED = 'payout.updated'; + const TYPE_PERSON_CREATED = 'person.created'; + const TYPE_PERSON_DELETED = 'person.deleted'; + const TYPE_PERSON_UPDATED = 'person.updated'; + const TYPE_PLAN_CREATED = 'plan.created'; + const TYPE_PLAN_DELETED = 'plan.deleted'; + const TYPE_PLAN_UPDATED = 'plan.updated'; + const TYPE_PRICE_CREATED = 'price.created'; + const TYPE_PRICE_DELETED = 'price.deleted'; + const TYPE_PRICE_UPDATED = 'price.updated'; + const TYPE_PRODUCT_CREATED = 'product.created'; + const TYPE_PRODUCT_DELETED = 'product.deleted'; + const TYPE_PRODUCT_UPDATED = 'product.updated'; + const TYPE_PROMOTION_CODE_CREATED = 'promotion_code.created'; + const TYPE_PROMOTION_CODE_UPDATED = 'promotion_code.updated'; + const TYPE_QUOTE_ACCEPTED = 'quote.accepted'; + const TYPE_QUOTE_CANCELED = 'quote.canceled'; + const TYPE_QUOTE_CREATED = 'quote.created'; + const TYPE_QUOTE_FINALIZED = 'quote.finalized'; + const TYPE_RADAR_EARLY_FRAUD_WARNING_CREATED = 'radar.early_fraud_warning.created'; + const TYPE_RADAR_EARLY_FRAUD_WARNING_UPDATED = 'radar.early_fraud_warning.updated'; + const TYPE_REFUND_CREATED = 'refund.created'; + const TYPE_REFUND_FAILED = 'refund.failed'; + const TYPE_REFUND_UPDATED = 'refund.updated'; + const TYPE_REPORTING_REPORT_RUN_FAILED = 'reporting.report_run.failed'; + const TYPE_REPORTING_REPORT_RUN_SUCCEEDED = 'reporting.report_run.succeeded'; + const TYPE_REPORTING_REPORT_TYPE_UPDATED = 'reporting.report_type.updated'; + const TYPE_REVIEW_CLOSED = 'review.closed'; + const TYPE_REVIEW_OPENED = 'review.opened'; + const TYPE_SETUP_INTENT_CANCELED = 'setup_intent.canceled'; + const TYPE_SETUP_INTENT_CREATED = 'setup_intent.created'; + const TYPE_SETUP_INTENT_REQUIRES_ACTION = 'setup_intent.requires_action'; + const TYPE_SETUP_INTENT_SETUP_FAILED = 'setup_intent.setup_failed'; + const TYPE_SETUP_INTENT_SUCCEEDED = 'setup_intent.succeeded'; + const TYPE_SIGMA_SCHEDULED_QUERY_RUN_CREATED = 'sigma.scheduled_query_run.created'; + const TYPE_SOURCE_CANCELED = 'source.canceled'; + const TYPE_SOURCE_CHARGEABLE = 'source.chargeable'; + const TYPE_SOURCE_FAILED = 'source.failed'; + const TYPE_SOURCE_MANDATE_NOTIFICATION = 'source.mandate_notification'; + const TYPE_SOURCE_REFUND_ATTRIBUTES_REQUIRED = 'source.refund_attributes_required'; + const TYPE_SOURCE_TRANSACTION_CREATED = 'source.transaction.created'; + const TYPE_SOURCE_TRANSACTION_UPDATED = 'source.transaction.updated'; + const TYPE_SUBSCRIPTION_SCHEDULE_ABORTED = 'subscription_schedule.aborted'; + const TYPE_SUBSCRIPTION_SCHEDULE_CANCELED = 'subscription_schedule.canceled'; + const TYPE_SUBSCRIPTION_SCHEDULE_COMPLETED = 'subscription_schedule.completed'; + const TYPE_SUBSCRIPTION_SCHEDULE_CREATED = 'subscription_schedule.created'; + const TYPE_SUBSCRIPTION_SCHEDULE_EXPIRING = 'subscription_schedule.expiring'; + const TYPE_SUBSCRIPTION_SCHEDULE_RELEASED = 'subscription_schedule.released'; + const TYPE_SUBSCRIPTION_SCHEDULE_UPDATED = 'subscription_schedule.updated'; + const TYPE_TAX_RATE_CREATED = 'tax_rate.created'; + const TYPE_TAX_RATE_UPDATED = 'tax_rate.updated'; + const TYPE_TAX_SETTINGS_UPDATED = 'tax.settings.updated'; + const TYPE_TERMINAL_READER_ACTION_FAILED = 'terminal.reader.action_failed'; + const TYPE_TERMINAL_READER_ACTION_SUCCEEDED = 'terminal.reader.action_succeeded'; + const TYPE_TERMINAL_READER_ACTION_UPDATED = 'terminal.reader.action_updated'; + const TYPE_TEST_HELPERS_TEST_CLOCK_ADVANCING = 'test_helpers.test_clock.advancing'; + const TYPE_TEST_HELPERS_TEST_CLOCK_CREATED = 'test_helpers.test_clock.created'; + const TYPE_TEST_HELPERS_TEST_CLOCK_DELETED = 'test_helpers.test_clock.deleted'; + const TYPE_TEST_HELPERS_TEST_CLOCK_INTERNAL_FAILURE = 'test_helpers.test_clock.internal_failure'; + const TYPE_TEST_HELPERS_TEST_CLOCK_READY = 'test_helpers.test_clock.ready'; + const TYPE_TOPUP_CANCELED = 'topup.canceled'; + const TYPE_TOPUP_CREATED = 'topup.created'; + const TYPE_TOPUP_FAILED = 'topup.failed'; + const TYPE_TOPUP_REVERSED = 'topup.reversed'; + const TYPE_TOPUP_SUCCEEDED = 'topup.succeeded'; + const TYPE_TRANSFER_CREATED = 'transfer.created'; + const TYPE_TRANSFER_REVERSED = 'transfer.reversed'; + const TYPE_TRANSFER_UPDATED = 'transfer.updated'; + const TYPE_TREASURY_CREDIT_REVERSAL_CREATED = 'treasury.credit_reversal.created'; + const TYPE_TREASURY_CREDIT_REVERSAL_POSTED = 'treasury.credit_reversal.posted'; + const TYPE_TREASURY_DEBIT_REVERSAL_COMPLETED = 'treasury.debit_reversal.completed'; + const TYPE_TREASURY_DEBIT_REVERSAL_CREATED = 'treasury.debit_reversal.created'; + const TYPE_TREASURY_DEBIT_REVERSAL_INITIAL_CREDIT_GRANTED = 'treasury.debit_reversal.initial_credit_granted'; + const TYPE_TREASURY_FINANCIAL_ACCOUNT_CLOSED = 'treasury.financial_account.closed'; + const TYPE_TREASURY_FINANCIAL_ACCOUNT_CREATED = 'treasury.financial_account.created'; + const TYPE_TREASURY_FINANCIAL_ACCOUNT_FEATURES_STATUS_UPDATED = 'treasury.financial_account.features_status_updated'; + const TYPE_TREASURY_INBOUND_TRANSFER_CANCELED = 'treasury.inbound_transfer.canceled'; + const TYPE_TREASURY_INBOUND_TRANSFER_CREATED = 'treasury.inbound_transfer.created'; + const TYPE_TREASURY_INBOUND_TRANSFER_FAILED = 'treasury.inbound_transfer.failed'; + const TYPE_TREASURY_INBOUND_TRANSFER_SUCCEEDED = 'treasury.inbound_transfer.succeeded'; + const TYPE_TREASURY_OUTBOUND_PAYMENT_CANCELED = 'treasury.outbound_payment.canceled'; + const TYPE_TREASURY_OUTBOUND_PAYMENT_CREATED = 'treasury.outbound_payment.created'; + const TYPE_TREASURY_OUTBOUND_PAYMENT_EXPECTED_ARRIVAL_DATE_UPDATED = 'treasury.outbound_payment.expected_arrival_date_updated'; + const TYPE_TREASURY_OUTBOUND_PAYMENT_FAILED = 'treasury.outbound_payment.failed'; + const TYPE_TREASURY_OUTBOUND_PAYMENT_POSTED = 'treasury.outbound_payment.posted'; + const TYPE_TREASURY_OUTBOUND_PAYMENT_RETURNED = 'treasury.outbound_payment.returned'; + const TYPE_TREASURY_OUTBOUND_PAYMENT_TRACKING_DETAILS_UPDATED = 'treasury.outbound_payment.tracking_details_updated'; + const TYPE_TREASURY_OUTBOUND_TRANSFER_CANCELED = 'treasury.outbound_transfer.canceled'; + const TYPE_TREASURY_OUTBOUND_TRANSFER_CREATED = 'treasury.outbound_transfer.created'; + const TYPE_TREASURY_OUTBOUND_TRANSFER_EXPECTED_ARRIVAL_DATE_UPDATED = 'treasury.outbound_transfer.expected_arrival_date_updated'; + const TYPE_TREASURY_OUTBOUND_TRANSFER_FAILED = 'treasury.outbound_transfer.failed'; + const TYPE_TREASURY_OUTBOUND_TRANSFER_POSTED = 'treasury.outbound_transfer.posted'; + const TYPE_TREASURY_OUTBOUND_TRANSFER_RETURNED = 'treasury.outbound_transfer.returned'; + const TYPE_TREASURY_OUTBOUND_TRANSFER_TRACKING_DETAILS_UPDATED = 'treasury.outbound_transfer.tracking_details_updated'; + const TYPE_TREASURY_RECEIVED_CREDIT_CREATED = 'treasury.received_credit.created'; + const TYPE_TREASURY_RECEIVED_CREDIT_FAILED = 'treasury.received_credit.failed'; + const TYPE_TREASURY_RECEIVED_CREDIT_SUCCEEDED = 'treasury.received_credit.succeeded'; + const TYPE_TREASURY_RECEIVED_DEBIT_CREATED = 'treasury.received_debit.created'; + + /** + * List events, going back up to 30 days. Each event data is rendered according to + * Stripe API version at its creation time, specified in event object + * api_version attribute (not according to your current Stripe API + * version or Stripe-Version header). + * + * @param null|array{created?: array|int, delivery_success?: bool, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, type?: string, types?: string[]} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an event if it was created in the last 30 days. Supply + * the unique identifier of the event, which you might have received in a webhook. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Event + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/EventData/V1BillingMeterErrorReportTriggeredEventData.php b/stripe-php/lib/EventData/V1BillingMeterErrorReportTriggeredEventData.php new file mode 100644 index 0000000..13c5f99 --- /dev/null +++ b/stripe-php/lib/EventData/V1BillingMeterErrorReportTriggeredEventData.php @@ -0,0 +1,13 @@ +data when fetched from /v2/events. + * @property (object{error_count: int, error_types: (object{code: string, error_count: int, sample_errors: (object{error_message: string, request: (object{identifier: string}&\Stripe\StripeObject)}&\Stripe\StripeObject)[]}&\Stripe\StripeObject)[]}&\Stripe\StripeObject) $reason This contains information about why meter error happens. + * @property int $validation_end The end of the window that is encapsulated by this summary. + * @property int $validation_start The start of the window that is encapsulated by this summary. + */ +class V1BillingMeterErrorReportTriggeredEventData extends \Stripe\StripeObject {} diff --git a/stripe-php/lib/EventData/V1BillingMeterNoMeterFoundEventData.php b/stripe-php/lib/EventData/V1BillingMeterNoMeterFoundEventData.php new file mode 100644 index 0000000..f7e85f6 --- /dev/null +++ b/stripe-php/lib/EventData/V1BillingMeterNoMeterFoundEventData.php @@ -0,0 +1,13 @@ +data when fetched from /v2/events. + * @property (object{error_count: int, error_types: (object{code: string, error_count: int, sample_errors: (object{error_message: string, request: (object{identifier: string}&\Stripe\StripeObject)}&\Stripe\StripeObject)[]}&\Stripe\StripeObject)[]}&\Stripe\StripeObject) $reason This contains information about why meter error happens. + * @property int $validation_end The end of the window that is encapsulated by this summary. + * @property int $validation_start The start of the window that is encapsulated by this summary. + */ +class V1BillingMeterNoMeterFoundEventData extends \Stripe\StripeObject {} diff --git a/stripe-php/lib/Events/UnknownEventNotification.php b/stripe-php/lib/Events/UnknownEventNotification.php new file mode 100644 index 0000000..72b9fee --- /dev/null +++ b/stripe-php/lib/Events/UnknownEventNotification.php @@ -0,0 +1,25 @@ +related_object->url); + list($object, $options) = $this->_request('get', $this->related_object->url, [], [ + 'stripe_context' => $this->context, + ], [], $apiMode); + + return \Stripe\Util\Util::convertToStripeObject($object, $options, $apiMode); + } + + public static function constructFrom($values, $opts = null, $apiMode = 'v2') + { + $evt = parent::constructFrom($values, $opts, $apiMode); + if (null !== $evt->data) { + $evt->data = \Stripe\EventData\V1BillingMeterErrorReportTriggeredEventData::constructFrom($evt->data, $opts, $apiMode); + } + + return $evt; + } +} diff --git a/stripe-php/lib/Events/V1BillingMeterErrorReportTriggeredEventNotification.php b/stripe-php/lib/Events/V1BillingMeterErrorReportTriggeredEventNotification.php new file mode 100644 index 0000000..6299adf --- /dev/null +++ b/stripe-php/lib/Events/V1BillingMeterErrorReportTriggeredEventNotification.php @@ -0,0 +1,38 @@ +data) { + $evt->data = \Stripe\EventData\V1BillingMeterNoMeterFoundEventData::constructFrom($evt->data, $opts, $apiMode); + } + + return $evt; + } +} diff --git a/stripe-php/lib/Events/V1BillingMeterNoMeterFoundEventNotification.php b/stripe-php/lib/Events/V1BillingMeterNoMeterFoundEventNotification.php new file mode 100644 index 0000000..ee42fac --- /dev/null +++ b/stripe-php/lib/Events/V1BillingMeterNoMeterFoundEventNotification.php @@ -0,0 +1,22 @@ +related_object->url); + list($object, $options) = $this->_request('get', $this->related_object->url, [], [ + 'stripe_context' => $this->context, + ], [], $apiMode); + + return \Stripe\Util\Util::convertToStripeObject($object, $options, $apiMode); + } +} diff --git a/stripe-php/lib/Events/V2CoreEventDestinationPingEventNotification.php b/stripe-php/lib/Events/V2CoreEventDestinationPingEventNotification.php new file mode 100644 index 0000000..f96de39 --- /dev/null +++ b/stripe-php/lib/Events/V2CoreEventDestinationPingEventNotification.php @@ -0,0 +1,38 @@ +setHttpStatus($httpStatus); + $instance->setHttpBody($httpBody); + $instance->setJsonBody($jsonBody); + $instance->setHttpHeaders($httpHeaders); + $instance->setStripeCode($stripeCode); + + $instance->setRequestId(null); + if ($httpHeaders && isset($httpHeaders['Request-Id'])) { + $instance->setRequestId($httpHeaders['Request-Id']); + } + + $instance->setError($instance->constructErrorObject()); + + return $instance; + } + + /** + * Gets the Stripe error object. + * + * @return null|\Stripe\ErrorObject + */ + public function getError() + { + return $this->error; + } + + /** + * Sets the Stripe error object. + * + * @param null|\Stripe\ErrorObject $error + */ + public function setError($error) + { + $this->error = $error; + } + + /** + * Gets the HTTP body as a string. + * + * @return null|string + */ + public function getHttpBody() + { + return $this->httpBody; + } + + /** + * Sets the HTTP body as a string. + * + * @param null|string $httpBody + */ + public function setHttpBody($httpBody) + { + $this->httpBody = $httpBody; + } + + /** + * Gets the HTTP headers array. + * + * @return null|array|\Stripe\Util\CaseInsensitiveArray + */ + public function getHttpHeaders() + { + return $this->httpHeaders; + } + + /** + * Sets the HTTP headers array. + * + * @param null|array|\Stripe\Util\CaseInsensitiveArray $httpHeaders + */ + public function setHttpHeaders($httpHeaders) + { + $this->httpHeaders = $httpHeaders; + } + + /** + * Gets the HTTP status code. + * + * @return null|int + */ + public function getHttpStatus() + { + return $this->httpStatus; + } + + /** + * Sets the HTTP status code. + * + * @param null|int $httpStatus + */ + public function setHttpStatus($httpStatus) + { + $this->httpStatus = $httpStatus; + } + + /** + * Gets the JSON deserialized body. + * + * @return null|array + */ + public function getJsonBody() + { + return $this->jsonBody; + } + + /** + * Sets the JSON deserialized body. + * + * @param null|array $jsonBody + */ + public function setJsonBody($jsonBody) + { + $this->jsonBody = $jsonBody; + } + + /** + * Gets the Stripe request ID. + * + * @return null|string + */ + public function getRequestId() + { + return $this->requestId; + } + + /** + * Sets the Stripe request ID. + * + * @param null|string $requestId + */ + public function setRequestId($requestId) + { + $this->requestId = $requestId; + } + + /** + * Gets the Stripe error code. + * + * Cf. the `CODE_*` constants on {@see \Stripe\ErrorObject} for possible + * values. + * + * @return null|string + */ + public function getStripeCode() + { + return $this->stripeCode; + } + + /** + * Sets the Stripe error code. + * + * @param null|string $stripeCode + */ + public function setStripeCode($stripeCode) + { + $this->stripeCode = $stripeCode; + } + + /** + * Returns the string representation of the exception. + * + * @return string + */ + public function __toString() + { + $parentStr = parent::__toString(); + $statusStr = (null === $this->getHttpStatus()) ? '' : "(Status {$this->getHttpStatus()}) "; + $idStr = (null === $this->getRequestId()) ? '' : "(Request {$this->getRequestId()}) "; + + return "Error sending request to Stripe: {$statusStr}{$idStr}{$this->getMessage()}\n{$parentStr}"; + } + + protected function constructErrorObject() + { + if (null === $this->jsonBody || !\array_key_exists('error', $this->jsonBody)) { + return null; + } + + return \Stripe\ErrorObject::constructFrom($this->jsonBody['error']); + } +} diff --git a/stripe-php/lib/Exception/AuthenticationException.php b/stripe-php/lib/Exception/AuthenticationException.php new file mode 100644 index 0000000..74a6df6 --- /dev/null +++ b/stripe-php/lib/Exception/AuthenticationException.php @@ -0,0 +1,9 @@ +setDeclineCode($declineCode); + $instance->setStripeParam($stripeParam); + + return $instance; + } + + /** + * Gets the decline code. + * + * @return null|string + */ + public function getDeclineCode() + { + return $this->declineCode; + } + + /** + * Sets the decline code. + * + * @param null|string $declineCode + */ + public function setDeclineCode($declineCode) + { + $this->declineCode = $declineCode; + } + + /** + * Gets the parameter related to the error. + * + * @return null|string + */ + public function getStripeParam() + { + return $this->stripeParam; + } + + /** + * Sets the parameter related to the error. + * + * @param null|string $stripeParam + */ + public function setStripeParam($stripeParam) + { + $this->stripeParam = $stripeParam; + } +} diff --git a/stripe-php/lib/Exception/ExceptionInterface.php b/stripe-php/lib/Exception/ExceptionInterface.php new file mode 100644 index 0000000..e15fb50 --- /dev/null +++ b/stripe-php/lib/Exception/ExceptionInterface.php @@ -0,0 +1,18 @@ +setStripeParam($stripeParam); + + return $instance; + } + + /** + * Gets the parameter related to the error. + * + * @return null|string + */ + public function getStripeParam() + { + return $this->stripeParam; + } + + /** + * Sets the parameter related to the error. + * + * @param null|string $stripeParam + */ + public function setStripeParam($stripeParam) + { + $this->stripeParam = $stripeParam; + } +} diff --git a/stripe-php/lib/Exception/OAuth/ExceptionInterface.php b/stripe-php/lib/Exception/OAuth/ExceptionInterface.php new file mode 100644 index 0000000..bdb9173 --- /dev/null +++ b/stripe-php/lib/Exception/OAuth/ExceptionInterface.php @@ -0,0 +1,8 @@ +jsonBody) { + return null; + } + + return \Stripe\OAuthErrorObject::constructFrom($this->jsonBody); + } +} diff --git a/stripe-php/lib/Exception/OAuth/UnknownOAuthErrorException.php b/stripe-php/lib/Exception/OAuth/UnknownOAuthErrorException.php new file mode 100644 index 0000000..2413aeb --- /dev/null +++ b/stripe-php/lib/Exception/OAuth/UnknownOAuthErrorException.php @@ -0,0 +1,10 @@ +setHttpBody($httpBody); + $instance->setSigHeader($sigHeader); + + return $instance; + } + + /** + * Gets the HTTP body as a string. + * + * @return null|string + */ + public function getHttpBody() + { + return $this->httpBody; + } + + /** + * Sets the HTTP body as a string. + * + * @param null|string $httpBody + */ + public function setHttpBody($httpBody) + { + $this->httpBody = $httpBody; + } + + /** + * Gets the `Stripe-Signature` HTTP header. + * + * @return null|string + */ + public function getSigHeader() + { + return $this->sigHeader; + } + + /** + * Sets the `Stripe-Signature` HTTP header. + * + * @param null|string $sigHeader + */ + public function setSigHeader($sigHeader) + { + $this->sigHeader = $sigHeader; + } +} diff --git a/stripe-php/lib/Exception/TemporarySessionExpiredException.php b/stripe-php/lib/Exception/TemporarySessionExpiredException.php new file mode 100644 index 0000000..9e00cee --- /dev/null +++ b/stripe-php/lib/Exception/TemporarySessionExpiredException.php @@ -0,0 +1,7 @@ +ExchangeRate APIs are deprecated. Please use the FX Quotes API instead. + * + * ExchangeRate objects allow you to determine the rates that Stripe is currently + * using to convert from one currency to another. Since this number is variable + * throughout the day, there are various reasons why you might want to know the current + * rate (for example, to dynamically price an item for a user with a default + * payment in a foreign currency). + * + * Please refer to our Exchange Rates API guide for more details. + * + * [Note: this integration path is supported but no longer recommended] Additionally, + * you can guarantee that a charge is made with an exchange rate that you expect is + * current. To do so, you must pass in the exchange_rate to charges endpoints. If the + * value is no longer up to date, the charge won't go through. Please refer to our + * Using with charges guide for more details. + * + * ----- + * + * + * + * This Exchange Rates API is a Beta Service and is subject to Stripe's terms of service. You may use the API solely for the purpose of transacting on Stripe. For example, the API may be queried in order to: + * + * - localize prices for processing payments on Stripe + * - reconcile Stripe transactions + * - determine how much money to send to a connected account + * - determine app fees to charge a connected account + * + * Using this Exchange Rates API beta for any purpose other than to transact on Stripe is strictly prohibited and constitutes a violation of Stripe's terms of service. + * + * @property string $id Unique identifier for the object. Represented as the three-letter ISO currency code in lowercase. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property StripeObject $rates Hash where the keys are supported currencies and the values are the exchange rate at which the base id currency converts to the key currency. + */ +class ExchangeRate extends ApiResource +{ + const OBJECT_NAME = 'exchange_rate'; + + /** + * [Deprecated] The ExchangeRate APIs are deprecated. Please use the + * FX + * Quotes API instead. + * + * Returns a list of objects that contain the rates at which foreign currencies are + * converted to one another. Only shows the currencies for which Stripe supports. + * + * @deprecated this method is deprecated, please refer to the description for details + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * [Deprecated] The ExchangeRate APIs are deprecated. Please use the + * FX + * Quotes API instead. + * + * Retrieves the exchange rates from the given currency to every supported + * currency. + * + * @deprecated this method is deprecated, please refer to the description for details + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return ExchangeRate + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/File.php b/stripe-php/lib/File.php new file mode 100644 index 0000000..2002bad --- /dev/null +++ b/stripe-php/lib/File.php @@ -0,0 +1,122 @@ +create file request + * (for example, when uploading dispute evidence). Stripe also + * creates files independently (for example, the results of a Sigma scheduled + * query). + * + * Related guide: File upload guide + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|int $expires_at The file expires and isn't available at this time in epoch seconds. + * @property null|string $filename The suitable name for saving the file to a filesystem. + * @property null|Collection $links A list of file links that point at this file. + * @property string $purpose The purpose of the uploaded file. + * @property int $size The size of the file object in bytes. + * @property null|string $title A suitable title for the document. + * @property null|string $type The returned file type (for example, csv, pdf, jpg, or png). + * @property null|string $url Use your live secret API key to download the file from this URL. + */ +class File extends ApiResource +{ + const OBJECT_NAME = 'file'; + + const PURPOSE_ACCOUNT_REQUIREMENT = 'account_requirement'; + const PURPOSE_ADDITIONAL_VERIFICATION = 'additional_verification'; + const PURPOSE_BUSINESS_ICON = 'business_icon'; + const PURPOSE_BUSINESS_LOGO = 'business_logo'; + const PURPOSE_CUSTOMER_SIGNATURE = 'customer_signature'; + const PURPOSE_DISPUTE_EVIDENCE = 'dispute_evidence'; + const PURPOSE_DOCUMENT_PROVIDER_IDENTITY_DOCUMENT = 'document_provider_identity_document'; + const PURPOSE_FINANCE_REPORT_RUN = 'finance_report_run'; + const PURPOSE_FINANCIAL_ACCOUNT_STATEMENT = 'financial_account_statement'; + const PURPOSE_IDENTITY_DOCUMENT = 'identity_document'; + const PURPOSE_IDENTITY_DOCUMENT_DOWNLOADABLE = 'identity_document_downloadable'; + const PURPOSE_ISSUING_REGULATORY_REPORTING = 'issuing_regulatory_reporting'; + const PURPOSE_PCI_DOCUMENT = 'pci_document'; + const PURPOSE_PLATFORM_TERMS_OF_SERVICE = 'platform_terms_of_service'; + const PURPOSE_SELFIE = 'selfie'; + const PURPOSE_SIGMA_SCHEDULED_QUERY = 'sigma_scheduled_query'; + const PURPOSE_TAX_DOCUMENT_USER_UPLOAD = 'tax_document_user_upload'; + const PURPOSE_TERMINAL_ANDROID_APK = 'terminal_android_apk'; + const PURPOSE_TERMINAL_READER_SPLASHSCREEN = 'terminal_reader_splashscreen'; + + /** + * Returns a list of the files that your account has access to. Stripe sorts and + * returns the files by their creation dates, placing the most recently created + * files at the top. + * + * @param null|array{created?: array|int, ending_before?: string, expand?: string[], limit?: int, purpose?: string, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an existing file object. After you supply a unique file + * ID, Stripe returns the corresponding file object. Learn how to access file contents. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return File + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + // This resource can have two different object names. In latter API + // versions, only `file` is used, but since stripe-php may be used with + // any API version, we need to support deserializing the older + // `file_upload` object into the same class. + const OBJECT_NAME_ALT = 'file_upload'; + + use ApiOperations\Create { + create as protected _create; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return File the created file + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + if (null === $opts->apiBase) { + $opts->apiBase = Stripe::$apiUploadBase; + } + // Manually flatten params, otherwise curl's multipart encoder will + // choke on nested arrays. + $flatParams = \array_column(Util\Util::flattenParams($params), 1, 0); + + return static::_create($flatParams, $opts); + } +} diff --git a/stripe-php/lib/FileLink.php b/stripe-php/lib/FileLink.php new file mode 100644 index 0000000..6e786a1 --- /dev/null +++ b/stripe-php/lib/FileLink.php @@ -0,0 +1,108 @@ +File object with non-Stripe users, you can + * create a FileLink. FileLinks contain a URL that you can use to + * retrieve the contents of the file without authentication. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property bool $expired Returns if the link is already expired. + * @property null|int $expires_at Time that the link expires. + * @property File|string $file The file object this link points to. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $url The publicly accessible URL to download the file. + */ +class FileLink extends ApiResource +{ + const OBJECT_NAME = 'file_link'; + + use ApiOperations\Update; + + /** + * Creates a new file link object. + * + * @param null|array{expand?: string[], expires_at?: int, file: string, metadata?: null|array} $params + * @param null|array|string $options + * + * @return FileLink the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of file links. + * + * @param null|array{created?: array|int, ending_before?: string, expand?: string[], expired?: bool, file?: string, limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the file link with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return FileLink + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates an existing file link object. Expired links can no longer be updated. + * + * @param string $id the ID of the resource to update + * @param null|array{expand?: string[], expires_at?: null|array|int|string, metadata?: null|array} $params + * @param null|array|string $opts + * + * @return FileLink the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/FinancialConnections/Account.php b/stripe-php/lib/FinancialConnections/Account.php new file mode 100644 index 0000000..2a8fe28 --- /dev/null +++ b/stripe-php/lib/FinancialConnections/Account.php @@ -0,0 +1,173 @@ +subcategory. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $display_name A human-readable name that has been assigned to this account, either by the account holder or by the institution. + * @property string $institution_name The name of the institution that holds this account. + * @property null|string $last4 The last 4 digits of the account number. If present, this will be 4 numeric characters. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|AccountOwnership|string $ownership The most recent information about the account's owners. + * @property null|(object{last_attempted_at: int, next_refresh_available_at: null|int, status: string}&\Stripe\StripeObject) $ownership_refresh The state of the most recent attempt to refresh the account owners. + * @property null|string[] $permissions The list of permissions granted by this account. + * @property string $status The status of the link to the account. + * @property string $subcategory

If category is cash, one of:

- checking - savings - other

If category is credit, one of:

- mortgage - line_of_credit - credit_card - other

If category is investment or other, this will be other.

+ * @property null|string[] $subscriptions The list of data refresh subscriptions requested on this account. + * @property string[] $supported_payment_method_types The PaymentMethod type(s) that can be created from this account. + * @property null|(object{id: string, last_attempted_at: int, next_refresh_available_at: null|int, status: string}&\Stripe\StripeObject) $transaction_refresh The state of the most recent attempt to refresh the account transactions. + */ +class Account extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'financial_connections.account'; + + const CATEGORY_CASH = 'cash'; + const CATEGORY_CREDIT = 'credit'; + const CATEGORY_INVESTMENT = 'investment'; + const CATEGORY_OTHER = 'other'; + + const STATUS_ACTIVE = 'active'; + const STATUS_DISCONNECTED = 'disconnected'; + const STATUS_INACTIVE = 'inactive'; + + const SUBCATEGORY_CHECKING = 'checking'; + const SUBCATEGORY_CREDIT_CARD = 'credit_card'; + const SUBCATEGORY_LINE_OF_CREDIT = 'line_of_credit'; + const SUBCATEGORY_MORTGAGE = 'mortgage'; + const SUBCATEGORY_OTHER = 'other'; + const SUBCATEGORY_SAVINGS = 'savings'; + + /** + * Returns a list of Financial Connections Account objects. + * + * @param null|array{account_holder?: array{account?: string, customer?: string, customer_account?: string}, ending_before?: string, expand?: string[], limit?: int, session?: string, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an Financial Connections Account. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Account the disconnected account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function disconnect($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/disconnect'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param string $id + * @param null|array $params + * @param null|array|string $opts + * + * @return \Stripe\Collection list of account owners + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function allOwners($id, $params = null, $opts = null) + { + $url = static::resourceUrl($id) . '/owners'; + list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Account the refreshed account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function refreshAccount($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/refresh'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Account the subscribed account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function subscribe($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/subscribe'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Account the unsubscribed account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function unsubscribe($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/unsubscribe'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/FinancialConnections/AccountOwner.php b/stripe-php/lib/FinancialConnections/AccountOwner.php new file mode 100644 index 0000000..57d0a7b --- /dev/null +++ b/stripe-php/lib/FinancialConnections/AccountOwner.php @@ -0,0 +1,22 @@ + $owners A paginated list of owners for this account. + */ +class AccountOwnership extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'financial_connections.account_ownership'; +} diff --git a/stripe-php/lib/FinancialConnections/Session.php b/stripe-php/lib/FinancialConnections/Session.php new file mode 100644 index 0000000..db8bc2b --- /dev/null +++ b/stripe-php/lib/FinancialConnections/Session.php @@ -0,0 +1,67 @@ + $accounts The accounts that were collected as part of this Session. + * @property null|string $client_secret A value that will be passed to the client to launch the authentication flow. + * @property null|(object{account_subcategories: null|string[], countries: null|string[]}&\Stripe\StripeObject) $filters + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string[] $permissions Permissions requested for accounts collected during this session. + * @property null|string[] $prefetch Data features requested to be retrieved upon account creation. + * @property null|string $return_url For webview integrations only. Upon completing OAuth login in the native browser, the user will be redirected to this URL to return to your app. + */ +class Session extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'financial_connections.session'; + + /** + * To launch the Financial Connections authorization flow, create a + * Session. The session’s client_secret can be used to + * launch the flow using Stripe.js. + * + * @param null|array{account_holder: array{account?: string, customer?: string, customer_account?: string, type: string}, expand?: string[], filters?: array{account_subcategories?: string[], countries?: string[]}, permissions: string[], prefetch?: string[], return_url?: string} $params + * @param null|array|string $options + * + * @return Session the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Retrieves the details of a Financial Connections Session. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Session + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/FinancialConnections/Transaction.php b/stripe-php/lib/FinancialConnections/Transaction.php new file mode 100644 index 0000000..68a9526 --- /dev/null +++ b/stripe-php/lib/FinancialConnections/Transaction.php @@ -0,0 +1,66 @@ +ISO currency code, in lowercase. Must be a supported currency. + * @property string $description The description of this transaction. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $status The status of the transaction. + * @property (object{posted_at: null|int, void_at: null|int}&\Stripe\StripeObject) $status_transitions + * @property int $transacted_at Time at which the transaction was transacted. Measured in seconds since the Unix epoch. + * @property string $transaction_refresh The token of the transaction refresh that last updated or created this transaction. + * @property int $updated Time at which the object was last updated. Measured in seconds since the Unix epoch. + */ +class Transaction extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'financial_connections.transaction'; + + const STATUS_PENDING = 'pending'; + const STATUS_POSTED = 'posted'; + const STATUS_VOID = 'void'; + + /** + * Returns a list of Financial Connections Transaction objects. + * + * @param null|array{account: string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, transacted_at?: array|int, transaction_refresh?: array{after: string}} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves the details of a Financial Connections Transaction. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Transaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Forwarding/Request.php b/stripe-php/lib/Forwarding/Request.php new file mode 100644 index 0000000..e6dcc12 --- /dev/null +++ b/stripe-php/lib/Forwarding/Request.php @@ -0,0 +1,98 @@ +Forward card details to third-party API endpoints. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $payment_method The PaymentMethod to insert into the forwarded request. Forwarding previously consumed PaymentMethods is allowed. + * @property string[] $replacements The field kinds to be replaced in the forwarded request. + * @property null|(object{destination_duration: int, destination_ip_address: string}&\Stripe\StripeObject) $request_context Context about the request from Stripe's servers to the destination endpoint. + * @property null|(object{body: string, headers: (object{name: string, value: string}&\Stripe\StripeObject)[], http_method: string}&\Stripe\StripeObject) $request_details The request that was sent to the destination endpoint. We redact any sensitive fields. + * @property null|(object{body: string, headers: (object{name: string, value: string}&\Stripe\StripeObject)[], status: int}&\Stripe\StripeObject) $response_details The response that the destination endpoint returned to us. We redact any sensitive fields. + * @property null|string $url The destination URL for the forwarded request. Must be supported by the config. + */ +class Request extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'forwarding.request'; + + /** + * Creates a ForwardingRequest object. + * + * @param null|array{expand?: string[], metadata?: array, payment_method: string, replacements: string[], request: array{body?: string, headers?: array{name: string, value: string}[]}, url: string} $params + * @param null|array|string $options + * + * @return Request the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Lists all ForwardingRequest objects. + * + * @param null|array{created?: array{gt?: int, gte?: int, lt?: int, lte?: int}, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a ForwardingRequest object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Request + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/FundingInstructions.php b/stripe-php/lib/FundingInstructions.php new file mode 100644 index 0000000..3e8cf3e --- /dev/null +++ b/stripe-php/lib/FundingInstructions.php @@ -0,0 +1,25 @@ +balance that is + * automatically applied to future invoices and payments using the customer_balance payment method. + * Customers can fund this balance by initiating a bank transfer to any account in the + * financial_addresses field. + * Related guide: Customer balance funding instructions. + * + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property (object{country: string, financial_addresses: ((object{aba?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, account_number: string, account_type: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_name: string, routing_number: string}&StripeObject), iban?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bic: string, country: string, iban: string}&StripeObject), sort_code?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, account_number: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), sort_code: string}&StripeObject), spei?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_code: string, bank_name: string, clabe: string}&StripeObject), supported_networks?: string[], swift?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, account_number: string, account_type: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_name: string, swift_code: string}&StripeObject), type: string, zengin?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: null|string, account_number: null|string, account_type: null|string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_code: null|string, bank_name: null|string, branch_code: null|string, branch_name: null|string}&StripeObject)}&StripeObject))[], type: string}&StripeObject) $bank_transfer + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property string $funding_type The funding_type of the returned instructions + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + */ +class FundingInstructions extends ApiResource +{ + const OBJECT_NAME = 'funding_instructions'; + + const FUNDING_TYPE_BANK_TRANSFER = 'bank_transfer'; +} diff --git a/stripe-php/lib/HttpClient/ClientInterface.php b/stripe-php/lib/HttpClient/ClientInterface.php new file mode 100644 index 0000000..a86b761 --- /dev/null +++ b/stripe-php/lib/HttpClient/ClientInterface.php @@ -0,0 +1,24 @@ +defaultOptions = $defaultOptions; + $this->randomGenerator = $randomGenerator ?: new Util\RandomGenerator(); + $this->initUserAgentInfo(); + + $this->enableHttp2 = $this->canSafelyUseHttp2(); + } + + public function __destruct() + { + $this->closeCurlHandle(); + } + + public function initUserAgentInfo() + { + $curlVersion = \curl_version(); + $this->userAgentInfo = [ + 'httplib' => 'curl ' . $curlVersion['version'], + 'ssllib' => $curlVersion['ssl_version'], + ]; + } + + public function getDefaultOptions() + { + return $this->defaultOptions; + } + + public function getUserAgentInfo() + { + return $this->userAgentInfo; + } + + /** + * @return bool + */ + public function getEnablePersistentConnections() + { + return $this->enablePersistentConnections; + } + + /** + * @param bool $enable + */ + public function setEnablePersistentConnections($enable) + { + $this->enablePersistentConnections = $enable; + } + + /** + * @return bool + */ + public function getEnableHttp2() + { + return $this->enableHttp2; + } + + /** + * @param bool $enable + */ + public function setEnableHttp2($enable) + { + $this->enableHttp2 = $enable; + } + + /** + * @return null|callable + */ + public function getRequestStatusCallback() + { + return $this->requestStatusCallback; + } + + /** + * Sets a callback that is called after each request. The callback will + * receive the following parameters: + *
    + *
  1. string $rbody The response body
  2. + *
  3. integer $rcode The response status code
  4. + *
  5. \Stripe\Util\CaseInsensitiveArray $rheaders The response headers
  6. + *
  7. integer $errno The curl error number
  8. + *
  9. string|null $message The curl error message
  10. + *
  11. boolean $shouldRetry Whether the request will be retried
  12. + *
  13. integer $numRetries The number of the retry attempt
  14. + *
. + * + * @param null|callable $requestStatusCallback + */ + public function setRequestStatusCallback($requestStatusCallback) + { + $this->requestStatusCallback = $requestStatusCallback; + } + + // USER DEFINED TIMEOUTS + + const DEFAULT_TIMEOUT = 80; + const DEFAULT_CONNECT_TIMEOUT = 30; + + private $timeout = self::DEFAULT_TIMEOUT; + private $connectTimeout = self::DEFAULT_CONNECT_TIMEOUT; + + public function setTimeout($seconds) + { + $this->timeout = (int) \max($seconds, 0); + + return $this; + } + + public function setConnectTimeout($seconds) + { + $this->connectTimeout = (int) \max($seconds, 0); + + return $this; + } + + public function getTimeout() + { + return $this->timeout; + } + + public function getConnectTimeout() + { + return $this->connectTimeout; + } + + // END OF USER DEFINED TIMEOUTS + + /** + * @param 'delete'|'get'|'post' $method + * @param string $absUrl + * @param string $params + * @param bool $hasFile + * @param 'v1'|'v2' $apiMode + */ + private function constructUrlAndBody($method, $absUrl, $params, $hasFile, $apiMode) + { + $params = Util\Util::objectsToIds($params); + if ('post' === $method) { + $absUrl = Util\Util::utf8($absUrl); + if ($hasFile) { + return [$absUrl, $params]; + } + if ('v2' === $apiMode) { + if (\is_array($params) && 0 === \count($params)) { + // Send a request with empty body if we have no params set + // Setting the second parameter as null prevents the CURLOPT_POSTFIELDS + // from being set with the '[]', which is result of `json_encode([]). + return [$absUrl, null]; + } + + return [$absUrl, \json_encode($params)]; + } + + return [$absUrl, Util\Util::encodeParameters($params)]; + } + if ($hasFile) { + throw new Exception\UnexpectedValueException("Unexpected. {$method} methods don't support file attachments"); + } + if (0 === \count($params)) { + return [Util\Util::utf8($absUrl), null]; + } + $encoded = Util\Util::encodeParameters($params, $apiMode); + + $absUrl = "{$absUrl}?{$encoded}"; + $absUrl = Util\Util::utf8($absUrl); + + return [$absUrl, null]; + } + + private function calculateDefaultOptions($method, $absUrl, $headers, $params, $hasFile) + { + if (\is_callable($this->defaultOptions)) { // call defaultOptions callback, set options to return value + $ret = \call_user_func_array($this->defaultOptions, [$method, $absUrl, $headers, $params, $hasFile]); + if (!\is_array($ret)) { + throw new Exception\UnexpectedValueException('Non-array value returned by defaultOptions CurlClient callback'); + } + + return $ret; + } + if (\is_array($this->defaultOptions)) { // set default curlopts from array + return $this->defaultOptions; + } + + return []; + } + + private function constructCurlOptions($method, $absUrl, $headers, $body, $opts, $apiMode) + { + if ('get' === $method) { + $opts[\CURLOPT_HTTPGET] = 1; + } elseif ('post' === $method) { + $opts[\CURLOPT_POST] = 1; + } elseif ('delete' === $method) { + $opts[\CURLOPT_CUSTOMREQUEST] = 'DELETE'; + } else { + throw new Exception\UnexpectedValueException("Unrecognized method {$method}"); + } + + if ($body) { + $opts[\CURLOPT_POSTFIELDS] = $body; + } + // inspired by https://github.com/stripe/stripe-php/issues/1817#issuecomment-2670463182 + elseif (isset($opts[\CURLOPT_POST]) && 1 === $opts[\CURLOPT_POST]) { + $opts[\CURLOPT_POSTFIELDS] = ''; + } + + // this is a little verbose, but makes v1 vs v2 behavior really clear + if (!$this->hasHeader($headers, 'Idempotency-Key')) { + // all v2 requests should have an IK + if ('v2' === $apiMode) { + if ('post' === $method || 'delete' === $method) { + $headers[] = 'Idempotency-Key: ' . $this->randomGenerator->uuid(); + } + } else { + // v1 requests should keep old behavior for consistency + if ('post' === $method && Stripe::$maxNetworkRetries > 0) { + $headers[] = 'Idempotency-Key: ' . $this->randomGenerator->uuid(); + } + } + } + + // By default for large request body sizes (> 1024 bytes), cURL will + // send a request without a body and with a `Expect: 100-continue` + // header, which gives the server a chance to respond with an error + // status code in cases where one can be determined right away (say + // on an authentication problem for example), and saves the "large" + // request body from being ever sent. + // + // Unfortunately, the bindings don't currently correctly handle the + // success case (in which the server sends back a 100 CONTINUE), so + // we'll error under that condition. To compensate for that problem + // for the time being, override cURL's behavior by simply always + // sending an empty `Expect:` header. + $headers[] = 'Expect: '; + + $opts[\CURLOPT_URL] = $absUrl; + $opts[\CURLOPT_RETURNTRANSFER] = true; + $opts[\CURLOPT_CONNECTTIMEOUT] = $this->connectTimeout; + $opts[\CURLOPT_TIMEOUT] = $this->timeout; + $opts[\CURLOPT_HTTPHEADER] = $headers; + $opts[\CURLOPT_CAINFO] = Stripe::getCABundlePath(); + if (!Stripe::getVerifySslCerts()) { + $opts[\CURLOPT_SSL_VERIFYPEER] = false; + } + + if (!isset($opts[\CURLOPT_HTTP_VERSION]) && $this->getEnableHttp2()) { + // For HTTPS requests, enable HTTP/2, if supported + $opts[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_2TLS; + } + + return $opts; + } + + /** + * @param 'delete'|'get'|'post' $method + * @param string $absUrl + * @param array $headers + * @param array $params + * @param bool $hasFile + * @param 'v1'|'v2' $apiMode + */ + private function constructRequest($method, $absUrl, $headers, $params, $hasFile, $apiMode) + { + $method = \strtolower($method); + + $opts = $this->calculateDefaultOptions($method, $absUrl, $headers, $params, $hasFile); + list($absUrl, $body) = $this->constructUrlAndBody($method, $absUrl, $params, $hasFile, $apiMode); + $opts = $this->constructCurlOptions($method, $absUrl, $headers, $body, $opts, $apiMode); + + return [$opts, $absUrl]; + } + + /** + * @param 'delete'|'get'|'post' $method + * @param string $absUrl + * @param array $headers + * @param array $params + * @param bool $hasFile + * @param 'v1'|'v2' $apiMode + * @param null|int $maxNetworkRetries + */ + public function request($method, $absUrl, $headers, $params, $hasFile, $apiMode = 'v1', $maxNetworkRetries = null) + { + list($opts, $absUrl) = $this->constructRequest($method, $absUrl, $headers, $params, $hasFile, $apiMode); + list($rbody, $rcode, $rheaders) = $this->executeRequestWithRetries($opts, $absUrl, $maxNetworkRetries); + + return [$rbody, $rcode, $rheaders]; + } + + /** + * @param 'delete'|'get'|'post' $method + * @param string $absUrl + * @param array $headers + * @param array $params + * @param bool $hasFile + * @param callable $readBodyChunk + * @param 'v1'|'v2' $apiMode + * @param null|int $maxNetworkRetries + */ + public function requestStream($method, $absUrl, $headers, $params, $hasFile, $readBodyChunk, $apiMode = 'v1', $maxNetworkRetries = null) + { + list($opts, $absUrl) = $this->constructRequest($method, $absUrl, $headers, $params, $hasFile, $apiMode); + $opts[\CURLOPT_RETURNTRANSFER] = false; + list($rbody, $rcode, $rheaders) = $this->executeStreamingRequestWithRetries($opts, $absUrl, $readBodyChunk, $maxNetworkRetries); + + return [$rbody, $rcode, $rheaders]; + } + + /** + * Curl permits sending \CURLOPT_HEADERFUNCTION, which is called with lines + * from the header and \CURLOPT_WRITEFUNCTION, which is called with bytes + * from the body. You usually want to handle the body differently depending + * on what was in the header. + * + * This function makes it easier to specify different callbacks depending + * on the contents of the heeder. After the header has been completely read + * and the body begins to stream, it will call $determineWriteCallback with + * the array of headers. $determineWriteCallback should, based on the + * headers it receives, return a "writeCallback" that describes what to do + * with the incoming HTTP response body. + * + * @param array $opts + * @param callable $determineWriteCallback + * + * @return array + */ + private function useHeadersToDetermineWriteCallback($opts, $determineWriteCallback) + { + $rheaders = new Util\CaseInsensitiveArray(); + $headerCallback = static function ($curl, $header_line) use (&$rheaders) { + return self::parseLineIntoHeaderArray($header_line, $rheaders); + }; + + $writeCallback = null; + $writeCallbackWrapper = static function ($curl, $data) use (&$writeCallback, &$rheaders, &$determineWriteCallback) { + if (null === $writeCallback) { + $writeCallback = \call_user_func_array($determineWriteCallback, [$rheaders]); + } + + return \call_user_func_array($writeCallback, [$curl, $data]); + }; + + return [$headerCallback, $writeCallbackWrapper]; + } + + private static function parseLineIntoHeaderArray($line, &$headers) + { + if (false === \strpos($line, ':')) { + return \strlen($line); + } + list($key, $value) = \explode(':', \trim($line), 2); + $headers[\trim($key)] = \trim($value); + + return \strlen($line); + } + + /** + * Like `executeRequestWithRetries` except: + * 1. Does not buffer the body of a successful (status code < 300) + * response into memory -- instead, calls the caller-provided + * $readBodyChunk with each chunk of incoming data. + * 2. Does not retry if a network error occurs while streaming the + * body of a successful response. + * + * @param array $opts cURL options + * @param string $absUrl + * @param callable $readBodyChunk + * @param null|int $maxNetworkRetries + * + * @return array + */ + public function executeStreamingRequestWithRetries($opts, $absUrl, $readBodyChunk, $maxNetworkRetries = null) + { + /** @var bool */ + $shouldRetry = false; + /** @var int */ + $numRetries = 0; + + // Will contain the bytes of the body of the last request + // if it was not successful and should not be retries + /** @var null|string */ + $rbody = null; + + // Status code of the last request + /** @var null|bool */ + $rcode = null; + + // Array of headers from the last request + /** @var null|array */ + $lastRHeaders = null; + + $errno = null; + $message = null; + + $determineWriteCallback = function ($rheaders) use (&$readBodyChunk, &$shouldRetry, &$rbody, &$numRetries, &$rcode, &$lastRHeaders, &$errno, &$maxNetworkRetries) { + $lastRHeaders = $rheaders; + $errno = \curl_errno($this->curlHandle); + + $rcode = \curl_getinfo($this->curlHandle, \CURLINFO_HTTP_CODE); + + // Send the bytes from the body of a successful request to the caller-provided $readBodyChunk. + if ($rcode < 300) { + $rbody = null; + + return static function ($curl, $data) use (&$readBodyChunk) { + // Don't expose the $curl handle to the user, and don't require them to + // return the length of $data. + \call_user_func_array($readBodyChunk, [$data]); + + return \strlen($data); + }; + } + + $shouldRetry = $this->shouldRetry($errno, $rcode, $rheaders, $numRetries, $maxNetworkRetries); + + // Discard the body from an unsuccessful request that should be retried. + if ($shouldRetry) { + return static function ($curl, $data) { + return \strlen($data); + }; + } else { + // Otherwise, buffer the body into $rbody. It will need to be parsed to determine + // which exception to throw to the user. + $rbody = ''; + + return static function ($curl, $data) use (&$rbody) { + $rbody .= $data; + + return \strlen($data); + }; + } + }; + + while (true) { + list($headerCallback, $writeCallback) = $this->useHeadersToDetermineWriteCallback($opts, $determineWriteCallback); + $opts[\CURLOPT_HEADERFUNCTION] = $headerCallback; + $opts[\CURLOPT_WRITEFUNCTION] = $writeCallback; + + $shouldRetry = false; + $rbody = null; + $this->resetCurlHandle(); + \curl_setopt_array($this->curlHandle, $opts); + $result = \curl_exec($this->curlHandle); + $errno = \curl_errno($this->curlHandle); + if (0 !== $errno) { + $message = \curl_error($this->curlHandle); + } + if (!$this->getEnablePersistentConnections()) { + $this->closeCurlHandle(); + } + + if (\is_callable($this->getRequestStatusCallback())) { + \call_user_func_array( + $this->getRequestStatusCallback(), + [$rbody, $rcode, $lastRHeaders, $errno, $message, $shouldRetry, $numRetries] + ); + } + + if ($shouldRetry) { + ++$numRetries; + $sleepSeconds = $this->sleepTime($numRetries, $lastRHeaders); + \usleep((int) ($sleepSeconds * 1000000)); + } else { + break; + } + } + + if (0 !== $errno) { + $this->handleCurlError($absUrl, $errno, $message, $numRetries); + } + + return [$rbody, $rcode, $lastRHeaders]; + } + + /** + * @param array $opts cURL options + * @param string $absUrl + * @param null|int $maxNetworkRetries + */ + public function executeRequestWithRetries($opts, $absUrl, $maxNetworkRetries = null) + { + $numRetries = 0; + + while (true) { + $rcode = 0; + $errno = 0; + $message = null; + + // Create a callback to capture HTTP headers for the response + $rheaders = new Util\CaseInsensitiveArray(); + $headerCallback = static function ($curl, $header_line) use (&$rheaders) { + return CurlClient::parseLineIntoHeaderArray($header_line, $rheaders); + }; + $opts[\CURLOPT_HEADERFUNCTION] = $headerCallback; + + $this->resetCurlHandle(); + \curl_setopt_array($this->curlHandle, $opts); + $rbody = \curl_exec($this->curlHandle); + + if (false === $rbody) { + $errno = \curl_errno($this->curlHandle); + $message = \curl_error($this->curlHandle); + } else { + $rcode = \curl_getinfo($this->curlHandle, \CURLINFO_HTTP_CODE); + } + if (!$this->getEnablePersistentConnections()) { + $this->closeCurlHandle(); + } + + $shouldRetry = $this->shouldRetry($errno, $rcode, $rheaders, $numRetries, $maxNetworkRetries); + + if (\is_callable($this->getRequestStatusCallback())) { + \call_user_func_array( + $this->getRequestStatusCallback(), + [$rbody, $rcode, $rheaders, $errno, $message, $shouldRetry, $numRetries] + ); + } + + if ($shouldRetry) { + ++$numRetries; + $sleepSeconds = $this->sleepTime($numRetries, $rheaders); + \usleep((int) ($sleepSeconds * 1000000)); + } else { + break; + } + } + + if (false === $rbody) { + $this->handleCurlError($absUrl, $errno, $message, $numRetries); + } + + return [$rbody, $rcode, $rheaders]; + } + + /** + * @param string $url + * @param int $errno + * @param string $message + * @param int $numRetries + * + * @throws Exception\ApiConnectionException + */ + private function handleCurlError($url, $errno, $message, $numRetries) + { + switch ($errno) { + case \CURLE_COULDNT_CONNECT: + case \CURLE_COULDNT_RESOLVE_HOST: + case \CURLE_OPERATION_TIMEOUTED: + $msg = "Could not connect to Stripe ({$url}). Please check your " + . 'internet connection and try again. If this problem persists, ' + . "you should check Stripe's service status at " + . 'https://twitter.com/stripestatus, or'; + + break; + + case \CURLE_SSL_CACERT: + case \CURLE_SSL_PEER_CERTIFICATE: + $msg = "Could not verify Stripe's SSL certificate. Please make sure " + . 'that your network is not intercepting certificates. ' + . "(Try going to {$url} in your browser.) " + . 'If this problem persists,'; + + break; + + default: + $msg = 'Unexpected error communicating with Stripe. ' + . 'If this problem persists,'; + } + $msg .= ' let us know at support@stripe.com.'; + + $msg .= "\n\n(Network error [errno {$errno}]: {$message})"; + + if ($numRetries > 0) { + $msg .= "\n\nRequest was retried {$numRetries} times."; + } + + throw new Exception\ApiConnectionException($msg); + } + + /** + * Checks if an error is a problem that we should retry on. This includes both + * socket errors that may represent an intermittent problem and some special + * HTTP statuses. + * + * @param int $errno + * @param int $rcode + * @param array|Util\CaseInsensitiveArray $rheaders + * @param int $numRetries + * @param null|int $maxNetworkRetries + * + * @return bool + */ + private function shouldRetry($errno, $rcode, $rheaders, $numRetries, $maxNetworkRetries) + { + if (null === $maxNetworkRetries) { + // all calls from a StripeClient have a number here, so we only see `null` (and use the global configuration) if coming from a non-client call. + $maxNetworkRetries = Stripe::getMaxNetworkRetries(); + } + + if ($numRetries >= $maxNetworkRetries) { + return false; + } + + // Retry on timeout-related problems (either on open or read). + if (\CURLE_OPERATION_TIMEOUTED === $errno) { + return true; + } + + // Destination refused the connection, the connection was reset, or a + // variety of other connection failures. This could occur from a single + // saturated server, so retry in case it's intermittent. + if (\CURLE_COULDNT_CONNECT === $errno) { + return true; + } + + // The API may ask us not to retry (eg; if doing so would be a no-op) + // or advise us to retry (eg; in cases of lock timeouts); we defer to that. + if (isset($rheaders['stripe-should-retry'])) { + if ('false' === $rheaders['stripe-should-retry']) { + return false; + } + if ('true' === $rheaders['stripe-should-retry']) { + return true; + } + } + + // 409 Conflict + if (409 === $rcode) { + return true; + } + + // Retry on 500, 503, and other internal errors. + // + // Note that we expect the stripe-should-retry header to be false + // in most cases when a 500 is returned, since our idempotency framework + // would typically replay it anyway. + if ($rcode >= 500) { + return true; + } + + return false; + } + + /** + * Provides the number of seconds to wait before retrying a request. + * + * @param int $numRetries + * @param array|Util\CaseInsensitiveArray $rheaders + * + * @return int + */ + private function sleepTime($numRetries, $rheaders) + { + // Apply exponential backoff with $initialNetworkRetryDelay on the + // number of $numRetries so far as inputs. Do not allow the number to exceed + // $maxNetworkRetryDelay. + $sleepSeconds = \min( + Stripe::getInitialNetworkRetryDelay() * 1.0 * 2 ** ($numRetries - 1), + Stripe::getMaxNetworkRetryDelay() + ); + + // Apply some jitter by randomizing the value in the range of + // ($sleepSeconds / 2) to ($sleepSeconds). + $sleepSeconds *= 0.5 * (1 + $this->randomGenerator->randFloat()); + + // But never sleep less than the base sleep seconds. + $sleepSeconds = \max(Stripe::getInitialNetworkRetryDelay(), $sleepSeconds); + + // And never sleep less than the time the API asks us to wait, assuming it's a reasonable ask. + $retryAfter = isset($rheaders['retry-after']) ? (float) ($rheaders['retry-after']) : 0.0; + if (\floor($retryAfter) === $retryAfter && $retryAfter <= Stripe::getMaxRetryAfter()) { + $sleepSeconds = \max($sleepSeconds, $retryAfter); + } + + return $sleepSeconds; + } + + /** + * Initializes the curl handle. If already initialized, the handle is closed first. + */ + private function initCurlHandle() + { + $this->closeCurlHandle(); + $this->curlHandle = \curl_init(); + } + + /** + * Closes the curl handle if initialized. Do nothing if already closed. + */ + private function closeCurlHandle() + { + if (null !== $this->curlHandle) { + if (PHP_VERSION_ID < 80000) { + \curl_close($this->curlHandle); + } + $this->curlHandle = null; + } + } + + /** + * Resets the curl handle. If the handle is not already initialized, or if persistent + * connections are disabled, the handle is reinitialized instead. + */ + private function resetCurlHandle() + { + if (null !== $this->curlHandle && $this->getEnablePersistentConnections()) { + \curl_reset($this->curlHandle); + } else { + $this->initCurlHandle(); + } + } + + /** + * Indicates whether it is safe to use HTTP/2 or not. + * + * @return bool + */ + private function canSafelyUseHttp2() + { + // Versions of curl older than 7.60.0 don't respect GOAWAY frames + // (cf. https://github.com/curl/curl/issues/2416), which Stripe use. + $curlVersion = \curl_version()['version']; + + return \version_compare($curlVersion, '7.60.0') >= 0; + } + + /** + * Checks if a list of headers contains a specific header name. + * + * @param string[] $headers + * @param string $name + * + * @return bool + */ + private function hasHeader($headers, $name) + { + foreach ($headers as $header) { + if (0 === \strncasecmp($header, "{$name}: ", \strlen($name) + 2)) { + return true; + } + } + + return false; + } +} diff --git a/stripe-php/lib/HttpClient/StreamingClientInterface.php b/stripe-php/lib/HttpClient/StreamingClientInterface.php new file mode 100644 index 0000000..d01d6e6 --- /dev/null +++ b/stripe-php/lib/HttpClient/StreamingClientInterface.php @@ -0,0 +1,24 @@ +type and options + * parameters used. You can find the result of each verification check performed in the + * appropriate sub-resource: document, id_number, selfie. + * + * Each VerificationReport contains a copy of any data collected by the user as well as + * reference IDs which can be used to access collected images through the FileUpload + * API. To configure and create VerificationReports, use the + * VerificationSession API. + * + * Related guide: Accessing verification results. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|string $client_reference_id A string to reference this user. This can be a customer ID, a session ID, or similar, and can be used to reconcile this verification with your internal systems. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|(object{address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), dob?: null|(object{day: null|int, month: null|int, year: null|int}&\Stripe\StripeObject), error: null|(object{code: null|string, reason: null|string}&\Stripe\StripeObject), expiration_date?: null|(object{day: null|int, month: null|int, year: null|int}&\Stripe\StripeObject), files: null|string[], first_name: null|string, issued_date: null|(object{day: null|int, month: null|int, year: null|int}&\Stripe\StripeObject), issuing_country: null|string, last_name: null|string, number?: null|string, sex?: null|string, status: string, type: null|string, unparsed_place_of_birth?: null|string, unparsed_sex?: null|string}&\Stripe\StripeObject) $document Result from a document check + * @property null|(object{email: null|string, error: null|(object{code: null|string, reason: null|string}&\Stripe\StripeObject), status: string}&\Stripe\StripeObject) $email Result from a email check + * @property null|(object{dob?: null|(object{day: null|int, month: null|int, year: null|int}&\Stripe\StripeObject), error: null|(object{code: null|string, reason: null|string}&\Stripe\StripeObject), first_name: null|string, id_number?: null|string, id_number_type: null|string, last_name: null|string, status: string}&\Stripe\StripeObject) $id_number Result from an id_number check + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|(object{document?: (object{allowed_types?: string[], require_id_number?: bool, require_live_capture?: bool, require_matching_selfie?: bool}&\Stripe\StripeObject), id_number?: (object{}&\Stripe\StripeObject)}&\Stripe\StripeObject) $options + * @property null|(object{error: null|(object{code: null|string, reason: null|string}&\Stripe\StripeObject), phone: null|string, status: string}&\Stripe\StripeObject) $phone Result from a phone check + * @property null|(object{document: null|string, error: null|(object{code: null|string, reason: null|string}&\Stripe\StripeObject), selfie: null|string, status: string}&\Stripe\StripeObject) $selfie Result from a selfie check + * @property string $type Type of report. + * @property null|string $verification_flow The configuration token of a verification flow from the dashboard. + * @property null|string $verification_session ID of the VerificationSession that created this report. + */ +class VerificationReport extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'identity.verification_report'; + + const TYPE_DOCUMENT = 'document'; + const TYPE_ID_NUMBER = 'id_number'; + const TYPE_VERIFICATION_FLOW = 'verification_flow'; + + /** + * List all verification reports. + * + * @param null|array{client_reference_id?: string, created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, type?: string, verification_session?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves an existing VerificationReport. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return VerificationReport + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Identity/VerificationSession.php b/stripe-php/lib/Identity/VerificationSession.php new file mode 100644 index 0000000..2e68e67 --- /dev/null +++ b/stripe-php/lib/Identity/VerificationSession.php @@ -0,0 +1,187 @@ +verification + * check to perform. Only create one VerificationSession for + * each verification in your system. + * + * A VerificationSession transitions through multiple + * statuses throughout its lifetime as it progresses through + * the verification flow. The VerificationSession contains the user's verified data after + * verification checks are complete. + * + * Related guide: The Verification Sessions API + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|string $client_reference_id A string to reference this user. This can be a customer ID, a session ID, or similar, and can be used to reconcile this verification with your internal systems. + * @property null|string $client_secret The short-lived client secret used by Stripe.js to show a verification modal inside your app. This client secret expires after 24 hours and can only be used once. Don’t store it, log it, embed it in a URL, or expose it to anyone other than the user. Make sure that you have TLS enabled on any page that includes the client secret. Refer to our docs on passing the client secret to the frontend to learn more. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|(object{code: null|string, reason: null|string}&\Stripe\StripeObject) $last_error If present, this property tells you the last error encountered when processing the verification. + * @property null|string|VerificationReport $last_verification_report ID of the most recent VerificationReport. Learn more about accessing detailed verification results. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|(object{document?: (object{allowed_types?: string[], require_id_number?: bool, require_live_capture?: bool, require_matching_selfie?: bool}&\Stripe\StripeObject), email?: (object{require_verification?: bool}&\Stripe\StripeObject), id_number?: (object{}&\Stripe\StripeObject), matching?: (object{dob?: string, name?: string}&\Stripe\StripeObject), phone?: (object{require_verification?: bool}&\Stripe\StripeObject)}&\Stripe\StripeObject) $options A set of options for the session’s verification checks. + * @property null|(object{email?: string, phone?: string}&\Stripe\StripeObject) $provided_details Details provided about the user being verified. These details may be shown to the user. + * @property null|(object{status: string}&\Stripe\StripeObject) $redaction Redaction status of this VerificationSession. If the VerificationSession is not redacted, this field will be null. + * @property null|string $related_customer Customer ID + * @property null|string $related_customer_account The ID of the Account representing a customer. + * @property null|(object{account: string, person: string}&\Stripe\StripeObject) $related_person + * @property string $status Status of this VerificationSession. Learn more about the lifecycle of sessions. + * @property string $type The type of verification check to be performed. + * @property null|string $url The short-lived URL that you use to redirect a user to Stripe to submit their identity information. This URL expires after 48 hours and can only be used once. Don’t store it, log it, send it in emails or expose it to anyone other than the user. Refer to our docs on verifying identity documents to learn how to redirect users to Stripe. + * @property null|string $verification_flow The configuration token of a verification flow from the dashboard. + * @property null|(object{address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), dob?: null|(object{day: null|int, month: null|int, year: null|int}&\Stripe\StripeObject), email: null|string, first_name: null|string, id_number?: null|string, id_number_type: null|string, last_name: null|string, phone: null|string, sex?: null|string, unparsed_place_of_birth?: null|string, unparsed_sex?: null|string}&\Stripe\StripeObject) $verified_outputs The user’s verified data. + */ +class VerificationSession extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'identity.verification_session'; + + use \Stripe\ApiOperations\Update; + + const STATUS_CANCELED = 'canceled'; + const STATUS_PROCESSING = 'processing'; + const STATUS_REQUIRES_INPUT = 'requires_input'; + const STATUS_VERIFIED = 'verified'; + + const TYPE_DOCUMENT = 'document'; + const TYPE_ID_NUMBER = 'id_number'; + const TYPE_VERIFICATION_FLOW = 'verification_flow'; + + /** + * Creates a VerificationSession object. + * + * After the VerificationSession is created, display a verification modal using the + * session client_secret or send your users to the session’s + * url. + * + * If your API key is in test mode, verification checks won’t actually process, + * though everything else will occur as if in live mode. + * + * Related guide: Verify your + * users’ identity documents + * + * @param null|array{client_reference_id?: string, expand?: string[], metadata?: array, options?: array{document?: null|array{allowed_types?: string[], require_id_number?: bool, require_live_capture?: bool, require_matching_selfie?: bool}}, provided_details?: array{email?: string, phone?: string}, related_customer?: string, related_customer_account?: string, related_person?: array{account: string, person: string}, return_url?: string, type?: string, verification_flow?: string} $params + * @param null|array|string $options + * + * @return VerificationSession the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of VerificationSessions. + * + * @param null|array{client_reference_id?: string, created?: array|int, ending_before?: string, expand?: string[], limit?: int, related_customer?: string, related_customer_account?: string, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves the details of a VerificationSession that was previously created. + * + * When the session status is requires_input, you can use this method + * to retrieve a valid client_secret or url to allow + * re-submission. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return VerificationSession + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates a VerificationSession object. + * + * When the session status is requires_input, you can use this method + * to update the verification check and options. + * + * @param string $id the ID of the resource to update + * @param null|array{expand?: string[], metadata?: array, options?: array{document?: null|array{allowed_types?: string[], require_id_number?: bool, require_live_capture?: bool, require_matching_selfie?: bool}}, provided_details?: array{email?: string, phone?: string}, type?: string} $params + * @param null|array|string $opts + * + * @return VerificationSession the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return VerificationSession the canceled verification session + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return VerificationSession the redacted verification session + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function redact($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/redact'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/Invoice.php b/stripe-php/lib/Invoice.php new file mode 100644 index 0000000..dce50a3 --- /dev/null +++ b/stripe-php/lib/Invoice.php @@ -0,0 +1,470 @@ +invoice items, and proration adjustments + * that may be caused by subscription upgrades/downgrades (if necessary). + * + * If your invoice is configured to be billed through automatic charges, + * Stripe automatically finalizes your invoice and attempts payment. Note + * that finalizing the invoice, + * when automatic, does + * not happen immediately as the invoice is created. Stripe waits + * until one hour after the last webhook was successfully sent (or the last + * webhook timed out after failing). If you (and the platforms you may have + * connected to) have no webhooks configured, Stripe waits one hour after + * creation to finalize the invoice. + * + * If your invoice is configured to be billed by sending an email, then based on your + * email settings, + * Stripe will email the invoice to your customer and await payment. These + * emails can contain a link to a hosted page to pay the invoice. + * + * Stripe applies any customer credit on the account before determining the + * amount due for the invoice (i.e., the amount that will be actually + * charged). If the amount due for the invoice is less than Stripe's minimum allowed charge + * per currency, the + * invoice is automatically marked paid, and we add the amount due to the + * customer's credit balance which is applied to the next invoice. + * + * More details on the customer's credit balance are + * here. + * + * Related guide: Send invoices to customers + * + * @property string $id Unique identifier for the object. For preview invoices created using the create preview endpoint, this id will be prefixed with upcoming_in. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|string $account_country The country of the business associated with this invoice, most often the business creating the invoice. + * @property null|string $account_name The public name of the business associated with this invoice, most often the business creating the invoice. + * @property null|(string|TaxId)[] $account_tax_ids The account tax IDs associated with the invoice. Only editable when the invoice is a draft. + * @property int $amount_due Final amount due at this time for this invoice. If the invoice's total is smaller than the minimum charge amount, for example, or if there is account credit that can be applied to the invoice, the amount_due may be 0. If there is a positive starting_balance for the invoice (the customer owes money), the amount_due will also take that into account. The charge that gets generated for the invoice will be for the amount specified in amount_due. + * @property int $amount_overpaid Amount that was overpaid on the invoice. The amount overpaid is credited to the customer's credit balance. + * @property int $amount_paid The amount, in cents (or local equivalent), that was paid. + * @property int $amount_remaining The difference between amount_due and amount_paid, in cents (or local equivalent). + * @property int $amount_shipping This is the sum of all the shipping amounts. + * @property null|Application|string $application ID of the Connect Application that created the invoice. + * @property int $attempt_count Number of payment attempts made for this invoice, from the perspective of the payment retry schedule. Any payment attempt counts as the first attempt, and subsequently only automatic retries increment the attempt count. In other words, manual payment attempts after the first attempt do not affect the retry schedule. If a failure is returned with a non-retryable return code, the invoice can no longer be retried unless a new payment method is obtained. Retries will continue to be scheduled, and attempt_count will continue to increment, but retries will only be executed if a new payment method is obtained. + * @property bool $attempted Whether an attempt has been made to pay the invoice. An invoice is not attempted until 1 hour after the invoice.created webhook, for example, so you might not want to display that invoice as unpaid to your users. + * @property null|bool $auto_advance Controls whether Stripe performs automatic collection of the invoice. If false, the invoice's state doesn't automatically advance without an explicit action. + * @property (object{disabled_reason: null|string, enabled: bool, liability: null|(object{account?: Account|string, type: string}&StripeObject), provider: null|string, status: null|string}&StripeObject) $automatic_tax + * @property null|int $automatically_finalizes_at The time when this invoice is currently scheduled to be automatically finalized. The field will be null if the invoice is not scheduled to finalize in the future. If the invoice is not in the draft state, this field will always be null - see finalized_at for the time when an already-finalized invoice was finalized. + * @property null|string $billing_reason

Indicates the reason why the invoice was created.

* manual: Unrelated to a subscription, for example, created via the invoice editor. * subscription: No longer in use. Applies to subscriptions from before May 2018 where no distinction was made between updates, cycles, and thresholds. * subscription_create: A new subscription was created. * subscription_cycle: A subscription advanced into a new period. * subscription_threshold: A subscription reached a billing threshold. * subscription_update: A subscription was updated. * upcoming: Reserved for upcoming invoices created through the Create Preview Invoice API or when an invoice.upcoming event is generated for an upcoming invoice on a subscription.

+ * @property string $collection_method Either charge_automatically, or send_invoice. When charging automatically, Stripe will attempt to pay this invoice using the default source attached to the customer. When sending an invoice, Stripe will email this invoice to the customer with payment instructions. + * @property null|(object{client_secret: string, type: string}&StripeObject) $confirmation_secret The confirmation secret associated with this invoice. Currently, this contains the client_secret of the PaymentIntent that Stripe creates during invoice finalization. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|(object{name: string, value: string}&StripeObject)[] $custom_fields Custom fields displayed on the invoice. + * @property null|Customer|string $customer The ID of the customer to bill. + * @property null|string $customer_account The ID of the account representing the customer to bill. + * @property null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject) $customer_address The customer's address. Until the invoice is finalized, this field will equal customer.address. Once the invoice is finalized, this field will no longer be updated. + * @property null|string $customer_email The customer's email. Until the invoice is finalized, this field will equal customer.email. Once the invoice is finalized, this field will no longer be updated. + * @property null|string $customer_name The customer's name. Until the invoice is finalized, this field will equal customer.name. Once the invoice is finalized, this field will no longer be updated. + * @property null|string $customer_phone The customer's phone number. Until the invoice is finalized, this field will equal customer.phone. Once the invoice is finalized, this field will no longer be updated. + * @property null|(object{address?: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), carrier?: null|string, name?: string, phone?: null|string, tracking_number?: null|string}&StripeObject) $customer_shipping The customer's shipping information. Until the invoice is finalized, this field will equal customer.shipping. Once the invoice is finalized, this field will no longer be updated. + * @property null|string $customer_tax_exempt The customer's tax exempt status. Until the invoice is finalized, this field will equal customer.tax_exempt. Once the invoice is finalized, this field will no longer be updated. + * @property null|((object{type: string, value: null|string}&StripeObject))[] $customer_tax_ids The customer's tax IDs. Until the invoice is finalized, this field will contain the same tax IDs as customer.tax_ids. Once the invoice is finalized, this field will no longer be updated. + * @property null|PaymentMethod|string $default_payment_method ID of the default payment method for the invoice. It must belong to the customer associated with the invoice. If not set, defaults to the subscription's default payment method, if any, or to the default payment method in the customer's invoice settings. + * @property null|Account|BankAccount|Card|Source|string $default_source ID of the default payment source for the invoice. It must belong to the customer associated with the invoice and be in a chargeable state. If not set, defaults to the subscription's default source, if any, or to the customer's default source. + * @property TaxRate[] $default_tax_rates The tax rates applied to this invoice, if any. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. Referenced as 'memo' in the Dashboard. + * @property (Discount|string)[] $discounts The discounts applied to the invoice. Line item discounts are applied before invoice discounts. Use expand[]=discounts to expand each discount. + * @property null|int $due_date The date on which payment for this invoice is due. This value will be null for invoices where collection_method=charge_automatically. + * @property null|int $effective_at The date when this invoice is in effect. Same as finalized_at unless overwritten. When defined, this value replaces the system-generated 'Date of issue' printed on the invoice PDF and receipt. + * @property null|int $ending_balance Ending customer balance after the invoice is finalized. Invoices are finalized approximately an hour after successful webhook delivery or when payment collection is attempted for the invoice. If the invoice has not been finalized yet, this will be null. + * @property null|string $footer Footer displayed on the invoice. + * @property null|(object{action: string, invoice: Invoice|string}&StripeObject) $from_invoice Details of the invoice that was cloned. See the revision documentation for more details. + * @property null|string $hosted_invoice_url The URL for the hosted invoice page, which allows customers to view and pay an invoice. If the invoice has not been finalized yet, this will be null. + * @property null|string $invoice_pdf The link to download the PDF for the invoice. If the invoice has not been finalized yet, this will be null. + * @property (object{account?: Account|string, type: string}&StripeObject) $issuer + * @property null|(object{advice_code?: string, charge?: string, code?: string, decline_code?: string, doc_url?: string, message?: string, network_advice_code?: string, network_decline_code?: string, param?: string, payment_intent?: PaymentIntent, payment_method?: PaymentMethod, payment_method_type?: string, request_log_url?: string, setup_intent?: SetupIntent, source?: Account|BankAccount|Card|Source, type: string}&StripeObject) $last_finalization_error The error encountered during the previous attempt to finalize the invoice. This field is cleared when the invoice is successfully finalized. + * @property null|Invoice|string $latest_revision The ID of the most recent non-draft revision of this invoice + * @property Collection $lines The individual line items that make up the invoice. lines is sorted as follows: (1) pending invoice items (including prorations) in reverse chronological order, (2) subscription items in reverse chronological order, and (3) invoice items added after invoice creation in chronological order. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|int $next_payment_attempt The time at which payment will next be attempted. This value will be null for invoices where collection_method=send_invoice. + * @property null|string $number A unique, identifying string that appears on emails sent to the customer for this invoice. This starts with the customer's unique invoice_prefix if it is specified. + * @property null|Account|string $on_behalf_of The account (if any) for which the funds of the invoice payment are intended. If set, the invoice will be presented with the branding and support information of the specified account. See the Invoices with Connect documentation for details. + * @property null|(object{quote_details: null|(object{quote: string}&StripeObject), subscription_details: null|(object{metadata: null|StripeObject, subscription: string|Subscription, subscription_proration_date?: int}&StripeObject), type: string}&StripeObject) $parent The parent that generated this invoice + * @property (object{default_mandate: null|string, payment_method_options: null|(object{acss_debit: null|(object{mandate_options?: (object{transaction_type: null|string}&StripeObject), verification_method?: string}&StripeObject), bancontact: null|(object{preferred_language: string}&StripeObject), card: null|(object{installments?: (object{enabled: null|bool}&StripeObject), request_three_d_secure: null|string}&StripeObject), customer_balance: null|(object{bank_transfer?: (object{eu_bank_transfer?: (object{country: string}&StripeObject), type: null|string}&StripeObject), funding_type: null|string}&StripeObject), konbini: null|(object{}&StripeObject), payto?: null|(object{mandate_options?: (object{amount: null|int, amount_type: null|string, purpose: null|string}&StripeObject)}&StripeObject), sepa_debit: null|(object{}&StripeObject), us_bank_account: null|(object{financial_connections?: (object{filters?: (object{account_subcategories?: string[]}&StripeObject), permissions?: string[], prefetch: null|string[]}&StripeObject), verification_method?: string}&StripeObject)}&StripeObject), payment_method_types: null|string[]}&StripeObject) $payment_settings + * @property null|Collection $payments Payments for this invoice + * @property int $period_end End of the usage period during which invoice items were added to this invoice. This looks back one period for a subscription invoice. Use the line item period to get the service period for each price. + * @property int $period_start Start of the usage period during which invoice items were added to this invoice. This looks back one period for a subscription invoice. Use the line item period to get the service period for each price. + * @property int $post_payment_credit_notes_amount Total amount of all post-payment credit notes issued for this invoice. + * @property int $pre_payment_credit_notes_amount Total amount of all pre-payment credit notes issued for this invoice. + * @property null|string $receipt_number This is the transaction number that appears on email receipts sent for this invoice. + * @property null|(object{amount_tax_display: null|string, pdf: null|(object{page_size: null|string}&StripeObject), template: null|string, template_version: null|int}&StripeObject) $rendering The rendering-related settings that control how the invoice is displayed on customer-facing surfaces such as PDF and Hosted Invoice Page. + * @property null|(object{amount_subtotal: int, amount_tax: int, amount_total: int, shipping_rate: null|ShippingRate|string, taxes?: ((object{amount: int, rate: TaxRate, taxability_reason: null|string, taxable_amount: null|int}&StripeObject))[]}&StripeObject) $shipping_cost The details of the cost of shipping, including the ShippingRate applied on the invoice. + * @property null|(object{address?: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), carrier?: null|string, name?: string, phone?: null|string, tracking_number?: null|string}&StripeObject) $shipping_details Shipping details for the invoice. The Invoice PDF will use the shipping_details value if it is set, otherwise the PDF will render the shipping address from the customer. + * @property int $starting_balance Starting customer balance before the invoice is finalized. If the invoice has not been finalized yet, this will be the current customer balance. For revision invoices, this also includes any customer balance that was applied to the original invoice. + * @property null|string $statement_descriptor Extra information about an invoice for the customer's credit card statement. + * @property null|string $status The status of the invoice, one of draft, open, paid, uncollectible, or void. Learn more + * @property (object{finalized_at: null|int, marked_uncollectible_at: null|int, paid_at: null|int, voided_at: null|int}&StripeObject) $status_transitions + * @property int $subtotal Total of all subscriptions, invoice items, and prorations on the invoice before any invoice level discount or exclusive tax is applied. Item discounts are already incorporated + * @property null|int $subtotal_excluding_tax The integer amount in cents (or local equivalent) representing the subtotal of the invoice before any invoice level discount or tax is applied. Item discounts are already incorporated + * @property null|string|TestHelpers\TestClock $test_clock ID of the test clock this invoice belongs to. + * @property null|(object{amount_gte: null|int, item_reasons: (object{line_item_ids: string[], usage_gte: int}&StripeObject)[]}&StripeObject) $threshold_reason + * @property int $total Total after discounts and taxes. + * @property null|((object{amount: int, discount: Discount|string}&StripeObject))[] $total_discount_amounts The aggregate amounts calculated per discount across all line items. + * @property null|int $total_excluding_tax The integer amount in cents (or local equivalent) representing the total amount of the invoice including all discounts but excluding all tax. + * @property null|((object{amount: int, credit_balance_transaction?: null|Billing\CreditBalanceTransaction|string, discount?: Discount|string, type: string}&StripeObject))[] $total_pretax_credit_amounts Contains pretax credit amounts (ex: discount, credit grants, etc) that apply to this invoice. This is a combined list of total_pretax_credit_amounts across all invoice line items. + * @property null|((object{amount: int, tax_behavior: string, tax_rate_details: null|(object{tax_rate: string}&StripeObject), taxability_reason: string, taxable_amount: null|int, type: string}&StripeObject))[] $total_taxes The aggregate tax information of all line items. + * @property null|int $webhooks_delivered_at Invoices are automatically paid or sent 1 hour after webhooks are delivered, or until all webhook delivery attempts have been exhausted. This field tracks the time when webhooks for this invoice were successfully delivered. If the invoice had no webhooks to deliver, this will be set while the invoice is being created. + */ +class Invoice extends ApiResource +{ + const OBJECT_NAME = 'invoice'; + + use ApiOperations\NestedResource; + use ApiOperations\Update; + + const BILLING_REASON_AUTOMATIC_PENDING_INVOICE_ITEM_INVOICE = 'automatic_pending_invoice_item_invoice'; + const BILLING_REASON_MANUAL = 'manual'; + const BILLING_REASON_QUOTE_ACCEPT = 'quote_accept'; + const BILLING_REASON_SUBSCRIPTION = 'subscription'; + const BILLING_REASON_SUBSCRIPTION_CREATE = 'subscription_create'; + const BILLING_REASON_SUBSCRIPTION_CYCLE = 'subscription_cycle'; + const BILLING_REASON_SUBSCRIPTION_THRESHOLD = 'subscription_threshold'; + const BILLING_REASON_SUBSCRIPTION_UPDATE = 'subscription_update'; + const BILLING_REASON_UPCOMING = 'upcoming'; + + const COLLECTION_METHOD_CHARGE_AUTOMATICALLY = 'charge_automatically'; + const COLLECTION_METHOD_SEND_INVOICE = 'send_invoice'; + + const CUSTOMER_TAX_EXEMPT_EXEMPT = 'exempt'; + const CUSTOMER_TAX_EXEMPT_NONE = 'none'; + const CUSTOMER_TAX_EXEMPT_REVERSE = 'reverse'; + + const STATUS_DRAFT = 'draft'; + const STATUS_OPEN = 'open'; + const STATUS_PAID = 'paid'; + const STATUS_UNCOLLECTIBLE = 'uncollectible'; + const STATUS_VOID = 'void'; + + /** + * This endpoint creates a draft invoice for a given customer. The invoice remains + * a draft until you finalize the invoice, which + * allows you to pay or send + * the invoice to your customers. + * + * @param null|array{account_tax_ids?: null|string[], application_fee_amount?: int, auto_advance?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, automatically_finalizes_at?: int, collection_method?: string, currency?: string, custom_fields?: null|array{name: string, value: string}[], customer?: string, customer_account?: string, days_until_due?: int, default_payment_method?: string, default_source?: string, default_tax_rates?: string[], description?: string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], due_date?: int, effective_at?: int, expand?: string[], footer?: string, from_invoice?: array{action: string, invoice: string}, issuer?: array{account?: string, type: string}, metadata?: null|array, number?: string, on_behalf_of?: string, payment_settings?: array{default_mandate?: null|string, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, sepa_debit?: null|array{}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[]}, pending_invoice_items_behavior?: string, rendering?: array{amount_tax_display?: null|string, pdf?: array{page_size?: string}, template?: string, template_version?: null|int}, shipping_cost?: array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}, shipping_details?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: null|string}, statement_descriptor?: string, subscription?: string, transfer_data?: array{amount?: int, destination: string}} $params + * @param null|array|string $options + * + * @return Invoice the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Permanently deletes a one-off invoice draft. This cannot be undone. Attempts to + * delete invoices that are no longer in a draft state will fail; once an invoice + * has been finalized or if an invoice is for a subscription, it must be voided. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return Invoice the deleted resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * You can list all invoices, or list the invoices for a specific customer. The + * invoices are returned sorted by creation date, with the most recently created + * invoices appearing first. + * + * @param null|array{collection_method?: string, created?: array|int, customer?: string, customer_account?: string, due_date?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, status?: string, subscription?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the invoice with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Invoice + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Draft invoices are fully editable. Once an invoice is finalized, monetary values, + * as well as collection_method, become uneditable. + * + * If you would like to stop the Stripe Billing engine from automatically + * finalizing, reattempting payments on, sending reminders for, or automatically reconciling + * invoices, pass auto_advance=false. + * + * @param string $id the ID of the resource to update + * @param null|array{account_tax_ids?: null|string[], application_fee_amount?: int, auto_advance?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, automatically_finalizes_at?: int, collection_method?: string, custom_fields?: null|array{name: string, value: string}[], days_until_due?: int, default_payment_method?: string, default_source?: null|string, default_tax_rates?: null|string[], description?: string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], due_date?: int, effective_at?: null|int, expand?: string[], footer?: string, issuer?: array{account?: string, type: string}, metadata?: null|array, number?: null|string, on_behalf_of?: null|string, payment_settings?: array{default_mandate?: null|string, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, sepa_debit?: null|array{}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[]}, rendering?: array{amount_tax_display?: null|string, pdf?: array{page_size?: string}, template?: string, template_version?: null|int}, shipping_cost?: null|array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}, shipping_details?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: null|string}, statement_descriptor?: string, transfer_data?: null|array{amount?: int, destination: string}} $params + * @param null|array|string $opts + * + * @return Invoice the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + const BILLING_CHARGE_AUTOMATICALLY = 'charge_automatically'; + const BILLING_SEND_INVOICE = 'send_invoice'; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Invoice the added invoice + * + * @throws Exception\ApiErrorException if the request fails + */ + public function addLines($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/add_lines'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Invoice the attached invoice + * + * @throws Exception\ApiErrorException if the request fails + */ + public function attachPayment($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/attach_payment'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Invoice the created invoice + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function createPreview($params = null, $opts = null) + { + $url = static::classUrl() . '/create_preview'; + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Invoice the finalized invoice + * + * @throws Exception\ApiErrorException if the request fails + */ + public function finalizeInvoice($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/finalize'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Invoice the uncollectible invoice + * + * @throws Exception\ApiErrorException if the request fails + */ + public function markUncollectible($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/mark_uncollectible'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Invoice the paid invoice + * + * @throws Exception\ApiErrorException if the request fails + */ + public function pay($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/pay'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Invoice the removed invoice + * + * @throws Exception\ApiErrorException if the request fails + */ + public function removeLines($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/remove_lines'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Invoice the sent invoice + * + * @throws Exception\ApiErrorException if the request fails + */ + public function sendInvoice($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/send'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Invoice the updated invoice + * + * @throws Exception\ApiErrorException if the request fails + */ + public function updateLines($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/update_lines'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Invoice the voided invoice + * + * @throws Exception\ApiErrorException if the request fails + */ + public function voidInvoice($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/void'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return SearchResult the invoice search results + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function search($params = null, $opts = null) + { + $url = '/v1/invoices/search'; + + return static::_requestPage($url, SearchResult::class, $params, $opts); + } + + const PATH_LINES = '/lines'; + + /** + * @param string $id the ID of the invoice on which to retrieve the invoice line items + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection the list of invoice line items + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allLines($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_LINES, $params, $opts); + } +} diff --git a/stripe-php/lib/InvoiceItem.php b/stripe-php/lib/InvoiceItem.php new file mode 100644 index 0000000..48c18be --- /dev/null +++ b/stripe-php/lib/InvoiceItem.php @@ -0,0 +1,154 @@ +invoice. When you create an invoice item with an invoice field, it is attached to the specified invoice and included as an invoice line item within invoice.lines. + * + * Invoice Items can be created before you are ready to actually send the invoice. This can be particularly useful when combined + * with a subscription. Sometimes you want to add a charge or credit to a customer, but actually charge + * or credit the customer's card only at the end of a regular billing cycle. This is useful for combining several charges + * (to minimize per-transaction fees), or for having Stripe tabulate your usage-based billing totals. + * + * Related guides: Integrate with the Invoicing API, Subscription Invoices. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount (in the currency specified) of the invoice item. This should always be equal to unit_amount * quantity. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property Customer|string $customer The ID of the customer to bill for this invoice item. + * @property null|string $customer_account The ID of the account to bill for this invoice item. + * @property int $date Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property bool $discountable If true, discounts will apply to this invoice item. Always false for prorations. + * @property null|(Discount|string)[] $discounts The discounts which apply to the invoice item. Item discounts are applied before invoice discounts. Use expand[]=discounts to expand each discount. + * @property null|Invoice|string $invoice The ID of the invoice this invoice item belongs to. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|int $net_amount The amount after discounts, but before credits and taxes. This field is null for discountable=true items. + * @property null|(object{subscription_details: null|(object{subscription: string, subscription_item?: string}&StripeObject), type: string}&StripeObject) $parent The parent that generated this invoice item. + * @property (object{end: int, start: int}&StripeObject) $period + * @property null|(object{price_details?: (object{price: Price|string, product: string}&StripeObject), type: string, unit_amount_decimal: null|string}&StripeObject) $pricing The pricing information of the invoice item. + * @property bool $proration Whether the invoice item was created automatically as a proration adjustment when the customer switched plans. + * @property null|(object{discount_amounts: ((object{amount: int, discount: Discount|string}&StripeObject))[]}&StripeObject) $proration_details + * @property int $quantity Quantity of units for the invoice item. If the invoice item is a proration, the quantity of the subscription that the proration was computed for. + * @property null|TaxRate[] $tax_rates The tax rates which apply to the invoice item. When set, the default_tax_rates on the invoice do not apply to this invoice item. + * @property null|string|TestHelpers\TestClock $test_clock ID of the test clock this invoice item belongs to. + */ +class InvoiceItem extends ApiResource +{ + const OBJECT_NAME = 'invoiceitem'; + + use ApiOperations\Update; + + /** + * Creates an item to be added to a draft invoice (up to 250 items per invoice). If + * no invoice is specified, the item will be on the next invoice created for the + * customer specified. + * + * @param null|array{amount?: int, currency?: string, customer?: string, customer_account?: string, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice?: string, metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, subscription?: string, tax_behavior?: string, tax_code?: null|string, tax_rates?: string[], unit_amount_decimal?: string} $params + * @param null|array|string $options + * + * @return InvoiceItem the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Deletes an invoice item, removing it from an invoice. Deleting invoice items is + * only possible when they’re not attached to invoices, or if it’s attached to a + * draft invoice. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return InvoiceItem the deleted resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * Returns a list of your invoice items. Invoice items are returned sorted by + * creation date, with the most recently created invoice items appearing first. + * + * @param null|array{created?: array|int, customer?: string, customer_account?: string, ending_before?: string, expand?: string[], invoice?: string, limit?: int, pending?: bool, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the invoice item with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return InvoiceItem + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the amount or description of an invoice item on an upcoming invoice. + * Updating an invoice item is only possible before the invoice it’s attached to is + * closed. + * + * @param string $id the ID of the resource to update + * @param null|array{amount?: int, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, tax_behavior?: string, tax_code?: null|string, tax_rates?: null|string[], unit_amount_decimal?: string} $params + * @param null|array|string $opts + * + * @return InvoiceItem the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/InvoiceLineItem.php b/stripe-php/lib/InvoiceLineItem.php new file mode 100644 index 0000000..3b8ca05 --- /dev/null +++ b/stripe-php/lib/InvoiceLineItem.php @@ -0,0 +1,65 @@ +invoice and only exist within the context of an invoice. + * + * Each line item is backed by either an invoice item or a subscription item. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount The amount, in cents (or local equivalent). + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|((object{amount: int, discount: Discount|string}&StripeObject))[] $discount_amounts The amount of discount calculated per discount for this line item. + * @property bool $discountable If true, discounts will apply to this line item. Always false for prorations. + * @property (Discount|string)[] $discounts The discounts applied to the invoice line item. Line item discounts are applied before invoice discounts. Use expand[]=discounts to expand each discount. + * @property null|string $invoice The ID of the invoice that contains this line item. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Note that for line items with type=subscription, metadata reflects the current metadata from the subscription associated with the line item, unless the invoice line was directly updated with different metadata after creation. + * @property null|(object{invoice_item_details: null|(object{invoice_item: string, proration: bool, proration_details: null|(object{credited_items: null|(object{invoice: string, invoice_line_items: string[]}&StripeObject)}&StripeObject), subscription: null|string}&StripeObject), subscription_item_details: null|(object{invoice_item: null|string, proration: bool, proration_details: null|(object{credited_items: null|(object{invoice: string, invoice_line_items: string[]}&StripeObject)}&StripeObject), subscription: null|string, subscription_item: string}&StripeObject), type: string}&StripeObject) $parent The parent that generated this line item. + * @property (object{end: int, start: int}&StripeObject) $period + * @property null|((object{amount: int, credit_balance_transaction?: null|Billing\CreditBalanceTransaction|string, discount?: Discount|string, type: string}&StripeObject))[] $pretax_credit_amounts Contains pretax credit amounts (ex: discount, credit grants, etc) that apply to this line item. + * @property null|(object{price_details?: (object{price: Price|string, product: string}&StripeObject), type: string, unit_amount_decimal: null|string}&StripeObject) $pricing The pricing information of the line item. + * @property null|int $quantity The quantity of the subscription, if the line item is a subscription or a proration. + * @property null|string|Subscription $subscription + * @property int $subtotal The subtotal of the line item, in cents (or local equivalent), before any discounts or taxes. + * @property null|((object{amount: int, tax_behavior: string, tax_rate_details: null|(object{tax_rate: string}&StripeObject), taxability_reason: string, taxable_amount: null|int, type: string}&StripeObject))[] $taxes The tax information of the line item. + */ +class InvoiceLineItem extends ApiResource +{ + const OBJECT_NAME = 'line_item'; + + use ApiOperations\Update; + + /** + * Updates an invoice’s line item. Some fields, such as tax_amounts, + * only live on the invoice line item, so they can only be updated through this + * endpoint. Other fields, such as amount, live on both the invoice + * item and the invoice line item, so updates on this endpoint will propagate to + * the invoice item as well. Updating an invoice’s line item is only possible + * before the invoice is finalized. + * + * @param string $id the ID of the resource to update + * @param null|array{amount?: int, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate_data: array{country?: string, description?: string, display_name: string, inclusive: bool, jurisdiction?: string, jurisdiction_level?: string, percentage: float, state?: string, tax_type?: string}, taxability_reason?: string, taxable_amount: int}[], tax_rates?: null|string[]} $params + * @param null|array|string $opts + * + * @return InvoiceLineItem the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/InvoicePayment.php b/stripe-php/lib/InvoicePayment.php new file mode 100644 index 0000000..b90fe85 --- /dev/null +++ b/stripe-php/lib/InvoicePayment.php @@ -0,0 +1,71 @@ +payments field on the Invoice resource. + * 2. By using the Invoice Payment retrieve and list endpoints. + * + * Invoice Payments include the mapping between payment objects, such as Payment Intent, and Invoices. + * This resource and its endpoints allows you to easily track if a payment is associated with a specific invoice and + * monitor the allocation details of the payments. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|int $amount_paid Amount that was actually paid for this invoice, in cents (or local equivalent). This field is null until the payment is paid. This amount can be less than the amount_requested if the PaymentIntent’s amount_received is not sufficient to pay all of the invoices that it is attached to. + * @property int $amount_requested Amount intended to be paid toward this invoice, in cents (or local equivalent) + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property Invoice|string $invoice The invoice that was paid. + * @property bool $is_default Stripe automatically creates a default InvoicePayment when the invoice is finalized, and keeps it synchronized with the invoice’s amount_remaining. The PaymentIntent associated with the default payment can’t be edited or canceled directly. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property (object{charge?: Charge|string, payment_intent?: PaymentIntent|string, payment_record?: PaymentRecord|string, type: string}&StripeObject) $payment + * @property string $status The status of the payment, one of open, paid, or canceled. + * @property (object{canceled_at: null|int, paid_at: null|int}&StripeObject) $status_transitions + */ +class InvoicePayment extends ApiResource +{ + const OBJECT_NAME = 'invoice_payment'; + + /** + * When retrieving an invoice, there is an includable payments property containing + * the first handful of those items. There is also a URL where you can retrieve the + * full (paginated) list of payments. + * + * @param null|array{created?: array|int, ending_before?: string, expand?: string[], invoice?: string, limit?: int, payment?: array{payment_intent?: string, payment_record?: string, type: string}, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the invoice payment with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return InvoicePayment + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/InvoiceRenderingTemplate.php b/stripe-php/lib/InvoiceRenderingTemplate.php new file mode 100644 index 0000000..268d815 --- /dev/null +++ b/stripe-php/lib/InvoiceRenderingTemplate.php @@ -0,0 +1,99 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $nickname A brief description of the template, hidden from customers + * @property string $status The status of the template, one of active or archived. + * @property int $version Version of this template; version increases by one when an update on the template changes any field that controls invoice rendering + */ +class InvoiceRenderingTemplate extends ApiResource +{ + const OBJECT_NAME = 'invoice_rendering_template'; + + const STATUS_ACTIVE = 'active'; + const STATUS_ARCHIVED = 'archived'; + + /** + * List all templates, ordered by creation date, with the most recently created + * template appearing first. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves an invoice rendering template with the given ID. It by default returns + * the latest version of the template. Optionally, specify a version to see + * previous versions. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return InvoiceRenderingTemplate + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return InvoiceRenderingTemplate the archived invoice rendering template + * + * @throws Exception\ApiErrorException if the request fails + */ + public function archive($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/archive'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return InvoiceRenderingTemplate the unarchived invoice rendering template + * + * @throws Exception\ApiErrorException if the request fails + */ + public function unarchive($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/unarchive'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/Issuing/Authorization.php b/stripe-php/lib/Issuing/Authorization.php new file mode 100644 index 0000000..a828674 --- /dev/null +++ b/stripe-php/lib/Issuing/Authorization.php @@ -0,0 +1,157 @@ +issued card is used to make a purchase, an Issuing Authorization + * object is created. Authorizations must be approved for the + * purchase to be completed successfully. + * + * Related guide: Issued card authorizations + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount The total amount that was authorized or rejected. This amount is in currency and in the smallest currency unit. amount should be the same as merchant_amount, unless currency and merchant_currency are different. + * @property null|(object{atm_fee: null|int, cashback_amount: null|int}&\Stripe\StripeObject) $amount_details Detailed breakdown of amount components. These amounts are denominated in currency and in the smallest currency unit. + * @property bool $approved Whether the authorization has been approved. + * @property string $authorization_method How the card details were provided. + * @property \Stripe\BalanceTransaction[] $balance_transactions List of balance transactions associated with this authorization. + * @property Card $card You can create physical or virtual cards that are issued to cardholders. + * @property null|Cardholder|string $cardholder The cardholder to whom this authorization belongs. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency The currency of the cardholder. This currency can be different from the currency presented at authorization and the merchant_currency field on this authorization. Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|(object{cardholder_prompt_data: null|(object{alphanumeric_id: null|string, driver_id: null|string, odometer: null|int, unspecified_id: null|string, user_id: null|string, vehicle_number: null|string}&\Stripe\StripeObject), purchase_type: null|string, reported_breakdown: null|(object{fuel: null|(object{gross_amount_decimal: null|string}&\Stripe\StripeObject), non_fuel: null|(object{gross_amount_decimal: null|string}&\Stripe\StripeObject), tax: null|(object{local_amount_decimal: null|string, national_amount_decimal: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject), service_type: null|string}&\Stripe\StripeObject) $fleet Fleet-specific information for authorizations using Fleet cards. + * @property null|((object{channel: string, status: string, undeliverable_reason: null|string}&\Stripe\StripeObject))[] $fraud_challenges Fraud challenges sent to the cardholder, if this authorization was declined for fraud risk reasons. + * @property null|(object{industry_product_code: null|string, quantity_decimal: null|string, type: null|string, unit: null|string, unit_cost_decimal: null|string}&\Stripe\StripeObject) $fuel Information about fuel that was purchased with this transaction. Typically this information is received from the merchant after the authorization has been approved and the fuel dispensed. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property int $merchant_amount The total amount that was authorized or rejected. This amount is in the merchant_currency and in the smallest currency unit. merchant_amount should be the same as amount, unless merchant_currency and currency are different. + * @property string $merchant_currency The local currency that was presented to the cardholder for the authorization. This currency can be different from the cardholder currency and the currency field on this authorization. Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property (object{category: string, category_code: string, city: null|string, country: null|string, name: null|string, network_id: string, postal_code: null|string, state: null|string, tax_id: null|string, terminal_id: null|string, url: null|string}&\Stripe\StripeObject) $merchant_data + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|(object{acquiring_institution_id: null|string, system_trace_audit_number: null|string, transaction_id: null|string}&\Stripe\StripeObject) $network_data Details about the authorization, such as identifiers, set by the card network. + * @property null|(object{amount: int, amount_details: null|(object{atm_fee: null|int, cashback_amount: null|int}&\Stripe\StripeObject), currency: string, is_amount_controllable: bool, merchant_amount: int, merchant_currency: string, network_risk_score: null|int}&\Stripe\StripeObject) $pending_request The pending authorization request. This field will only be non-null during an issuing_authorization.request webhook. + * @property ((object{amount: int, amount_details: null|(object{atm_fee: null|int, cashback_amount: null|int}&\Stripe\StripeObject), approved: bool, authorization_code: null|string, created: int, currency: string, merchant_amount: int, merchant_currency: string, network_risk_score: null|int, reason: string, reason_message: null|string, requested_at: null|int}&\Stripe\StripeObject))[] $request_history History of every time a pending_request authorization was approved/declined, either by you directly or by Stripe (e.g. based on your spending_controls). If the merchant changes the authorization by performing an incremental authorization, you can look at this field to see the previous requests for the authorization. This field can be helpful in determining why a given authorization was approved/declined. + * @property string $status The current status of the authorization in its lifecycle. + * @property null|string|Token $token Token object used for this authorization. If a network token was not used for this authorization, this field will be null. + * @property Transaction[] $transactions List of transactions associated with this authorization. + * @property null|(object{received_credits: string[], received_debits: string[], transaction: null|string}&\Stripe\StripeObject) $treasury Treasury details related to this authorization if it was created on a FinancialAccount. + * @property (object{address_line1_check: string, address_postal_code_check: string, authentication_exemption: null|(object{claimed_by: string, type: string}&\Stripe\StripeObject), cvc_check: string, expiry_check: string, postal_code: null|string, three_d_secure: null|(object{result: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $verification_data + * @property null|bool $verified_by_fraud_challenge Whether the authorization bypassed fraud risk checks because the cardholder has previously completed a fraud challenge on a similar high-risk authorization from the same merchant. + * @property null|string $wallet The digital wallet used for this transaction. One of apple_pay, google_pay, or samsung_pay. Will populate as null when no digital wallet was utilized. + */ +class Authorization extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'issuing.authorization'; + + use \Stripe\ApiOperations\Update; + + const AUTHORIZATION_METHOD_CHIP = 'chip'; + const AUTHORIZATION_METHOD_CONTACTLESS = 'contactless'; + const AUTHORIZATION_METHOD_KEYED_IN = 'keyed_in'; + const AUTHORIZATION_METHOD_ONLINE = 'online'; + const AUTHORIZATION_METHOD_SWIPE = 'swipe'; + + const STATUS_CLOSED = 'closed'; + const STATUS_EXPIRED = 'expired'; + const STATUS_PENDING = 'pending'; + const STATUS_REVERSED = 'reversed'; + + /** + * Returns a list of Issuing Authorization objects. The objects are + * sorted in descending order by creation date, with the most recently created + * object appearing first. + * + * @param null|array{card?: string, cardholder?: string, created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves an Issuing Authorization object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Authorization + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the specified Issuing Authorization object by setting the + * values of the parameters passed. Any parameters not provided will be left + * unchanged. + * + * @param string $id the ID of the resource to update + * @param null|array{expand?: string[], metadata?: null|array} $params + * @param null|array|string $opts + * + * @return Authorization the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Authorization the approved authorization + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function approve($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/approve'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Authorization the declined authorization + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function decline($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/decline'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/Issuing/Card.php b/stripe-php/lib/Issuing/Card.php new file mode 100644 index 0000000..8d0f4b6 --- /dev/null +++ b/stripe-php/lib/Issuing/Card.php @@ -0,0 +1,142 @@ +create physical or virtual cards that are issued to cardholders. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property string $brand The brand of the card. + * @property null|string $cancellation_reason The reason why the card was canceled. + * @property Cardholder $cardholder

An Issuing Cardholder object represents an individual or business entity who is issued cards.

Related guide: How to create a cardholder

+ * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Supported currencies are usd in the US, eur in the EU, and gbp in the UK. + * @property null|string $cvc The card's CVC. For security reasons, this is only available for virtual cards, and will be omitted unless you explicitly request it with the expand parameter. Additionally, it's only available via the "Retrieve a card" endpoint, not via "List all cards" or any other endpoint. + * @property int $exp_month The expiration month of the card. + * @property int $exp_year The expiration year of the card. + * @property null|string $financial_account The financial account this card is attached to. + * @property string $last4 The last 4 digits of the card number. + * @property null|(object{started_at: null|int, type: null|string}&\Stripe\StripeObject) $latest_fraud_warning Stripe’s assessment of whether this card’s details have been compromised. If this property isn't null, cancel and reissue the card to prevent fraudulent activity risk. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $number The full unredacted card number. For security reasons, this is only available for virtual cards, and will be omitted unless you explicitly request it with the expand parameter. Additionally, it's only available via the "Retrieve a card" endpoint, not via "List all cards" or any other endpoint. + * @property null|PersonalizationDesign|string $personalization_design The personalization design object belonging to this card. + * @property null|Card|string $replaced_by The latest card that replaces this card, if any. + * @property null|Card|string $replacement_for The card this card replaces, if any. + * @property null|string $replacement_reason The reason why the previous card needed to be replaced. + * @property null|string $second_line Text separate from cardholder name, printed on the card. + * @property null|(object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), address_validation: null|(object{mode: string, normalized_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), result: null|string}&\Stripe\StripeObject), carrier: null|string, customs: null|(object{eori_number: null|string}&\Stripe\StripeObject), eta: null|int, name: string, phone_number: null|string, require_signature: null|bool, service: string, status: null|string, tracking_number: null|string, tracking_url: null|string, type: string}&\Stripe\StripeObject) $shipping Where and how the card will be shipped. + * @property (object{allowed_categories: null|string[], allowed_merchant_countries: null|string[], blocked_categories: null|string[], blocked_merchant_countries: null|string[], spending_limits: null|((object{amount: int, categories: null|string[], interval: string}&\Stripe\StripeObject))[], spending_limits_currency: null|string}&\Stripe\StripeObject) $spending_controls + * @property string $status Whether authorizations can be approved on this card. May be blocked from activating cards depending on past-due Cardholder requirements. Defaults to inactive. + * @property string $type The type of the card. + * @property null|(object{apple_pay: (object{eligible: bool, ineligible_reason: null|string}&\Stripe\StripeObject), google_pay: (object{eligible: bool, ineligible_reason: null|string}&\Stripe\StripeObject), primary_account_identifier: null|string}&\Stripe\StripeObject) $wallets Information relating to digital wallets (like Apple Pay and Google Pay). + */ +class Card extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'issuing.card'; + + use \Stripe\ApiOperations\Update; + + const CANCELLATION_REASON_DESIGN_REJECTED = 'design_rejected'; + const CANCELLATION_REASON_LOST = 'lost'; + const CANCELLATION_REASON_STOLEN = 'stolen'; + + const REPLACEMENT_REASON_DAMAGED = 'damaged'; + const REPLACEMENT_REASON_EXPIRED = 'expired'; + const REPLACEMENT_REASON_LOST = 'lost'; + const REPLACEMENT_REASON_STOLEN = 'stolen'; + + const STATUS_ACTIVE = 'active'; + const STATUS_CANCELED = 'canceled'; + const STATUS_INACTIVE = 'inactive'; + + const TYPE_PHYSICAL = 'physical'; + const TYPE_VIRTUAL = 'virtual'; + + /** + * Creates an Issuing Card object. + * + * @param null|array{cardholder?: string, currency: string, exp_month?: int, exp_year?: int, expand?: string[], financial_account?: string, metadata?: array, personalization_design?: string, pin?: array{encrypted_number?: string}, replacement_for?: string, replacement_reason?: string, second_line?: null|string, shipping?: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}, address_validation?: array{mode: string}, customs?: array{eori_number?: string}, name: string, phone_number?: string, require_signature?: bool, service?: string, type?: string}, spending_controls?: array{allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[]}, status?: string, type: string} $params + * @param null|array|string $options + * + * @return Card the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of Issuing Card objects. The objects are sorted in + * descending order by creation date, with the most recently created object + * appearing first. + * + * @param null|array{cardholder?: string, created?: array|int, ending_before?: string, exp_month?: int, exp_year?: int, expand?: string[], last4?: string, limit?: int, personalization_design?: string, starting_after?: string, status?: string, type?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves an Issuing Card object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Card + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the specified Issuing Card object by setting the values of + * the parameters passed. Any parameters not provided will be left unchanged. + * + * @param string $id the ID of the resource to update + * @param null|array{cancellation_reason?: string, expand?: string[], metadata?: null|array, personalization_design?: string, pin?: array{encrypted_number?: string}, shipping?: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}, address_validation?: array{mode: string}, customs?: array{eori_number?: string}, name: string, phone_number?: string, require_signature?: bool, service?: string, type?: string}, spending_controls?: array{allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[]}, status?: string} $params + * @param null|array|string $opts + * + * @return Card the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Issuing/CardDetails.php b/stripe-php/lib/Issuing/CardDetails.php new file mode 100644 index 0000000..98f4e0b --- /dev/null +++ b/stripe-php/lib/Issuing/CardDetails.php @@ -0,0 +1,19 @@ +Cardholder object represents an individual or business entity who is issued cards. + * + * Related guide: How to create a cardholder + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property (object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $billing + * @property null|(object{tax_id_provided: bool}&\Stripe\StripeObject) $company Additional information about a company cardholder. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $email The cardholder's email address. + * @property null|(object{card_issuing?: null|(object{user_terms_acceptance: null|(object{date: null|int, ip: null|string, user_agent: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject), dob: null|(object{day: null|int, month: null|int, year: null|int}&\Stripe\StripeObject), first_name: null|string, last_name: null|string, verification: null|(object{document: null|(object{back: null|string|\Stripe\File, front: null|string|\Stripe\File}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject) $individual Additional information about an individual cardholder. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $name The cardholder's name. This will be printed on cards issued to them. + * @property null|string $phone_number The cardholder's phone number. This is required for all cardholders who will be creating EU cards. See the 3D Secure documentation for more details. + * @property null|string[] $preferred_locales The cardholder’s preferred locales (languages), ordered by preference. Locales can be de, en, es, fr, or it. This changes the language of the 3D Secure flow and one-time password messages sent to the cardholder. + * @property (object{disabled_reason: null|string, past_due: null|string[]}&\Stripe\StripeObject) $requirements + * @property null|(object{allowed_categories: null|string[], allowed_merchant_countries: null|string[], blocked_categories: null|string[], blocked_merchant_countries: null|string[], spending_limits: null|((object{amount: int, categories: null|string[], interval: string}&\Stripe\StripeObject))[], spending_limits_currency: null|string}&\Stripe\StripeObject) $spending_controls Rules that control spending across this cardholder's cards. Refer to our documentation for more details. + * @property string $status Specifies whether to permit authorizations on this cardholder's cards. + * @property string $type One of individual or company. See Choose a cardholder type for more details. + */ +class Cardholder extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'issuing.cardholder'; + + use \Stripe\ApiOperations\Update; + + const STATUS_ACTIVE = 'active'; + const STATUS_BLOCKED = 'blocked'; + const STATUS_INACTIVE = 'inactive'; + + const TYPE_COMPANY = 'company'; + const TYPE_INDIVIDUAL = 'individual'; + + /** + * Creates a new Issuing Cardholder object that can be issued cards. + * + * @param null|array{billing: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}}, company?: array{tax_id?: string}, email?: string, expand?: string[], individual?: array{card_issuing?: array{user_terms_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, dob?: array{day: int, month: int, year: int}, first_name?: string, last_name?: string, verification?: array{document?: array{back?: string, front?: string}}}, metadata?: array, name: string, phone_number?: string, preferred_locales?: string[], spending_controls?: array{allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[], spending_limits_currency?: string}, status?: string, type?: string} $params + * @param null|array|string $options + * + * @return Cardholder the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of Issuing Cardholder objects. The objects are + * sorted in descending order by creation date, with the most recently created + * object appearing first. + * + * @param null|array{created?: array|int, email?: string, ending_before?: string, expand?: string[], limit?: int, phone_number?: string, starting_after?: string, status?: string, type?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves an Issuing Cardholder object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Cardholder + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the specified Issuing Cardholder object by setting the + * values of the parameters passed. Any parameters not provided will be left + * unchanged. + * + * @param string $id the ID of the resource to update + * @param null|array{billing?: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}}, company?: array{tax_id?: string}, email?: string, expand?: string[], individual?: array{card_issuing?: array{user_terms_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, dob?: array{day: int, month: int, year: int}, first_name?: string, last_name?: string, verification?: array{document?: array{back?: string, front?: string}}}, metadata?: array, phone_number?: string, preferred_locales?: string[], spending_controls?: array{allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[], spending_limits_currency?: string}, status?: string} $params + * @param null|array|string $opts + * + * @return Cardholder the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Issuing/Dispute.php b/stripe-php/lib/Issuing/Dispute.php new file mode 100644 index 0000000..d05d7d0 --- /dev/null +++ b/stripe-php/lib/Issuing/Dispute.php @@ -0,0 +1,165 @@ +card issuer, you can dispute transactions that the cardholder does not recognize, suspects to be fraudulent, or has other issues with. + * + * Related guide: Issuing disputes + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Disputed amount in the card's currency and in the smallest currency unit. Usually the amount of the transaction, but can differ (usually because of currency fluctuation). + * @property null|\Stripe\BalanceTransaction[] $balance_transactions List of balance transactions associated with the dispute. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency The currency the transaction was made in. + * @property (object{canceled?: (object{additional_documentation: null|string|\Stripe\File, canceled_at: null|int, cancellation_policy_provided: null|bool, cancellation_reason: null|string, expected_at: null|int, explanation: null|string, product_description: null|string, product_type: null|string, return_status: null|string, returned_at: null|int}&\Stripe\StripeObject), duplicate?: (object{additional_documentation: null|string|\Stripe\File, card_statement: null|string|\Stripe\File, cash_receipt: null|string|\Stripe\File, check_image: null|string|\Stripe\File, explanation: null|string, original_transaction: null|string}&\Stripe\StripeObject), fraudulent?: (object{additional_documentation: null|string|\Stripe\File, explanation: null|string}&\Stripe\StripeObject), merchandise_not_as_described?: (object{additional_documentation: null|string|\Stripe\File, explanation: null|string, received_at: null|int, return_description: null|string, return_status: null|string, returned_at: null|int}&\Stripe\StripeObject), no_valid_authorization?: (object{additional_documentation: null|string|\Stripe\File, explanation: null|string}&\Stripe\StripeObject), not_received?: (object{additional_documentation: null|string|\Stripe\File, expected_at: null|int, explanation: null|string, product_description: null|string, product_type: null|string}&\Stripe\StripeObject), other?: (object{additional_documentation: null|string|\Stripe\File, explanation: null|string, product_description: null|string, product_type: null|string}&\Stripe\StripeObject), reason: string, service_not_as_described?: (object{additional_documentation: null|string|\Stripe\File, canceled_at: null|int, cancellation_reason: null|string, explanation: null|string, received_at: null|int}&\Stripe\StripeObject)}&\Stripe\StripeObject) $evidence + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string $loss_reason The enum that describes the dispute loss outcome. If the dispute is not lost, this field will be absent. New enum values may be added in the future, so be sure to handle unknown values. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $status Current status of the dispute. + * @property string|Transaction $transaction The transaction being disputed. + * @property null|(object{debit_reversal: null|string, received_debit: string}&\Stripe\StripeObject) $treasury Treasury details related to this dispute if it was created on a [FinancialAccount](/docs/api/treasury/financial_accounts + */ +class Dispute extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'issuing.dispute'; + + use \Stripe\ApiOperations\Update; + + const LOSS_REASON_CARDHOLDER_AUTHENTICATION_ISSUER_LIABILITY = 'cardholder_authentication_issuer_liability'; + const LOSS_REASON_ECI5_TOKEN_TRANSACTION_WITH_TAVV = 'eci5_token_transaction_with_tavv'; + const LOSS_REASON_EXCESS_DISPUTES_IN_TIMEFRAME = 'excess_disputes_in_timeframe'; + const LOSS_REASON_HAS_NOT_MET_THE_MINIMUM_DISPUTE_AMOUNT_REQUIREMENTS = 'has_not_met_the_minimum_dispute_amount_requirements'; + const LOSS_REASON_INVALID_DUPLICATE_DISPUTE = 'invalid_duplicate_dispute'; + const LOSS_REASON_INVALID_INCORRECT_AMOUNT_DISPUTE = 'invalid_incorrect_amount_dispute'; + const LOSS_REASON_INVALID_NO_AUTHORIZATION = 'invalid_no_authorization'; + const LOSS_REASON_INVALID_USE_OF_DISPUTES = 'invalid_use_of_disputes'; + const LOSS_REASON_MERCHANDISE_DELIVERED_OR_SHIPPED = 'merchandise_delivered_or_shipped'; + const LOSS_REASON_MERCHANDISE_OR_SERVICE_AS_DESCRIBED = 'merchandise_or_service_as_described'; + const LOSS_REASON_NOT_CANCELLED = 'not_cancelled'; + const LOSS_REASON_OTHER = 'other'; + const LOSS_REASON_REFUND_ISSUED = 'refund_issued'; + const LOSS_REASON_SUBMITTED_BEYOND_ALLOWABLE_TIME_LIMIT = 'submitted_beyond_allowable_time_limit'; + const LOSS_REASON_TRANSACTION_3DS_REQUIRED = 'transaction_3ds_required'; + const LOSS_REASON_TRANSACTION_APPROVED_AFTER_PRIOR_FRAUD_DISPUTE = 'transaction_approved_after_prior_fraud_dispute'; + const LOSS_REASON_TRANSACTION_AUTHORIZED = 'transaction_authorized'; + const LOSS_REASON_TRANSACTION_ELECTRONICALLY_READ = 'transaction_electronically_read'; + const LOSS_REASON_TRANSACTION_QUALIFIES_FOR_VISA_EASY_PAYMENT_SERVICE = 'transaction_qualifies_for_visa_easy_payment_service'; + const LOSS_REASON_TRANSACTION_UNATTENDED = 'transaction_unattended'; + + const STATUS_EXPIRED = 'expired'; + const STATUS_LOST = 'lost'; + const STATUS_SUBMITTED = 'submitted'; + const STATUS_UNSUBMITTED = 'unsubmitted'; + const STATUS_WON = 'won'; + + /** + * Creates an Issuing Dispute object. Individual pieces of evidence + * within the evidence object are optional at this point. Stripe only + * validates that required evidence is present during submission. Refer to Dispute + * reasons and evidence for more details about evidence requirements. + * + * @param null|array{amount?: int, evidence?: array{canceled?: null|array{additional_documentation?: null|string, canceled_at?: null|int, cancellation_policy_provided?: null|bool, cancellation_reason?: null|string, expected_at?: null|int, explanation?: null|string, product_description?: null|string, product_type?: null|string, return_status?: null|string, returned_at?: null|int}, duplicate?: null|array{additional_documentation?: null|string, card_statement?: null|string, cash_receipt?: null|string, check_image?: null|string, explanation?: null|string, original_transaction?: string}, fraudulent?: null|array{additional_documentation?: null|string, explanation?: null|string}, merchandise_not_as_described?: null|array{additional_documentation?: null|string, explanation?: null|string, received_at?: null|int, return_description?: null|string, return_status?: null|string, returned_at?: null|int}, no_valid_authorization?: null|array{additional_documentation?: null|string, explanation?: null|string}, not_received?: null|array{additional_documentation?: null|string, expected_at?: null|int, explanation?: null|string, product_description?: null|string, product_type?: null|string}, other?: null|array{additional_documentation?: null|string, explanation?: null|string, product_description?: null|string, product_type?: null|string}, reason?: string, service_not_as_described?: null|array{additional_documentation?: null|string, canceled_at?: null|int, cancellation_reason?: null|string, explanation?: null|string, received_at?: null|int}}, expand?: string[], metadata?: array, transaction?: string, treasury?: array{received_debit: string}} $params + * @param null|array|string $options + * + * @return Dispute the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of Issuing Dispute objects. The objects are sorted + * in descending order by creation date, with the most recently created object + * appearing first. + * + * @param null|array{created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, status?: string, transaction?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves an Issuing Dispute object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Dispute + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the specified Issuing Dispute object by setting the values + * of the parameters passed. Any parameters not provided will be left unchanged. + * Properties on the evidence object can be unset by passing in an + * empty string. + * + * @param string $id the ID of the resource to update + * @param null|array{amount?: int, evidence?: array{canceled?: null|array{additional_documentation?: null|string, canceled_at?: null|int, cancellation_policy_provided?: null|bool, cancellation_reason?: null|string, expected_at?: null|int, explanation?: null|string, product_description?: null|string, product_type?: null|string, return_status?: null|string, returned_at?: null|int}, duplicate?: null|array{additional_documentation?: null|string, card_statement?: null|string, cash_receipt?: null|string, check_image?: null|string, explanation?: null|string, original_transaction?: string}, fraudulent?: null|array{additional_documentation?: null|string, explanation?: null|string}, merchandise_not_as_described?: null|array{additional_documentation?: null|string, explanation?: null|string, received_at?: null|int, return_description?: null|string, return_status?: null|string, returned_at?: null|int}, no_valid_authorization?: null|array{additional_documentation?: null|string, explanation?: null|string}, not_received?: null|array{additional_documentation?: null|string, expected_at?: null|int, explanation?: null|string, product_description?: null|string, product_type?: null|string}, other?: null|array{additional_documentation?: null|string, explanation?: null|string, product_description?: null|string, product_type?: null|string}, reason?: string, service_not_as_described?: null|array{additional_documentation?: null|string, canceled_at?: null|int, cancellation_reason?: null|string, explanation?: null|string, received_at?: null|int}}, expand?: string[], metadata?: null|array} $params + * @param null|array|string $opts + * + * @return Dispute the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Dispute the submited dispute + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function submit($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/submit'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/Issuing/PersonalizationDesign.php b/stripe-php/lib/Issuing/PersonalizationDesign.php new file mode 100644 index 0000000..3cca57c --- /dev/null +++ b/stripe-php/lib/Issuing/PersonalizationDesign.php @@ -0,0 +1,117 @@ +purpose value of issuing_logo. + * @property null|(object{footer_body: null|string, footer_title: null|string, header_body: null|string, header_title: null|string}&\Stripe\StripeObject) $carrier_text Hash containing carrier text, for use with physical bundles that support carrier text. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string $lookup_key A lookup key used to retrieve personalization designs dynamically from a static string. This may be up to 200 characters. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $name Friendly display name. + * @property PhysicalBundle|string $physical_bundle The physical bundle object belonging to this personalization design. + * @property (object{is_default: bool, is_platform_default: null|bool}&\Stripe\StripeObject) $preferences + * @property (object{card_logo: null|string[], carrier_text: null|string[]}&\Stripe\StripeObject) $rejection_reasons + * @property string $status Whether this personalization design can be used to create cards. + */ +class PersonalizationDesign extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'issuing.personalization_design'; + + use \Stripe\ApiOperations\Update; + + const STATUS_ACTIVE = 'active'; + const STATUS_INACTIVE = 'inactive'; + const STATUS_REJECTED = 'rejected'; + const STATUS_REVIEW = 'review'; + + /** + * Creates a personalization design object. + * + * @param null|array{card_logo?: string, carrier_text?: array{footer_body?: null|string, footer_title?: null|string, header_body?: null|string, header_title?: null|string}, expand?: string[], lookup_key?: string, metadata?: array, name?: string, physical_bundle: string, preferences?: array{is_default: bool}, transfer_lookup_key?: bool} $params + * @param null|array|string $options + * + * @return PersonalizationDesign the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of personalization design objects. The objects are sorted in + * descending order by creation date, with the most recently created object + * appearing first. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, lookup_keys?: string[], preferences?: array{is_default?: bool, is_platform_default?: bool}, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a personalization design object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return PersonalizationDesign + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates a card personalization object. + * + * @param string $id the ID of the resource to update + * @param null|array{card_logo?: null|string, carrier_text?: null|array{footer_body?: null|string, footer_title?: null|string, header_body?: null|string, header_title?: null|string}, expand?: string[], lookup_key?: null|string, metadata?: array, name?: null|string, physical_bundle?: string, preferences?: array{is_default: bool}, transfer_lookup_key?: bool} $params + * @param null|array|string $opts + * + * @return PersonalizationDesign the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Issuing/PhysicalBundle.php b/stripe-php/lib/Issuing/PhysicalBundle.php new file mode 100644 index 0000000..6e130c7 --- /dev/null +++ b/stripe-php/lib/Issuing/PhysicalBundle.php @@ -0,0 +1,65 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $name Friendly display name. + * @property string $status Whether this physical bundle can be used to create cards. + * @property string $type Whether this physical bundle is a standard Stripe offering or custom-made for you. + */ +class PhysicalBundle extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'issuing.physical_bundle'; + + const STATUS_ACTIVE = 'active'; + const STATUS_INACTIVE = 'inactive'; + const STATUS_REVIEW = 'review'; + + const TYPE_CUSTOM = 'custom'; + const TYPE_STANDARD = 'standard'; + + /** + * Returns a list of physical bundle objects. The objects are sorted in descending + * order by creation date, with the most recently created object appearing first. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string, status?: string, type?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a physical bundle object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return PhysicalBundle + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Issuing/Token.php b/stripe-php/lib/Issuing/Token.php new file mode 100644 index 0000000..9ea27d7 --- /dev/null +++ b/stripe-php/lib/Issuing/Token.php @@ -0,0 +1,100 @@ +card issuer, you can view and manage these tokens through Stripe. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property Card|string $card Card associated with this token. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $device_fingerprint The hashed ID derived from the device ID from the card network associated with the token. + * @property null|string $last4 The last four digits of the token. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $network The token service provider / card network associated with the token. + * @property null|(object{device?: (object{device_fingerprint?: string, ip_address?: string, location?: string, name?: string, phone_number?: string, type?: string}&\Stripe\StripeObject), mastercard?: (object{card_reference_id?: string, token_reference_id: string, token_requestor_id: string, token_requestor_name?: string}&\Stripe\StripeObject), type: string, visa?: (object{card_reference_id: string, token_reference_id: string, token_requestor_id: string, token_risk_score?: string}&\Stripe\StripeObject), wallet_provider?: (object{account_id?: string, account_trust_score?: int, card_number_source?: string, cardholder_address?: (object{line1: string, postal_code: string}&\Stripe\StripeObject), cardholder_name?: string, device_trust_score?: int, hashed_account_email_address?: string, reason_codes?: string[], suggested_decision?: string, suggested_decision_version?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $network_data + * @property int $network_updated_at Time at which the token was last updated by the card network. Measured in seconds since the Unix epoch. + * @property string $status The usage state of the token. + * @property null|string $wallet_provider The digital wallet for this token, if one was used. + */ +class Token extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'issuing.token'; + + use \Stripe\ApiOperations\Update; + + const NETWORK_MASTERCARD = 'mastercard'; + const NETWORK_VISA = 'visa'; + + const STATUS_ACTIVE = 'active'; + const STATUS_DELETED = 'deleted'; + const STATUS_REQUESTED = 'requested'; + const STATUS_SUSPENDED = 'suspended'; + + const WALLET_PROVIDER_APPLE_PAY = 'apple_pay'; + const WALLET_PROVIDER_GOOGLE_PAY = 'google_pay'; + const WALLET_PROVIDER_SAMSUNG_PAY = 'samsung_pay'; + + /** + * Lists all Issuing Token objects for a given card. + * + * @param null|array{card: string, created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves an Issuing Token object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Token + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Attempts to update the specified Issuing Token object to the status + * specified. + * + * @param string $id the ID of the resource to update + * @param null|array{expand?: string[], status: string} $params + * @param null|array|string $opts + * + * @return Token the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Issuing/Transaction.php b/stripe-php/lib/Issuing/Transaction.php new file mode 100644 index 0000000..578b95c --- /dev/null +++ b/stripe-php/lib/Issuing/Transaction.php @@ -0,0 +1,112 @@ +issued card that results in funds entering or leaving + * your Stripe account, such as a completed purchase or refund, is represented by an Issuing + * Transaction object. + * + * Related guide: Issued card transactions + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount The transaction amount, which will be reflected in your balance. This amount is in your currency and in the smallest currency unit. + * @property null|(object{atm_fee: null|int, cashback_amount: null|int}&\Stripe\StripeObject) $amount_details Detailed breakdown of amount components. These amounts are denominated in currency and in the smallest currency unit. + * @property null|Authorization|string $authorization The Authorization object that led to this transaction. + * @property null|string|\Stripe\BalanceTransaction $balance_transaction ID of the balance transaction associated with this transaction. + * @property Card|string $card The card used to make this transaction. + * @property null|Cardholder|string $cardholder The cardholder to whom this transaction belongs. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|Dispute|string $dispute If you've disputed the transaction, the ID of the dispute. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property int $merchant_amount The amount that the merchant will receive, denominated in merchant_currency and in the smallest currency unit. It will be different from amount if the merchant is taking payment in a different currency. + * @property string $merchant_currency The currency with which the merchant is taking payment. + * @property (object{category: string, category_code: string, city: null|string, country: null|string, name: null|string, network_id: string, postal_code: null|string, state: null|string, tax_id: null|string, terminal_id: null|string, url: null|string}&\Stripe\StripeObject) $merchant_data + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|(object{authorization_code: null|string, processing_date: null|string, transaction_id: null|string}&\Stripe\StripeObject) $network_data Details about the transaction, such as processing dates, set by the card network. + * @property null|(object{fleet: null|(object{cardholder_prompt_data: null|(object{driver_id: null|string, odometer: null|int, unspecified_id: null|string, user_id: null|string, vehicle_number: null|string}&\Stripe\StripeObject), purchase_type: null|string, reported_breakdown: null|(object{fuel: null|(object{gross_amount_decimal: null|string}&\Stripe\StripeObject), non_fuel: null|(object{gross_amount_decimal: null|string}&\Stripe\StripeObject), tax: null|(object{local_amount_decimal: null|string, national_amount_decimal: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject), service_type: null|string}&\Stripe\StripeObject), flight: null|(object{departure_at: null|int, passenger_name: null|string, refundable: null|bool, segments: null|((object{arrival_airport_code: null|string, carrier: null|string, departure_airport_code: null|string, flight_number: null|string, service_class: null|string, stopover_allowed: null|bool}&\Stripe\StripeObject))[], travel_agency: null|string}&\Stripe\StripeObject), fuel: null|(object{industry_product_code: null|string, quantity_decimal: null|string, type: string, unit: string, unit_cost_decimal: string}&\Stripe\StripeObject), lodging: null|(object{check_in_at: null|int, nights: null|int}&\Stripe\StripeObject), receipt: null|((object{description: null|string, quantity: null|float, total: null|int, unit_cost: null|int}&\Stripe\StripeObject))[], reference: null|string}&\Stripe\StripeObject) $purchase_details Additional purchase information that is optionally provided by the merchant. + * @property null|string|Token $token Token object used for this transaction. If a network token was not used for this transaction, this field will be null. + * @property null|(object{received_credit: null|string, received_debit: null|string}&\Stripe\StripeObject) $treasury Treasury details related to this transaction if it was created on a [FinancialAccount](/docs/api/treasury/financial_accounts + * @property string $type The nature of the transaction. + * @property null|string $wallet The digital wallet used for this transaction. One of apple_pay, google_pay, or samsung_pay. + */ +class Transaction extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'issuing.transaction'; + + use \Stripe\ApiOperations\Update; + + const TYPE_CAPTURE = 'capture'; + const TYPE_REFUND = 'refund'; + + const WALLET_APPLE_PAY = 'apple_pay'; + const WALLET_GOOGLE_PAY = 'google_pay'; + const WALLET_SAMSUNG_PAY = 'samsung_pay'; + + /** + * Returns a list of Issuing Transaction objects. The objects are + * sorted in descending order by creation date, with the most recently created + * object appearing first. + * + * @param null|array{card?: string, cardholder?: string, created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, type?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves an Issuing Transaction object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Transaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the specified Issuing Transaction object by setting the + * values of the parameters passed. Any parameters not provided will be left + * unchanged. + * + * @param string $id the ID of the resource to update + * @param null|array{expand?: string[], metadata?: null|array} $params + * @param null|array|string $opts + * + * @return Transaction the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/LineItem.php b/stripe-php/lib/LineItem.php new file mode 100644 index 0000000..3b01206 --- /dev/null +++ b/stripe-php/lib/LineItem.php @@ -0,0 +1,27 @@ +ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. Defaults to product name. + * @property null|(object{amount: int, discount: Discount}&StripeObject)[] $discounts The discounts applied to the line item. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|Price $price The price used to generate the line item. + * @property null|int $quantity The quantity of products being purchased. + * @property null|((object{amount: int, rate: TaxRate, taxability_reason: null|string, taxable_amount: null|int}&StripeObject))[] $taxes The taxes applied to the line item. + */ +class LineItem extends ApiResource +{ + const OBJECT_NAME = 'item'; +} diff --git a/stripe-php/lib/LoginLink.php b/stripe-php/lib/LoginLink.php new file mode 100644 index 0000000..1321117 --- /dev/null +++ b/stripe-php/lib/LoginLink.php @@ -0,0 +1,18 @@ +Account Link in that it takes the user directly to their Express dashboard for the specified account. + * + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $url The URL for the login link. + */ +class LoginLink extends ApiResource +{ + const OBJECT_NAME = 'login_link'; +} diff --git a/stripe-php/lib/Mandate.php b/stripe-php/lib/Mandate.php new file mode 100644 index 0000000..d5a8498 --- /dev/null +++ b/stripe-php/lib/Mandate.php @@ -0,0 +1,51 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|(object{}&StripeObject) $multi_use + * @property null|string $on_behalf_of The account (if any) that the mandate is intended for. + * @property PaymentMethod|string $payment_method ID of the payment method associated with this mandate. + * @property (object{acss_debit?: (object{default_for?: string[], interval_description: null|string, payment_schedule: string, transaction_type: string}&StripeObject), amazon_pay?: (object{}&StripeObject), au_becs_debit?: (object{url: string}&StripeObject), bacs_debit?: (object{network_status: string, reference: string, revocation_reason: null|string, url: string}&StripeObject), card?: (object{}&StripeObject), cashapp?: (object{}&StripeObject), kakao_pay?: (object{}&StripeObject), klarna?: (object{}&StripeObject), kr_card?: (object{}&StripeObject), link?: (object{}&StripeObject), naver_pay?: (object{}&StripeObject), nz_bank_account?: (object{}&StripeObject), paypal?: (object{billing_agreement_id: null|string, payer_id: null|string}&StripeObject), payto?: (object{amount: null|int, amount_type: string, end_date: null|string, payment_schedule: string, payments_per_period: null|int, purpose: null|string, start_date: null|string}&StripeObject), revolut_pay?: (object{}&StripeObject), sepa_debit?: (object{reference: string, url: string}&StripeObject), type: string, us_bank_account?: (object{collection_method?: string}&StripeObject)}&StripeObject) $payment_method_details + * @property null|(object{amount: int, currency: string}&StripeObject) $single_use + * @property string $status The mandate status indicates whether or not you can use it to initiate a payment. + * @property string $type The type of the mandate. + */ +class Mandate extends ApiResource +{ + const OBJECT_NAME = 'mandate'; + + const STATUS_ACTIVE = 'active'; + const STATUS_INACTIVE = 'inactive'; + const STATUS_PENDING = 'pending'; + + const TYPE_MULTI_USE = 'multi_use'; + const TYPE_SINGLE_USE = 'single_use'; + + /** + * Retrieves a Mandate object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Mandate + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/OAuth.php b/stripe-php/lib/OAuth.php new file mode 100644 index 0000000..06f66c4 --- /dev/null +++ b/stripe-php/lib/OAuth.php @@ -0,0 +1,101 @@ +request( + 'post', + '/oauth/token', + $params, + null + ); + + return Util\Util::convertToStripeObject($response->json, $opts); + } + + /** + * Disconnects an account from your platform. + * + * @param null|array $params + * @param null|array $opts + * + * @return StripeObject object containing the response from the API + * + * @throws Exception\OAuth\OAuthErrorException if the request fails + */ + public static function deauthorize($params = null, $opts = null) + { + $params = $params ?: []; + $base = ($opts && \array_key_exists('connect_base', $opts)) ? $opts['connect_base'] : Stripe::$connectBase; + $requestor = new ApiRequestor(null, $base); + $params['client_id'] = self::_getClientId($params); + list($response, $apiKey) = $requestor->request( + 'post', + '/oauth/deauthorize', + $params, + null + ); + + return Util\Util::convertToStripeObject($response->json, $opts); + } + + private static function _getClientId($params = null) + { + $clientId = ($params && \array_key_exists('client_id', $params)) ? $params['client_id'] : null; + if (null === $clientId) { + $clientId = Stripe::getClientId(); + } + if (null === $clientId) { + $msg = 'No client_id provided. (HINT: set your client_id using ' + . '"Stripe::setClientId()". You can find your client_ids ' + . 'in your Stripe dashboard at ' + . 'https://dashboard.stripe.com/account/applications/settings, ' + . 'after registering your account as a platform. See ' + . 'https://stripe.com/docs/connect/standard-accounts for details, ' + . 'or email support@stripe.com if you have any questions.'; + + throw new Exception\AuthenticationException($msg); + } + + return $clientId; + } +} diff --git a/stripe-php/lib/OAuthErrorObject.php b/stripe-php/lib/OAuthErrorObject.php new file mode 100644 index 0000000..7190ac9 --- /dev/null +++ b/stripe-php/lib/OAuthErrorObject.php @@ -0,0 +1,32 @@ + null, + 'error_description' => null, + ], $values); + parent::refreshFrom($values, $opts, $partial); + } +} diff --git a/stripe-php/lib/PaymentAttemptRecord.php b/stripe-php/lib/PaymentAttemptRecord.php new file mode 100644 index 0000000..bbe00fc --- /dev/null +++ b/stripe-php/lib/PaymentAttemptRecord.php @@ -0,0 +1,80 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|(object{ach_credit_transfer?: (object{account_number: null|string, bank_name: null|string, routing_number: null|string, swift_code: null|string}&StripeObject), ach_debit?: (object{account_holder_type: null|string, bank_name: null|string, country: null|string, fingerprint: null|string, last4: null|string, routing_number: null|string}&StripeObject), acss_debit?: (object{bank_name: null|string, expected_debit_date?: string, fingerprint: null|string, institution_number: null|string, last4: null|string, mandate?: string, transit_number: null|string}&StripeObject), affirm?: (object{location?: string, reader?: string, transaction_id: null|string}&StripeObject), afterpay_clearpay?: (object{order_id: null|string, reference: null|string}&StripeObject), alipay?: (object{buyer_id?: string, fingerprint: null|string, transaction_id: null|string}&StripeObject), alma?: (object{installments?: (object{count: int}&StripeObject), transaction_id: null|string}&StripeObject), amazon_pay?: (object{funding?: (object{card?: (object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, funding: null|string, last4: null|string}&StripeObject), type: null|string}&StripeObject), transaction_id: null|string}&StripeObject), au_becs_debit?: (object{bsb_number: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate?: string}&StripeObject), bacs_debit?: (object{expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate: null|string, sort_code: null|string}&StripeObject), bancontact?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), billie?: (object{transaction_id: null|string}&StripeObject), billing_details: null|(object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, phone: null|string}&StripeObject), blik?: (object{buyer_id: null|string}&StripeObject), boleto?: (object{tax_id: string}&StripeObject), card?: (object{authorization_code: null|string, brand: string, capture_before?: int, checks: null|(object{address_line1_check: null|string, address_postal_code_check: null|string, cvc_check: null|string}&StripeObject), country: null|string, description: null|string, exp_month: int, exp_year: int, fingerprint?: null|string, funding: string, iin: null|string, installments: null|(object{plan: null|(object{count: null|int, interval: null|string, type: string}&StripeObject)}&StripeObject), issuer: null|string, last4: string, moto?: bool, network: null|string, network_advice_code: null|string, network_decline_code: null|string, network_token?: null|(object{used: bool}&StripeObject), network_transaction_id: null|string, stored_credential_usage: null|string, three_d_secure: null|(object{authentication_flow: null|string, result: null|string, result_reason: null|string, version: null|string}&StripeObject), wallet: null|(object{apple_pay?: (object{type: string}&StripeObject), dynamic_last4?: string, google_pay?: (object{}&StripeObject), type: string}&StripeObject)}&StripeObject), card_present?: (object{amount_authorized: null|int, brand: null|string, brand_product: null|string, capture_before?: int, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, incremental_authorization_supported: bool, issuer?: null|string, last4: null|string, network: null|string, network_transaction_id: null|string, offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), overcapture_supported: bool, preferred_locales: null|string[], read_method: null|string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject), wallet?: (object{type: string}&StripeObject)}&StripeObject), cashapp?: (object{buyer_id: null|string, cashtag: null|string, transaction_id: null|string}&StripeObject), crypto?: (object{buyer_address?: string, network?: string, token_currency?: string, transaction_hash?: string}&StripeObject), custom?: (object{display_name: string, type: null|string}&StripeObject), customer_balance?: (object{}&StripeObject), eps?: (object{bank: null|string, verified_name: null|string}&StripeObject), fpx?: (object{account_holder_type: null|string, bank: string, transaction_id: null|string}&StripeObject), giropay?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, verified_name: null|string}&StripeObject), grabpay?: (object{transaction_id: null|string}&StripeObject), ideal?: (object{bank: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, transaction_id: null|string, verified_name: null|string}&StripeObject), interac_present?: (object{brand: null|string, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, issuer?: null|string, last4: null|string, network: null|string, network_transaction_id: null|string, preferred_locales: null|string[], read_method: null|string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject)}&StripeObject), kakao_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), klarna?: (object{payer_details: null|(object{address: null|(object{country: null|string}&StripeObject)}&StripeObject), payment_method_category: null|string, preferred_locale: null|string}&StripeObject), konbini?: (object{store: null|(object{chain: null|string}&StripeObject)}&StripeObject), kr_card?: (object{brand: null|string, buyer_id: null|string, last4: null|string, transaction_id: null|string}&StripeObject), link?: (object{country: null|string}&StripeObject), mb_way?: (object{}&StripeObject), mobilepay?: (object{card: null|(object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, last4: null|string}&StripeObject)}&StripeObject), multibanco?: (object{entity: null|string, reference: null|string}&StripeObject), naver_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), nz_bank_account?: (object{account_holder_name: null|string, bank_code: string, bank_name: string, branch_code: string, expected_debit_date?: string, last4: string, suffix: null|string}&StripeObject), oxxo?: (object{number: null|string}&StripeObject), p24?: (object{bank: null|string, reference: null|string, verified_name: null|string}&StripeObject), pay_by_bank?: (object{}&StripeObject), payco?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), payment_method: null|string, paynow?: (object{location?: string, reader?: string, reference: null|string}&StripeObject), paypal?: (object{country: null|string, payer_email: null|string, payer_id: null|string, payer_name: null|string, seller_protection: null|(object{dispute_categories: null|string[], status: string}&StripeObject), transaction_id: null|string}&StripeObject), payto?: (object{bsb_number: null|string, last4: null|string, mandate?: string, pay_id: null|string}&StripeObject), pix?: (object{bank_transaction_id?: null|string}&StripeObject), promptpay?: (object{reference: null|string}&StripeObject), revolut_pay?: (object{funding?: (object{card?: (object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, funding: null|string, last4: null|string}&StripeObject), type: null|string}&StripeObject), transaction_id: null|string}&StripeObject), samsung_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), satispay?: (object{transaction_id: null|string}&StripeObject), sepa_credit_transfer?: (object{bank_name: null|string, bic: null|string, iban: null|string}&StripeObject), sepa_debit?: (object{bank_code: null|string, branch_code: null|string, country: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate: null|string}&StripeObject), sofort?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, country: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), stripe_account?: (object{}&StripeObject), swish?: (object{fingerprint: null|string, payment_reference: null|string, verified_phone_last4: null|string}&StripeObject), twint?: (object{}&StripeObject), type: string, us_bank_account?: (object{account_holder_type: null|string, account_type: null|string, bank_name: null|string, expected_debit_date?: null|string, fingerprint: null|string, last4: null|string, mandate?: Mandate|string, payment_reference: null|string, routing_number: null|string}&StripeObject), wechat?: (object{}&StripeObject), wechat_pay?: (object{fingerprint: null|string, location?: string, reader?: string, transaction_id: null|string}&StripeObject), zip?: (object{}&StripeObject)}&StripeObject) $payment_method_details Information about the Payment Method debited for this payment. + * @property null|string $payment_record ID of the Payment Record this Payment Attempt Record belongs to. + * @property (object{custom?: (object{payment_reference: null|string}&StripeObject), type: string}&StripeObject) $processor_details Processor information associated with this payment. + * @property string $reported_by Indicates who reported the payment. + * @property null|(object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), name: null|string, phone: null|string}&StripeObject) $shipping_details Shipping information for this payment. + */ +class PaymentAttemptRecord extends ApiResource +{ + const OBJECT_NAME = 'payment_attempt_record'; + + const CUSTOMER_PRESENCE_OFF_SESSION = 'off_session'; + const CUSTOMER_PRESENCE_ON_SESSION = 'on_session'; + + const REPORTED_BY_SELF = 'self'; + const REPORTED_BY_STRIPE = 'stripe'; + + /** + * List all the Payment Attempt Records attached to the specified Payment Record. + * + * @param null|array{expand?: string[], limit?: int, payment_record: string, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves a Payment Attempt Record with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return PaymentAttemptRecord + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/PaymentIntent.php b/stripe-php/lib/PaymentIntent.php new file mode 100644 index 0000000..4c62f2a --- /dev/null +++ b/stripe-php/lib/PaymentIntent.php @@ -0,0 +1,335 @@ +multiple statuses + * throughout its lifetime as it interfaces with Stripe.js to perform + * authentication flows and ultimately creates at most one successful charge. + * + * Related guide: Payment Intents API + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount intended to be collected by this PaymentIntent. A positive integer representing how much to charge in the smallest currency unit (e.g., 100 cents to charge $1.00 or 100 to charge ¥100, a zero-decimal currency). The minimum amount is $0.50 US or equivalent in charge currency. The amount value supports up to eight digits (e.g., a value of 99999999 for a USD charge of $999,999.99). + * @property int $amount_capturable Amount that can be captured from this PaymentIntent. + * @property null|(object{discount_amount?: int, line_items?: Collection, shipping?: (object{amount: null|int, from_postal_code: null|string, to_postal_code: null|string}&StripeObject), tax?: (object{total_tax_amount: null|int}&StripeObject), tip?: (object{amount?: int}&StripeObject)}&StripeObject) $amount_details + * @property int $amount_received Amount that this PaymentIntent collects. + * @property null|Application|string $application ID of the Connect application that created the PaymentIntent. + * @property null|int $application_fee_amount The amount of the application fee (if any) that will be requested to be applied to the payment and transferred to the application owner's Stripe account. The amount of the application fee collected will be capped at the total amount captured. For more information, see the PaymentIntents use case for connected accounts. + * @property null|(object{allow_redirects?: string, enabled: bool}&StripeObject) $automatic_payment_methods Settings to configure compatible payment methods from the Stripe Dashboard + * @property null|int $canceled_at Populated when status is canceled, this is the time at which the PaymentIntent was canceled. Measured in seconds since the Unix epoch. + * @property null|string $cancellation_reason Reason for cancellation of this PaymentIntent, either user-provided (duplicate, fraudulent, requested_by_customer, or abandoned) or generated by Stripe internally (failed_invoice, void_invoice, automatic, or expired). + * @property string $capture_method Controls when the funds will be captured from the customer's account. + * @property null|string $client_secret

The client secret of this PaymentIntent. Used for client-side retrieval using a publishable key.

The client secret can be used to complete a payment from your frontend. It should not be stored, logged, or exposed to anyone other than the customer. Make sure that you have TLS enabled on any page that includes the client secret.

Refer to our docs to accept a payment and learn about how client_secret should be handled.

+ * @property string $confirmation_method Describes whether we can confirm this PaymentIntent automatically, or if it requires customer action to confirm the payment. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|Customer|string $customer

ID of the Customer this PaymentIntent belongs to, if one exists.

Payment methods attached to other Customers cannot be used with this PaymentIntent.

If setup_future_usage is set and this PaymentIntent's payment method is not card_present, then the payment method attaches to the Customer after the PaymentIntent has been confirmed and any required actions from the user are complete. If the payment method is card_present and isn't a digital wallet, then a generated_card payment method representing the card is created and attached to the Customer instead.

+ * @property null|string $customer_account

ID of the Account representing the customer that this PaymentIntent belongs to, if one exists.

Payment methods attached to other Accounts cannot be used with this PaymentIntent.

If setup_future_usage is set and this PaymentIntent's payment method is not card_present, then the payment method attaches to the Account after the PaymentIntent has been confirmed and any required actions from the user are complete. If the payment method is card_present and isn't a digital wallet, then a generated_card payment method representing the card is created and attached to the Account instead.

+ * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|string[] $excluded_payment_method_types The list of payment method types to exclude from use with this payment. + * @property null|(object{inputs?: (object{tax?: (object{calculation: string}&StripeObject)}&StripeObject)}&StripeObject) $hooks + * @property null|(object{advice_code?: string, charge?: string, code?: string, decline_code?: string, doc_url?: string, message?: string, network_advice_code?: string, network_decline_code?: string, param?: string, payment_intent?: PaymentIntent, payment_method?: PaymentMethod, payment_method_type?: string, request_log_url?: string, setup_intent?: SetupIntent, source?: Account|BankAccount|Card|Source, type: string}&StripeObject) $last_payment_error The payment error encountered in the previous PaymentIntent confirmation. It will be cleared if the PaymentIntent is later updated for any reason. + * @property null|Charge|string $latest_charge ID of the latest Charge object created by this PaymentIntent. This property is null until PaymentIntent confirmation is attempted. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. Learn more about storing information in metadata. + * @property null|(object{alipay_handle_redirect?: (object{native_data: null|string, native_url: null|string, return_url: null|string, url: null|string}&StripeObject), boleto_display_details?: (object{expires_at: null|int, hosted_voucher_url: null|string, number: null|string, pdf: null|string}&StripeObject), card_await_notification?: (object{charge_attempt_at: null|int, customer_approval_required: null|bool}&StripeObject), cashapp_handle_redirect_or_display_qr_code?: (object{hosted_instructions_url: string, mobile_auth_url: string, qr_code: (object{expires_at: int, image_url_png: string, image_url_svg: string}&StripeObject)}&StripeObject), display_bank_transfer_instructions?: (object{amount_remaining: null|int, currency: null|string, financial_addresses?: ((object{aba?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, account_number: string, account_type: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_name: string, routing_number: string}&StripeObject), iban?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bic: string, country: string, iban: string}&StripeObject), sort_code?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, account_number: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), sort_code: string}&StripeObject), spei?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_code: string, bank_name: string, clabe: string}&StripeObject), supported_networks?: string[], swift?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: string, account_number: string, account_type: string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_name: string, swift_code: string}&StripeObject), type: string, zengin?: (object{account_holder_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), account_holder_name: null|string, account_number: null|string, account_type: null|string, bank_address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), bank_code: null|string, bank_name: null|string, branch_code: null|string, branch_name: null|string}&StripeObject)}&StripeObject))[], hosted_instructions_url: null|string, reference: null|string, type: string}&StripeObject), konbini_display_details?: (object{expires_at: int, hosted_voucher_url: null|string, stores: (object{familymart: null|(object{confirmation_number?: string, payment_code: string}&StripeObject), lawson: null|(object{confirmation_number?: string, payment_code: string}&StripeObject), ministop: null|(object{confirmation_number?: string, payment_code: string}&StripeObject), seicomart: null|(object{confirmation_number?: string, payment_code: string}&StripeObject)}&StripeObject)}&StripeObject), multibanco_display_details?: (object{entity: null|string, expires_at: null|int, hosted_voucher_url: null|string, reference: null|string}&StripeObject), oxxo_display_details?: (object{expires_after: null|int, hosted_voucher_url: null|string, number: null|string}&StripeObject), paynow_display_qr_code?: (object{data: string, hosted_instructions_url: null|string, image_url_png: string, image_url_svg: string}&StripeObject), pix_display_qr_code?: (object{data?: string, expires_at?: int, hosted_instructions_url?: string, image_url_png?: string, image_url_svg?: string}&StripeObject), promptpay_display_qr_code?: (object{data: string, hosted_instructions_url: string, image_url_png: string, image_url_svg: string}&StripeObject), redirect_to_url?: (object{return_url: null|string, url: null|string}&StripeObject), swish_handle_redirect_or_display_qr_code?: (object{hosted_instructions_url: string, mobile_auth_url: string, qr_code: (object{data: string, image_url_png: string, image_url_svg: string}&StripeObject)}&StripeObject), type: string, use_stripe_sdk?: StripeObject, verify_with_microdeposits?: (object{arrival_date: int, hosted_verification_url: string, microdeposit_type: null|string}&StripeObject), wechat_pay_display_qr_code?: (object{data: string, hosted_instructions_url: string, image_data_url: string, image_url_png: string, image_url_svg: string}&StripeObject), wechat_pay_redirect_to_android_app?: (object{app_id: string, nonce_str: string, package: string, partner_id: string, prepay_id: string, sign: string, timestamp: string}&StripeObject), wechat_pay_redirect_to_ios_app?: (object{native_url: string}&StripeObject)}&StripeObject) $next_action If present, this property tells you what actions you need to take in order for your customer to fulfill a payment using the provided source. + * @property null|Account|string $on_behalf_of You can specify the settlement merchant as the connected account using the on_behalf_of attribute on the charge. See the PaymentIntents use case for connected accounts for details. + * @property null|(object{customer_reference: null|string, order_reference: null|string}&StripeObject) $payment_details + * @property null|PaymentMethod|string $payment_method ID of the payment method used in this PaymentIntent. + * @property null|(object{id: string, parent: null|string}&StripeObject) $payment_method_configuration_details Information about the payment method configuration used for this PaymentIntent. + * @property null|(object{acss_debit?: (object{mandate_options?: (object{custom_mandate_url?: string, interval_description: null|string, payment_schedule: null|string, transaction_type: null|string}&StripeObject), setup_future_usage?: string, target_date?: string, verification_method?: string}&StripeObject), affirm?: (object{capture_method?: string, preferred_locale?: string, setup_future_usage?: string}&StripeObject), afterpay_clearpay?: (object{capture_method?: string, reference: null|string, setup_future_usage?: string}&StripeObject), alipay?: (object{setup_future_usage?: string}&StripeObject), alma?: (object{capture_method?: string}&StripeObject), amazon_pay?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), au_becs_debit?: (object{setup_future_usage?: string, target_date?: string}&StripeObject), bacs_debit?: (object{mandate_options?: (object{reference_prefix?: string}&StripeObject), setup_future_usage?: string, target_date?: string}&StripeObject), bancontact?: (object{preferred_language: string, setup_future_usage?: string}&StripeObject), billie?: (object{capture_method?: string}&StripeObject), blik?: (object{setup_future_usage?: string}&StripeObject), boleto?: (object{expires_after_days: int, setup_future_usage?: string}&StripeObject), card?: (object{capture_method?: string, installments: null|(object{available_plans: null|((object{count: null|int, interval: null|string, type: string}&StripeObject))[], enabled: bool, plan: null|(object{count: null|int, interval: null|string, type: string}&StripeObject)}&StripeObject), mandate_options: null|(object{amount: int, amount_type: string, description: null|string, end_date: null|int, interval: string, interval_count: null|int, reference: string, start_date: int, supported_types: null|string[]}&StripeObject), network: null|string, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure: null|string, require_cvc_recollection?: bool, setup_future_usage?: string, statement_descriptor_suffix_kana?: string, statement_descriptor_suffix_kanji?: string}&StripeObject), card_present?: (object{capture_method?: string, request_extended_authorization: null|bool, request_incremental_authorization_support: null|bool, routing?: (object{requested_priority: null|string}&StripeObject)}&StripeObject), cashapp?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), crypto?: (object{setup_future_usage?: string}&StripeObject), customer_balance?: (object{bank_transfer?: (object{eu_bank_transfer?: (object{country: string}&StripeObject), requested_address_types?: string[], type: null|string}&StripeObject), funding_type: null|string, setup_future_usage?: string}&StripeObject), eps?: (object{setup_future_usage?: string}&StripeObject), fpx?: (object{setup_future_usage?: string}&StripeObject), giropay?: (object{setup_future_usage?: string}&StripeObject), grabpay?: (object{setup_future_usage?: string}&StripeObject), ideal?: (object{setup_future_usage?: string}&StripeObject), interac_present?: (object{}&StripeObject), kakao_pay?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), klarna?: (object{capture_method?: string, preferred_locale: null|string, setup_future_usage?: string}&StripeObject), konbini?: (object{confirmation_number: null|string, expires_after_days: null|int, expires_at: null|int, product_description: null|string, setup_future_usage?: string}&StripeObject), kr_card?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), link?: (object{capture_method?: string, persistent_token: null|string, setup_future_usage?: string}&StripeObject), mb_way?: (object{setup_future_usage?: string}&StripeObject), mobilepay?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), multibanco?: (object{setup_future_usage?: string}&StripeObject), naver_pay?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), nz_bank_account?: (object{setup_future_usage?: string, target_date?: string}&StripeObject), oxxo?: (object{expires_after_days: int, setup_future_usage?: string}&StripeObject), p24?: (object{setup_future_usage?: string}&StripeObject), pay_by_bank?: (object{}&StripeObject), payco?: (object{capture_method?: string}&StripeObject), paynow?: (object{setup_future_usage?: string}&StripeObject), paypal?: (object{capture_method?: string, preferred_locale: null|string, reference: null|string, setup_future_usage?: string}&StripeObject), payto?: (object{mandate_options?: (object{amount: null|int, amount_type: null|string, end_date: null|string, payment_schedule: null|string, payments_per_period: null|int, purpose: null|string}&StripeObject), setup_future_usage?: string}&StripeObject), pix?: (object{amount_includes_iof?: string, expires_after_seconds: null|int, expires_at: null|int, setup_future_usage?: string}&StripeObject), promptpay?: (object{setup_future_usage?: string}&StripeObject), revolut_pay?: (object{capture_method?: string, setup_future_usage?: string}&StripeObject), samsung_pay?: (object{capture_method?: string}&StripeObject), satispay?: (object{capture_method?: string}&StripeObject), sepa_debit?: (object{mandate_options?: (object{reference_prefix?: string}&StripeObject), setup_future_usage?: string, target_date?: string}&StripeObject), sofort?: (object{preferred_language: null|string, setup_future_usage?: string}&StripeObject), swish?: (object{reference: null|string, setup_future_usage?: string}&StripeObject), twint?: (object{setup_future_usage?: string}&StripeObject), us_bank_account?: (object{financial_connections?: (object{filters?: (object{account_subcategories?: string[]}&StripeObject), permissions?: string[], prefetch: null|string[], return_url?: string}&StripeObject), mandate_options?: (object{collection_method?: string}&StripeObject), preferred_settlement_speed?: string, setup_future_usage?: string, target_date?: string, verification_method?: string}&StripeObject), wechat_pay?: (object{app_id: null|string, client: null|string, setup_future_usage?: string}&StripeObject), zip?: (object{setup_future_usage?: string}&StripeObject)}&StripeObject) $payment_method_options Payment-method-specific configuration for this PaymentIntent. + * @property string[] $payment_method_types The list of payment method types (e.g. card) that this PaymentIntent is allowed to use. A comprehensive list of valid payment method types can be found here. + * @property null|(object{presentment_amount: int, presentment_currency: string}&StripeObject) $presentment_details + * @property null|(object{card?: (object{customer_notification?: (object{approval_requested: null|bool, completes_at: null|int}&StripeObject)}&StripeObject), type: string}&StripeObject) $processing If present, this property tells you about the processing state of the payment. + * @property null|string $receipt_email Email address that the receipt for the resulting payment will be sent to. If receipt_email is specified for a payment in live mode, a receipt will be sent regardless of your email settings. + * @property null|Review|string $review ID of the review associated with this PaymentIntent, if any. + * @property null|string $setup_future_usage

Indicates that you intend to make future payments with this PaymentIntent's payment method.

If you provide a Customer with the PaymentIntent, you can use this parameter to attach the payment method to the Customer after the PaymentIntent is confirmed and the customer completes any required actions. If you don't provide a Customer, you can still attach the payment method to a Customer after the transaction completes.

If the payment method is card_present and isn't a digital wallet, Stripe creates and attaches a generated_card payment method representing the card to the Customer instead.

When processing card payments, Stripe uses setup_future_usage to help you comply with regional legislation and network rules, such as SCA.

+ * @property null|(object{address?: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), carrier?: null|string, name?: string, phone?: null|string, tracking_number?: null|string}&StripeObject) $shipping Shipping information for this PaymentIntent. + * @property null|Account|BankAccount|Card|Source|string $source This is a legacy field that will be removed in the future. It is the ID of the Source object that is associated with this PaymentIntent, if one was supplied. + * @property null|string $statement_descriptor

Text that appears on the customer's statement as the statement descriptor for a non-card charge. This value overrides the account's default statement descriptor. For information about requirements, including the 22-character limit, see the Statement Descriptor docs.

Setting this value for a card charge returns an error. For card charges, set the statement_descriptor_suffix instead.

+ * @property null|string $statement_descriptor_suffix Provides information about a card charge. Concatenated to the account's statement descriptor prefix to form the complete statement descriptor that appears on the customer's statement. + * @property string $status Status of this PaymentIntent, one of requires_payment_method, requires_confirmation, requires_action, processing, requires_capture, canceled, or succeeded. Read more about each PaymentIntent status. + * @property null|(object{amount?: int, destination: Account|string}&StripeObject) $transfer_data The data that automatically creates a Transfer after the payment finalizes. Learn more about the use case for connected accounts. + * @property null|string $transfer_group A string that identifies the resulting payment as part of a group. Learn more about the use case for connected accounts. + */ +class PaymentIntent extends ApiResource +{ + const OBJECT_NAME = 'payment_intent'; + + use ApiOperations\NestedResource; + use ApiOperations\Update; + + const CANCELLATION_REASON_ABANDONED = 'abandoned'; + const CANCELLATION_REASON_AUTOMATIC = 'automatic'; + const CANCELLATION_REASON_DUPLICATE = 'duplicate'; + const CANCELLATION_REASON_EXPIRED = 'expired'; + const CANCELLATION_REASON_FAILED_INVOICE = 'failed_invoice'; + const CANCELLATION_REASON_FRAUDULENT = 'fraudulent'; + const CANCELLATION_REASON_REQUESTED_BY_CUSTOMER = 'requested_by_customer'; + const CANCELLATION_REASON_VOID_INVOICE = 'void_invoice'; + + const CAPTURE_METHOD_AUTOMATIC = 'automatic'; + const CAPTURE_METHOD_AUTOMATIC_ASYNC = 'automatic_async'; + const CAPTURE_METHOD_MANUAL = 'manual'; + + const CONFIRMATION_METHOD_AUTOMATIC = 'automatic'; + const CONFIRMATION_METHOD_MANUAL = 'manual'; + + const SETUP_FUTURE_USAGE_OFF_SESSION = 'off_session'; + const SETUP_FUTURE_USAGE_ON_SESSION = 'on_session'; + + const STATUS_CANCELED = 'canceled'; + const STATUS_PROCESSING = 'processing'; + const STATUS_REQUIRES_ACTION = 'requires_action'; + const STATUS_REQUIRES_CAPTURE = 'requires_capture'; + const STATUS_REQUIRES_CONFIRMATION = 'requires_confirmation'; + const STATUS_REQUIRES_PAYMENT_METHOD = 'requires_payment_method'; + const STATUS_SUCCEEDED = 'succeeded'; + + /** + * Creates a PaymentIntent object. + * + * After the PaymentIntent is created, attach a payment method and confirm to continue the payment. + * Learn more about the available payment + * flows with the Payment Intents API. + * + * When you use confirm=true during creation, it’s equivalent to + * creating and confirming the PaymentIntent in the same call. You can use any + * parameters available in the confirm + * API when you supply confirm=true. + * + * @param null|array{amount: int, amount_details?: array{discount_amount?: null|int, line_items?: null|array{discount_amount?: int, payment_method_options?: array{card?: array{commodity_code?: string}, card_present?: array{commodity_code?: string}, klarna?: array{image_url?: string, product_url?: string, reference?: string, subscription_reference?: string}, paypal?: array{category?: string, description?: string, sold_by?: string}}, product_code?: string, product_name: string, quantity: int, tax?: array{total_tax_amount: int}, unit_cost: int, unit_of_measure?: string}[], shipping?: null|array{amount?: null|int, from_postal_code?: null|string, to_postal_code?: null|string}, tax?: null|array{total_tax_amount: int}}, application_fee_amount?: int, automatic_payment_methods?: array{allow_redirects?: string, enabled: bool}, capture_method?: string, confirm?: bool, confirmation_method?: string, confirmation_token?: string, currency: string, customer?: string, customer_account?: string, description?: string, error_on_requires_action?: bool, excluded_payment_method_types?: string[], expand?: string[], hooks?: array{inputs?: array{tax?: array{calculation: null|string}}}, mandate?: string, mandate_data?: null|array{customer_acceptance: array{accepted_at?: int, offline?: array{}, online?: array{ip_address: string, user_agent: string}, type: string}}, metadata?: array, off_session?: array|bool|string, on_behalf_of?: string, payment_details?: array{customer_reference?: null|string, order_reference?: null|string}, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{custom_mandate_url?: null|string, interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, affirm?: null|array{capture_method?: null|string, preferred_locale?: string, setup_future_usage?: string}, afterpay_clearpay?: null|array{capture_method?: null|string, reference?: string, setup_future_usage?: string}, alipay?: null|array{setup_future_usage?: null|string}, alma?: null|array{capture_method?: null|string}, amazon_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, au_becs_debit?: null|array{setup_future_usage?: null|string, target_date?: string}, bacs_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, bancontact?: null|array{preferred_language?: string, setup_future_usage?: null|string}, billie?: null|array{capture_method?: null|string}, blik?: null|array{code?: string, setup_future_usage?: null|string}, boleto?: null|array{expires_after_days?: int, setup_future_usage?: null|string}, card?: null|array{capture_method?: null|string, cvc_token?: string, installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, mandate_options?: array{amount: int, amount_type: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, require_cvc_recollection?: bool, setup_future_usage?: null|string, statement_descriptor_suffix_kana?: null|string, statement_descriptor_suffix_kanji?: null|string, three_d_secure?: array{ares_trans_status?: string, cryptogram: string, electronic_commerce_indicator?: string, exemption_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id: string, version: string}}, card_present?: null|array{capture_method?: string, request_extended_authorization?: bool, request_incremental_authorization_support?: bool, routing?: array{requested_priority?: string}}, cashapp?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, crypto?: null|array{setup_future_usage?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, eps?: null|array{setup_future_usage?: string}, fpx?: null|array{setup_future_usage?: string}, giropay?: null|array{setup_future_usage?: string}, grabpay?: null|array{setup_future_usage?: string}, ideal?: null|array{setup_future_usage?: null|string}, interac_present?: null|array{}, kakao_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, klarna?: null|array{capture_method?: null|string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing?: array{amount: int, date: string}, reference: string}[]}, konbini?: null|array{confirmation_number?: null|string, expires_after_days?: null|int, expires_at?: null|int, product_description?: null|string, setup_future_usage?: string}, kr_card?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, link?: null|array{capture_method?: null|string, persistent_token?: string, setup_future_usage?: null|string}, mb_way?: null|array{setup_future_usage?: string}, mobilepay?: null|array{capture_method?: null|string, setup_future_usage?: string}, multibanco?: null|array{setup_future_usage?: string}, naver_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, nz_bank_account?: null|array{setup_future_usage?: null|string, target_date?: string}, oxxo?: null|array{expires_after_days?: int, setup_future_usage?: string}, p24?: null|array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: null|array{}, payco?: null|array{capture_method?: null|string}, paynow?: null|array{setup_future_usage?: string}, paypal?: null|array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: null|array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string}, setup_future_usage?: null|string}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int, expires_at?: int, setup_future_usage?: string}, promptpay?: null|array{setup_future_usage?: string}, revolut_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, samsung_pay?: null|array{capture_method?: null|string}, satispay?: null|array{capture_method?: null|string}, sepa_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, sofort?: null|array{preferred_language?: null|string, setup_future_usage?: null|string}, swish?: null|array{reference?: null|string, setup_future_usage?: string}, twint?: null|array{setup_future_usage?: string}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, preferred_settlement_speed?: null|string, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, wechat_pay?: null|array{app_id?: string, client?: string, setup_future_usage?: string}, zip?: null|array{setup_future_usage?: string}}, payment_method_types?: string[], radar_options?: array{session?: string}, receipt_email?: string, return_url?: string, setup_future_usage?: string, shipping?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, destination: string}, transfer_group?: string, use_stripe_sdk?: bool} $params + * @param null|array|string $options + * + * @return PaymentIntent the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of PaymentIntents. + * + * @param null|array{created?: array|int, customer?: string, customer_account?: string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the details of a PaymentIntent that has previously been created. + * + * You can retrieve a PaymentIntent client-side using a publishable key when the + * client_secret is in the query string. + * + * If you retrieve a PaymentIntent with a publishable key, it only returns a subset + * of properties. Refer to the payment intent + * object reference for more details. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return PaymentIntent + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates properties on a PaymentIntent object without confirming. + * + * Depending on which properties you update, you might need to confirm the + * PaymentIntent again. For example, updating the payment_method + * always requires you to confirm the PaymentIntent again. If you prefer to update + * and confirm at the same time, we recommend updating properties through the confirm API instead. + * + * @param string $id the ID of the resource to update + * @param null|array{amount?: int, amount_details?: null|array{discount_amount?: null|int, line_items?: null|array{discount_amount?: int, payment_method_options?: array{card?: array{commodity_code?: string}, card_present?: array{commodity_code?: string}, klarna?: array{image_url?: string, product_url?: string, reference?: string, subscription_reference?: string}, paypal?: array{category?: string, description?: string, sold_by?: string}}, product_code?: string, product_name: string, quantity: int, tax?: array{total_tax_amount: int}, unit_cost: int, unit_of_measure?: string}[], shipping?: null|array{amount?: null|int, from_postal_code?: null|string, to_postal_code?: null|string}, tax?: null|array{total_tax_amount: int}}, application_fee_amount?: null|int, capture_method?: string, currency?: string, customer?: string, customer_account?: string, description?: string, excluded_payment_method_types?: null|string[], expand?: string[], hooks?: array{inputs?: array{tax?: array{calculation: null|string}}}, metadata?: null|array, payment_details?: null|array{customer_reference?: null|string, order_reference?: null|string}, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{custom_mandate_url?: null|string, interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, affirm?: null|array{capture_method?: null|string, preferred_locale?: string, setup_future_usage?: string}, afterpay_clearpay?: null|array{capture_method?: null|string, reference?: string, setup_future_usage?: string}, alipay?: null|array{setup_future_usage?: null|string}, alma?: null|array{capture_method?: null|string}, amazon_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, au_becs_debit?: null|array{setup_future_usage?: null|string, target_date?: string}, bacs_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, bancontact?: null|array{preferred_language?: string, setup_future_usage?: null|string}, billie?: null|array{capture_method?: null|string}, blik?: null|array{code?: string, setup_future_usage?: null|string}, boleto?: null|array{expires_after_days?: int, setup_future_usage?: null|string}, card?: null|array{capture_method?: null|string, cvc_token?: string, installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, mandate_options?: array{amount: int, amount_type: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, require_cvc_recollection?: bool, setup_future_usage?: null|string, statement_descriptor_suffix_kana?: null|string, statement_descriptor_suffix_kanji?: null|string, three_d_secure?: array{ares_trans_status?: string, cryptogram: string, electronic_commerce_indicator?: string, exemption_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id: string, version: string}}, card_present?: null|array{capture_method?: string, request_extended_authorization?: bool, request_incremental_authorization_support?: bool, routing?: array{requested_priority?: string}}, cashapp?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, crypto?: null|array{setup_future_usage?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, eps?: null|array{setup_future_usage?: string}, fpx?: null|array{setup_future_usage?: string}, giropay?: null|array{setup_future_usage?: string}, grabpay?: null|array{setup_future_usage?: string}, ideal?: null|array{setup_future_usage?: null|string}, interac_present?: null|array{}, kakao_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, klarna?: null|array{capture_method?: null|string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing?: array{amount: int, date: string}, reference: string}[]}, konbini?: null|array{confirmation_number?: null|string, expires_after_days?: null|int, expires_at?: null|int, product_description?: null|string, setup_future_usage?: string}, kr_card?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, link?: null|array{capture_method?: null|string, persistent_token?: string, setup_future_usage?: null|string}, mb_way?: null|array{setup_future_usage?: string}, mobilepay?: null|array{capture_method?: null|string, setup_future_usage?: string}, multibanco?: null|array{setup_future_usage?: string}, naver_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, nz_bank_account?: null|array{setup_future_usage?: null|string, target_date?: string}, oxxo?: null|array{expires_after_days?: int, setup_future_usage?: string}, p24?: null|array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: null|array{}, payco?: null|array{capture_method?: null|string}, paynow?: null|array{setup_future_usage?: string}, paypal?: null|array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: null|array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string}, setup_future_usage?: null|string}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int, expires_at?: int, setup_future_usage?: string}, promptpay?: null|array{setup_future_usage?: string}, revolut_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, samsung_pay?: null|array{capture_method?: null|string}, satispay?: null|array{capture_method?: null|string}, sepa_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, sofort?: null|array{preferred_language?: null|string, setup_future_usage?: null|string}, swish?: null|array{reference?: null|string, setup_future_usage?: string}, twint?: null|array{setup_future_usage?: string}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, preferred_settlement_speed?: null|string, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, wechat_pay?: null|array{app_id?: string, client?: string, setup_future_usage?: string}, zip?: null|array{setup_future_usage?: string}}, payment_method_types?: string[], receipt_email?: null|string, setup_future_usage?: null|string, shipping?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int}, transfer_group?: string} $params + * @param null|array|string $opts + * + * @return PaymentIntent the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return PaymentIntent the applied payment intent + * + * @throws Exception\ApiErrorException if the request fails + */ + public function applyCustomerBalance($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/apply_customer_balance'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return PaymentIntent the canceled payment intent + * + * @throws Exception\ApiErrorException if the request fails + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return PaymentIntent the captured payment intent + * + * @throws Exception\ApiErrorException if the request fails + */ + public function capture($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/capture'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return PaymentIntent the confirmed payment intent + * + * @throws Exception\ApiErrorException if the request fails + */ + public function confirm($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/confirm'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return PaymentIntent the incremented payment intent + * + * @throws Exception\ApiErrorException if the request fails + */ + public function incrementAuthorization($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/increment_authorization'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return PaymentIntent the verified payment intent + * + * @throws Exception\ApiErrorException if the request fails + */ + public function verifyMicrodeposits($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/verify_microdeposits'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return SearchResult the payment intent search results + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function search($params = null, $opts = null) + { + $url = '/v1/payment_intents/search'; + + return static::_requestPage($url, SearchResult::class, $params, $opts); + } + + const PATH_AMOUNT_DETAILS_LINE_ITEMS = '/amount_details_line_items'; + + /** + * @param string $id the ID of the payment intent on which to retrieve the payment intent amount details line items + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection the list of payment intent amount details line items + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allAmountDetailsLineItems($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_AMOUNT_DETAILS_LINE_ITEMS, $params, $opts); + } +} diff --git a/stripe-php/lib/PaymentIntentAmountDetailsLineItem.php b/stripe-php/lib/PaymentIntentAmountDetailsLineItem.php new file mode 100644 index 0000000..4b5856f --- /dev/null +++ b/stripe-php/lib/PaymentIntentAmountDetailsLineItem.php @@ -0,0 +1,22 @@ +The discount applied on this line item represented in the smallest currency unit. An integer greater than 0.

This field is mutually exclusive with the amount_details[discount_amount] field.

+ * @property null|(object{card?: (object{commodity_code: null|string}&StripeObject), card_present?: (object{commodity_code: null|string}&StripeObject), klarna?: (object{image_url: null|string, product_url: null|string, reference: null|string, subscription_reference: null|string}&StripeObject), paypal?: (object{category?: string, description?: string, sold_by?: string}&StripeObject)}&StripeObject) $payment_method_options Payment method-specific information for line items. + * @property null|string $product_code The product code of the line item, such as an SKU. Required for L3 rates. At most 12 characters long. + * @property string $product_name

The product name of the line item. Required for L3 rates. At most 1024 characters long.

For Cards, this field is truncated to 26 alphanumeric characters before being sent to the card networks. For Paypal, this field is truncated to 127 characters.

+ * @property int $quantity The quantity of items. Required for L3 rates. An integer greater than 0. + * @property null|(object{total_tax_amount: int}&StripeObject) $tax Contains information about the tax on the item. + * @property int $unit_cost The unit cost of the line item represented in the smallest currency unit. Required for L3 rates. An integer greater than or equal to 0. + * @property null|string $unit_of_measure A unit of measure for the line item, such as gallons, feet, meters, etc. Required for L3 rates. At most 12 alphanumeric characters long. + */ +class PaymentIntentAmountDetailsLineItem extends ApiResource +{ + const OBJECT_NAME = 'payment_intent_amount_details_line_item'; +} diff --git a/stripe-php/lib/PaymentLink.php b/stripe-php/lib/PaymentLink.php new file mode 100644 index 0000000..bb8c020 --- /dev/null +++ b/stripe-php/lib/PaymentLink.php @@ -0,0 +1,170 @@ +checkout session to render the payment page. You can use checkout session events to track payments through payment links. + * + * Related guide: Payment Links API + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property bool $active Whether the payment link's url is active. If false, customers visiting the URL will be shown a page saying that the link has been deactivated. + * @property (object{hosted_confirmation?: (object{custom_message: null|string}&StripeObject), redirect?: (object{url: string}&StripeObject), type: string}&StripeObject) $after_completion + * @property bool $allow_promotion_codes Whether user redeemable promotion codes are enabled. + * @property null|Application|string $application The ID of the Connect application that created the Payment Link. + * @property null|int $application_fee_amount The amount of the application fee (if any) that will be requested to be applied to the payment and transferred to the application owner's Stripe account. + * @property null|float $application_fee_percent This represents the percentage of the subscription invoice total that will be transferred to the application owner's Stripe account. + * @property (object{enabled: bool, liability: null|(object{account?: Account|string, type: string}&StripeObject)}&StripeObject) $automatic_tax + * @property string $billing_address_collection Configuration for collecting the customer's billing address. Defaults to auto. + * @property null|(object{payment_method_reuse_agreement: null|(object{position: string}&StripeObject), promotions: null|string, terms_of_service: null|string}&StripeObject) $consent_collection When set, provides configuration to gather active consent from customers. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property ((object{dropdown?: (object{default_value: null|string, options: (object{label: string, value: string}&StripeObject)[]}&StripeObject), key: string, label: (object{custom: null|string, type: string}&StripeObject), numeric?: (object{default_value: null|string, maximum_length: null|int, minimum_length: null|int}&StripeObject), optional: bool, text?: (object{default_value: null|string, maximum_length: null|int, minimum_length: null|int}&StripeObject), type: string}&StripeObject))[] $custom_fields Collect additional information from your customer using custom fields. Up to 3 fields are supported. + * @property (object{after_submit: null|(object{message: string}&StripeObject), shipping_address: null|(object{message: string}&StripeObject), submit: null|(object{message: string}&StripeObject), terms_of_service_acceptance: null|(object{message: string}&StripeObject)}&StripeObject) $custom_text + * @property string $customer_creation Configuration for Customer creation during checkout. + * @property null|string $inactive_message The custom message to be displayed to a customer when a payment link is no longer active. + * @property null|(object{enabled: bool, invoice_data: null|(object{account_tax_ids: null|(string|TaxId)[], custom_fields: null|(object{name: string, value: string}&StripeObject)[], description: null|string, footer: null|string, issuer: null|(object{account?: Account|string, type: string}&StripeObject), metadata: null|StripeObject, rendering_options: null|(object{amount_tax_display: null|string, template: null|string}&StripeObject)}&StripeObject)}&StripeObject) $invoice_creation Configuration for creating invoice for payment mode payment links. + * @property null|Collection $line_items The line items representing what is being sold. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|(object{business?: (object{enabled: bool, optional: bool}&StripeObject), individual?: (object{enabled: bool, optional: bool}&StripeObject)}&StripeObject) $name_collection + * @property null|Account|string $on_behalf_of The account on behalf of which to charge. See the Connect documentation for details. + * @property null|((object{adjustable_quantity: null|(object{enabled: bool, maximum: null|int, minimum: null|int}&StripeObject), price: string, quantity: int}&StripeObject))[] $optional_items The optional items presented to the customer at checkout. + * @property null|(object{capture_method: null|string, description: null|string, metadata: StripeObject, setup_future_usage: null|string, statement_descriptor: null|string, statement_descriptor_suffix: null|string, transfer_group: null|string}&StripeObject) $payment_intent_data Indicates the parameters to be passed to PaymentIntent creation during checkout. + * @property string $payment_method_collection Configuration for collecting a payment method during checkout. Defaults to always. + * @property null|string[] $payment_method_types The list of payment method types that customers can use. When null, Stripe will dynamically show relevant payment methods you've enabled in your payment method settings. + * @property (object{enabled: bool}&StripeObject) $phone_number_collection + * @property null|(object{completed_sessions: (object{count: int, limit: int}&StripeObject)}&StripeObject) $restrictions Settings that restrict the usage of a payment link. + * @property null|(object{allowed_countries: string[]}&StripeObject) $shipping_address_collection Configuration for collecting the customer's shipping address. + * @property ((object{shipping_amount: int, shipping_rate: ShippingRate|string}&StripeObject))[] $shipping_options The shipping rate options applied to the session. + * @property string $submit_type Indicates the type of transaction being performed which customizes relevant text on the page, such as the submit button. + * @property null|(object{description: null|string, invoice_settings: (object{issuer: (object{account?: Account|string, type: string}&StripeObject)}&StripeObject), metadata: StripeObject, trial_period_days: null|int, trial_settings: null|(object{end_behavior: (object{missing_payment_method: string}&StripeObject)}&StripeObject)}&StripeObject) $subscription_data When creating a subscription, the specified configuration data will be used. There must be at least one line item with a recurring price to use subscription_data. + * @property (object{enabled: bool, required: string}&StripeObject) $tax_id_collection + * @property null|(object{amount: null|int, destination: Account|string}&StripeObject) $transfer_data The account (if any) the payments will be attributed to for tax reporting, and where funds from each payment will be transferred to. + * @property string $url The public URL that can be shared with customers. + */ +class PaymentLink extends ApiResource +{ + const OBJECT_NAME = 'payment_link'; + + use ApiOperations\Update; + + const BILLING_ADDRESS_COLLECTION_AUTO = 'auto'; + const BILLING_ADDRESS_COLLECTION_REQUIRED = 'required'; + + const CUSTOMER_CREATION_ALWAYS = 'always'; + const CUSTOMER_CREATION_IF_REQUIRED = 'if_required'; + + const PAYMENT_METHOD_COLLECTION_ALWAYS = 'always'; + const PAYMENT_METHOD_COLLECTION_IF_REQUIRED = 'if_required'; + + const SUBMIT_TYPE_AUTO = 'auto'; + const SUBMIT_TYPE_BOOK = 'book'; + const SUBMIT_TYPE_DONATE = 'donate'; + const SUBMIT_TYPE_PAY = 'pay'; + const SUBMIT_TYPE_SUBSCRIBE = 'subscribe'; + + /** + * Creates a payment link. + * + * @param null|array{after_completion?: array{hosted_confirmation?: array{custom_message?: string}, redirect?: array{url: string}, type: string}, allow_promotion_codes?: bool, application_fee_amount?: int, application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_address_collection?: string, consent_collection?: array{payment_method_reuse_agreement?: array{position: string}, promotions?: string, terms_of_service?: string}, currency?: string, custom_fields?: array{dropdown?: array{default_value?: string, options: array{label: string, value: string}[]}, key: string, label: array{custom: string, type: string}, numeric?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, optional?: bool, text?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, type: string}[], custom_text?: array{after_submit?: null|array{message: string}, shipping_address?: null|array{message: string}, submit?: null|array{message: string}, terms_of_service_acceptance?: null|array{message: string}}, customer_creation?: string, expand?: string[], inactive_message?: string, invoice_creation?: array{enabled: bool, invoice_data?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}, metadata?: null|array, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}}, line_items: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price?: string, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity: int}[], metadata?: array, name_collection?: array{business?: array{enabled: bool, optional?: bool}, individual?: array{enabled: bool, optional?: bool}}, on_behalf_of?: string, optional_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price: string, quantity: int}[], payment_intent_data?: array{capture_method?: string, description?: string, metadata?: array, setup_future_usage?: string, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_group?: string}, payment_method_collection?: string, payment_method_types?: string[], phone_number_collection?: array{enabled: bool}, restrictions?: array{completed_sessions: array{limit: int}}, shipping_address_collection?: array{allowed_countries: string[]}, shipping_options?: array{shipping_rate?: string}[], submit_type?: string, subscription_data?: array{description?: string, invoice_settings?: array{issuer?: array{account?: string, type: string}}, metadata?: array, trial_period_days?: int, trial_settings?: array{end_behavior: array{missing_payment_method: string}}}, tax_id_collection?: array{enabled: bool, required?: string}, transfer_data?: array{amount?: int, destination: string}} $params + * @param null|array|string $options + * + * @return PaymentLink the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of your payment links. + * + * @param null|array{active?: bool, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieve a payment link. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return PaymentLink + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates a payment link. + * + * @param string $id the ID of the resource to update + * @param null|array{active?: bool, after_completion?: array{hosted_confirmation?: array{custom_message?: string}, redirect?: array{url: string}, type: string}, allow_promotion_codes?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_address_collection?: string, custom_fields?: null|array{dropdown?: array{default_value?: string, options: array{label: string, value: string}[]}, key: string, label: array{custom: string, type: string}, numeric?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, optional?: bool, text?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, type: string}[], custom_text?: array{after_submit?: null|array{message: string}, shipping_address?: null|array{message: string}, submit?: null|array{message: string}, terms_of_service_acceptance?: null|array{message: string}}, customer_creation?: string, expand?: string[], inactive_message?: null|string, invoice_creation?: array{enabled: bool, invoice_data?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}, metadata?: null|array, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}}, line_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, id: string, quantity?: int}[], metadata?: array, name_collection?: null|array{business?: array{enabled: bool, optional?: bool}, individual?: array{enabled: bool, optional?: bool}}, payment_intent_data?: array{description?: null|string, metadata?: null|array, statement_descriptor?: null|string, statement_descriptor_suffix?: null|string, transfer_group?: null|string}, payment_method_collection?: string, payment_method_types?: null|string[], phone_number_collection?: array{enabled: bool}, restrictions?: null|array{completed_sessions: array{limit: int}}, shipping_address_collection?: null|array{allowed_countries: string[]}, submit_type?: string, subscription_data?: array{invoice_settings?: array{issuer?: array{account?: string, type: string}}, metadata?: null|array, trial_period_days?: null|int, trial_settings?: null|array{end_behavior: array{missing_payment_method: string}}}, tax_id_collection?: array{enabled: bool, required?: string}} $params + * @param null|array|string $opts + * + * @return PaymentLink the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param string $id + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection list of line items + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allLineItems($id, $params = null, $opts = null) + { + $url = static::resourceUrl($id) . '/line_items'; + list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/PaymentMethod.php b/stripe-php/lib/PaymentMethod.php new file mode 100644 index 0000000..566f3f4 --- /dev/null +++ b/stripe-php/lib/PaymentMethod.php @@ -0,0 +1,269 @@ +PaymentIntents to collect payments or save them to + * Customer objects to store instrument details for future payments. + * + * Related guides: Payment Methods and More Payment Scenarios. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|(object{bank_name: null|string, fingerprint: null|string, institution_number: null|string, last4: null|string, transit_number: null|string}&StripeObject) $acss_debit + * @property null|(object{}&StripeObject) $affirm + * @property null|(object{}&StripeObject) $afterpay_clearpay + * @property null|(object{}&StripeObject) $alipay + * @property null|string $allow_redisplay This field indicates whether this payment method can be shown again to its customer in a checkout flow. Stripe products such as Checkout and Elements use this field to determine whether a payment method can be shown as a saved payment method in a checkout flow. The field defaults to “unspecified”. + * @property null|(object{}&StripeObject) $alma + * @property null|(object{}&StripeObject) $amazon_pay + * @property null|(object{bsb_number: null|string, fingerprint: null|string, last4: null|string}&StripeObject) $au_becs_debit + * @property null|(object{fingerprint: null|string, last4: null|string, sort_code: null|string}&StripeObject) $bacs_debit + * @property null|(object{}&StripeObject) $bancontact + * @property null|(object{}&StripeObject) $billie + * @property (object{address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, phone: null|string, tax_id: null|string}&StripeObject) $billing_details + * @property null|(object{}&StripeObject) $blik + * @property null|(object{tax_id: string}&StripeObject) $boleto + * @property null|(object{brand: string, checks: null|(object{address_line1_check: null|string, address_postal_code_check: null|string, cvc_check: null|string}&StripeObject), country: null|string, description?: null|string, display_brand: null|string, exp_month: int, exp_year: int, fingerprint?: null|string, funding: string, generated_from: null|(object{charge: null|string, payment_method_details: null|(object{card_present?: (object{amount_authorized: null|int, brand: null|string, brand_product: null|string, capture_before?: int, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, incremental_authorization_supported: bool, issuer?: null|string, last4: null|string, network: null|string, network_transaction_id: null|string, offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), overcapture_supported: bool, preferred_locales: null|string[], read_method: null|string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject), wallet?: (object{type: string}&StripeObject)}&StripeObject), type: string}&StripeObject), setup_attempt: null|SetupAttempt|string}&StripeObject), iin?: null|string, issuer?: null|string, last4: string, networks: null|(object{available: string[], preferred: null|string}&StripeObject), regulated_status: null|string, three_d_secure_usage: null|(object{supported: bool}&StripeObject), wallet: null|(object{amex_express_checkout?: (object{}&StripeObject), apple_pay?: (object{}&StripeObject), dynamic_last4: null|string, google_pay?: (object{}&StripeObject), link?: (object{}&StripeObject), masterpass?: (object{billing_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject), samsung_pay?: (object{}&StripeObject), type: string, visa_checkout?: (object{billing_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, shipping_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject)}&StripeObject)}&StripeObject)}&StripeObject) $card + * @property null|(object{brand: null|string, brand_product: null|string, cardholder_name: null|string, country: null|string, description?: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, iin?: null|string, issuer?: null|string, last4: null|string, networks: null|(object{available: string[], preferred: null|string}&StripeObject), offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), preferred_locales: null|string[], read_method: null|string, wallet?: (object{type: string}&StripeObject)}&StripeObject) $card_present + * @property null|(object{buyer_id: null|string, cashtag: null|string}&StripeObject) $cashapp + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|(object{}&StripeObject) $crypto + * @property null|(object{display_name: null|string, logo: null|(object{content_type: null|string, url: string}&StripeObject), type: string}&StripeObject) $custom + * @property null|Customer|string $customer The ID of the Customer to which this PaymentMethod is saved. This will not be set when the PaymentMethod has not been saved to a Customer. + * @property null|string $customer_account + * @property null|(object{}&StripeObject) $customer_balance + * @property null|(object{bank: null|string}&StripeObject) $eps + * @property null|(object{account_holder_type: null|string, bank: string}&StripeObject) $fpx + * @property null|(object{}&StripeObject) $giropay + * @property null|(object{}&StripeObject) $grabpay + * @property null|(object{bank: null|string, bic: null|string}&StripeObject) $ideal + * @property null|(object{brand: null|string, cardholder_name: null|string, country: null|string, description?: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, iin?: null|string, issuer?: null|string, last4: null|string, networks: null|(object{available: string[], preferred: null|string}&StripeObject), preferred_locales: null|string[], read_method: null|string}&StripeObject) $interac_present + * @property null|(object{}&StripeObject) $kakao_pay + * @property null|(object{dob?: null|(object{day: null|int, month: null|int, year: null|int}&StripeObject)}&StripeObject) $klarna + * @property null|(object{}&StripeObject) $konbini + * @property null|(object{brand: null|string, last4: null|string}&StripeObject) $kr_card + * @property null|(object{email: null|string, persistent_token?: string}&StripeObject) $link + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|(object{}&StripeObject) $mb_way + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|(object{}&StripeObject) $mobilepay + * @property null|(object{}&StripeObject) $multibanco + * @property null|(object{buyer_id: null|string, funding: string}&StripeObject) $naver_pay + * @property null|(object{account_holder_name: null|string, bank_code: string, bank_name: string, branch_code: string, last4: string, suffix: null|string}&StripeObject) $nz_bank_account + * @property null|(object{}&StripeObject) $oxxo + * @property null|(object{bank: null|string}&StripeObject) $p24 + * @property null|(object{}&StripeObject) $pay_by_bank + * @property null|(object{}&StripeObject) $payco + * @property null|(object{}&StripeObject) $paynow + * @property null|(object{country: null|string, payer_email: null|string, payer_id: null|string}&StripeObject) $paypal + * @property null|(object{bsb_number: null|string, last4: null|string, pay_id: null|string}&StripeObject) $payto + * @property null|(object{}&StripeObject) $pix + * @property null|(object{}&StripeObject) $promptpay + * @property null|(object{session?: string}&StripeObject) $radar_options Options to configure Radar. See Radar Session for more information. + * @property null|(object{}&StripeObject) $revolut_pay + * @property null|(object{}&StripeObject) $samsung_pay + * @property null|(object{}&StripeObject) $satispay + * @property null|(object{bank_code: null|string, branch_code: null|string, country: null|string, fingerprint: null|string, generated_from: null|(object{charge: null|Charge|string, setup_attempt: null|SetupAttempt|string}&StripeObject), last4: null|string}&StripeObject) $sepa_debit + * @property null|(object{country: null|string}&StripeObject) $sofort + * @property null|(object{}&StripeObject) $swish + * @property null|(object{}&StripeObject) $twint + * @property string $type The type of the PaymentMethod. An additional hash is included on the PaymentMethod with a name matching this value. It contains additional information specific to the PaymentMethod type. + * @property null|(object{account_holder_type: null|string, account_type: null|string, bank_name: null|string, financial_connections_account: null|string, fingerprint: null|string, last4: null|string, networks: null|(object{preferred: null|string, supported: string[]}&StripeObject), routing_number: null|string, status_details: null|(object{blocked?: (object{network_code: null|string, reason: null|string}&StripeObject)}&StripeObject)}&StripeObject) $us_bank_account + * @property null|(object{}&StripeObject) $wechat_pay + * @property null|(object{}&StripeObject) $zip + */ +class PaymentMethod extends ApiResource +{ + const OBJECT_NAME = 'payment_method'; + + use ApiOperations\Update; + + const ALLOW_REDISPLAY_ALWAYS = 'always'; + const ALLOW_REDISPLAY_LIMITED = 'limited'; + const ALLOW_REDISPLAY_UNSPECIFIED = 'unspecified'; + + const TYPE_ACSS_DEBIT = 'acss_debit'; + const TYPE_AFFIRM = 'affirm'; + const TYPE_AFTERPAY_CLEARPAY = 'afterpay_clearpay'; + const TYPE_ALIPAY = 'alipay'; + const TYPE_ALMA = 'alma'; + const TYPE_AMAZON_PAY = 'amazon_pay'; + const TYPE_AU_BECS_DEBIT = 'au_becs_debit'; + const TYPE_BACS_DEBIT = 'bacs_debit'; + const TYPE_BANCONTACT = 'bancontact'; + const TYPE_BILLIE = 'billie'; + const TYPE_BLIK = 'blik'; + const TYPE_BOLETO = 'boleto'; + const TYPE_CARD = 'card'; + const TYPE_CARD_PRESENT = 'card_present'; + const TYPE_CASHAPP = 'cashapp'; + const TYPE_CRYPTO = 'crypto'; + const TYPE_CUSTOM = 'custom'; + const TYPE_CUSTOMER_BALANCE = 'customer_balance'; + const TYPE_EPS = 'eps'; + const TYPE_FPX = 'fpx'; + const TYPE_GIROPAY = 'giropay'; + const TYPE_GRABPAY = 'grabpay'; + const TYPE_IDEAL = 'ideal'; + const TYPE_INTERAC_PRESENT = 'interac_present'; + const TYPE_KAKAO_PAY = 'kakao_pay'; + const TYPE_KLARNA = 'klarna'; + const TYPE_KONBINI = 'konbini'; + const TYPE_KR_CARD = 'kr_card'; + const TYPE_LINK = 'link'; + const TYPE_MB_WAY = 'mb_way'; + const TYPE_MOBILEPAY = 'mobilepay'; + const TYPE_MULTIBANCO = 'multibanco'; + const TYPE_NAVER_PAY = 'naver_pay'; + const TYPE_NZ_BANK_ACCOUNT = 'nz_bank_account'; + const TYPE_OXXO = 'oxxo'; + const TYPE_P24 = 'p24'; + const TYPE_PAYCO = 'payco'; + const TYPE_PAYNOW = 'paynow'; + const TYPE_PAYPAL = 'paypal'; + const TYPE_PAYTO = 'payto'; + const TYPE_PAY_BY_BANK = 'pay_by_bank'; + const TYPE_PIX = 'pix'; + const TYPE_PROMPTPAY = 'promptpay'; + const TYPE_REVOLUT_PAY = 'revolut_pay'; + const TYPE_SAMSUNG_PAY = 'samsung_pay'; + const TYPE_SATISPAY = 'satispay'; + const TYPE_SEPA_DEBIT = 'sepa_debit'; + const TYPE_SOFORT = 'sofort'; + const TYPE_SWISH = 'swish'; + const TYPE_TWINT = 'twint'; + const TYPE_US_BANK_ACCOUNT = 'us_bank_account'; + const TYPE_WECHAT_PAY = 'wechat_pay'; + const TYPE_ZIP = 'zip'; + + /** + * Creates a PaymentMethod object. Read the Stripe.js + * reference to learn how to create PaymentMethods via Stripe.js. + * + * Instead of creating a PaymentMethod directly, we recommend using the PaymentIntents API to accept a + * payment immediately or the SetupIntent API to collect payment + * method details ahead of a future payment. + * + * @param null|array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, card?: array{cvc?: string, exp_month?: int, exp_year?: int, networks?: array{preferred?: string}, number?: string, token?: string}, cashapp?: array{}, crypto?: array{}, custom?: array{type: string}, customer?: string, customer_balance?: array{}, eps?: array{bank?: string}, expand?: string[], fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, payment_method?: string, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type?: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}} $params + * @param null|array|string $options + * + * @return PaymentMethod the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of all PaymentMethods. + * + * @param null|array{allow_redisplay?: string, customer?: string, customer_account?: string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, type?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves a PaymentMethod object attached to the StripeAccount. To retrieve a + * payment method attached to a Customer, you should use Retrieve a Customer’s + * PaymentMethods. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return PaymentMethod + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates a PaymentMethod object. A PaymentMethod must be attached to a customer + * to be updated. + * + * @param string $id the ID of the resource to update + * @param null|array{allow_redisplay?: string, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, card?: array{exp_month?: int, exp_year?: int, networks?: array{preferred?: null|string}}, expand?: string[], metadata?: null|array, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, us_bank_account?: array{account_holder_type?: string, account_type?: string}} $params + * @param null|array|string $opts + * + * @return PaymentMethod the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return PaymentMethod the attached payment method + * + * @throws Exception\ApiErrorException if the request fails + */ + public function attach($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/attach'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return PaymentMethod the detached payment method + * + * @throws Exception\ApiErrorException if the request fails + */ + public function detach($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/detach'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/PaymentMethodConfiguration.php b/stripe-php/lib/PaymentMethodConfiguration.php new file mode 100644 index 0000000..6bdcfb3 --- /dev/null +++ b/stripe-php/lib/PaymentMethodConfiguration.php @@ -0,0 +1,172 @@ +charge type: + * + * Direct configurations apply to payments created on your account, including Connect destination charges, Connect separate charges and transfers, and payments not involving Connect. + * + * Child configurations apply to payments created on your connected accounts using direct charges, and charges with the on_behalf_of parameter. + * + * Child configurations have a parent that sets default values and controls which settings connected accounts may override. You can specify a parent ID at payment time, and Stripe will automatically resolve the connected account’s associated child configuration. Parent configurations are managed in the dashboard and are not available in this API. + * + * Related guides: + * - Payment Method Configurations API + * - Multiple configurations on dynamic payment methods + * - Multiple configurations for your Connect accounts + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $acss_debit + * @property bool $active Whether the configuration can be used for new payments. + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $affirm + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $afterpay_clearpay + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $alipay + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $alma + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $amazon_pay + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $apple_pay + * @property null|string $application For child configs, the Connect application associated with the configuration. + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $au_becs_debit + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $bacs_debit + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $bancontact + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $billie + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $blik + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $boleto + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $card + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $cartes_bancaires + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $cashapp + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $crypto + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $customer_balance + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $eps + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $fpx + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $giropay + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $google_pay + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $grabpay + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $ideal + * @property bool $is_default The default configuration is used whenever a payment method configuration is not specified. + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $jcb + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $kakao_pay + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $klarna + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $konbini + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $kr_card + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $link + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $mb_way + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $mobilepay + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $multibanco + * @property string $name The configuration's name. + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $naver_pay + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $nz_bank_account + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $oxxo + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $p24 + * @property null|string $parent For child configs, the configuration's parent configuration. + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $pay_by_bank + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $payco + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $paynow + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $paypal + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $payto + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $pix + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $promptpay + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $revolut_pay + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $samsung_pay + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $satispay + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $sepa_debit + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $sofort + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $swish + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $twint + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $us_bank_account + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $wechat_pay + * @property null|(object{available: bool, display_preference: (object{overridable: null|bool, preference: string, value: string}&StripeObject)}&StripeObject) $zip + */ +class PaymentMethodConfiguration extends ApiResource +{ + const OBJECT_NAME = 'payment_method_configuration'; + + use ApiOperations\Update; + + /** + * Creates a payment method configuration. + * + * @param null|array{acss_debit?: array{display_preference?: array{preference?: string}}, affirm?: array{display_preference?: array{preference?: string}}, afterpay_clearpay?: array{display_preference?: array{preference?: string}}, alipay?: array{display_preference?: array{preference?: string}}, alma?: array{display_preference?: array{preference?: string}}, amazon_pay?: array{display_preference?: array{preference?: string}}, apple_pay?: array{display_preference?: array{preference?: string}}, apple_pay_later?: array{display_preference?: array{preference?: string}}, au_becs_debit?: array{display_preference?: array{preference?: string}}, bacs_debit?: array{display_preference?: array{preference?: string}}, bancontact?: array{display_preference?: array{preference?: string}}, billie?: array{display_preference?: array{preference?: string}}, blik?: array{display_preference?: array{preference?: string}}, boleto?: array{display_preference?: array{preference?: string}}, card?: array{display_preference?: array{preference?: string}}, cartes_bancaires?: array{display_preference?: array{preference?: string}}, cashapp?: array{display_preference?: array{preference?: string}}, crypto?: array{display_preference?: array{preference?: string}}, customer_balance?: array{display_preference?: array{preference?: string}}, eps?: array{display_preference?: array{preference?: string}}, expand?: string[], fpx?: array{display_preference?: array{preference?: string}}, fr_meal_voucher_conecs?: array{display_preference?: array{preference?: string}}, giropay?: array{display_preference?: array{preference?: string}}, google_pay?: array{display_preference?: array{preference?: string}}, grabpay?: array{display_preference?: array{preference?: string}}, ideal?: array{display_preference?: array{preference?: string}}, jcb?: array{display_preference?: array{preference?: string}}, kakao_pay?: array{display_preference?: array{preference?: string}}, klarna?: array{display_preference?: array{preference?: string}}, konbini?: array{display_preference?: array{preference?: string}}, kr_card?: array{display_preference?: array{preference?: string}}, link?: array{display_preference?: array{preference?: string}}, mb_way?: array{display_preference?: array{preference?: string}}, mobilepay?: array{display_preference?: array{preference?: string}}, multibanco?: array{display_preference?: array{preference?: string}}, name?: string, naver_pay?: array{display_preference?: array{preference?: string}}, nz_bank_account?: array{display_preference?: array{preference?: string}}, oxxo?: array{display_preference?: array{preference?: string}}, p24?: array{display_preference?: array{preference?: string}}, parent?: string, pay_by_bank?: array{display_preference?: array{preference?: string}}, payco?: array{display_preference?: array{preference?: string}}, paynow?: array{display_preference?: array{preference?: string}}, paypal?: array{display_preference?: array{preference?: string}}, payto?: array{display_preference?: array{preference?: string}}, pix?: array{display_preference?: array{preference?: string}}, promptpay?: array{display_preference?: array{preference?: string}}, revolut_pay?: array{display_preference?: array{preference?: string}}, samsung_pay?: array{display_preference?: array{preference?: string}}, satispay?: array{display_preference?: array{preference?: string}}, sepa_debit?: array{display_preference?: array{preference?: string}}, sofort?: array{display_preference?: array{preference?: string}}, swish?: array{display_preference?: array{preference?: string}}, twint?: array{display_preference?: array{preference?: string}}, us_bank_account?: array{display_preference?: array{preference?: string}}, wechat_pay?: array{display_preference?: array{preference?: string}}, zip?: array{display_preference?: array{preference?: string}}} $params + * @param null|array|string $options + * + * @return PaymentMethodConfiguration the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * List payment method configurations. + * + * @param null|array{application?: null|string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieve payment method configuration. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return PaymentMethodConfiguration + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Update payment method configuration. + * + * @param string $id the ID of the resource to update + * @param null|array{acss_debit?: array{display_preference?: array{preference?: string}}, active?: bool, affirm?: array{display_preference?: array{preference?: string}}, afterpay_clearpay?: array{display_preference?: array{preference?: string}}, alipay?: array{display_preference?: array{preference?: string}}, alma?: array{display_preference?: array{preference?: string}}, amazon_pay?: array{display_preference?: array{preference?: string}}, apple_pay?: array{display_preference?: array{preference?: string}}, apple_pay_later?: array{display_preference?: array{preference?: string}}, au_becs_debit?: array{display_preference?: array{preference?: string}}, bacs_debit?: array{display_preference?: array{preference?: string}}, bancontact?: array{display_preference?: array{preference?: string}}, billie?: array{display_preference?: array{preference?: string}}, blik?: array{display_preference?: array{preference?: string}}, boleto?: array{display_preference?: array{preference?: string}}, card?: array{display_preference?: array{preference?: string}}, cartes_bancaires?: array{display_preference?: array{preference?: string}}, cashapp?: array{display_preference?: array{preference?: string}}, crypto?: array{display_preference?: array{preference?: string}}, customer_balance?: array{display_preference?: array{preference?: string}}, eps?: array{display_preference?: array{preference?: string}}, expand?: string[], fpx?: array{display_preference?: array{preference?: string}}, fr_meal_voucher_conecs?: array{display_preference?: array{preference?: string}}, giropay?: array{display_preference?: array{preference?: string}}, google_pay?: array{display_preference?: array{preference?: string}}, grabpay?: array{display_preference?: array{preference?: string}}, ideal?: array{display_preference?: array{preference?: string}}, jcb?: array{display_preference?: array{preference?: string}}, kakao_pay?: array{display_preference?: array{preference?: string}}, klarna?: array{display_preference?: array{preference?: string}}, konbini?: array{display_preference?: array{preference?: string}}, kr_card?: array{display_preference?: array{preference?: string}}, link?: array{display_preference?: array{preference?: string}}, mb_way?: array{display_preference?: array{preference?: string}}, mobilepay?: array{display_preference?: array{preference?: string}}, multibanco?: array{display_preference?: array{preference?: string}}, name?: string, naver_pay?: array{display_preference?: array{preference?: string}}, nz_bank_account?: array{display_preference?: array{preference?: string}}, oxxo?: array{display_preference?: array{preference?: string}}, p24?: array{display_preference?: array{preference?: string}}, pay_by_bank?: array{display_preference?: array{preference?: string}}, payco?: array{display_preference?: array{preference?: string}}, paynow?: array{display_preference?: array{preference?: string}}, paypal?: array{display_preference?: array{preference?: string}}, payto?: array{display_preference?: array{preference?: string}}, pix?: array{display_preference?: array{preference?: string}}, promptpay?: array{display_preference?: array{preference?: string}}, revolut_pay?: array{display_preference?: array{preference?: string}}, samsung_pay?: array{display_preference?: array{preference?: string}}, satispay?: array{display_preference?: array{preference?: string}}, sepa_debit?: array{display_preference?: array{preference?: string}}, sofort?: array{display_preference?: array{preference?: string}}, swish?: array{display_preference?: array{preference?: string}}, twint?: array{display_preference?: array{preference?: string}}, us_bank_account?: array{display_preference?: array{preference?: string}}, wechat_pay?: array{display_preference?: array{preference?: string}}, zip?: array{display_preference?: array{preference?: string}}} $params + * @param null|array|string $opts + * + * @return PaymentMethodConfiguration the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/PaymentMethodDomain.php b/stripe-php/lib/PaymentMethodDomain.php new file mode 100644 index 0000000..328db8e --- /dev/null +++ b/stripe-php/lib/PaymentMethodDomain.php @@ -0,0 +1,129 @@ +Payment method domains. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property (object{status: string, status_details?: (object{error_message: string}&StripeObject)}&StripeObject) $amazon_pay Indicates the status of a specific payment method on a payment method domain. + * @property (object{status: string, status_details?: (object{error_message: string}&StripeObject)}&StripeObject) $apple_pay Indicates the status of a specific payment method on a payment method domain. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $domain_name The domain name that this payment method domain object represents. + * @property bool $enabled Whether this payment method domain is enabled. If the domain is not enabled, payment methods that require a payment method domain will not appear in Elements. + * @property (object{status: string, status_details?: (object{error_message: string}&StripeObject)}&StripeObject) $google_pay Indicates the status of a specific payment method on a payment method domain. + * @property (object{status: string, status_details?: (object{error_message: string}&StripeObject)}&StripeObject) $klarna Indicates the status of a specific payment method on a payment method domain. + * @property (object{status: string, status_details?: (object{error_message: string}&StripeObject)}&StripeObject) $link Indicates the status of a specific payment method on a payment method domain. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property (object{status: string, status_details?: (object{error_message: string}&StripeObject)}&StripeObject) $paypal Indicates the status of a specific payment method on a payment method domain. + */ +class PaymentMethodDomain extends ApiResource +{ + const OBJECT_NAME = 'payment_method_domain'; + + use ApiOperations\Update; + + /** + * Creates a payment method domain. + * + * @param null|array{domain_name: string, enabled?: bool, expand?: string[]} $params + * @param null|array|string $options + * + * @return PaymentMethodDomain the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Lists the details of existing payment method domains. + * + * @param null|array{domain_name?: string, enabled?: bool, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an existing payment method domain. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return PaymentMethodDomain + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates an existing payment method domain. + * + * @param string $id the ID of the resource to update + * @param null|array{enabled?: bool, expand?: string[]} $params + * @param null|array|string $opts + * + * @return PaymentMethodDomain the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return PaymentMethodDomain the validated payment method domain + * + * @throws Exception\ApiErrorException if the request fails + */ + public function validate($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/validate'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/PaymentRecord.php b/stripe-php/lib/PaymentRecord.php new file mode 100644 index 0000000..e67d4f9 --- /dev/null +++ b/stripe-php/lib/PaymentRecord.php @@ -0,0 +1,183 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|(object{ach_credit_transfer?: (object{account_number: null|string, bank_name: null|string, routing_number: null|string, swift_code: null|string}&StripeObject), ach_debit?: (object{account_holder_type: null|string, bank_name: null|string, country: null|string, fingerprint: null|string, last4: null|string, routing_number: null|string}&StripeObject), acss_debit?: (object{bank_name: null|string, expected_debit_date?: string, fingerprint: null|string, institution_number: null|string, last4: null|string, mandate?: string, transit_number: null|string}&StripeObject), affirm?: (object{location?: string, reader?: string, transaction_id: null|string}&StripeObject), afterpay_clearpay?: (object{order_id: null|string, reference: null|string}&StripeObject), alipay?: (object{buyer_id?: string, fingerprint: null|string, transaction_id: null|string}&StripeObject), alma?: (object{installments?: (object{count: int}&StripeObject), transaction_id: null|string}&StripeObject), amazon_pay?: (object{funding?: (object{card?: (object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, funding: null|string, last4: null|string}&StripeObject), type: null|string}&StripeObject), transaction_id: null|string}&StripeObject), au_becs_debit?: (object{bsb_number: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate?: string}&StripeObject), bacs_debit?: (object{expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate: null|string, sort_code: null|string}&StripeObject), bancontact?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), billie?: (object{transaction_id: null|string}&StripeObject), billing_details: null|(object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, phone: null|string}&StripeObject), blik?: (object{buyer_id: null|string}&StripeObject), boleto?: (object{tax_id: string}&StripeObject), card?: (object{authorization_code: null|string, brand: string, capture_before?: int, checks: null|(object{address_line1_check: null|string, address_postal_code_check: null|string, cvc_check: null|string}&StripeObject), country: null|string, description: null|string, exp_month: int, exp_year: int, fingerprint?: null|string, funding: string, iin: null|string, installments: null|(object{plan: null|(object{count: null|int, interval: null|string, type: string}&StripeObject)}&StripeObject), issuer: null|string, last4: string, moto?: bool, network: null|string, network_advice_code: null|string, network_decline_code: null|string, network_token?: null|(object{used: bool}&StripeObject), network_transaction_id: null|string, stored_credential_usage: null|string, three_d_secure: null|(object{authentication_flow: null|string, result: null|string, result_reason: null|string, version: null|string}&StripeObject), wallet: null|(object{apple_pay?: (object{type: string}&StripeObject), dynamic_last4?: string, google_pay?: (object{}&StripeObject), type: string}&StripeObject)}&StripeObject), card_present?: (object{amount_authorized: null|int, brand: null|string, brand_product: null|string, capture_before?: int, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, incremental_authorization_supported: bool, issuer?: null|string, last4: null|string, network: null|string, network_transaction_id: null|string, offline: null|(object{stored_at: null|int, type: null|string}&StripeObject), overcapture_supported: bool, preferred_locales: null|string[], read_method: null|string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject), wallet?: (object{type: string}&StripeObject)}&StripeObject), cashapp?: (object{buyer_id: null|string, cashtag: null|string, transaction_id: null|string}&StripeObject), crypto?: (object{buyer_address?: string, network?: string, token_currency?: string, transaction_hash?: string}&StripeObject), custom?: (object{display_name: string, type: null|string}&StripeObject), customer_balance?: (object{}&StripeObject), eps?: (object{bank: null|string, verified_name: null|string}&StripeObject), fpx?: (object{account_holder_type: null|string, bank: string, transaction_id: null|string}&StripeObject), giropay?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, verified_name: null|string}&StripeObject), grabpay?: (object{transaction_id: null|string}&StripeObject), ideal?: (object{bank: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, transaction_id: null|string, verified_name: null|string}&StripeObject), interac_present?: (object{brand: null|string, cardholder_name: null|string, country: null|string, description?: null|string, emv_auth_data: null|string, exp_month: int, exp_year: int, fingerprint: null|string, funding: null|string, generated_card: null|string, iin?: null|string, issuer?: null|string, last4: null|string, network: null|string, network_transaction_id: null|string, preferred_locales: null|string[], read_method: null|string, receipt: null|(object{account_type?: string, application_cryptogram: null|string, application_preferred_name: null|string, authorization_code: null|string, authorization_response_code: null|string, cardholder_verification_method: null|string, dedicated_file_name: null|string, terminal_verification_results: null|string, transaction_status_information: null|string}&StripeObject)}&StripeObject), kakao_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), klarna?: (object{payer_details: null|(object{address: null|(object{country: null|string}&StripeObject)}&StripeObject), payment_method_category: null|string, preferred_locale: null|string}&StripeObject), konbini?: (object{store: null|(object{chain: null|string}&StripeObject)}&StripeObject), kr_card?: (object{brand: null|string, buyer_id: null|string, last4: null|string, transaction_id: null|string}&StripeObject), link?: (object{country: null|string}&StripeObject), mb_way?: (object{}&StripeObject), mobilepay?: (object{card: null|(object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, last4: null|string}&StripeObject)}&StripeObject), multibanco?: (object{entity: null|string, reference: null|string}&StripeObject), naver_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), nz_bank_account?: (object{account_holder_name: null|string, bank_code: string, bank_name: string, branch_code: string, expected_debit_date?: string, last4: string, suffix: null|string}&StripeObject), oxxo?: (object{number: null|string}&StripeObject), p24?: (object{bank: null|string, reference: null|string, verified_name: null|string}&StripeObject), pay_by_bank?: (object{}&StripeObject), payco?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), payment_method: null|string, paynow?: (object{location?: string, reader?: string, reference: null|string}&StripeObject), paypal?: (object{country: null|string, payer_email: null|string, payer_id: null|string, payer_name: null|string, seller_protection: null|(object{dispute_categories: null|string[], status: string}&StripeObject), transaction_id: null|string}&StripeObject), payto?: (object{bsb_number: null|string, last4: null|string, mandate?: string, pay_id: null|string}&StripeObject), pix?: (object{bank_transaction_id?: null|string}&StripeObject), promptpay?: (object{reference: null|string}&StripeObject), revolut_pay?: (object{funding?: (object{card?: (object{brand: null|string, country: null|string, exp_month: null|int, exp_year: null|int, funding: null|string, last4: null|string}&StripeObject), type: null|string}&StripeObject), transaction_id: null|string}&StripeObject), samsung_pay?: (object{buyer_id: null|string, transaction_id: null|string}&StripeObject), satispay?: (object{transaction_id: null|string}&StripeObject), sepa_credit_transfer?: (object{bank_name: null|string, bic: null|string, iban: null|string}&StripeObject), sepa_debit?: (object{bank_code: null|string, branch_code: null|string, country: null|string, expected_debit_date?: string, fingerprint: null|string, last4: null|string, mandate: null|string}&StripeObject), sofort?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, country: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), stripe_account?: (object{}&StripeObject), swish?: (object{fingerprint: null|string, payment_reference: null|string, verified_phone_last4: null|string}&StripeObject), twint?: (object{}&StripeObject), type: string, us_bank_account?: (object{account_holder_type: null|string, account_type: null|string, bank_name: null|string, expected_debit_date?: null|string, fingerprint: null|string, last4: null|string, mandate?: Mandate|string, payment_reference: null|string, routing_number: null|string}&StripeObject), wechat?: (object{}&StripeObject), wechat_pay?: (object{fingerprint: null|string, location?: string, reader?: string, transaction_id: null|string}&StripeObject), zip?: (object{}&StripeObject)}&StripeObject) $payment_method_details Information about the Payment Method debited for this payment. + * @property (object{custom?: (object{payment_reference: null|string}&StripeObject), type: string}&StripeObject) $processor_details Processor information associated with this payment. + * @property string $reported_by Indicates who reported the payment. + * @property null|(object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), name: null|string, phone: null|string}&StripeObject) $shipping_details Shipping information for this payment. + */ +class PaymentRecord extends ApiResource +{ + const OBJECT_NAME = 'payment_record'; + + const CUSTOMER_PRESENCE_OFF_SESSION = 'off_session'; + const CUSTOMER_PRESENCE_ON_SESSION = 'on_session'; + + const REPORTED_BY_SELF = 'self'; + const REPORTED_BY_STRIPE = 'stripe'; + + /** + * Retrieves a Payment Record with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return PaymentRecord + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return PaymentRecord the reported payment record + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function reportPayment($params = null, $opts = null) + { + $url = static::classUrl() . '/report_payment'; + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return PaymentRecord the reported payment record + * + * @throws Exception\ApiErrorException if the request fails + */ + public function reportPaymentAttempt($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/report_payment_attempt'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return PaymentRecord the reported payment record + * + * @throws Exception\ApiErrorException if the request fails + */ + public function reportPaymentAttemptCanceled($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/report_payment_attempt_canceled'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return PaymentRecord the reported payment record + * + * @throws Exception\ApiErrorException if the request fails + */ + public function reportPaymentAttemptFailed($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/report_payment_attempt_failed'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return PaymentRecord the reported payment record + * + * @throws Exception\ApiErrorException if the request fails + */ + public function reportPaymentAttemptGuaranteed($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/report_payment_attempt_guaranteed'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return PaymentRecord the reported payment record + * + * @throws Exception\ApiErrorException if the request fails + */ + public function reportPaymentAttemptInformational($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/report_payment_attempt_informational'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return PaymentRecord the reported payment record + * + * @throws Exception\ApiErrorException if the request fails + */ + public function reportRefund($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/report_refund'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/Payout.php b/stripe-php/lib/Payout.php new file mode 100644 index 0000000..c9c12a1 --- /dev/null +++ b/stripe-php/lib/Payout.php @@ -0,0 +1,213 @@ +Payout object is created when you receive funds from Stripe, or when you + * initiate a payout to either a bank account or debit card of a connected + * Stripe account. You can retrieve individual payouts, + * and list all payouts. Payouts are made on varying + * schedules, depending on your country and + * industry. + * + * Related guide: Receiving payouts + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount The amount (in cents (or local equivalent)) that transfers to your bank account or debit card. + * @property null|ApplicationFee|string $application_fee The application fee (if any) for the payout. See the Connect documentation for details. + * @property null|int $application_fee_amount The amount of the application fee (if any) requested for the payout. See the Connect documentation for details. + * @property int $arrival_date Date that you can expect the payout to arrive in the bank. This factors in delays to account for weekends or bank holidays. + * @property bool $automatic Returns true if the payout is created by an automated payout schedule and false if it's requested manually. + * @property null|BalanceTransaction|string $balance_transaction ID of the balance transaction that describes the impact of this payout on your account balance. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|BankAccount|Card|string $destination ID of the bank account or card the payout is sent to. + * @property null|BalanceTransaction|string $failure_balance_transaction If the payout fails or cancels, this is the ID of the balance transaction that reverses the initial balance transaction and returns the funds from the failed payout back in your balance. + * @property null|string $failure_code Error code that provides a reason for a payout failure, if available. View our list of failure codes. + * @property null|string $failure_message Message that provides the reason for a payout failure, if available. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $method The method used to send this payout, which can be standard or instant. instant is supported for payouts to debit cards and bank accounts in certain countries. Learn more about bank support for Instant Payouts. + * @property null|Payout|string $original_payout If the payout reverses another, this is the ID of the original payout. + * @property null|string $payout_method ID of the v2 FinancialAccount the funds are sent to. + * @property string $reconciliation_status If completed, you can use the Balance Transactions API to list all balance transactions that are paid out in this payout. + * @property null|Payout|string $reversed_by If the payout reverses, this is the ID of the payout that reverses this payout. + * @property string $source_type The source balance this payout came from, which can be one of the following: card, fpx, or bank_account. + * @property null|string $statement_descriptor Extra information about a payout that displays on the user's bank statement. + * @property string $status Current status of the payout: paid, pending, in_transit, canceled or failed. A payout is pending until it's submitted to the bank, when it becomes in_transit. The status changes to paid if the transaction succeeds, or to failed or canceled (within 5 business days). Some payouts that fail might initially show as paid, then change to failed. + * @property null|(object{status: string, value: null|string}&StripeObject) $trace_id A value that generates from the beneficiary's bank that allows users to track payouts with their bank. Banks might call this a "reference number" or something similar. + * @property string $type Can be bank_account or card. + */ +class Payout extends ApiResource +{ + const OBJECT_NAME = 'payout'; + + use ApiOperations\Update; + + const METHOD_INSTANT = 'instant'; + const METHOD_STANDARD = 'standard'; + + const RECONCILIATION_STATUS_COMPLETED = 'completed'; + const RECONCILIATION_STATUS_IN_PROGRESS = 'in_progress'; + const RECONCILIATION_STATUS_NOT_APPLICABLE = 'not_applicable'; + + const STATUS_CANCELED = 'canceled'; + const STATUS_FAILED = 'failed'; + const STATUS_IN_TRANSIT = 'in_transit'; + const STATUS_PAID = 'paid'; + const STATUS_PENDING = 'pending'; + + const TYPE_BANK_ACCOUNT = 'bank_account'; + const TYPE_CARD = 'card'; + + /** + * To send funds to your own bank account, create a new payout object. Your Stripe balance must cover the payout amount. If it doesn’t, + * you receive an “Insufficient Funds” error. + * + * If your API key is in test mode, money won’t actually be sent, though every + * other action occurs as if you’re in live mode. + * + * If you create a manual payout on a Stripe account that uses multiple payment + * source types, you need to specify the source type balance that the payout draws + * from. The balance object details available and + * pending amounts by source type. + * + * @param null|array{amount: int, currency: string, description?: string, destination?: string, expand?: string[], metadata?: array, method?: string, payout_method?: string, source_type?: string, statement_descriptor?: string} $params + * @param null|array|string $options + * + * @return Payout the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of existing payouts sent to third-party bank accounts or payouts + * that Stripe sent to you. The payouts return in sorted order, with the most + * recently created payouts appearing first. + * + * @param null|array{arrival_date?: array|int, created?: array|int, destination?: string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an existing payout. Supply the unique payout ID from + * either a payout creation request or the payout list. Stripe returns the + * corresponding payout information. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Payout + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the specified payout by setting the values of the parameters you pass. + * We don’t change parameters that you don’t provide. This request only accepts the + * metadata as arguments. + * + * @param string $id the ID of the resource to update + * @param null|array{expand?: string[], metadata?: null|array} $params + * @param null|array|string $opts + * + * @return Payout the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + const FAILURE_ACCOUNT_CLOSED = 'account_closed'; + const FAILURE_ACCOUNT_FROZEN = 'account_frozen'; + const FAILURE_BANK_ACCOUNT_RESTRICTED = 'bank_account_restricted'; + const FAILURE_BANK_OWNERSHIP_CHANGED = 'bank_ownership_changed'; + const FAILURE_COULD_NOT_PROCESS = 'could_not_process'; + const FAILURE_DEBIT_NOT_AUTHORIZED = 'debit_not_authorized'; + const FAILURE_DECLINED = 'declined'; + const FAILURE_INCORRECT_ACCOUNT_HOLDER_ADDRESS = 'incorrect_account_holder_address'; + const FAILURE_INCORRECT_ACCOUNT_HOLDER_NAME = 'incorrect_account_holder_name'; + const FAILURE_INCORRECT_ACCOUNT_HOLDER_TAX_ID = 'incorrect_account_holder_tax_id'; + const FAILURE_INSUFFICIENT_FUNDS = 'insufficient_funds'; + const FAILURE_INVALID_ACCOUNT_NUMBER = 'invalid_account_number'; + const FAILURE_INVALID_CURRENCY = 'invalid_currency'; + const FAILURE_NO_ACCOUNT = 'no_account'; + const FAILURE_UNSUPPORTED_CARD = 'unsupported_card'; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Payout the canceled payout + * + * @throws Exception\ApiErrorException if the request fails + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Payout the reversed payout + * + * @throws Exception\ApiErrorException if the request fails + */ + public function reverse($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/reverse'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/Person.php b/stripe-php/lib/Person.php new file mode 100644 index 0000000..a60805a --- /dev/null +++ b/stripe-php/lib/Person.php @@ -0,0 +1,140 @@ +account.controller.requirement_collection is stripe, which includes Standard and Express accounts, after creating an Account Link or Account Session to start Connect onboarding. + * + * See the Standard onboarding or Express onboarding documentation for information about prefilling information and account onboarding steps. Learn more about handling identity verification with the API. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|string $account The account the person is associated with. + * @property null|(object{account: null|(object{date: null|int, ip: null|string, user_agent: null|string}&StripeObject)}&StripeObject) $additional_tos_acceptances + * @property null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject) $address + * @property null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string, town: null|string}&StripeObject) $address_kana The Kana variation of the person's address (Japan only). + * @property null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string, town: null|string}&StripeObject) $address_kanji The Kanji variation of the person's address (Japan only). + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|(object{day: null|int, month: null|int, year: null|int}&StripeObject) $dob + * @property null|string $email The person's email address. Also available for accounts where controller.requirement_collection is stripe. + * @property null|string $first_name The person's first name. Also available for accounts where controller.requirement_collection is stripe. + * @property null|string $first_name_kana The Kana variation of the person's first name (Japan only). Also available for accounts where controller.requirement_collection is stripe. + * @property null|string $first_name_kanji The Kanji variation of the person's first name (Japan only). Also available for accounts where controller.requirement_collection is stripe. + * @property null|string[] $full_name_aliases A list of alternate names or aliases that the person is known by. Also available for accounts where controller.requirement_collection is stripe. + * @property null|(object{alternatives: null|(object{alternative_fields_due: string[], original_fields_due: string[]}&StripeObject)[], currently_due: string[], errors: (object{code: string, reason: string, requirement: string}&StripeObject)[], eventually_due: string[], past_due: string[], pending_verification: string[]}&StripeObject) $future_requirements Information about the upcoming new requirements for this person, including what information needs to be collected, and by when. + * @property null|string $gender The person's gender. + * @property null|bool $id_number_provided Whether the person's id_number was provided. True if either the full ID number was provided or if only the required part of the ID number was provided (ex. last four of an individual's SSN for the US indicated by ssn_last_4_provided). + * @property null|bool $id_number_secondary_provided Whether the person's id_number_secondary was provided. + * @property null|string $last_name The person's last name. Also available for accounts where controller.requirement_collection is stripe. + * @property null|string $last_name_kana The Kana variation of the person's last name (Japan only). Also available for accounts where controller.requirement_collection is stripe. + * @property null|string $last_name_kanji The Kanji variation of the person's last name (Japan only). Also available for accounts where controller.requirement_collection is stripe. + * @property null|string $maiden_name The person's maiden name. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $nationality The country where the person is a national. + * @property null|string $phone The person's phone number. + * @property null|string $political_exposure Indicates if the person or any of their representatives, family members, or other closely related persons, declares that they hold or have held an important public job or function, in any jurisdiction. + * @property null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject) $registered_address + * @property null|(object{authorizer: null|bool, director: null|bool, executive: null|bool, legal_guardian: null|bool, owner: null|bool, percent_ownership: null|float, representative: null|bool, title: null|string}&StripeObject) $relationship + * @property null|(object{alternatives: null|(object{alternative_fields_due: string[], original_fields_due: string[]}&StripeObject)[], currently_due: string[], errors: (object{code: string, reason: string, requirement: string}&StripeObject)[], eventually_due: string[], past_due: string[], pending_verification: string[]}&StripeObject) $requirements Information about the requirements for this person, including what information needs to be collected, and by when. + * @property null|bool $ssn_last_4_provided Whether the last four digits of the person's Social Security number have been provided (U.S. only). + * @property null|(object{ethnicity_details: null|(object{ethnicity: null|string[], ethnicity_other: null|string}&StripeObject), race_details: null|(object{race: null|string[], race_other: null|string}&StripeObject), self_identified_gender: null|string}&StripeObject) $us_cfpb_data Demographic data related to the person. + * @property null|(object{additional_document?: null|(object{back: null|File|string, details: null|string, details_code: null|string, front: null|File|string}&StripeObject), details?: null|string, details_code?: null|string, document?: (object{back: null|File|string, details: null|string, details_code: null|string, front: null|File|string}&StripeObject), status: string}&StripeObject) $verification + */ +class Person extends ApiResource +{ + const OBJECT_NAME = 'person'; + + const GENDER_FEMALE = 'female'; + const GENDER_MALE = 'male'; + + const POLITICAL_EXPOSURE_EXISTING = 'existing'; + const POLITICAL_EXPOSURE_NONE = 'none'; + + const VERIFICATION_STATUS_PENDING = 'pending'; + const VERIFICATION_STATUS_UNVERIFIED = 'unverified'; + const VERIFICATION_STATUS_VERIFIED = 'verified'; + + use ApiOperations\Delete; + + /** + * @return string the API URL for this Stripe account reversal + */ + public function instanceUrl() + { + $id = $this['id']; + $account = $this['account']; + if (!$id) { + throw new Exception\UnexpectedValueException( + 'Could not determine which URL to request: ' + . "class instance has invalid ID: {$id}", + null + ); + } + $id = Util\Util::utf8($id); + $account = Util\Util::utf8($account); + + $base = Account::classUrl(); + $accountExtn = \urlencode($account); + $extn = \urlencode($id); + + return "{$base}/{$accountExtn}/persons/{$extn}"; + } + + /** + * @param array|string $_id + * @param null|array|string $_opts + * + * @throws Exception\BadMethodCallException + */ + public static function retrieve($_id, $_opts = null) + { + $msg = 'Persons cannot be retrieved without an account ID. Retrieve ' + . "a person using `Account::retrievePerson('account_id', " + . "'person_id')`."; + + throw new Exception\BadMethodCallException($msg); + } + + /** + * @param string $_id + * @param null|array $_params + * @param null|array|string $_options + * + * @throws Exception\BadMethodCallException + */ + public static function update($_id, $_params = null, $_options = null) + { + $msg = 'Persons cannot be updated without an account ID. Update ' + . "a person using `Account::updatePerson('account_id', " + . "'person_id', \$updateParams)`."; + + throw new Exception\BadMethodCallException($msg); + } + + /** + * @param null|array|string $opts + * + * @return static the saved resource + * + * @throws Exception\ApiErrorException if the request fails + * + * @deprecated The `save` method is deprecated and will be removed in a + * future major version of the library. Use the static method `update` + * on the resource instead. + */ + public function save($opts = null) + { + $params = $this->serializeParameters(); + if (\count($params) > 0) { + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('post', $url, $params, $opts, ['save']); + $this->refreshFrom($response, $opts); + } + + return $this; + } +} diff --git a/stripe-php/lib/Plan.php b/stripe-php/lib/Plan.php new file mode 100644 index 0000000..5b211c2 --- /dev/null +++ b/stripe-php/lib/Plan.php @@ -0,0 +1,164 @@ +Prices API. It replaces the Plans API and is backwards compatible to simplify your migration. + * + * Plans define the base price, currency, and billing cycle for recurring purchases of products. + * Products help you track inventory or provisioning, and plans help you track pricing. Different physical goods or levels of service should be represented by products, and pricing options should be represented by plans. This approach lets you change prices without having to change your provisioning scheme. + * + * For example, you might have a single "gold" product that has plans for $10/month, $100/year, €9/month, and €90/year. + * + * Related guides: Set up a subscription and more about products and prices. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property bool $active Whether the plan can be used for new purchases. + * @property null|int $amount The unit amount in cents (or local equivalent) to be charged, represented as a whole integer if possible. Only set if billing_scheme=per_unit. + * @property null|string $amount_decimal The unit amount in cents (or local equivalent) to be charged, represented as a decimal string with at most 12 decimal places. Only set if billing_scheme=per_unit. + * @property string $billing_scheme Describes how to compute the price per period. Either per_unit or tiered. per_unit indicates that the fixed amount (specified in amount) will be charged per unit in quantity (for plans with usage_type=licensed), or per unit of total usage (for plans with usage_type=metered). tiered indicates that the unit pricing will be computed using a tiering strategy as defined using the tiers and tiers_mode attributes. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property string $interval The frequency at which a subscription is billed. One of day, week, month or year. + * @property int $interval_count The number of intervals (specified in the interval attribute) between subscription billings. For example, interval=month and interval_count=3 bills every 3 months. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $meter The meter tracking the usage of a metered price + * @property null|string $nickname A brief description of the plan, hidden from customers. + * @property null|Product|string $product The product whose pricing this plan determines. + * @property null|((object{flat_amount: null|int, flat_amount_decimal: null|string, unit_amount: null|int, unit_amount_decimal: null|string, up_to: null|int}&StripeObject))[] $tiers Each element represents a pricing tier. This parameter requires billing_scheme to be set to tiered. See also the documentation for billing_scheme. + * @property null|string $tiers_mode Defines if the tiering price should be graduated or volume based. In volume-based tiering, the maximum quantity within a period determines the per unit price. In graduated tiering, pricing can change as the quantity grows. + * @property null|(object{divide_by: int, round: string}&StripeObject) $transform_usage Apply a transformation to the reported usage or set quantity before computing the amount billed. Cannot be combined with tiers. + * @property null|int $trial_period_days Default number of trial days when subscribing a customer to this plan using trial_from_plan=true. + * @property string $usage_type Configures how the quantity per period should be determined. Can be either metered or licensed. licensed automatically bills the quantity set when adding it to a subscription. metered aggregates the total usage based on usage records. Defaults to licensed. + */ +class Plan extends ApiResource +{ + const OBJECT_NAME = 'plan'; + + use ApiOperations\Update; + + const BILLING_SCHEME_PER_UNIT = 'per_unit'; + const BILLING_SCHEME_TIERED = 'tiered'; + + const INTERVAL_DAY = 'day'; + const INTERVAL_MONTH = 'month'; + const INTERVAL_WEEK = 'week'; + const INTERVAL_YEAR = 'year'; + + const TIERS_MODE_GRADUATED = 'graduated'; + const TIERS_MODE_VOLUME = 'volume'; + + const USAGE_TYPE_LICENSED = 'licensed'; + const USAGE_TYPE_METERED = 'metered'; + + /** + * You can now model subscriptions more flexibly using the Prices + * API. It replaces the Plans API and is backwards compatible to simplify your + * migration. + * + * @param null|array{active?: bool, amount?: int, amount_decimal?: string, billing_scheme?: string, currency: string, expand?: string[], id?: string, interval: string, interval_count?: int, metadata?: null|array, meter?: string, nickname?: string, product?: array|string, tiers?: (array{flat_amount?: int, flat_amount_decimal?: string, unit_amount?: int, unit_amount_decimal?: string, up_to: array|int|string})[], tiers_mode?: string, transform_usage?: array{divide_by: int, round: string}, trial_period_days?: int, usage_type?: string} $params + * @param null|array|string $options + * + * @return Plan the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Deleting plans means new subscribers can’t be added. Existing subscribers aren’t + * affected. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return Plan the deleted resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * Returns a list of your plans. + * + * @param null|array{active?: bool, created?: array|int, ending_before?: string, expand?: string[], limit?: int, product?: string, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the plan with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Plan + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the specified plan by setting the values of the parameters passed. Any + * parameters not provided are left unchanged. By design, you cannot change a + * plan’s ID, amount, currency, or billing cycle. + * + * @param string $id the ID of the resource to update + * @param null|array{active?: bool, expand?: string[], metadata?: null|array, nickname?: string, product?: string, trial_period_days?: int} $params + * @param null|array|string $opts + * + * @return Plan the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Price.php b/stripe-php/lib/Price.php new file mode 100644 index 0000000..17fd284 --- /dev/null +++ b/stripe-php/lib/Price.php @@ -0,0 +1,156 @@ +Products help you track inventory or provisioning, and prices help you track payment terms. Different physical goods or levels of service should be represented by products, and pricing options should be represented by prices. This approach lets you change prices without having to change your provisioning scheme. + * + * For example, you might have a single "gold" product that has prices for $10/month, $100/year, and €9 once. + * + * Related guides: Set up a subscription, create an invoice, and more about products and prices. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property bool $active Whether the price can be used for new purchases. + * @property string $billing_scheme Describes how to compute the price per period. Either per_unit or tiered. per_unit indicates that the fixed amount (specified in unit_amount or unit_amount_decimal) will be charged per unit in quantity (for prices with usage_type=licensed), or per unit of total usage (for prices with usage_type=metered). tiered indicates that the unit pricing will be computed using a tiering strategy as defined using the tiers and tiers_mode attributes. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|StripeObject $currency_options Prices defined in each available currency option. Each key must be a three-letter ISO currency code and a supported currency. + * @property null|(object{maximum: null|int, minimum: null|int, preset: null|int}&StripeObject) $custom_unit_amount When set, provides configuration for the amount to be adjusted by the customer during Checkout Sessions and Payment Links. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string $lookup_key A lookup key used to retrieve prices dynamically from a static string. This may be up to 200 characters. + * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $nickname A brief description of the price, hidden from customers. + * @property Product|string $product The ID of the product this price is associated with. + * @property null|(object{interval: string, interval_count: int, meter: null|string, trial_period_days: null|int, usage_type: string}&StripeObject) $recurring The recurring components of a price such as interval and usage_type. + * @property null|string $tax_behavior Only required if a default tax behavior was not provided in the Stripe Tax settings. Specifies whether the price is considered inclusive of taxes or exclusive of taxes. One of inclusive, exclusive, or unspecified. Once specified as either inclusive or exclusive, it cannot be changed. + * @property null|((object{flat_amount: null|int, flat_amount_decimal: null|string, unit_amount: null|int, unit_amount_decimal: null|string, up_to: null|int}&StripeObject))[] $tiers Each element represents a pricing tier. This parameter requires billing_scheme to be set to tiered. See also the documentation for billing_scheme. + * @property null|string $tiers_mode Defines if the tiering price should be graduated or volume based. In volume-based tiering, the maximum quantity within a period determines the per unit price. In graduated tiering, pricing can change as the quantity grows. + * @property null|(object{divide_by: int, round: string}&StripeObject) $transform_quantity Apply a transformation to the reported usage or set quantity before computing the amount billed. Cannot be combined with tiers. + * @property string $type One of one_time or recurring depending on whether the price is for a one-time purchase or a recurring (subscription) purchase. + * @property null|int $unit_amount The unit amount in cents (or local equivalent) to be charged, represented as a whole integer if possible. Only set if billing_scheme=per_unit. + * @property null|string $unit_amount_decimal The unit amount in cents (or local equivalent) to be charged, represented as a decimal string with at most 12 decimal places. Only set if billing_scheme=per_unit. + */ +class Price extends ApiResource +{ + const OBJECT_NAME = 'price'; + + use ApiOperations\Update; + + const BILLING_SCHEME_PER_UNIT = 'per_unit'; + const BILLING_SCHEME_TIERED = 'tiered'; + + const TAX_BEHAVIOR_EXCLUSIVE = 'exclusive'; + const TAX_BEHAVIOR_INCLUSIVE = 'inclusive'; + const TAX_BEHAVIOR_UNSPECIFIED = 'unspecified'; + + const TIERS_MODE_GRADUATED = 'graduated'; + const TIERS_MODE_VOLUME = 'volume'; + + const TYPE_ONE_TIME = 'one_time'; + const TYPE_RECURRING = 'recurring'; + + /** + * Creates a new Price for an + * existing Product. The Price + * can be recurring or one-time. + * + * @param null|array{active?: bool, billing_scheme?: string, currency: string, currency_options?: array, custom_unit_amount?: array{enabled: bool, maximum?: int, minimum?: int, preset?: int}, expand?: string[], lookup_key?: string, metadata?: array, nickname?: string, product?: string, product_data?: array{active?: bool, id?: string, metadata?: array, name: string, statement_descriptor?: string, tax_code?: string, unit_label?: string}, recurring?: array{interval: string, interval_count?: int, meter?: string, trial_period_days?: int, usage_type?: string}, tax_behavior?: string, tiers?: (array{flat_amount?: int, flat_amount_decimal?: string, unit_amount?: int, unit_amount_decimal?: string, up_to: array|int|string})[], tiers_mode?: string, transfer_lookup_key?: bool, transform_quantity?: array{divide_by: int, round: string}, unit_amount?: int, unit_amount_decimal?: string} $params + * @param null|array|string $options + * + * @return Price the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of your active prices, excluding inline prices. + * For the list of inactive prices, set active to false. + * + * @param null|array{active?: bool, created?: array|int, currency?: string, ending_before?: string, expand?: string[], limit?: int, lookup_keys?: string[], product?: string, recurring?: array{interval?: string, meter?: string, usage_type?: string}, starting_after?: string, type?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the price with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Price + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the specified price by setting the values of the parameters passed. Any + * parameters not provided are left unchanged. + * + * @param string $id the ID of the resource to update + * @param null|array{active?: bool, currency_options?: null|array, expand?: string[], lookup_key?: string, metadata?: null|array, nickname?: string, tax_behavior?: string, transfer_lookup_key?: bool} $params + * @param null|array|string $opts + * + * @return Price the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return SearchResult the price search results + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function search($params = null, $opts = null) + { + $url = '/v1/prices/search'; + + return static::_requestPage($url, SearchResult::class, $params, $opts); + } +} diff --git a/stripe-php/lib/Product.php b/stripe-php/lib/Product.php new file mode 100644 index 0000000..e73af65 --- /dev/null +++ b/stripe-php/lib/Product.php @@ -0,0 +1,229 @@ +Prices to configure pricing in Payment Links, Checkout, and Subscriptions. + * + * Related guides: Set up a subscription, + * share a Payment Link, + * accept payments with Checkout, + * and more about Products and Prices + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property bool $active Whether the product is currently available for purchase. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|Price|string $default_price The ID of the Price object that is the default price for this product. + * @property null|string $description The product's description, meant to be displayable to the customer. Use this field to optionally store a long form explanation of the product being sold for your own rendering purposes. + * @property string[] $images A list of up to 8 URLs of images for this product, meant to be displayable to the customer. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property (object{name?: string}&StripeObject)[] $marketing_features A list of up to 15 marketing features for this product. These are displayed in pricing tables. + * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $name The product's name, meant to be displayable to the customer. + * @property null|(object{height: float, length: float, weight: float, width: float}&StripeObject) $package_dimensions The dimensions of this product for shipping purposes. + * @property null|bool $shippable Whether this product is shipped (i.e., physical goods). + * @property null|string $statement_descriptor Extra information about a product which will appear on your customer's credit card statement. In the case that multiple products are billed at once, the first statement descriptor will be used. Only used for subscription payments. + * @property null|string|TaxCode $tax_code A tax code ID. + * @property string $type The type of the product. The product is either of type good, which is eligible for use with Orders and SKUs, or service, which is eligible for use with Subscriptions and Plans. + * @property null|string $unit_label A label that represents units of this product. When set, this will be included in customers' receipts, invoices, Checkout, and the customer portal. + * @property int $updated Time at which the object was last updated. Measured in seconds since the Unix epoch. + * @property null|string $url A URL of a publicly-accessible webpage for this product. + */ +class Product extends ApiResource +{ + const OBJECT_NAME = 'product'; + + use ApiOperations\NestedResource; + use ApiOperations\Update; + + const TYPE_GOOD = 'good'; + const TYPE_SERVICE = 'service'; + + /** + * Creates a new product object. + * + * @param null|array{active?: bool, default_price_data?: array{currency: string, currency_options?: array, custom_unit_amount?: array{enabled: bool, maximum?: int, minimum?: int, preset?: int}, metadata?: array, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, description?: string, expand?: string[], id?: string, images?: string[], marketing_features?: array{name: string}[], metadata?: array, name: string, package_dimensions?: array{height: float, length: float, weight: float, width: float}, shippable?: bool, statement_descriptor?: string, tax_code?: string, type?: string, unit_label?: string, url?: string} $params + * @param null|array|string $options + * + * @return Product the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Delete a product. Deleting a product is only possible if it has no prices + * associated with it. Additionally, deleting a product with type=good + * is only possible if it has no SKUs associated with it. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return Product the deleted resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * Returns a list of your products. The products are returned sorted by creation + * date, with the most recently created products appearing first. + * + * @param null|array{active?: bool, created?: array|int, ending_before?: string, expand?: string[], ids?: string[], limit?: int, shippable?: bool, starting_after?: string, type?: string, url?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an existing product. Supply the unique product ID from + * either a product creation request or the product list, and Stripe will return + * the corresponding product information. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Product + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the specific product by setting the values of the parameters passed. Any + * parameters not provided will be left unchanged. + * + * @param string $id the ID of the resource to update + * @param null|array{active?: bool, default_price?: string, description?: null|string, expand?: string[], images?: null|string[], marketing_features?: null|array{name: string}[], metadata?: null|array, name?: string, package_dimensions?: null|array{height: float, length: float, weight: float, width: float}, shippable?: bool, statement_descriptor?: string, tax_code?: null|string, unit_label?: null|string, url?: null|string} $params + * @param null|array|string $opts + * + * @return Product the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return SearchResult the product search results + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function search($params = null, $opts = null) + { + $url = '/v1/products/search'; + + return static::_requestPage($url, SearchResult::class, $params, $opts); + } + + const PATH_FEATURES = '/features'; + + /** + * @param string $id the ID of the product on which to retrieve the product features + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection the list of product features + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allFeatures($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_FEATURES, $params, $opts); + } + + /** + * @param string $id the ID of the product on which to create the product feature + * @param null|array $params + * @param null|array|string $opts + * + * @return ProductFeature + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function createFeature($id, $params = null, $opts = null) + { + return self::_createNestedResource($id, static::PATH_FEATURES, $params, $opts); + } + + /** + * @param string $id the ID of the product to which the product feature belongs + * @param string $featureId the ID of the product feature to delete + * @param null|array $params + * @param null|array|string $opts + * + * @return ProductFeature + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function deleteFeature($id, $featureId, $params = null, $opts = null) + { + return self::_deleteNestedResource($id, static::PATH_FEATURES, $featureId, $params, $opts); + } + + /** + * @param string $id the ID of the product to which the product feature belongs + * @param string $featureId the ID of the product feature to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @return ProductFeature + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieveFeature($id, $featureId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_FEATURES, $featureId, $params, $opts); + } +} diff --git a/stripe-php/lib/ProductFeature.php b/stripe-php/lib/ProductFeature.php new file mode 100644 index 0000000..a5aac75 --- /dev/null +++ b/stripe-php/lib/ProductFeature.php @@ -0,0 +1,19 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + */ +class ProductFeature extends ApiResource +{ + const OBJECT_NAME = 'product_feature'; +} diff --git a/stripe-php/lib/PromotionCode.php b/stripe-php/lib/PromotionCode.php new file mode 100644 index 0000000..71b3ca5 --- /dev/null +++ b/stripe-php/lib/PromotionCode.php @@ -0,0 +1,120 @@ +customer portal configuration, then customers can redeem a code themselves when updating a subscription in the portal. + * Customers can also view the currently active promotion codes and coupons on each of their subscriptions in the portal. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property bool $active Whether the promotion code is currently active. A promotion code is only active if the coupon is also valid. + * @property string $code The customer-facing code. Regardless of case, this code must be unique across all active promotion codes for each customer. Valid characters are lower case letters (a-z), upper case letters (A-Z), and digits (0-9). + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|Customer|string $customer The customer who can use this promotion code. + * @property null|string $customer_account The account representing the customer who can use this promotion code. + * @property null|int $expires_at Date at which the promotion code can no longer be redeemed. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|int $max_redemptions Maximum number of times this promotion code can be redeemed. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property (object{coupon: null|Coupon|string, type: string}&StripeObject) $promotion + * @property (object{currency_options?: StripeObject, first_time_transaction: bool, minimum_amount: null|int, minimum_amount_currency: null|string}&StripeObject) $restrictions + * @property int $times_redeemed Number of times this promotion code has been used. + */ +class PromotionCode extends ApiResource +{ + const OBJECT_NAME = 'promotion_code'; + + use ApiOperations\Update; + + /** + * A promotion code points to an underlying promotion. You can optionally restrict + * the code to a specific customer, redemption limit, and expiration date. + * + * @param null|array{active?: bool, code?: string, customer?: string, customer_account?: string, expand?: string[], expires_at?: int, max_redemptions?: int, metadata?: array, promotion: array{coupon?: string, type: string}, restrictions?: array{currency_options?: array, first_time_transaction?: bool, minimum_amount?: int, minimum_amount_currency?: string}} $params + * @param null|array|string $options + * + * @return PromotionCode the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of your promotion codes. + * + * @param null|array{active?: bool, code?: string, coupon?: string, created?: array|int, customer?: string, customer_account?: string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the promotion code with the given ID. In order to retrieve a promotion + * code by the customer-facing code use list with the desired + * code. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return PromotionCode + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the specified promotion code by setting the values of the parameters + * passed. Most fields are, by design, not editable. + * + * @param string $id the ID of the resource to update + * @param null|array{active?: bool, expand?: string[], metadata?: null|array, restrictions?: array{currency_options?: array}} $params + * @param null|array|string $opts + * + * @return PromotionCode the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Quote.php b/stripe-php/lib/Quote.php new file mode 100644 index 0000000..ec60804 --- /dev/null +++ b/stripe-php/lib/Quote.php @@ -0,0 +1,253 @@ +charge_automatically, or send_invoice. When charging automatically, Stripe will attempt to pay invoices at the end of the subscription cycle or on finalization using the default payment method attached to the subscription or customer. When sending an invoice, Stripe will email your customer an invoice with payment instructions and mark the subscription as active. Defaults to charge_automatically. + * @property (object{recurring: null|(object{amount_subtotal: int, amount_total: int, interval: string, interval_count: int, total_details: (object{amount_discount: int, amount_shipping: null|int, amount_tax: int, breakdown?: (object{discounts: (object{amount: int, discount: Discount}&StripeObject)[], taxes: ((object{amount: int, rate: TaxRate, taxability_reason: null|string, taxable_amount: null|int}&StripeObject))[]}&StripeObject)}&StripeObject)}&StripeObject), upfront: (object{amount_subtotal: int, amount_total: int, line_items?: Collection, total_details: (object{amount_discount: int, amount_shipping: null|int, amount_tax: int, breakdown?: (object{discounts: (object{amount: int, discount: Discount}&StripeObject)[], taxes: ((object{amount: int, rate: TaxRate, taxability_reason: null|string, taxable_amount: null|int}&StripeObject))[]}&StripeObject)}&StripeObject)}&StripeObject)}&StripeObject) $computed + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|Customer|string $customer The customer who received this quote. A customer is required to finalize the quote. Once specified, you can't change it. + * @property null|string $customer_account The account representing the customer who received this quote. A customer or account is required to finalize the quote. Once specified, you can't change it. + * @property null|(string|TaxRate)[] $default_tax_rates The tax rates applied to this quote. + * @property null|string $description A description that will be displayed on the quote PDF. + * @property (Discount|string)[] $discounts The discounts applied to this quote. + * @property int $expires_at The date on which the quote will be canceled if in open or draft status. Measured in seconds since the Unix epoch. + * @property null|string $footer A footer that will be displayed on the quote PDF. + * @property null|(object{is_revision: bool, quote: Quote|string}&StripeObject) $from_quote Details of the quote that was cloned. See the cloning documentation for more details. + * @property null|string $header A header that will be displayed on the quote PDF. + * @property null|Invoice|string $invoice The invoice that was created from this quote. + * @property (object{days_until_due: null|int, issuer: (object{account?: Account|string, type: string}&StripeObject)}&StripeObject) $invoice_settings + * @property null|Collection $line_items A list of items the customer is being quoted for. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $number A unique number that identifies this particular quote. This number is assigned once the quote is finalized. + * @property null|Account|string $on_behalf_of The account on behalf of which to charge. See the Connect documentation for details. + * @property string $status The status of the quote. + * @property (object{accepted_at: null|int, canceled_at: null|int, finalized_at: null|int}&StripeObject) $status_transitions + * @property null|string|Subscription $subscription The subscription that was created or updated from this quote. + * @property (object{billing_mode: (object{flexible?: (object{proration_discounts?: string}&StripeObject), type: string}&StripeObject), description: null|string, effective_date: null|int, metadata: null|StripeObject, trial_period_days: null|int}&StripeObject) $subscription_data + * @property null|string|SubscriptionSchedule $subscription_schedule The subscription schedule that was created or updated from this quote. + * @property null|string|TestHelpers\TestClock $test_clock ID of the test clock this quote belongs to. + * @property (object{amount_discount: int, amount_shipping: null|int, amount_tax: int, breakdown?: (object{discounts: (object{amount: int, discount: Discount}&StripeObject)[], taxes: ((object{amount: int, rate: TaxRate, taxability_reason: null|string, taxable_amount: null|int}&StripeObject))[]}&StripeObject)}&StripeObject) $total_details + * @property null|(object{amount: null|int, amount_percent: null|float, destination: Account|string}&StripeObject) $transfer_data The account (if any) the payments will be attributed to for tax reporting, and where funds from each payment will be transferred to for each of the invoices. + */ +class Quote extends ApiResource +{ + const OBJECT_NAME = 'quote'; + + use ApiOperations\Update; + + const COLLECTION_METHOD_CHARGE_AUTOMATICALLY = 'charge_automatically'; + const COLLECTION_METHOD_SEND_INVOICE = 'send_invoice'; + + const STATUS_ACCEPTED = 'accepted'; + const STATUS_CANCELED = 'canceled'; + const STATUS_DRAFT = 'draft'; + const STATUS_OPEN = 'open'; + + /** + * A quote models prices and services for a customer. Default options for + * header, description, footer, and + * expires_at can be set in the dashboard via the quote template. + * + * @param null|array{application_fee_amount?: null|int, application_fee_percent?: null|float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, collection_method?: string, customer?: string, customer_account?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], expires_at?: int, footer?: null|string, from_quote?: array{is_revision?: bool, quote: string}, header?: null|string, invoice_settings?: array{days_until_due?: int, issuer?: array{account?: string, type: string}}, line_items?: (array{discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], price?: string, price_data?: array{currency: string, product: string, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: null|string, subscription_data?: array{billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, description?: string, effective_date?: null|array|int|string, metadata?: array, trial_period_days?: null|int}, test_clock?: string, transfer_data?: null|array{amount?: int, amount_percent?: float, destination: string}} $params + * @param null|array|string $options + * + * @return Quote the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of your quotes. + * + * @param null|array{customer?: string, customer_account?: string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, status?: string, test_clock?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the quote with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Quote + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * A quote models prices and services for a customer. + * + * @param string $id the ID of the resource to update + * @param null|array{application_fee_amount?: null|int, application_fee_percent?: null|float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, collection_method?: string, customer?: string, customer_account?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], expires_at?: int, footer?: null|string, header?: null|string, invoice_settings?: array{days_until_due?: int, issuer?: array{account?: string, type: string}}, line_items?: (array{discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], id?: string, price?: string, price_data?: array{currency: string, product: string, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: null|string, subscription_data?: array{description?: null|string, effective_date?: null|array|int|string, metadata?: array, trial_period_days?: null|int}, transfer_data?: null|array{amount?: int, amount_percent?: float, destination: string}} $params + * @param null|array|string $opts + * + * @return Quote the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Quote the accepted quote + * + * @throws Exception\ApiErrorException if the request fails + */ + public function accept($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/accept'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Quote the canceled quote + * + * @throws Exception\ApiErrorException if the request fails + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Quote the finalized quote + * + * @throws Exception\ApiErrorException if the request fails + */ + public function finalizeQuote($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/finalize'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param string $id + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection list of line items + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allComputedUpfrontLineItems($id, $params = null, $opts = null) + { + $url = static::resourceUrl($id) . '/computed_upfront_line_items'; + list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param string $id + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection list of line items + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allLineItems($id, $params = null, $opts = null) + { + $url = static::resourceUrl($id) . '/line_items'; + list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param callable $readBodyChunkCallable + * @param null|array $params + * @param null|array|string $opts + * + * @return void + * + * @throws Exception\ApiErrorException if the request fails + */ + public function pdf($readBodyChunkCallable, $params = null, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + if (!isset($opts->apiBase)) { + $opts->apiBase = Stripe::$apiUploadBase; + } + $url = $this->instanceUrl() . '/pdf'; + $this->_requestStream('get', $url, $readBodyChunkCallable, $params, $opts); + } +} diff --git a/stripe-php/lib/Radar/EarlyFraudWarning.php b/stripe-php/lib/Radar/EarlyFraudWarning.php new file mode 100644 index 0000000..f85b3ba --- /dev/null +++ b/stripe-php/lib/Radar/EarlyFraudWarning.php @@ -0,0 +1,73 @@ +Early fraud warnings + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property bool $actionable An EFW is actionable if it has not received a dispute and has not been fully refunded. You may wish to proactively refund a charge that receives an EFW, in order to avoid receiving a dispute later. + * @property string|\Stripe\Charge $charge ID of the charge this early fraud warning is for, optionally expanded. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $fraud_type The type of fraud labelled by the issuer. One of card_never_received, fraudulent_card_application, made_with_counterfeit_card, made_with_lost_card, made_with_stolen_card, misc, unauthorized_use_of_card. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string|\Stripe\PaymentIntent $payment_intent ID of the Payment Intent this early fraud warning is for, optionally expanded. + */ +class EarlyFraudWarning extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'radar.early_fraud_warning'; + + const FRAUD_TYPE_CARD_NEVER_RECEIVED = 'card_never_received'; + const FRAUD_TYPE_FRAUDULENT_CARD_APPLICATION = 'fraudulent_card_application'; + const FRAUD_TYPE_MADE_WITH_COUNTERFEIT_CARD = 'made_with_counterfeit_card'; + const FRAUD_TYPE_MADE_WITH_LOST_CARD = 'made_with_lost_card'; + const FRAUD_TYPE_MADE_WITH_STOLEN_CARD = 'made_with_stolen_card'; + const FRAUD_TYPE_MISC = 'misc'; + const FRAUD_TYPE_UNAUTHORIZED_USE_OF_CARD = 'unauthorized_use_of_card'; + + /** + * Returns a list of early fraud warnings. + * + * @param null|array{charge?: string, created?: array|int, ending_before?: string, expand?: string[], limit?: int, payment_intent?: string, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an early fraud warning that has previously been + * created. + * + * Please refer to the early fraud + * warning object reference for more details. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return EarlyFraudWarning + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Radar/ValueList.php b/stripe-php/lib/Radar/ValueList.php new file mode 100644 index 0000000..25f0f1c --- /dev/null +++ b/stripe-php/lib/Radar/ValueList.php @@ -0,0 +1,148 @@ +Default Stripe lists + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property string $alias The name of the value list for use in rules. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $created_by The name or email address of the user who created this value list. + * @property string $item_type The type of items in the value list. One of card_fingerprint, card_bin, email, ip_address, country, string, case_sensitive_string, customer_id, sepa_debit_fingerprint, or us_bank_account_fingerprint. + * @property \Stripe\Collection $list_items List of items contained within this value list. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $name The name of the value list. + */ +class ValueList extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'radar.value_list'; + + use \Stripe\ApiOperations\Update; + + const ITEM_TYPE_CARD_BIN = 'card_bin'; + const ITEM_TYPE_CARD_FINGERPRINT = 'card_fingerprint'; + const ITEM_TYPE_CASE_SENSITIVE_STRING = 'case_sensitive_string'; + const ITEM_TYPE_COUNTRY = 'country'; + const ITEM_TYPE_CUSTOMER_ID = 'customer_id'; + const ITEM_TYPE_EMAIL = 'email'; + const ITEM_TYPE_IP_ADDRESS = 'ip_address'; + const ITEM_TYPE_SEPA_DEBIT_FINGERPRINT = 'sepa_debit_fingerprint'; + const ITEM_TYPE_STRING = 'string'; + const ITEM_TYPE_US_BANK_ACCOUNT_FINGERPRINT = 'us_bank_account_fingerprint'; + + /** + * Creates a new ValueList object, which can then be referenced in + * rules. + * + * @param null|array{alias: string, expand?: string[], item_type?: string, metadata?: array, name: string} $params + * @param null|array|string $options + * + * @return ValueList the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Deletes a ValueList object, also deleting any items contained + * within the value list. To be deleted, a value list must not be referenced in any + * rules. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return ValueList the deleted resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * Returns a list of ValueList objects. The objects are sorted in + * descending order by creation date, with the most recently created object + * appearing first. + * + * @param null|array{alias?: string, contains?: string, created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a ValueList object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return ValueList + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates a ValueList object by setting the values of the parameters + * passed. Any parameters not provided will be left unchanged. Note that + * item_type is immutable. + * + * @param string $id the ID of the resource to update + * @param null|array{alias?: string, expand?: string[], metadata?: array, name?: string} $params + * @param null|array|string $opts + * + * @return ValueList the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Radar/ValueListItem.php b/stripe-php/lib/Radar/ValueListItem.php new file mode 100644 index 0000000..34e64da --- /dev/null +++ b/stripe-php/lib/Radar/ValueListItem.php @@ -0,0 +1,106 @@ +Managing list items + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $created_by The name or email address of the user who added this item to the value list. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $value The value of the item. + * @property string $value_list The identifier of the value list this item belongs to. + */ +class ValueListItem extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'radar.value_list_item'; + + /** + * Creates a new ValueListItem object, which is added to the specified + * parent value list. + * + * @param null|array{expand?: string[], value: string, value_list: string} $params + * @param null|array|string $options + * + * @return ValueListItem the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Deletes a ValueListItem object, removing it from its parent value + * list. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return ValueListItem the deleted resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * Returns a list of ValueListItem objects. The objects are sorted in + * descending order by creation date, with the most recently created object + * appearing first. + * + * @param null|array{created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, value?: string, value_list: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a ValueListItem object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return ValueListItem + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Reason.php b/stripe-php/lib/Reason.php new file mode 100644 index 0000000..e062a6e --- /dev/null +++ b/stripe-php/lib/Reason.php @@ -0,0 +1,42 @@ +id = $json['id']; + $this->idempotency_key = $json['idempotency_key']; + } +} + +/** + * @property string $type Event reason type. + * @property null|ReasonRequest $request Information on the API request that instigated the event. + */ +class Reason +{ + public $type; + public $request; + + public function __construct($json) + { + $this->type = $json['type']; + + if ('request' === $this->type) { + $this->request = new ReasonRequest($json['request']); + } else { + $this->request = null; + } + } +} diff --git a/stripe-php/lib/RecipientTransfer.php b/stripe-php/lib/RecipientTransfer.php new file mode 100644 index 0000000..938a0d3 --- /dev/null +++ b/stripe-php/lib/RecipientTransfer.php @@ -0,0 +1,36 @@ +Refunds + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount, in cents (or local equivalent). + * @property null|BalanceTransaction|string $balance_transaction Balance transaction that describes the impact on your account balance. + * @property null|Charge|string $charge ID of the charge that's refunded. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $description An arbitrary string attached to the object. You can use this for displaying to users (available on non-card refunds only). + * @property null|(object{affirm?: (object{}&StripeObject), afterpay_clearpay?: (object{}&StripeObject), alipay?: (object{}&StripeObject), alma?: (object{}&StripeObject), amazon_pay?: (object{}&StripeObject), au_bank_transfer?: (object{}&StripeObject), blik?: (object{network_decline_code: null|string, reference: null|string, reference_status: null|string}&StripeObject), br_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), card?: (object{reference?: string, reference_status?: string, reference_type?: string, type: string}&StripeObject), cashapp?: (object{}&StripeObject), crypto?: (object{reference: null|string}&StripeObject), customer_cash_balance?: (object{}&StripeObject), eps?: (object{}&StripeObject), eu_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), gb_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), giropay?: (object{}&StripeObject), grabpay?: (object{}&StripeObject), jp_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), klarna?: (object{}&StripeObject), mb_way?: (object{reference: null|string, reference_status: null|string}&StripeObject), multibanco?: (object{reference: null|string, reference_status: null|string}&StripeObject), mx_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), nz_bank_transfer?: (object{}&StripeObject), p24?: (object{reference: null|string, reference_status: null|string}&StripeObject), paynow?: (object{}&StripeObject), paypal?: (object{network_decline_code: null|string}&StripeObject), pix?: (object{}&StripeObject), revolut?: (object{}&StripeObject), sofort?: (object{}&StripeObject), swish?: (object{network_decline_code: null|string, reference: null|string, reference_status: null|string}&StripeObject), th_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), twint?: (object{}&StripeObject), type: string, us_bank_transfer?: (object{reference: null|string, reference_status: null|string}&StripeObject), wechat_pay?: (object{}&StripeObject), zip?: (object{}&StripeObject)}&StripeObject) $destination_details + * @property null|BalanceTransaction|string $failure_balance_transaction After the refund fails, this balance transaction describes the adjustment made on your account balance that reverses the initial balance transaction. + * @property null|string $failure_reason Provides the reason for the refund failure. Possible values are: lost_or_stolen_card, expired_or_canceled_card, charge_for_pending_refund_disputed, insufficient_funds, declined, merchant_request, or unknown. + * @property null|string $instructions_email For payment methods without native refund support (for example, Konbini, PromptPay), provide an email address for the customer to receive refund instructions. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|(object{display_details?: (object{email_sent: (object{email_sent_at: int, email_sent_to: string}&StripeObject), expires_at: int}&StripeObject), type: string}&StripeObject) $next_action + * @property null|PaymentIntent|string $payment_intent ID of the PaymentIntent that's refunded. + * @property null|string $pending_reason Provides the reason for why the refund is pending. Possible values are: processing, insufficient_funds, or charge_pending. + * @property null|(object{presentment_amount: int, presentment_currency: string}&StripeObject) $presentment_details + * @property null|string $reason Reason for the refund, which is either user-provided (duplicate, fraudulent, or requested_by_customer) or generated by Stripe internally (expired_uncaptured_charge). + * @property null|string $receipt_number This is the transaction number that appears on email receipts sent for this refund. + * @property null|string|TransferReversal $source_transfer_reversal The transfer reversal that's associated with the refund. Only present if the charge came from another Stripe account. + * @property null|string $status Status of the refund. This can be pending, requires_action, succeeded, failed, or canceled. Learn more about failed refunds. + * @property null|string|TransferReversal $transfer_reversal This refers to the transfer reversal object if the accompanying transfer reverses. This is only applicable if the charge was created using the destination parameter. + */ +class Refund extends ApiResource +{ + const OBJECT_NAME = 'refund'; + + use ApiOperations\Update; + + const FAILURE_REASON_EXPIRED_OR_CANCELED_CARD = 'expired_or_canceled_card'; + const FAILURE_REASON_LOST_OR_STOLEN_CARD = 'lost_or_stolen_card'; + const FAILURE_REASON_UNKNOWN = 'unknown'; + + const PENDING_REASON_CHARGE_PENDING = 'charge_pending'; + const PENDING_REASON_INSUFFICIENT_FUNDS = 'insufficient_funds'; + const PENDING_REASON_PROCESSING = 'processing'; + + const REASON_DUPLICATE = 'duplicate'; + const REASON_EXPIRED_UNCAPTURED_CHARGE = 'expired_uncaptured_charge'; + const REASON_FRAUDULENT = 'fraudulent'; + const REASON_REQUESTED_BY_CUSTOMER = 'requested_by_customer'; + + const STATUS_CANCELED = 'canceled'; + const STATUS_FAILED = 'failed'; + const STATUS_PENDING = 'pending'; + const STATUS_REQUIRES_ACTION = 'requires_action'; + const STATUS_SUCCEEDED = 'succeeded'; + + /** + * When you create a new refund, you must specify a Charge or a PaymentIntent + * object on which to create it. + * + * Creating a new refund will refund a charge that has previously been created but + * not yet refunded. Funds will be refunded to the credit or debit card that was + * originally charged. + * + * You can optionally refund only part of a charge. You can do so multiple times, + * until the entire charge has been refunded. + * + * Once entirely refunded, a charge can’t be refunded again. This method will raise + * an error when called on an already-refunded charge, or when trying to refund + * more money than is left on a charge. + * + * @param null|array{amount?: int, charge?: string, currency?: string, customer?: string, expand?: string[], instructions_email?: string, metadata?: null|array, origin?: string, payment_intent?: string, reason?: string, refund_application_fee?: bool, reverse_transfer?: bool} $params + * @param null|array|string $options + * + * @return Refund the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of all refunds you created. We return the refunds in sorted + * order, with the most recent refunds appearing first. The 10 most recent refunds + * are always available by default on the Charge object. + * + * @param null|array{charge?: string, created?: array|int, ending_before?: string, expand?: string[], limit?: int, payment_intent?: string, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an existing refund. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Refund + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the refund that you specify by setting the values of the passed + * parameters. Any parameters that you don’t provide remain unchanged. + * + * This request only accepts metadata as an argument. + * + * @param string $id the ID of the resource to update + * @param null|array{expand?: string[], metadata?: null|array} $params + * @param null|array|string $opts + * + * @return Refund the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Refund the canceled refund + * + * @throws Exception\ApiErrorException if the request fails + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/RelatedObject.php b/stripe-php/lib/RelatedObject.php new file mode 100644 index 0000000..182bbe7 --- /dev/null +++ b/stripe-php/lib/RelatedObject.php @@ -0,0 +1,22 @@ +id = $json['id']; + $this->type = $json['type']; + $this->url = $json['url']; + } +} diff --git a/stripe-php/lib/Reporting/ReportRun.php b/stripe-php/lib/Reporting/ReportRun.php new file mode 100644 index 0000000..99c3f50 --- /dev/null +++ b/stripe-php/lib/Reporting/ReportRun.php @@ -0,0 +1,90 @@ +API Access to Reports. + * + * Note that certain report types can only be run based on your live-mode data (not test-mode + * data), and will error when queried without a live-mode API key. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $error If something should go wrong during the run, a message about the failure (populated when status=failed). + * @property bool $livemode true if the report is run on live mode data and false if it is run on test mode data. + * @property (object{columns?: string[], connected_account?: string, currency?: string, interval_end?: int, interval_start?: int, payout?: string, reporting_category?: string, timezone?: string}&\Stripe\StripeObject) $parameters + * @property string $report_type The ID of the report type to run, such as "balance.summary.1". + * @property null|\Stripe\File $result The file object representing the result of the report run (populated when status=succeeded). + * @property string $status Status of this report run. This will be pending when the run is initially created. When the run finishes, this will be set to succeeded and the result field will be populated. Rarely, we may encounter an error, at which point this will be set to failed and the error field will be populated. + * @property null|int $succeeded_at Timestamp at which this run successfully finished (populated when status=succeeded). Measured in seconds since the Unix epoch. + */ +class ReportRun extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'reporting.report_run'; + + /** + * Creates a new object and begin running the report. (Certain report types require + * a live-mode API key.). + * + * @param null|array{expand?: string[], parameters?: array{columns?: string[], connected_account?: string, currency?: string, interval_end?: int, interval_start?: int, payout?: string, reporting_category?: string, timezone?: string}, report_type: string} $params + * @param null|array|string $options + * + * @return ReportRun the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of Report Runs, with the most recent appearing first. + * + * @param null|array{created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an existing Report Run. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return ReportRun + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Reporting/ReportType.php b/stripe-php/lib/Reporting/ReportType.php new file mode 100644 index 0000000..a3cef89 --- /dev/null +++ b/stripe-php/lib/Reporting/ReportType.php @@ -0,0 +1,67 @@ +API Access to Reports documentation + * for those Report Type IDs, along with required and optional parameters. + * + * Note that certain report types can only be run based on your live-mode data (not test-mode + * data), and will error when queried without a live-mode API key. + * + * @property string $id The ID of the Report Type, such as balance.summary.1. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $data_available_end Most recent time for which this Report Type is available. Measured in seconds since the Unix epoch. + * @property int $data_available_start Earliest time for which this Report Type is available. Measured in seconds since the Unix epoch. + * @property null|string[] $default_columns List of column names that are included by default when this Report Type gets run. (If the Report Type doesn't support the columns parameter, this will be null.) + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $name Human-readable name of the Report Type + * @property int $updated When this Report Type was latest updated. Measured in seconds since the Unix epoch. + * @property int $version Version of the Report Type. Different versions report with the same ID will have the same purpose, but may take different run parameters or have different result schemas. + */ +class ReportType extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'reporting.report_type'; + + /** + * Returns a full list of Report Types. + * + * @param null|array{expand?: string[]} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves the details of a Report Type. (Certain report types require a live-mode API key.). + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return ReportType + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/RequestTelemetry.php b/stripe-php/lib/RequestTelemetry.php new file mode 100644 index 0000000..b4a63b2 --- /dev/null +++ b/stripe-php/lib/RequestTelemetry.php @@ -0,0 +1,32 @@ +requestId = $requestId; + $this->requestDuration = $requestDuration; + $this->usage = $usage; + } +} diff --git a/stripe-php/lib/ReserveTransaction.php b/stripe-php/lib/ReserveTransaction.php new file mode 100644 index 0000000..b783703 --- /dev/null +++ b/stripe-php/lib/ReserveTransaction.php @@ -0,0 +1,17 @@ +ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + */ +class ReserveTransaction extends ApiResource +{ + const OBJECT_NAME = 'reserve_transaction'; +} diff --git a/stripe-php/lib/Review.php b/stripe-php/lib/Review.php new file mode 100644 index 0000000..fd29bad --- /dev/null +++ b/stripe-php/lib/Review.php @@ -0,0 +1,112 @@ +Radar and reviewing payments + * here. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|string $billing_zip The ZIP or postal code of the card used, if applicable. + * @property null|Charge|string $charge The charge associated with this review. + * @property null|string $closed_reason The reason the review was closed, or null if it has not yet been closed. One of approved, refunded, refunded_as_fraud, disputed, redacted, canceled, payment_never_settled, or acknowledged. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $ip_address The IP address where the payment originated. + * @property null|(object{city: null|string, country: null|string, latitude: null|float, longitude: null|float, region: null|string}&StripeObject) $ip_address_location Information related to the location of the payment. Note that this information is an approximation and attempts to locate the nearest population center - it should not be used to determine a specific address. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property bool $open If true, the review needs action. + * @property string $opened_reason The reason the review was opened. One of rule or manual. + * @property null|PaymentIntent|string $payment_intent The PaymentIntent ID associated with this review, if one exists. + * @property string $reason The reason the review is currently open or closed. One of rule, manual, approved, refunded, refunded_as_fraud, disputed, redacted, canceled, payment_never_settled, or acknowledged. + * @property null|(object{browser: null|string, device: null|string, platform: null|string, version: null|string}&StripeObject) $session Information related to the browsing session of the user who initiated the payment. + */ +class Review extends ApiResource +{ + const OBJECT_NAME = 'review'; + + const CLOSED_REASON_ACKNOWLEDGED = 'acknowledged'; + const CLOSED_REASON_APPROVED = 'approved'; + const CLOSED_REASON_CANCELED = 'canceled'; + const CLOSED_REASON_DISPUTED = 'disputed'; + const CLOSED_REASON_PAYMENT_NEVER_SETTLED = 'payment_never_settled'; + const CLOSED_REASON_REDACTED = 'redacted'; + const CLOSED_REASON_REFUNDED = 'refunded'; + const CLOSED_REASON_REFUNDED_AS_FRAUD = 'refunded_as_fraud'; + + const OPENED_REASON_MANUAL = 'manual'; + const OPENED_REASON_RULE = 'rule'; + + /** + * Returns a list of Review objects that have open set to + * true. The objects are sorted in descending order by creation date, + * with the most recently created object appearing first. + * + * @param null|array{created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves a Review object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Review + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Possible string representations of the current, the opening or the closure reason of the review. + * Not all of these enumeration apply to all of the ´reason´ fields. Please consult the Review object to + * determine where these are apply. + * + * @see https://stripe.com/docs/api/radar/reviews/object + */ + const REASON_APPROVED = 'approved'; + const REASON_DISPUTED = 'disputed'; + const REASON_MANUAL = 'manual'; + const REASON_REFUNDED = 'refunded'; + const REASON_REFUNDED_AS_FRAUD = 'refunded_as_fraud'; + const REASON_RULE = 'rule'; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Review the approved review + * + * @throws Exception\ApiErrorException if the request fails + */ + public function approve($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/approve'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/SearchResult.php b/stripe-php/lib/SearchResult.php new file mode 100644 index 0000000..f60b09c --- /dev/null +++ b/stripe-php/lib/SearchResult.php @@ -0,0 +1,242 @@ +Collection in that they both wrap + * around a list of objects and provide pagination. However the + * SearchResult object paginates by relying on a + * next_page token included in the response rather than using + * object IDs and a starting_before/ending_after + * parameter. Thus, SearchResult only supports forwards pagination. + * + * The {@see $total_count} property is only available when + * the `expand` parameter contains `total_count`. + * + * @template TStripeObject of StripeObject + * + * @template-implements \IteratorAggregate + * + * @property string $object + * @property string $url + * @property string $next_page + * @property int $total_count + * @property bool $has_more + * @property TStripeObject[] $data + */ +class SearchResult extends StripeObject implements \Countable, \IteratorAggregate +{ + const OBJECT_NAME = 'search_result'; + + use ApiOperations\Request; + + /** @var array */ + protected $filters = []; + + /** + * @return string the base URL for the given class + */ + public static function baseUrl() + { + return Stripe::$apiBase; + } + + /** + * Returns the filters. + * + * @return array the filters + */ + public function getFilters() + { + return $this->filters; + } + + /** + * Sets the filters, removing paging options. + * + * @param array $filters the filters + */ + public function setFilters($filters) + { + $this->filters = $filters; + } + + /** + * @return mixed + */ + #[\ReturnTypeWillChange] + public function offsetGet($k) + { + if (\is_string($k)) { + return parent::offsetGet($k); + } + $msg = "You tried to access the {$k} index, but SearchResult " + . 'types only support string keys. (HINT: Search calls ' + . 'return an object with a `data` (which is the data ' + . "array). You likely want to call ->data[{$k}])"; + + throw new Exception\InvalidArgumentException($msg); + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return SearchResult + * + * @throws Exception\ApiErrorException + */ + public function all($params = null, $opts = null) + { + self::_validateParams($params); + list($url, $params) = $this->extractPathAndUpdateParams($params); + + list($response, $opts) = $this->_request('get', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response, $opts); + if (!$obj instanceof SearchResult) { + throw new Exception\UnexpectedValueException( + 'Expected type ' . SearchResult::class . ', got "' . \get_class($obj) . '" instead.' + ); + } + $obj->setFilters($params); + + return $obj; + } + + /** + * @return int the number of objects in the current page + */ + #[\ReturnTypeWillChange] + public function count() + { + return \count($this->data); + } + + /** + * @return \ArrayIterator an iterator that can be used to iterate + * across objects in the current page + */ + #[\ReturnTypeWillChange] + public function getIterator() + { + return new \ArrayIterator($this->data); + } + + /** + * @return \Generator|TStripeObject[] A generator that can be used to + * iterate across all objects across all pages. As page boundaries are + * encountered, the next page will be fetched automatically for + * continued iteration. + * + * @throws Exception\ApiErrorException + */ + public function autoPagingIterator() + { + $page = $this; + + while (true) { + foreach ($page as $item) { + yield $item; + } + $page = $page->nextPage(); + + if ($page->isEmpty()) { + break; + } + } + } + + /** + * Returns an empty set of search results. This is returned from + * {@see nextPage()} when we know that there isn't a next page in order to + * replicate the behavior of the API when it attempts to return a page + * beyond the last. + * + * @param null|array|string $opts + * + * @return SearchResult + */ + public static function emptySearchResult($opts = null) + { + return SearchResult::constructFrom(['data' => []], $opts); + } + + /** + * Returns true if the page object contains no element. + * + * @return bool + */ + public function isEmpty() + { + return empty($this->data); + } + + /** + * Fetches the next page in the resource list (if there is one). + * + * This method will try to respect the limit of the current page. If none + * was given, the default limit will be fetched again. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return SearchResult + * + * @throws Exception\ApiErrorException + */ + public function nextPage($params = null, $opts = null) + { + if (!$this->has_more) { + return static::emptySearchResult($opts); + } + + $params = \array_merge( + $this->filters ?: [], + ['page' => $this->next_page], + $params ?: [] + ); + + return $this->all($params, $opts); + } + + /** + * Gets the first item from the current page. Returns `null` if the current page is empty. + * + * @return null|TStripeObject + */ + public function first() + { + return \count($this->data) > 0 ? $this->data[0] : null; + } + + /** + * Gets the last item from the current page. Returns `null` if the current page is empty. + * + * @return null|TStripeObject + */ + public function last() + { + return \count($this->data) > 0 ? $this->data[\count($this->data) - 1] : null; + } + + private function extractPathAndUpdateParams($params) + { + $url = \parse_url($this->url); + + if (!isset($url['path'])) { + throw new Exception\UnexpectedValueException("Could not parse list url into parts: {$url}"); + } + + if (isset($url['query'])) { + // If the URL contains a query param, parse it out into $params so they + // don't interact weirdly with each other. + $query = []; + \parse_str($url['query'], $query); + $params = \array_merge($params ?: [], $query); + } + + return [$url['path'], $params]; + } +} diff --git a/stripe-php/lib/Service/AbstractService.php b/stripe-php/lib/Service/AbstractService.php new file mode 100644 index 0000000..23132a3 --- /dev/null +++ b/stripe-php/lib/Service/AbstractService.php @@ -0,0 +1,105 @@ +client = $client; + $this->streamingClient = $client; + } + + /** + * Gets the client used by this service to send requests. + * + * @return \Stripe\StripeClientInterface + */ + public function getClient() + { + return $this->client; + } + + /** + * Gets the client used by this service to send requests. + * + * @return \Stripe\StripeStreamingClientInterface + */ + public function getStreamingClient() + { + return $this->streamingClient; + } + + /** + * Translate null values to empty strings. For service methods, + * we interpret null as a request to unset the field, which + * corresponds to sending an empty string for the field to the + * API. + * + * @param null|array $params + */ + private static function formatParams($params) + { + if (null === $params) { + return null; + } + \array_walk_recursive($params, static function (&$value, $key) { + if (null === $value) { + $value = ''; + } + }); + + return $params; + } + + protected function request($method, $path, $params, $opts) + { + return $this->getClient()->request($method, $path, self::formatParams($params), $opts); + } + + protected function requestStream($method, $path, $readBodyChunkCallable, $params, $opts) + { + return $this->getStreamingClient()->requestStream($method, $path, $readBodyChunkCallable, self::formatParams($params), $opts); + } + + protected function requestCollection($method, $path, $params, $opts) + { + return $this->getClient()->requestCollection($method, $path, self::formatParams($params), $opts); + } + + protected function requestSearchResult($method, $path, $params, $opts) + { + return $this->getClient()->requestSearchResult($method, $path, self::formatParams($params), $opts); + } + + protected function buildPath($basePath, ...$ids) + { + foreach ($ids as $id) { + if (null === $id || '' === \trim($id)) { + $msg = 'The resource ID cannot be null or whitespace.'; + + throw new \Stripe\Exception\InvalidArgumentException($msg); + } + } + + return \sprintf($basePath, ...\array_map('\urlencode', $ids)); + } +} diff --git a/stripe-php/lib/Service/AbstractServiceFactory.php b/stripe-php/lib/Service/AbstractServiceFactory.php new file mode 100644 index 0000000..207b69a --- /dev/null +++ b/stripe-php/lib/Service/AbstractServiceFactory.php @@ -0,0 +1,26 @@ +client = $client; + } +} diff --git a/stripe-php/lib/Service/AccountLinkService.php b/stripe-php/lib/Service/AccountLinkService.php new file mode 100644 index 0000000..de987ac --- /dev/null +++ b/stripe-php/lib/Service/AccountLinkService.php @@ -0,0 +1,30 @@ +request('post', '/v1/account_links', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/AccountService.php b/stripe-php/lib/Service/AccountService.php new file mode 100644 index 0000000..b69760d --- /dev/null +++ b/stripe-php/lib/Service/AccountService.php @@ -0,0 +1,411 @@ +Connect. If you’re not a platform, the list is empty. + * + * @param null|array{created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Account> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/accounts', $params, $opts); + } + + /** + * Returns a list of capabilities associated with the account. The capabilities are + * returned sorted by creation date, with the most recent capability appearing + * first. + * + * @param string $parentId + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Capability> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allCapabilities($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/accounts/%s/capabilities', $parentId), $params, $opts); + } + + /** + * List external accounts for an account. + * + * @param string $parentId + * @param null|array{ending_before?: string, expand?: string[], limit?: int, object?: string, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\BankAccount|\Stripe\Card> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allExternalAccounts($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/accounts/%s/external_accounts', $parentId), $params, $opts); + } + + /** + * Returns a list of people associated with the account’s legal entity. The people + * are returned sorted by creation date, with the most recent people appearing + * first. + * + * @param string $parentId + * @param null|array{ending_before?: string, expand?: string[], limit?: int, relationship?: array{authorizer?: bool, director?: bool, executive?: bool, legal_guardian?: bool, owner?: bool, representative?: bool}, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Person> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allPersons($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/accounts/%s/persons', $parentId), $params, $opts); + } + + /** + * With Connect, you can create Stripe accounts for + * your users. To do this, you’ll first need to register your + * platform. + * + * If you’ve already collected information for your connected accounts, you can prefill that information + * when creating the account. Connect Onboarding won’t ask for the prefilled + * information during account onboarding. You can prefill any information on the + * account. + * + * @param null|array{account_token?: string, business_profile?: array{annual_revenue?: array{amount: int, currency: string, fiscal_year_end: string}, estimated_worker_count?: int, mcc?: string, minority_owned_business_designation?: string[], monthly_estimated_revenue?: array{amount: int, currency: string}, name?: string, product_description?: string, support_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, support_email?: string, support_phone?: string, support_url?: null|string, url?: string}, business_type?: string, capabilities?: array{acss_debit_payments?: array{requested?: bool}, affirm_payments?: array{requested?: bool}, afterpay_clearpay_payments?: array{requested?: bool}, alma_payments?: array{requested?: bool}, amazon_pay_payments?: array{requested?: bool}, au_becs_debit_payments?: array{requested?: bool}, bacs_debit_payments?: array{requested?: bool}, bancontact_payments?: array{requested?: bool}, bank_transfer_payments?: array{requested?: bool}, billie_payments?: array{requested?: bool}, blik_payments?: array{requested?: bool}, boleto_payments?: array{requested?: bool}, card_issuing?: array{requested?: bool}, card_payments?: array{requested?: bool}, cartes_bancaires_payments?: array{requested?: bool}, cashapp_payments?: array{requested?: bool}, crypto_payments?: array{requested?: bool}, eps_payments?: array{requested?: bool}, fpx_payments?: array{requested?: bool}, gb_bank_transfer_payments?: array{requested?: bool}, giropay_payments?: array{requested?: bool}, grabpay_payments?: array{requested?: bool}, ideal_payments?: array{requested?: bool}, india_international_payments?: array{requested?: bool}, jcb_payments?: array{requested?: bool}, jp_bank_transfer_payments?: array{requested?: bool}, kakao_pay_payments?: array{requested?: bool}, klarna_payments?: array{requested?: bool}, konbini_payments?: array{requested?: bool}, kr_card_payments?: array{requested?: bool}, legacy_payments?: array{requested?: bool}, link_payments?: array{requested?: bool}, mb_way_payments?: array{requested?: bool}, mobilepay_payments?: array{requested?: bool}, multibanco_payments?: array{requested?: bool}, mx_bank_transfer_payments?: array{requested?: bool}, naver_pay_payments?: array{requested?: bool}, nz_bank_account_becs_debit_payments?: array{requested?: bool}, oxxo_payments?: array{requested?: bool}, p24_payments?: array{requested?: bool}, pay_by_bank_payments?: array{requested?: bool}, payco_payments?: array{requested?: bool}, paynow_payments?: array{requested?: bool}, payto_payments?: array{requested?: bool}, pix_payments?: array{requested?: bool}, promptpay_payments?: array{requested?: bool}, revolut_pay_payments?: array{requested?: bool}, samsung_pay_payments?: array{requested?: bool}, satispay_payments?: array{requested?: bool}, sepa_bank_transfer_payments?: array{requested?: bool}, sepa_debit_payments?: array{requested?: bool}, sofort_payments?: array{requested?: bool}, swish_payments?: array{requested?: bool}, tax_reporting_us_1099_k?: array{requested?: bool}, tax_reporting_us_1099_misc?: array{requested?: bool}, transfers?: array{requested?: bool}, treasury?: array{requested?: bool}, twint_payments?: array{requested?: bool}, us_bank_account_ach_payments?: array{requested?: bool}, us_bank_transfer_payments?: array{requested?: bool}, zip_payments?: array{requested?: bool}}, company?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, directors_provided?: bool, directorship_declaration?: array{date?: int, ip?: string, user_agent?: string}, executives_provided?: bool, export_license_id?: string, export_purpose_code?: string, name?: string, name_kana?: string, name_kanji?: string, owners_provided?: bool, ownership_declaration?: array{date?: int, ip?: string, user_agent?: string}, ownership_exemption_reason?: null|string, phone?: string, registration_date?: null|array{day: int, month: int, year: int}, registration_number?: string, representative_declaration?: array{date?: int, ip?: string, user_agent?: string}, structure?: null|string, tax_id?: string, tax_id_registrar?: string, vat_id?: string, verification?: array{document?: array{back?: string, front?: string}}}, controller?: array{fees?: array{payer?: string}, losses?: array{payments?: string}, requirement_collection?: string, stripe_dashboard?: array{type?: string}}, country?: string, default_currency?: string, documents?: array{bank_account_ownership_verification?: array{files?: string[]}, company_license?: array{files?: string[]}, company_memorandum_of_association?: array{files?: string[]}, company_ministerial_decree?: array{files?: string[]}, company_registration_verification?: array{files?: string[]}, company_tax_id_verification?: array{files?: string[]}, proof_of_address?: array{files?: string[]}, proof_of_registration?: array{files?: string[], signer?: array{person?: string}}, proof_of_ultimate_beneficial_ownership?: array{files?: string[], signer?: array{person?: string}}}, email?: string, expand?: string[], external_account?: array|string, groups?: array{payments_pricing?: null|string}, individual?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, dob?: null|array{day: int, month: int, year: int}, email?: string, first_name?: string, first_name_kana?: string, first_name_kanji?: string, full_name_aliases?: null|string[], gender?: string, id_number?: string, id_number_secondary?: string, last_name?: string, last_name_kana?: string, last_name_kanji?: string, maiden_name?: string, metadata?: null|array, phone?: string, political_exposure?: string, registered_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: null|float, title?: string}, ssn_last_4?: string, verification?: array{additional_document?: array{back?: string, front?: string}, document?: array{back?: string, front?: string}}}, metadata?: null|array, settings?: array{bacs_debit_payments?: array{display_name?: string}, branding?: array{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}, card_issuing?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, card_payments?: array{decline_on?: array{avs_failure?: bool, cvc_failure?: bool}, statement_descriptor_prefix?: string, statement_descriptor_prefix_kana?: null|string, statement_descriptor_prefix_kanji?: null|string}, invoices?: array{hosted_payment_method_save?: string}, payments?: array{statement_descriptor?: string, statement_descriptor_kana?: string, statement_descriptor_kanji?: string}, payouts?: array{debit_negative_balances?: bool, schedule?: array{delay_days?: array|int|string, interval?: string, monthly_anchor?: int, monthly_payout_days?: int[], weekly_anchor?: string, weekly_payout_days?: string[]}, statement_descriptor?: string}, treasury?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}}, tos_acceptance?: array{date?: int, ip?: string, service_agreement?: string, user_agent?: string}, type?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/accounts', $params, $opts); + } + + /** + * Create an external account for a given account. + * + * @param string $parentId + * @param null|array{default_for_currency?: bool, expand?: string[], external_account: array|string, metadata?: array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\BankAccount|\Stripe\Card + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function createExternalAccount($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/accounts/%s/external_accounts', $parentId), $params, $opts); + } + + /** + * Creates a login link for a connected account to access the Express Dashboard. + * + * You can only create login links for accounts that use the Express Dashboard and are connected to + * your platform. + * + * @param string $parentId + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\LoginLink + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function createLoginLink($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/accounts/%s/login_links', $parentId), $params, $opts); + } + + /** + * Creates a new person. + * + * @param string $parentId + * @param null|array{additional_tos_acceptances?: array{account?: array{date?: int, ip?: string, user_agent?: null|string}}, address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, dob?: null|array{day: int, month: int, year: int}, documents?: array{company_authorization?: array{files?: string[]}, passport?: array{files?: string[]}, visa?: array{files?: string[]}}, email?: string, expand?: string[], first_name?: string, first_name_kana?: string, first_name_kanji?: string, full_name_aliases?: null|string[], gender?: string, id_number?: string, id_number_secondary?: string, last_name?: string, last_name_kana?: string, last_name_kanji?: string, maiden_name?: string, metadata?: null|array, nationality?: string, person_token?: string, phone?: string, political_exposure?: string, registered_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, relationship?: array{authorizer?: bool, director?: bool, executive?: bool, legal_guardian?: bool, owner?: bool, percent_ownership?: null|float, representative?: bool, title?: string}, ssn_last_4?: string, us_cfpb_data?: array{ethnicity_details?: array{ethnicity?: string[], ethnicity_other?: string}, race_details?: array{race?: string[], race_other?: string}, self_identified_gender?: string}, verification?: array{additional_document?: array{back?: string, front?: string}, document?: array{back?: string, front?: string}}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Person + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function createPerson($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/accounts/%s/persons', $parentId), $params, $opts); + } + + /** + * With Connect, you can delete accounts you manage. + * + * Test-mode accounts can be deleted at any time. + * + * Live-mode accounts that have access to the standard dashboard and Stripe is + * responsible for negative account balances cannot be deleted, which includes + * Standard accounts. All other Live-mode accounts, can be deleted when all balances are zero. + * + * If you want to delete your own account, use the account information tab in + * your account settings instead. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/accounts/%s', $id), $params, $opts); + } + + /** + * Delete a specified external account for a given account. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\BankAccount|\Stripe\Card + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function deleteExternalAccount($parentId, $id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/accounts/%s/external_accounts/%s', $parentId, $id), $params, $opts); + } + + /** + * Deletes an existing person’s relationship to the account’s legal entity. Any + * person with a relationship for an account can be deleted through the API, except + * if the person is the account_opener. If your integration is using + * the executive parameter, you cannot delete the only verified + * executive on file. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Person + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function deletePerson($parentId, $id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/accounts/%s/persons/%s', $parentId, $id), $params, $opts); + } + + /** + * With Connect, you can reject accounts that you have + * flagged as suspicious. + * + * Only accounts where your platform is liable for negative account balances, which + * includes Custom and Express accounts, can be rejected. Test-mode accounts can be + * rejected at any time. Live-mode accounts can only be rejected after all balances + * are zero. + * + * @param string $id + * @param null|array{expand?: string[], reason: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function reject($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/accounts/%s/reject', $id), $params, $opts); + } + + /** + * Retrieves information about the specified Account Capability. + * + * @param string $parentId + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Capability + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieveCapability($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/accounts/%s/capabilities/%s', $parentId, $id), $params, $opts); + } + + /** + * Retrieve a specified external account for a given account. + * + * @param string $parentId + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\BankAccount|\Stripe\Card + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieveExternalAccount($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/accounts/%s/external_accounts/%s', $parentId, $id), $params, $opts); + } + + /** + * Retrieves an existing person. + * + * @param string $parentId + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Person + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrievePerson($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/accounts/%s/persons/%s', $parentId, $id), $params, $opts); + } + + /** + * Updates a connected account by setting the + * values of the parameters passed. Any parameters not provided are left unchanged. + * + * For accounts where controller.requirement_collection + * is application, which includes Custom accounts, you can update any + * information on the account. + * + * For accounts where controller.requirement_collection + * is stripe, which includes Standard and Express accounts, you can + * update all information until you create an Account + * Link or Account Session to start Connect + * onboarding, after which some properties can no longer be updated. + * + * To update your own account, use the Dashboard. Refer to our + * Connect documentation to learn + * more about updating accounts. + * + * @param string $id + * @param null|array{account_token?: string, business_profile?: array{annual_revenue?: array{amount: int, currency: string, fiscal_year_end: string}, estimated_worker_count?: int, mcc?: string, minority_owned_business_designation?: string[], monthly_estimated_revenue?: array{amount: int, currency: string}, name?: string, product_description?: string, support_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, support_email?: string, support_phone?: string, support_url?: null|string, url?: string}, business_type?: string, capabilities?: array{acss_debit_payments?: array{requested?: bool}, affirm_payments?: array{requested?: bool}, afterpay_clearpay_payments?: array{requested?: bool}, alma_payments?: array{requested?: bool}, amazon_pay_payments?: array{requested?: bool}, au_becs_debit_payments?: array{requested?: bool}, bacs_debit_payments?: array{requested?: bool}, bancontact_payments?: array{requested?: bool}, bank_transfer_payments?: array{requested?: bool}, billie_payments?: array{requested?: bool}, blik_payments?: array{requested?: bool}, boleto_payments?: array{requested?: bool}, card_issuing?: array{requested?: bool}, card_payments?: array{requested?: bool}, cartes_bancaires_payments?: array{requested?: bool}, cashapp_payments?: array{requested?: bool}, crypto_payments?: array{requested?: bool}, eps_payments?: array{requested?: bool}, fpx_payments?: array{requested?: bool}, gb_bank_transfer_payments?: array{requested?: bool}, giropay_payments?: array{requested?: bool}, grabpay_payments?: array{requested?: bool}, ideal_payments?: array{requested?: bool}, india_international_payments?: array{requested?: bool}, jcb_payments?: array{requested?: bool}, jp_bank_transfer_payments?: array{requested?: bool}, kakao_pay_payments?: array{requested?: bool}, klarna_payments?: array{requested?: bool}, konbini_payments?: array{requested?: bool}, kr_card_payments?: array{requested?: bool}, legacy_payments?: array{requested?: bool}, link_payments?: array{requested?: bool}, mb_way_payments?: array{requested?: bool}, mobilepay_payments?: array{requested?: bool}, multibanco_payments?: array{requested?: bool}, mx_bank_transfer_payments?: array{requested?: bool}, naver_pay_payments?: array{requested?: bool}, nz_bank_account_becs_debit_payments?: array{requested?: bool}, oxxo_payments?: array{requested?: bool}, p24_payments?: array{requested?: bool}, pay_by_bank_payments?: array{requested?: bool}, payco_payments?: array{requested?: bool}, paynow_payments?: array{requested?: bool}, payto_payments?: array{requested?: bool}, pix_payments?: array{requested?: bool}, promptpay_payments?: array{requested?: bool}, revolut_pay_payments?: array{requested?: bool}, samsung_pay_payments?: array{requested?: bool}, satispay_payments?: array{requested?: bool}, sepa_bank_transfer_payments?: array{requested?: bool}, sepa_debit_payments?: array{requested?: bool}, sofort_payments?: array{requested?: bool}, swish_payments?: array{requested?: bool}, tax_reporting_us_1099_k?: array{requested?: bool}, tax_reporting_us_1099_misc?: array{requested?: bool}, transfers?: array{requested?: bool}, treasury?: array{requested?: bool}, twint_payments?: array{requested?: bool}, us_bank_account_ach_payments?: array{requested?: bool}, us_bank_transfer_payments?: array{requested?: bool}, zip_payments?: array{requested?: bool}}, company?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, directors_provided?: bool, directorship_declaration?: array{date?: int, ip?: string, user_agent?: string}, executives_provided?: bool, export_license_id?: string, export_purpose_code?: string, name?: string, name_kana?: string, name_kanji?: string, owners_provided?: bool, ownership_declaration?: array{date?: int, ip?: string, user_agent?: string}, ownership_exemption_reason?: null|string, phone?: string, registration_date?: null|array{day: int, month: int, year: int}, registration_number?: string, representative_declaration?: array{date?: int, ip?: string, user_agent?: string}, structure?: null|string, tax_id?: string, tax_id_registrar?: string, vat_id?: string, verification?: array{document?: array{back?: string, front?: string}}}, default_currency?: string, documents?: array{bank_account_ownership_verification?: array{files?: string[]}, company_license?: array{files?: string[]}, company_memorandum_of_association?: array{files?: string[]}, company_ministerial_decree?: array{files?: string[]}, company_registration_verification?: array{files?: string[]}, company_tax_id_verification?: array{files?: string[]}, proof_of_address?: array{files?: string[]}, proof_of_registration?: array{files?: string[], signer?: array{person?: string}}, proof_of_ultimate_beneficial_ownership?: array{files?: string[], signer?: array{person?: string}}}, email?: string, expand?: string[], external_account?: null|array|string, groups?: array{payments_pricing?: null|string}, individual?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, dob?: null|array{day: int, month: int, year: int}, email?: string, first_name?: string, first_name_kana?: string, first_name_kanji?: string, full_name_aliases?: null|string[], gender?: string, id_number?: string, id_number_secondary?: string, last_name?: string, last_name_kana?: string, last_name_kanji?: string, maiden_name?: string, metadata?: null|array, phone?: string, political_exposure?: string, registered_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: null|float, title?: string}, ssn_last_4?: string, verification?: array{additional_document?: array{back?: string, front?: string}, document?: array{back?: string, front?: string}}}, metadata?: null|array, settings?: array{bacs_debit_payments?: array{display_name?: string}, branding?: array{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}, card_issuing?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, card_payments?: array{decline_on?: array{avs_failure?: bool, cvc_failure?: bool}, statement_descriptor_prefix?: string, statement_descriptor_prefix_kana?: null|string, statement_descriptor_prefix_kanji?: null|string}, invoices?: array{default_account_tax_ids?: null|string[], hosted_payment_method_save?: string}, payments?: array{statement_descriptor?: string, statement_descriptor_kana?: string, statement_descriptor_kanji?: string}, payouts?: array{debit_negative_balances?: bool, schedule?: array{delay_days?: array|int|string, interval?: string, monthly_anchor?: int, monthly_payout_days?: int[], weekly_anchor?: string, weekly_payout_days?: string[]}, statement_descriptor?: string}, treasury?: array{tos_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}}, tos_acceptance?: array{date?: int, ip?: string, service_agreement?: string, user_agent?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/accounts/%s', $id), $params, $opts); + } + + /** + * Updates an existing Account Capability. Request or remove a capability by + * updating its requested parameter. + * + * @param string $parentId + * @param string $id + * @param null|array{expand?: string[], requested?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Capability + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function updateCapability($parentId, $id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/accounts/%s/capabilities/%s', $parentId, $id), $params, $opts); + } + + /** + * Updates the metadata, account holder name, account holder type of a bank account + * belonging to a connected account and optionally sets it as the default for its + * currency. Other bank account details are not editable by design. + * + * You can only update bank accounts when account.controller.requirement_collection + * is application, which includes Custom accounts. + * + * You can re-enable a disabled bank account by performing an update call without + * providing any arguments or changes. + * + * @param string $parentId + * @param string $id + * @param null|array{account_holder_name?: string, account_holder_type?: null|string, account_type?: string, address_city?: string, address_country?: string, address_line1?: string, address_line2?: string, address_state?: string, address_zip?: string, default_for_currency?: bool, documents?: array{bank_account_ownership_verification?: array{files?: string[]}}, exp_month?: string, exp_year?: string, expand?: string[], metadata?: null|array, name?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\BankAccount|\Stripe\Card + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function updateExternalAccount($parentId, $id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/accounts/%s/external_accounts/%s', $parentId, $id), $params, $opts); + } + + /** + * Updates an existing person. + * + * @param string $parentId + * @param string $id + * @param null|array{additional_tos_acceptances?: array{account?: array{date?: int, ip?: string, user_agent?: null|string}}, address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, dob?: null|array{day: int, month: int, year: int}, documents?: array{company_authorization?: array{files?: string[]}, passport?: array{files?: string[]}, visa?: array{files?: string[]}}, email?: string, expand?: string[], first_name?: string, first_name_kana?: string, first_name_kanji?: string, full_name_aliases?: null|string[], gender?: string, id_number?: string, id_number_secondary?: string, last_name?: string, last_name_kana?: string, last_name_kanji?: string, maiden_name?: string, metadata?: null|array, nationality?: string, person_token?: string, phone?: string, political_exposure?: string, registered_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, relationship?: array{authorizer?: bool, director?: bool, executive?: bool, legal_guardian?: bool, owner?: bool, percent_ownership?: null|float, representative?: bool, title?: string}, ssn_last_4?: string, us_cfpb_data?: array{ethnicity_details?: array{ethnicity?: string[], ethnicity_other?: string}, race_details?: array{race?: string[], race_other?: string}, self_identified_gender?: string}, verification?: array{additional_document?: array{back?: string, front?: string}, document?: array{back?: string, front?: string}}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Person + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function updatePerson($parentId, $id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/accounts/%s/persons/%s', $parentId, $id), $params, $opts); + } + + /** + * Retrieves the details of an account. + * + * @param null|string $id + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id = null, $params = null, $opts = null) + { + if (null === $id) { + return $this->request('get', '/v1/account', $params, $opts); + } + + return $this->request('get', $this->buildPath('/v1/accounts/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/AccountSessionService.php b/stripe-php/lib/Service/AccountSessionService.php new file mode 100644 index 0000000..f16182d --- /dev/null +++ b/stripe-php/lib/Service/AccountSessionService.php @@ -0,0 +1,29 @@ +request('post', '/v1/account_sessions', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/ApplePayDomainService.php b/stripe-php/lib/Service/ApplePayDomainService.php new file mode 100644 index 0000000..b8ae804 --- /dev/null +++ b/stripe-php/lib/Service/ApplePayDomainService.php @@ -0,0 +1,75 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/apple_pay/domains', $params, $opts); + } + + /** + * Create an apple pay domain. + * + * @param null|array{domain_name: string, expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\ApplePayDomain + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/apple_pay/domains', $params, $opts); + } + + /** + * Delete an apple pay domain. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\ApplePayDomain + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/apple_pay/domains/%s', $id), $params, $opts); + } + + /** + * Retrieve an apple pay domain. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\ApplePayDomain + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/apple_pay/domains/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/ApplicationFeeService.php b/stripe-php/lib/Service/ApplicationFeeService.php new file mode 100644 index 0000000..4b4136d --- /dev/null +++ b/stripe-php/lib/Service/ApplicationFeeService.php @@ -0,0 +1,130 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/application_fees', $params, $opts); + } + + /** + * You can see a list of the refunds belonging to a specific application fee. Note + * that the 10 most recent refunds are always available by default on the + * application fee object. If you need more than those 10, you can use this API + * method and the limit and starting_after parameters to + * page through additional refunds. + * + * @param string $parentId + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\ApplicationFeeRefund> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allRefunds($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/application_fees/%s/refunds', $parentId), $params, $opts); + } + + /** + * Refunds an application fee that has previously been collected but not yet + * refunded. Funds will be refunded to the Stripe account from which the fee was + * originally collected. + * + * You can optionally refund only part of an application fee. You can do so + * multiple times, until the entire fee has been refunded. + * + * Once entirely refunded, an application fee can’t be refunded again. This method + * will raise an error when called on an already-refunded application fee, or when + * trying to refund more money than is left on an application fee. + * + * @param string $parentId + * @param null|array{amount?: int, expand?: string[], metadata?: array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\ApplicationFeeRefund + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function createRefund($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/application_fees/%s/refunds', $parentId), $params, $opts); + } + + /** + * Retrieves the details of an application fee that your account has collected. The + * same information is returned when refunding the application fee. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\ApplicationFee + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/application_fees/%s', $id), $params, $opts); + } + + /** + * By default, you can see the 10 most recent refunds stored directly on the + * application fee object, but you can also retrieve details about a specific + * refund stored on the application fee. + * + * @param string $parentId + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\ApplicationFeeRefund + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieveRefund($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/application_fees/%s/refunds/%s', $parentId, $id), $params, $opts); + } + + /** + * Updates the specified application fee refund by setting the values of the + * parameters passed. Any parameters not provided will be left unchanged. + * + * This request only accepts metadata as an argument. + * + * @param string $parentId + * @param string $id + * @param null|array{expand?: string[], metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\ApplicationFeeRefund + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function updateRefund($parentId, $id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/application_fees/%s/refunds/%s', $parentId, $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Apps/AppsServiceFactory.php b/stripe-php/lib/Service/Apps/AppsServiceFactory.php new file mode 100644 index 0000000..39f3734 --- /dev/null +++ b/stripe-php/lib/Service/Apps/AppsServiceFactory.php @@ -0,0 +1,25 @@ + + */ + private static $classMap = [ + 'secrets' => SecretService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/Apps/SecretService.php b/stripe-php/lib/Service/Apps/SecretService.php new file mode 100644 index 0000000..51fbd99 --- /dev/null +++ b/stripe-php/lib/Service/Apps/SecretService.php @@ -0,0 +1,73 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/apps/secrets', $params, $opts); + } + + /** + * Create or replace a secret in the secret store. + * + * @param null|array{expand?: string[], expires_at?: int, name: string, payload: string, scope: array{type: string, user?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Apps\Secret + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/apps/secrets', $params, $opts); + } + + /** + * Deletes a secret from the secret store by name and scope. + * + * @param null|array{expand?: string[], name: string, scope: array{type: string, user?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Apps\Secret + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function deleteWhere($params = null, $opts = null) + { + return $this->request('post', '/v1/apps/secrets/delete', $params, $opts); + } + + /** + * Finds a secret in the secret store by name and scope. + * + * @param null|array{expand?: string[], name: string, scope: array{type: string, user?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Apps\Secret + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function find($params = null, $opts = null) + { + return $this->request('get', '/v1/apps/secrets/find', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/BalanceService.php b/stripe-php/lib/Service/BalanceService.php new file mode 100644 index 0000000..7ba94c3 --- /dev/null +++ b/stripe-php/lib/Service/BalanceService.php @@ -0,0 +1,31 @@ +Accounting + * for negative balances. + * + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Balance + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($params = null, $opts = null) + { + return $this->request('get', '/v1/balance', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/BalanceSettingsService.php b/stripe-php/lib/Service/BalanceSettingsService.php new file mode 100644 index 0000000..2908492 --- /dev/null +++ b/stripe-php/lib/Service/BalanceSettingsService.php @@ -0,0 +1,45 @@ +Making API calls for connected accounts. + * + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\BalanceSettings + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($params = null, $opts = null) + { + return $this->request('get', '/v1/balance_settings', $params, $opts); + } + + /** + * Updates balance settings for a given connected account. Related guide: Making API calls for connected accounts. + * + * @param null|array{expand?: string[], payments?: array{debit_negative_balances?: bool, payouts?: array{minimum_balance_by_currency?: null|array, schedule?: array{interval?: string, monthly_payout_days?: int[], weekly_payout_days?: string[]}, statement_descriptor?: string}, settlement_timing?: array{delay_days_override?: null|int}}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\BalanceSettings + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($params = null, $opts = null) + { + return $this->request('post', '/v1/balance_settings', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/BalanceTransactionService.php b/stripe-php/lib/Service/BalanceTransactionService.php new file mode 100644 index 0000000..d00ea6c --- /dev/null +++ b/stripe-php/lib/Service/BalanceTransactionService.php @@ -0,0 +1,52 @@ +/v1/balance/history. + * + * @param null|array{created?: array|int, currency?: string, ending_before?: string, expand?: string[], limit?: int, payout?: string, source?: string, starting_after?: string, type?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\BalanceTransaction> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/balance_transactions', $params, $opts); + } + + /** + * Retrieves the balance transaction with the given ID. + * + * Note that this endpoint previously used the path + * /v1/balance/history/:id. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\BalanceTransaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/balance_transactions/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Billing/AlertService.php b/stripe-php/lib/Service/Billing/AlertService.php new file mode 100644 index 0000000..0dc8f90 --- /dev/null +++ b/stripe-php/lib/Service/Billing/AlertService.php @@ -0,0 +1,108 @@ +request('post', $this->buildPath('/v1/billing/alerts/%s/activate', $id), $params, $opts); + } + + /** + * Lists billing active and inactive alerts. + * + * @param null|array{alert_type?: string, ending_before?: string, expand?: string[], limit?: int, meter?: string, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Billing\Alert> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/billing/alerts', $params, $opts); + } + + /** + * Archives this alert, removing it from the list view and APIs. This is + * non-reversible. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Billing\Alert + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function archive($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/billing/alerts/%s/archive', $id), $params, $opts); + } + + /** + * Creates a billing alert. + * + * @param null|array{alert_type: string, expand?: string[], title: string, usage_threshold?: array{filters?: array{customer?: string, type: string}[], gte: int, meter: string, recurrence: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Billing\Alert + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/billing/alerts', $params, $opts); + } + + /** + * Deactivates this alert, preventing it from triggering. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Billing\Alert + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function deactivate($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/billing/alerts/%s/deactivate', $id), $params, $opts); + } + + /** + * Retrieves a billing alert given an ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Billing\Alert + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/billing/alerts/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Billing/BillingServiceFactory.php b/stripe-php/lib/Service/Billing/BillingServiceFactory.php new file mode 100644 index 0000000..eb1b160 --- /dev/null +++ b/stripe-php/lib/Service/Billing/BillingServiceFactory.php @@ -0,0 +1,37 @@ + + */ + private static $classMap = [ + 'alerts' => AlertService::class, + 'creditBalanceSummary' => CreditBalanceSummaryService::class, + 'creditBalanceTransactions' => CreditBalanceTransactionService::class, + 'creditGrants' => CreditGrantService::class, + 'meterEventAdjustments' => MeterEventAdjustmentService::class, + 'meterEvents' => MeterEventService::class, + 'meters' => MeterService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/Billing/CreditBalanceSummaryService.php b/stripe-php/lib/Service/Billing/CreditBalanceSummaryService.php new file mode 100644 index 0000000..02df354 --- /dev/null +++ b/stripe-php/lib/Service/Billing/CreditBalanceSummaryService.php @@ -0,0 +1,28 @@ +request('get', '/v1/billing/credit_balance_summary', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Billing/CreditBalanceTransactionService.php b/stripe-php/lib/Service/Billing/CreditBalanceTransactionService.php new file mode 100644 index 0000000..1c5cc98 --- /dev/null +++ b/stripe-php/lib/Service/Billing/CreditBalanceTransactionService.php @@ -0,0 +1,44 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/billing/credit_balance_transactions', $params, $opts); + } + + /** + * Retrieves a credit balance transaction. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Billing\CreditBalanceTransaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/billing/credit_balance_transactions/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Billing/CreditGrantService.php b/stripe-php/lib/Service/Billing/CreditGrantService.php new file mode 100644 index 0000000..309eded --- /dev/null +++ b/stripe-php/lib/Service/Billing/CreditGrantService.php @@ -0,0 +1,107 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/billing/credit_grants', $params, $opts); + } + + /** + * Creates a credit grant. + * + * @param null|array{amount: array{monetary?: array{currency: string, value: int}, type: string}, applicability_config: array{scope: array{price_type?: string, prices?: array{id: string}[]}}, category?: string, customer?: string, customer_account?: string, effective_at?: int, expand?: string[], expires_at?: int, metadata?: array, name?: string, priority?: int} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Billing\CreditGrant + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/billing/credit_grants', $params, $opts); + } + + /** + * Expires a credit grant. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Billing\CreditGrant + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function expire($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/billing/credit_grants/%s/expire', $id), $params, $opts); + } + + /** + * Retrieves a credit grant. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Billing\CreditGrant + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/billing/credit_grants/%s', $id), $params, $opts); + } + + /** + * Updates a credit grant. + * + * @param string $id + * @param null|array{expand?: string[], expires_at?: null|int, metadata?: array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Billing\CreditGrant + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/billing/credit_grants/%s', $id), $params, $opts); + } + + /** + * Voids a credit grant. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Billing\CreditGrant + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function voidGrant($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/billing/credit_grants/%s/void', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Billing/MeterEventAdjustmentService.php b/stripe-php/lib/Service/Billing/MeterEventAdjustmentService.php new file mode 100644 index 0000000..c05e9e0 --- /dev/null +++ b/stripe-php/lib/Service/Billing/MeterEventAdjustmentService.php @@ -0,0 +1,28 @@ +request('post', '/v1/billing/meter_event_adjustments', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Billing/MeterEventService.php b/stripe-php/lib/Service/Billing/MeterEventService.php new file mode 100644 index 0000000..5b155a7 --- /dev/null +++ b/stripe-php/lib/Service/Billing/MeterEventService.php @@ -0,0 +1,28 @@ +, timestamp?: int} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Billing\MeterEvent + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/billing/meter_events', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Billing/MeterService.php b/stripe-php/lib/Service/Billing/MeterService.php new file mode 100644 index 0000000..11ea4c2 --- /dev/null +++ b/stripe-php/lib/Service/Billing/MeterService.php @@ -0,0 +1,125 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/billing/meters', $params, $opts); + } + + /** + * Retrieve a list of billing meter event summaries. + * + * @param string $parentId + * @param null|array{customer: string, end_time: int, ending_before?: string, expand?: string[], limit?: int, start_time: int, starting_after?: string, value_grouping_window?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Billing\MeterEventSummary> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allEventSummaries($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/billing/meters/%s/event_summaries', $parentId), $params, $opts); + } + + /** + * Creates a billing meter. + * + * @param null|array{customer_mapping?: array{event_payload_key: string, type: string}, default_aggregation: array{formula: string}, display_name: string, event_name: string, event_time_window?: string, expand?: string[], value_settings?: array{event_payload_key: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Billing\Meter + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/billing/meters', $params, $opts); + } + + /** + * When a meter is deactivated, no more meter events will be accepted for this + * meter. You can’t attach a deactivated meter to a price. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Billing\Meter + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function deactivate($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/billing/meters/%s/deactivate', $id), $params, $opts); + } + + /** + * When a meter is reactivated, events for this meter can be accepted and you can + * attach the meter to a price. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Billing\Meter + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function reactivate($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/billing/meters/%s/reactivate', $id), $params, $opts); + } + + /** + * Retrieves a billing meter given an ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Billing\Meter + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/billing/meters/%s', $id), $params, $opts); + } + + /** + * Updates a billing meter. + * + * @param string $id + * @param null|array{display_name?: string, expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Billing\Meter + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/billing/meters/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/BillingPortal/BillingPortalServiceFactory.php b/stripe-php/lib/Service/BillingPortal/BillingPortalServiceFactory.php new file mode 100644 index 0000000..23a4d30 --- /dev/null +++ b/stripe-php/lib/Service/BillingPortal/BillingPortalServiceFactory.php @@ -0,0 +1,27 @@ + + */ + private static $classMap = [ + 'configurations' => ConfigurationService::class, + 'sessions' => SessionService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/BillingPortal/ConfigurationService.php b/stripe-php/lib/Service/BillingPortal/ConfigurationService.php new file mode 100644 index 0000000..ef6018a --- /dev/null +++ b/stripe-php/lib/Service/BillingPortal/ConfigurationService.php @@ -0,0 +1,78 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/billing_portal/configurations', $params, $opts); + } + + /** + * Creates a configuration that describes the functionality and behavior of a + * PortalSession. + * + * @param null|array{business_profile?: array{headline?: null|string, privacy_policy_url?: string, terms_of_service_url?: string}, default_return_url?: null|string, expand?: string[], features: array{customer_update?: array{allowed_updates?: null|string[], enabled: bool}, invoice_history?: array{enabled: bool}, payment_method_update?: array{enabled: bool, payment_method_configuration?: null|string}, subscription_cancel?: array{cancellation_reason?: array{enabled: bool, options: null|string[]}, enabled: bool, mode?: string, proration_behavior?: string}, subscription_update?: array{billing_cycle_anchor?: string, default_allowed_updates?: null|string[], enabled: bool, products?: null|array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, prices: string[], product: string}[], proration_behavior?: string, schedule_at_period_end?: array{conditions?: array{type: string}[]}, trial_update_behavior?: string}}, login_page?: array{enabled: bool}, metadata?: array, name?: null|string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\BillingPortal\Configuration + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/billing_portal/configurations', $params, $opts); + } + + /** + * Retrieves a configuration that describes the functionality of the customer + * portal. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\BillingPortal\Configuration + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/billing_portal/configurations/%s', $id), $params, $opts); + } + + /** + * Updates a configuration that describes the functionality of the customer portal. + * + * @param string $id + * @param null|array{active?: bool, business_profile?: array{headline?: null|string, privacy_policy_url?: null|string, terms_of_service_url?: null|string}, default_return_url?: null|string, expand?: string[], features?: array{customer_update?: array{allowed_updates?: null|string[], enabled?: bool}, invoice_history?: array{enabled: bool}, payment_method_update?: array{enabled: bool, payment_method_configuration?: null|string}, subscription_cancel?: array{cancellation_reason?: array{enabled: bool, options?: null|string[]}, enabled?: bool, mode?: string, proration_behavior?: string}, subscription_update?: array{billing_cycle_anchor?: string, default_allowed_updates?: null|string[], enabled?: bool, products?: null|array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, prices: string[], product: string}[], proration_behavior?: string, schedule_at_period_end?: array{conditions?: null|array{type: string}[]}, trial_update_behavior?: string}}, login_page?: array{enabled: bool}, metadata?: null|array, name?: null|string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\BillingPortal\Configuration + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/billing_portal/configurations/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/BillingPortal/SessionService.php b/stripe-php/lib/Service/BillingPortal/SessionService.php new file mode 100644 index 0000000..b476303 --- /dev/null +++ b/stripe-php/lib/Service/BillingPortal/SessionService.php @@ -0,0 +1,28 @@ +request('post', '/v1/billing_portal/sessions', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/ChargeService.php b/stripe-php/lib/Service/ChargeService.php new file mode 100644 index 0000000..301fd2b --- /dev/null +++ b/stripe-php/lib/Service/ChargeService.php @@ -0,0 +1,127 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/charges', $params, $opts); + } + + /** + * Capture the payment of an existing, uncaptured charge that was created with the + * capture option set to false. + * + * Uncaptured payments expire a set number of days after they are created (7 by default), after which they are + * marked as refunded and capture attempts will fail. + * + * Don’t use this method to capture a PaymentIntent-initiated charge. Use Capture a PaymentIntent. + * + * @param string $id + * @param null|array{amount?: int, application_fee?: int, application_fee_amount?: int, expand?: string[], receipt_email?: string, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int}, transfer_group?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Charge + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function capture($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/charges/%s/capture', $id), $params, $opts); + } + + /** + * This method is no longer recommended—use the Payment Intents API to initiate a new + * payment instead. Confirmation of the PaymentIntent creates the + * Charge object used to request payment. + * + * @param null|array{amount?: int, application_fee?: int, application_fee_amount?: int, capture?: bool, currency?: string, customer?: string, description?: string, destination?: array{account: string, amount?: int}, expand?: string[], metadata?: null|array, on_behalf_of?: string, radar_options?: array{session?: string}, receipt_email?: string, shipping?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, source?: string, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, destination: string}, transfer_group?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Charge + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/charges', $params, $opts); + } + + /** + * Retrieves the details of a charge that has previously been created. Supply the + * unique charge ID that was returned from your previous request, and Stripe will + * return the corresponding charge information. The same information is returned + * when creating or refunding the charge. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Charge + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/charges/%s', $id), $params, $opts); + } + + /** + * Search for charges you’ve previously created using Stripe’s Search Query Language. Don’t use + * search in read-after-write flows where strict consistency is necessary. Under + * normal operating conditions, data is searchable in less than a minute. + * Occasionally, propagation of new or updated data can be up to an hour behind + * during outages. Search functionality is not available to merchants in India. + * + * @param null|array{expand?: string[], limit?: int, page?: string, query: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SearchResult<\Stripe\Charge> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function search($params = null, $opts = null) + { + return $this->requestSearchResult('get', '/v1/charges/search', $params, $opts); + } + + /** + * Updates the specified charge by setting the values of the parameters passed. Any + * parameters not provided will be left unchanged. + * + * @param string $id + * @param null|array{customer?: string, description?: string, expand?: string[], fraud_details?: array{user_report: null|string}, metadata?: null|array, receipt_email?: string, shipping?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, transfer_group?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Charge + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/charges/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Checkout/CheckoutServiceFactory.php b/stripe-php/lib/Service/Checkout/CheckoutServiceFactory.php new file mode 100644 index 0000000..bb26a83 --- /dev/null +++ b/stripe-php/lib/Service/Checkout/CheckoutServiceFactory.php @@ -0,0 +1,25 @@ + + */ + private static $classMap = [ + 'sessions' => SessionService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/Checkout/SessionService.php b/stripe-php/lib/Service/Checkout/SessionService.php new file mode 100644 index 0000000..bde5288 --- /dev/null +++ b/stripe-php/lib/Service/Checkout/SessionService.php @@ -0,0 +1,118 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/checkout/sessions', $params, $opts); + } + + /** + * When retrieving a Checkout Session, there is an includable + * line_items property containing the first handful of those + * items. There is also a URL where you can retrieve the full (paginated) list of + * line items. + * + * @param string $id + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\LineItem> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allLineItems($id, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/checkout/sessions/%s/line_items', $id), $params, $opts); + } + + /** + * Creates a Checkout Session object. + * + * @param null|array{adaptive_pricing?: array{enabled?: bool}, after_expiration?: array{recovery?: array{allow_promotion_codes?: bool, enabled: bool}}, allow_promotion_codes?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_address_collection?: string, branding_settings?: array{background_color?: null|string, border_style?: null|string, button_color?: null|string, display_name?: string, font_family?: null|string, icon?: array{file?: string, type: string, url?: string}, logo?: array{file?: string, type: string, url?: string}}, cancel_url?: string, client_reference_id?: string, consent_collection?: array{payment_method_reuse_agreement?: array{position: string}, promotions?: string, terms_of_service?: string}, currency?: string, custom_fields?: array{dropdown?: array{default_value?: string, options: array{label: string, value: string}[]}, key: string, label: array{custom: string, type: string}, numeric?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, optional?: bool, text?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, type: string}[], custom_text?: array{after_submit?: null|array{message: string}, shipping_address?: null|array{message: string}, submit?: null|array{message: string}, terms_of_service_acceptance?: null|array{message: string}}, customer?: string, customer_account?: string, customer_creation?: string, customer_email?: string, customer_update?: array{address?: string, name?: string, shipping?: string}, discounts?: array{coupon?: string, promotion_code?: string}[], excluded_payment_method_types?: string[], expand?: string[], expires_at?: int, invoice_creation?: array{enabled: bool, invoice_data?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}, metadata?: array, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}}, line_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, dynamic_tax_rates?: string[], metadata?: array, price?: string, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: string[]}[], locale?: string, metadata?: array, mode?: string, name_collection?: array{business?: array{enabled: bool, optional?: bool}, individual?: array{enabled: bool, optional?: bool}}, optional_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price: string, quantity: int}[], origin_context?: string, payment_intent_data?: array{application_fee_amount?: int, capture_method?: string, description?: string, metadata?: array, on_behalf_of?: string, receipt_email?: string, setup_future_usage?: string, shipping?: array{address: array{city?: string, country?: string, line1: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, destination: string}, transfer_group?: string}, payment_method_collection?: string, payment_method_configuration?: string, payment_method_data?: array{allow_redisplay?: string}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: string, target_date?: string, verification_method?: string}, affirm?: array{capture_method?: string, setup_future_usage?: string}, afterpay_clearpay?: array{capture_method?: string, setup_future_usage?: string}, alipay?: array{setup_future_usage?: string}, alma?: array{capture_method?: string}, amazon_pay?: array{capture_method?: string, setup_future_usage?: string}, au_becs_debit?: array{setup_future_usage?: string, target_date?: string}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: string, target_date?: string}, bancontact?: array{setup_future_usage?: string}, billie?: array{capture_method?: string}, boleto?: array{expires_after_days?: int, setup_future_usage?: string}, card?: array{capture_method?: string, installments?: array{enabled?: bool}, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, restrictions?: array{brands_blocked?: string[]}, setup_future_usage?: string, statement_descriptor_suffix_kana?: string, statement_descriptor_suffix_kanji?: string}, cashapp?: array{capture_method?: string, setup_future_usage?: string}, customer_balance?: array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, demo_pay?: array{setup_future_usage?: string}, eps?: array{setup_future_usage?: string}, fpx?: array{setup_future_usage?: string}, giropay?: array{setup_future_usage?: string}, grabpay?: array{setup_future_usage?: string}, ideal?: array{setup_future_usage?: string}, kakao_pay?: array{capture_method?: string, setup_future_usage?: string}, klarna?: array{capture_method?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, konbini?: array{expires_after_days?: int, setup_future_usage?: string}, kr_card?: array{capture_method?: string, setup_future_usage?: string}, link?: array{capture_method?: string, setup_future_usage?: string}, mobilepay?: array{capture_method?: string, setup_future_usage?: string}, multibanco?: array{setup_future_usage?: string}, naver_pay?: array{capture_method?: string, setup_future_usage?: string}, oxxo?: array{expires_after_days?: int, setup_future_usage?: string}, p24?: array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: array{}, payco?: array{capture_method?: string}, paynow?: array{setup_future_usage?: string}, paypal?: array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}, setup_future_usage?: string}, pix?: array{amount_includes_iof?: string, expires_after_seconds?: int, setup_future_usage?: string}, revolut_pay?: array{capture_method?: string, setup_future_usage?: string}, samsung_pay?: array{capture_method?: string}, satispay?: array{capture_method?: string}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: string, target_date?: string}, sofort?: array{setup_future_usage?: string}, swish?: array{reference?: string}, twint?: array{setup_future_usage?: string}, us_bank_account?: array{financial_connections?: array{permissions?: string[], prefetch?: string[]}, setup_future_usage?: string, target_date?: string, verification_method?: string}, wechat_pay?: array{app_id?: string, client: string, setup_future_usage?: string}}, payment_method_types?: string[], permissions?: array{update_shipping_details?: string}, phone_number_collection?: array{enabled: bool}, redirect_on_completion?: string, return_url?: string, saved_payment_method_options?: array{allow_redisplay_filters?: string[], payment_method_remove?: string, payment_method_save?: string}, setup_intent_data?: array{description?: string, metadata?: array, on_behalf_of?: string}, shipping_address_collection?: array{allowed_countries: string[]}, shipping_options?: array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}[], submit_type?: string, subscription_data?: array{application_fee_percent?: float, billing_cycle_anchor?: int, billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, default_tax_rates?: string[], description?: string, invoice_settings?: array{issuer?: array{account?: string, type: string}}, metadata?: array, on_behalf_of?: string, proration_behavior?: string, transfer_data?: array{amount_percent?: float, destination: string}, trial_end?: int, trial_period_days?: int, trial_settings?: array{end_behavior: array{missing_payment_method: string}}}, success_url?: string, tax_id_collection?: array{enabled: bool, required?: string}, ui_mode?: string, wallet_options?: array{link?: array{display?: string}}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Checkout\Session + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/checkout/sessions', $params, $opts); + } + + /** + * A Checkout Session can be expired when it is in one of these statuses: + * open + * + * After it expires, a customer can’t complete a Checkout Session and customers + * loading the Checkout Session see a message saying the Checkout Session is + * expired. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Checkout\Session + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function expire($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/checkout/sessions/%s/expire', $id), $params, $opts); + } + + /** + * Retrieves a Checkout Session object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Checkout\Session + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/checkout/sessions/%s', $id), $params, $opts); + } + + /** + * Updates a Checkout Session object. + * + * Related guide: Dynamically update + * Checkout + * + * @param string $id + * @param null|array{collected_information?: array{shipping_details?: array{address: array{city?: string, country: string, line1: string, line2?: string, postal_code?: string, state?: string}, name: string}}, expand?: string[], line_items?: (array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, id?: string, metadata?: null|array, price?: string, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: null|array, shipping_options?: null|array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Checkout\Session + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/checkout/sessions/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Climate/ClimateServiceFactory.php b/stripe-php/lib/Service/Climate/ClimateServiceFactory.php new file mode 100644 index 0000000..ff4422a --- /dev/null +++ b/stripe-php/lib/Service/Climate/ClimateServiceFactory.php @@ -0,0 +1,29 @@ + + */ + private static $classMap = [ + 'orders' => OrderService::class, + 'products' => ProductService::class, + 'suppliers' => SupplierService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/Climate/OrderService.php b/stripe-php/lib/Service/Climate/OrderService.php new file mode 100644 index 0000000..63348da --- /dev/null +++ b/stripe-php/lib/Service/Climate/OrderService.php @@ -0,0 +1,99 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/climate/orders', $params, $opts); + } + + /** + * Cancels a Climate order. You can cancel an order within 24 hours of creation. + * Stripe refunds the reservation amount_subtotal, but not the + * amount_fees for user-triggered cancellations. Frontier might cancel + * reservations if suppliers fail to deliver. If Frontier cancels the reservation, + * Stripe provides 90 days advance notice and refunds the + * amount_total. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Climate\Order + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/climate/orders/%s/cancel', $id), $params, $opts); + } + + /** + * Creates a Climate order object for a given Climate product. The order will be + * processed immediately after creation and payment will be deducted your Stripe + * balance. + * + * @param null|array{amount?: int, beneficiary?: array{public_name: string}, currency?: string, expand?: string[], metadata?: array, metric_tons?: string, product: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Climate\Order + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/climate/orders', $params, $opts); + } + + /** + * Retrieves the details of a Climate order object with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Climate\Order + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/climate/orders/%s', $id), $params, $opts); + } + + /** + * Updates the specified order by setting the values of the parameters passed. + * + * @param string $id + * @param null|array{beneficiary?: null|array{public_name: null|string}, expand?: string[], metadata?: array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Climate\Order + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/climate/orders/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Climate/ProductService.php b/stripe-php/lib/Service/Climate/ProductService.php new file mode 100644 index 0000000..0db9812 --- /dev/null +++ b/stripe-php/lib/Service/Climate/ProductService.php @@ -0,0 +1,44 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/climate/products', $params, $opts); + } + + /** + * Retrieves the details of a Climate product with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Climate\Product + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/climate/products/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Climate/SupplierService.php b/stripe-php/lib/Service/Climate/SupplierService.php new file mode 100644 index 0000000..f03fd1c --- /dev/null +++ b/stripe-php/lib/Service/Climate/SupplierService.php @@ -0,0 +1,44 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/climate/suppliers', $params, $opts); + } + + /** + * Retrieves a Climate supplier object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Climate\Supplier + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/climate/suppliers/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/ConfirmationTokenService.php b/stripe-php/lib/Service/ConfirmationTokenService.php new file mode 100644 index 0000000..86c1d61 --- /dev/null +++ b/stripe-php/lib/Service/ConfirmationTokenService.php @@ -0,0 +1,29 @@ +request('get', $this->buildPath('/v1/confirmation_tokens/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/CoreServiceFactory.php b/stripe-php/lib/Service/CoreServiceFactory.php new file mode 100644 index 0000000..a051aca --- /dev/null +++ b/stripe-php/lib/Service/CoreServiceFactory.php @@ -0,0 +1,173 @@ + + */ + private static $classMap = [ + 'oauth' => OAuthService::class, + // Class Map: The beginning of the section generated from our OpenAPI spec + 'accountLinks' => AccountLinkService::class, + 'accounts' => AccountService::class, + 'accountSessions' => AccountSessionService::class, + 'applePayDomains' => ApplePayDomainService::class, + 'applicationFees' => ApplicationFeeService::class, + 'apps' => Apps\AppsServiceFactory::class, + 'balance' => BalanceService::class, + 'balanceSettings' => BalanceSettingsService::class, + 'balanceTransactions' => BalanceTransactionService::class, + 'billing' => Billing\BillingServiceFactory::class, + 'billingPortal' => BillingPortal\BillingPortalServiceFactory::class, + 'charges' => ChargeService::class, + 'checkout' => Checkout\CheckoutServiceFactory::class, + 'climate' => Climate\ClimateServiceFactory::class, + 'confirmationTokens' => ConfirmationTokenService::class, + 'countrySpecs' => CountrySpecService::class, + 'coupons' => CouponService::class, + 'creditNotes' => CreditNoteService::class, + 'customers' => CustomerService::class, + 'customerSessions' => CustomerSessionService::class, + 'disputes' => DisputeService::class, + 'entitlements' => Entitlements\EntitlementsServiceFactory::class, + 'ephemeralKeys' => EphemeralKeyService::class, + 'events' => EventService::class, + 'exchangeRates' => ExchangeRateService::class, + 'fileLinks' => FileLinkService::class, + 'files' => FileService::class, + 'financialConnections' => FinancialConnections\FinancialConnectionsServiceFactory::class, + 'forwarding' => Forwarding\ForwardingServiceFactory::class, + 'identity' => Identity\IdentityServiceFactory::class, + 'invoiceItems' => InvoiceItemService::class, + 'invoicePayments' => InvoicePaymentService::class, + 'invoiceRenderingTemplates' => InvoiceRenderingTemplateService::class, + 'invoices' => InvoiceService::class, + 'issuing' => Issuing\IssuingServiceFactory::class, + 'mandates' => MandateService::class, + 'paymentAttemptRecords' => PaymentAttemptRecordService::class, + 'paymentIntents' => PaymentIntentService::class, + 'paymentLinks' => PaymentLinkService::class, + 'paymentMethodConfigurations' => PaymentMethodConfigurationService::class, + 'paymentMethodDomains' => PaymentMethodDomainService::class, + 'paymentMethods' => PaymentMethodService::class, + 'paymentRecords' => PaymentRecordService::class, + 'payouts' => PayoutService::class, + 'plans' => PlanService::class, + 'prices' => PriceService::class, + 'products' => ProductService::class, + 'promotionCodes' => PromotionCodeService::class, + 'quotes' => QuoteService::class, + 'radar' => Radar\RadarServiceFactory::class, + 'refunds' => RefundService::class, + 'reporting' => Reporting\ReportingServiceFactory::class, + 'reviews' => ReviewService::class, + 'setupAttempts' => SetupAttemptService::class, + 'setupIntents' => SetupIntentService::class, + 'shippingRates' => ShippingRateService::class, + 'sigma' => Sigma\SigmaServiceFactory::class, + 'sources' => SourceService::class, + 'subscriptionItems' => SubscriptionItemService::class, + 'subscriptions' => SubscriptionService::class, + 'subscriptionSchedules' => SubscriptionScheduleService::class, + 'tax' => Tax\TaxServiceFactory::class, + 'taxCodes' => TaxCodeService::class, + 'taxIds' => TaxIdService::class, + 'taxRates' => TaxRateService::class, + 'terminal' => Terminal\TerminalServiceFactory::class, + 'testHelpers' => TestHelpers\TestHelpersServiceFactory::class, + 'tokens' => TokenService::class, + 'topups' => TopupService::class, + 'transfers' => TransferService::class, + 'treasury' => Treasury\TreasuryServiceFactory::class, + 'v2' => V2\V2ServiceFactory::class, + 'webhookEndpoints' => WebhookEndpointService::class, + // Class Map: The end of the section generated from our OpenAPI spec + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/CountrySpecService.php b/stripe-php/lib/Service/CountrySpecService.php new file mode 100644 index 0000000..a03107e --- /dev/null +++ b/stripe-php/lib/Service/CountrySpecService.php @@ -0,0 +1,44 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/country_specs', $params, $opts); + } + + /** + * Returns a Country Spec for a given Country code. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\CountrySpec + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/country_specs/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/CouponService.php b/stripe-php/lib/Service/CouponService.php new file mode 100644 index 0000000..de1e36b --- /dev/null +++ b/stripe-php/lib/Service/CouponService.php @@ -0,0 +1,109 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/coupons', $params, $opts); + } + + /** + * You can create coupons easily via the coupon management page of the + * Stripe dashboard. Coupon creation is also accessible via the API if you need to + * create coupons on the fly. + * + * A coupon has either a percent_off or an amount_off and + * currency. If you set an amount_off, that amount will + * be subtracted from any invoice’s subtotal. For example, an invoice with a + * subtotal of 100 will have a final total of + * 0 if a coupon with an amount_off of + * 200 is applied to it and an invoice with a subtotal of + * 300 will have a final total of 100 if + * a coupon with an amount_off of 200 is applied to + * it. + * + * @param null|array{amount_off?: int, applies_to?: array{products?: string[]}, currency?: string, currency_options?: array, duration?: string, duration_in_months?: int, expand?: string[], id?: string, max_redemptions?: int, metadata?: null|array, name?: string, percent_off?: float, redeem_by?: int} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Coupon + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/coupons', $params, $opts); + } + + /** + * You can delete coupons via the coupon management page of the + * Stripe dashboard. However, deleting a coupon does not affect any customers who + * have already applied the coupon; it means that new customers can’t redeem the + * coupon. You can also delete coupons via the API. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Coupon + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/coupons/%s', $id), $params, $opts); + } + + /** + * Retrieves the coupon with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Coupon + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/coupons/%s', $id), $params, $opts); + } + + /** + * Updates the metadata of a coupon. Other coupon details (currency, duration, + * amount_off) are, by design, not editable. + * + * @param string $id + * @param null|array{currency_options?: array, expand?: string[], metadata?: null|array, name?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Coupon + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/coupons/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/CreditNoteService.php b/stripe-php/lib/Service/CreditNoteService.php new file mode 100644 index 0000000..b1b7a26 --- /dev/null +++ b/stripe-php/lib/Service/CreditNoteService.php @@ -0,0 +1,162 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/credit_notes', $params, $opts); + } + + /** + * When retrieving a credit note, you’ll get a lines property + * containing the first handful of those items. There is also a URL where you can + * retrieve the full (paginated) list of line items. + * + * @param string $parentId + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\CreditNoteLineItem> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allLines($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/credit_notes/%s/lines', $parentId), $params, $opts); + } + + /** + * Issue a credit note to adjust the amount of a finalized invoice. A credit note + * will first reduce the invoice’s amount_remaining (and + * amount_due), but not below zero. This amount is indicated by the + * credit note’s pre_payment_amount. The excess amount is indicated by + * post_payment_amount, and it can result in any combination of the + * following: + * + *
  • Refunds: create a new refund (using refund_amount) or link + * existing refunds (using refunds).
  • Customer balance credit: + * credit the customer’s balance (using credit_amount) which will be + * automatically applied to their next invoice when it’s finalized.
  • + *
  • Outside of Stripe credit: record the amount that is or will be credited + * outside of Stripe (using out_of_band_amount).
+ * + * The sum of refunds, customer balance credits, and outside of Stripe credits must + * equal the post_payment_amount. + * + * You may issue multiple credit notes for an invoice. Each credit note may + * increment the invoice’s pre_payment_credit_notes_amount, + * post_payment_credit_notes_amount, or both, depending on the + * invoice’s amount_remaining at the time of credit note creation. + * + * @param null|array{amount?: int, credit_amount?: int, effective_at?: int, email_type?: string, expand?: string[], invoice: string, lines?: (array{amount?: int, description?: string, invoice_line_item?: string, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate: string, taxable_amount: int}[], tax_rates?: null|string[], type: string, unit_amount?: int, unit_amount_decimal?: string})[], memo?: string, metadata?: array, out_of_band_amount?: int, reason?: string, refund_amount?: int, refunds?: array{amount_refunded?: int, payment_record_refund?: array{payment_record: string, refund_group: string}, refund?: string, type?: string}[], shipping_cost?: array{shipping_rate?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\CreditNote + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/credit_notes', $params, $opts); + } + + /** + * Get a preview of a credit note without creating it. + * + * @param null|array{amount?: int, credit_amount?: int, effective_at?: int, email_type?: string, expand?: string[], invoice: string, lines?: (array{amount?: int, description?: string, invoice_line_item?: string, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate: string, taxable_amount: int}[], tax_rates?: null|string[], type: string, unit_amount?: int, unit_amount_decimal?: string})[], memo?: string, metadata?: array, out_of_band_amount?: int, reason?: string, refund_amount?: int, refunds?: array{amount_refunded?: int, payment_record_refund?: array{payment_record: string, refund_group: string}, refund?: string, type?: string}[], shipping_cost?: array{shipping_rate?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\CreditNote + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function preview($params = null, $opts = null) + { + return $this->request('get', '/v1/credit_notes/preview', $params, $opts); + } + + /** + * When retrieving a credit note preview, you’ll get a lines + * property containing the first handful of those items. This URL you can retrieve + * the full (paginated) list of line items. + * + * @param null|array{amount?: int, credit_amount?: int, effective_at?: int, email_type?: string, ending_before?: string, expand?: string[], invoice: string, limit?: int, lines?: (array{amount?: int, description?: string, invoice_line_item?: string, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate: string, taxable_amount: int}[], tax_rates?: null|string[], type: string, unit_amount?: int, unit_amount_decimal?: string})[], memo?: string, metadata?: array, out_of_band_amount?: int, reason?: string, refund_amount?: int, refunds?: array{amount_refunded?: int, payment_record_refund?: array{payment_record: string, refund_group: string}, refund?: string, type?: string}[], shipping_cost?: array{shipping_rate?: string}, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\CreditNoteLineItem> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function previewLines($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/credit_notes/preview/lines', $params, $opts); + } + + /** + * Retrieves the credit note object with the given identifier. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\CreditNote + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/credit_notes/%s', $id), $params, $opts); + } + + /** + * Updates an existing credit note. + * + * @param string $id + * @param null|array{expand?: string[], memo?: string, metadata?: array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\CreditNote + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/credit_notes/%s', $id), $params, $opts); + } + + /** + * Marks a credit note as void. Learn more about voiding credit notes. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\CreditNote + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function voidCreditNote($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/credit_notes/%s/void', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/CustomerService.php b/stripe-php/lib/Service/CustomerService.php new file mode 100644 index 0000000..8d7bc59 --- /dev/null +++ b/stripe-php/lib/Service/CustomerService.php @@ -0,0 +1,503 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/customers', $params, $opts); + } + + /** + * Returns a list of transactions that updated the customer’s balances. + * + * @param string $parentId + * @param null|array{created?: array|int, ending_before?: string, expand?: string[], invoice?: string, limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\CustomerBalanceTransaction> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allBalanceTransactions($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/customers/%s/balance_transactions', $parentId), $params, $opts); + } + + /** + * Returns a list of transactions that modified the customer’s cash balance. + * + * @param string $parentId + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\CustomerCashBalanceTransaction> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allCashBalanceTransactions($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/customers/%s/cash_balance_transactions', $parentId), $params, $opts); + } + + /** + * Returns a list of PaymentMethods for a given Customer. + * + * @param string $id + * @param null|array{allow_redisplay?: string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, type?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\PaymentMethod> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allPaymentMethods($id, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/customers/%s/payment_methods', $id), $params, $opts); + } + + /** + * List sources for a specified customer. + * + * @param string $parentId + * @param null|array{ending_before?: string, expand?: string[], limit?: int, object?: string, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allSources($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/customers/%s/sources', $parentId), $params, $opts); + } + + /** + * Returns a list of tax IDs for a customer. + * + * @param string $parentId + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\TaxId> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allTaxIds($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/customers/%s/tax_ids', $parentId), $params, $opts); + } + + /** + * Creates a new customer object. + * + * @param null|array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, balance?: int, business_name?: null|string, cash_balance?: array{settings?: array{reconciliation_mode?: string}}, description?: string, email?: string, expand?: string[], individual_name?: null|string, invoice_prefix?: string, invoice_settings?: array{custom_fields?: null|array{name: string, value: string}[], default_payment_method?: string, footer?: string, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}, metadata?: null|array, name?: string, next_invoice_sequence?: int, payment_method?: string, phone?: string, preferred_locales?: string[], shipping?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: string}, source?: string, tax?: array{ip_address?: null|string, validate_location?: string}, tax_exempt?: null|string, tax_id_data?: array{type: string, value: string}[], test_clock?: string, validate?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Customer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/customers', $params, $opts); + } + + /** + * Creates an immutable transaction that updates the customer’s credit balance. + * + * @param string $parentId + * @param null|array{amount: int, currency: string, description?: string, expand?: string[], metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\CustomerBalanceTransaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function createBalanceTransaction($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/customers/%s/balance_transactions', $parentId), $params, $opts); + } + + /** + * Retrieve funding instructions for a customer cash balance. If funding + * instructions do not yet exist for the customer, new funding instructions will be + * created. If funding instructions have already been created for a given customer, + * the same funding instructions will be retrieved. In other words, we will return + * the same funding instructions each time. + * + * @param string $id + * @param null|array{bank_transfer: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, currency: string, expand?: string[], funding_type: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\FundingInstructions + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function createFundingInstructions($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/customers/%s/funding_instructions', $id), $params, $opts); + } + + /** + * When you create a new credit card, you must specify a customer or recipient on + * which to create it. + * + * If the card’s owner has no default card, then the new card will become the + * default. However, if the owner already has a default, then it will not change. + * To change the default, you should update the + * customer to have a new default_source. + * + * @param string $parentId + * @param null|array{expand?: string[], metadata?: array, source: string, validate?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function createSource($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/customers/%s/sources', $parentId), $params, $opts); + } + + /** + * Creates a new tax_id object for a customer. + * + * @param string $parentId + * @param null|array{expand?: string[], type: string, value: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\TaxId + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function createTaxId($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/customers/%s/tax_ids', $parentId), $params, $opts); + } + + /** + * Permanently deletes a customer. It cannot be undone. Also immediately cancels + * any active subscriptions on the customer. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Customer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/customers/%s', $id), $params, $opts); + } + + /** + * Removes the currently applied discount on a customer. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Discount + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function deleteDiscount($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/customers/%s/discount', $id), $params, $opts); + } + + /** + * Delete a specified source for a given customer. + * + * @param string $parentId + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function deleteSource($parentId, $id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/customers/%s/sources/%s', $parentId, $id), $params, $opts); + } + + /** + * Deletes an existing tax_id object. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\TaxId + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function deleteTaxId($parentId, $id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/customers/%s/tax_ids/%s', $parentId, $id), $params, $opts); + } + + /** + * Retrieves a Customer object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Customer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/customers/%s', $id), $params, $opts); + } + + /** + * Retrieves a specific customer balance transaction that updated the customer’s balances. + * + * @param string $parentId + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\CustomerBalanceTransaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieveBalanceTransaction($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/customers/%s/balance_transactions/%s', $parentId, $id), $params, $opts); + } + + /** + * Retrieves a customer’s cash balance. + * + * @param string $parentId + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\CashBalance + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieveCashBalance($parentId, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/customers/%s/cash_balance', $parentId), $params, $opts); + } + + /** + * Retrieves a specific cash balance transaction, which updated the customer’s cash balance. + * + * @param string $parentId + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\CustomerCashBalanceTransaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieveCashBalanceTransaction($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/customers/%s/cash_balance_transactions/%s', $parentId, $id), $params, $opts); + } + + /** + * Retrieves a PaymentMethod object for a given Customer. + * + * @param string $parentId + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentMethod + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrievePaymentMethod($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/customers/%s/payment_methods/%s', $parentId, $id), $params, $opts); + } + + /** + * Retrieve a specified source for a given customer. + * + * @param string $parentId + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieveSource($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/customers/%s/sources/%s', $parentId, $id), $params, $opts); + } + + /** + * Retrieves the tax_id object with the given identifier. + * + * @param string $parentId + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\TaxId + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieveTaxId($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/customers/%s/tax_ids/%s', $parentId, $id), $params, $opts); + } + + /** + * Search for customers you’ve previously created using Stripe’s Search Query Language. Don’t use + * search in read-after-write flows where strict consistency is necessary. Under + * normal operating conditions, data is searchable in less than a minute. + * Occasionally, propagation of new or updated data can be up to an hour behind + * during outages. Search functionality is not available to merchants in India. + * + * @param null|array{expand?: string[], limit?: int, page?: string, query: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SearchResult<\Stripe\Customer> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function search($params = null, $opts = null) + { + return $this->requestSearchResult('get', '/v1/customers/search', $params, $opts); + } + + /** + * Updates the specified customer by setting the values of the parameters passed. + * Any parameters not provided will be left unchanged. For example, if you pass the + * source parameter, that becomes the customer’s active source + * (e.g., a card) to be used for all charges in the future. When you update a + * customer to a new valid card source by passing the source + * parameter: for each of the customer’s current subscriptions, if the subscription + * bills automatically and is in the past_due state, then the latest + * open invoice for the subscription with automatic collection enabled will be + * retried. This retry will not count as an automatic retry, and will not affect + * the next regularly scheduled payment for the invoice. Changing the + * default_source for a customer will not trigger this behavior. + * + * This request accepts mostly the same arguments as the customer creation call. + * + * @param string $id + * @param null|array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, balance?: int, business_name?: null|string, cash_balance?: array{settings?: array{reconciliation_mode?: string}}, default_source?: string, description?: string, email?: string, expand?: string[], individual_name?: null|string, invoice_prefix?: string, invoice_settings?: array{custom_fields?: null|array{name: string, value: string}[], default_payment_method?: string, footer?: string, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}, metadata?: null|array, name?: string, next_invoice_sequence?: int, phone?: string, preferred_locales?: string[], shipping?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: string}, source?: string, tax?: array{ip_address?: null|string, validate_location?: string}, tax_exempt?: null|string, validate?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Customer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/customers/%s', $id), $params, $opts); + } + + /** + * Most credit balance transaction fields are immutable, but you may update its + * description and metadata. + * + * @param string $parentId + * @param string $id + * @param null|array{description?: string, expand?: string[], metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\CustomerBalanceTransaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function updateBalanceTransaction($parentId, $id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/customers/%s/balance_transactions/%s', $parentId, $id), $params, $opts); + } + + /** + * Changes the settings on a customer’s cash balance. + * + * @param string $parentId + * @param null|array{expand?: string[], settings?: array{reconciliation_mode?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\CashBalance + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function updateCashBalance($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/customers/%s/cash_balance', $parentId), $params, $opts); + } + + /** + * Update a specified source for a given customer. + * + * @param string $parentId + * @param string $id + * @param null|array{account_holder_name?: string, account_holder_type?: string, address_city?: string, address_country?: string, address_line1?: string, address_line2?: string, address_state?: string, address_zip?: string, exp_month?: string, exp_year?: string, expand?: string[], metadata?: null|array, name?: string, owner?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: string, name?: string, phone?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function updateSource($parentId, $id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/customers/%s/sources/%s', $parentId, $id), $params, $opts); + } + + /** + * Verify a specified bank account for a given customer. + * + * @param string $parentId + * @param string $id + * @param null|array{amounts?: int[], expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function verifySource($parentId, $id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/customers/%s/sources/%s/verify', $parentId, $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/CustomerSessionService.php b/stripe-php/lib/Service/CustomerSessionService.php new file mode 100644 index 0000000..326f5f1 --- /dev/null +++ b/stripe-php/lib/Service/CustomerSessionService.php @@ -0,0 +1,30 @@ +request('post', '/v1/customer_sessions', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/DisputeService.php b/stripe-php/lib/Service/DisputeService.php new file mode 100644 index 0000000..fadfe45 --- /dev/null +++ b/stripe-php/lib/Service/DisputeService.php @@ -0,0 +1,88 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/disputes', $params, $opts); + } + + /** + * Closing the dispute for a charge indicates that you do not have any evidence to + * submit and are essentially dismissing the dispute, acknowledging it as lost. + * + * The status of the dispute will change from needs_response to + * lost. Closing a dispute is irreversible. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Dispute + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function close($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/disputes/%s/close', $id), $params, $opts); + } + + /** + * Retrieves the dispute with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Dispute + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/disputes/%s', $id), $params, $opts); + } + + /** + * When you get a dispute, contacting your customer is always the best first step. + * If that doesn’t work, you can submit evidence to help us resolve the dispute in + * your favor. You can do this in your dashboard, but if you prefer, + * you can use the API to submit evidence programmatically. + * + * Depending on your dispute type, different evidence fields will give you a better + * chance of winning your dispute. To figure out which evidence fields to provide, + * see our guide to dispute types. + * + * @param string $id + * @param null|array{evidence?: array{access_activity_log?: string, billing_address?: string, cancellation_policy?: string, cancellation_policy_disclosure?: string, cancellation_rebuttal?: string, customer_communication?: string, customer_email_address?: string, customer_name?: string, customer_purchase_ip?: string, customer_signature?: string, duplicate_charge_documentation?: string, duplicate_charge_explanation?: string, duplicate_charge_id?: string, enhanced_evidence?: null|array{visa_compelling_evidence_3?: array{disputed_transaction?: array{customer_account_id?: null|string, customer_device_fingerprint?: null|string, customer_device_id?: null|string, customer_email_address?: null|string, customer_purchase_ip?: null|string, merchandise_or_services?: string, product_description?: null|string, shipping_address?: array{city?: null|string, country?: null|string, line1?: null|string, line2?: null|string, postal_code?: null|string, state?: null|string}}, prior_undisputed_transactions?: (array{charge: string, customer_account_id?: null|string, customer_device_fingerprint?: null|string, customer_device_id?: null|string, customer_email_address?: null|string, customer_purchase_ip?: null|string, product_description?: null|string, shipping_address?: array{city?: null|string, country?: null|string, line1?: null|string, line2?: null|string, postal_code?: null|string, state?: null|string}})[]}, visa_compliance?: array{fee_acknowledged?: bool}}, product_description?: string, receipt?: string, refund_policy?: string, refund_policy_disclosure?: string, refund_refusal_explanation?: string, service_date?: string, service_documentation?: string, shipping_address?: string, shipping_carrier?: string, shipping_date?: string, shipping_documentation?: string, shipping_tracking_number?: string, uncategorized_file?: string, uncategorized_text?: string}, expand?: string[], metadata?: null|array, submit?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Dispute + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/disputes/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Entitlements/ActiveEntitlementService.php b/stripe-php/lib/Service/Entitlements/ActiveEntitlementService.php new file mode 100644 index 0000000..f2c950a --- /dev/null +++ b/stripe-php/lib/Service/Entitlements/ActiveEntitlementService.php @@ -0,0 +1,44 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/entitlements/active_entitlements', $params, $opts); + } + + /** + * Retrieve an active entitlement. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Entitlements\ActiveEntitlement + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/entitlements/active_entitlements/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Entitlements/EntitlementsServiceFactory.php b/stripe-php/lib/Service/Entitlements/EntitlementsServiceFactory.php new file mode 100644 index 0000000..74deb81 --- /dev/null +++ b/stripe-php/lib/Service/Entitlements/EntitlementsServiceFactory.php @@ -0,0 +1,27 @@ + + */ + private static $classMap = [ + 'activeEntitlements' => ActiveEntitlementService::class, + 'features' => FeatureService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/Entitlements/FeatureService.php b/stripe-php/lib/Service/Entitlements/FeatureService.php new file mode 100644 index 0000000..81e38b0 --- /dev/null +++ b/stripe-php/lib/Service/Entitlements/FeatureService.php @@ -0,0 +1,75 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/entitlements/features', $params, $opts); + } + + /** + * Creates a feature. + * + * @param null|array{expand?: string[], lookup_key: string, metadata?: array, name: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Entitlements\Feature + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/entitlements/features', $params, $opts); + } + + /** + * Retrieves a feature. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Entitlements\Feature + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/entitlements/features/%s', $id), $params, $opts); + } + + /** + * Update a feature’s metadata or permanently deactivate it. + * + * @param string $id + * @param null|array{active?: bool, expand?: string[], metadata?: null|array, name?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Entitlements\Feature + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/entitlements/features/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/EphemeralKeyService.php b/stripe-php/lib/Service/EphemeralKeyService.php new file mode 100644 index 0000000..64f2332 --- /dev/null +++ b/stripe-php/lib/Service/EphemeralKeyService.php @@ -0,0 +1,48 @@ +request('delete', $this->buildPath('/v1/ephemeral_keys/%s', $id), $params, $opts); + } + + /** + * Creates a short-lived API key for a given resource. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\EphemeralKey + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + if (!$opts || !isset($opts['stripe_version'])) { + throw new \Stripe\Exception\InvalidArgumentException('stripe_version must be specified to create an ephemeral key'); + } + + return $this->request('post', '/v1/ephemeral_keys', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/EventService.php b/stripe-php/lib/Service/EventService.php new file mode 100644 index 0000000..0b29991 --- /dev/null +++ b/stripe-php/lib/Service/EventService.php @@ -0,0 +1,49 @@ +event object + * api_version attribute (not according to your current Stripe API + * version or Stripe-Version header). + * + * @param null|array{created?: array|int, delivery_success?: bool, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, type?: string, types?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Event> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/events', $params, $opts); + } + + /** + * Retrieves the details of an event if it was created in the last 30 days. Supply + * the unique identifier of the event, which you might have received in a webhook. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Event + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/events/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/ExchangeRateService.php b/stripe-php/lib/Service/ExchangeRateService.php new file mode 100644 index 0000000..1c63d42 --- /dev/null +++ b/stripe-php/lib/Service/ExchangeRateService.php @@ -0,0 +1,60 @@ +ExchangeRate APIs are deprecated. Please use the + * FX + * Quotes API instead. + * + * Returns a list of objects that contain the rates at which foreign currencies are + * converted to one another. Only shows the currencies for which Stripe supports. + * + * @deprecated this method is deprecated, please refer to the description for details + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\ExchangeRate> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/exchange_rates', $params, $opts); + } + + /** + * [Deprecated] The ExchangeRate APIs are deprecated. Please use the + * FX + * Quotes API instead. + * + * Retrieves the exchange rates from the given currency to every supported + * currency. + * + * @deprecated this method is deprecated, please refer to the description for details + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\ExchangeRate + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/exchange_rates/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/FileLinkService.php b/stripe-php/lib/Service/FileLinkService.php new file mode 100644 index 0000000..024d7ee --- /dev/null +++ b/stripe-php/lib/Service/FileLinkService.php @@ -0,0 +1,75 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/file_links', $params, $opts); + } + + /** + * Creates a new file link object. + * + * @param null|array{expand?: string[], expires_at?: int, file: string, metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\FileLink + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/file_links', $params, $opts); + } + + /** + * Retrieves the file link with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\FileLink + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/file_links/%s', $id), $params, $opts); + } + + /** + * Updates an existing file link object. Expired links can no longer be updated. + * + * @param string $id + * @param null|array{expand?: string[], expires_at?: null|array|int|string, metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\FileLink + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/file_links/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/FileService.php b/stripe-php/lib/Service/FileService.php new file mode 100644 index 0000000..54e898a --- /dev/null +++ b/stripe-php/lib/Service/FileService.php @@ -0,0 +1,70 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/files', $params, $opts); + } + + /** + * Retrieves the details of an existing file object. After you supply a unique file + * ID, Stripe returns the corresponding file object. Learn how to access file contents. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\File + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/files/%s', $id), $params, $opts); + } + + /** + * Create a file. + * + * @param null|array $params + * @param null|array|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\File + */ + public function create($params = null, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + if (!isset($opts->apiBase)) { + $opts->apiBase = $this->getClient()->getFilesBase(); + } + + // Manually flatten params, otherwise curl's multipart encoder will + // choke on nested null|arrays. + $flatParams = \array_column(\Stripe\Util\Util::flattenParams($params), 1, 0); + + return $this->request('post', '/v1/files', $flatParams, $opts); + } +} diff --git a/stripe-php/lib/Service/FinancialConnections/AccountService.php b/stripe-php/lib/Service/FinancialConnections/AccountService.php new file mode 100644 index 0000000..7682208 --- /dev/null +++ b/stripe-php/lib/Service/FinancialConnections/AccountService.php @@ -0,0 +1,129 @@ +Account objects. + * + * @param null|array{account_holder?: array{account?: string, customer?: string, customer_account?: string}, ending_before?: string, expand?: string[], limit?: int, session?: string, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\FinancialConnections\Account> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/financial_connections/accounts', $params, $opts); + } + + /** + * Lists all owners for a given Account. + * + * @param string $id + * @param null|array{ending_before?: string, expand?: string[], limit?: int, ownership: string, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\FinancialConnections\AccountOwner> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allOwners($id, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/financial_connections/accounts/%s/owners', $id), $params, $opts); + } + + /** + * Disables your access to a Financial Connections Account. You will + * no longer be able to access data associated with the account (e.g. balances, + * transactions). + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\FinancialConnections\Account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function disconnect($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/financial_connections/accounts/%s/disconnect', $id), $params, $opts); + } + + /** + * Refreshes the data associated with a Financial Connections Account. + * + * @param string $id + * @param null|array{expand?: string[], features: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\FinancialConnections\Account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function refresh($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/financial_connections/accounts/%s/refresh', $id), $params, $opts); + } + + /** + * Retrieves the details of an Financial Connections Account. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\FinancialConnections\Account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/financial_connections/accounts/%s', $id), $params, $opts); + } + + /** + * Subscribes to periodic refreshes of data associated with a Financial Connections + * Account. When the account status is active, data is typically + * refreshed once a day. + * + * @param string $id + * @param null|array{expand?: string[], features: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\FinancialConnections\Account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function subscribe($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/financial_connections/accounts/%s/subscribe', $id), $params, $opts); + } + + /** + * Unsubscribes from periodic refreshes of data associated with a Financial + * Connections Account. + * + * @param string $id + * @param null|array{expand?: string[], features: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\FinancialConnections\Account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function unsubscribe($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/financial_connections/accounts/%s/unsubscribe', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/FinancialConnections/FinancialConnectionsServiceFactory.php b/stripe-php/lib/Service/FinancialConnections/FinancialConnectionsServiceFactory.php new file mode 100644 index 0000000..5c24c32 --- /dev/null +++ b/stripe-php/lib/Service/FinancialConnections/FinancialConnectionsServiceFactory.php @@ -0,0 +1,29 @@ + + */ + private static $classMap = [ + 'accounts' => AccountService::class, + 'sessions' => SessionService::class, + 'transactions' => TransactionService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/FinancialConnections/SessionService.php b/stripe-php/lib/Service/FinancialConnections/SessionService.php new file mode 100644 index 0000000..d5c5f58 --- /dev/null +++ b/stripe-php/lib/Service/FinancialConnections/SessionService.php @@ -0,0 +1,46 @@ +Session. The session’s client_secret can be used to + * launch the flow using Stripe.js. + * + * @param null|array{account_holder: array{account?: string, customer?: string, customer_account?: string, type: string}, expand?: string[], filters?: array{account_subcategories?: string[], countries?: string[]}, permissions: string[], prefetch?: string[], return_url?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\FinancialConnections\Session + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/financial_connections/sessions', $params, $opts); + } + + /** + * Retrieves the details of a Financial Connections Session. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\FinancialConnections\Session + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/financial_connections/sessions/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/FinancialConnections/TransactionService.php b/stripe-php/lib/Service/FinancialConnections/TransactionService.php new file mode 100644 index 0000000..e26d753 --- /dev/null +++ b/stripe-php/lib/Service/FinancialConnections/TransactionService.php @@ -0,0 +1,44 @@ +Transaction objects. + * + * @param null|array{account: string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, transacted_at?: array|int, transaction_refresh?: array{after: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\FinancialConnections\Transaction> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/financial_connections/transactions', $params, $opts); + } + + /** + * Retrieves the details of a Financial Connections Transaction. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\FinancialConnections\Transaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/financial_connections/transactions/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Forwarding/ForwardingServiceFactory.php b/stripe-php/lib/Service/Forwarding/ForwardingServiceFactory.php new file mode 100644 index 0000000..1ae9f88 --- /dev/null +++ b/stripe-php/lib/Service/Forwarding/ForwardingServiceFactory.php @@ -0,0 +1,25 @@ + + */ + private static $classMap = [ + 'requests' => RequestService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/Forwarding/RequestService.php b/stripe-php/lib/Service/Forwarding/RequestService.php new file mode 100644 index 0000000..9710a2a --- /dev/null +++ b/stripe-php/lib/Service/Forwarding/RequestService.php @@ -0,0 +1,59 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/forwarding/requests', $params, $opts); + } + + /** + * Creates a ForwardingRequest object. + * + * @param null|array{expand?: string[], metadata?: array, payment_method: string, replacements: string[], request: array{body?: string, headers?: array{name: string, value: string}[]}, url: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Forwarding\Request + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/forwarding/requests', $params, $opts); + } + + /** + * Retrieves a ForwardingRequest object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Forwarding\Request + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/forwarding/requests/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Identity/IdentityServiceFactory.php b/stripe-php/lib/Service/Identity/IdentityServiceFactory.php new file mode 100644 index 0000000..cf63146 --- /dev/null +++ b/stripe-php/lib/Service/Identity/IdentityServiceFactory.php @@ -0,0 +1,27 @@ + + */ + private static $classMap = [ + 'verificationReports' => VerificationReportService::class, + 'verificationSessions' => VerificationSessionService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/Identity/VerificationReportService.php b/stripe-php/lib/Service/Identity/VerificationReportService.php new file mode 100644 index 0000000..ec83206 --- /dev/null +++ b/stripe-php/lib/Service/Identity/VerificationReportService.php @@ -0,0 +1,44 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/identity/verification_reports', $params, $opts); + } + + /** + * Retrieves an existing VerificationReport. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Identity\VerificationReport + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/identity/verification_reports/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Identity/VerificationSessionService.php b/stripe-php/lib/Service/Identity/VerificationSessionService.php new file mode 100644 index 0000000..51bad89 --- /dev/null +++ b/stripe-php/lib/Service/Identity/VerificationSessionService.php @@ -0,0 +1,151 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/identity/verification_sessions', $params, $opts); + } + + /** + * A VerificationSession object can be canceled when it is in + * requires_input status. + * + * Once canceled, future submission attempts are disabled. This cannot be undone. + * Learn more. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Identity\VerificationSession + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/identity/verification_sessions/%s/cancel', $id), $params, $opts); + } + + /** + * Creates a VerificationSession object. + * + * After the VerificationSession is created, display a verification modal using the + * session client_secret or send your users to the session’s + * url. + * + * If your API key is in test mode, verification checks won’t actually process, + * though everything else will occur as if in live mode. + * + * Related guide: Verify your + * users’ identity documents + * + * @param null|array{client_reference_id?: string, expand?: string[], metadata?: array, options?: array{document?: null|array{allowed_types?: string[], require_id_number?: bool, require_live_capture?: bool, require_matching_selfie?: bool}}, provided_details?: array{email?: string, phone?: string}, related_customer?: string, related_customer_account?: string, related_person?: array{account: string, person: string}, return_url?: string, type?: string, verification_flow?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Identity\VerificationSession + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/identity/verification_sessions', $params, $opts); + } + + /** + * Redact a VerificationSession to remove all collected information from Stripe. + * This will redact the VerificationSession and all objects related to it, + * including VerificationReports, Events, request logs, etc. + * + * A VerificationSession object can be redacted when it is in + * requires_input or verified status. Redacting a + * VerificationSession in requires_action state will automatically + * cancel it. + * + * The redaction process may take up to four days. When the redaction process is in + * progress, the VerificationSession’s redaction.status field will be + * set to processing; when the process is finished, it will change to + * redacted and an identity.verification_session.redacted + * event will be emitted. + * + * Redaction is irreversible. Redacted objects are still accessible in the Stripe + * API, but all the fields that contain personal data will be replaced by the + * string [redacted] or a similar placeholder. The + * metadata field will also be erased. Redacted objects cannot be + * updated or used for any purpose. + * + * Learn more. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Identity\VerificationSession + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function redact($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/identity/verification_sessions/%s/redact', $id), $params, $opts); + } + + /** + * Retrieves the details of a VerificationSession that was previously created. + * + * When the session status is requires_input, you can use this method + * to retrieve a valid client_secret or url to allow + * re-submission. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Identity\VerificationSession + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/identity/verification_sessions/%s', $id), $params, $opts); + } + + /** + * Updates a VerificationSession object. + * + * When the session status is requires_input, you can use this method + * to update the verification check and options. + * + * @param string $id + * @param null|array{expand?: string[], metadata?: array, options?: array{document?: null|array{allowed_types?: string[], require_id_number?: bool, require_live_capture?: bool, require_matching_selfie?: bool}}, provided_details?: array{email?: string, phone?: string}, type?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Identity\VerificationSession + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/identity/verification_sessions/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/InvoiceItemService.php b/stripe-php/lib/Service/InvoiceItemService.php new file mode 100644 index 0000000..07edc94 --- /dev/null +++ b/stripe-php/lib/Service/InvoiceItemService.php @@ -0,0 +1,98 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/invoiceitems', $params, $opts); + } + + /** + * Creates an item to be added to a draft invoice (up to 250 items per invoice). If + * no invoice is specified, the item will be on the next invoice created for the + * customer specified. + * + * @param null|array{amount?: int, currency?: string, customer?: string, customer_account?: string, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice?: string, metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, subscription?: string, tax_behavior?: string, tax_code?: null|string, tax_rates?: string[], unit_amount_decimal?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\InvoiceItem + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/invoiceitems', $params, $opts); + } + + /** + * Deletes an invoice item, removing it from an invoice. Deleting invoice items is + * only possible when they’re not attached to invoices, or if it’s attached to a + * draft invoice. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\InvoiceItem + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/invoiceitems/%s', $id), $params, $opts); + } + + /** + * Retrieves the invoice item with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\InvoiceItem + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/invoiceitems/%s', $id), $params, $opts); + } + + /** + * Updates the amount or description of an invoice item on an upcoming invoice. + * Updating an invoice item is only possible before the invoice it’s attached to is + * closed. + * + * @param string $id + * @param null|array{amount?: int, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, tax_behavior?: string, tax_code?: null|string, tax_rates?: null|string[], unit_amount_decimal?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\InvoiceItem + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoiceitems/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/InvoicePaymentService.php b/stripe-php/lib/Service/InvoicePaymentService.php new file mode 100644 index 0000000..4afda79 --- /dev/null +++ b/stripe-php/lib/Service/InvoicePaymentService.php @@ -0,0 +1,46 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/invoice_payments', $params, $opts); + } + + /** + * Retrieves the invoice payment with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\InvoicePayment + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/invoice_payments/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/InvoiceRenderingTemplateService.php b/stripe-php/lib/Service/InvoiceRenderingTemplateService.php new file mode 100644 index 0000000..feb07d3 --- /dev/null +++ b/stripe-php/lib/Service/InvoiceRenderingTemplateService.php @@ -0,0 +1,83 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/invoice_rendering_templates', $params, $opts); + } + + /** + * Updates the status of an invoice rendering template to ‘archived’ so no new + * Stripe objects (customers, invoices, etc.) can reference it. The template can + * also no longer be updated. However, if the template is already set on a Stripe + * object, it will continue to be applied on invoices generated by it. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\InvoiceRenderingTemplate + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function archive($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoice_rendering_templates/%s/archive', $id), $params, $opts); + } + + /** + * Retrieves an invoice rendering template with the given ID. It by default returns + * the latest version of the template. Optionally, specify a version to see + * previous versions. + * + * @param string $id + * @param null|array{expand?: string[], version?: int} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\InvoiceRenderingTemplate + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/invoice_rendering_templates/%s', $id), $params, $opts); + } + + /** + * Unarchive an invoice rendering template so it can be used on new Stripe objects + * again. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\InvoiceRenderingTemplate + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function unarchive($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoice_rendering_templates/%s/unarchive', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/InvoiceService.php b/stripe-php/lib/Service/InvoiceService.php new file mode 100644 index 0000000..609a20a --- /dev/null +++ b/stripe-php/lib/Service/InvoiceService.php @@ -0,0 +1,390 @@ +, lines: (array{amount?: int, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], invoice_item?: string, metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate_data: array{country?: string, description?: string, display_name: string, inclusive: bool, jurisdiction?: string, jurisdiction_level?: string, percentage: float, state?: string, tax_type?: string}, taxability_reason?: string, taxable_amount: int}[], tax_rates?: null|string[]})[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Invoice + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function addLines($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoices/%s/add_lines', $id), $params, $opts); + } + + /** + * You can list all invoices, or list the invoices for a specific customer. The + * invoices are returned sorted by creation date, with the most recently created + * invoices appearing first. + * + * @param null|array{collection_method?: string, created?: array|int, customer?: string, customer_account?: string, due_date?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, status?: string, subscription?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Invoice> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/invoices', $params, $opts); + } + + /** + * When retrieving an invoice, you’ll get a lines property + * containing the total count of line items and the first handful of those items. + * There is also a URL where you can retrieve the full (paginated) list of line + * items. + * + * @param string $parentId + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\InvoiceLineItem> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allLines($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/invoices/%s/lines', $parentId), $params, $opts); + } + + /** + * Attaches a PaymentIntent or an Out of Band Payment to the invoice, adding it to + * the list of payments. + * + * For the PaymentIntent, when the PaymentIntent’s status changes to + * succeeded, the payment is credited to the invoice, increasing its + * amount_paid. When the invoice is fully paid, the invoice’s status + * becomes paid. + * + * If the PaymentIntent’s status is already succeeded when it’s + * attached, it’s credited to the invoice immediately. + * + * See: Partial payments to learn + * more. + * + * @param string $id + * @param null|array{expand?: string[], payment_intent?: string, payment_record?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Invoice + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function attachPayment($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoices/%s/attach_payment', $id), $params, $opts); + } + + /** + * This endpoint creates a draft invoice for a given customer. The invoice remains + * a draft until you finalize the invoice, which + * allows you to pay or send + * the invoice to your customers. + * + * @param null|array{account_tax_ids?: null|string[], application_fee_amount?: int, auto_advance?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, automatically_finalizes_at?: int, collection_method?: string, currency?: string, custom_fields?: null|array{name: string, value: string}[], customer?: string, customer_account?: string, days_until_due?: int, default_payment_method?: string, default_source?: string, default_tax_rates?: string[], description?: string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], due_date?: int, effective_at?: int, expand?: string[], footer?: string, from_invoice?: array{action: string, invoice: string}, issuer?: array{account?: string, type: string}, metadata?: null|array, number?: string, on_behalf_of?: string, payment_settings?: array{default_mandate?: null|string, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, sepa_debit?: null|array{}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[]}, pending_invoice_items_behavior?: string, rendering?: array{amount_tax_display?: null|string, pdf?: array{page_size?: string}, template?: string, template_version?: null|int}, shipping_cost?: array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}, shipping_details?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: null|string}, statement_descriptor?: string, subscription?: string, transfer_data?: array{amount?: int, destination: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Invoice + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/invoices', $params, $opts); + } + + /** + * At any time, you can preview the upcoming invoice for a subscription or + * subscription schedule. This will show you all the charges that are pending, + * including subscription renewal charges, invoice item charges, etc. It will also + * show you any discounts that are applicable to the invoice. + * + * You can also preview the effects of creating or updating a subscription or + * subscription schedule, including a preview of any prorations that will take + * place. To ensure that the actual proration is calculated exactly the same as the + * previewed proration, you should pass the + * subscription_details.proration_date parameter when doing the actual + * subscription update. + * + * The recommended way to get only the prorations being previewed on the invoice is + * to consider line items where + * parent.subscription_item_details.proration is true. + * + * Note that when you are viewing an upcoming invoice, you are simply viewing a + * preview – the invoice has not yet been created. As such, the upcoming invoice + * will not show up in invoice listing calls, and you cannot use the API to pay or + * edit the invoice. If you want to change the amount that your customer will be + * billed, you can add, remove, or update pending invoice items, or update the + * customer’s discount. + * + * Note: Currency conversion calculations use the latest exchange rates. Exchange + * rates may vary between the time of the preview and the time of the actual + * invoice creation. Learn + * more + * + * @param null|array{automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, currency?: string, customer?: string, customer_account?: string, customer_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, shipping?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: string}, tax?: array{ip_address?: null|string}, tax_exempt?: null|string, tax_ids?: array{type: string, value: string}[]}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice_items?: (array{amount?: int, currency?: string, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], invoiceitem?: string, metadata?: null|array, period?: array{end: int, start: int}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_behavior?: string, tax_code?: null|string, tax_rates?: null|string[], unit_amount?: int, unit_amount_decimal?: string})[], issuer?: array{account?: string, type: string}, on_behalf_of?: null|string, preview_mode?: string, schedule?: string, schedule_details?: array{billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, end_behavior?: string, phases?: (array{add_invoice_items?: (array{discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, currency?: string, default_payment_method?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], duration?: array{interval: string, interval_count?: int}, end_date?: array|int|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, items: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: string, proration_behavior?: string, start_date?: array|int|string, transfer_data?: array{amount_percent?: float, destination: string}, trial?: bool, trial_end?: array|int|string})[], proration_behavior?: string}, subscription?: string, subscription_details?: array{billing_cycle_anchor?: array|int|string, billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, cancel_at?: null|array|int|string, cancel_at_period_end?: bool, cancel_now?: bool, default_tax_rates?: null|string[], items?: (array{billing_thresholds?: null|array{usage_gte: int}, clear_usage?: bool, deleted?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], id?: string, metadata?: null|array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], proration_behavior?: string, proration_date?: int, resume_at?: string, start_date?: int, trial_end?: array|int|string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Invoice + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function createPreview($params = null, $opts = null) + { + return $this->request('post', '/v1/invoices/create_preview', $params, $opts); + } + + /** + * Permanently deletes a one-off invoice draft. This cannot be undone. Attempts to + * delete invoices that are no longer in a draft state will fail; once an invoice + * has been finalized or if an invoice is for a subscription, it must be voided. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Invoice + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/invoices/%s', $id), $params, $opts); + } + + /** + * Stripe automatically finalizes drafts before sending and attempting payment on + * invoices. However, if you’d like to finalize a draft invoice manually, you can + * do so using this method. + * + * @param string $id + * @param null|array{auto_advance?: bool, expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Invoice + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function finalizeInvoice($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoices/%s/finalize', $id), $params, $opts); + } + + /** + * Marking an invoice as uncollectible is useful for keeping track of bad debts + * that can be written off for accounting purposes. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Invoice + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function markUncollectible($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoices/%s/mark_uncollectible', $id), $params, $opts); + } + + /** + * Stripe automatically creates and then attempts to collect payment on invoices + * for customers on subscriptions according to your subscriptions + * settings. However, if you’d like to attempt payment on an invoice out of the + * normal collection schedule or for some other reason, you can do so. + * + * @param string $id + * @param null|array{expand?: string[], forgive?: bool, mandate?: null|string, off_session?: bool, paid_out_of_band?: bool, payment_method?: string, source?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Invoice + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function pay($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoices/%s/pay', $id), $params, $opts); + } + + /** + * Removes multiple line items from an invoice. This is only possible when an + * invoice is still a draft. + * + * @param string $id + * @param null|array{expand?: string[], invoice_metadata?: null|array, lines: array{behavior: string, id: string}[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Invoice + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function removeLines($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoices/%s/remove_lines', $id), $params, $opts); + } + + /** + * Retrieves the invoice with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Invoice + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/invoices/%s', $id), $params, $opts); + } + + /** + * Search for invoices you’ve previously created using Stripe’s Search Query Language. Don’t use + * search in read-after-write flows where strict consistency is necessary. Under + * normal operating conditions, data is searchable in less than a minute. + * Occasionally, propagation of new or updated data can be up to an hour behind + * during outages. Search functionality is not available to merchants in India. + * + * @param null|array{expand?: string[], limit?: int, page?: string, query: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SearchResult<\Stripe\Invoice> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function search($params = null, $opts = null) + { + return $this->requestSearchResult('get', '/v1/invoices/search', $params, $opts); + } + + /** + * Stripe will automatically send invoices to customers according to your subscriptions + * settings. However, if you’d like to manually send an invoice to your + * customer out of the normal schedule, you can do so. When sending invoices that + * have already been paid, there will be no reference to the payment in the email. + * + * Requests made in test-mode result in no emails being sent, despite sending an + * invoice.sent event. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Invoice + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function sendInvoice($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoices/%s/send', $id), $params, $opts); + } + + /** + * Draft invoices are fully editable. Once an invoice is finalized, monetary values, + * as well as collection_method, become uneditable. + * + * If you would like to stop the Stripe Billing engine from automatically + * finalizing, reattempting payments on, sending reminders for, or automatically reconciling + * invoices, pass auto_advance=false. + * + * @param string $id + * @param null|array{account_tax_ids?: null|string[], application_fee_amount?: int, auto_advance?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, automatically_finalizes_at?: int, collection_method?: string, custom_fields?: null|array{name: string, value: string}[], days_until_due?: int, default_payment_method?: string, default_source?: null|string, default_tax_rates?: null|string[], description?: string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], due_date?: int, effective_at?: null|int, expand?: string[], footer?: string, issuer?: array{account?: string, type: string}, metadata?: null|array, number?: null|string, on_behalf_of?: null|string, payment_settings?: array{default_mandate?: null|string, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, sepa_debit?: null|array{}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[]}, rendering?: array{amount_tax_display?: null|string, pdf?: array{page_size?: string}, template?: string, template_version?: null|int}, shipping_cost?: null|array{shipping_rate?: string, shipping_rate_data?: array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string}}, shipping_details?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: null|string}, statement_descriptor?: string, transfer_data?: null|array{amount?: int, destination: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Invoice + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoices/%s', $id), $params, $opts); + } + + /** + * Updates an invoice’s line item. Some fields, such as tax_amounts, + * only live on the invoice line item, so they can only be updated through this + * endpoint. Other fields, such as amount, live on both the invoice + * item and the invoice line item, so updates on this endpoint will propagate to + * the invoice item as well. Updating an invoice’s line item is only possible + * before the invoice is finalized. + * + * @param string $parentId + * @param string $id + * @param null|array{amount?: int, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate_data: array{country?: string, description?: string, display_name: string, inclusive: bool, jurisdiction?: string, jurisdiction_level?: string, percentage: float, state?: string, tax_type?: string}, taxability_reason?: string, taxable_amount: int}[], tax_rates?: null|string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\InvoiceLineItem + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function updateLine($parentId, $id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoices/%s/lines/%s', $parentId, $id), $params, $opts); + } + + /** + * Updates multiple line items on an invoice. This is only possible when an invoice + * is still a draft. + * + * @param string $id + * @param null|array{expand?: string[], invoice_metadata?: null|array, lines: (array{amount?: int, description?: string, discountable?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], id: string, metadata?: null|array, period?: array{end: int, start: int}, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, pricing?: array{price?: string}, quantity?: int, tax_amounts?: null|array{amount: int, tax_rate_data: array{country?: string, description?: string, display_name: string, inclusive: bool, jurisdiction?: string, jurisdiction_level?: string, percentage: float, state?: string, tax_type?: string}, taxability_reason?: string, taxable_amount: int}[], tax_rates?: null|string[]})[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Invoice + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function updateLines($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoices/%s/update_lines', $id), $params, $opts); + } + + /** + * Mark a finalized invoice as void. This cannot be undone. Voiding an invoice is + * similar to deletion, however it only applies to + * finalized invoices and maintains a papertrail where the invoice can still be + * found. + * + * Consult with local regulations to determine whether and how an invoice might be + * amended, canceled, or voided in the jurisdiction you’re doing business in. You + * might need to issue another invoice or credit note instead. Stripe recommends that you + * consult with your legal counsel for advice specific to your business. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Invoice + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function voidInvoice($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/invoices/%s/void', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Issuing/AuthorizationService.php b/stripe-php/lib/Service/Issuing/AuthorizationService.php new file mode 100644 index 0000000..b722138 --- /dev/null +++ b/stripe-php/lib/Service/Issuing/AuthorizationService.php @@ -0,0 +1,110 @@ +Authorization objects. The objects are + * sorted in descending order by creation date, with the most recently created + * object appearing first. + * + * @param null|array{card?: string, cardholder?: string, created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, status?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Issuing\Authorization> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/issuing/authorizations', $params, $opts); + } + + /** + * [Deprecated] Approves a pending Issuing Authorization object. This + * request should be made within the timeout window of the real-time + * authorization flow. This method is deprecated. Instead, respond + * directly to the webhook request to approve an authorization. + * + * @deprecated this method is deprecated, please refer to the description for details + * + * @param string $id + * @param null|array{amount?: int, expand?: string[], metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Authorization + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function approve($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/issuing/authorizations/%s/approve', $id), $params, $opts); + } + + /** + * [Deprecated] Declines a pending Issuing Authorization object. This + * request should be made within the timeout window of the real time + * authorization flow. This method is deprecated. Instead, respond + * directly to the webhook request to decline an authorization. + * + * @deprecated this method is deprecated, please refer to the description for details + * + * @param string $id + * @param null|array{expand?: string[], metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Authorization + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function decline($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/issuing/authorizations/%s/decline', $id), $params, $opts); + } + + /** + * Retrieves an Issuing Authorization object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Authorization + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/issuing/authorizations/%s', $id), $params, $opts); + } + + /** + * Updates the specified Issuing Authorization object by setting the + * values of the parameters passed. Any parameters not provided will be left + * unchanged. + * + * @param string $id + * @param null|array{expand?: string[], metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Authorization + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/issuing/authorizations/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Issuing/CardService.php b/stripe-php/lib/Service/Issuing/CardService.php new file mode 100644 index 0000000..23dfd40 --- /dev/null +++ b/stripe-php/lib/Service/Issuing/CardService.php @@ -0,0 +1,78 @@ +Card objects. The objects are sorted in + * descending order by creation date, with the most recently created object + * appearing first. + * + * @param null|array{cardholder?: string, created?: array|int, ending_before?: string, exp_month?: int, exp_year?: int, expand?: string[], last4?: string, limit?: int, personalization_design?: string, starting_after?: string, status?: string, type?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Issuing\Card> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/issuing/cards', $params, $opts); + } + + /** + * Creates an Issuing Card object. + * + * @param null|array{cardholder?: string, currency: string, exp_month?: int, exp_year?: int, expand?: string[], financial_account?: string, metadata?: array, personalization_design?: string, pin?: array{encrypted_number?: string}, replacement_for?: string, replacement_reason?: string, second_line?: null|string, shipping?: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}, address_validation?: array{mode: string}, customs?: array{eori_number?: string}, name: string, phone_number?: string, require_signature?: bool, service?: string, type?: string}, spending_controls?: array{allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[]}, status?: string, type: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Card + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/issuing/cards', $params, $opts); + } + + /** + * Retrieves an Issuing Card object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Card + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/issuing/cards/%s', $id), $params, $opts); + } + + /** + * Updates the specified Issuing Card object by setting the values of + * the parameters passed. Any parameters not provided will be left unchanged. + * + * @param string $id + * @param null|array{cancellation_reason?: string, expand?: string[], metadata?: null|array, personalization_design?: string, pin?: array{encrypted_number?: string}, shipping?: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}, address_validation?: array{mode: string}, customs?: array{eori_number?: string}, name: string, phone_number?: string, require_signature?: bool, service?: string, type?: string}, spending_controls?: array{allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[]}, status?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Card + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/issuing/cards/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Issuing/CardholderService.php b/stripe-php/lib/Service/Issuing/CardholderService.php new file mode 100644 index 0000000..2b9a0a0 --- /dev/null +++ b/stripe-php/lib/Service/Issuing/CardholderService.php @@ -0,0 +1,79 @@ +Cardholder objects. The objects are + * sorted in descending order by creation date, with the most recently created + * object appearing first. + * + * @param null|array{created?: array|int, email?: string, ending_before?: string, expand?: string[], limit?: int, phone_number?: string, starting_after?: string, status?: string, type?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Issuing\Cardholder> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/issuing/cardholders', $params, $opts); + } + + /** + * Creates a new Issuing Cardholder object that can be issued cards. + * + * @param null|array{billing: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}}, company?: array{tax_id?: string}, email?: string, expand?: string[], individual?: array{card_issuing?: array{user_terms_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, dob?: array{day: int, month: int, year: int}, first_name?: string, last_name?: string, verification?: array{document?: array{back?: string, front?: string}}}, metadata?: array, name: string, phone_number?: string, preferred_locales?: string[], spending_controls?: array{allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[], spending_limits_currency?: string}, status?: string, type?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Cardholder + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/issuing/cardholders', $params, $opts); + } + + /** + * Retrieves an Issuing Cardholder object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Cardholder + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/issuing/cardholders/%s', $id), $params, $opts); + } + + /** + * Updates the specified Issuing Cardholder object by setting the + * values of the parameters passed. Any parameters not provided will be left + * unchanged. + * + * @param string $id + * @param null|array{billing?: array{address: array{city: string, country: string, line1: string, line2?: string, postal_code: string, state?: string}}, company?: array{tax_id?: string}, email?: string, expand?: string[], individual?: array{card_issuing?: array{user_terms_acceptance?: array{date?: int, ip?: string, user_agent?: null|string}}, dob?: array{day: int, month: int, year: int}, first_name?: string, last_name?: string, verification?: array{document?: array{back?: string, front?: string}}}, metadata?: array, phone_number?: string, preferred_locales?: string[], spending_controls?: array{allowed_categories?: string[], allowed_merchant_countries?: string[], blocked_categories?: string[], blocked_merchant_countries?: string[], spending_limits?: array{amount: int, categories?: string[], interval: string}[], spending_limits_currency?: string}, status?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Cardholder + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/issuing/cardholders/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Issuing/DisputeService.php b/stripe-php/lib/Service/Issuing/DisputeService.php new file mode 100644 index 0000000..df6b28f --- /dev/null +++ b/stripe-php/lib/Service/Issuing/DisputeService.php @@ -0,0 +1,104 @@ +Dispute objects. The objects are sorted + * in descending order by creation date, with the most recently created object + * appearing first. + * + * @param null|array{created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, status?: string, transaction?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Issuing\Dispute> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/issuing/disputes', $params, $opts); + } + + /** + * Creates an Issuing Dispute object. Individual pieces of evidence + * within the evidence object are optional at this point. Stripe only + * validates that required evidence is present during submission. Refer to Dispute + * reasons and evidence for more details about evidence requirements. + * + * @param null|array{amount?: int, evidence?: array{canceled?: null|array{additional_documentation?: null|string, canceled_at?: null|int, cancellation_policy_provided?: null|bool, cancellation_reason?: null|string, expected_at?: null|int, explanation?: null|string, product_description?: null|string, product_type?: null|string, return_status?: null|string, returned_at?: null|int}, duplicate?: null|array{additional_documentation?: null|string, card_statement?: null|string, cash_receipt?: null|string, check_image?: null|string, explanation?: null|string, original_transaction?: string}, fraudulent?: null|array{additional_documentation?: null|string, explanation?: null|string}, merchandise_not_as_described?: null|array{additional_documentation?: null|string, explanation?: null|string, received_at?: null|int, return_description?: null|string, return_status?: null|string, returned_at?: null|int}, no_valid_authorization?: null|array{additional_documentation?: null|string, explanation?: null|string}, not_received?: null|array{additional_documentation?: null|string, expected_at?: null|int, explanation?: null|string, product_description?: null|string, product_type?: null|string}, other?: null|array{additional_documentation?: null|string, explanation?: null|string, product_description?: null|string, product_type?: null|string}, reason?: string, service_not_as_described?: null|array{additional_documentation?: null|string, canceled_at?: null|int, cancellation_reason?: null|string, explanation?: null|string, received_at?: null|int}}, expand?: string[], metadata?: array, transaction?: string, treasury?: array{received_debit: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Dispute + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/issuing/disputes', $params, $opts); + } + + /** + * Retrieves an Issuing Dispute object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Dispute + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/issuing/disputes/%s', $id), $params, $opts); + } + + /** + * Submits an Issuing Dispute to the card network. Stripe validates + * that all evidence fields required for the dispute’s reason are present. For more + * details, see Dispute + * reasons and evidence. + * + * @param string $id + * @param null|array{expand?: string[], metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Dispute + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function submit($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/issuing/disputes/%s/submit', $id), $params, $opts); + } + + /** + * Updates the specified Issuing Dispute object by setting the values + * of the parameters passed. Any parameters not provided will be left unchanged. + * Properties on the evidence object can be unset by passing in an + * empty string. + * + * @param string $id + * @param null|array{amount?: int, evidence?: array{canceled?: null|array{additional_documentation?: null|string, canceled_at?: null|int, cancellation_policy_provided?: null|bool, cancellation_reason?: null|string, expected_at?: null|int, explanation?: null|string, product_description?: null|string, product_type?: null|string, return_status?: null|string, returned_at?: null|int}, duplicate?: null|array{additional_documentation?: null|string, card_statement?: null|string, cash_receipt?: null|string, check_image?: null|string, explanation?: null|string, original_transaction?: string}, fraudulent?: null|array{additional_documentation?: null|string, explanation?: null|string}, merchandise_not_as_described?: null|array{additional_documentation?: null|string, explanation?: null|string, received_at?: null|int, return_description?: null|string, return_status?: null|string, returned_at?: null|int}, no_valid_authorization?: null|array{additional_documentation?: null|string, explanation?: null|string}, not_received?: null|array{additional_documentation?: null|string, expected_at?: null|int, explanation?: null|string, product_description?: null|string, product_type?: null|string}, other?: null|array{additional_documentation?: null|string, explanation?: null|string, product_description?: null|string, product_type?: null|string}, reason?: string, service_not_as_described?: null|array{additional_documentation?: null|string, canceled_at?: null|int, cancellation_reason?: null|string, explanation?: null|string, received_at?: null|int}}, expand?: string[], metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Dispute + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/issuing/disputes/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Issuing/IssuingServiceFactory.php b/stripe-php/lib/Service/Issuing/IssuingServiceFactory.php new file mode 100644 index 0000000..852351d --- /dev/null +++ b/stripe-php/lib/Service/Issuing/IssuingServiceFactory.php @@ -0,0 +1,39 @@ + + */ + private static $classMap = [ + 'authorizations' => AuthorizationService::class, + 'cardholders' => CardholderService::class, + 'cards' => CardService::class, + 'disputes' => DisputeService::class, + 'personalizationDesigns' => PersonalizationDesignService::class, + 'physicalBundles' => PhysicalBundleService::class, + 'tokens' => TokenService::class, + 'transactions' => TransactionService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/Issuing/PersonalizationDesignService.php b/stripe-php/lib/Service/Issuing/PersonalizationDesignService.php new file mode 100644 index 0000000..8d4fef1 --- /dev/null +++ b/stripe-php/lib/Service/Issuing/PersonalizationDesignService.php @@ -0,0 +1,77 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/issuing/personalization_designs', $params, $opts); + } + + /** + * Creates a personalization design object. + * + * @param null|array{card_logo?: string, carrier_text?: array{footer_body?: null|string, footer_title?: null|string, header_body?: null|string, header_title?: null|string}, expand?: string[], lookup_key?: string, metadata?: array, name?: string, physical_bundle: string, preferences?: array{is_default: bool}, transfer_lookup_key?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\PersonalizationDesign + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/issuing/personalization_designs', $params, $opts); + } + + /** + * Retrieves a personalization design object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\PersonalizationDesign + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/issuing/personalization_designs/%s', $id), $params, $opts); + } + + /** + * Updates a card personalization object. + * + * @param string $id + * @param null|array{card_logo?: null|string, carrier_text?: null|array{footer_body?: null|string, footer_title?: null|string, header_body?: null|string, header_title?: null|string}, expand?: string[], lookup_key?: null|string, metadata?: array, name?: null|string, physical_bundle?: string, preferences?: array{is_default: bool}, transfer_lookup_key?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\PersonalizationDesign + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/issuing/personalization_designs/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Issuing/PhysicalBundleService.php b/stripe-php/lib/Service/Issuing/PhysicalBundleService.php new file mode 100644 index 0000000..4fc906c --- /dev/null +++ b/stripe-php/lib/Service/Issuing/PhysicalBundleService.php @@ -0,0 +1,45 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/issuing/physical_bundles', $params, $opts); + } + + /** + * Retrieves a physical bundle object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\PhysicalBundle + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/issuing/physical_bundles/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Issuing/TokenService.php b/stripe-php/lib/Service/Issuing/TokenService.php new file mode 100644 index 0000000..42c5aa7 --- /dev/null +++ b/stripe-php/lib/Service/Issuing/TokenService.php @@ -0,0 +1,61 @@ +Token objects for a given card. + * + * @param null|array{card: string, created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, status?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Issuing\Token> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/issuing/tokens', $params, $opts); + } + + /** + * Retrieves an Issuing Token object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Token + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/issuing/tokens/%s', $id), $params, $opts); + } + + /** + * Attempts to update the specified Issuing Token object to the status + * specified. + * + * @param string $id + * @param null|array{expand?: string[], status: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Token + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/issuing/tokens/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Issuing/TransactionService.php b/stripe-php/lib/Service/Issuing/TransactionService.php new file mode 100644 index 0000000..f037c66 --- /dev/null +++ b/stripe-php/lib/Service/Issuing/TransactionService.php @@ -0,0 +1,64 @@ +Transaction objects. The objects are + * sorted in descending order by creation date, with the most recently created + * object appearing first. + * + * @param null|array{card?: string, cardholder?: string, created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, type?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Issuing\Transaction> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/issuing/transactions', $params, $opts); + } + + /** + * Retrieves an Issuing Transaction object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Transaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/issuing/transactions/%s', $id), $params, $opts); + } + + /** + * Updates the specified Issuing Transaction object by setting the + * values of the parameters passed. Any parameters not provided will be left + * unchanged. + * + * @param string $id + * @param null|array{expand?: string[], metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Transaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/issuing/transactions/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/MandateService.php b/stripe-php/lib/Service/MandateService.php new file mode 100644 index 0000000..29f9bb1 --- /dev/null +++ b/stripe-php/lib/Service/MandateService.php @@ -0,0 +1,29 @@ +request('get', $this->buildPath('/v1/mandates/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/OAuthService.php b/stripe-php/lib/Service/OAuthService.php new file mode 100644 index 0000000..7c43b96 --- /dev/null +++ b/stripe-php/lib/Service/OAuthService.php @@ -0,0 +1,150 @@ +_parseOpts($opts); + $opts->apiBase = $this->_getBase($opts); + + return $this->request($method, $path, $params, $opts); + } + + /** + * Generates a URL to Stripe's OAuth form. + * + * @param null|array $params + * @param null|array $opts + * + * @return string the URL to Stripe's OAuth form + */ + public function authorizeUrl($params = null, $opts = null) + { + $params = $params ?: []; + + $opts = $this->_parseOpts($opts); + $base = $this->_getBase($opts); + + $params['client_id'] = $this->_getClientId($params); + if (!\array_key_exists('response_type', $params)) { + $params['response_type'] = 'code'; + } + $query = \Stripe\Util\Util::encodeParameters($params); + + return $base . '/oauth/authorize?' . $query; + } + + /** + * Use an authoriztion code to connect an account to your platform and + * fetch the user's credentials. + * + * @param null|array $params + * @param null|array $opts + * + * @return \Stripe\StripeObject object containing the response from the API + * + * @throws \Stripe\Exception\OAuth\OAuthErrorException if the request fails + */ + public function token($params = null, $opts = null) + { + $params = $params ?: []; + $params['client_secret'] = $this->_getClientSecret($params); + + return $this->requestConnect('post', '/oauth/token', $params, $opts); + } + + /** + * Disconnects an account from your platform. + * + * @param null|array $params + * @param null|array $opts + * + * @return \Stripe\StripeObject object containing the response from the API + * + * @throws \Stripe\Exception\OAuth\OAuthErrorException if the request fails + */ + public function deauthorize($params = null, $opts = null) + { + $params = $params ?: []; + $params['client_id'] = $this->_getClientId($params); + + return $this->requestConnect('post', '/oauth/deauthorize', $params, $opts); + } + + private function _getClientId($params = null) + { + $clientId = ($params && \array_key_exists('client_id', $params)) ? $params['client_id'] : null; + + if (null === $clientId) { + $clientId = $this->client->getClientId(); + } + if (null === $clientId) { + $msg = 'No client_id provided. (HINT: set your client_id using ' + . '`new \Stripe\StripeClient([clientId => + ])`)". You can find your client_ids ' + . 'in your Stripe dashboard at ' + . 'https://dashboard.stripe.com/account/applications/settings, ' + . 'after registering your account as a platform. See ' + . 'https://stripe.com/docs/connect/standard-accounts for details, ' + . 'or email support@stripe.com if you have any questions.'; + + throw new \Stripe\Exception\AuthenticationException($msg); + } + + return $clientId; + } + + private function _getClientSecret($params = null) + { + if (\array_key_exists('client_secret', $params)) { + return $params['client_secret']; + } + + return $this->client->getApiKey(); + } + + /** + * @param array|\Stripe\Util\RequestOptions $opts the special modifiers of the request + * + * @return \Stripe\Util\RequestOptions + * + * @throws \Stripe\Exception\InvalidArgumentException + */ + private function _parseOpts($opts) + { + if (\is_array($opts)) { + if (\array_key_exists('connect_base', $opts)) { + // Throw an exception for the convenience of anybody migrating to + // \Stripe\Service\OAuthService from \Stripe\OAuth, where `connect_base` + // was the name of the parameter that behaves as `api_base` does here. + throw new \Stripe\Exception\InvalidArgumentException('Use `api_base`, not `connect_base`'); + } + } + + return \Stripe\Util\RequestOptions::parse($opts); + } + + /** + * @param \Stripe\Util\RequestOptions $opts + * + * @return string + */ + private function _getBase($opts) + { + return isset($opts->apiBase) + ? $opts->apiBase + : $this->client->getConnectBase(); + } +} diff --git a/stripe-php/lib/Service/PaymentAttemptRecordService.php b/stripe-php/lib/Service/PaymentAttemptRecordService.php new file mode 100644 index 0000000..7583139 --- /dev/null +++ b/stripe-php/lib/Service/PaymentAttemptRecordService.php @@ -0,0 +1,44 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/payment_attempt_records', $params, $opts); + } + + /** + * Retrieves a Payment Attempt Record with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentAttemptRecord + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/payment_attempt_records/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/PaymentIntentService.php b/stripe-php/lib/Service/PaymentIntentService.php new file mode 100644 index 0000000..123d11e --- /dev/null +++ b/stripe-php/lib/Service/PaymentIntentService.php @@ -0,0 +1,306 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/payment_intents', $params, $opts); + } + + /** + * Lists all LineItems of a given PaymentIntent. + * + * @param string $parentId + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\PaymentIntentAmountDetailsLineItem> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allAmountDetailsLineItems($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/payment_intents/%s/amount_details_line_items', $parentId), $params, $opts); + } + + /** + * Manually reconcile the remaining amount for a customer_balance + * PaymentIntent. + * + * @param string $id + * @param null|array{amount?: int, currency?: string, expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentIntent + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function applyCustomerBalance($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_intents/%s/apply_customer_balance', $id), $params, $opts); + } + + /** + * You can cancel a PaymentIntent object when it’s in one of these statuses: + * requires_payment_method, requires_capture, + * requires_confirmation, requires_action or, in rare cases, processing. + * + * After it’s canceled, no additional charges are made by the PaymentIntent and any + * operations on the PaymentIntent fail with an error. For PaymentIntents with a + * status of requires_capture, the remaining + * amount_capturable is automatically refunded. + * + * You can’t cancel the PaymentIntent for a Checkout Session. Expire the Checkout Session + * instead. + * + * @param string $id + * @param null|array{cancellation_reason?: string, expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentIntent + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_intents/%s/cancel', $id), $params, $opts); + } + + /** + * Capture the funds of an existing uncaptured PaymentIntent when its status is + * requires_capture. + * + * Uncaptured PaymentIntents are cancelled a set number of days (7 by default) + * after their creation. + * + * Learn more about separate authorization + * and capture. + * + * @param string $id + * @param null|array{amount_details?: array{discount_amount?: null|int, line_items?: null|array{discount_amount?: int, payment_method_options?: array{card?: array{commodity_code?: string}, card_present?: array{commodity_code?: string}, klarna?: array{image_url?: string, product_url?: string, reference?: string, subscription_reference?: string}, paypal?: array{category?: string, description?: string, sold_by?: string}}, product_code?: string, product_name: string, quantity: int, tax?: array{total_tax_amount: int}, unit_cost: int, unit_of_measure?: string}[], shipping?: null|array{amount?: null|int, from_postal_code?: null|string, to_postal_code?: null|string}, tax?: null|array{total_tax_amount: int}}, amount_to_capture?: int, application_fee_amount?: int, expand?: string[], final_capture?: bool, hooks?: array{inputs?: array{tax?: array{calculation: null|string}}}, metadata?: null|array, payment_details?: null|array{customer_reference?: null|string, order_reference?: null|string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentIntent + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function capture($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_intents/%s/capture', $id), $params, $opts); + } + + /** + * Confirm that your customer intends to pay with current or provided payment + * method. Upon confirmation, the PaymentIntent will attempt to initiate a payment. + * + * If the selected payment method requires additional authentication steps, the + * PaymentIntent will transition to the requires_action status and + * suggest additional actions via next_action. If payment fails, the + * PaymentIntent transitions to the requires_payment_method status or + * the canceled status if the confirmation limit is reached. If + * payment succeeds, the PaymentIntent will transition to the + * succeeded status (or requires_capture, if + * capture_method is set to manual). + * + * If the confirmation_method is automatic, payment may + * be attempted using our client SDKs and + * the PaymentIntent’s client_secret. After + * next_actions are handled by the client, no additional confirmation + * is required to complete the payment. + * + * If the confirmation_method is manual, all payment + * attempts must be initiated using a secret key. + * + * If any actions are required for the payment, the PaymentIntent will return to + * the requires_confirmation state after those actions are completed. + * Your server needs to then explicitly re-confirm the PaymentIntent to initiate + * the next payment attempt. + * + * There is a variable upper limit on how many times a PaymentIntent can be + * confirmed. After this limit is reached, any further calls to this endpoint will + * transition the PaymentIntent to the canceled state. + * + * @param string $id + * @param null|array{amount_details?: null|array{discount_amount?: null|int, line_items?: null|array{discount_amount?: int, payment_method_options?: array{card?: array{commodity_code?: string}, card_present?: array{commodity_code?: string}, klarna?: array{image_url?: string, product_url?: string, reference?: string, subscription_reference?: string}, paypal?: array{category?: string, description?: string, sold_by?: string}}, product_code?: string, product_name: string, quantity: int, tax?: array{total_tax_amount: int}, unit_cost: int, unit_of_measure?: string}[], shipping?: null|array{amount?: null|int, from_postal_code?: null|string, to_postal_code?: null|string}, tax?: null|array{total_tax_amount: int}}, capture_method?: string, confirmation_token?: string, error_on_requires_action?: bool, excluded_payment_method_types?: null|string[], expand?: string[], hooks?: array{inputs?: array{tax?: array{calculation: null|string}}}, mandate?: string, mandate_data?: null|array{customer_acceptance?: array{accepted_at?: int, offline?: array{}, online?: array{ip_address?: string, user_agent?: string}, type: string}}, off_session?: array|bool|string, payment_details?: null|array{customer_reference?: null|string, order_reference?: null|string}, payment_method?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{custom_mandate_url?: null|string, interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, affirm?: null|array{capture_method?: null|string, preferred_locale?: string, setup_future_usage?: string}, afterpay_clearpay?: null|array{capture_method?: null|string, reference?: string, setup_future_usage?: string}, alipay?: null|array{setup_future_usage?: null|string}, alma?: null|array{capture_method?: null|string}, amazon_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, au_becs_debit?: null|array{setup_future_usage?: null|string, target_date?: string}, bacs_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, bancontact?: null|array{preferred_language?: string, setup_future_usage?: null|string}, billie?: null|array{capture_method?: null|string}, blik?: null|array{code?: string, setup_future_usage?: null|string}, boleto?: null|array{expires_after_days?: int, setup_future_usage?: null|string}, card?: null|array{capture_method?: null|string, cvc_token?: string, installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, mandate_options?: array{amount: int, amount_type: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, require_cvc_recollection?: bool, setup_future_usage?: null|string, statement_descriptor_suffix_kana?: null|string, statement_descriptor_suffix_kanji?: null|string, three_d_secure?: array{ares_trans_status?: string, cryptogram: string, electronic_commerce_indicator?: string, exemption_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id: string, version: string}}, card_present?: null|array{capture_method?: string, request_extended_authorization?: bool, request_incremental_authorization_support?: bool, routing?: array{requested_priority?: string}}, cashapp?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, crypto?: null|array{setup_future_usage?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, eps?: null|array{setup_future_usage?: string}, fpx?: null|array{setup_future_usage?: string}, giropay?: null|array{setup_future_usage?: string}, grabpay?: null|array{setup_future_usage?: string}, ideal?: null|array{setup_future_usage?: null|string}, interac_present?: null|array{}, kakao_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, klarna?: null|array{capture_method?: null|string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing?: array{amount: int, date: string}, reference: string}[]}, konbini?: null|array{confirmation_number?: null|string, expires_after_days?: null|int, expires_at?: null|int, product_description?: null|string, setup_future_usage?: string}, kr_card?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, link?: null|array{capture_method?: null|string, persistent_token?: string, setup_future_usage?: null|string}, mb_way?: null|array{setup_future_usage?: string}, mobilepay?: null|array{capture_method?: null|string, setup_future_usage?: string}, multibanco?: null|array{setup_future_usage?: string}, naver_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, nz_bank_account?: null|array{setup_future_usage?: null|string, target_date?: string}, oxxo?: null|array{expires_after_days?: int, setup_future_usage?: string}, p24?: null|array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: null|array{}, payco?: null|array{capture_method?: null|string}, paynow?: null|array{setup_future_usage?: string}, paypal?: null|array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: null|array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string}, setup_future_usage?: null|string}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int, expires_at?: int, setup_future_usage?: string}, promptpay?: null|array{setup_future_usage?: string}, revolut_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, samsung_pay?: null|array{capture_method?: null|string}, satispay?: null|array{capture_method?: null|string}, sepa_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, sofort?: null|array{preferred_language?: null|string, setup_future_usage?: null|string}, swish?: null|array{reference?: null|string, setup_future_usage?: string}, twint?: null|array{setup_future_usage?: string}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, preferred_settlement_speed?: null|string, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, wechat_pay?: null|array{app_id?: string, client?: string, setup_future_usage?: string}, zip?: null|array{setup_future_usage?: string}}, payment_method_types?: string[], radar_options?: array{session?: string}, receipt_email?: null|string, return_url?: string, setup_future_usage?: null|string, shipping?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, use_stripe_sdk?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentIntent + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function confirm($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_intents/%s/confirm', $id), $params, $opts); + } + + /** + * Creates a PaymentIntent object. + * + * After the PaymentIntent is created, attach a payment method and confirm to continue the payment. + * Learn more about the available payment + * flows with the Payment Intents API. + * + * When you use confirm=true during creation, it’s equivalent to + * creating and confirming the PaymentIntent in the same call. You can use any + * parameters available in the confirm + * API when you supply confirm=true. + * + * @param null|array{amount: int, amount_details?: array{discount_amount?: null|int, line_items?: null|array{discount_amount?: int, payment_method_options?: array{card?: array{commodity_code?: string}, card_present?: array{commodity_code?: string}, klarna?: array{image_url?: string, product_url?: string, reference?: string, subscription_reference?: string}, paypal?: array{category?: string, description?: string, sold_by?: string}}, product_code?: string, product_name: string, quantity: int, tax?: array{total_tax_amount: int}, unit_cost: int, unit_of_measure?: string}[], shipping?: null|array{amount?: null|int, from_postal_code?: null|string, to_postal_code?: null|string}, tax?: null|array{total_tax_amount: int}}, application_fee_amount?: int, automatic_payment_methods?: array{allow_redirects?: string, enabled: bool}, capture_method?: string, confirm?: bool, confirmation_method?: string, confirmation_token?: string, currency: string, customer?: string, customer_account?: string, description?: string, error_on_requires_action?: bool, excluded_payment_method_types?: string[], expand?: string[], hooks?: array{inputs?: array{tax?: array{calculation: null|string}}}, mandate?: string, mandate_data?: null|array{customer_acceptance: array{accepted_at?: int, offline?: array{}, online?: array{ip_address: string, user_agent: string}, type: string}}, metadata?: array, off_session?: array|bool|string, on_behalf_of?: string, payment_details?: array{customer_reference?: null|string, order_reference?: null|string}, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{custom_mandate_url?: null|string, interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, affirm?: null|array{capture_method?: null|string, preferred_locale?: string, setup_future_usage?: string}, afterpay_clearpay?: null|array{capture_method?: null|string, reference?: string, setup_future_usage?: string}, alipay?: null|array{setup_future_usage?: null|string}, alma?: null|array{capture_method?: null|string}, amazon_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, au_becs_debit?: null|array{setup_future_usage?: null|string, target_date?: string}, bacs_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, bancontact?: null|array{preferred_language?: string, setup_future_usage?: null|string}, billie?: null|array{capture_method?: null|string}, blik?: null|array{code?: string, setup_future_usage?: null|string}, boleto?: null|array{expires_after_days?: int, setup_future_usage?: null|string}, card?: null|array{capture_method?: null|string, cvc_token?: string, installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, mandate_options?: array{amount: int, amount_type: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, require_cvc_recollection?: bool, setup_future_usage?: null|string, statement_descriptor_suffix_kana?: null|string, statement_descriptor_suffix_kanji?: null|string, three_d_secure?: array{ares_trans_status?: string, cryptogram: string, electronic_commerce_indicator?: string, exemption_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id: string, version: string}}, card_present?: null|array{capture_method?: string, request_extended_authorization?: bool, request_incremental_authorization_support?: bool, routing?: array{requested_priority?: string}}, cashapp?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, crypto?: null|array{setup_future_usage?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, eps?: null|array{setup_future_usage?: string}, fpx?: null|array{setup_future_usage?: string}, giropay?: null|array{setup_future_usage?: string}, grabpay?: null|array{setup_future_usage?: string}, ideal?: null|array{setup_future_usage?: null|string}, interac_present?: null|array{}, kakao_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, klarna?: null|array{capture_method?: null|string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing?: array{amount: int, date: string}, reference: string}[]}, konbini?: null|array{confirmation_number?: null|string, expires_after_days?: null|int, expires_at?: null|int, product_description?: null|string, setup_future_usage?: string}, kr_card?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, link?: null|array{capture_method?: null|string, persistent_token?: string, setup_future_usage?: null|string}, mb_way?: null|array{setup_future_usage?: string}, mobilepay?: null|array{capture_method?: null|string, setup_future_usage?: string}, multibanco?: null|array{setup_future_usage?: string}, naver_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, nz_bank_account?: null|array{setup_future_usage?: null|string, target_date?: string}, oxxo?: null|array{expires_after_days?: int, setup_future_usage?: string}, p24?: null|array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: null|array{}, payco?: null|array{capture_method?: null|string}, paynow?: null|array{setup_future_usage?: string}, paypal?: null|array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: null|array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string}, setup_future_usage?: null|string}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int, expires_at?: int, setup_future_usage?: string}, promptpay?: null|array{setup_future_usage?: string}, revolut_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, samsung_pay?: null|array{capture_method?: null|string}, satispay?: null|array{capture_method?: null|string}, sepa_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, sofort?: null|array{preferred_language?: null|string, setup_future_usage?: null|string}, swish?: null|array{reference?: null|string, setup_future_usage?: string}, twint?: null|array{setup_future_usage?: string}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, preferred_settlement_speed?: null|string, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, wechat_pay?: null|array{app_id?: string, client?: string, setup_future_usage?: string}, zip?: null|array{setup_future_usage?: string}}, payment_method_types?: string[], radar_options?: array{session?: string}, receipt_email?: string, return_url?: string, setup_future_usage?: string, shipping?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int, destination: string}, transfer_group?: string, use_stripe_sdk?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentIntent + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/payment_intents', $params, $opts); + } + + /** + * Perform an incremental authorization on an eligible PaymentIntent. To be eligible, the + * PaymentIntent’s status must be requires_capture and incremental_authorization_supported + * must be true. + * + * Incremental authorizations attempt to increase the authorized amount on your + * customer’s card to the new, higher amount provided. Similar to the + * initial authorization, incremental authorizations can be declined. A single + * PaymentIntent can call this endpoint multiple times to further increase the + * authorized amount. + * + * If the incremental authorization succeeds, the PaymentIntent object returns with + * the updated amount. + * If the incremental authorization fails, a card_declined error returns, and no + * other fields on the PaymentIntent or Charge update. The PaymentIntent object + * remains capturable for the previously authorized amount. + * + * Each PaymentIntent can have a maximum of 10 incremental authorization attempts, + * including declines. After it’s captured, a PaymentIntent can no longer be + * incremented. + * + * Learn more about incremental + * authorizations. + * + * @param string $id + * @param null|array{amount: int, amount_details?: array{discount_amount?: null|int, line_items?: null|array{discount_amount?: int, payment_method_options?: array{card?: array{commodity_code?: string}, card_present?: array{commodity_code?: string}, klarna?: array{image_url?: string, product_url?: string, reference?: string, subscription_reference?: string}, paypal?: array{category?: string, description?: string, sold_by?: string}}, product_code?: string, product_name: string, quantity: int, tax?: array{total_tax_amount: int}, unit_cost: int, unit_of_measure?: string}[], shipping?: null|array{amount?: null|int, from_postal_code?: null|string, to_postal_code?: null|string}, tax?: null|array{total_tax_amount: int}}, application_fee_amount?: int, description?: string, expand?: string[], hooks?: array{inputs?: array{tax?: array{calculation: null|string}}}, metadata?: array, payment_details?: array{customer_reference?: null|string, order_reference?: null|string}, statement_descriptor?: string, transfer_data?: array{amount?: int}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentIntent + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function incrementAuthorization($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_intents/%s/increment_authorization', $id), $params, $opts); + } + + /** + * Retrieves the details of a PaymentIntent that has previously been created. + * + * You can retrieve a PaymentIntent client-side using a publishable key when the + * client_secret is in the query string. + * + * If you retrieve a PaymentIntent with a publishable key, it only returns a subset + * of properties. Refer to the payment intent + * object reference for more details. + * + * @param string $id + * @param null|array{client_secret?: string, expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentIntent + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/payment_intents/%s', $id), $params, $opts); + } + + /** + * Search for PaymentIntents you’ve previously created using Stripe’s Search Query Language. Don’t use + * search in read-after-write flows where strict consistency is necessary. Under + * normal operating conditions, data is searchable in less than a minute. + * Occasionally, propagation of new or updated data can be up to an hour behind + * during outages. Search functionality is not available to merchants in India. + * + * @param null|array{expand?: string[], limit?: int, page?: string, query: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SearchResult<\Stripe\PaymentIntent> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function search($params = null, $opts = null) + { + return $this->requestSearchResult('get', '/v1/payment_intents/search', $params, $opts); + } + + /** + * Updates properties on a PaymentIntent object without confirming. + * + * Depending on which properties you update, you might need to confirm the + * PaymentIntent again. For example, updating the payment_method + * always requires you to confirm the PaymentIntent again. If you prefer to update + * and confirm at the same time, we recommend updating properties through the confirm API instead. + * + * @param string $id + * @param null|array{amount?: int, amount_details?: null|array{discount_amount?: null|int, line_items?: null|array{discount_amount?: int, payment_method_options?: array{card?: array{commodity_code?: string}, card_present?: array{commodity_code?: string}, klarna?: array{image_url?: string, product_url?: string, reference?: string, subscription_reference?: string}, paypal?: array{category?: string, description?: string, sold_by?: string}}, product_code?: string, product_name: string, quantity: int, tax?: array{total_tax_amount: int}, unit_cost: int, unit_of_measure?: string}[], shipping?: null|array{amount?: null|int, from_postal_code?: null|string, to_postal_code?: null|string}, tax?: null|array{total_tax_amount: int}}, application_fee_amount?: null|int, capture_method?: string, currency?: string, customer?: string, customer_account?: string, description?: string, excluded_payment_method_types?: null|string[], expand?: string[], hooks?: array{inputs?: array{tax?: array{calculation: null|string}}}, metadata?: null|array, payment_details?: null|array{customer_reference?: null|string, order_reference?: null|string}, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{custom_mandate_url?: null|string, interval_description?: string, payment_schedule?: string, transaction_type?: string}, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, affirm?: null|array{capture_method?: null|string, preferred_locale?: string, setup_future_usage?: string}, afterpay_clearpay?: null|array{capture_method?: null|string, reference?: string, setup_future_usage?: string}, alipay?: null|array{setup_future_usage?: null|string}, alma?: null|array{capture_method?: null|string}, amazon_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, au_becs_debit?: null|array{setup_future_usage?: null|string, target_date?: string}, bacs_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, bancontact?: null|array{preferred_language?: string, setup_future_usage?: null|string}, billie?: null|array{capture_method?: null|string}, blik?: null|array{code?: string, setup_future_usage?: null|string}, boleto?: null|array{expires_after_days?: int, setup_future_usage?: null|string}, card?: null|array{capture_method?: null|string, cvc_token?: string, installments?: array{enabled?: bool, plan?: null|array{count?: int, interval?: string, type: string}}, mandate_options?: array{amount: int, amount_type: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_extended_authorization?: string, request_incremental_authorization?: string, request_multicapture?: string, request_overcapture?: string, request_three_d_secure?: string, require_cvc_recollection?: bool, setup_future_usage?: null|string, statement_descriptor_suffix_kana?: null|string, statement_descriptor_suffix_kanji?: null|string, three_d_secure?: array{ares_trans_status?: string, cryptogram: string, electronic_commerce_indicator?: string, exemption_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id: string, version: string}}, card_present?: null|array{capture_method?: string, request_extended_authorization?: bool, request_incremental_authorization_support?: bool, routing?: array{requested_priority?: string}}, cashapp?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, crypto?: null|array{setup_future_usage?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, requested_address_types?: string[], type: string}, funding_type?: string, setup_future_usage?: string}, eps?: null|array{setup_future_usage?: string}, fpx?: null|array{setup_future_usage?: string}, giropay?: null|array{setup_future_usage?: string}, grabpay?: null|array{setup_future_usage?: string}, ideal?: null|array{setup_future_usage?: null|string}, interac_present?: null|array{}, kakao_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, klarna?: null|array{capture_method?: null|string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, setup_future_usage?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing?: array{amount: int, date: string}, reference: string}[]}, konbini?: null|array{confirmation_number?: null|string, expires_after_days?: null|int, expires_at?: null|int, product_description?: null|string, setup_future_usage?: string}, kr_card?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, link?: null|array{capture_method?: null|string, persistent_token?: string, setup_future_usage?: null|string}, mb_way?: null|array{setup_future_usage?: string}, mobilepay?: null|array{capture_method?: null|string, setup_future_usage?: string}, multibanco?: null|array{setup_future_usage?: string}, naver_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, nz_bank_account?: null|array{setup_future_usage?: null|string, target_date?: string}, oxxo?: null|array{expires_after_days?: int, setup_future_usage?: string}, p24?: null|array{setup_future_usage?: string, tos_shown_and_accepted?: bool}, pay_by_bank?: null|array{}, payco?: null|array{capture_method?: null|string}, paynow?: null|array{setup_future_usage?: string}, paypal?: null|array{capture_method?: null|string, preferred_locale?: string, reference?: string, risk_correlation_id?: string, setup_future_usage?: null|string}, payto?: null|array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string}, setup_future_usage?: null|string}, pix?: null|array{amount_includes_iof?: string, expires_after_seconds?: int, expires_at?: int, setup_future_usage?: string}, promptpay?: null|array{setup_future_usage?: string}, revolut_pay?: null|array{capture_method?: null|string, setup_future_usage?: null|string}, samsung_pay?: null|array{capture_method?: null|string}, satispay?: null|array{capture_method?: null|string}, sepa_debit?: null|array{mandate_options?: array{reference_prefix?: null|string}, setup_future_usage?: null|string, target_date?: string}, sofort?: null|array{preferred_language?: null|string, setup_future_usage?: null|string}, swish?: null|array{reference?: null|string, setup_future_usage?: string}, twint?: null|array{setup_future_usage?: string}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, preferred_settlement_speed?: null|string, setup_future_usage?: null|string, target_date?: string, verification_method?: string}, wechat_pay?: null|array{app_id?: string, client?: string, setup_future_usage?: string}, zip?: null|array{setup_future_usage?: string}}, payment_method_types?: string[], receipt_email?: null|string, setup_future_usage?: null|string, shipping?: null|array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name: string, phone?: string, tracking_number?: string}, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_data?: array{amount?: int}, transfer_group?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentIntent + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_intents/%s', $id), $params, $opts); + } + + /** + * Verifies microdeposits on a PaymentIntent object. + * + * @param string $id + * @param null|array{amounts?: int[], descriptor_code?: string, expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentIntent + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function verifyMicrodeposits($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_intents/%s/verify_microdeposits', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/PaymentLinkService.php b/stripe-php/lib/Service/PaymentLinkService.php new file mode 100644 index 0000000..d052c3b --- /dev/null +++ b/stripe-php/lib/Service/PaymentLinkService.php @@ -0,0 +1,94 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/payment_links', $params, $opts); + } + + /** + * When retrieving a payment link, there is an includable + * line_items property containing the first handful of those + * items. There is also a URL where you can retrieve the full (paginated) list of + * line items. + * + * @param string $id + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\LineItem> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allLineItems($id, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/payment_links/%s/line_items', $id), $params, $opts); + } + + /** + * Creates a payment link. + * + * @param null|array{after_completion?: array{hosted_confirmation?: array{custom_message?: string}, redirect?: array{url: string}, type: string}, allow_promotion_codes?: bool, application_fee_amount?: int, application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_address_collection?: string, consent_collection?: array{payment_method_reuse_agreement?: array{position: string}, promotions?: string, terms_of_service?: string}, currency?: string, custom_fields?: array{dropdown?: array{default_value?: string, options: array{label: string, value: string}[]}, key: string, label: array{custom: string, type: string}, numeric?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, optional?: bool, text?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, type: string}[], custom_text?: array{after_submit?: null|array{message: string}, shipping_address?: null|array{message: string}, submit?: null|array{message: string}, terms_of_service_acceptance?: null|array{message: string}}, customer_creation?: string, expand?: string[], inactive_message?: string, invoice_creation?: array{enabled: bool, invoice_data?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}, metadata?: null|array, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}}, line_items: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price?: string, price_data?: array{currency: string, product?: string, product_data?: array{description?: string, images?: string[], metadata?: array, name: string, tax_code?: string, unit_label?: string}, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity: int}[], metadata?: array, name_collection?: array{business?: array{enabled: bool, optional?: bool}, individual?: array{enabled: bool, optional?: bool}}, on_behalf_of?: string, optional_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, price: string, quantity: int}[], payment_intent_data?: array{capture_method?: string, description?: string, metadata?: array, setup_future_usage?: string, statement_descriptor?: string, statement_descriptor_suffix?: string, transfer_group?: string}, payment_method_collection?: string, payment_method_types?: string[], phone_number_collection?: array{enabled: bool}, restrictions?: array{completed_sessions: array{limit: int}}, shipping_address_collection?: array{allowed_countries: string[]}, shipping_options?: array{shipping_rate?: string}[], submit_type?: string, subscription_data?: array{description?: string, invoice_settings?: array{issuer?: array{account?: string, type: string}}, metadata?: array, trial_period_days?: int, trial_settings?: array{end_behavior: array{missing_payment_method: string}}}, tax_id_collection?: array{enabled: bool, required?: string}, transfer_data?: array{amount?: int, destination: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentLink + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/payment_links', $params, $opts); + } + + /** + * Retrieve a payment link. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentLink + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/payment_links/%s', $id), $params, $opts); + } + + /** + * Updates a payment link. + * + * @param string $id + * @param null|array{active?: bool, after_completion?: array{hosted_confirmation?: array{custom_message?: string}, redirect?: array{url: string}, type: string}, allow_promotion_codes?: bool, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_address_collection?: string, custom_fields?: null|array{dropdown?: array{default_value?: string, options: array{label: string, value: string}[]}, key: string, label: array{custom: string, type: string}, numeric?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, optional?: bool, text?: array{default_value?: string, maximum_length?: int, minimum_length?: int}, type: string}[], custom_text?: array{after_submit?: null|array{message: string}, shipping_address?: null|array{message: string}, submit?: null|array{message: string}, terms_of_service_acceptance?: null|array{message: string}}, customer_creation?: string, expand?: string[], inactive_message?: null|string, invoice_creation?: array{enabled: bool, invoice_data?: array{account_tax_ids?: null|string[], custom_fields?: null|array{name: string, value: string}[], description?: string, footer?: string, issuer?: array{account?: string, type: string}, metadata?: null|array, rendering_options?: null|array{amount_tax_display?: null|string, template?: string}}}, line_items?: array{adjustable_quantity?: array{enabled: bool, maximum?: int, minimum?: int}, id: string, quantity?: int}[], metadata?: array, name_collection?: null|array{business?: array{enabled: bool, optional?: bool}, individual?: array{enabled: bool, optional?: bool}}, payment_intent_data?: array{description?: null|string, metadata?: null|array, statement_descriptor?: null|string, statement_descriptor_suffix?: null|string, transfer_group?: null|string}, payment_method_collection?: string, payment_method_types?: null|string[], phone_number_collection?: array{enabled: bool}, restrictions?: null|array{completed_sessions: array{limit: int}}, shipping_address_collection?: null|array{allowed_countries: string[]}, submit_type?: string, subscription_data?: array{invoice_settings?: array{issuer?: array{account?: string, type: string}}, metadata?: null|array, trial_period_days?: null|int, trial_settings?: null|array{end_behavior: array{missing_payment_method: string}}}, tax_id_collection?: array{enabled: bool, required?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentLink + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_links/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/PaymentMethodConfigurationService.php b/stripe-php/lib/Service/PaymentMethodConfigurationService.php new file mode 100644 index 0000000..2f54573 --- /dev/null +++ b/stripe-php/lib/Service/PaymentMethodConfigurationService.php @@ -0,0 +1,75 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/payment_method_configurations', $params, $opts); + } + + /** + * Creates a payment method configuration. + * + * @param null|array{acss_debit?: array{display_preference?: array{preference?: string}}, affirm?: array{display_preference?: array{preference?: string}}, afterpay_clearpay?: array{display_preference?: array{preference?: string}}, alipay?: array{display_preference?: array{preference?: string}}, alma?: array{display_preference?: array{preference?: string}}, amazon_pay?: array{display_preference?: array{preference?: string}}, apple_pay?: array{display_preference?: array{preference?: string}}, apple_pay_later?: array{display_preference?: array{preference?: string}}, au_becs_debit?: array{display_preference?: array{preference?: string}}, bacs_debit?: array{display_preference?: array{preference?: string}}, bancontact?: array{display_preference?: array{preference?: string}}, billie?: array{display_preference?: array{preference?: string}}, blik?: array{display_preference?: array{preference?: string}}, boleto?: array{display_preference?: array{preference?: string}}, card?: array{display_preference?: array{preference?: string}}, cartes_bancaires?: array{display_preference?: array{preference?: string}}, cashapp?: array{display_preference?: array{preference?: string}}, crypto?: array{display_preference?: array{preference?: string}}, customer_balance?: array{display_preference?: array{preference?: string}}, eps?: array{display_preference?: array{preference?: string}}, expand?: string[], fpx?: array{display_preference?: array{preference?: string}}, fr_meal_voucher_conecs?: array{display_preference?: array{preference?: string}}, giropay?: array{display_preference?: array{preference?: string}}, google_pay?: array{display_preference?: array{preference?: string}}, grabpay?: array{display_preference?: array{preference?: string}}, ideal?: array{display_preference?: array{preference?: string}}, jcb?: array{display_preference?: array{preference?: string}}, kakao_pay?: array{display_preference?: array{preference?: string}}, klarna?: array{display_preference?: array{preference?: string}}, konbini?: array{display_preference?: array{preference?: string}}, kr_card?: array{display_preference?: array{preference?: string}}, link?: array{display_preference?: array{preference?: string}}, mb_way?: array{display_preference?: array{preference?: string}}, mobilepay?: array{display_preference?: array{preference?: string}}, multibanco?: array{display_preference?: array{preference?: string}}, name?: string, naver_pay?: array{display_preference?: array{preference?: string}}, nz_bank_account?: array{display_preference?: array{preference?: string}}, oxxo?: array{display_preference?: array{preference?: string}}, p24?: array{display_preference?: array{preference?: string}}, parent?: string, pay_by_bank?: array{display_preference?: array{preference?: string}}, payco?: array{display_preference?: array{preference?: string}}, paynow?: array{display_preference?: array{preference?: string}}, paypal?: array{display_preference?: array{preference?: string}}, payto?: array{display_preference?: array{preference?: string}}, pix?: array{display_preference?: array{preference?: string}}, promptpay?: array{display_preference?: array{preference?: string}}, revolut_pay?: array{display_preference?: array{preference?: string}}, samsung_pay?: array{display_preference?: array{preference?: string}}, satispay?: array{display_preference?: array{preference?: string}}, sepa_debit?: array{display_preference?: array{preference?: string}}, sofort?: array{display_preference?: array{preference?: string}}, swish?: array{display_preference?: array{preference?: string}}, twint?: array{display_preference?: array{preference?: string}}, us_bank_account?: array{display_preference?: array{preference?: string}}, wechat_pay?: array{display_preference?: array{preference?: string}}, zip?: array{display_preference?: array{preference?: string}}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentMethodConfiguration + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/payment_method_configurations', $params, $opts); + } + + /** + * Retrieve payment method configuration. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentMethodConfiguration + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/payment_method_configurations/%s', $id), $params, $opts); + } + + /** + * Update payment method configuration. + * + * @param string $id + * @param null|array{acss_debit?: array{display_preference?: array{preference?: string}}, active?: bool, affirm?: array{display_preference?: array{preference?: string}}, afterpay_clearpay?: array{display_preference?: array{preference?: string}}, alipay?: array{display_preference?: array{preference?: string}}, alma?: array{display_preference?: array{preference?: string}}, amazon_pay?: array{display_preference?: array{preference?: string}}, apple_pay?: array{display_preference?: array{preference?: string}}, apple_pay_later?: array{display_preference?: array{preference?: string}}, au_becs_debit?: array{display_preference?: array{preference?: string}}, bacs_debit?: array{display_preference?: array{preference?: string}}, bancontact?: array{display_preference?: array{preference?: string}}, billie?: array{display_preference?: array{preference?: string}}, blik?: array{display_preference?: array{preference?: string}}, boleto?: array{display_preference?: array{preference?: string}}, card?: array{display_preference?: array{preference?: string}}, cartes_bancaires?: array{display_preference?: array{preference?: string}}, cashapp?: array{display_preference?: array{preference?: string}}, crypto?: array{display_preference?: array{preference?: string}}, customer_balance?: array{display_preference?: array{preference?: string}}, eps?: array{display_preference?: array{preference?: string}}, expand?: string[], fpx?: array{display_preference?: array{preference?: string}}, fr_meal_voucher_conecs?: array{display_preference?: array{preference?: string}}, giropay?: array{display_preference?: array{preference?: string}}, google_pay?: array{display_preference?: array{preference?: string}}, grabpay?: array{display_preference?: array{preference?: string}}, ideal?: array{display_preference?: array{preference?: string}}, jcb?: array{display_preference?: array{preference?: string}}, kakao_pay?: array{display_preference?: array{preference?: string}}, klarna?: array{display_preference?: array{preference?: string}}, konbini?: array{display_preference?: array{preference?: string}}, kr_card?: array{display_preference?: array{preference?: string}}, link?: array{display_preference?: array{preference?: string}}, mb_way?: array{display_preference?: array{preference?: string}}, mobilepay?: array{display_preference?: array{preference?: string}}, multibanco?: array{display_preference?: array{preference?: string}}, name?: string, naver_pay?: array{display_preference?: array{preference?: string}}, nz_bank_account?: array{display_preference?: array{preference?: string}}, oxxo?: array{display_preference?: array{preference?: string}}, p24?: array{display_preference?: array{preference?: string}}, pay_by_bank?: array{display_preference?: array{preference?: string}}, payco?: array{display_preference?: array{preference?: string}}, paynow?: array{display_preference?: array{preference?: string}}, paypal?: array{display_preference?: array{preference?: string}}, payto?: array{display_preference?: array{preference?: string}}, pix?: array{display_preference?: array{preference?: string}}, promptpay?: array{display_preference?: array{preference?: string}}, revolut_pay?: array{display_preference?: array{preference?: string}}, samsung_pay?: array{display_preference?: array{preference?: string}}, satispay?: array{display_preference?: array{preference?: string}}, sepa_debit?: array{display_preference?: array{preference?: string}}, sofort?: array{display_preference?: array{preference?: string}}, swish?: array{display_preference?: array{preference?: string}}, twint?: array{display_preference?: array{preference?: string}}, us_bank_account?: array{display_preference?: array{preference?: string}}, wechat_pay?: array{display_preference?: array{preference?: string}}, zip?: array{display_preference?: array{preference?: string}}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentMethodConfiguration + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_method_configurations/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/PaymentMethodDomainService.php b/stripe-php/lib/Service/PaymentMethodDomainService.php new file mode 100644 index 0000000..55f907e --- /dev/null +++ b/stripe-php/lib/Service/PaymentMethodDomainService.php @@ -0,0 +1,102 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/payment_method_domains', $params, $opts); + } + + /** + * Creates a payment method domain. + * + * @param null|array{domain_name: string, enabled?: bool, expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentMethodDomain + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/payment_method_domains', $params, $opts); + } + + /** + * Retrieves the details of an existing payment method domain. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentMethodDomain + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/payment_method_domains/%s', $id), $params, $opts); + } + + /** + * Updates an existing payment method domain. + * + * @param string $id + * @param null|array{enabled?: bool, expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentMethodDomain + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_method_domains/%s', $id), $params, $opts); + } + + /** + * Some payment methods might require additional steps to register a domain. If the + * requirements weren’t satisfied when the domain was created, the payment method + * will be inactive on the domain. The payment method doesn’t appear in Elements or + * Embedded Checkout for this domain until it is active. + * + * To activate a payment method on an existing payment method domain, complete the + * required registration steps specific to the payment method, and then validate + * the payment method domain with this endpoint. + * + * Related guides: Payment method + * domains. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentMethodDomain + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function validate($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_method_domains/%s/validate', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/PaymentMethodService.php b/stripe-php/lib/Service/PaymentMethodService.php new file mode 100644 index 0000000..f52f947 --- /dev/null +++ b/stripe-php/lib/Service/PaymentMethodService.php @@ -0,0 +1,137 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/payment_methods', $params, $opts); + } + + /** + * Attaches a PaymentMethod object to a Customer. + * + * To attach a new PaymentMethod to a customer for future payments, we recommend + * you use a SetupIntent or a PaymentIntent + * with setup_future_usage. + * These approaches will perform any necessary steps to set up the PaymentMethod + * for future payments. Using the /v1/payment_methods/:id/attach + * endpoint without first using a SetupIntent or PaymentIntent with + * setup_future_usage does not optimize the PaymentMethod for future + * use, which makes later declines and payment friction more likely. See Optimizing cards for future + * payments for more information about setting up future payments. + * + * To use this PaymentMethod as the default for invoice or subscription payments, + * set invoice_settings.default_payment_method, + * on the Customer to the PaymentMethod’s ID. + * + * @param string $id + * @param null|array{customer?: string, customer_account?: string, expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentMethod + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function attach($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_methods/%s/attach', $id), $params, $opts); + } + + /** + * Creates a PaymentMethod object. Read the Stripe.js + * reference to learn how to create PaymentMethods via Stripe.js. + * + * Instead of creating a PaymentMethod directly, we recommend using the PaymentIntents API to accept a + * payment immediately or the SetupIntent API to collect payment + * method details ahead of a future payment. + * + * @param null|array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, card?: array{cvc?: string, exp_month?: int, exp_year?: int, networks?: array{preferred?: string}, number?: string, token?: string}, cashapp?: array{}, crypto?: array{}, custom?: array{type: string}, customer?: string, customer_balance?: array{}, eps?: array{bank?: string}, expand?: string[], fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, payment_method?: string, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type?: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentMethod + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/payment_methods', $params, $opts); + } + + /** + * Detaches a PaymentMethod object from a Customer. After a PaymentMethod is + * detached, it can no longer be used for a payment or re-attached to a Customer. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentMethod + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function detach($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_methods/%s/detach', $id), $params, $opts); + } + + /** + * Retrieves a PaymentMethod object attached to the StripeAccount. To retrieve a + * payment method attached to a Customer, you should use Retrieve a Customer’s + * PaymentMethods. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentMethod + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/payment_methods/%s', $id), $params, $opts); + } + + /** + * Updates a PaymentMethod object. A PaymentMethod must be attached to a customer + * to be updated. + * + * @param string $id + * @param null|array{allow_redisplay?: string, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, card?: array{exp_month?: int, exp_year?: int, networks?: array{preferred?: null|string}}, expand?: string[], metadata?: null|array, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, us_bank_account?: array{account_holder_type?: string, account_type?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentMethod + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_methods/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/PaymentRecordService.php b/stripe-php/lib/Service/PaymentRecordService.php new file mode 100644 index 0000000..d2668ae --- /dev/null +++ b/stripe-php/lib/Service/PaymentRecordService.php @@ -0,0 +1,148 @@ +, outcome?: string, payment_method_details: array{billing_details?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: string, name?: string, phone?: string}, custom?: array{display_name?: string, type?: string}, payment_method?: string, type?: string}, processor_details?: array{custom?: array{payment_reference: string}, type: string}, shipping_details?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name?: string, phone?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentRecord + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function reportPayment($params = null, $opts = null) + { + return $this->request('post', '/v1/payment_records/report_payment', $params, $opts); + } + + /** + * Report a new payment attempt on the specified Payment Record. A new payment + * attempt can only be specified if all other payment attempts are canceled or + * failed. + * + * @param string $id + * @param null|array{description?: string, expand?: string[], failed?: array{failed_at: int}, guaranteed?: array{guaranteed_at: int}, initiated_at: int, metadata?: null|array, outcome?: string, payment_method_details?: array{billing_details?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: string, name?: string, phone?: string}, custom?: array{display_name?: string, type?: string}, payment_method?: string, type?: string}, shipping_details?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name?: string, phone?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentRecord + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function reportPaymentAttempt($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_records/%s/report_payment_attempt', $id), $params, $opts); + } + + /** + * Report that the most recent payment attempt on the specified Payment Record was + * canceled. + * + * @param string $id + * @param null|array{canceled_at: int, expand?: string[], metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentRecord + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function reportPaymentAttemptCanceled($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_records/%s/report_payment_attempt_canceled', $id), $params, $opts); + } + + /** + * Report that the most recent payment attempt on the specified Payment Record + * failed or errored. + * + * @param string $id + * @param null|array{expand?: string[], failed_at: int, metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentRecord + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function reportPaymentAttemptFailed($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_records/%s/report_payment_attempt_failed', $id), $params, $opts); + } + + /** + * Report that the most recent payment attempt on the specified Payment Record was + * guaranteed. + * + * @param string $id + * @param null|array{expand?: string[], guaranteed_at: int, metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentRecord + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function reportPaymentAttemptGuaranteed($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_records/%s/report_payment_attempt_guaranteed', $id), $params, $opts); + } + + /** + * Report informational updates on the specified Payment Record. + * + * @param string $id + * @param null|array{customer_details?: array{customer?: string, email?: string, name?: string, phone?: string}, description?: null|string, expand?: string[], metadata?: null|array, shipping_details?: null|array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name?: string, phone?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentRecord + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function reportPaymentAttemptInformational($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_records/%s/report_payment_attempt_informational', $id), $params, $opts); + } + + /** + * Report that the most recent payment attempt on the specified Payment Record was + * refunded. + * + * @param string $id + * @param null|array{amount?: array{currency: string, value: int}, expand?: string[], initiated_at?: int, metadata?: null|array, outcome: string, processor_details: array{custom?: array{refund_reference: string}, type: string}, refunded: array{refunded_at: int}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentRecord + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function reportRefund($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payment_records/%s/report_refund', $id), $params, $opts); + } + + /** + * Retrieves a Payment Record with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PaymentRecord + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/payment_records/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/PayoutService.php b/stripe-php/lib/Service/PayoutService.php new file mode 100644 index 0000000..a6e1b5c --- /dev/null +++ b/stripe-php/lib/Service/PayoutService.php @@ -0,0 +1,132 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/payouts', $params, $opts); + } + + /** + * You can cancel a previously created payout if its status is + * pending. Stripe refunds the funds to your available balance. You + * can’t cancel automatic Stripe payouts. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Payout + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payouts/%s/cancel', $id), $params, $opts); + } + + /** + * To send funds to your own bank account, create a new payout object. Your Stripe balance must cover the payout amount. If it doesn’t, + * you receive an “Insufficient Funds” error. + * + * If your API key is in test mode, money won’t actually be sent, though every + * other action occurs as if you’re in live mode. + * + * If you create a manual payout on a Stripe account that uses multiple payment + * source types, you need to specify the source type balance that the payout draws + * from. The balance object details available and + * pending amounts by source type. + * + * @param null|array{amount: int, currency: string, description?: string, destination?: string, expand?: string[], metadata?: array, method?: string, payout_method?: string, source_type?: string, statement_descriptor?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Payout + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/payouts', $params, $opts); + } + + /** + * Retrieves the details of an existing payout. Supply the unique payout ID from + * either a payout creation request or the payout list. Stripe returns the + * corresponding payout information. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Payout + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/payouts/%s', $id), $params, $opts); + } + + /** + * Reverses a payout by debiting the destination bank account. At this time, you + * can only reverse payouts for connected accounts to US and Canadian bank + * accounts. If the payout is manual and in the pending status, use + * /v1/payouts/:id/cancel instead. + * + * By requesting a reversal through /v1/payouts/:id/reverse, you + * confirm that the authorized signatory of the selected bank account authorizes + * the debit on the bank account and that no other authorization is required. + * + * @param string $id + * @param null|array{expand?: string[], metadata?: array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Payout + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function reverse($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payouts/%s/reverse', $id), $params, $opts); + } + + /** + * Updates the specified payout by setting the values of the parameters you pass. + * We don’t change parameters that you don’t provide. This request only accepts the + * metadata as arguments. + * + * @param string $id + * @param null|array{expand?: string[], metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Payout + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/payouts/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/PlanService.php b/stripe-php/lib/Service/PlanService.php new file mode 100644 index 0000000..eb385cd --- /dev/null +++ b/stripe-php/lib/Service/PlanService.php @@ -0,0 +1,96 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/plans', $params, $opts); + } + + /** + * You can now model subscriptions more flexibly using the Prices + * API. It replaces the Plans API and is backwards compatible to simplify your + * migration. + * + * @param null|array{active?: bool, amount?: int, amount_decimal?: string, billing_scheme?: string, currency: string, expand?: string[], id?: string, interval: string, interval_count?: int, metadata?: null|array, meter?: string, nickname?: string, product?: array|string, tiers?: (array{flat_amount?: int, flat_amount_decimal?: string, unit_amount?: int, unit_amount_decimal?: string, up_to: array|int|string})[], tiers_mode?: string, transform_usage?: array{divide_by: int, round: string}, trial_period_days?: int, usage_type?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Plan + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/plans', $params, $opts); + } + + /** + * Deleting plans means new subscribers can’t be added. Existing subscribers aren’t + * affected. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Plan + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/plans/%s', $id), $params, $opts); + } + + /** + * Retrieves the plan with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Plan + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/plans/%s', $id), $params, $opts); + } + + /** + * Updates the specified plan by setting the values of the parameters passed. Any + * parameters not provided are left unchanged. By design, you cannot change a + * plan’s ID, amount, currency, or billing cycle. + * + * @param string $id + * @param null|array{active?: bool, expand?: string[], metadata?: null|array, nickname?: string, product?: string, trial_period_days?: int} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Plan + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/plans/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/PriceService.php b/stripe-php/lib/Service/PriceService.php new file mode 100644 index 0000000..0071d60 --- /dev/null +++ b/stripe-php/lib/Service/PriceService.php @@ -0,0 +1,100 @@ +inline prices. + * For the list of inactive prices, set active to false. + * + * @param null|array{active?: bool, created?: array|int, currency?: string, ending_before?: string, expand?: string[], limit?: int, lookup_keys?: string[], product?: string, recurring?: array{interval?: string, meter?: string, usage_type?: string}, starting_after?: string, type?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Price> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/prices', $params, $opts); + } + + /** + * Creates a new Price for an + * existing Product. The Price + * can be recurring or one-time. + * + * @param null|array{active?: bool, billing_scheme?: string, currency: string, currency_options?: array, custom_unit_amount?: array{enabled: bool, maximum?: int, minimum?: int, preset?: int}, expand?: string[], lookup_key?: string, metadata?: array, nickname?: string, product?: string, product_data?: array{active?: bool, id?: string, metadata?: array, name: string, statement_descriptor?: string, tax_code?: string, unit_label?: string}, recurring?: array{interval: string, interval_count?: int, meter?: string, trial_period_days?: int, usage_type?: string}, tax_behavior?: string, tiers?: (array{flat_amount?: int, flat_amount_decimal?: string, unit_amount?: int, unit_amount_decimal?: string, up_to: array|int|string})[], tiers_mode?: string, transfer_lookup_key?: bool, transform_quantity?: array{divide_by: int, round: string}, unit_amount?: int, unit_amount_decimal?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Price + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/prices', $params, $opts); + } + + /** + * Retrieves the price with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Price + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/prices/%s', $id), $params, $opts); + } + + /** + * Search for prices you’ve previously created using Stripe’s Search Query Language. Don’t use + * search in read-after-write flows where strict consistency is necessary. Under + * normal operating conditions, data is searchable in less than a minute. + * Occasionally, propagation of new or updated data can be up to an hour behind + * during outages. Search functionality is not available to merchants in India. + * + * @param null|array{expand?: string[], limit?: int, page?: string, query: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SearchResult<\Stripe\Price> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function search($params = null, $opts = null) + { + return $this->requestSearchResult('get', '/v1/prices/search', $params, $opts); + } + + /** + * Updates the specified price by setting the values of the parameters passed. Any + * parameters not provided are left unchanged. + * + * @param string $id + * @param null|array{active?: bool, currency_options?: null|array, expand?: string[], lookup_key?: string, metadata?: null|array, nickname?: string, tax_behavior?: string, transfer_lookup_key?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Price + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/prices/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/ProductService.php b/stripe-php/lib/Service/ProductService.php new file mode 100644 index 0000000..72db228 --- /dev/null +++ b/stripe-php/lib/Service/ProductService.php @@ -0,0 +1,183 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/products', $params, $opts); + } + + /** + * Retrieve a list of features for a product. + * + * @param string $parentId + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\ProductFeature> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allFeatures($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/products/%s/features', $parentId), $params, $opts); + } + + /** + * Creates a new product object. + * + * @param null|array{active?: bool, default_price_data?: array{currency: string, currency_options?: array, custom_unit_amount?: array{enabled: bool, maximum?: int, minimum?: int, preset?: int}, metadata?: array, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, description?: string, expand?: string[], id?: string, images?: string[], marketing_features?: array{name: string}[], metadata?: array, name: string, package_dimensions?: array{height: float, length: float, weight: float, width: float}, shippable?: bool, statement_descriptor?: string, tax_code?: string, type?: string, unit_label?: string, url?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Product + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/products', $params, $opts); + } + + /** + * Creates a product_feature, which represents a feature attachment to a product. + * + * @param string $parentId + * @param null|array{entitlement_feature: string, expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\ProductFeature + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function createFeature($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/products/%s/features', $parentId), $params, $opts); + } + + /** + * Delete a product. Deleting a product is only possible if it has no prices + * associated with it. Additionally, deleting a product with type=good + * is only possible if it has no SKUs associated with it. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Product + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/products/%s', $id), $params, $opts); + } + + /** + * Deletes the feature attachment to a product. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\ProductFeature + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function deleteFeature($parentId, $id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/products/%s/features/%s', $parentId, $id), $params, $opts); + } + + /** + * Retrieves the details of an existing product. Supply the unique product ID from + * either a product creation request or the product list, and Stripe will return + * the corresponding product information. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Product + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/products/%s', $id), $params, $opts); + } + + /** + * Retrieves a product_feature, which represents a feature attachment to a product. + * + * @param string $parentId + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\ProductFeature + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieveFeature($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/products/%s/features/%s', $parentId, $id), $params, $opts); + } + + /** + * Search for products you’ve previously created using Stripe’s Search Query Language. Don’t use + * search in read-after-write flows where strict consistency is necessary. Under + * normal operating conditions, data is searchable in less than a minute. + * Occasionally, propagation of new or updated data can be up to an hour behind + * during outages. Search functionality is not available to merchants in India. + * + * @param null|array{expand?: string[], limit?: int, page?: string, query: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SearchResult<\Stripe\Product> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function search($params = null, $opts = null) + { + return $this->requestSearchResult('get', '/v1/products/search', $params, $opts); + } + + /** + * Updates the specific product by setting the values of the parameters passed. Any + * parameters not provided will be left unchanged. + * + * @param string $id + * @param null|array{active?: bool, default_price?: string, description?: null|string, expand?: string[], images?: null|string[], marketing_features?: null|array{name: string}[], metadata?: null|array, name?: string, package_dimensions?: null|array{height: float, length: float, weight: float, width: float}, shippable?: bool, statement_descriptor?: string, tax_code?: null|string, unit_label?: null|string, url?: null|string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Product + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/products/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/PromotionCodeService.php b/stripe-php/lib/Service/PromotionCodeService.php new file mode 100644 index 0000000..7668b00 --- /dev/null +++ b/stripe-php/lib/Service/PromotionCodeService.php @@ -0,0 +1,80 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/promotion_codes', $params, $opts); + } + + /** + * A promotion code points to an underlying promotion. You can optionally restrict + * the code to a specific customer, redemption limit, and expiration date. + * + * @param null|array{active?: bool, code?: string, customer?: string, customer_account?: string, expand?: string[], expires_at?: int, max_redemptions?: int, metadata?: array, promotion: array{coupon?: string, type: string}, restrictions?: array{currency_options?: array, first_time_transaction?: bool, minimum_amount?: int, minimum_amount_currency?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PromotionCode + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/promotion_codes', $params, $opts); + } + + /** + * Retrieves the promotion code with the given ID. In order to retrieve a promotion + * code by the customer-facing code use list with the desired + * code. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PromotionCode + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/promotion_codes/%s', $id), $params, $opts); + } + + /** + * Updates the specified promotion code by setting the values of the parameters + * passed. Most fields are, by design, not editable. + * + * @param string $id + * @param null|array{active?: bool, expand?: string[], metadata?: null|array, restrictions?: array{currency_options?: array}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\PromotionCode + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/promotion_codes/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/QuoteService.php b/stripe-php/lib/Service/QuoteService.php new file mode 100644 index 0000000..541b45e --- /dev/null +++ b/stripe-php/lib/Service/QuoteService.php @@ -0,0 +1,186 @@ +request('post', $this->buildPath('/v1/quotes/%s/accept', $id), $params, $opts); + } + + /** + * Returns a list of your quotes. + * + * @param null|array{customer?: string, customer_account?: string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, status?: string, test_clock?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Quote> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/quotes', $params, $opts); + } + + /** + * When retrieving a quote, there is an includable computed.upfront.line_items + * property containing the first handful of those items. There is also a URL where + * you can retrieve the full (paginated) list of upfront line items. + * + * @param string $id + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\LineItem> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allComputedUpfrontLineItems($id, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/quotes/%s/computed_upfront_line_items', $id), $params, $opts); + } + + /** + * When retrieving a quote, there is an includable line_items + * property containing the first handful of those items. There is also a URL where + * you can retrieve the full (paginated) list of line items. + * + * @param string $id + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\LineItem> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allLineItems($id, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/quotes/%s/line_items', $id), $params, $opts); + } + + /** + * Cancels the quote. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Quote + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/quotes/%s/cancel', $id), $params, $opts); + } + + /** + * A quote models prices and services for a customer. Default options for + * header, description, footer, and + * expires_at can be set in the dashboard via the quote template. + * + * @param null|array{application_fee_amount?: null|int, application_fee_percent?: null|float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, collection_method?: string, customer?: string, customer_account?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], expires_at?: int, footer?: null|string, from_quote?: array{is_revision?: bool, quote: string}, header?: null|string, invoice_settings?: array{days_until_due?: int, issuer?: array{account?: string, type: string}}, line_items?: (array{discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], price?: string, price_data?: array{currency: string, product: string, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: null|string, subscription_data?: array{billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, description?: string, effective_date?: null|array|int|string, metadata?: array, trial_period_days?: null|int}, test_clock?: string, transfer_data?: null|array{amount?: int, amount_percent?: float, destination: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Quote + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/quotes', $params, $opts); + } + + /** + * Finalizes the quote. + * + * @param string $id + * @param null|array{expand?: string[], expires_at?: int} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Quote + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function finalizeQuote($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/quotes/%s/finalize', $id), $params, $opts); + } + + /** + * Download the PDF for a finalized quote. Explanation for special handling can be + * found here. + * + * @param string $id + * @param callable $readBodyChunkCallable + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return mixed + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function pdf($id, $readBodyChunkCallable, $params = null, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + if (!isset($opts->apiBase)) { + $opts->apiBase = $this->getClient()->getFilesBase(); + } + + return $this->requestStream('get', $this->buildPath('/v1/quotes/%s/pdf', $id), $readBodyChunkCallable, $params, $opts); + } + + /** + * Retrieves the quote with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Quote + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/quotes/%s', $id), $params, $opts); + } + + /** + * A quote models prices and services for a customer. + * + * @param string $id + * @param null|array{application_fee_amount?: null|int, application_fee_percent?: null|float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, collection_method?: string, customer?: string, customer_account?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], expires_at?: int, footer?: null|string, header?: null|string, invoice_settings?: array{days_until_due?: int, issuer?: array{account?: string, type: string}}, line_items?: (array{discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], id?: string, price?: string, price_data?: array{currency: string, product: string, recurring?: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: null|string, subscription_data?: array{description?: null|string, effective_date?: null|array|int|string, metadata?: array, trial_period_days?: null|int}, transfer_data?: null|array{amount?: int, amount_percent?: float, destination: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Quote + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/quotes/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Radar/EarlyFraudWarningService.php b/stripe-php/lib/Service/Radar/EarlyFraudWarningService.php new file mode 100644 index 0000000..0a2a5cb --- /dev/null +++ b/stripe-php/lib/Service/Radar/EarlyFraudWarningService.php @@ -0,0 +1,48 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/radar/early_fraud_warnings', $params, $opts); + } + + /** + * Retrieves the details of an early fraud warning that has previously been + * created. + * + * Please refer to the early fraud + * warning object reference for more details. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Radar\EarlyFraudWarning + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/radar/early_fraud_warnings/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Radar/RadarServiceFactory.php b/stripe-php/lib/Service/Radar/RadarServiceFactory.php new file mode 100644 index 0000000..b093c67 --- /dev/null +++ b/stripe-php/lib/Service/Radar/RadarServiceFactory.php @@ -0,0 +1,29 @@ + + */ + private static $classMap = [ + 'earlyFraudWarnings' => EarlyFraudWarningService::class, + 'valueListItems' => ValueListItemService::class, + 'valueLists' => ValueListService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/Radar/ValueListItemService.php b/stripe-php/lib/Service/Radar/ValueListItemService.php new file mode 100644 index 0000000..cbc963f --- /dev/null +++ b/stripe-php/lib/Service/Radar/ValueListItemService.php @@ -0,0 +1,79 @@ +ValueListItem objects. The objects are sorted in + * descending order by creation date, with the most recently created object + * appearing first. + * + * @param null|array{created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, value?: string, value_list: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Radar\ValueListItem> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/radar/value_list_items', $params, $opts); + } + + /** + * Creates a new ValueListItem object, which is added to the specified + * parent value list. + * + * @param null|array{expand?: string[], value: string, value_list: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Radar\ValueListItem + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/radar/value_list_items', $params, $opts); + } + + /** + * Deletes a ValueListItem object, removing it from its parent value + * list. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Radar\ValueListItem + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/radar/value_list_items/%s', $id), $params, $opts); + } + + /** + * Retrieves a ValueListItem object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Radar\ValueListItem + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/radar/value_list_items/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Radar/ValueListService.php b/stripe-php/lib/Service/Radar/ValueListService.php new file mode 100644 index 0000000..01dd312 --- /dev/null +++ b/stripe-php/lib/Service/Radar/ValueListService.php @@ -0,0 +1,98 @@ +ValueList objects. The objects are sorted in + * descending order by creation date, with the most recently created object + * appearing first. + * + * @param null|array{alias?: string, contains?: string, created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Radar\ValueList> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/radar/value_lists', $params, $opts); + } + + /** + * Creates a new ValueList object, which can then be referenced in + * rules. + * + * @param null|array{alias: string, expand?: string[], item_type?: string, metadata?: array, name: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Radar\ValueList + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/radar/value_lists', $params, $opts); + } + + /** + * Deletes a ValueList object, also deleting any items contained + * within the value list. To be deleted, a value list must not be referenced in any + * rules. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Radar\ValueList + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/radar/value_lists/%s', $id), $params, $opts); + } + + /** + * Retrieves a ValueList object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Radar\ValueList + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/radar/value_lists/%s', $id), $params, $opts); + } + + /** + * Updates a ValueList object by setting the values of the parameters + * passed. Any parameters not provided will be left unchanged. Note that + * item_type is immutable. + * + * @param string $id + * @param null|array{alias?: string, expand?: string[], metadata?: array, name?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Radar\ValueList + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/radar/value_lists/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/RefundService.php b/stripe-php/lib/Service/RefundService.php new file mode 100644 index 0000000..0dcad0b --- /dev/null +++ b/stripe-php/lib/Service/RefundService.php @@ -0,0 +1,111 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/refunds', $params, $opts); + } + + /** + * Cancels a refund with a status of requires_action. + * + * You can’t cancel refunds in other states. Only refunds for payment methods that + * require customer action can enter the requires_action state. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Refund + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/refunds/%s/cancel', $id), $params, $opts); + } + + /** + * When you create a new refund, you must specify a Charge or a PaymentIntent + * object on which to create it. + * + * Creating a new refund will refund a charge that has previously been created but + * not yet refunded. Funds will be refunded to the credit or debit card that was + * originally charged. + * + * You can optionally refund only part of a charge. You can do so multiple times, + * until the entire charge has been refunded. + * + * Once entirely refunded, a charge can’t be refunded again. This method will raise + * an error when called on an already-refunded charge, or when trying to refund + * more money than is left on a charge. + * + * @param null|array{amount?: int, charge?: string, currency?: string, customer?: string, expand?: string[], instructions_email?: string, metadata?: null|array, origin?: string, payment_intent?: string, reason?: string, refund_application_fee?: bool, reverse_transfer?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Refund + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/refunds', $params, $opts); + } + + /** + * Retrieves the details of an existing refund. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Refund + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/refunds/%s', $id), $params, $opts); + } + + /** + * Updates the refund that you specify by setting the values of the passed + * parameters. Any parameters that you don’t provide remain unchanged. + * + * This request only accepts metadata as an argument. + * + * @param string $id + * @param null|array{expand?: string[], metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Refund + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/refunds/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Reporting/ReportRunService.php b/stripe-php/lib/Service/Reporting/ReportRunService.php new file mode 100644 index 0000000..0f8e360 --- /dev/null +++ b/stripe-php/lib/Service/Reporting/ReportRunService.php @@ -0,0 +1,60 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/reporting/report_runs', $params, $opts); + } + + /** + * Creates a new object and begin running the report. (Certain report types require + * a live-mode API key.). + * + * @param null|array{expand?: string[], parameters?: array{columns?: string[], connected_account?: string, currency?: string, interval_end?: int, interval_start?: int, payout?: string, reporting_category?: string, timezone?: string}, report_type: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Reporting\ReportRun + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/reporting/report_runs', $params, $opts); + } + + /** + * Retrieves the details of an existing Report Run. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Reporting\ReportRun + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/reporting/report_runs/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Reporting/ReportTypeService.php b/stripe-php/lib/Service/Reporting/ReportTypeService.php new file mode 100644 index 0000000..b839d7b --- /dev/null +++ b/stripe-php/lib/Service/Reporting/ReportTypeService.php @@ -0,0 +1,45 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/reporting/report_types', $params, $opts); + } + + /** + * Retrieves the details of a Report Type. (Certain report types require a live-mode API key.). + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Reporting\ReportType + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/reporting/report_types/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Reporting/ReportingServiceFactory.php b/stripe-php/lib/Service/Reporting/ReportingServiceFactory.php new file mode 100644 index 0000000..7832e91 --- /dev/null +++ b/stripe-php/lib/Service/Reporting/ReportingServiceFactory.php @@ -0,0 +1,27 @@ + + */ + private static $classMap = [ + 'reportRuns' => ReportRunService::class, + 'reportTypes' => ReportTypeService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/ReviewService.php b/stripe-php/lib/Service/ReviewService.php new file mode 100644 index 0000000..465ad86 --- /dev/null +++ b/stripe-php/lib/Service/ReviewService.php @@ -0,0 +1,63 @@ +Review objects that have open set to + * true. The objects are sorted in descending order by creation date, + * with the most recently created object appearing first. + * + * @param null|array{created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Review> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/reviews', $params, $opts); + } + + /** + * Approves a Review object, closing it and removing it from the list + * of reviews. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Review + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function approve($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/reviews/%s/approve', $id), $params, $opts); + } + + /** + * Retrieves a Review object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Review + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/reviews/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/ServiceNavigatorTrait.php b/stripe-php/lib/Service/ServiceNavigatorTrait.php new file mode 100644 index 0000000..c53f372 --- /dev/null +++ b/stripe-php/lib/Service/ServiceNavigatorTrait.php @@ -0,0 +1,58 @@ + */ + protected $services = []; + + /** @var \Stripe\StripeClientInterface */ + protected $client; + + protected function getServiceClass($name) + { + \trigger_error('Undefined property: ' . static::class . '::$' . $name); + } + + public function __get($name) + { + $serviceClass = $this->getServiceClass($name); + if (null !== $serviceClass) { + if (!\array_key_exists($name, $this->services)) { + $this->services[$name] = new $serviceClass($this->client); + } + + return $this->services[$name]; + } + + \trigger_error('Undefined property: ' . static::class . '::$' . $name); + + return null; + } + + /** + * @param string $name + * + * @return null|AbstractService|AbstractServiceFactory + */ + public function getService($name) + { + $serviceClass = $this->getServiceClass($name); + if (null !== $serviceClass) { + if (!\array_key_exists($name, $this->services)) { + $this->services[$name] = new $serviceClass($this->client); + } + + return $this->services[$name]; + } + + \trigger_error('Undefined property: ' . static::class . '::$' . $name); + + return null; + } +} diff --git a/stripe-php/lib/Service/SetupAttemptService.php b/stripe-php/lib/Service/SetupAttemptService.php new file mode 100644 index 0000000..303e339 --- /dev/null +++ b/stripe-php/lib/Service/SetupAttemptService.php @@ -0,0 +1,28 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/setup_attempts', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/SetupIntentService.php b/stripe-php/lib/Service/SetupIntentService.php new file mode 100644 index 0000000..65c64e4 --- /dev/null +++ b/stripe-php/lib/Service/SetupIntentService.php @@ -0,0 +1,151 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/setup_intents', $params, $opts); + } + + /** + * You can cancel a SetupIntent object when it’s in one of these statuses: + * requires_payment_method, requires_confirmation, or + * requires_action. + * + * After you cancel it, setup is abandoned and any operations on the SetupIntent + * fail with an error. You can’t cancel the SetupIntent for a Checkout Session. Expire the Checkout Session + * instead. + * + * @param string $id + * @param null|array{cancellation_reason?: string, expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SetupIntent + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/setup_intents/%s/cancel', $id), $params, $opts); + } + + /** + * Confirm that your customer intends to set up the current or provided payment + * method. For example, you would confirm a SetupIntent when a customer hits the + * “Save” button on a payment method management page on your website. + * + * If the selected payment method does not require any additional steps from the + * customer, the SetupIntent will transition to the succeeded status. + * + * Otherwise, it will transition to the requires_action status and + * suggest additional actions via next_action. If setup fails, the + * SetupIntent will transition to the requires_payment_method status + * or the canceled status if the confirmation limit is reached. + * + * @param string $id + * @param null|array{confirmation_token?: string, expand?: string[], mandate_data?: null|array{customer_acceptance?: array{accepted_at?: int, offline?: array{}, online?: array{ip_address?: string, user_agent?: string}, type: string}}, payment_method?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, verification_method?: string}, amazon_pay?: array{}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, card?: array{mandate_options?: array{amount: int, amount_type: string, currency: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_three_d_secure?: string, three_d_secure?: array{ares_trans_status?: string, cryptogram?: string, electronic_commerce_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id?: string, version?: string}}, card_present?: array{}, klarna?: array{currency?: string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, link?: array{persistent_token?: string}, paypal?: array{billing_agreement_id?: string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, us_bank_account?: array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, verification_method?: string}}, return_url?: string, use_stripe_sdk?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SetupIntent + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function confirm($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/setup_intents/%s/confirm', $id), $params, $opts); + } + + /** + * Creates a SetupIntent object. + * + * After you create the SetupIntent, attach a payment method and confirm it to collect any required + * permissions to charge the payment method later. + * + * @param null|array{attach_to_self?: bool, automatic_payment_methods?: array{allow_redirects?: string, enabled: bool}, confirm?: bool, confirmation_token?: string, customer?: string, customer_account?: string, description?: string, excluded_payment_method_types?: string[], expand?: string[], flow_directions?: string[], mandate_data?: null|array{customer_acceptance: array{accepted_at?: int, offline?: array{}, online?: array{ip_address: string, user_agent: string}, type: string}}, metadata?: array, on_behalf_of?: string, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, verification_method?: string}, amazon_pay?: array{}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, card?: array{mandate_options?: array{amount: int, amount_type: string, currency: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_three_d_secure?: string, three_d_secure?: array{ares_trans_status?: string, cryptogram?: string, electronic_commerce_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id?: string, version?: string}}, card_present?: array{}, klarna?: array{currency?: string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, link?: array{persistent_token?: string}, paypal?: array{billing_agreement_id?: string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, us_bank_account?: array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, verification_method?: string}}, payment_method_types?: string[], return_url?: string, single_use?: array{amount: int, currency: string}, usage?: string, use_stripe_sdk?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SetupIntent + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/setup_intents', $params, $opts); + } + + /** + * Retrieves the details of a SetupIntent that has previously been created. + * + * Client-side retrieval using a publishable key is allowed when the + * client_secret is provided in the query string. + * + * When retrieved with a publishable key, only a subset of properties will be + * returned. Please refer to the SetupIntent + * object reference for more details. + * + * @param string $id + * @param null|array{client_secret?: string, expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SetupIntent + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/setup_intents/%s', $id), $params, $opts); + } + + /** + * Updates a SetupIntent object. + * + * @param string $id + * @param null|array{attach_to_self?: bool, customer?: string, customer_account?: string, description?: string, excluded_payment_method_types?: null|string[], expand?: string[], flow_directions?: string[], metadata?: null|array, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, verification_method?: string}, amazon_pay?: array{}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, card?: array{mandate_options?: array{amount: int, amount_type: string, currency: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_three_d_secure?: string, three_d_secure?: array{ares_trans_status?: string, cryptogram?: string, electronic_commerce_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id?: string, version?: string}}, card_present?: array{}, klarna?: array{currency?: string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, link?: array{persistent_token?: string}, paypal?: array{billing_agreement_id?: string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, us_bank_account?: array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, verification_method?: string}}, payment_method_types?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SetupIntent + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/setup_intents/%s', $id), $params, $opts); + } + + /** + * Verifies microdeposits on a SetupIntent object. + * + * @param string $id + * @param null|array{amounts?: int[], descriptor_code?: string, expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SetupIntent + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function verifyMicrodeposits($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/setup_intents/%s/verify_microdeposits', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/ShippingRateService.php b/stripe-php/lib/Service/ShippingRateService.php new file mode 100644 index 0000000..df7e4cc --- /dev/null +++ b/stripe-php/lib/Service/ShippingRateService.php @@ -0,0 +1,75 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/shipping_rates', $params, $opts); + } + + /** + * Creates a new shipping rate object. + * + * @param null|array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, expand?: string[], fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\ShippingRate + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/shipping_rates', $params, $opts); + } + + /** + * Returns the shipping rate object with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\ShippingRate + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/shipping_rates/%s', $id), $params, $opts); + } + + /** + * Updates an existing shipping rate object. + * + * @param string $id + * @param null|array{active?: bool, expand?: string[], fixed_amount?: array{currency_options?: array}, metadata?: null|array, tax_behavior?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\ShippingRate + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/shipping_rates/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Sigma/ScheduledQueryRunService.php b/stripe-php/lib/Service/Sigma/ScheduledQueryRunService.php new file mode 100644 index 0000000..f6eccd8 --- /dev/null +++ b/stripe-php/lib/Service/Sigma/ScheduledQueryRunService.php @@ -0,0 +1,44 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/sigma/scheduled_query_runs', $params, $opts); + } + + /** + * Retrieves the details of an scheduled query run. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Sigma\ScheduledQueryRun + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/sigma/scheduled_query_runs/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Sigma/SigmaServiceFactory.php b/stripe-php/lib/Service/Sigma/SigmaServiceFactory.php new file mode 100644 index 0000000..356750f --- /dev/null +++ b/stripe-php/lib/Service/Sigma/SigmaServiceFactory.php @@ -0,0 +1,25 @@ + + */ + private static $classMap = [ + 'scheduledQueryRuns' => ScheduledQueryRunService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/SourceService.php b/stripe-php/lib/Service/SourceService.php new file mode 100644 index 0000000..ccef3c9 --- /dev/null +++ b/stripe-php/lib/Service/SourceService.php @@ -0,0 +1,117 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allSourceTransactions($id, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/sources/%s/source_transactions', $id), $params, $opts); + } + + /** + * Creates a new source object. + * + * @param null|array{amount?: int, currency?: string, customer?: string, expand?: string[], flow?: string, mandate?: array{acceptance?: array{date?: int, ip?: string, offline?: array{contact_email: string}, online?: array{date?: int, ip?: string, user_agent?: string}, status: string, type?: string, user_agent?: string}, amount?: null|int, currency?: string, interval?: string, notification_method?: string}, metadata?: array, original_source?: string, owner?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: string, name?: string, phone?: string}, receiver?: array{refund_attributes_method?: string}, redirect?: array{return_url: string}, source_order?: array{items?: array{amount?: int, currency?: string, description?: string, parent?: string, quantity?: int, type?: string}[], shipping?: array{address: array{city?: string, country?: string, line1: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name?: string, phone?: string, tracking_number?: string}}, statement_descriptor?: string, token?: string, type?: string, usage?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Source + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/sources', $params, $opts); + } + + /** + * Delete a specified source for a given customer. + * + * @param string $parentId + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Account|\Stripe\BankAccount|\Stripe\Card|\Stripe\Source + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function detach($parentId, $id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/customers/%s/sources/%s', $parentId, $id), $params, $opts); + } + + /** + * Retrieves an existing source object. Supply the unique source ID from a source + * creation request and Stripe will return the corresponding up-to-date source + * object information. + * + * @param string $id + * @param null|array{client_secret?: string, expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Source + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/sources/%s', $id), $params, $opts); + } + + /** + * Updates the specified source by setting the values of the parameters passed. Any + * parameters not provided will be left unchanged. + * + * This request accepts the metadata and owner as + * arguments. It is also possible to update type specific information for selected + * payment methods. Please refer to our payment method + * guides for more detail. + * + * @param string $id + * @param null|array{amount?: int, expand?: string[], mandate?: array{acceptance?: array{date?: int, ip?: string, offline?: array{contact_email: string}, online?: array{date?: int, ip?: string, user_agent?: string}, status: string, type?: string, user_agent?: string}, amount?: null|int, currency?: string, interval?: string, notification_method?: string}, metadata?: null|array, owner?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: string, name?: string, phone?: string}, source_order?: array{items?: array{amount?: int, currency?: string, description?: string, parent?: string, quantity?: int, type?: string}[], shipping?: array{address: array{city?: string, country?: string, line1: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name?: string, phone?: string, tracking_number?: string}}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Source + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/sources/%s', $id), $params, $opts); + } + + /** + * Verify a given source. + * + * @param string $id + * @param null|array{expand?: string[], values: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Source + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function verify($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/sources/%s/verify', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/SubscriptionItemService.php b/stripe-php/lib/Service/SubscriptionItemService.php new file mode 100644 index 0000000..b267853 --- /dev/null +++ b/stripe-php/lib/Service/SubscriptionItemService.php @@ -0,0 +1,93 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/subscription_items', $params, $opts); + } + + /** + * Adds a new item to an existing subscription. No existing items will be changed + * or replaced. + * + * @param null|array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], metadata?: array, payment_behavior?: string, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, proration_behavior?: string, proration_date?: int, quantity?: int, subscription: string, tax_rates?: null|string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SubscriptionItem + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/subscription_items', $params, $opts); + } + + /** + * Deletes an item from the subscription. Removing a subscription item from a + * subscription will not cancel the subscription. + * + * @param string $id + * @param null|array{clear_usage?: bool, proration_behavior?: string, proration_date?: int} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SubscriptionItem + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/subscription_items/%s', $id), $params, $opts); + } + + /** + * Retrieves the subscription item with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SubscriptionItem + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/subscription_items/%s', $id), $params, $opts); + } + + /** + * Updates the plan or quantity of an item on a current subscription. + * + * @param string $id + * @param null|array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], metadata?: null|array, off_session?: bool, payment_behavior?: string, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, proration_behavior?: string, proration_date?: int, quantity?: int, tax_rates?: null|string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SubscriptionItem + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/subscription_items/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/SubscriptionScheduleService.php b/stripe-php/lib/Service/SubscriptionScheduleService.php new file mode 100644 index 0000000..69b8f7c --- /dev/null +++ b/stripe-php/lib/Service/SubscriptionScheduleService.php @@ -0,0 +1,118 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/subscription_schedules', $params, $opts); + } + + /** + * Cancels a subscription schedule and its associated subscription immediately (if + * the subscription schedule has an active subscription). A subscription schedule + * can only be canceled if its status is not_started or + * active. + * + * @param string $id + * @param null|array{expand?: string[], invoice_now?: bool, prorate?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SubscriptionSchedule + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/subscription_schedules/%s/cancel', $id), $params, $opts); + } + + /** + * Creates a new subscription schedule object. Each customer can have up to 500 + * active or scheduled subscriptions. + * + * @param null|array{billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, customer?: string, customer_account?: string, default_settings?: array{application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, default_payment_method?: string, description?: null|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, on_behalf_of?: null|string, transfer_data?: null|array{amount_percent?: float, destination: string}}, end_behavior?: string, expand?: string[], from_subscription?: string, metadata?: null|array, phases?: (array{add_invoice_items?: (array{discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, currency?: string, default_payment_method?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], duration?: array{interval: string, interval_count?: int}, end_date?: int, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, items: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: string, proration_behavior?: string, transfer_data?: array{amount_percent?: float, destination: string}, trial?: bool, trial_end?: int})[], start_date?: array|int|string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SubscriptionSchedule + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/subscription_schedules', $params, $opts); + } + + /** + * Releases the subscription schedule immediately, which will stop scheduling of + * its phases, but leave any existing subscription in place. A schedule can only be + * released if its status is not_started or active. If + * the subscription schedule is currently associated with a subscription, releasing + * it will remove its subscription property and set the subscription’s + * ID to the released_subscription property. + * + * @param string $id + * @param null|array{expand?: string[], preserve_cancel_date?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SubscriptionSchedule + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function release($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/subscription_schedules/%s/release', $id), $params, $opts); + } + + /** + * Retrieves the details of an existing subscription schedule. You only need to + * supply the unique subscription schedule identifier that was returned upon + * subscription schedule creation. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SubscriptionSchedule + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/subscription_schedules/%s', $id), $params, $opts); + } + + /** + * Updates an existing subscription schedule. + * + * @param string $id + * @param null|array{default_settings?: array{application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, default_payment_method?: string, description?: null|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, on_behalf_of?: null|string, transfer_data?: null|array{amount_percent?: float, destination: string}}, end_behavior?: string, expand?: string[], metadata?: null|array, phases?: (array{add_invoice_items?: (array{discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, currency?: string, default_payment_method?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], duration?: array{interval: string, interval_count?: int}, end_date?: array|int|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, items: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: string, proration_behavior?: string, start_date?: array|int|string, transfer_data?: array{amount_percent?: float, destination: string}, trial?: bool, trial_end?: array|int|string})[], proration_behavior?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SubscriptionSchedule + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/subscription_schedules/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/SubscriptionService.php b/stripe-php/lib/Service/SubscriptionService.php new file mode 100644 index 0000000..05132de --- /dev/null +++ b/stripe-php/lib/Service/SubscriptionService.php @@ -0,0 +1,241 @@ +status=canceled. + * + * @param null|array{automatic_tax?: array{enabled: bool}, collection_method?: string, created?: array|int, current_period_end?: array|int, current_period_start?: array|int, customer?: string, customer_account?: string, ending_before?: string, expand?: string[], limit?: int, plan?: string, price?: string, starting_after?: string, status?: string, test_clock?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Subscription> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/subscriptions', $params, $opts); + } + + /** + * Cancels a customer’s subscription immediately. The customer won’t be charged + * again for the subscription. After it’s canceled, you can no longer update the + * subscription or its metadata. + * + * Any pending invoice items that you’ve created are still charged at the end of + * the period, unless manually deleted. If you’ve + * set the subscription to cancel at the end of the period, any pending prorations + * are also left in place and collected at the end of the period. But if the + * subscription is set to cancel immediately, pending prorations are removed if + * invoice_now and prorate are both set to true. + * + * By default, upon subscription cancellation, Stripe stops automatic collection of + * all finalized invoices for the customer. This is intended to prevent unexpected + * payment attempts after the customer has canceled a subscription. However, you + * can resume automatic collection of the invoices manually after subscription + * cancellation to have us proceed. Or, you could check for unpaid invoices before + * allowing the customer to cancel the subscription at all. + * + * @param string $id + * @param null|array{cancellation_details?: array{comment?: null|string, feedback?: null|string}, expand?: string[], invoice_now?: bool, prorate?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Subscription + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/subscriptions/%s', $id), $params, $opts); + } + + /** + * Creates a new subscription on an existing customer. Each customer can have up to + * 500 active or scheduled subscriptions. + * + * When you create a subscription with + * collection_method=charge_automatically, the first invoice is + * finalized as part of the request. The payment_behavior parameter + * determines the exact behavior of the initial payment. + * + * To start subscriptions where the first invoice always begins in a + * draft status, use subscription + * schedules instead. Schedules provide the flexibility to model more complex + * billing configurations that change over time. + * + * @param null|array{add_invoice_items?: (array{discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: null|float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, backdate_start_date?: int, billing_cycle_anchor?: int, billing_cycle_anchor_config?: array{day_of_month: int, hour?: int, minute?: int, month?: int, second?: int}, billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, cancel_at?: array|int|string, cancel_at_period_end?: bool, collection_method?: string, currency?: string, customer?: string, customer_account?: string, days_until_due?: int, default_payment_method?: string, default_source?: string, default_tax_rates?: null|string[], description?: string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice_settings?: array{account_tax_ids?: null|string[], issuer?: array{account?: string, type: string}}, items?: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: null|array, off_session?: bool, on_behalf_of?: null|string, payment_behavior?: string, payment_settings?: array{payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string}, network?: string, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, sepa_debit?: null|array{}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[], save_default_payment_method?: string}, pending_invoice_item_interval?: null|array{interval: string, interval_count?: int}, proration_behavior?: string, transfer_data?: array{amount_percent?: float, destination: string}, trial_end?: array|int|string, trial_from_plan?: bool, trial_period_days?: int, trial_settings?: array{end_behavior: array{missing_payment_method: string}}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Subscription + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/subscriptions', $params, $opts); + } + + /** + * Removes the currently applied discount on a subscription. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Discount + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function deleteDiscount($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/subscriptions/%s/discount', $id), $params, $opts); + } + + /** + * Upgrade the billing_mode of an existing subscription. + * + * @param string $id + * @param null|array{billing_mode: array{flexible?: array{proration_discounts?: string}, type: string}, expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Subscription + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function migrate($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/subscriptions/%s/migrate', $id), $params, $opts); + } + + /** + * Initiates resumption of a paused subscription, optionally resetting the billing + * cycle anchor and creating prorations. If a resumption invoice is generated, it + * must be paid or marked uncollectible before the subscription will be unpaused. + * If payment succeeds the subscription will become active, and if + * payment fails the subscription will be past_due. The resumption + * invoice will void automatically if not paid by the expiration date. + * + * @param string $id + * @param null|array{billing_cycle_anchor?: string, expand?: string[], proration_behavior?: string, proration_date?: int} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Subscription + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function resume($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/subscriptions/%s/resume', $id), $params, $opts); + } + + /** + * Retrieves the subscription with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Subscription + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/subscriptions/%s', $id), $params, $opts); + } + + /** + * Search for subscriptions you’ve previously created using Stripe’s Search Query Language. Don’t use + * search in read-after-write flows where strict consistency is necessary. Under + * normal operating conditions, data is searchable in less than a minute. + * Occasionally, propagation of new or updated data can be up to an hour behind + * during outages. Search functionality is not available to merchants in India. + * + * @param null|array{expand?: string[], limit?: int, page?: string, query: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\SearchResult<\Stripe\Subscription> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function search($params = null, $opts = null) + { + return $this->requestSearchResult('get', '/v1/subscriptions/search', $params, $opts); + } + + /** + * Updates an existing subscription to match the specified parameters. When + * changing prices or quantities, we optionally prorate the price we charge next + * month to make up for any price changes. To preview how the proration is + * calculated, use the create + * preview endpoint. + * + * By default, we prorate subscription changes. For example, if a customer signs up + * on May 1 for a 100 price, they’ll be billed + * 100 immediately. If on May 15 they switch to a + * 200 price, then on June 1 they’ll be billed + * 250 (200 for a renewal of her + * subscription, plus a 50 prorating adjustment for half of + * the previous month’s 100 difference). Similarly, a + * downgrade generates a credit that is applied to the next invoice. We also + * prorate when you make quantity changes. + * + * Switching prices does not normally change the billing date or generate an + * immediate charge unless: + * + *
  • The billing interval is changed (for example, from monthly to + * yearly).
  • The subscription moves from free to paid.
  • A trial + * starts or ends.
+ * + * In these cases, we apply a credit for the unused time on the previous price, + * immediately charge the customer using the new price, and reset the billing date. + * Learn about how Stripe + * immediately attempts payment for subscription changes. + * + * If you want to charge for an upgrade immediately, pass + * proration_behavior as always_invoice to create + * prorations, automatically invoice the customer for those proration adjustments, + * and attempt to collect payment. If you pass create_prorations, the + * prorations are created but not automatically invoiced. If you want to bill the + * customer for the prorations before the subscription’s renewal date, you need to + * manually invoice the customer. + * + * If you don’t want to prorate, set the proration_behavior option to + * none. With this option, the customer is billed + * 100 on May 1 and 200 on June 1. + * Similarly, if you set proration_behavior to none when + * switching between different billing intervals (for example, from monthly to + * yearly), we don’t generate any credits for the old subscription’s unused time. + * We still reset the billing date and bill immediately for the new subscription. + * + * Updating the quantity on a subscription many times in an hour may result in rate limiting. If you need to bill for a frequently + * changing quantity, consider integrating usage-based billing instead. + * + * @param string $id + * @param null|array{add_invoice_items?: (array{discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: null|float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, cancel_at?: null|array|int|string, cancel_at_period_end?: bool, cancellation_details?: array{comment?: null|string, feedback?: null|string}, collection_method?: string, days_until_due?: int, default_payment_method?: string, default_source?: null|string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice_settings?: array{account_tax_ids?: null|string[], issuer?: array{account?: string, type: string}}, items?: (array{billing_thresholds?: null|array{usage_gte: int}, clear_usage?: bool, deleted?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], id?: string, metadata?: null|array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: null|array, off_session?: bool, on_behalf_of?: null|string, pause_collection?: null|array{behavior: string, resumes_at?: int}, payment_behavior?: string, payment_settings?: array{payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string}, network?: string, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, sepa_debit?: null|array{}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[], save_default_payment_method?: string}, pending_invoice_item_interval?: null|array{interval: string, interval_count?: int}, proration_behavior?: string, proration_date?: int, transfer_data?: null|array{amount_percent?: float, destination: string}, trial_end?: array|int|string, trial_from_plan?: bool, trial_settings?: array{end_behavior: array{missing_payment_method: string}}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Subscription + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/subscriptions/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Tax/AssociationService.php b/stripe-php/lib/Service/Tax/AssociationService.php new file mode 100644 index 0000000..4501e77 --- /dev/null +++ b/stripe-php/lib/Service/Tax/AssociationService.php @@ -0,0 +1,28 @@ +request('get', '/v1/tax/associations/find', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Tax/CalculationService.php b/stripe-php/lib/Service/Tax/CalculationService.php new file mode 100644 index 0000000..4b5fe18 --- /dev/null +++ b/stripe-php/lib/Service/Tax/CalculationService.php @@ -0,0 +1,63 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allLineItems($id, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/tax/calculations/%s/line_items', $id), $params, $opts); + } + + /** + * Calculates tax based on the input and returns a Tax Calculation + * object. + * + * @param null|array{currency: string, customer?: string, customer_details?: array{address?: array{city?: null|string, country: string, line1?: null|string, line2?: null|string, postal_code?: null|string, state?: null|string}, address_source?: string, ip_address?: string, tax_ids?: array{type: string, value: string}[], taxability_override?: string}, expand?: string[], line_items: array{amount: int, metadata?: array, product?: string, quantity?: int, reference?: string, tax_behavior?: string, tax_code?: string}[], ship_from_details?: array{address: array{city?: null|string, country: string, line1?: null|string, line2?: null|string, postal_code?: null|string, state?: null|string}}, shipping_cost?: array{amount?: int, shipping_rate?: string, tax_behavior?: string, tax_code?: string}, tax_date?: int} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Tax\Calculation + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/tax/calculations', $params, $opts); + } + + /** + * Retrieves a Tax Calculation object, if the calculation hasn’t + * expired. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Tax\Calculation + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/tax/calculations/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Tax/RegistrationService.php b/stripe-php/lib/Service/Tax/RegistrationService.php new file mode 100644 index 0000000..e544f5d --- /dev/null +++ b/stripe-php/lib/Service/Tax/RegistrationService.php @@ -0,0 +1,78 @@ +Registration objects. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string, status?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Tax\Registration> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/tax/registrations', $params, $opts); + } + + /** + * Creates a new Tax Registration object. + * + * @param null|array{active_from: array|int|string, country: string, country_options: array{ae?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, al?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, am?: array{type: string}, ao?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, at?: array{standard?: array{place_of_supply_scheme: string}, type: string}, au?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, aw?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, az?: array{type: string}, ba?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, bb?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, bd?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, be?: array{standard?: array{place_of_supply_scheme: string}, type: string}, bf?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, bg?: array{standard?: array{place_of_supply_scheme: string}, type: string}, bh?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, bj?: array{type: string}, bs?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, by?: array{type: string}, ca?: array{province_standard?: array{province: string}, type: string}, cd?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, ch?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, cl?: array{type: string}, cm?: array{type: string}, co?: array{type: string}, cr?: array{type: string}, cv?: array{type: string}, cy?: array{standard?: array{place_of_supply_scheme: string}, type: string}, cz?: array{standard?: array{place_of_supply_scheme: string}, type: string}, de?: array{standard?: array{place_of_supply_scheme: string}, type: string}, dk?: array{standard?: array{place_of_supply_scheme: string}, type: string}, ec?: array{type: string}, ee?: array{standard?: array{place_of_supply_scheme: string}, type: string}, eg?: array{type: string}, es?: array{standard?: array{place_of_supply_scheme: string}, type: string}, et?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, fi?: array{standard?: array{place_of_supply_scheme: string}, type: string}, fr?: array{standard?: array{place_of_supply_scheme: string}, type: string}, gb?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, ge?: array{type: string}, gn?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, gr?: array{standard?: array{place_of_supply_scheme: string}, type: string}, hr?: array{standard?: array{place_of_supply_scheme: string}, type: string}, hu?: array{standard?: array{place_of_supply_scheme: string}, type: string}, id?: array{type: string}, ie?: array{standard?: array{place_of_supply_scheme: string}, type: string}, in?: array{type: string}, is?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, it?: array{standard?: array{place_of_supply_scheme: string}, type: string}, jp?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, ke?: array{type: string}, kg?: array{type: string}, kh?: array{type: string}, kr?: array{type: string}, kz?: array{type: string}, la?: array{type: string}, lt?: array{standard?: array{place_of_supply_scheme: string}, type: string}, lu?: array{standard?: array{place_of_supply_scheme: string}, type: string}, lv?: array{standard?: array{place_of_supply_scheme: string}, type: string}, ma?: array{type: string}, md?: array{type: string}, me?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, mk?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, mr?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, mt?: array{standard?: array{place_of_supply_scheme: string}, type: string}, mx?: array{type: string}, my?: array{type: string}, ng?: array{type: string}, nl?: array{standard?: array{place_of_supply_scheme: string}, type: string}, no?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, np?: array{type: string}, nz?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, om?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, pe?: array{type: string}, ph?: array{type: string}, pl?: array{standard?: array{place_of_supply_scheme: string}, type: string}, pt?: array{standard?: array{place_of_supply_scheme: string}, type: string}, ro?: array{standard?: array{place_of_supply_scheme: string}, type: string}, rs?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, ru?: array{type: string}, sa?: array{type: string}, se?: array{standard?: array{place_of_supply_scheme: string}, type: string}, sg?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, si?: array{standard?: array{place_of_supply_scheme: string}, type: string}, sk?: array{standard?: array{place_of_supply_scheme: string}, type: string}, sn?: array{type: string}, sr?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, th?: array{type: string}, tj?: array{type: string}, tr?: array{type: string}, tw?: array{type: string}, tz?: array{type: string}, ua?: array{type: string}, ug?: array{type: string}, us?: array{local_amusement_tax?: array{jurisdiction: string}, local_lease_tax?: array{jurisdiction: string}, state: string, state_sales_tax?: array{elections: array{jurisdiction?: string, type: string}[]}, type: string}, uy?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, uz?: array{type: string}, vn?: array{type: string}, za?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, zm?: array{type: string}, zw?: array{standard?: array{place_of_supply_scheme?: string}, type: string}}, expand?: string[], expires_at?: int} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Tax\Registration + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/tax/registrations', $params, $opts); + } + + /** + * Returns a Tax Registration object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Tax\Registration + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/tax/registrations/%s', $id), $params, $opts); + } + + /** + * Updates an existing Tax Registration object. + * + * A registration cannot be deleted after it has been created. If you wish to end a + * registration you may do so by setting expires_at. + * + * @param string $id + * @param null|array{active_from?: array|int|string, expand?: string[], expires_at?: null|array|int|string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Tax\Registration + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/tax/registrations/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Tax/SettingsService.php b/stripe-php/lib/Service/Tax/SettingsService.php new file mode 100644 index 0000000..dc625bb --- /dev/null +++ b/stripe-php/lib/Service/Tax/SettingsService.php @@ -0,0 +1,44 @@ +Settings for a merchant. + * + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Tax\Settings + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($params = null, $opts = null) + { + return $this->request('get', '/v1/tax/settings', $params, $opts); + } + + /** + * Updates Tax Settings parameters used in tax calculations. All + * parameters are editable but none can be removed once set. + * + * @param null|array{defaults?: array{tax_behavior?: string, tax_code?: string}, expand?: string[], head_office?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Tax\Settings + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($params = null, $opts = null) + { + return $this->request('post', '/v1/tax/settings', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Tax/TaxServiceFactory.php b/stripe-php/lib/Service/Tax/TaxServiceFactory.php new file mode 100644 index 0000000..e1629e3 --- /dev/null +++ b/stripe-php/lib/Service/Tax/TaxServiceFactory.php @@ -0,0 +1,33 @@ + + */ + private static $classMap = [ + 'associations' => AssociationService::class, + 'calculations' => CalculationService::class, + 'registrations' => RegistrationService::class, + 'settings' => SettingsService::class, + 'transactions' => TransactionService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/Tax/TransactionService.php b/stripe-php/lib/Service/Tax/TransactionService.php new file mode 100644 index 0000000..bcf3f74 --- /dev/null +++ b/stripe-php/lib/Service/Tax/TransactionService.php @@ -0,0 +1,76 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allLineItems($id, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/tax/transactions/%s/line_items', $id), $params, $opts); + } + + /** + * Creates a Tax Transaction from a calculation, if that calculation hasn’t + * expired. Calculations expire after 90 days. + * + * @param null|array{calculation: string, expand?: string[], metadata?: array, posted_at?: int, reference: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Tax\Transaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function createFromCalculation($params = null, $opts = null) + { + return $this->request('post', '/v1/tax/transactions/create_from_calculation', $params, $opts); + } + + /** + * Partially or fully reverses a previously created Transaction. + * + * @param null|array{expand?: string[], flat_amount?: int, line_items?: array{amount: int, amount_tax: int, metadata?: array, original_line_item: string, quantity?: int, reference: string}[], metadata?: array, mode: string, original_transaction: string, reference: string, shipping_cost?: array{amount: int, amount_tax: int}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Tax\Transaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function createReversal($params = null, $opts = null) + { + return $this->request('post', '/v1/tax/transactions/create_reversal', $params, $opts); + } + + /** + * Retrieves a Tax Transaction object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Tax\Transaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/tax/transactions/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TaxCodeService.php b/stripe-php/lib/Service/TaxCodeService.php new file mode 100644 index 0000000..1766d78 --- /dev/null +++ b/stripe-php/lib/Service/TaxCodeService.php @@ -0,0 +1,46 @@ +all tax codes + * available to add to Products in order to allow specific tax calculations. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\TaxCode> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/tax_codes', $params, $opts); + } + + /** + * Retrieves the details of an existing tax code. Supply the unique tax code ID and + * Stripe will return the corresponding tax code information. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\TaxCode + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/tax_codes/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TaxIdService.php b/stripe-php/lib/Service/TaxIdService.php new file mode 100644 index 0000000..fb2f113 --- /dev/null +++ b/stripe-php/lib/Service/TaxIdService.php @@ -0,0 +1,75 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/tax_ids', $params, $opts); + } + + /** + * Creates a new account or customer tax_id object. + * + * @param null|array{expand?: string[], owner?: array{account?: string, customer?: string, customer_account?: string, type: string}, type: string, value: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\TaxId + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/tax_ids', $params, $opts); + } + + /** + * Deletes an existing account or customer tax_id object. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\TaxId + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/tax_ids/%s', $id), $params, $opts); + } + + /** + * Retrieves an account or customer tax_id object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\TaxId + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/tax_ids/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TaxRateService.php b/stripe-php/lib/Service/TaxRateService.php new file mode 100644 index 0000000..3685070 --- /dev/null +++ b/stripe-php/lib/Service/TaxRateService.php @@ -0,0 +1,76 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/tax_rates', $params, $opts); + } + + /** + * Creates a new tax rate. + * + * @param null|array{active?: bool, country?: string, description?: string, display_name: string, expand?: string[], inclusive: bool, jurisdiction?: string, metadata?: array, percentage: float, state?: string, tax_type?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\TaxRate + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/tax_rates', $params, $opts); + } + + /** + * Retrieves a tax rate with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\TaxRate + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/tax_rates/%s', $id), $params, $opts); + } + + /** + * Updates an existing tax rate. + * + * @param string $id + * @param null|array{active?: bool, country?: string, description?: string, display_name?: string, expand?: string[], jurisdiction?: string, metadata?: null|array, state?: string, tax_type?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\TaxRate + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/tax_rates/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Terminal/ConfigurationService.php b/stripe-php/lib/Service/Terminal/ConfigurationService.php new file mode 100644 index 0000000..49da055 --- /dev/null +++ b/stripe-php/lib/Service/Terminal/ConfigurationService.php @@ -0,0 +1,91 @@ +Configuration objects. + * + * @param null|array{ending_before?: string, expand?: string[], is_account_default?: bool, limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Terminal\Configuration> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/terminal/configurations', $params, $opts); + } + + /** + * Creates a new Configuration object. + * + * @param null|array{bbpos_wisepad3?: array{splashscreen?: null|string}, bbpos_wisepos_e?: array{splashscreen?: null|string}, expand?: string[], name?: string, offline?: null|array{enabled: bool}, reboot_window?: array{end_hour: int, start_hour: int}, stripe_s700?: array{splashscreen?: null|string}, tipping?: null|array{aed?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, aud?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, bgn?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, cad?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, chf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, czk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, dkk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, eur?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gbp?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gip?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, hkd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, huf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, jpy?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, mxn?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, myr?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nok?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nzd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, pln?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, ron?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sek?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sgd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, usd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}}, verifone_p400?: array{splashscreen?: null|string}, wifi?: null|array{enterprise_eap_peap?: array{ca_certificate_file?: string, password: string, ssid: string, username: string}, enterprise_eap_tls?: array{ca_certificate_file?: string, client_certificate_file: string, private_key_file: string, private_key_file_password?: string, ssid: string}, personal_psk?: array{password: string, ssid: string}, type: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Configuration + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/terminal/configurations', $params, $opts); + } + + /** + * Deletes a Configuration object. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Configuration + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/terminal/configurations/%s', $id), $params, $opts); + } + + /** + * Retrieves a Configuration object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Configuration + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/terminal/configurations/%s', $id), $params, $opts); + } + + /** + * Updates a new Configuration object. + * + * @param string $id + * @param null|array{bbpos_wisepad3?: null|array{splashscreen?: null|string}, bbpos_wisepos_e?: null|array{splashscreen?: null|string}, expand?: string[], name?: string, offline?: null|array{enabled: bool}, reboot_window?: null|array{end_hour: int, start_hour: int}, stripe_s700?: null|array{splashscreen?: null|string}, tipping?: null|array{aed?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, aud?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, bgn?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, cad?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, chf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, czk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, dkk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, eur?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gbp?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gip?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, hkd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, huf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, jpy?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, mxn?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, myr?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nok?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nzd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, pln?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, ron?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sek?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sgd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, usd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}}, verifone_p400?: null|array{splashscreen?: null|string}, wifi?: null|array{enterprise_eap_peap?: array{ca_certificate_file?: string, password: string, ssid: string, username: string}, enterprise_eap_tls?: array{ca_certificate_file?: string, client_certificate_file: string, private_key_file: string, private_key_file_password?: string, ssid: string}, personal_psk?: array{password: string, ssid: string}, type: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Configuration + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/terminal/configurations/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Terminal/ConnectionTokenService.php b/stripe-php/lib/Service/Terminal/ConnectionTokenService.php new file mode 100644 index 0000000..4abfaa7 --- /dev/null +++ b/stripe-php/lib/Service/Terminal/ConnectionTokenService.php @@ -0,0 +1,30 @@ +request('post', '/v1/terminal/connection_tokens', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Terminal/LocationService.php b/stripe-php/lib/Service/Terminal/LocationService.php new file mode 100644 index 0000000..8339ea6 --- /dev/null +++ b/stripe-php/lib/Service/Terminal/LocationService.php @@ -0,0 +1,94 @@ +Location objects. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Terminal\Location> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/terminal/locations', $params, $opts); + } + + /** + * Creates a new Location object. For further details, including which + * address fields are required in each country, see the Manage locations guide. + * + * @param null|array{address?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, configuration_overrides?: string, display_name?: string, display_name_kana?: string, display_name_kanji?: string, expand?: string[], metadata?: null|array, phone?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Location + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/terminal/locations', $params, $opts); + } + + /** + * Deletes a Location object. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Location + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/terminal/locations/%s', $id), $params, $opts); + } + + /** + * Retrieves a Location object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Location + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/terminal/locations/%s', $id), $params, $opts); + } + + /** + * Updates a Location object by setting the values of the parameters + * passed. Any parameters not provided will be left unchanged. + * + * @param string $id + * @param null|array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, configuration_overrides?: null|string, display_name?: null|string, display_name_kana?: null|string, display_name_kanji?: null|string, expand?: string[], metadata?: null|array, phone?: null|string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Location + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/terminal/locations/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Terminal/OnboardingLinkService.php b/stripe-php/lib/Service/Terminal/OnboardingLinkService.php new file mode 100644 index 0000000..e6a1e6a --- /dev/null +++ b/stripe-php/lib/Service/Terminal/OnboardingLinkService.php @@ -0,0 +1,29 @@ +OnboardingLink object that contains a redirect_url + * used for onboarding onto Tap to Pay on iPhone. + * + * @param null|array{expand?: string[], link_options: array{apple_terms_and_conditions?: array{allow_relinking?: bool, merchant_display_name: string}}, link_type: string, on_behalf_of?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\OnboardingLink + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/terminal/onboarding_links', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Terminal/ReaderService.php b/stripe-php/lib/Service/Terminal/ReaderService.php new file mode 100644 index 0000000..b02b1f0 --- /dev/null +++ b/stripe-php/lib/Service/Terminal/ReaderService.php @@ -0,0 +1,236 @@ +Reader objects. + * + * @param null|array{device_type?: string, ending_before?: string, expand?: string[], limit?: int, location?: string, serial_number?: string, starting_after?: string, status?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\Terminal\Reader> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/terminal/readers', $params, $opts); + } + + /** + * Cancels the current reader action. See Programmatic + * Cancellation for more details. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancelAction($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/terminal/readers/%s/cancel_action', $id), $params, $opts); + } + + /** + * Initiates an input collection + * flow on a Reader to display input forms and collect information from your + * customers. + * + * @param string $id + * @param null|array{expand?: string[], inputs: array{custom_text: array{description?: string, skip_button?: string, submit_button?: string, title: string}, required?: bool, selection?: array{choices: array{id: string, style?: string, text: string}[]}, toggles?: array{default_value?: string, description?: string, title?: string}[], type: string}[], metadata?: array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function collectInputs($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/terminal/readers/%s/collect_inputs', $id), $params, $opts); + } + + /** + * Initiates a payment flow on a Reader and updates the PaymentIntent with card + * details before manual confirmation. See Collecting + * a Payment method for more details. + * + * @param string $id + * @param null|array{collect_config?: array{allow_redisplay?: string, enable_customer_cancellation?: bool, skip_tipping?: bool, tipping?: array{amount_eligible?: int}}, expand?: string[], payment_intent: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function collectPaymentMethod($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/terminal/readers/%s/collect_payment_method', $id), $params, $opts); + } + + /** + * Finalizes a payment on a Reader. See Confirming + * a Payment for more details. + * + * @param string $id + * @param null|array{confirm_config?: array{return_url?: string}, expand?: string[], payment_intent: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function confirmPaymentIntent($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/terminal/readers/%s/confirm_payment_intent', $id), $params, $opts); + } + + /** + * Creates a new Reader object. + * + * @param null|array{expand?: string[], label?: string, location?: string, metadata?: null|array, registration_code: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/terminal/readers', $params, $opts); + } + + /** + * Deletes a Reader object. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/terminal/readers/%s', $id), $params, $opts); + } + + /** + * Initiates a payment flow on a Reader. See process + * the payment for more details. + * + * @param string $id + * @param null|array{expand?: string[], payment_intent: string, process_config?: array{allow_redisplay?: string, enable_customer_cancellation?: bool, return_url?: string, skip_tipping?: bool, tipping?: array{amount_eligible?: int}}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function processPaymentIntent($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/terminal/readers/%s/process_payment_intent', $id), $params, $opts); + } + + /** + * Initiates a SetupIntent flow on a Reader. See Save + * directly without charging for more details. + * + * @param string $id + * @param null|array{allow_redisplay: string, expand?: string[], process_config?: array{enable_customer_cancellation?: bool}, setup_intent: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function processSetupIntent($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/terminal/readers/%s/process_setup_intent', $id), $params, $opts); + } + + /** + * Initiates an in-person refund on a Reader. See Refund + * an Interac Payment for more details. + * + * @param string $id + * @param null|array{amount?: int, charge?: string, expand?: string[], metadata?: array, payment_intent?: string, refund_application_fee?: bool, refund_payment_config?: array{enable_customer_cancellation?: bool}, reverse_transfer?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function refundPayment($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/terminal/readers/%s/refund_payment', $id), $params, $opts); + } + + /** + * Retrieves a Reader object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/terminal/readers/%s', $id), $params, $opts); + } + + /** + * Sets the reader display to show cart + * details. + * + * @param string $id + * @param null|array{cart?: array{currency: string, line_items: array{amount: int, description: string, quantity: int}[], tax?: int, total: int}, expand?: string[], type: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function setReaderDisplay($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/terminal/readers/%s/set_reader_display', $id), $params, $opts); + } + + /** + * Updates a Reader object by setting the values of the parameters + * passed. Any parameters not provided will be left unchanged. + * + * @param string $id + * @param null|array{expand?: string[], label?: null|string, metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/terminal/readers/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Terminal/TerminalServiceFactory.php b/stripe-php/lib/Service/Terminal/TerminalServiceFactory.php new file mode 100644 index 0000000..69fbc10 --- /dev/null +++ b/stripe-php/lib/Service/Terminal/TerminalServiceFactory.php @@ -0,0 +1,33 @@ + + */ + private static $classMap = [ + 'configurations' => ConfigurationService::class, + 'connectionTokens' => ConnectionTokenService::class, + 'locations' => LocationService::class, + 'onboardingLinks' => OnboardingLinkService::class, + 'readers' => ReaderService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/TestHelpers/ConfirmationTokenService.php b/stripe-php/lib/Service/TestHelpers/ConfirmationTokenService.php new file mode 100644 index 0000000..0b90f8c --- /dev/null +++ b/stripe-php/lib/Service/TestHelpers/ConfirmationTokenService.php @@ -0,0 +1,28 @@ +, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{card?: array{installments?: array{plan: array{count?: int, interval?: string, type: string}}}}, return_url?: string, setup_future_usage?: string, shipping?: array{address: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name: string, phone?: null|string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\ConfirmationToken + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/test_helpers/confirmation_tokens', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TestHelpers/CustomerService.php b/stripe-php/lib/Service/TestHelpers/CustomerService.php new file mode 100644 index 0000000..df6e5c9 --- /dev/null +++ b/stripe-php/lib/Service/TestHelpers/CustomerService.php @@ -0,0 +1,29 @@ +request('post', $this->buildPath('/v1/test_helpers/customers/%s/fund_cash_balance', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TestHelpers/Issuing/AuthorizationService.php b/stripe-php/lib/Service/TestHelpers/Issuing/AuthorizationService.php new file mode 100644 index 0000000..a843304 --- /dev/null +++ b/stripe-php/lib/Service/TestHelpers/Issuing/AuthorizationService.php @@ -0,0 +1,126 @@ +request('post', $this->buildPath('/v1/test_helpers/issuing/authorizations/%s/capture', $id), $params, $opts); + } + + /** + * Create a test-mode authorization. + * + * @param null|array{amount?: int, amount_details?: array{atm_fee?: int, cashback_amount?: int}, authorization_method?: string, card: string, currency?: string, expand?: string[], fleet?: array{cardholder_prompt_data?: array{driver_id?: string, odometer?: int, unspecified_id?: string, user_id?: string, vehicle_number?: string}, purchase_type?: string, reported_breakdown?: array{fuel?: array{gross_amount_decimal?: string}, non_fuel?: array{gross_amount_decimal?: string}, tax?: array{local_amount_decimal?: string, national_amount_decimal?: string}}, service_type?: string}, fraud_disputability_likelihood?: string, fuel?: array{industry_product_code?: string, quantity_decimal?: string, type?: string, unit?: string, unit_cost_decimal?: string}, is_amount_controllable?: bool, merchant_amount?: int, merchant_currency?: string, merchant_data?: array{category?: string, city?: string, country?: string, name?: string, network_id?: string, postal_code?: string, state?: string, terminal_id?: string, url?: string}, network_data?: array{acquiring_institution_id?: string}, risk_assessment?: array{card_testing_risk?: array{invalid_account_number_decline_rate_past_hour?: int, invalid_credentials_decline_rate_past_hour?: int, risk_level: string}, fraud_risk?: array{level: string, score?: float}, merchant_dispute_risk?: array{dispute_rate?: int, risk_level: string}}, verification_data?: array{address_line1_check?: string, address_postal_code_check?: string, authentication_exemption?: array{claimed_by: string, type: string}, cvc_check?: string, expiry_check?: string, three_d_secure?: array{result: string}}, wallet?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Authorization + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/test_helpers/issuing/authorizations', $params, $opts); + } + + /** + * Expire a test-mode Authorization. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Authorization + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function expire($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/issuing/authorizations/%s/expire', $id), $params, $opts); + } + + /** + * Finalize the amount on an Authorization prior to capture, when the initial + * authorization was for an estimated amount. + * + * @param string $id + * @param null|array{expand?: string[], final_amount: int, fleet?: array{cardholder_prompt_data?: array{driver_id?: string, odometer?: int, unspecified_id?: string, user_id?: string, vehicle_number?: string}, purchase_type?: string, reported_breakdown?: array{fuel?: array{gross_amount_decimal?: string}, non_fuel?: array{gross_amount_decimal?: string}, tax?: array{local_amount_decimal?: string, national_amount_decimal?: string}}, service_type?: string}, fuel?: array{industry_product_code?: string, quantity_decimal?: string, type?: string, unit?: string, unit_cost_decimal?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Authorization + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function finalizeAmount($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/issuing/authorizations/%s/finalize_amount', $id), $params, $opts); + } + + /** + * Increment a test-mode Authorization. + * + * @param string $id + * @param null|array{expand?: string[], increment_amount: int, is_amount_controllable?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Authorization + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function increment($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/issuing/authorizations/%s/increment', $id), $params, $opts); + } + + /** + * Respond to a fraud challenge on a testmode Issuing authorization, simulating + * either a confirmation of fraud or a correction of legitimacy. + * + * @param string $id + * @param null|array{confirmed: bool, expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Authorization + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function respond($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/issuing/authorizations/%s/fraud_challenges/respond', $id), $params, $opts); + } + + /** + * Reverse a test-mode Authorization. + * + * @param string $id + * @param null|array{expand?: string[], reverse_amount?: int} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Authorization + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function reverse($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/issuing/authorizations/%s/reverse', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TestHelpers/Issuing/CardService.php b/stripe-php/lib/Service/TestHelpers/Issuing/CardService.php new file mode 100644 index 0000000..bacfabf --- /dev/null +++ b/stripe-php/lib/Service/TestHelpers/Issuing/CardService.php @@ -0,0 +1,99 @@ +Card object to + * delivered. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Card + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function deliverCard($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/issuing/cards/%s/shipping/deliver', $id), $params, $opts); + } + + /** + * Updates the shipping status of the specified Issuing Card object to + * failure. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Card + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function failCard($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/issuing/cards/%s/shipping/fail', $id), $params, $opts); + } + + /** + * Updates the shipping status of the specified Issuing Card object to + * returned. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Card + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function returnCard($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/issuing/cards/%s/shipping/return', $id), $params, $opts); + } + + /** + * Updates the shipping status of the specified Issuing Card object to + * shipped. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Card + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function shipCard($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/issuing/cards/%s/shipping/ship', $id), $params, $opts); + } + + /** + * Updates the shipping status of the specified Issuing Card object to + * submitted. This method requires Stripe Version ‘2024-09-30.acacia’ + * or later. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Card + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function submitCard($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/issuing/cards/%s/shipping/submit', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TestHelpers/Issuing/IssuingServiceFactory.php b/stripe-php/lib/Service/TestHelpers/Issuing/IssuingServiceFactory.php new file mode 100644 index 0000000..c622414 --- /dev/null +++ b/stripe-php/lib/Service/TestHelpers/Issuing/IssuingServiceFactory.php @@ -0,0 +1,31 @@ + + */ + private static $classMap = [ + 'authorizations' => AuthorizationService::class, + 'cards' => CardService::class, + 'personalizationDesigns' => PersonalizationDesignService::class, + 'transactions' => TransactionService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/TestHelpers/Issuing/PersonalizationDesignService.php b/stripe-php/lib/Service/TestHelpers/Issuing/PersonalizationDesignService.php new file mode 100644 index 0000000..3c3292a --- /dev/null +++ b/stripe-php/lib/Service/TestHelpers/Issuing/PersonalizationDesignService.php @@ -0,0 +1,64 @@ +status of the specified testmode personalization design + * object to active. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\PersonalizationDesign + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function activate($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/issuing/personalization_designs/%s/activate', $id), $params, $opts); + } + + /** + * Updates the status of the specified testmode personalization design + * object to inactive. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\PersonalizationDesign + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function deactivate($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/issuing/personalization_designs/%s/deactivate', $id), $params, $opts); + } + + /** + * Updates the status of the specified testmode personalization design + * object to rejected. + * + * @param string $id + * @param null|array{expand?: string[], rejection_reasons: array{card_logo?: string[], carrier_text?: string[]}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\PersonalizationDesign + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function reject($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/issuing/personalization_designs/%s/reject', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TestHelpers/Issuing/TransactionService.php b/stripe-php/lib/Service/TestHelpers/Issuing/TransactionService.php new file mode 100644 index 0000000..e5fc090 --- /dev/null +++ b/stripe-php/lib/Service/TestHelpers/Issuing/TransactionService.php @@ -0,0 +1,59 @@ +request('post', '/v1/test_helpers/issuing/transactions/create_force_capture', $params, $opts); + } + + /** + * Allows the user to refund an arbitrary amount, also known as a unlinked refund. + * + * @param null|array{amount: int, card: string, currency?: string, expand?: string[], merchant_data?: array{category?: string, city?: string, country?: string, name?: string, network_id?: string, postal_code?: string, state?: string, terminal_id?: string, url?: string}, purchase_details?: array{fleet?: array{cardholder_prompt_data?: array{driver_id?: string, odometer?: int, unspecified_id?: string, user_id?: string, vehicle_number?: string}, purchase_type?: string, reported_breakdown?: array{fuel?: array{gross_amount_decimal?: string}, non_fuel?: array{gross_amount_decimal?: string}, tax?: array{local_amount_decimal?: string, national_amount_decimal?: string}}, service_type?: string}, flight?: array{departure_at?: int, passenger_name?: string, refundable?: bool, segments?: array{arrival_airport_code?: string, carrier?: string, departure_airport_code?: string, flight_number?: string, service_class?: string, stopover_allowed?: bool}[], travel_agency?: string}, fuel?: array{industry_product_code?: string, quantity_decimal?: string, type?: string, unit?: string, unit_cost_decimal?: string}, lodging?: array{check_in_at?: int, nights?: int}, receipt?: array{description?: string, quantity?: string, total?: int, unit_cost?: int}[], reference?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Transaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function createUnlinkedRefund($params = null, $opts = null) + { + return $this->request('post', '/v1/test_helpers/issuing/transactions/create_unlinked_refund', $params, $opts); + } + + /** + * Refund a test-mode Transaction. + * + * @param string $id + * @param null|array{expand?: string[], refund_amount?: int} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Issuing\Transaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function refund($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/issuing/transactions/%s/refund', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TestHelpers/RefundService.php b/stripe-php/lib/Service/TestHelpers/RefundService.php new file mode 100644 index 0000000..f671362 --- /dev/null +++ b/stripe-php/lib/Service/TestHelpers/RefundService.php @@ -0,0 +1,29 @@ +requires_action. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Refund + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function expire($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/refunds/%s/expire', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TestHelpers/Terminal/ReaderService.php b/stripe-php/lib/Service/TestHelpers/Terminal/ReaderService.php new file mode 100644 index 0000000..dce3268 --- /dev/null +++ b/stripe-php/lib/Service/TestHelpers/Terminal/ReaderService.php @@ -0,0 +1,64 @@ +request('post', $this->buildPath('/v1/test_helpers/terminal/readers/%s/present_payment_method', $id), $params, $opts); + } + + /** + * Use this endpoint to trigger a successful input collection on a simulated + * reader. + * + * @param string $id + * @param null|array{expand?: string[], skip_non_required_inputs?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function succeedInputCollection($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/terminal/readers/%s/succeed_input_collection', $id), $params, $opts); + } + + /** + * Use this endpoint to complete an input collection with a timeout error on a + * simulated reader. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Terminal\Reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function timeoutInputCollection($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/terminal/readers/%s/timeout_input_collection', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TestHelpers/Terminal/TerminalServiceFactory.php b/stripe-php/lib/Service/TestHelpers/Terminal/TerminalServiceFactory.php new file mode 100644 index 0000000..153ebe0 --- /dev/null +++ b/stripe-php/lib/Service/TestHelpers/Terminal/TerminalServiceFactory.php @@ -0,0 +1,25 @@ + + */ + private static $classMap = [ + 'readers' => ReaderService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/TestHelpers/TestClockService.php b/stripe-php/lib/Service/TestHelpers/TestClockService.php new file mode 100644 index 0000000..7d47271 --- /dev/null +++ b/stripe-php/lib/Service/TestHelpers/TestClockService.php @@ -0,0 +1,92 @@ +Ready. + * + * @param string $id + * @param null|array{expand?: string[], frozen_time: int} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\TestHelpers\TestClock + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function advance($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/test_clocks/%s/advance', $id), $params, $opts); + } + + /** + * Returns a list of your test clocks. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\TestHelpers\TestClock> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/test_helpers/test_clocks', $params, $opts); + } + + /** + * Creates a new test clock that can be attached to new customers and quotes. + * + * @param null|array{expand?: string[], frozen_time: int, name?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\TestHelpers\TestClock + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/test_helpers/test_clocks', $params, $opts); + } + + /** + * Deletes a test clock. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\TestHelpers\TestClock + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/test_helpers/test_clocks/%s', $id), $params, $opts); + } + + /** + * Retrieves a test clock. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\TestHelpers\TestClock + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/test_helpers/test_clocks/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TestHelpers/TestHelpersServiceFactory.php b/stripe-php/lib/Service/TestHelpers/TestHelpersServiceFactory.php new file mode 100644 index 0000000..038a565 --- /dev/null +++ b/stripe-php/lib/Service/TestHelpers/TestHelpersServiceFactory.php @@ -0,0 +1,37 @@ + + */ + private static $classMap = [ + 'confirmationTokens' => ConfirmationTokenService::class, + 'customers' => CustomerService::class, + 'issuing' => Issuing\IssuingServiceFactory::class, + 'refunds' => RefundService::class, + 'terminal' => Terminal\TerminalServiceFactory::class, + 'testClocks' => TestClockService::class, + 'treasury' => Treasury\TreasuryServiceFactory::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/TestHelpers/Treasury/InboundTransferService.php b/stripe-php/lib/Service/TestHelpers/Treasury/InboundTransferService.php new file mode 100644 index 0000000..5b3b25b --- /dev/null +++ b/stripe-php/lib/Service/TestHelpers/Treasury/InboundTransferService.php @@ -0,0 +1,67 @@ +failed + * status. The InboundTransfer must already be in the processing + * state. + * + * @param string $id + * @param null|array{expand?: string[], failure_details?: array{code?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\InboundTransfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function fail($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/inbound_transfers/%s/fail', $id), $params, $opts); + } + + /** + * Marks the test mode InboundTransfer object as returned and links the + * InboundTransfer to a ReceivedDebit. The InboundTransfer must already be in the + * succeeded state. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\InboundTransfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function returnInboundTransfer($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/inbound_transfers/%s/return', $id), $params, $opts); + } + + /** + * Transitions a test mode created InboundTransfer to the succeeded + * status. The InboundTransfer must already be in the processing + * state. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\InboundTransfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function succeed($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/inbound_transfers/%s/succeed', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TestHelpers/Treasury/OutboundPaymentService.php b/stripe-php/lib/Service/TestHelpers/Treasury/OutboundPaymentService.php new file mode 100644 index 0000000..db838a8 --- /dev/null +++ b/stripe-php/lib/Service/TestHelpers/Treasury/OutboundPaymentService.php @@ -0,0 +1,85 @@ +failed + * status. The OutboundPayment must already be in the processing + * state. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\OutboundPayment + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function fail($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/outbound_payments/%s/fail', $id), $params, $opts); + } + + /** + * Transitions a test mode created OutboundPayment to the posted + * status. The OutboundPayment must already be in the processing + * state. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\OutboundPayment + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function post($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/outbound_payments/%s/post', $id), $params, $opts); + } + + /** + * Transitions a test mode created OutboundPayment to the returned + * status. The OutboundPayment must already be in the processing + * state. + * + * @param string $id + * @param null|array{expand?: string[], returned_details?: array{code?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\OutboundPayment + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function returnOutboundPayment($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/outbound_payments/%s/return', $id), $params, $opts); + } + + /** + * Updates a test mode created OutboundPayment with tracking details. The + * OutboundPayment must not be cancelable, and cannot be in the + * canceled or failed states. + * + * @param string $id + * @param null|array{expand?: string[], tracking_details: array{ach?: array{trace_id: string}, type: string, us_domestic_wire?: array{chips?: string, imad?: string, omad?: string}}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\OutboundPayment + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/outbound_payments/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TestHelpers/Treasury/OutboundTransferService.php b/stripe-php/lib/Service/TestHelpers/Treasury/OutboundTransferService.php new file mode 100644 index 0000000..0286991 --- /dev/null +++ b/stripe-php/lib/Service/TestHelpers/Treasury/OutboundTransferService.php @@ -0,0 +1,85 @@ +failed + * status. The OutboundTransfer must already be in the processing + * state. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\OutboundTransfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function fail($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/outbound_transfers/%s/fail', $id), $params, $opts); + } + + /** + * Transitions a test mode created OutboundTransfer to the posted + * status. The OutboundTransfer must already be in the processing + * state. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\OutboundTransfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function post($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/outbound_transfers/%s/post', $id), $params, $opts); + } + + /** + * Transitions a test mode created OutboundTransfer to the returned + * status. The OutboundTransfer must already be in the processing + * state. + * + * @param string $id + * @param null|array{expand?: string[], returned_details?: array{code?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\OutboundTransfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function returnOutboundTransfer($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/outbound_transfers/%s/return', $id), $params, $opts); + } + + /** + * Updates a test mode created OutboundTransfer with tracking details. The + * OutboundTransfer must not be cancelable, and cannot be in the + * canceled or failed states. + * + * @param string $id + * @param null|array{expand?: string[], tracking_details: array{ach?: array{trace_id: string}, type: string, us_domestic_wire?: array{chips?: string, imad?: string, omad?: string}}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\OutboundTransfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/test_helpers/treasury/outbound_transfers/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedCreditService.php b/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedCreditService.php new file mode 100644 index 0000000..ed0e5f0 --- /dev/null +++ b/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedCreditService.php @@ -0,0 +1,30 @@ +request('post', '/v1/test_helpers/treasury/received_credits', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedDebitService.php b/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedDebitService.php new file mode 100644 index 0000000..5555d2e --- /dev/null +++ b/stripe-php/lib/Service/TestHelpers/Treasury/ReceivedDebitService.php @@ -0,0 +1,30 @@ +request('post', '/v1/test_helpers/treasury/received_debits', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TestHelpers/Treasury/TreasuryServiceFactory.php b/stripe-php/lib/Service/TestHelpers/Treasury/TreasuryServiceFactory.php new file mode 100644 index 0000000..8329a53 --- /dev/null +++ b/stripe-php/lib/Service/TestHelpers/Treasury/TreasuryServiceFactory.php @@ -0,0 +1,33 @@ + + */ + private static $classMap = [ + 'inboundTransfers' => InboundTransferService::class, + 'outboundPayments' => OutboundPaymentService::class, + 'outboundTransfers' => OutboundTransferService::class, + 'receivedCredits' => ReceivedCreditService::class, + 'receivedDebits' => ReceivedDebitService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/TokenService.php b/stripe-php/lib/Service/TokenService.php new file mode 100644 index 0000000..f5fb1da --- /dev/null +++ b/stripe-php/lib/Service/TokenService.php @@ -0,0 +1,49 @@ +connected + * account where controller.requirement_collection + * is application, which includes Custom accounts. + * + * @param null|array{account?: array{business_type?: string, company?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, directors_provided?: bool, directorship_declaration?: array{date?: int, ip?: string, user_agent?: string}, executives_provided?: bool, export_license_id?: string, export_purpose_code?: string, name?: string, name_kana?: string, name_kanji?: string, owners_provided?: bool, ownership_declaration?: array{date?: int, ip?: string, user_agent?: string}, ownership_declaration_shown_and_signed?: bool, ownership_exemption_reason?: null|string, phone?: string, registration_date?: null|array{day: int, month: int, year: int}, registration_number?: string, representative_declaration?: array{date?: int, ip?: string, user_agent?: string}, structure?: null|string, tax_id?: string, tax_id_registrar?: string, vat_id?: string, verification?: array{document?: array{back?: string, front?: string}}}, individual?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, dob?: null|array{day: int, month: int, year: int}, email?: string, first_name?: string, first_name_kana?: string, first_name_kanji?: string, full_name_aliases?: null|string[], gender?: string, id_number?: string, id_number_secondary?: string, last_name?: string, last_name_kana?: string, last_name_kanji?: string, maiden_name?: string, metadata?: null|array, phone?: string, political_exposure?: string, registered_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: null|float, title?: string}, ssn_last_4?: string, verification?: array{additional_document?: array{back?: string, front?: string}, document?: array{back?: string, front?: string}}}, tos_shown_and_accepted?: bool}, bank_account?: array{account_holder_name?: string, account_holder_type?: string, account_number: string, account_type?: string, country: string, currency?: string, payment_method?: string, routing_number?: string}, card?: array|string, customer?: string, cvc_update?: array{cvc: string}, expand?: string[], person?: array{additional_tos_acceptances?: array{account?: array{date?: int, ip?: string, user_agent?: null|string}}, address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, dob?: null|array{day: int, month: int, year: int}, documents?: array{company_authorization?: array{files?: string[]}, passport?: array{files?: string[]}, visa?: array{files?: string[]}}, email?: string, first_name?: string, first_name_kana?: string, first_name_kanji?: string, full_name_aliases?: null|string[], gender?: string, id_number?: string, id_number_secondary?: string, last_name?: string, last_name_kana?: string, last_name_kanji?: string, maiden_name?: string, metadata?: null|array, nationality?: string, phone?: string, political_exposure?: string, registered_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, relationship?: array{authorizer?: bool, director?: bool, executive?: bool, legal_guardian?: bool, owner?: bool, percent_ownership?: null|float, representative?: bool, title?: string}, ssn_last_4?: string, us_cfpb_data?: array{ethnicity_details?: array{ethnicity?: string[], ethnicity_other?: string}, race_details?: array{race?: string[], race_other?: string}, self_identified_gender?: string}, verification?: array{additional_document?: array{back?: string, front?: string}, document?: array{back?: string, front?: string}}}, pii?: array{id_number?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Token + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/tokens', $params, $opts); + } + + /** + * Retrieves the token with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Token + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/tokens/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TopupService.php b/stripe-php/lib/Service/TopupService.php new file mode 100644 index 0000000..d7cb146 --- /dev/null +++ b/stripe-php/lib/Service/TopupService.php @@ -0,0 +1,94 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/topups', $params, $opts); + } + + /** + * Cancels a top-up. Only pending top-ups can be canceled. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Topup + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/topups/%s/cancel', $id), $params, $opts); + } + + /** + * Top up the balance of an account. + * + * @param null|array{amount: int, currency: string, description?: string, expand?: string[], metadata?: null|array, source?: string, statement_descriptor?: string, transfer_group?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Topup + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/topups', $params, $opts); + } + + /** + * Retrieves the details of a top-up that has previously been created. Supply the + * unique top-up ID that was returned from your previous request, and Stripe will + * return the corresponding top-up information. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Topup + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/topups/%s', $id), $params, $opts); + } + + /** + * Updates the metadata of a top-up. Other top-up details are not editable by + * design. + * + * @param string $id + * @param null|array{description?: string, expand?: string[], metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Topup + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/topups/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/TransferService.php b/stripe-php/lib/Service/TransferService.php new file mode 100644 index 0000000..71c2661 --- /dev/null +++ b/stripe-php/lib/Service/TransferService.php @@ -0,0 +1,166 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/transfers', $params, $opts); + } + + /** + * You can see a list of the reversals belonging to a specific transfer. Note that + * the 10 most recent reversals are always available by default on the transfer + * object. If you need more than those 10, you can use this API method and the + * limit and starting_after parameters to page through + * additional reversals. + * + * @param string $parentId + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Collection<\Stripe\TransferReversal> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function allReversals($parentId, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v1/transfers/%s/reversals', $parentId), $params, $opts); + } + + /** + * To send funds from your Stripe account to a connected account, you create a new + * transfer object. Your Stripe balance must be able to + * cover the transfer amount, or you’ll receive an “Insufficient Funds” error. + * + * @param null|array{amount?: int, currency: string, description?: string, destination: string, expand?: string[], metadata?: array, source_transaction?: string, source_type?: string, transfer_group?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Transfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/transfers', $params, $opts); + } + + /** + * When you create a new reversal, you must specify a transfer to create it on. + * + * When reversing transfers, you can optionally reverse part of the transfer. You + * can do so as many times as you wish until the entire transfer has been reversed. + * + * Once entirely reversed, a transfer can’t be reversed again. This method will + * return an error when called on an already-reversed transfer, or when trying to + * reverse more money than is left on a transfer. + * + * @param string $parentId + * @param null|array{amount?: int, description?: string, expand?: string[], metadata?: null|array, refund_application_fee?: bool} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\TransferReversal + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function createReversal($parentId, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/transfers/%s/reversals', $parentId), $params, $opts); + } + + /** + * Retrieves the details of an existing transfer. Supply the unique transfer ID + * from either a transfer creation request or the transfer list, and Stripe will + * return the corresponding transfer information. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Transfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/transfers/%s', $id), $params, $opts); + } + + /** + * By default, you can see the 10 most recent reversals stored directly on the + * transfer object, but you can also retrieve details about a specific reversal + * stored on the transfer. + * + * @param string $parentId + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\TransferReversal + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieveReversal($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/transfers/%s/reversals/%s', $parentId, $id), $params, $opts); + } + + /** + * Updates the specified transfer by setting the values of the parameters passed. + * Any parameters not provided will be left unchanged. + * + * This request accepts only metadata as an argument. + * + * @param string $id + * @param null|array{description?: string, expand?: string[], metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Transfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/transfers/%s', $id), $params, $opts); + } + + /** + * Updates the specified reversal by setting the values of the parameters passed. + * Any parameters not provided will be left unchanged. + * + * This request only accepts metadata and description as arguments. + * + * @param string $parentId + * @param string $id + * @param null|array{expand?: string[], metadata?: null|array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\TransferReversal + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function updateReversal($parentId, $id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/transfers/%s/reversals/%s', $parentId, $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Treasury/CreditReversalService.php b/stripe-php/lib/Service/Treasury/CreditReversalService.php new file mode 100644 index 0000000..d37fcde --- /dev/null +++ b/stripe-php/lib/Service/Treasury/CreditReversalService.php @@ -0,0 +1,61 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/treasury/credit_reversals', $params, $opts); + } + + /** + * Reverses a ReceivedCredit and creates a CreditReversal object. + * + * @param null|array{expand?: string[], metadata?: array, received_credit: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\CreditReversal + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/treasury/credit_reversals', $params, $opts); + } + + /** + * Retrieves the details of an existing CreditReversal by passing the unique + * CreditReversal ID from either the CreditReversal creation request or + * CreditReversal list. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\CreditReversal + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/treasury/credit_reversals/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Treasury/DebitReversalService.php b/stripe-php/lib/Service/Treasury/DebitReversalService.php new file mode 100644 index 0000000..611783e --- /dev/null +++ b/stripe-php/lib/Service/Treasury/DebitReversalService.php @@ -0,0 +1,59 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/treasury/debit_reversals', $params, $opts); + } + + /** + * Reverses a ReceivedDebit and creates a DebitReversal object. + * + * @param null|array{expand?: string[], metadata?: array, received_debit: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\DebitReversal + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/treasury/debit_reversals', $params, $opts); + } + + /** + * Retrieves a DebitReversal object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\DebitReversal + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/treasury/debit_reversals/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Treasury/FinancialAccountService.php b/stripe-php/lib/Service/Treasury/FinancialAccountService.php new file mode 100644 index 0000000..7478070 --- /dev/null +++ b/stripe-php/lib/Service/Treasury/FinancialAccountService.php @@ -0,0 +1,126 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/treasury/financial_accounts', $params, $opts); + } + + /** + * Closes a FinancialAccount. A FinancialAccount can only be closed if it has a + * zero balance, has no pending InboundTransfers, and has canceled all attached + * Issuing cards. + * + * @param string $id + * @param null|array{expand?: string[], forwarding_settings?: array{financial_account?: string, payment_method?: string, type: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\FinancialAccount + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function close($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/treasury/financial_accounts/%s/close', $id), $params, $opts); + } + + /** + * Creates a new FinancialAccount. Each connected account can have up to three + * FinancialAccounts by default. + * + * @param null|array{expand?: string[], features?: array{card_issuing?: array{requested: bool}, deposit_insurance?: array{requested: bool}, financial_addresses?: array{aba?: array{requested: bool}}, inbound_transfers?: array{ach?: array{requested: bool}}, intra_stripe_flows?: array{requested: bool}, outbound_payments?: array{ach?: array{requested: bool}, us_domestic_wire?: array{requested: bool}}, outbound_transfers?: array{ach?: array{requested: bool}, us_domestic_wire?: array{requested: bool}}}, metadata?: array, nickname?: null|string, platform_restrictions?: array{inbound_flows?: string, outbound_flows?: string}, supported_currencies: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\FinancialAccount + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/treasury/financial_accounts', $params, $opts); + } + + /** + * Retrieves the details of a FinancialAccount. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\FinancialAccount + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/treasury/financial_accounts/%s', $id), $params, $opts); + } + + /** + * Retrieves Features information associated with the FinancialAccount. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\FinancialAccountFeatures + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieveFeatures($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/treasury/financial_accounts/%s/features', $id), $params, $opts); + } + + /** + * Updates the details of a FinancialAccount. + * + * @param string $id + * @param null|array{expand?: string[], features?: array{card_issuing?: array{requested: bool}, deposit_insurance?: array{requested: bool}, financial_addresses?: array{aba?: array{requested: bool}}, inbound_transfers?: array{ach?: array{requested: bool}}, intra_stripe_flows?: array{requested: bool}, outbound_payments?: array{ach?: array{requested: bool}, us_domestic_wire?: array{requested: bool}}, outbound_transfers?: array{ach?: array{requested: bool}, us_domestic_wire?: array{requested: bool}}}, forwarding_settings?: array{financial_account?: string, payment_method?: string, type: string}, metadata?: array, nickname?: null|string, platform_restrictions?: array{inbound_flows?: string, outbound_flows?: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\FinancialAccount + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/treasury/financial_accounts/%s', $id), $params, $opts); + } + + /** + * Updates the Features associated with a FinancialAccount. + * + * @param string $id + * @param null|array{card_issuing?: array{requested: bool}, deposit_insurance?: array{requested: bool}, expand?: string[], financial_addresses?: array{aba?: array{requested: bool}}, inbound_transfers?: array{ach?: array{requested: bool}}, intra_stripe_flows?: array{requested: bool}, outbound_payments?: array{ach?: array{requested: bool}, us_domestic_wire?: array{requested: bool}}, outbound_transfers?: array{ach?: array{requested: bool}, us_domestic_wire?: array{requested: bool}}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\FinancialAccountFeatures + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function updateFeatures($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/treasury/financial_accounts/%s/features', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Treasury/InboundTransferService.php b/stripe-php/lib/Service/Treasury/InboundTransferService.php new file mode 100644 index 0000000..d76c81c --- /dev/null +++ b/stripe-php/lib/Service/Treasury/InboundTransferService.php @@ -0,0 +1,75 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/treasury/inbound_transfers', $params, $opts); + } + + /** + * Cancels an InboundTransfer. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\InboundTransfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/treasury/inbound_transfers/%s/cancel', $id), $params, $opts); + } + + /** + * Creates an InboundTransfer. + * + * @param null|array{amount: int, currency: string, description?: string, expand?: string[], financial_account: string, metadata?: array, origin_payment_method: string, statement_descriptor?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\InboundTransfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/treasury/inbound_transfers', $params, $opts); + } + + /** + * Retrieves the details of an existing InboundTransfer. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\InboundTransfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/treasury/inbound_transfers/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Treasury/OutboundPaymentService.php b/stripe-php/lib/Service/Treasury/OutboundPaymentService.php new file mode 100644 index 0000000..4c600dd --- /dev/null +++ b/stripe-php/lib/Service/Treasury/OutboundPaymentService.php @@ -0,0 +1,77 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/treasury/outbound_payments', $params, $opts); + } + + /** + * Cancel an OutboundPayment. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\OutboundPayment + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/treasury/outbound_payments/%s/cancel', $id), $params, $opts); + } + + /** + * Creates an OutboundPayment. + * + * @param null|array{amount: int, currency: string, customer?: string, description?: string, destination_payment_method?: string, destination_payment_method_data?: array{billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string}, financial_account?: string, metadata?: array, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}}, destination_payment_method_options?: array{us_bank_account?: null|array{network?: string}}, end_user_details?: array{ip_address?: string, present: bool}, expand?: string[], financial_account: string, metadata?: array, statement_descriptor?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\OutboundPayment + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/treasury/outbound_payments', $params, $opts); + } + + /** + * Retrieves the details of an existing OutboundPayment by passing the unique + * OutboundPayment ID from either the OutboundPayment creation request or + * OutboundPayment list. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\OutboundPayment + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/treasury/outbound_payments/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Treasury/OutboundTransferService.php b/stripe-php/lib/Service/Treasury/OutboundTransferService.php new file mode 100644 index 0000000..7437e56 --- /dev/null +++ b/stripe-php/lib/Service/Treasury/OutboundTransferService.php @@ -0,0 +1,77 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/treasury/outbound_transfers', $params, $opts); + } + + /** + * An OutboundTransfer can be canceled if the funds have not yet been paid out. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\OutboundTransfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancel($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/treasury/outbound_transfers/%s/cancel', $id), $params, $opts); + } + + /** + * Creates an OutboundTransfer. + * + * @param null|array{amount: int, currency: string, description?: string, destination_payment_method?: string, destination_payment_method_data?: array{financial_account?: string, type: string}, destination_payment_method_options?: array{us_bank_account?: null|array{network?: string}}, expand?: string[], financial_account: string, metadata?: array, statement_descriptor?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\OutboundTransfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/treasury/outbound_transfers', $params, $opts); + } + + /** + * Retrieves the details of an existing OutboundTransfer by passing the unique + * OutboundTransfer ID from either the OutboundTransfer creation request or + * OutboundTransfer list. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\OutboundTransfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/treasury/outbound_transfers/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Treasury/ReceivedCreditService.php b/stripe-php/lib/Service/Treasury/ReceivedCreditService.php new file mode 100644 index 0000000..a42e099 --- /dev/null +++ b/stripe-php/lib/Service/Treasury/ReceivedCreditService.php @@ -0,0 +1,45 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/treasury/received_credits', $params, $opts); + } + + /** + * Retrieves the details of an existing ReceivedCredit by passing the unique + * ReceivedCredit ID from the ReceivedCredit list. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\ReceivedCredit + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/treasury/received_credits/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Treasury/ReceivedDebitService.php b/stripe-php/lib/Service/Treasury/ReceivedDebitService.php new file mode 100644 index 0000000..a7564e6 --- /dev/null +++ b/stripe-php/lib/Service/Treasury/ReceivedDebitService.php @@ -0,0 +1,45 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/treasury/received_debits', $params, $opts); + } + + /** + * Retrieves the details of an existing ReceivedDebit by passing the unique + * ReceivedDebit ID from the ReceivedDebit list. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\ReceivedDebit + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/treasury/received_debits/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Treasury/TransactionEntryService.php b/stripe-php/lib/Service/Treasury/TransactionEntryService.php new file mode 100644 index 0000000..979fd71 --- /dev/null +++ b/stripe-php/lib/Service/Treasury/TransactionEntryService.php @@ -0,0 +1,44 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/treasury/transaction_entries', $params, $opts); + } + + /** + * Retrieves a TransactionEntry object. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\TransactionEntry + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/treasury/transaction_entries/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Treasury/TransactionService.php b/stripe-php/lib/Service/Treasury/TransactionService.php new file mode 100644 index 0000000..4ef6bec --- /dev/null +++ b/stripe-php/lib/Service/Treasury/TransactionService.php @@ -0,0 +1,44 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/treasury/transactions', $params, $opts); + } + + /** + * Retrieves the details of an existing Transaction. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\Treasury\Transaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/treasury/transactions/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/Treasury/TreasuryServiceFactory.php b/stripe-php/lib/Service/Treasury/TreasuryServiceFactory.php new file mode 100644 index 0000000..a2a2622 --- /dev/null +++ b/stripe-php/lib/Service/Treasury/TreasuryServiceFactory.php @@ -0,0 +1,43 @@ + + */ + private static $classMap = [ + 'creditReversals' => CreditReversalService::class, + 'debitReversals' => DebitReversalService::class, + 'financialAccounts' => FinancialAccountService::class, + 'inboundTransfers' => InboundTransferService::class, + 'outboundPayments' => OutboundPaymentService::class, + 'outboundTransfers' => OutboundTransferService::class, + 'receivedCredits' => ReceivedCreditService::class, + 'receivedDebits' => ReceivedDebitService::class, + 'transactionEntries' => TransactionEntryService::class, + 'transactions' => TransactionService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/V2/Billing/BillingServiceFactory.php b/stripe-php/lib/Service/V2/Billing/BillingServiceFactory.php new file mode 100644 index 0000000..d24e45c --- /dev/null +++ b/stripe-php/lib/Service/V2/Billing/BillingServiceFactory.php @@ -0,0 +1,31 @@ + + */ + private static $classMap = [ + 'meterEventAdjustments' => MeterEventAdjustmentService::class, + 'meterEvents' => MeterEventService::class, + 'meterEventSession' => MeterEventSessionService::class, + 'meterEventStream' => MeterEventStreamService::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/V2/Billing/MeterEventAdjustmentService.php b/stripe-php/lib/Service/V2/Billing/MeterEventAdjustmentService.php new file mode 100644 index 0000000..f4698a6 --- /dev/null +++ b/stripe-php/lib/Service/V2/Billing/MeterEventAdjustmentService.php @@ -0,0 +1,28 @@ +request('post', '/v2/billing/meter_event_adjustments', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/V2/Billing/MeterEventService.php b/stripe-php/lib/Service/V2/Billing/MeterEventService.php new file mode 100644 index 0000000..857f10b --- /dev/null +++ b/stripe-php/lib/Service/V2/Billing/MeterEventService.php @@ -0,0 +1,30 @@ +, timestamp?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Billing\MeterEvent + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v2/billing/meter_events', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/V2/Billing/MeterEventSessionService.php b/stripe-php/lib/Service/V2/Billing/MeterEventSessionService.php new file mode 100644 index 0000000..b46ac83 --- /dev/null +++ b/stripe-php/lib/Service/V2/Billing/MeterEventSessionService.php @@ -0,0 +1,30 @@ +request('post', '/v2/billing/meter_event_session', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/V2/Billing/MeterEventStreamService.php b/stripe-php/lib/Service/V2/Billing/MeterEventStreamService.php new file mode 100644 index 0000000..9d4d3a6 --- /dev/null +++ b/stripe-php/lib/Service/V2/Billing/MeterEventStreamService.php @@ -0,0 +1,34 @@ +, timestamp?: string}[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return void + * + * @throws \Stripe\Exception\TemporarySessionExpiredException + */ + public function create($params = null, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + if (!isset($opts->apiBase)) { + $opts->apiBase = $this->getClient()->getMeterEventsBase(); + } + $this->request('post', '/v2/billing/meter_event_stream', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/V2/Core/AccountLinkService.php b/stripe-php/lib/Service/V2/Core/AccountLinkService.php new file mode 100644 index 0000000..83fd1d7 --- /dev/null +++ b/stripe-php/lib/Service/V2/Core/AccountLinkService.php @@ -0,0 +1,30 @@ +request('post', '/v2/core/account_links', $params, $opts); + } +} diff --git a/stripe-php/lib/Service/V2/Core/AccountService.php b/stripe-php/lib/Service/V2/Core/AccountService.php new file mode 100644 index 0000000..c11e248 --- /dev/null +++ b/stripe-php/lib/Service/V2/Core/AccountService.php @@ -0,0 +1,112 @@ + Accounts\PersonService::class, + 'personTokens' => Accounts\PersonTokenService::class, + ]; + + /** + * Returns a list of Accounts. + * + * @param null|array{applied_configurations?: string[], closed?: bool, limit?: int} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Collection<\Stripe\V2\Core\Account> + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v2/core/accounts', $params, $opts); + } + + /** + * Removes access to the Account and its associated resources. Closed Accounts can + * no longer be operated on, but limited information can still be retrieved through + * the API in order to be able to track their history. + * + * @param string $id + * @param null|array{applied_configurations?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Core\Account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function close($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v2/core/accounts/%s/close', $id), $params, $opts); + } + + /** + * An Account is a representation of a company, individual or other entity that a + * user interacts with. Accounts contain identifying information about the entity, + * and configurations that store the features an account has access to. An account + * can be configured as any or all of the following configurations: Customer, + * Merchant and/or Recipient. + * + * @param null|array{account_token?: string, configuration?: array{customer?: array{automatic_indirect_tax?: array{exempt?: string, ip_address?: string}, billing?: array{invoice?: array{custom_fields?: array{name: string, value: string}[], footer?: string, next_sequence?: int, prefix?: string, rendering?: array{amount_tax_display?: string, template?: string}}}, capabilities?: array{automatic_indirect_tax?: array{requested: bool}}, shipping?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name?: string, phone?: string}, test_clock?: string}, merchant?: array{bacs_debit_payments?: array{display_name?: string}, branding?: array{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}, capabilities?: array{ach_debit_payments?: array{requested: bool}, acss_debit_payments?: array{requested: bool}, affirm_payments?: array{requested: bool}, afterpay_clearpay_payments?: array{requested: bool}, alma_payments?: array{requested: bool}, amazon_pay_payments?: array{requested: bool}, au_becs_debit_payments?: array{requested: bool}, bacs_debit_payments?: array{requested: bool}, bancontact_payments?: array{requested: bool}, blik_payments?: array{requested: bool}, boleto_payments?: array{requested: bool}, card_payments?: array{requested: bool}, cartes_bancaires_payments?: array{requested: bool}, cashapp_payments?: array{requested: bool}, eps_payments?: array{requested: bool}, fpx_payments?: array{requested: bool}, gb_bank_transfer_payments?: array{requested: bool}, grabpay_payments?: array{requested: bool}, ideal_payments?: array{requested: bool}, jcb_payments?: array{requested: bool}, jp_bank_transfer_payments?: array{requested: bool}, kakao_pay_payments?: array{requested: bool}, klarna_payments?: array{requested: bool}, konbini_payments?: array{requested: bool}, kr_card_payments?: array{requested: bool}, link_payments?: array{requested: bool}, mobilepay_payments?: array{requested: bool}, multibanco_payments?: array{requested: bool}, mx_bank_transfer_payments?: array{requested: bool}, naver_pay_payments?: array{requested: bool}, oxxo_payments?: array{requested: bool}, p24_payments?: array{requested: bool}, pay_by_bank_payments?: array{requested: bool}, payco_payments?: array{requested: bool}, paynow_payments?: array{requested: bool}, promptpay_payments?: array{requested: bool}, revolut_pay_payments?: array{requested: bool}, samsung_pay_payments?: array{requested: bool}, sepa_bank_transfer_payments?: array{requested: bool}, sepa_debit_payments?: array{requested: bool}, swish_payments?: array{requested: bool}, twint_payments?: array{requested: bool}, us_bank_transfer_payments?: array{requested: bool}, zip_payments?: array{requested: bool}}, card_payments?: array{decline_on?: array{avs_failure?: bool, cvc_failure?: bool}}, konbini_payments?: array{support?: array{email?: string, hours?: array{end_time?: string, start_time?: string}, phone?: string}}, mcc?: string, script_statement_descriptor?: array{kana?: array{descriptor?: string, prefix?: string}, kanji?: array{descriptor?: string, prefix?: string}}, statement_descriptor?: array{descriptor?: string, prefix?: string}, support?: array{address?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, email?: string, phone?: string, url?: string}}, recipient?: array{capabilities?: array{stripe_balance?: array{stripe_transfers?: array{requested: bool}}}}}, contact_email?: string, dashboard?: string, defaults?: array{currency?: string, locales?: string[], profile?: array{business_url?: string, doing_business_as?: string, product_description?: string}, responsibilities?: array{fees_collector: string, losses_collector: string}}, display_name?: string, identity?: array{attestations?: array{directorship_declaration?: array{date?: string, ip?: string, user_agent?: string}, ownership_declaration?: array{date?: string, ip?: string, user_agent?: string}, persons_provided?: array{directors?: bool, executives?: bool, owners?: bool, ownership_exemption_reason?: string}, representative_declaration?: array{date?: string, ip?: string, user_agent?: string}, terms_of_service?: array{account?: array{date: string, ip: string, user_agent?: string}}}, business_details?: array{address?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, annual_revenue?: array{amount?: array{value?: int, currency?: string}, fiscal_year_end?: string}, documents?: array{bank_account_ownership_verification?: array{files: string[], type: string}, company_license?: array{files: string[], type: string}, company_memorandum_of_association?: array{files: string[], type: string}, company_ministerial_decree?: array{files: string[], type: string}, company_registration_verification?: array{files: string[], type: string}, company_tax_id_verification?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front: string}, type: string}, proof_of_address?: array{files: string[], type: string}, proof_of_registration?: array{files: string[], type: string}, proof_of_ultimate_beneficial_ownership?: array{files: string[], type: string}}, estimated_worker_count?: int, id_numbers?: array{registrar?: string, type: string, value: string}[], monthly_estimated_revenue?: array{amount?: array{value?: int, currency?: string}}, phone?: string, registered_name?: string, script_addresses?: array{kana?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{registered_name?: string}, kanji?: array{registered_name?: string}}, structure?: string}, country?: string, entity_type?: string, individual?: array{additional_addresses?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, purpose: string, state?: string, town?: string}[], additional_names?: array{full_name?: string, given_name?: string, purpose: string, surname?: string}[], address?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, date_of_birth?: array{day: int, month: int, year: int}, documents?: array{company_authorization?: array{files: string[], type: string}, passport?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front: string}, type: string}, secondary_verification?: array{front_back: array{back?: string, front: string}, type: string}, visa?: array{files: string[], type: string}}, email?: string, given_name?: string, id_numbers?: array{type: string, value: string}[], legal_gender?: string, metadata?: array, nationalities?: string[], phone?: string, political_exposure?: string, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: string, title?: string}, script_addresses?: array{kana?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{given_name?: string, surname?: string}, kanji?: array{given_name?: string, surname?: string}}, surname?: string}}, include?: string[], metadata?: array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Core\Account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v2/core/accounts', $params, $opts); + } + + /** + * Retrieves the details of an Account. + * + * @param string $id + * @param null|array{include?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Core\Account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v2/core/accounts/%s', $id), $params, $opts); + } + + /** + * Updates the details of an Account. + * + * @param string $id + * @param null|array{account_token?: string, configuration?: array{customer?: array{applied?: bool, automatic_indirect_tax?: array{exempt?: string, ip_address?: string, validate_location?: string}, billing?: array{default_payment_method?: string, invoice?: array{custom_fields?: array{name: string, value: string}[], footer?: string, next_sequence?: int, prefix?: string, rendering?: array{amount_tax_display?: string, template?: string}}}, capabilities?: array{automatic_indirect_tax?: array{requested?: bool}}, shipping?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, name?: string, phone?: string}, test_clock?: string}, merchant?: array{applied?: bool, bacs_debit_payments?: array{display_name?: string}, branding?: array{icon?: string, logo?: string, primary_color?: string, secondary_color?: string}, capabilities?: array{ach_debit_payments?: array{requested?: bool}, acss_debit_payments?: array{requested?: bool}, affirm_payments?: array{requested?: bool}, afterpay_clearpay_payments?: array{requested?: bool}, alma_payments?: array{requested?: bool}, amazon_pay_payments?: array{requested?: bool}, au_becs_debit_payments?: array{requested?: bool}, bacs_debit_payments?: array{requested?: bool}, bancontact_payments?: array{requested?: bool}, blik_payments?: array{requested?: bool}, boleto_payments?: array{requested?: bool}, card_payments?: array{requested?: bool}, cartes_bancaires_payments?: array{requested?: bool}, cashapp_payments?: array{requested?: bool}, eps_payments?: array{requested?: bool}, fpx_payments?: array{requested?: bool}, gb_bank_transfer_payments?: array{requested?: bool}, grabpay_payments?: array{requested?: bool}, ideal_payments?: array{requested?: bool}, jcb_payments?: array{requested?: bool}, jp_bank_transfer_payments?: array{requested?: bool}, kakao_pay_payments?: array{requested?: bool}, klarna_payments?: array{requested?: bool}, konbini_payments?: array{requested?: bool}, kr_card_payments?: array{requested?: bool}, link_payments?: array{requested?: bool}, mobilepay_payments?: array{requested?: bool}, multibanco_payments?: array{requested?: bool}, mx_bank_transfer_payments?: array{requested?: bool}, naver_pay_payments?: array{requested?: bool}, oxxo_payments?: array{requested?: bool}, p24_payments?: array{requested?: bool}, pay_by_bank_payments?: array{requested?: bool}, payco_payments?: array{requested?: bool}, paynow_payments?: array{requested?: bool}, promptpay_payments?: array{requested?: bool}, revolut_pay_payments?: array{requested?: bool}, samsung_pay_payments?: array{requested?: bool}, sepa_bank_transfer_payments?: array{requested?: bool}, sepa_debit_payments?: array{requested?: bool}, swish_payments?: array{requested?: bool}, twint_payments?: array{requested?: bool}, us_bank_transfer_payments?: array{requested?: bool}, zip_payments?: array{requested?: bool}}, card_payments?: array{decline_on?: array{avs_failure?: bool, cvc_failure?: bool}}, konbini_payments?: array{support?: array{email?: string, hours?: array{end_time?: string, start_time?: string}, phone?: string}}, mcc?: string, script_statement_descriptor?: array{kana?: array{descriptor?: string, prefix?: string}, kanji?: array{descriptor?: string, prefix?: string}}, statement_descriptor?: array{descriptor?: string, prefix?: string}, support?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, email?: string, phone?: string, url?: string}}, recipient?: array{applied?: bool, capabilities?: array{stripe_balance?: array{stripe_transfers?: array{requested?: bool}}}}}, contact_email?: string, dashboard?: string, defaults?: array{currency?: string, locales?: string[], profile?: array{business_url?: string, doing_business_as?: string, product_description?: string}, responsibilities?: array{fees_collector: string, losses_collector: string}}, display_name?: string, identity?: array{attestations?: array{directorship_declaration?: array{date?: string, ip?: string, user_agent?: string}, ownership_declaration?: array{date?: string, ip?: string, user_agent?: string}, persons_provided?: array{directors?: bool, executives?: bool, owners?: bool, ownership_exemption_reason?: string}, representative_declaration?: array{date?: string, ip?: string, user_agent?: string}, terms_of_service?: array{account?: array{date?: string, ip?: string, user_agent?: string}, crypto_storer?: array{date?: string, ip?: string, user_agent?: string}, storer?: array{date?: string, ip?: string, user_agent?: string}}}, business_details?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, annual_revenue?: array{amount?: array{value?: int, currency?: string}, fiscal_year_end?: string}, documents?: array{bank_account_ownership_verification?: array{files: string[], type: string}, company_license?: array{files: string[], type: string}, company_memorandum_of_association?: array{files: string[], type: string}, company_ministerial_decree?: array{files: string[], type: string}, company_registration_verification?: array{files: string[], type: string}, company_tax_id_verification?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, proof_of_address?: array{files: string[], type: string}, proof_of_registration?: array{files: string[], type: string}, proof_of_ultimate_beneficial_ownership?: array{files: string[], type: string}}, estimated_worker_count?: int, id_numbers?: array{registrar?: string, type: string, value: string}[], monthly_estimated_revenue?: array{amount?: array{value?: int, currency?: string}}, phone?: string, registered_name?: string, script_addresses?: array{kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{registered_name?: string}, kanji?: array{registered_name?: string}}, structure?: string}, country?: string, entity_type?: string, individual?: array{additional_addresses?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, purpose: string, state?: string, town?: string}[], additional_names?: array{full_name?: string, given_name?: string, purpose: string, surname?: string}[], address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, date_of_birth?: array{day: int, month: int, year: int}, documents?: array{company_authorization?: array{files: string[], type: string}, passport?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, secondary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, visa?: array{files: string[], type: string}}, email?: string, given_name?: string, id_numbers?: array{type: string, value: string}[], legal_gender?: string, metadata?: array, nationalities?: string[], phone?: string, political_exposure?: string, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: string, title?: string}, script_addresses?: array{kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{given_name?: string, surname?: string}, kanji?: array{given_name?: string, surname?: string}}, surname?: string}}, include?: string[], metadata?: array} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Core\Account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v2/core/accounts/%s', $id), $params, $opts); + } + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/V2/Core/AccountTokenService.php b/stripe-php/lib/Service/V2/Core/AccountTokenService.php new file mode 100644 index 0000000..61950e0 --- /dev/null +++ b/stripe-php/lib/Service/V2/Core/AccountTokenService.php @@ -0,0 +1,44 @@ +, nationalities?: string[], phone?: string, political_exposure?: string, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: string, title?: string}, script_addresses?: array{kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{given_name?: string, surname?: string}, kanji?: array{given_name?: string, surname?: string}}, surname?: string}}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Core\AccountToken + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v2/core/account_tokens', $params, $opts); + } + + /** + * Retrieves an Account Token. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Core\AccountToken + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v2/core/account_tokens/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/V2/Core/Accounts/PersonService.php b/stripe-php/lib/Service/V2/Core/Accounts/PersonService.php new file mode 100644 index 0000000..f55768b --- /dev/null +++ b/stripe-php/lib/Service/V2/Core/Accounts/PersonService.php @@ -0,0 +1,97 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($id, $params = null, $opts = null) + { + return $this->requestCollection('get', $this->buildPath('/v2/core/accounts/%s/persons', $id), $params, $opts); + } + + /** + * Create a Person. Adds an individual to an Account's identity. You can set + * relationship attributes and identity information at creation. + * + * @param string $id + * @param null|array{additional_addresses?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, purpose: string, state?: string, town?: string}[], additional_names?: array{full_name?: string, given_name?: string, purpose: string, surname?: string}[], additional_terms_of_service?: array{account?: array{date: string, ip: string, user_agent?: string}}, address?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, date_of_birth?: array{day: int, month: int, year: int}, documents?: array{company_authorization?: array{files: string[], type: string}, passport?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front: string}, type: string}, secondary_verification?: array{front_back: array{back?: string, front: string}, type: string}, visa?: array{files: string[], type: string}}, email?: string, given_name?: string, id_numbers?: array{type: string, value: string}[], legal_gender?: string, metadata?: array, nationalities?: string[], person_token?: string, phone?: string, political_exposure?: string, relationship?: array{authorizer?: bool, director?: bool, executive?: bool, legal_guardian?: bool, owner?: bool, percent_ownership?: string, representative?: bool, title?: string}, script_addresses?: array{kana?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{given_name?: string, surname?: string}, kanji?: array{given_name?: string, surname?: string}}, surname?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Core\AccountPerson + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v2/core/accounts/%s/persons', $id), $params, $opts); + } + + /** + * Delete a Person associated with an Account. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\DeletedObject + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($parentId, $id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v2/core/accounts/%s/persons/%s', $parentId, $id), $params, $opts); + } + + /** + * Retrieves a Person associated with an Account. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Core\AccountPerson + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v2/core/accounts/%s/persons/%s', $parentId, $id), $params, $opts); + } + + /** + * Updates a Person associated with an Account. + * + * @param string $parentId + * @param string $id + * @param null|array{additional_addresses?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, purpose: string, state?: string, town?: string}[], additional_names?: array{full_name?: string, given_name?: string, purpose: string, surname?: string}[], additional_terms_of_service?: array{account?: array{date?: string, ip?: string, user_agent?: string}}, address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, date_of_birth?: array{day: int, month: int, year: int}, documents?: array{company_authorization?: array{files: string[], type: string}, passport?: array{files: string[], type: string}, primary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, secondary_verification?: array{front_back: array{back?: string, front?: string}, type: string}, visa?: array{files: string[], type: string}}, email?: string, given_name?: string, id_numbers?: array{type: string, value: string}[], legal_gender?: string, metadata?: array, nationalities?: string[], person_token?: string, phone?: string, political_exposure?: string, relationship?: array{authorizer?: bool, director?: bool, executive?: bool, legal_guardian?: bool, owner?: bool, percent_ownership?: string, representative?: bool, title?: string}, script_addresses?: array{kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{given_name?: string, surname?: string}, kanji?: array{given_name?: string, surname?: string}}, surname?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Core\AccountPerson + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($parentId, $id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v2/core/accounts/%s/persons/%s', $parentId, $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/V2/Core/Accounts/PersonTokenService.php b/stripe-php/lib/Service/V2/Core/Accounts/PersonTokenService.php new file mode 100644 index 0000000..081fc43 --- /dev/null +++ b/stripe-php/lib/Service/V2/Core/Accounts/PersonTokenService.php @@ -0,0 +1,46 @@ +, nationalities?: string[], phone?: string, political_exposure?: string, relationship?: array{authorizer?: bool, director?: bool, executive?: bool, legal_guardian?: bool, owner?: bool, percent_ownership?: string, representative?: bool, title?: string}, script_addresses?: array{kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}}, script_names?: array{kana?: array{given_name?: string, surname?: string}, kanji?: array{given_name?: string, surname?: string}}, surname?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Core\AccountPersonToken + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v2/core/accounts/%s/person_tokens', $id), $params, $opts); + } + + /** + * Retrieves a Person Token associated with an Account. + * + * @param string $parentId + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Core\AccountPersonToken + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($parentId, $id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v2/core/accounts/%s/person_tokens/%s', $parentId, $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/V2/Core/CoreServiceFactory.php b/stripe-php/lib/Service/V2/Core/CoreServiceFactory.php new file mode 100644 index 0000000..0a70939 --- /dev/null +++ b/stripe-php/lib/Service/V2/Core/CoreServiceFactory.php @@ -0,0 +1,35 @@ + + */ + private static $classMap = [ + // Class Map: The beginning of the section generated from our OpenAPI spec + 'accountLinks' => AccountLinkService::class, + 'accounts' => AccountService::class, + 'accountTokens' => AccountTokenService::class, + 'eventDestinations' => EventDestinationService::class, + 'events' => EventService::class, + // Class Map: The end of the section generated from our OpenAPI spec + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/V2/Core/EventDestinationService.php b/stripe-php/lib/Service/V2/Core/EventDestinationService.php new file mode 100644 index 0000000..b021525 --- /dev/null +++ b/stripe-php/lib/Service/V2/Core/EventDestinationService.php @@ -0,0 +1,139 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v2/core/event_destinations', $params, $opts); + } + + /** + * Create a new event destination. + * + * @param null|array{description?: string, enabled_events: string[], event_payload: string, events_from?: string[], include?: string[], metadata?: array, name: string, snapshot_api_version?: string, type: string, amazon_eventbridge?: array{aws_account_id: string, aws_region: string}, webhook_endpoint?: array{url: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Core\EventDestination + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v2/core/event_destinations', $params, $opts); + } + + /** + * Delete an event destination. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\DeletedObject + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v2/core/event_destinations/%s', $id), $params, $opts); + } + + /** + * Disable an event destination. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Core\EventDestination + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function disable($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v2/core/event_destinations/%s/disable', $id), $params, $opts); + } + + /** + * Enable an event destination. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Core\EventDestination + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function enable($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v2/core/event_destinations/%s/enable', $id), $params, $opts); + } + + /** + * Send a `ping` event to an event destination. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Core\Event + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function ping($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v2/core/event_destinations/%s/ping', $id), $params, $opts); + } + + /** + * Retrieves the details of an event destination. + * + * @param string $id + * @param null|array{include?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Core\EventDestination + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v2/core/event_destinations/%s', $id), $params, $opts); + } + + /** + * Update the details of an event destination. + * + * @param string $id + * @param null|array{description?: string, enabled_events?: string[], include?: string[], metadata?: array, name?: string, webhook_endpoint?: array{url: string}} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Core\EventDestination + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v2/core/event_destinations/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/V2/Core/EventService.php b/stripe-php/lib/Service/V2/Core/EventService.php new file mode 100644 index 0000000..627c51e --- /dev/null +++ b/stripe-php/lib/Service/V2/Core/EventService.php @@ -0,0 +1,44 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v2/core/events', $params, $opts); + } + + /** + * Retrieves the details of an event. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\V2\Core\Event + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v2/core/events/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/Service/V2/V2ServiceFactory.php b/stripe-php/lib/Service/V2/V2ServiceFactory.php new file mode 100644 index 0000000..f16fe62 --- /dev/null +++ b/stripe-php/lib/Service/V2/V2ServiceFactory.php @@ -0,0 +1,27 @@ + + */ + private static $classMap = [ + 'billing' => Billing\BillingServiceFactory::class, + 'core' => Core\CoreServiceFactory::class, + ]; + + protected function getServiceClass($name) + { + return \array_key_exists($name, self::$classMap) ? self::$classMap[$name] : null; + } +} diff --git a/stripe-php/lib/Service/WebhookEndpointService.php b/stripe-php/lib/Service/WebhookEndpointService.php new file mode 100644 index 0000000..9ffb94b --- /dev/null +++ b/stripe-php/lib/Service/WebhookEndpointService.php @@ -0,0 +1,102 @@ + + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function all($params = null, $opts = null) + { + return $this->requestCollection('get', '/v1/webhook_endpoints', $params, $opts); + } + + /** + * A webhook endpoint must have a url and a list of + * enabled_events. You may optionally specify the Boolean + * connect parameter. If set to true, then a Connect webhook endpoint + * that notifies the specified url about events from all connected + * accounts is created; otherwise an account webhook endpoint that notifies the + * specified url only about events from your account is created. You + * can also create webhook endpoints in the webhooks settings + * section of the Dashboard. + * + * @param null|array{api_version?: string, connect?: bool, description?: null|string, enabled_events: string[], expand?: string[], metadata?: null|array, url: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\WebhookEndpoint + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function create($params = null, $opts = null) + { + return $this->request('post', '/v1/webhook_endpoints', $params, $opts); + } + + /** + * You can also delete webhook endpoints via the webhook endpoint + * management page of the Stripe dashboard. + * + * @param string $id + * @param null|array $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\WebhookEndpoint + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($id, $params = null, $opts = null) + { + return $this->request('delete', $this->buildPath('/v1/webhook_endpoints/%s', $id), $params, $opts); + } + + /** + * Retrieves the webhook endpoint with the given ID. + * + * @param string $id + * @param null|array{expand?: string[]} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\WebhookEndpoint + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieve($id, $params = null, $opts = null) + { + return $this->request('get', $this->buildPath('/v1/webhook_endpoints/%s', $id), $params, $opts); + } + + /** + * Updates the webhook endpoint. You may edit the url, the list of + * enabled_events, and the status of your endpoint. + * + * @param string $id + * @param null|array{description?: null|string, disabled?: bool, enabled_events?: string[], expand?: string[], metadata?: null|array, url?: string} $params + * @param null|RequestOptionsArray|\Stripe\Util\RequestOptions $opts + * + * @return \Stripe\WebhookEndpoint + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function update($id, $params = null, $opts = null) + { + return $this->request('post', $this->buildPath('/v1/webhook_endpoints/%s', $id), $params, $opts); + } +} diff --git a/stripe-php/lib/SetupAttempt.php b/stripe-php/lib/SetupAttempt.php new file mode 100644 index 0000000..a5d4209 --- /dev/null +++ b/stripe-php/lib/SetupAttempt.php @@ -0,0 +1,50 @@ +application on the SetupIntent at the time of this confirmation. + * @property null|bool $attach_to_self

If present, the SetupIntent's payment method will be attached to the in-context Stripe Account.

It can only be used for this Stripe Account’s own money movement flows like InboundTransfer and OutboundTransfers. It cannot be set to true when setting up a PaymentMethod for a Customer, and defaults to false when attaching a PaymentMethod to a Customer.

+ * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|Customer|string $customer The value of customer on the SetupIntent at the time of this confirmation. + * @property null|string $customer_account The value of customer_account on the SetupIntent at the time of this confirmation. + * @property null|string[] $flow_directions

Indicates the directions of money movement for which this payment method is intended to be used.

Include inbound if you intend to use the payment method as the origin to pull funds from. Include outbound if you intend to use the payment method as the destination to send funds to. You can include both if you intend to use the payment method for both purposes.

+ * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|Account|string $on_behalf_of The value of on_behalf_of on the SetupIntent at the time of this confirmation. + * @property PaymentMethod|string $payment_method ID of the payment method used with this SetupAttempt. + * @property (object{acss_debit?: (object{}&StripeObject), amazon_pay?: (object{}&StripeObject), au_becs_debit?: (object{}&StripeObject), bacs_debit?: (object{}&StripeObject), bancontact?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), boleto?: (object{}&StripeObject), card?: (object{brand: null|string, checks: null|(object{address_line1_check: null|string, address_postal_code_check: null|string, cvc_check: null|string}&StripeObject), country: null|string, description?: null|string, exp_month: null|int, exp_year: null|int, fingerprint?: null|string, funding: null|string, iin?: null|string, issuer?: null|string, last4: null|string, network: null|string, three_d_secure: null|(object{authentication_flow: null|string, electronic_commerce_indicator: null|string, result: null|string, result_reason: null|string, transaction_id: null|string, version: null|string}&StripeObject), wallet: null|(object{apple_pay?: (object{}&StripeObject), google_pay?: (object{}&StripeObject), type: string}&StripeObject)}&StripeObject), card_present?: (object{generated_card: null|PaymentMethod|string, offline: null|(object{stored_at: null|int, type: null|string}&StripeObject)}&StripeObject), cashapp?: (object{}&StripeObject), ideal?: (object{bank: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, verified_name: null|string}&StripeObject), kakao_pay?: (object{}&StripeObject), klarna?: (object{}&StripeObject), kr_card?: (object{}&StripeObject), link?: (object{}&StripeObject), naver_pay?: (object{buyer_id?: string}&StripeObject), nz_bank_account?: (object{}&StripeObject), paypal?: (object{}&StripeObject), payto?: (object{}&StripeObject), revolut_pay?: (object{}&StripeObject), sepa_debit?: (object{}&StripeObject), sofort?: (object{bank_code: null|string, bank_name: null|string, bic: null|string, generated_sepa_debit: null|PaymentMethod|string, generated_sepa_debit_mandate: null|Mandate|string, iban_last4: null|string, preferred_language: null|string, verified_name: null|string}&StripeObject), type: string, us_bank_account?: (object{}&StripeObject)}&StripeObject) $payment_method_details + * @property null|(object{advice_code?: string, charge?: string, code?: string, decline_code?: string, doc_url?: string, message?: string, network_advice_code?: string, network_decline_code?: string, param?: string, payment_intent?: PaymentIntent, payment_method?: PaymentMethod, payment_method_type?: string, request_log_url?: string, setup_intent?: SetupIntent, source?: Account|BankAccount|Card|Source, type: string}&StripeObject) $setup_error The error encountered during this attempt to confirm the SetupIntent, if any. + * @property SetupIntent|string $setup_intent ID of the SetupIntent that this attempt belongs to. + * @property string $status Status of this SetupAttempt, one of requires_confirmation, requires_action, processing, succeeded, failed, or abandoned. + * @property string $usage The value of usage on the SetupIntent at the time of this confirmation, one of off_session or on_session. + */ +class SetupAttempt extends ApiResource +{ + const OBJECT_NAME = 'setup_attempt'; + + /** + * Returns a list of SetupAttempts that associate with a provided SetupIntent. + * + * @param null|array{created?: array|int, ending_before?: string, expand?: string[], limit?: int, setup_intent: string, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } +} diff --git a/stripe-php/lib/SetupIntent.php b/stripe-php/lib/SetupIntent.php new file mode 100644 index 0000000..d9328de --- /dev/null +++ b/stripe-php/lib/SetupIntent.php @@ -0,0 +1,217 @@ +PaymentIntents to drive the payment flow. + * + * Create a SetupIntent when you're ready to collect your customer's payment credentials. + * Don't maintain long-lived, unconfirmed SetupIntents because they might not be valid. + * The SetupIntent transitions through multiple statuses as it guides + * you through the setup process. + * + * Successful SetupIntents result in payment credentials that are optimized for future payments. + * For example, cardholders in certain regions might need to be run through + * Strong Customer Authentication during payment method collection + * to streamline later off-session payments. + * If you use the SetupIntent with a Customer, + * it automatically attaches the resulting payment method to that Customer after successful setup. + * We recommend using SetupIntents or setup_future_usage on + * PaymentIntents to save payment methods to prevent saving invalid or unoptimized payment methods. + * + * By using SetupIntents, you can reduce friction for your customers, even as regulations change over time. + * + * Related guide: Setup Intents API + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|Application|string $application ID of the Connect application that created the SetupIntent. + * @property null|bool $attach_to_self

If present, the SetupIntent's payment method will be attached to the in-context Stripe Account.

It can only be used for this Stripe Account’s own money movement flows like InboundTransfer and OutboundTransfers. It cannot be set to true when setting up a PaymentMethod for a Customer, and defaults to false when attaching a PaymentMethod to a Customer.

+ * @property null|(object{allow_redirects?: string, enabled: null|bool}&StripeObject) $automatic_payment_methods Settings for dynamic payment methods compatible with this Setup Intent + * @property null|string $cancellation_reason Reason for cancellation of this SetupIntent, one of abandoned, requested_by_customer, or duplicate. + * @property null|string $client_secret

The client secret of this SetupIntent. Used for client-side retrieval using a publishable key.

The client secret can be used to complete payment setup from your frontend. It should not be stored, logged, or exposed to anyone other than the customer. Make sure that you have TLS enabled on any page that includes the client secret.

+ * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|Customer|string $customer

ID of the Customer this SetupIntent belongs to, if one exists.

If present, the SetupIntent's payment method will be attached to the Customer on successful setup. Payment methods attached to other Customers cannot be used with this SetupIntent.

+ * @property null|string $customer_account

ID of the Account this SetupIntent belongs to, if one exists.

If present, the SetupIntent's payment method will be attached to the Account on successful setup. Payment methods attached to other Accounts cannot be used with this SetupIntent.

+ * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|string[] $excluded_payment_method_types Payment method types that are excluded from this SetupIntent. + * @property null|string[] $flow_directions

Indicates the directions of money movement for which this payment method is intended to be used.

Include inbound if you intend to use the payment method as the origin to pull funds from. Include outbound if you intend to use the payment method as the destination to send funds to. You can include both if you intend to use the payment method for both purposes.

+ * @property null|(object{advice_code?: string, charge?: string, code?: string, decline_code?: string, doc_url?: string, message?: string, network_advice_code?: string, network_decline_code?: string, param?: string, payment_intent?: PaymentIntent, payment_method?: PaymentMethod, payment_method_type?: string, request_log_url?: string, setup_intent?: SetupIntent, source?: Account|BankAccount|Card|Source, type: string}&StripeObject) $last_setup_error The error encountered in the previous SetupIntent confirmation. + * @property null|SetupAttempt|string $latest_attempt The most recent SetupAttempt for this SetupIntent. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|Mandate|string $mandate ID of the multi use Mandate generated by the SetupIntent. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|(object{cashapp_handle_redirect_or_display_qr_code?: (object{hosted_instructions_url: string, mobile_auth_url: string, qr_code: (object{expires_at: int, image_url_png: string, image_url_svg: string}&StripeObject)}&StripeObject), redirect_to_url?: (object{return_url: null|string, url: null|string}&StripeObject), type: string, use_stripe_sdk?: StripeObject, verify_with_microdeposits?: (object{arrival_date: int, hosted_verification_url: string, microdeposit_type: null|string}&StripeObject)}&StripeObject) $next_action If present, this property tells you what actions you need to take in order for your customer to continue payment setup. + * @property null|Account|string $on_behalf_of The account (if any) for which the setup is intended. + * @property null|PaymentMethod|string $payment_method ID of the payment method used with this SetupIntent. If the payment method is card_present and isn't a digital wallet, then the generated_card associated with the latest_attempt is attached to the Customer instead. + * @property null|(object{id: string, parent: null|string}&StripeObject) $payment_method_configuration_details Information about the payment method configuration used for this Setup Intent. + * @property null|(object{acss_debit?: (object{currency: null|string, mandate_options?: (object{custom_mandate_url?: string, default_for?: string[], interval_description: null|string, payment_schedule: null|string, transaction_type: null|string}&StripeObject), verification_method?: string}&StripeObject), amazon_pay?: (object{}&StripeObject), bacs_debit?: (object{mandate_options?: (object{reference_prefix?: string}&StripeObject)}&StripeObject), card?: (object{mandate_options: null|(object{amount: int, amount_type: string, currency: string, description: null|string, end_date: null|int, interval: string, interval_count: null|int, reference: string, start_date: int, supported_types: null|string[]}&StripeObject), network: null|string, request_three_d_secure: null|string}&StripeObject), card_present?: (object{}&StripeObject), klarna?: (object{currency: null|string, preferred_locale: null|string}&StripeObject), link?: (object{persistent_token: null|string}&StripeObject), paypal?: (object{billing_agreement_id: null|string}&StripeObject), payto?: (object{mandate_options?: (object{amount: null|int, amount_type: null|string, end_date: null|string, payment_schedule: null|string, payments_per_period: null|int, purpose: null|string, start_date: null|string}&StripeObject)}&StripeObject), sepa_debit?: (object{mandate_options?: (object{reference_prefix?: string}&StripeObject)}&StripeObject), us_bank_account?: (object{financial_connections?: (object{filters?: (object{account_subcategories?: string[]}&StripeObject), permissions?: string[], prefetch: null|string[], return_url?: string}&StripeObject), mandate_options?: (object{collection_method?: string}&StripeObject), verification_method?: string}&StripeObject)}&StripeObject) $payment_method_options Payment method-specific configuration for this SetupIntent. + * @property string[] $payment_method_types The list of payment method types (e.g. card) that this SetupIntent is allowed to set up. A list of valid payment method types can be found here. + * @property null|Mandate|string $single_use_mandate ID of the single_use Mandate generated by the SetupIntent. + * @property string $status Status of this SetupIntent, one of requires_payment_method, requires_confirmation, requires_action, processing, canceled, or succeeded. + * @property string $usage

Indicates how the payment method is intended to be used in the future.

Use on_session if you intend to only reuse the payment method when the customer is in your checkout flow. Use off_session if your customer may or may not be in your checkout flow. If not provided, this value defaults to off_session.

+ */ +class SetupIntent extends ApiResource +{ + const OBJECT_NAME = 'setup_intent'; + + use ApiOperations\Update; + + const CANCELLATION_REASON_ABANDONED = 'abandoned'; + const CANCELLATION_REASON_DUPLICATE = 'duplicate'; + const CANCELLATION_REASON_REQUESTED_BY_CUSTOMER = 'requested_by_customer'; + + const STATUS_CANCELED = 'canceled'; + const STATUS_PROCESSING = 'processing'; + const STATUS_REQUIRES_ACTION = 'requires_action'; + const STATUS_REQUIRES_CONFIRMATION = 'requires_confirmation'; + const STATUS_REQUIRES_PAYMENT_METHOD = 'requires_payment_method'; + const STATUS_SUCCEEDED = 'succeeded'; + + /** + * Creates a SetupIntent object. + * + * After you create the SetupIntent, attach a payment method and confirm it to collect any required + * permissions to charge the payment method later. + * + * @param null|array{attach_to_self?: bool, automatic_payment_methods?: array{allow_redirects?: string, enabled: bool}, confirm?: bool, confirmation_token?: string, customer?: string, customer_account?: string, description?: string, excluded_payment_method_types?: string[], expand?: string[], flow_directions?: string[], mandate_data?: null|array{customer_acceptance: array{accepted_at?: int, offline?: array{}, online?: array{ip_address: string, user_agent: string}, type: string}}, metadata?: array, on_behalf_of?: string, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, verification_method?: string}, amazon_pay?: array{}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, card?: array{mandate_options?: array{amount: int, amount_type: string, currency: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_three_d_secure?: string, three_d_secure?: array{ares_trans_status?: string, cryptogram?: string, electronic_commerce_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id?: string, version?: string}}, card_present?: array{}, klarna?: array{currency?: string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, link?: array{persistent_token?: string}, paypal?: array{billing_agreement_id?: string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, us_bank_account?: array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, verification_method?: string}}, payment_method_types?: string[], return_url?: string, single_use?: array{amount: int, currency: string}, usage?: string, use_stripe_sdk?: bool} $params + * @param null|array|string $options + * + * @return SetupIntent the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of SetupIntents. + * + * @param null|array{attach_to_self?: bool, created?: array|int, customer?: string, customer_account?: string, ending_before?: string, expand?: string[], limit?: int, payment_method?: string, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the details of a SetupIntent that has previously been created. + * + * Client-side retrieval using a publishable key is allowed when the + * client_secret is provided in the query string. + * + * When retrieved with a publishable key, only a subset of properties will be + * returned. Please refer to the SetupIntent + * object reference for more details. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return SetupIntent + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates a SetupIntent object. + * + * @param string $id the ID of the resource to update + * @param null|array{attach_to_self?: bool, customer?: string, customer_account?: string, description?: string, excluded_payment_method_types?: null|string[], expand?: string[], flow_directions?: string[], metadata?: null|array, payment_method?: string, payment_method_configuration?: string, payment_method_data?: array{acss_debit?: array{account_number: string, institution_number: string, transit_number: string}, affirm?: array{}, afterpay_clearpay?: array{}, alipay?: array{}, allow_redisplay?: string, alma?: array{}, amazon_pay?: array{}, au_becs_debit?: array{account_number: string, bsb_number: string}, bacs_debit?: array{account_number?: string, sort_code?: string}, bancontact?: array{}, billie?: array{}, billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string, tax_id?: string}, blik?: array{}, boleto?: array{tax_id: string}, cashapp?: array{}, crypto?: array{}, customer_balance?: array{}, eps?: array{bank?: string}, fpx?: array{account_holder_type?: string, bank: string}, giropay?: array{}, grabpay?: array{}, ideal?: array{bank?: string}, interac_present?: array{}, kakao_pay?: array{}, klarna?: array{dob?: array{day: int, month: int, year: int}}, konbini?: array{}, kr_card?: array{}, link?: array{}, mb_way?: array{}, metadata?: array, mobilepay?: array{}, multibanco?: array{}, naver_pay?: array{funding?: string}, nz_bank_account?: array{account_holder_name?: string, account_number: string, bank_code: string, branch_code: string, reference?: string, suffix: string}, oxxo?: array{}, p24?: array{bank?: string}, pay_by_bank?: array{}, payco?: array{}, paynow?: array{}, paypal?: array{}, payto?: array{account_number?: string, bsb_number?: string, pay_id?: string}, pix?: array{}, promptpay?: array{}, radar_options?: array{session?: string}, revolut_pay?: array{}, samsung_pay?: array{}, satispay?: array{}, sepa_debit?: array{iban: string}, sofort?: array{country: string}, swish?: array{}, twint?: array{}, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}, wechat_pay?: array{}, zip?: array{}}, payment_method_options?: array{acss_debit?: array{currency?: string, mandate_options?: array{custom_mandate_url?: null|string, default_for?: string[], interval_description?: string, payment_schedule?: string, transaction_type?: string}, verification_method?: string}, amazon_pay?: array{}, bacs_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, card?: array{mandate_options?: array{amount: int, amount_type: string, currency: string, description?: string, end_date?: int, interval: string, interval_count?: int, reference: string, start_date: int, supported_types?: string[]}, moto?: bool, network?: string, request_three_d_secure?: string, three_d_secure?: array{ares_trans_status?: string, cryptogram?: string, electronic_commerce_indicator?: string, network_options?: array{cartes_bancaires?: array{cb_avalgo: string, cb_exemption?: string, cb_score?: int}}, requestor_challenge_indicator?: string, transaction_id?: string, version?: string}}, card_present?: array{}, klarna?: array{currency?: string, on_demand?: array{average_amount?: int, maximum_amount?: int, minimum_amount?: int, purchase_interval?: string, purchase_interval_count?: int}, preferred_locale?: string, subscriptions?: null|array{interval: string, interval_count?: int, name?: string, next_billing: array{amount: int, date: string}, reference: string}[]}, link?: array{persistent_token?: string}, paypal?: array{billing_agreement_id?: string}, payto?: array{mandate_options?: array{amount?: null|int, amount_type?: null|string, end_date?: null|string, payment_schedule?: null|string, payments_per_period?: null|int, purpose?: null|string, start_date?: null|string}}, sepa_debit?: array{mandate_options?: array{reference_prefix?: null|string}}, us_bank_account?: array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[], return_url?: string}, mandate_options?: array{collection_method?: null|string}, networks?: array{requested?: string[]}, verification_method?: string}}, payment_method_types?: string[]} $params + * @param null|array|string $opts + * + * @return SetupIntent the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return SetupIntent the canceled setup intent + * + * @throws Exception\ApiErrorException if the request fails + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return SetupIntent the confirmed setup intent + * + * @throws Exception\ApiErrorException if the request fails + */ + public function confirm($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/confirm'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return SetupIntent the verified setup intent + * + * @throws Exception\ApiErrorException if the request fails + */ + public function verifyMicrodeposits($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/verify_microdeposits'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/ShippingRate.php b/stripe-php/lib/ShippingRate.php new file mode 100644 index 0000000..a213a2e --- /dev/null +++ b/stripe-php/lib/ShippingRate.php @@ -0,0 +1,116 @@ +Charge for shipping. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property bool $active Whether the shipping rate can be used for new purchases. Defaults to true. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|(object{maximum: null|(object{unit: string, value: int}&StripeObject), minimum: null|(object{unit: string, value: int}&StripeObject)}&StripeObject) $delivery_estimate The estimated range for how long shipping will take, meant to be displayable to the customer. This will appear on CheckoutSessions. + * @property null|string $display_name The name of the shipping rate, meant to be displayable to the customer. This will appear on CheckoutSessions. + * @property null|(object{amount: int, currency: string, currency_options?: StripeObject}&StripeObject) $fixed_amount + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $tax_behavior Specifies whether the rate is considered inclusive of taxes or exclusive of taxes. One of inclusive, exclusive, or unspecified. + * @property null|string|TaxCode $tax_code A tax code ID. The Shipping tax code is txcd_92010001. + * @property string $type The type of calculation to use on the shipping rate. + */ +class ShippingRate extends ApiResource +{ + const OBJECT_NAME = 'shipping_rate'; + + use ApiOperations\Update; + + const TAX_BEHAVIOR_EXCLUSIVE = 'exclusive'; + const TAX_BEHAVIOR_INCLUSIVE = 'inclusive'; + const TAX_BEHAVIOR_UNSPECIFIED = 'unspecified'; + + const TYPE_FIXED_AMOUNT = 'fixed_amount'; + + /** + * Creates a new shipping rate object. + * + * @param null|array{delivery_estimate?: array{maximum?: array{unit: string, value: int}, minimum?: array{unit: string, value: int}}, display_name: string, expand?: string[], fixed_amount?: array{amount: int, currency: string, currency_options?: array}, metadata?: array, tax_behavior?: string, tax_code?: string, type?: string} $params + * @param null|array|string $options + * + * @return ShippingRate the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of your shipping rates. + * + * @param null|array{active?: bool, created?: array|int, currency?: string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Returns the shipping rate object with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return ShippingRate + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates an existing shipping rate object. + * + * @param string $id the ID of the resource to update + * @param null|array{active?: bool, expand?: string[], fixed_amount?: array{currency_options?: array}, metadata?: null|array, tax_behavior?: string} $params + * @param null|array|string $opts + * + * @return ShippingRate the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Sigma/ScheduledQueryRun.php b/stripe-php/lib/Sigma/ScheduledQueryRun.php new file mode 100644 index 0000000..53f84a6 --- /dev/null +++ b/stripe-php/lib/Sigma/ScheduledQueryRun.php @@ -0,0 +1,69 @@ +scheduled a Sigma query, you'll + * receive a sigma.scheduled_query_run.created webhook each time the query + * runs. The webhook contains a ScheduledQueryRun object, which you can use to + * retrieve the query results. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property int $data_load_time When the query was run, Sigma contained a snapshot of your Stripe data at this time. + * @property null|(object{message: string}&\Stripe\StripeObject) $error + * @property null|\Stripe\File $file The file object representing the results of the query. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property int $result_available_until Time at which the result expires and is no longer available for download. + * @property string $sql SQL for the query. + * @property string $status The query's execution status, which will be completed for successful runs, and canceled, failed, or timed_out otherwise. + * @property string $title Title of the query. + */ +class ScheduledQueryRun extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'scheduled_query_run'; + + /** + * Returns a list of scheduled query runs. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an scheduled query run. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return ScheduledQueryRun + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + public static function classUrl() + { + return '/v1/sigma/scheduled_query_runs'; + } +} diff --git a/stripe-php/lib/SingletonApiResource.php b/stripe-php/lib/SingletonApiResource.php new file mode 100644 index 0000000..34dfa43 --- /dev/null +++ b/stripe-php/lib/SingletonApiResource.php @@ -0,0 +1,31 @@ +Source objects allow you to accept a variety of payment methods. They + * represent a customer's payment instrument, and can be used with the Stripe API + * just like a Card object: once chargeable, they can be charged, or can be + * attached to customers. + * + * Stripe doesn't recommend using the deprecated Sources API. + * We recommend that you adopt the PaymentMethods API. + * This newer API provides access to our latest features and payment method types. + * + * Related guides: Sources API and Sources & Customers. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|(object{account_number?: null|string, bank_name?: null|string, fingerprint?: null|string, refund_account_holder_name?: null|string, refund_account_holder_type?: null|string, refund_routing_number?: null|string, routing_number?: null|string, swift_code?: null|string}&StripeObject) $ach_credit_transfer + * @property null|(object{bank_name?: null|string, country?: null|string, fingerprint?: null|string, last4?: null|string, routing_number?: null|string, type?: null|string}&StripeObject) $ach_debit + * @property null|(object{bank_address_city?: null|string, bank_address_line_1?: null|string, bank_address_line_2?: null|string, bank_address_postal_code?: null|string, bank_name?: null|string, category?: null|string, country?: null|string, fingerprint?: null|string, last4?: null|string, routing_number?: null|string}&StripeObject) $acss_debit + * @property null|(object{data_string?: null|string, native_url?: null|string, statement_descriptor?: null|string}&StripeObject) $alipay + * @property null|string $allow_redisplay This field indicates whether this payment method can be shown again to its customer in a checkout flow. Stripe products such as Checkout and Elements use this field to determine whether a payment method can be shown as a saved payment method in a checkout flow. The field defaults to “unspecified”. + * @property null|int $amount A positive integer in the smallest currency unit (that is, 100 cents for $1.00, or 1 for ¥1, Japanese Yen being a zero-decimal currency) representing the total amount associated with the source. This is the amount for which the source will be chargeable once ready. Required for single_use sources. + * @property null|(object{bsb_number?: null|string, fingerprint?: null|string, last4?: null|string}&StripeObject) $au_becs_debit + * @property null|(object{bank_code?: null|string, bank_name?: null|string, bic?: null|string, iban_last4?: null|string, preferred_language?: null|string, statement_descriptor?: null|string}&StripeObject) $bancontact + * @property null|(object{address_line1_check?: null|string, address_zip_check?: null|string, brand?: null|string, country?: null|string, cvc_check?: null|string, description?: string, dynamic_last4?: null|string, exp_month?: null|int, exp_year?: null|int, fingerprint?: string, funding?: null|string, iin?: string, issuer?: string, last4?: null|string, name?: null|string, three_d_secure?: string, tokenization_method?: null|string}&StripeObject) $card + * @property null|(object{application_cryptogram?: string, application_preferred_name?: string, authorization_code?: null|string, authorization_response_code?: string, brand?: null|string, country?: null|string, cvm_type?: string, data_type?: null|string, dedicated_file_name?: string, description?: string, emv_auth_data?: string, evidence_customer_signature?: null|string, evidence_transaction_certificate?: null|string, exp_month?: null|int, exp_year?: null|int, fingerprint?: string, funding?: null|string, iin?: string, issuer?: string, last4?: null|string, pos_device_id?: null|string, pos_entry_mode?: string, read_method?: null|string, reader?: null|string, terminal_verification_results?: string, transaction_status_information?: string}&StripeObject) $card_present + * @property string $client_secret The client secret of the source. Used for client-side retrieval using a publishable key. + * @property null|(object{attempts_remaining: int, status: string}&StripeObject) $code_verification + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $currency Three-letter ISO code for the currency associated with the source. This is the currency for which the source will be chargeable once ready. Required for single_use sources. + * @property null|string $customer The ID of the customer to which this source is attached. This will not be present when the source has not been attached to a customer. + * @property null|(object{reference?: null|string, statement_descriptor?: null|string}&StripeObject) $eps + * @property string $flow The authentication flow of the source. flow is one of redirect, receiver, code_verification, none. + * @property null|(object{bank_code?: null|string, bank_name?: null|string, bic?: null|string, statement_descriptor?: null|string}&StripeObject) $giropay + * @property null|(object{bank?: null|string, bic?: null|string, iban_last4?: null|string, statement_descriptor?: null|string}&StripeObject) $ideal + * @property null|(object{background_image_url?: string, client_token?: null|string, first_name?: string, last_name?: string, locale?: string, logo_url?: string, page_title?: string, pay_later_asset_urls_descriptive?: string, pay_later_asset_urls_standard?: string, pay_later_name?: string, pay_later_redirect_url?: string, pay_now_asset_urls_descriptive?: string, pay_now_asset_urls_standard?: string, pay_now_name?: string, pay_now_redirect_url?: string, pay_over_time_asset_urls_descriptive?: string, pay_over_time_asset_urls_standard?: string, pay_over_time_name?: string, pay_over_time_redirect_url?: string, payment_method_categories?: string, purchase_country?: string, purchase_type?: string, redirect_url?: string, shipping_delay?: int, shipping_first_name?: string, shipping_last_name?: string}&StripeObject) $klarna + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|(object{entity?: null|string, reference?: null|string, refund_account_holder_address_city?: null|string, refund_account_holder_address_country?: null|string, refund_account_holder_address_line1?: null|string, refund_account_holder_address_line2?: null|string, refund_account_holder_address_postal_code?: null|string, refund_account_holder_address_state?: null|string, refund_account_holder_name?: null|string, refund_iban?: null|string}&StripeObject) $multibanco + * @property null|(object{address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), email: null|string, name: null|string, phone: null|string, verified_address: null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), verified_email: null|string, verified_name: null|string, verified_phone: null|string}&StripeObject) $owner Information about the owner of the payment instrument that may be used or required by particular source types. + * @property null|(object{reference?: null|string}&StripeObject) $p24 + * @property null|(object{address: null|string, amount_charged: int, amount_received: int, amount_returned: int, refund_attributes_method: string, refund_attributes_status: string}&StripeObject) $receiver + * @property null|(object{failure_reason: null|string, return_url: string, status: string, url: string}&StripeObject) $redirect + * @property null|(object{bank_name?: null|string, bic?: null|string, iban?: null|string, refund_account_holder_address_city?: null|string, refund_account_holder_address_country?: null|string, refund_account_holder_address_line1?: null|string, refund_account_holder_address_line2?: null|string, refund_account_holder_address_postal_code?: null|string, refund_account_holder_address_state?: null|string, refund_account_holder_name?: null|string, refund_iban?: null|string}&StripeObject) $sepa_credit_transfer + * @property null|(object{bank_code?: null|string, branch_code?: null|string, country?: null|string, fingerprint?: null|string, last4?: null|string, mandate_reference?: null|string, mandate_url?: null|string}&StripeObject) $sepa_debit + * @property null|(object{bank_code?: null|string, bank_name?: null|string, bic?: null|string, country?: null|string, iban_last4?: null|string, preferred_language?: null|string, statement_descriptor?: null|string}&StripeObject) $sofort + * @property null|(object{amount: int, currency: string, email?: string, items: null|((object{amount: null|int, currency: null|string, description: null|string, parent: null|string, quantity?: int, type: null|string}&StripeObject))[], shipping?: (object{address?: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&StripeObject), carrier?: null|string, name?: string, phone?: null|string, tracking_number?: null|string}&StripeObject)}&StripeObject) $source_order + * @property null|string $statement_descriptor Extra information about a source. This will appear on your customer's statement every time you charge the source. + * @property string $status The status of the source, one of canceled, chargeable, consumed, failed, or pending. Only chargeable sources can be used to create a charge. + * @property null|(object{address_line1_check?: null|string, address_zip_check?: null|string, authenticated?: null|bool, brand?: null|string, card?: null|string, country?: null|string, customer?: null|string, cvc_check?: null|string, description?: string, dynamic_last4?: null|string, exp_month?: null|int, exp_year?: null|int, fingerprint?: string, funding?: null|string, iin?: string, issuer?: string, last4?: null|string, name?: null|string, three_d_secure?: string, tokenization_method?: null|string}&StripeObject) $three_d_secure + * @property string $type The type of the source. The type is a payment method, one of ach_credit_transfer, ach_debit, alipay, bancontact, card, card_present, eps, giropay, ideal, multibanco, klarna, p24, sepa_debit, sofort, three_d_secure, or wechat. An additional hash is included on the source with a name matching this value. It contains additional information specific to the payment method used. + * @property null|string $usage Either reusable or single_use. Whether this source should be reusable or not. Some source types may or may not be reusable by construction, while others may leave the option at creation. If an incompatible value is passed, an error will be returned. + * @property null|(object{prepay_id?: string, qr_code_url?: null|string, statement_descriptor?: string}&StripeObject) $wechat + */ +class Source extends ApiResource +{ + const OBJECT_NAME = 'source'; + + use ApiOperations\Update; + + const ALLOW_REDISPLAY_ALWAYS = 'always'; + const ALLOW_REDISPLAY_LIMITED = 'limited'; + const ALLOW_REDISPLAY_UNSPECIFIED = 'unspecified'; + + const FLOW_CODE_VERIFICATION = 'code_verification'; + const FLOW_NONE = 'none'; + const FLOW_RECEIVER = 'receiver'; + const FLOW_REDIRECT = 'redirect'; + + const STATUS_CANCELED = 'canceled'; + const STATUS_CHARGEABLE = 'chargeable'; + const STATUS_CONSUMED = 'consumed'; + const STATUS_FAILED = 'failed'; + const STATUS_PENDING = 'pending'; + + const TYPE_ACH_CREDIT_TRANSFER = 'ach_credit_transfer'; + const TYPE_ACH_DEBIT = 'ach_debit'; + const TYPE_ACSS_DEBIT = 'acss_debit'; + const TYPE_ALIPAY = 'alipay'; + const TYPE_AU_BECS_DEBIT = 'au_becs_debit'; + const TYPE_BANCONTACT = 'bancontact'; + const TYPE_CARD = 'card'; + const TYPE_CARD_PRESENT = 'card_present'; + const TYPE_EPS = 'eps'; + const TYPE_GIROPAY = 'giropay'; + const TYPE_IDEAL = 'ideal'; + const TYPE_KLARNA = 'klarna'; + const TYPE_MULTIBANCO = 'multibanco'; + const TYPE_P24 = 'p24'; + const TYPE_SEPA_CREDIT_TRANSFER = 'sepa_credit_transfer'; + const TYPE_SEPA_DEBIT = 'sepa_debit'; + const TYPE_SOFORT = 'sofort'; + const TYPE_THREE_D_SECURE = 'three_d_secure'; + const TYPE_WECHAT = 'wechat'; + + const USAGE_REUSABLE = 'reusable'; + const USAGE_SINGLE_USE = 'single_use'; + + /** + * Creates a new source object. + * + * @param null|array{amount?: int, currency?: string, customer?: string, expand?: string[], flow?: string, mandate?: array{acceptance?: array{date?: int, ip?: string, offline?: array{contact_email: string}, online?: array{date?: int, ip?: string, user_agent?: string}, status: string, type?: string, user_agent?: string}, amount?: null|int, currency?: string, interval?: string, notification_method?: string}, metadata?: array, original_source?: string, owner?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: string, name?: string, phone?: string}, receiver?: array{refund_attributes_method?: string}, redirect?: array{return_url: string}, source_order?: array{items?: array{amount?: int, currency?: string, description?: string, parent?: string, quantity?: int, type?: string}[], shipping?: array{address: array{city?: string, country?: string, line1: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name?: string, phone?: string, tracking_number?: string}}, statement_descriptor?: string, token?: string, type?: string, usage?: string} $params + * @param null|array|string $options + * + * @return Source the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Retrieves an existing source object. Supply the unique source ID from a source + * creation request and Stripe will return the corresponding up-to-date source + * object information. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Source + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the specified source by setting the values of the parameters passed. Any + * parameters not provided will be left unchanged. + * + * This request accepts the metadata and owner as + * arguments. It is also possible to update type specific information for selected + * payment methods. Please refer to our payment method + * guides for more detail. + * + * @param string $id the ID of the resource to update + * @param null|array{amount?: int, expand?: string[], mandate?: array{acceptance?: array{date?: int, ip?: string, offline?: array{contact_email: string}, online?: array{date?: int, ip?: string, user_agent?: string}, status: string, type?: string, user_agent?: string}, amount?: null|int, currency?: string, interval?: string, notification_method?: string}, metadata?: null|array, owner?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: string, name?: string, phone?: string}, source_order?: array{items?: array{amount?: int, currency?: string, description?: string, parent?: string, quantity?: int, type?: string}[], shipping?: array{address: array{city?: string, country?: string, line1: string, line2?: string, postal_code?: string, state?: string}, carrier?: string, name?: string, phone?: string, tracking_number?: string}}} $params + * @param null|array|string $opts + * + * @return Source the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + use ApiOperations\NestedResource; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Source the detached source + * + * @throws Exception\UnexpectedValueException if the source is not attached to a customer + * @throws Exception\ApiErrorException if the request fails + */ + public function detach($params = null, $opts = null) + { + self::_validateParams($params); + + $id = $this['id']; + if (!$id) { + $class = static::class; + $msg = "Could not determine which URL to request: {$class} instance " + . "has invalid ID: {$id}"; + + throw new Exception\UnexpectedValueException($msg, null); + } + + if ($this['customer']) { + $base = Customer::classUrl(); + $parentExtn = \urlencode(Util\Util::utf8($this['customer'])); + $extn = \urlencode(Util\Util::utf8($id)); + $url = "{$base}/{$parentExtn}/sources/{$extn}"; + + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + $message = 'This source object does not appear to be currently attached ' + . 'to a customer object.'; + + throw new Exception\UnexpectedValueException($message); + } + + /** + * @param string $id + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection list of source transactions + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allSourceTransactions($id, $params = null, $opts = null) + { + $url = static::resourceUrl($id) . '/source_transactions'; + list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Source the verified source + * + * @throws Exception\ApiErrorException if the request fails + */ + public function verify($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/verify'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/SourceMandateNotification.php b/stripe-php/lib/SourceMandateNotification.php new file mode 100644 index 0000000..91928ab --- /dev/null +++ b/stripe-php/lib/SourceMandateNotification.php @@ -0,0 +1,28 @@ +debit_initiated. + * @property null|(object{last4?: string}&StripeObject) $bacs_debit + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $reason The reason of the mandate notification. Valid reasons are mandate_confirmed or debit_initiated. + * @property null|(object{creditor_identifier?: string, last4?: string, mandate_reference?: string}&StripeObject) $sepa_debit + * @property Source $source

Source objects allow you to accept a variety of payment methods. They represent a customer's payment instrument, and can be used with the Stripe API just like a Card object: once chargeable, they can be charged, or can be attached to customers.

Stripe doesn't recommend using the deprecated Sources API. We recommend that you adopt the PaymentMethods API. This newer API provides access to our latest features and payment method types.

Related guides: Sources API and Sources & Customers.

+ * @property string $status The status of the mandate notification. Valid statuses are pending or submitted. + * @property string $type The type of source this mandate notification is attached to. Should be the source type identifier code for the payment method, such as three_d_secure. + */ +class SourceMandateNotification extends ApiResource +{ + const OBJECT_NAME = 'source_mandate_notification'; +} diff --git a/stripe-php/lib/SourceTransaction.php b/stripe-php/lib/SourceTransaction.php new file mode 100644 index 0000000..79966b7 --- /dev/null +++ b/stripe-php/lib/SourceTransaction.php @@ -0,0 +1,48 @@ +ISO currency code, in lowercase. Must be a supported currency. + * @property null|(object{fingerprint?: string, funding_method?: string, last4?: string, reference?: string, sender_account_number?: string, sender_name?: string, sender_sort_code?: string}&StripeObject) $gbp_credit_transfer + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|(object{available_at?: string, invoices?: string}&StripeObject) $paper_check + * @property null|(object{reference?: string, sender_iban?: string, sender_name?: string}&StripeObject) $sepa_credit_transfer + * @property string $source The ID of the source this transaction is attached to. + * @property string $status The status of the transaction, one of succeeded, pending, or failed. + * @property string $type The type of source this transaction is attached to. + */ +class SourceTransaction extends ApiResource +{ + const OBJECT_NAME = 'source_transaction'; + + const TYPE_ACH_CREDIT_TRANSFER = 'ach_credit_transfer'; + const TYPE_ACH_DEBIT = 'ach_debit'; + const TYPE_ALIPAY = 'alipay'; + const TYPE_BANCONTACT = 'bancontact'; + const TYPE_CARD = 'card'; + const TYPE_CARD_PRESENT = 'card_present'; + const TYPE_EPS = 'eps'; + const TYPE_GIROPAY = 'giropay'; + const TYPE_IDEAL = 'ideal'; + const TYPE_KLARNA = 'klarna'; + const TYPE_MULTIBANCO = 'multibanco'; + const TYPE_P24 = 'p24'; + const TYPE_SEPA_DEBIT = 'sepa_debit'; + const TYPE_SOFORT = 'sofort'; + const TYPE_THREE_D_SECURE = 'three_d_secure'; + const TYPE_WECHAT = 'wechat'; +} diff --git a/stripe-php/lib/Stripe.php b/stripe-php/lib/Stripe.php new file mode 100644 index 0000000..a2ebe6e --- /dev/null +++ b/stripe-php/lib/Stripe.php @@ -0,0 +1,285 @@ + NOTE: this value is only read during client creation, so creating a client and _then_ calling this method won't affect your client's behavior. + * + * @param int $maxNetworkRetries maximum number of request retries + */ + public static function setMaxNetworkRetries($maxNetworkRetries) + { + self::$maxNetworkRetries = $maxNetworkRetries; + } + + /** + * @return float Maximum delay between retries, in seconds + */ + public static function getMaxNetworkRetryDelay() + { + return self::$maxNetworkRetryDelay; + } + + /** + * @return float Maximum delay between retries, in seconds, that will be respected from the Stripe API + */ + public static function getMaxRetryAfter() + { + return self::$maxRetryAfter; + } + + /** + * @return float Initial delay between retries, in seconds + */ + public static function getInitialNetworkRetryDelay() + { + return self::$initialNetworkRetryDelay; + } + + /** + * @return bool Whether client telemetry is enabled + */ + public static function getEnableTelemetry() + { + return self::$enableTelemetry; + } + + /** + * @param bool $enableTelemetry Enables client telemetry. + * + * Client telemetry enables timing and request metrics to be sent back to Stripe as an HTTP Header + * with the current request. This enables Stripe to do latency and metrics analysis without adding extra + * overhead (such as extra network calls) on the client. + */ + public static function setEnableTelemetry($enableTelemetry) + { + self::$enableTelemetry = $enableTelemetry; + } +} diff --git a/stripe-php/lib/StripeClient.php b/stripe-php/lib/StripeClient.php new file mode 100644 index 0000000..71e6403 --- /dev/null +++ b/stripe-php/lib/StripeClient.php @@ -0,0 +1,105 @@ +getService($name); + } + + public function getService($name) + { + if (null === $this->coreServiceFactory) { + $this->coreServiceFactory = new Service\CoreServiceFactory($this); + } + + return $this->coreServiceFactory->getService($name); + } +} diff --git a/stripe-php/lib/StripeClientInterface.php b/stripe-php/lib/StripeClientInterface.php new file mode 100644 index 0000000..ca4e88f --- /dev/null +++ b/stripe-php/lib/StripeClientInterface.php @@ -0,0 +1,45 @@ +segments = $segments ?: []; + } + + /** + * Returns a new StripeContext with the given segment added to the end. + * + * @param string $segment the segment to add + * + * @return StripeContext a new StripeContext instance with the segment appended + */ + public function push($segment) + { + if (null === $segment) { + throw new \InvalidArgumentException('segment cannot be null'); + } + + $newSegments = \array_merge($this->segments, [$segment]); + + return new StripeContext($newSegments); + } + + /** + * Returns a new StripeContext with the last segment removed. + * + * @return StripeContext a new StripeContext instance with the last segment removed + */ + public function pop() + { + if (empty($this->segments)) { + throw new Exception\BadMethodCallException('Cannot pop from an empty context'); + } + + $newSegments = \array_slice($this->segments, 0, -1); + + return new StripeContext($newSegments); + } + + /** + * Converts the context to a string by joining segments with '/'. + * + * @return string string representation of the context segments joined by '/' + */ + public function __toString() + { + return \implode('/', $this->segments); + } + + /** + * Parse a context string into a StripeContext instance. + * + * @param string $contextStr string to parse (segments separated by '/') + * + * @return StripeContext StripeContext instance with segments from the string + */ + public static function parse($contextStr) + { + if (null === $contextStr || '' === $contextStr) { + return new StripeContext([]); + } + + $segments = \explode('/', $contextStr); + + return new StripeContext($segments); + } + + /** + * Returns the segments of the context. + * + * @return string[] the array of segments + */ + public function getSegments() + { + return $this->segments; + } +} diff --git a/stripe-php/lib/StripeObject.php b/stripe-php/lib/StripeObject.php new file mode 100644 index 0000000..58eb109 --- /dev/null +++ b/stripe-php/lib/StripeObject.php @@ -0,0 +1,614 @@ + "old_value"] + * + * If we update the object with `metadata[new]=new_value`, the server side + * object now has *both* fields: + * + * metadata = ["old" => "old_value", "new" => "new_value"] + * + * This is okay in itself because usually users will want to treat it as + * additive: + * + * $obj->metadata["new"] = "new_value"; + * $obj->save(); + * + * However, in other cases, they may want to replace the entire existing + * contents: + * + * $obj->metadata = ["new" => "new_value"]; + * $obj->save(); + * + * This is where things get a little bit tricky because in order to clear + * any old keys that may have existed, we actually have to send an explicit + * empty string to the server. So the operation above would have to send + * this form to get the intended behavior: + * + * metadata[old]=&metadata[new]=new_value + * + * This method allows us to track which parameters are considered additive, + * and lets us behave correctly where appropriate when serializing + * parameters to be sent. + * + * @return Util\Set Set of additive parameters + */ + public static function getAdditiveParams() + { + static $additiveParams = null; + if (null === $additiveParams) { + // Set `metadata` as additive so that when it's set directly we remember + // to clear keys that may have been previously set by sending empty + // values for them. + // + // It's possible that not every object has `metadata`, but having this + // option set when there is no `metadata` field is not harmful. + $additiveParams = new Util\Set([ + 'metadata', + ]); + } + + return $additiveParams; + } + + public function __construct($id = null, $opts = null) + { + list($id, $this->_retrieveOptions) = Util\Util::normalizeId($id); + $this->_opts = Util\RequestOptions::parse($opts); + $this->_originalValues = []; + $this->_values = []; + $this->_unsavedValues = new Util\Set(); + $this->_transientValues = new Util\Set(); + if (null !== $id) { + $this->_values['id'] = $id; + } + } + + // Standard accessor magic methods + public function __set($k, $v) + { + if (static::getPermanentAttributes()->includes($k)) { + throw new Exception\InvalidArgumentException( + "Cannot set {$k} on this object. HINT: you can't set: " + . \implode(', ', static::getPermanentAttributes()->toArray()) + ); + } + + if ('' === $v) { + throw new Exception\InvalidArgumentException( + 'You cannot set \'' . $k . '\'to an empty string. ' + . 'We interpret empty strings as NULL in requests. ' + . 'You may set obj->' . $k . ' = NULL to delete the property' + ); + } + + $this->_values[$k] = Util\Util::convertToStripeObject($v, $this->_opts); + $this->dirtyValue($this->_values[$k]); + $this->_unsavedValues->add($k); + } + + /** + * @param mixed $k + * + * @return bool + */ + public function __isset($k) + { + return isset($this->_values[$k]); + } + + public function __unset($k) + { + unset($this->_values[$k]); + $this->_transientValues->add($k); + $this->_unsavedValues->discard($k); + } + + public function &__get($k) + { + // function should return a reference, using $nullval to return a reference to null + $nullval = null; + if (!empty($this->_values) && \array_key_exists($k, $this->_values)) { + return $this->_values[$k]; + } + if (!empty($this->_transientValues) && $this->_transientValues->includes($k)) { + $class = static::class; + $attrs = \implode(', ', \array_keys($this->_values)); + $message = "Stripe Notice: Undefined property of {$class} instance: {$k}. " + . "HINT: The {$k} attribute was set in the past, however. " + . 'It was then wiped when refreshing the object ' + . "with the result returned by Stripe's API, " + . 'probably as a result of a save(). The attributes currently ' + . "available on this object are: {$attrs}"; + Stripe::getLogger()->error($message); + + return $nullval; + } + $class = static::class; + Stripe::getLogger()->error("Stripe Notice: Undefined property of {$class} instance: {$k}"); + + return $nullval; + } + + /** + * Magic method for var_dump output. Only works with PHP >= 5.6. + * + * @return array + */ + public function __debugInfo() + { + return $this->_values; + } + + // ArrayAccess methods + + /** + * @return void + */ + #[\ReturnTypeWillChange] + public function offsetSet($k, $v) + { + $this->{$k} = $v; + } + + /** + * @return bool + */ + #[\ReturnTypeWillChange] + public function offsetExists($k) + { + return \array_key_exists($k, $this->_values); + } + + /** + * @return void + */ + #[\ReturnTypeWillChange] + public function offsetUnset($k) + { + unset($this->{$k}); + } + + /** + * @return mixed + */ + #[\ReturnTypeWillChange] + public function offsetGet($k) + { + return \array_key_exists($k, $this->_values) ? $this->_values[$k] : null; + } + + /** + * @return int + */ + #[\ReturnTypeWillChange] + public function count() + { + return \count($this->_values); + } + + public function keys() + { + return \array_keys($this->_values); + } + + public function values() + { + return \array_values($this->_values); + } + + /** + * This unfortunately needs to be public to be used in Util\Util. + * + * @param array $values + * @param null|array|string|Util\RequestOptions $opts + * @param 'v1'|'v2' $apiMode + * + * @return static the object constructed from the given values + */ + public static function constructFrom($values, $opts = null, $apiMode = 'v1') + { + $obj = new static(isset($values['id']) ? $values['id'] : null); + $obj->refreshFrom($values, $opts, false, $apiMode); + + return $obj; + } + + /** + * Refreshes this object using the provided values. + * + * @param array $values + * @param null|array|string|Util\RequestOptions $opts + * @param bool $partial defaults to false + * @param 'v1'|'v2' $apiMode + */ + public function refreshFrom($values, $opts, $partial = false, $apiMode = 'v1') + { + $this->_opts = Util\RequestOptions::parse($opts); + + $this->_originalValues = self::deepCopy($values); + + if ($values instanceof StripeObject) { + $values = $values->toArray(); + } + + // Wipe old state before setting new. This is useful for e.g. updating a + // customer, where there is no persistent card parameter. Mark those values + // which don't persist as transient + if ($partial) { + $removed = new Util\Set(); + } else { + $removed = new Util\Set(\array_diff(\array_keys($this->_values), \array_keys($values))); + } + + foreach ($removed->toArray() as $k) { + unset($this->{$k}); + } + + $this->updateAttributes($values, $opts, false, $apiMode); + foreach ($values as $k => $v) { + $this->_transientValues->discard($k); + $this->_unsavedValues->discard($k); + } + } + + /** + * Mass assigns attributes on the model. + * + * @param array $values + * @param null|array|string|Util\RequestOptions $opts + * @param bool $dirty defaults to true + * @param 'v1'|'v2' $apiMode + */ + public function updateAttributes($values, $opts = null, $dirty = true, $apiMode = 'v1') + { + foreach ($values as $k => $v) { + // Special-case metadata to always be cast as a StripeObject + // This is necessary in case metadata is empty, as PHP arrays do + // not differentiate between lists and hashes, and we consider + // empty arrays to be lists. + if (('metadata' === $k) && \is_array($v)) { + $this->_values[$k] = StripeObject::constructFrom($v, $opts, $apiMode); + } else { + $this->_values[$k] = Util\Util::convertToStripeObject($v, $opts, $apiMode); + } + if ($dirty) { + $this->dirtyValue($this->_values[$k]); + } + $this->_unsavedValues->add($k); + } + } + + /** + * @param bool $force defaults to false + * + * @return array a recursive mapping of attributes to values for this object, + * including the proper value for deleted attributes + */ + public function serializeParameters($force = false) + { + $updateParams = []; + + foreach ($this->_values as $k => $v) { + // There are a few reasons that we may want to add in a parameter for + // update: + // + // 1. The `$force` option has been set. + // 2. We know that it was modified. + // 3. Its value is a StripeObject. A StripeObject may contain modified + // values within in that its parent StripeObject doesn't know about. + // + $original = \array_key_exists($k, $this->_originalValues) ? $this->_originalValues[$k] : null; + $unsaved = $this->_unsavedValues->includes($k); + if ($force || $unsaved || $v instanceof StripeObject) { + $updateParams[$k] = $this->serializeParamsValue( + $this->_values[$k], + $original, + $unsaved, + $force, + $k + ); + } + } + + // a `null` that makes it out of `serializeParamsValue` signals an empty + // value that we shouldn't appear in the serialized form of the object + return \array_filter( + $updateParams, + static function ($v) { + return null !== $v; + } + ); + } + + public function serializeParamsValue($value, $original, $unsaved, $force, $key = null) + { + // The logic here is that essentially any object embedded in another + // object that had a `type` is actually an API resource of a different + // type that's been included in the response. These other resources must + // be updated from their proper endpoints, and therefore they are not + // included when serializing even if they've been modified. + // + // There are _some_ known exceptions though. + // + // For example, if the value is unsaved (meaning the user has set it), and + // it looks like the API resource is persisted with an ID, then we include + // the object so that parameters are serialized with a reference to its + // ID. + // + // Another example is that on save API calls it's sometimes desirable to + // update a customer's default source by setting a new card (or other) + // object with `->source=` and then saving the customer. The + // `saveWithParent` flag to override the default behavior allows us to + // handle these exceptions. + // + // We throw an error if a property was set explicitly but we can't do + // anything with it because the integration is probably not working as the + // user intended it to. + if (null === $value) { + return ''; + } + if (($value instanceof ApiResource) && (!$value->saveWithParent)) { + if (!$unsaved) { + return null; + } + if (isset($value->id)) { + return $value; + } + + throw new Exception\InvalidArgumentException( + "Cannot save property `{$key}` containing an API resource of type " + . \get_class($value) . ". It doesn't appear to be persisted and is " + . 'not marked as `saveWithParent`.' + ); + } + if (\is_array($value)) { + if (Util\Util::isList($value)) { + // Sequential array, i.e. a list + $update = []; + foreach ($value as $v) { + $update[] = $this->serializeParamsValue($v, null, true, $force); + } + // This prevents an array that's unchanged from being resent. + if ($update !== $this->serializeParamsValue($original, null, true, $force, $key)) { + return $update; + } + } else { + // Associative array, i.e. a map + return Util\Util::convertToStripeObject($value, $this->_opts)->serializeParameters(); + } + } elseif ($value instanceof StripeObject) { + $update = $value->serializeParameters($force); + if ($original && $unsaved && $key && static::getAdditiveParams()->includes($key)) { + $update = \array_merge(self::emptyValues($original), $update); + } + + return $update; + } else { + return $value; + } + } + + /** + * @return mixed + */ + #[\ReturnTypeWillChange] + public function jsonSerialize() + { + return $this->toArray(); + } + + /** + * Returns an associative array with the key and values composing the + * Stripe object. + * + * @return array the associative array + */ + public function toArray() + { + $maybeToArray = static function ($value) { + if (null === $value) { + return null; + } + + return \is_object($value) && \method_exists($value, 'toArray') ? $value->toArray() : $value; + }; + + return \array_reduce(\array_keys($this->_values), function ($acc, $k) use ($maybeToArray) { + if ('_' === \substr((string) $k, 0, 1)) { + return $acc; + } + $v = $this->_values[$k]; + if (Util\Util::isList($v)) { + $acc[$k] = \array_map($maybeToArray, $v); + } else { + $acc[$k] = $maybeToArray($v); + } + + return $acc; + }, []); + } + + /** + * Returns a pretty JSON representation of the Stripe object. + * + * @return string the JSON representation of the Stripe object + */ + public function toJSON() + { + return \json_encode($this->toArray(), \JSON_PRETTY_PRINT); + } + + public function __toString() + { + $class = static::class; + + return $class . ' JSON: ' . $this->toJSON(); + } + + /** + * Sets all keys within the StripeObject as unsaved so that they will be + * included with an update when `serializeParameters` is called. This + * method is also recursive, so any StripeObjects contained as values or + * which are values in a tenant array are also marked as dirty. + */ + public function dirty() + { + $this->_unsavedValues = new Util\Set(\array_keys($this->_values)); + foreach ($this->_values as $k => $v) { + $this->dirtyValue($v); + } + } + + protected function dirtyValue($value) + { + if (\is_array($value)) { + foreach ($value as $v) { + $this->dirtyValue($v); + } + } elseif ($value instanceof StripeObject) { + $value->dirty(); + } + } + + /** + * Produces a deep copy of the given object including support for arrays + * and StripeObjects. + * + * @param mixed $obj + */ + protected static function deepCopy($obj) + { + if (\is_array($obj)) { + $copy = []; + foreach ($obj as $k => $v) { + $copy[$k] = self::deepCopy($v); + } + + return $copy; + } + if ($obj instanceof StripeObject) { + return $obj::constructFrom( + self::deepCopy($obj->_values), + clone $obj->_opts + ); + } + + return $obj; + } + + /** + * Returns a hash of empty values for all the values that are in the given + * StripeObject. + * + * @param mixed $obj + */ + public static function emptyValues($obj) + { + if (\is_array($obj)) { + $values = $obj; + } elseif ($obj instanceof StripeObject) { + $values = $obj->_values; + } else { + throw new Exception\InvalidArgumentException( + 'empty_values got unexpected object type: ' . \get_class($obj) + ); + } + + return \array_fill_keys(\array_keys($values), ''); + } + + /** + * @return null|ApiResponse The last response from the Stripe API + */ + public function getLastResponse() + { + return $this->_lastResponse; + } + + /** + * Sets the last response from the Stripe API. + * + * @param ApiResponse $resp + */ + public function setLastResponse($resp) + { + $this->_lastResponse = $resp; + } + + /** + * Indicates whether or not the resource has been deleted on the server. + * Note that some, but not all, resources can indicate whether they have + * been deleted. + * + * @return bool whether the resource is deleted + */ + public function isDeleted() + { + return isset($this->_values['deleted']) ? $this->_values['deleted'] : false; + } +} diff --git a/stripe-php/lib/StripeStreamingClientInterface.php b/stripe-php/lib/StripeStreamingClientInterface.php new file mode 100644 index 0000000..e5e34c1 --- /dev/null +++ b/stripe-php/lib/StripeStreamingClientInterface.php @@ -0,0 +1,11 @@ +Creating subscriptions + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|Application|string $application ID of the Connect Application that created the subscription. + * @property null|float $application_fee_percent A non-negative decimal between 0 and 100, with at most two decimal places. This represents the percentage of the subscription invoice total that will be transferred to the application owner's Stripe account. + * @property (object{disabled_reason: null|string, enabled: bool, liability: null|(object{account?: Account|string, type: string}&StripeObject)}&StripeObject) $automatic_tax + * @property int $billing_cycle_anchor The reference point that aligns future billing cycle dates. It sets the day of week for week intervals, the day of month for month and year intervals, and the month of year for year intervals. The timestamp is in UTC format. + * @property null|(object{day_of_month: int, hour: null|int, minute: null|int, month: null|int, second: null|int}&StripeObject) $billing_cycle_anchor_config The fixed values used to calculate the billing_cycle_anchor. + * @property (object{flexible: null|(object{proration_discounts?: string}&StripeObject), type: string, updated_at?: int}&StripeObject) $billing_mode The billing mode of the subscription. + * @property null|(object{amount_gte: null|int, reset_billing_cycle_anchor: null|bool}&StripeObject) $billing_thresholds Define thresholds at which an invoice will be sent, and the subscription advanced to a new billing period + * @property null|int $cancel_at A date in the future at which the subscription will automatically get canceled + * @property bool $cancel_at_period_end Whether this subscription will (if status=active) or did (if status=canceled) cancel at the end of the current billing period. + * @property null|int $canceled_at If the subscription has been canceled, the date of that cancellation. If the subscription was canceled with cancel_at_period_end, canceled_at will reflect the time of the most recent update request, not the end of the subscription period when the subscription is automatically moved to a canceled state. + * @property null|(object{comment: null|string, feedback: null|string, reason: null|string}&StripeObject) $cancellation_details Details about why this subscription was cancelled + * @property string $collection_method Either charge_automatically, or send_invoice. When charging automatically, Stripe will attempt to pay this subscription at the end of the cycle using the default source attached to the customer. When sending an invoice, Stripe will email your customer an invoice with payment instructions and mark the subscription as active. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property Customer|string $customer ID of the customer who owns the subscription. + * @property null|string $customer_account ID of the account representing the customer who owns the subscription. + * @property null|int $days_until_due Number of days a customer has to pay invoices generated by this subscription. This value will be null for subscriptions where collection_method=charge_automatically. + * @property null|PaymentMethod|string $default_payment_method ID of the default payment method for the subscription. It must belong to the customer associated with the subscription. This takes precedence over default_source. If neither are set, invoices will use the customer's invoice_settings.default_payment_method or default_source. + * @property null|Account|BankAccount|Card|Source|string $default_source ID of the default payment source for the subscription. It must belong to the customer associated with the subscription and be in a chargeable state. If default_payment_method is also set, default_payment_method will take precedence. If neither are set, invoices will use the customer's invoice_settings.default_payment_method or default_source. + * @property null|TaxRate[] $default_tax_rates The tax rates that will apply to any subscription item that does not have tax_rates set. Invoices created will have their default_tax_rates populated from the subscription. + * @property null|string $description The subscription's description, meant to be displayable to the customer. Use this field to optionally store an explanation of the subscription for rendering in Stripe surfaces and certain local payment methods UIs. + * @property (Discount|string)[] $discounts The discounts applied to the subscription. Subscription item discounts are applied before subscription discounts. Use expand[]=discounts to expand each discount. + * @property null|int $ended_at If the subscription has ended, the date the subscription ended. + * @property (object{account_tax_ids: null|(string|TaxId)[], issuer: (object{account?: Account|string, type: string}&StripeObject)}&StripeObject) $invoice_settings + * @property Collection $items List of subscription items, each with an attached price. + * @property null|Invoice|string $latest_invoice The most recent invoice this subscription has generated. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|int $next_pending_invoice_item_invoice Specifies the approximate timestamp on which any pending invoice items will be billed according to the schedule provided at pending_invoice_item_interval. + * @property null|Account|string $on_behalf_of The account (if any) the charge was made on behalf of for charges associated with this subscription. See the Connect documentation for details. + * @property null|(object{behavior: string, resumes_at: null|int}&StripeObject) $pause_collection If specified, payment collection for this subscription will be paused. Note that the subscription status will be unchanged and will not be updated to paused. Learn more about pausing collection. + * @property null|(object{payment_method_options: null|(object{acss_debit: null|(object{mandate_options?: (object{transaction_type: null|string}&StripeObject), verification_method?: string}&StripeObject), bancontact: null|(object{preferred_language: string}&StripeObject), card: null|(object{mandate_options?: (object{amount: null|int, amount_type: null|string, description: null|string}&StripeObject), network: null|string, request_three_d_secure: null|string}&StripeObject), customer_balance: null|(object{bank_transfer?: (object{eu_bank_transfer?: (object{country: string}&StripeObject), type: null|string}&StripeObject), funding_type: null|string}&StripeObject), konbini: null|(object{}&StripeObject), payto?: null|(object{mandate_options?: (object{amount: null|int, amount_type: null|string, purpose: null|string}&StripeObject)}&StripeObject), sepa_debit: null|(object{}&StripeObject), us_bank_account: null|(object{financial_connections?: (object{filters?: (object{account_subcategories?: string[]}&StripeObject), permissions?: string[], prefetch: null|string[]}&StripeObject), verification_method?: string}&StripeObject)}&StripeObject), payment_method_types: null|string[], save_default_payment_method: null|string}&StripeObject) $payment_settings Payment settings passed on to invoices created by the subscription. + * @property null|(object{interval: string, interval_count: int}&StripeObject) $pending_invoice_item_interval Specifies an interval for how often to bill for any pending invoice items. It is analogous to calling Create an invoice for the given subscription at the specified interval. + * @property null|SetupIntent|string $pending_setup_intent You can use this SetupIntent to collect user authentication when creating a subscription without immediate payment or updating a subscription's payment method, allowing you to optimize for off-session payments. Learn more in the SCA Migration Guide. + * @property null|(object{billing_cycle_anchor: null|int, expires_at: int, subscription_items: null|SubscriptionItem[], trial_end: null|int, trial_from_plan: null|bool}&StripeObject) $pending_update If specified, pending updates that will be applied to the subscription once the latest_invoice has been paid. + * @property null|string|SubscriptionSchedule $schedule The schedule attached to the subscription + * @property int $start_date Date when the subscription was first created. The date might differ from the created date due to backdating. + * @property string $status

Possible values are incomplete, incomplete_expired, trialing, active, past_due, canceled, unpaid, or paused.

For collection_method=charge_automatically a subscription moves into incomplete if the initial payment attempt fails. A subscription in this status can only have metadata and default_source updated. Once the first invoice is paid, the subscription moves into an active status. If the first invoice is not paid within 23 hours, the subscription transitions to incomplete_expired. This is a terminal status, the open invoice will be voided and no further invoices will be generated.

A subscription that is currently in a trial period is trialing and moves to active when the trial period is over.

A subscription can only enter a paused status when a trial ends without a payment method. A paused subscription doesn't generate invoices and can be resumed after your customer adds their payment method. The paused status is different from pausing collection, which still generates invoices and leaves the subscription's status unchanged.

If subscription collection_method=charge_automatically, it becomes past_due when payment is required but cannot be paid (due to failed payment or awaiting additional user actions). Once Stripe has exhausted all payment retry attempts, the subscription will become canceled or unpaid (depending on your subscriptions settings).

If subscription collection_method=send_invoice it becomes past_due when its invoice is not paid by the due date, and canceled or unpaid if it is still not paid by an additional deadline after that. Note that when a subscription has a status of unpaid, no subsequent invoices will be attempted (invoices will be created, but then immediately automatically closed). After receiving updated payment information from a customer, you may choose to reopen and pay their closed invoices.

+ * @property null|string|TestHelpers\TestClock $test_clock ID of the test clock this subscription belongs to. + * @property null|(object{amount_percent: null|float, destination: Account|string}&StripeObject) $transfer_data The account (if any) the subscription's payments will be attributed to for tax reporting, and where funds from each payment will be transferred to for each of the subscription's invoices. + * @property null|int $trial_end If the subscription has a trial, the end of that trial. + * @property null|(object{end_behavior: (object{missing_payment_method: string}&StripeObject)}&StripeObject) $trial_settings Settings related to subscription trials. + * @property null|int $trial_start If the subscription has a trial, the beginning of that trial. + */ +class Subscription extends ApiResource +{ + const OBJECT_NAME = 'subscription'; + + use ApiOperations\Update; + + const COLLECTION_METHOD_CHARGE_AUTOMATICALLY = 'charge_automatically'; + const COLLECTION_METHOD_SEND_INVOICE = 'send_invoice'; + + const STATUS_ACTIVE = 'active'; + const STATUS_CANCELED = 'canceled'; + const STATUS_INCOMPLETE = 'incomplete'; + const STATUS_INCOMPLETE_EXPIRED = 'incomplete_expired'; + const STATUS_PAST_DUE = 'past_due'; + const STATUS_PAUSED = 'paused'; + const STATUS_TRIALING = 'trialing'; + const STATUS_UNPAID = 'unpaid'; + + /** + * Creates a new subscription on an existing customer. Each customer can have up to + * 500 active or scheduled subscriptions. + * + * When you create a subscription with + * collection_method=charge_automatically, the first invoice is + * finalized as part of the request. The payment_behavior parameter + * determines the exact behavior of the initial payment. + * + * To start subscriptions where the first invoice always begins in a + * draft status, use subscription + * schedules instead. Schedules provide the flexibility to model more complex + * billing configurations that change over time. + * + * @param null|array{add_invoice_items?: (array{discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: null|float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, backdate_start_date?: int, billing_cycle_anchor?: int, billing_cycle_anchor_config?: array{day_of_month: int, hour?: int, minute?: int, month?: int, second?: int}, billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, cancel_at?: array|int|string, cancel_at_period_end?: bool, collection_method?: string, currency?: string, customer?: string, customer_account?: string, days_until_due?: int, default_payment_method?: string, default_source?: string, default_tax_rates?: null|string[], description?: string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice_settings?: array{account_tax_ids?: null|string[], issuer?: array{account?: string, type: string}}, items?: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: null|array, off_session?: bool, on_behalf_of?: null|string, payment_behavior?: string, payment_settings?: array{payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string}, network?: string, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, sepa_debit?: null|array{}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[], save_default_payment_method?: string}, pending_invoice_item_interval?: null|array{interval: string, interval_count?: int}, proration_behavior?: string, transfer_data?: array{amount_percent?: float, destination: string}, trial_end?: array|int|string, trial_from_plan?: bool, trial_period_days?: int, trial_settings?: array{end_behavior: array{missing_payment_method: string}}} $params + * @param null|array|string $options + * + * @return Subscription the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * By default, returns a list of subscriptions that have not been canceled. In + * order to list canceled subscriptions, specify status=canceled. + * + * @param null|array{automatic_tax?: array{enabled: bool}, collection_method?: string, created?: array|int, current_period_end?: array|int, current_period_start?: array|int, customer?: string, customer_account?: string, ending_before?: string, expand?: string[], limit?: int, plan?: string, price?: string, starting_after?: string, status?: string, test_clock?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the subscription with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Subscription + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates an existing subscription to match the specified parameters. When + * changing prices or quantities, we optionally prorate the price we charge next + * month to make up for any price changes. To preview how the proration is + * calculated, use the create + * preview endpoint. + * + * By default, we prorate subscription changes. For example, if a customer signs up + * on May 1 for a 100 price, they’ll be billed + * 100 immediately. If on May 15 they switch to a + * 200 price, then on June 1 they’ll be billed + * 250 (200 for a renewal of her + * subscription, plus a 50 prorating adjustment for half of + * the previous month’s 100 difference). Similarly, a + * downgrade generates a credit that is applied to the next invoice. We also + * prorate when you make quantity changes. + * + * Switching prices does not normally change the billing date or generate an + * immediate charge unless: + * + *
  • The billing interval is changed (for example, from monthly to + * yearly).
  • The subscription moves from free to paid.
  • A trial + * starts or ends.
+ * + * In these cases, we apply a credit for the unused time on the previous price, + * immediately charge the customer using the new price, and reset the billing date. + * Learn about how Stripe + * immediately attempts payment for subscription changes. + * + * If you want to charge for an upgrade immediately, pass + * proration_behavior as always_invoice to create + * prorations, automatically invoice the customer for those proration adjustments, + * and attempt to collect payment. If you pass create_prorations, the + * prorations are created but not automatically invoiced. If you want to bill the + * customer for the prorations before the subscription’s renewal date, you need to + * manually invoice the customer. + * + * If you don’t want to prorate, set the proration_behavior option to + * none. With this option, the customer is billed + * 100 on May 1 and 200 on June 1. + * Similarly, if you set proration_behavior to none when + * switching between different billing intervals (for example, from monthly to + * yearly), we don’t generate any credits for the old subscription’s unused time. + * We still reset the billing date and bill immediately for the new subscription. + * + * Updating the quantity on a subscription many times in an hour may result in rate limiting. If you need to bill for a frequently + * changing quantity, consider integrating usage-based billing instead. + * + * @param string $id the ID of the resource to update + * @param null|array{add_invoice_items?: (array{discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: null|float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, cancel_at?: null|array|int|string, cancel_at_period_end?: bool, cancellation_details?: array{comment?: null|string, feedback?: null|string}, collection_method?: string, days_until_due?: int, default_payment_method?: string, default_source?: null|string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], invoice_settings?: array{account_tax_ids?: null|string[], issuer?: array{account?: string, type: string}}, items?: (array{billing_thresholds?: null|array{usage_gte: int}, clear_usage?: bool, deleted?: bool, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], id?: string, metadata?: null|array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: null|array, off_session?: bool, on_behalf_of?: null|string, pause_collection?: null|array{behavior: string, resumes_at?: int}, payment_behavior?: string, payment_settings?: array{payment_method_options?: array{acss_debit?: null|array{mandate_options?: array{transaction_type?: string}, verification_method?: string}, bancontact?: null|array{preferred_language?: string}, card?: null|array{mandate_options?: array{amount?: int, amount_type?: string, description?: string}, network?: string, request_three_d_secure?: string}, customer_balance?: null|array{bank_transfer?: array{eu_bank_transfer?: array{country: string}, type?: string}, funding_type?: string}, konbini?: null|array{}, payto?: null|array{mandate_options?: array{amount?: int, purpose?: string}}, sepa_debit?: null|array{}, us_bank_account?: null|array{financial_connections?: array{filters?: array{account_subcategories?: string[]}, permissions?: string[], prefetch?: string[]}, verification_method?: string}}, payment_method_types?: null|string[], save_default_payment_method?: string}, pending_invoice_item_interval?: null|array{interval: string, interval_count?: int}, proration_behavior?: string, proration_date?: int, transfer_data?: null|array{amount_percent?: float, destination: string}, trial_end?: array|int|string, trial_from_plan?: bool, trial_settings?: array{end_behavior: array{missing_payment_method: string}}} $params + * @param null|array|string $opts + * + * @return Subscription the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + use ApiOperations\Delete { + delete as protected _delete; + } + + public static function getSavedNestedResources() + { + static $savedNestedResources = null; + if (null === $savedNestedResources) { + $savedNestedResources = new Util\Set([ + 'source', + ]); + } + + return $savedNestedResources; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Subscription the updated subscription + * + * @throws Exception\ApiErrorException if the request fails + */ + public function deleteDiscount($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/discount'; + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom(['discount' => null], $opts, true); + + return $this; + } + + const PAYMENT_BEHAVIOR_ALLOW_INCOMPLETE = 'allow_incomplete'; + const PAYMENT_BEHAVIOR_DEFAULT_INCOMPLETE = 'default_incomplete'; + const PAYMENT_BEHAVIOR_ERROR_IF_INCOMPLETE = 'error_if_incomplete'; + const PAYMENT_BEHAVIOR_PENDING_IF_INCOMPLETE = 'pending_if_incomplete'; + + const PRORATION_BEHAVIOR_ALWAYS_INVOICE = 'always_invoice'; + const PRORATION_BEHAVIOR_CREATE_PRORATIONS = 'create_prorations'; + const PRORATION_BEHAVIOR_NONE = 'none'; + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Subscription the canceled subscription + * + * @throws Exception\ApiErrorException if the request fails + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Subscription the migrated subscription + * + * @throws Exception\ApiErrorException if the request fails + */ + public function migrate($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/migrate'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Subscription the resumed subscription + * + * @throws Exception\ApiErrorException if the request fails + */ + public function resume($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/resume'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return SearchResult the subscription search results + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function search($params = null, $opts = null) + { + $url = '/v1/subscriptions/search'; + + return static::_requestPage($url, SearchResult::class, $params, $opts); + } +} diff --git a/stripe-php/lib/SubscriptionItem.php b/stripe-php/lib/SubscriptionItem.php new file mode 100644 index 0000000..51a0b5f --- /dev/null +++ b/stripe-php/lib/SubscriptionItem.php @@ -0,0 +1,134 @@ +expand[]=discounts to expand each discount. + * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property Plan $plan

You can now model subscriptions more flexibly using the Prices API. It replaces the Plans API and is backwards compatible to simplify your migration.

Plans define the base price, currency, and billing cycle for recurring purchases of products. Products help you track inventory or provisioning, and plans help you track pricing. Different physical goods or levels of service should be represented by products, and pricing options should be represented by plans. This approach lets you change prices without having to change your provisioning scheme.

For example, you might have a single "gold" product that has plans for $10/month, $100/year, €9/month, and €90/year.

Related guides: Set up a subscription and more about products and prices.

+ * @property Price $price

Prices define the unit cost, currency, and (optional) billing cycle for both recurring and one-time purchases of products. Products help you track inventory or provisioning, and prices help you track payment terms. Different physical goods or levels of service should be represented by products, and pricing options should be represented by prices. This approach lets you change prices without having to change your provisioning scheme.

For example, you might have a single "gold" product that has prices for $10/month, $100/year, and €9 once.

Related guides: Set up a subscription, create an invoice, and more about products and prices.

+ * @property null|int $quantity The quantity of the plan to which the customer should be subscribed. + * @property string $subscription The subscription this subscription_item belongs to. + * @property null|TaxRate[] $tax_rates The tax rates which apply to this subscription_item. When set, the default_tax_rates on the subscription do not apply to this subscription_item. + */ +class SubscriptionItem extends ApiResource +{ + const OBJECT_NAME = 'subscription_item'; + + use ApiOperations\Update; + + /** + * Adds a new item to an existing subscription. No existing items will be changed + * or replaced. + * + * @param null|array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], metadata?: array, payment_behavior?: string, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, proration_behavior?: string, proration_date?: int, quantity?: int, subscription: string, tax_rates?: null|string[]} $params + * @param null|array|string $options + * + * @return SubscriptionItem the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Deletes an item from the subscription. Removing a subscription item from a + * subscription will not cancel the subscription. + * + * @param null|array{clear_usage?: bool, proration_behavior?: string, proration_date?: int} $params + * @param null|array|string $opts + * + * @return SubscriptionItem the deleted resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * Returns a list of your subscription items for a given subscription. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string, subscription: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the subscription item with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return SubscriptionItem + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the plan or quantity of an item on a current subscription. + * + * @param string $id the ID of the resource to update + * @param null|array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], expand?: string[], metadata?: null|array, off_session?: bool, payment_behavior?: string, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, proration_behavior?: string, proration_date?: int, quantity?: int, tax_rates?: null|string[]} $params + * @param null|array|string $opts + * + * @return SubscriptionItem the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/SubscriptionSchedule.php b/stripe-php/lib/SubscriptionSchedule.php new file mode 100644 index 0000000..bee5293 --- /dev/null +++ b/stripe-php/lib/SubscriptionSchedule.php @@ -0,0 +1,167 @@ +Subscription schedules + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|Application|string $application ID of the Connect Application that created the schedule. + * @property (object{flexible: null|(object{proration_discounts?: string}&StripeObject), type: string, updated_at?: int}&StripeObject) $billing_mode The billing mode of the subscription. + * @property null|int $canceled_at Time at which the subscription schedule was canceled. Measured in seconds since the Unix epoch. + * @property null|int $completed_at Time at which the subscription schedule was completed. Measured in seconds since the Unix epoch. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|(object{end_date: int, start_date: int}&StripeObject) $current_phase Object representing the start and end dates for the current phase of the subscription schedule, if it is active. + * @property Customer|string $customer ID of the customer who owns the subscription schedule. + * @property null|string $customer_account ID of the account who owns the subscription schedule. + * @property (object{application_fee_percent: null|float, automatic_tax?: (object{disabled_reason: null|string, enabled: bool, liability: null|(object{account?: Account|string, type: string}&StripeObject)}&StripeObject), billing_cycle_anchor: string, billing_thresholds: null|(object{amount_gte: null|int, reset_billing_cycle_anchor: null|bool}&StripeObject), collection_method: null|string, default_payment_method: null|PaymentMethod|string, description: null|string, invoice_settings: (object{account_tax_ids: null|(string|TaxId)[], days_until_due: null|int, issuer: (object{account?: Account|string, type: string}&StripeObject)}&StripeObject), on_behalf_of: null|Account|string, transfer_data: null|(object{amount_percent: null|float, destination: Account|string}&StripeObject)}&StripeObject) $default_settings + * @property string $end_behavior Behavior of the subscription schedule and underlying subscription when it ends. Possible values are release or cancel with the default being release. release will end the subscription schedule and keep the underlying subscription running. cancel will end the subscription schedule and cancel the underlying subscription. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property ((object{add_invoice_items: ((object{discounts: ((object{coupon: null|Coupon|string, discount: null|Discount|string, promotion_code: null|PromotionCode|string}&StripeObject))[], metadata: null|StripeObject, period: (object{end: (object{timestamp?: int, type: string}&StripeObject), start: (object{timestamp?: int, type: string}&StripeObject)}&StripeObject), price: Price|string, quantity: null|int, tax_rates?: null|TaxRate[]}&StripeObject))[], application_fee_percent: null|float, automatic_tax?: (object{disabled_reason: null|string, enabled: bool, liability: null|(object{account?: Account|string, type: string}&StripeObject)}&StripeObject), billing_cycle_anchor: null|string, billing_thresholds: null|(object{amount_gte: null|int, reset_billing_cycle_anchor: null|bool}&StripeObject), collection_method: null|string, currency: string, default_payment_method: null|PaymentMethod|string, default_tax_rates?: null|TaxRate[], description: null|string, discounts: ((object{coupon: null|Coupon|string, discount: null|Discount|string, promotion_code: null|PromotionCode|string}&StripeObject))[], end_date: int, invoice_settings: null|(object{account_tax_ids: null|(string|TaxId)[], days_until_due: null|int, issuer: null|(object{account?: Account|string, type: string}&StripeObject)}&StripeObject), items: ((object{billing_thresholds: null|(object{usage_gte: null|int}&StripeObject), discounts: ((object{coupon: null|Coupon|string, discount: null|Discount|string, promotion_code: null|PromotionCode|string}&StripeObject))[], metadata: null|StripeObject, plan: Plan|string, price: Price|string, quantity?: int, tax_rates?: null|TaxRate[]}&StripeObject))[], metadata: null|StripeObject, on_behalf_of: null|Account|string, proration_behavior: string, start_date: int, transfer_data: null|(object{amount_percent: null|float, destination: Account|string}&StripeObject), trial_end: null|int}&StripeObject))[] $phases Configuration for the subscription schedule's phases. + * @property null|int $released_at Time at which the subscription schedule was released. Measured in seconds since the Unix epoch. + * @property null|string $released_subscription ID of the subscription once managed by the subscription schedule (if it is released). + * @property string $status The present status of the subscription schedule. Possible values are not_started, active, completed, released, and canceled. You can read more about the different states in our behavior guide. + * @property null|string|Subscription $subscription ID of the subscription managed by the subscription schedule. + * @property null|string|TestHelpers\TestClock $test_clock ID of the test clock this subscription schedule belongs to. + */ +class SubscriptionSchedule extends ApiResource +{ + const OBJECT_NAME = 'subscription_schedule'; + + use ApiOperations\Update; + + const END_BEHAVIOR_CANCEL = 'cancel'; + const END_BEHAVIOR_NONE = 'none'; + const END_BEHAVIOR_RELEASE = 'release'; + const END_BEHAVIOR_RENEW = 'renew'; + + const STATUS_ACTIVE = 'active'; + const STATUS_CANCELED = 'canceled'; + const STATUS_COMPLETED = 'completed'; + const STATUS_NOT_STARTED = 'not_started'; + const STATUS_RELEASED = 'released'; + + /** + * Creates a new subscription schedule object. Each customer can have up to 500 + * active or scheduled subscriptions. + * + * @param null|array{billing_mode?: array{flexible?: array{proration_discounts?: string}, type: string}, customer?: string, customer_account?: string, default_settings?: array{application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, default_payment_method?: string, description?: null|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, on_behalf_of?: null|string, transfer_data?: null|array{amount_percent?: float, destination: string}}, end_behavior?: string, expand?: string[], from_subscription?: string, metadata?: null|array, phases?: (array{add_invoice_items?: (array{discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, currency?: string, default_payment_method?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], duration?: array{interval: string, interval_count?: int}, end_date?: int, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, items: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: string, proration_behavior?: string, transfer_data?: array{amount_percent?: float, destination: string}, trial?: bool, trial_end?: int})[], start_date?: array|int|string} $params + * @param null|array|string $options + * + * @return SubscriptionSchedule the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Retrieves the list of your subscription schedules. + * + * @param null|array{canceled_at?: array|int, completed_at?: array|int, created?: array|int, customer?: string, customer_account?: string, ending_before?: string, expand?: string[], limit?: int, released_at?: array|int, scheduled?: bool, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an existing subscription schedule. You only need to + * supply the unique subscription schedule identifier that was returned upon + * subscription schedule creation. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return SubscriptionSchedule + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates an existing subscription schedule. + * + * @param string $id the ID of the resource to update + * @param null|array{default_settings?: array{application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, default_payment_method?: string, description?: null|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, on_behalf_of?: null|string, transfer_data?: null|array{amount_percent?: float, destination: string}}, end_behavior?: string, expand?: string[], metadata?: null|array, phases?: (array{add_invoice_items?: (array{discounts?: array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, period?: array{end: array{timestamp?: int, type: string}, start: array{timestamp?: int, type: string}}, price?: string, price_data?: array{currency: string, product: string, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], application_fee_percent?: float, automatic_tax?: array{enabled: bool, liability?: array{account?: string, type: string}}, billing_cycle_anchor?: string, billing_thresholds?: null|array{amount_gte?: int, reset_billing_cycle_anchor?: bool}, collection_method?: string, currency?: string, default_payment_method?: string, default_tax_rates?: null|string[], description?: null|string, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], duration?: array{interval: string, interval_count?: int}, end_date?: array|int|string, invoice_settings?: array{account_tax_ids?: null|string[], days_until_due?: int, issuer?: array{account?: string, type: string}}, items: (array{billing_thresholds?: null|array{usage_gte: int}, discounts?: null|array{coupon?: string, discount?: string, promotion_code?: string}[], metadata?: array, plan?: string, price?: string, price_data?: array{currency: string, product: string, recurring: array{interval: string, interval_count?: int}, tax_behavior?: string, unit_amount?: int, unit_amount_decimal?: string}, quantity?: int, tax_rates?: null|string[]})[], metadata?: array, on_behalf_of?: string, proration_behavior?: string, start_date?: array|int|string, transfer_data?: array{amount_percent?: float, destination: string}, trial?: bool, trial_end?: array|int|string})[], proration_behavior?: string} $params + * @param null|array|string $opts + * + * @return SubscriptionSchedule the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return SubscriptionSchedule the canceled subscription schedule + * + * @throws Exception\ApiErrorException if the request fails + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return SubscriptionSchedule the released subscription schedule + * + * @throws Exception\ApiErrorException if the request fails + */ + public function release($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/release'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/Tax/Association.php b/stripe-php/lib/Tax/Association.php new file mode 100644 index 0000000..10b1d56 --- /dev/null +++ b/stripe-php/lib/Tax/Association.php @@ -0,0 +1,19 @@ +Tax Calculation that was included in PaymentIntent. + * @property string $payment_intent The PaymentIntent that this Tax Association is tracking. + * @property null|(object{committed?: (object{transaction: string}&\Stripe\StripeObject), errored?: (object{reason: string}&\Stripe\StripeObject), source: string, status: string}&\Stripe\StripeObject)[] $tax_transaction_attempts Information about the tax transactions linked to this payment intent + */ +class Association extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'tax.association'; +} diff --git a/stripe-php/lib/Tax/Calculation.php b/stripe-php/lib/Tax/Calculation.php new file mode 100644 index 0000000..7218d9d --- /dev/null +++ b/stripe-php/lib/Tax/Calculation.php @@ -0,0 +1,93 @@ +Calculate tax in your custom payment flow + * + * @property null|string $id Unique identifier for the calculation. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount_total Total amount after taxes in the smallest currency unit. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $customer The ID of an existing Customer used for the resource. + * @property (object{address: null|(object{city: null|string, country: string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), address_source: null|string, ip_address: null|string, tax_ids: (object{type: string, value: string}&\Stripe\StripeObject)[], taxability_override: string}&\Stripe\StripeObject) $customer_details + * @property null|int $expires_at Timestamp of date at which the tax calculation will expire. + * @property null|\Stripe\Collection $line_items The list of items the customer is purchasing. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|(object{address: (object{city: null|string, country: string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $ship_from_details The details of the ship from location, such as the address. + * @property null|(object{amount: int, amount_tax: int, shipping_rate?: string, tax_behavior: string, tax_breakdown?: ((object{amount: int, jurisdiction: (object{country: string, display_name: string, level: string, state: null|string}&\Stripe\StripeObject), sourcing: string, tax_rate_details: null|(object{display_name: string, percentage_decimal: string, tax_type: string}&\Stripe\StripeObject), taxability_reason: string, taxable_amount: int}&\Stripe\StripeObject))[], tax_code: string}&\Stripe\StripeObject) $shipping_cost The shipping cost details for the calculation. + * @property int $tax_amount_exclusive The amount of tax to be collected on top of the line item prices. + * @property int $tax_amount_inclusive The amount of tax already included in the line item prices. + * @property ((object{amount: int, inclusive: bool, tax_rate_details: (object{country: null|string, flat_amount: null|(object{amount: int, currency: string}&\Stripe\StripeObject), percentage_decimal: string, rate_type: null|string, state: null|string, tax_type: null|string}&\Stripe\StripeObject), taxability_reason: string, taxable_amount: int}&\Stripe\StripeObject))[] $tax_breakdown Breakdown of individual tax amounts that add up to the total. + * @property int $tax_date Timestamp of date at which the tax rules and rates in effect applies for the calculation. + */ +class Calculation extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'tax.calculation'; + + /** + * Calculates tax based on the input and returns a Tax Calculation + * object. + * + * @param null|array{currency: string, customer?: string, customer_details?: array{address?: array{city?: null|string, country: string, line1?: null|string, line2?: null|string, postal_code?: null|string, state?: null|string}, address_source?: string, ip_address?: string, tax_ids?: array{type: string, value: string}[], taxability_override?: string}, expand?: string[], line_items: array{amount: int, metadata?: array, product?: string, quantity?: int, reference?: string, tax_behavior?: string, tax_code?: string}[], ship_from_details?: array{address: array{city?: null|string, country: string, line1?: null|string, line2?: null|string, postal_code?: null|string, state?: null|string}}, shipping_cost?: array{amount?: int, shipping_rate?: string, tax_behavior?: string, tax_code?: string}, tax_date?: int} $params + * @param null|array|string $options + * + * @return Calculation the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Retrieves a Tax Calculation object, if the calculation hasn’t + * expired. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Calculation + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * @param string $id + * @param null|array $params + * @param null|array|string $opts + * + * @return \Stripe\Collection list of calculation line items + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function allLineItems($id, $params = null, $opts = null) + { + $url = static::resourceUrl($id) . '/line_items'; + list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Tax/CalculationLineItem.php b/stripe-php/lib/Tax/CalculationLineItem.php new file mode 100644 index 0000000..a84e415 --- /dev/null +++ b/stripe-php/lib/Tax/CalculationLineItem.php @@ -0,0 +1,27 @@ +smallest currency unit. If tax_behavior=inclusive, then this amount includes taxes. Otherwise, taxes were calculated on top of this amount. + * @property int $amount_tax The amount of tax calculated for this line item, in the smallest currency unit. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $product The ID of an existing Product. + * @property int $quantity The number of units of the item being purchased. For reversals, this is the quantity reversed. + * @property string $reference A custom identifier for this line item. + * @property string $tax_behavior Specifies whether the amount includes taxes. If tax_behavior=inclusive, then the amount includes taxes. + * @property null|((object{amount: int, jurisdiction: (object{country: string, display_name: string, level: string, state: null|string}&\Stripe\StripeObject), sourcing: string, tax_rate_details: null|(object{display_name: string, percentage_decimal: string, tax_type: string}&\Stripe\StripeObject), taxability_reason: string, taxable_amount: int}&\Stripe\StripeObject))[] $tax_breakdown Detailed account of taxes relevant to this line item. + * @property string $tax_code The tax code ID used for this resource. + */ +class CalculationLineItem extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'tax.calculation_line_item'; + + const TAX_BEHAVIOR_EXCLUSIVE = 'exclusive'; + const TAX_BEHAVIOR_INCLUSIVE = 'inclusive'; +} diff --git a/stripe-php/lib/Tax/Registration.php b/stripe-php/lib/Tax/Registration.php new file mode 100644 index 0000000..5eeb48a --- /dev/null +++ b/stripe-php/lib/Tax/Registration.php @@ -0,0 +1,117 @@ +Registration lets us know that your business is registered to collect tax on payments within a region, enabling you to automatically collect tax. + * + * Stripe doesn't register on your behalf with the relevant authorities when you create a Tax Registration object. For more information on how to register to collect tax, see our guide. + * + * Related guide: Using the Registrations API + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $active_from Time at which the registration becomes active. Measured in seconds since the Unix epoch. + * @property string $country Two-letter country code (ISO 3166-1 alpha-2). + * @property (object{ae?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), al?: (object{type: string}&\Stripe\StripeObject), am?: (object{type: string}&\Stripe\StripeObject), ao?: (object{type: string}&\Stripe\StripeObject), at?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), au?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), aw?: (object{type: string}&\Stripe\StripeObject), az?: (object{type: string}&\Stripe\StripeObject), ba?: (object{type: string}&\Stripe\StripeObject), bb?: (object{type: string}&\Stripe\StripeObject), bd?: (object{type: string}&\Stripe\StripeObject), be?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), bf?: (object{type: string}&\Stripe\StripeObject), bg?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), bh?: (object{type: string}&\Stripe\StripeObject), bj?: (object{type: string}&\Stripe\StripeObject), bs?: (object{type: string}&\Stripe\StripeObject), by?: (object{type: string}&\Stripe\StripeObject), ca?: (object{province_standard?: (object{province: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), cd?: (object{type: string}&\Stripe\StripeObject), ch?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), cl?: (object{type: string}&\Stripe\StripeObject), cm?: (object{type: string}&\Stripe\StripeObject), co?: (object{type: string}&\Stripe\StripeObject), cr?: (object{type: string}&\Stripe\StripeObject), cv?: (object{type: string}&\Stripe\StripeObject), cy?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), cz?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), de?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), dk?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), ec?: (object{type: string}&\Stripe\StripeObject), ee?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), eg?: (object{type: string}&\Stripe\StripeObject), es?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), et?: (object{type: string}&\Stripe\StripeObject), fi?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), fr?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), gb?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), ge?: (object{type: string}&\Stripe\StripeObject), gn?: (object{type: string}&\Stripe\StripeObject), gr?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), hr?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), hu?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), id?: (object{type: string}&\Stripe\StripeObject), ie?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), in?: (object{type: string}&\Stripe\StripeObject), is?: (object{type: string}&\Stripe\StripeObject), it?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), jp?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), ke?: (object{type: string}&\Stripe\StripeObject), kg?: (object{type: string}&\Stripe\StripeObject), kh?: (object{type: string}&\Stripe\StripeObject), kr?: (object{type: string}&\Stripe\StripeObject), kz?: (object{type: string}&\Stripe\StripeObject), la?: (object{type: string}&\Stripe\StripeObject), lt?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), lu?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), lv?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), ma?: (object{type: string}&\Stripe\StripeObject), md?: (object{type: string}&\Stripe\StripeObject), me?: (object{type: string}&\Stripe\StripeObject), mk?: (object{type: string}&\Stripe\StripeObject), mr?: (object{type: string}&\Stripe\StripeObject), mt?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), mx?: (object{type: string}&\Stripe\StripeObject), my?: (object{type: string}&\Stripe\StripeObject), ng?: (object{type: string}&\Stripe\StripeObject), nl?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), no?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), np?: (object{type: string}&\Stripe\StripeObject), nz?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), om?: (object{type: string}&\Stripe\StripeObject), pe?: (object{type: string}&\Stripe\StripeObject), ph?: (object{type: string}&\Stripe\StripeObject), pl?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), pt?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), ro?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), rs?: (object{type: string}&\Stripe\StripeObject), ru?: (object{type: string}&\Stripe\StripeObject), sa?: (object{type: string}&\Stripe\StripeObject), se?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), sg?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), si?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), sk?: (object{standard?: (object{place_of_supply_scheme: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), sn?: (object{type: string}&\Stripe\StripeObject), sr?: (object{type: string}&\Stripe\StripeObject), th?: (object{type: string}&\Stripe\StripeObject), tj?: (object{type: string}&\Stripe\StripeObject), tr?: (object{type: string}&\Stripe\StripeObject), tw?: (object{type: string}&\Stripe\StripeObject), tz?: (object{type: string}&\Stripe\StripeObject), ua?: (object{type: string}&\Stripe\StripeObject), ug?: (object{type: string}&\Stripe\StripeObject), us?: (object{local_amusement_tax?: (object{jurisdiction: string}&\Stripe\StripeObject), local_lease_tax?: (object{jurisdiction: string}&\Stripe\StripeObject), state: string, state_sales_tax?: (object{elections?: (object{jurisdiction?: string, type: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), uy?: (object{type: string}&\Stripe\StripeObject), uz?: (object{type: string}&\Stripe\StripeObject), vn?: (object{type: string}&\Stripe\StripeObject), za?: (object{type: string}&\Stripe\StripeObject), zm?: (object{type: string}&\Stripe\StripeObject), zw?: (object{type: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $country_options + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|int $expires_at If set, the registration stops being active at this time. If not set, the registration will be active indefinitely. Measured in seconds since the Unix epoch. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $status The status of the registration. This field is present for convenience and can be deduced from active_from and expires_at. + */ +class Registration extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'tax.registration'; + + use \Stripe\ApiOperations\Update; + + const STATUS_ACTIVE = 'active'; + const STATUS_EXPIRED = 'expired'; + const STATUS_SCHEDULED = 'scheduled'; + + /** + * Creates a new Tax Registration object. + * + * @param null|array{active_from: array|int|string, country: string, country_options: array{ae?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, al?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, am?: array{type: string}, ao?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, at?: array{standard?: array{place_of_supply_scheme: string}, type: string}, au?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, aw?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, az?: array{type: string}, ba?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, bb?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, bd?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, be?: array{standard?: array{place_of_supply_scheme: string}, type: string}, bf?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, bg?: array{standard?: array{place_of_supply_scheme: string}, type: string}, bh?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, bj?: array{type: string}, bs?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, by?: array{type: string}, ca?: array{province_standard?: array{province: string}, type: string}, cd?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, ch?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, cl?: array{type: string}, cm?: array{type: string}, co?: array{type: string}, cr?: array{type: string}, cv?: array{type: string}, cy?: array{standard?: array{place_of_supply_scheme: string}, type: string}, cz?: array{standard?: array{place_of_supply_scheme: string}, type: string}, de?: array{standard?: array{place_of_supply_scheme: string}, type: string}, dk?: array{standard?: array{place_of_supply_scheme: string}, type: string}, ec?: array{type: string}, ee?: array{standard?: array{place_of_supply_scheme: string}, type: string}, eg?: array{type: string}, es?: array{standard?: array{place_of_supply_scheme: string}, type: string}, et?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, fi?: array{standard?: array{place_of_supply_scheme: string}, type: string}, fr?: array{standard?: array{place_of_supply_scheme: string}, type: string}, gb?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, ge?: array{type: string}, gn?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, gr?: array{standard?: array{place_of_supply_scheme: string}, type: string}, hr?: array{standard?: array{place_of_supply_scheme: string}, type: string}, hu?: array{standard?: array{place_of_supply_scheme: string}, type: string}, id?: array{type: string}, ie?: array{standard?: array{place_of_supply_scheme: string}, type: string}, in?: array{type: string}, is?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, it?: array{standard?: array{place_of_supply_scheme: string}, type: string}, jp?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, ke?: array{type: string}, kg?: array{type: string}, kh?: array{type: string}, kr?: array{type: string}, kz?: array{type: string}, la?: array{type: string}, lt?: array{standard?: array{place_of_supply_scheme: string}, type: string}, lu?: array{standard?: array{place_of_supply_scheme: string}, type: string}, lv?: array{standard?: array{place_of_supply_scheme: string}, type: string}, ma?: array{type: string}, md?: array{type: string}, me?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, mk?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, mr?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, mt?: array{standard?: array{place_of_supply_scheme: string}, type: string}, mx?: array{type: string}, my?: array{type: string}, ng?: array{type: string}, nl?: array{standard?: array{place_of_supply_scheme: string}, type: string}, no?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, np?: array{type: string}, nz?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, om?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, pe?: array{type: string}, ph?: array{type: string}, pl?: array{standard?: array{place_of_supply_scheme: string}, type: string}, pt?: array{standard?: array{place_of_supply_scheme: string}, type: string}, ro?: array{standard?: array{place_of_supply_scheme: string}, type: string}, rs?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, ru?: array{type: string}, sa?: array{type: string}, se?: array{standard?: array{place_of_supply_scheme: string}, type: string}, sg?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, si?: array{standard?: array{place_of_supply_scheme: string}, type: string}, sk?: array{standard?: array{place_of_supply_scheme: string}, type: string}, sn?: array{type: string}, sr?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, th?: array{type: string}, tj?: array{type: string}, tr?: array{type: string}, tw?: array{type: string}, tz?: array{type: string}, ua?: array{type: string}, ug?: array{type: string}, us?: array{local_amusement_tax?: array{jurisdiction: string}, local_lease_tax?: array{jurisdiction: string}, state: string, state_sales_tax?: array{elections: array{jurisdiction?: string, type: string}[]}, type: string}, uy?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, uz?: array{type: string}, vn?: array{type: string}, za?: array{standard?: array{place_of_supply_scheme?: string}, type: string}, zm?: array{type: string}, zw?: array{standard?: array{place_of_supply_scheme?: string}, type: string}}, expand?: string[], expires_at?: int} $params + * @param null|array|string $options + * + * @return Registration the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of Tax Registration objects. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Returns a Tax Registration object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Registration + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates an existing Tax Registration object. + * + * A registration cannot be deleted after it has been created. If you wish to end a + * registration you may do so by setting expires_at. + * + * @param string $id the ID of the resource to update + * @param null|array{active_from?: array|int|string, expand?: string[], expires_at?: null|array|int|string} $params + * @param null|array|string $opts + * + * @return Registration the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Tax/Settings.php b/stripe-php/lib/Tax/Settings.php new file mode 100644 index 0000000..321e5d3 --- /dev/null +++ b/stripe-php/lib/Tax/Settings.php @@ -0,0 +1,86 @@ +Settings to manage configurations used by Stripe Tax calculations. + * + * Related guide: Using the Settings API + * + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property (object{provider: string, tax_behavior: null|string, tax_code: null|string}&\Stripe\StripeObject) $defaults + * @property null|(object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $head_office The place where your business is located. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $status The status of the Tax Settings. + * @property (object{active?: (object{}&\Stripe\StripeObject), pending?: (object{missing_fields: null|string[]}&\Stripe\StripeObject)}&\Stripe\StripeObject) $status_details + */ +class Settings extends \Stripe\SingletonApiResource +{ + const OBJECT_NAME = 'tax.settings'; + + const STATUS_ACTIVE = 'active'; + const STATUS_PENDING = 'pending'; + + /** + * Retrieves Tax Settings for a merchant. + * + * @param null|array|string $opts + * + * @return Settings + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static(null, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return static the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($params = null, $opts = null) + { + self::_validateParams($params); + $url = '/v1/tax/settings'; + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array|string $opts + * + * @return static the saved resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + * + * @deprecated The `save` method is deprecated and will be removed in a + * future major version of the library. Use the static method `update` + * on the resource instead. + */ + public function save($opts = null) + { + $params = $this->serializeParameters(); + if (\count($params) > 0) { + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('post', $url, $params, $opts, ['save']); + $this->refreshFrom($response, $opts); + } + + return $this; + } +} diff --git a/stripe-php/lib/Tax/Transaction.php b/stripe-php/lib/Tax/Transaction.php new file mode 100644 index 0000000..e851a95 --- /dev/null +++ b/stripe-php/lib/Tax/Transaction.php @@ -0,0 +1,109 @@ +Calculate tax in your custom payment flow + * + * @property string $id Unique identifier for the transaction. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $customer The ID of an existing Customer used for the resource. + * @property (object{address: null|(object{city: null|string, country: string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), address_source: null|string, ip_address: null|string, tax_ids: (object{type: string, value: string}&\Stripe\StripeObject)[], taxability_override: string}&\Stripe\StripeObject) $customer_details + * @property null|\Stripe\Collection $line_items The tax collected or refunded, by line item. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property int $posted_at The Unix timestamp representing when the tax liability is assumed or reduced. + * @property string $reference A custom unique identifier, such as 'myOrder_123'. + * @property null|(object{original_transaction: null|string}&\Stripe\StripeObject) $reversal If type=reversal, contains information about what was reversed. + * @property null|(object{address: (object{city: null|string, country: string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $ship_from_details The details of the ship from location, such as the address. + * @property null|(object{amount: int, amount_tax: int, shipping_rate?: string, tax_behavior: string, tax_breakdown?: ((object{amount: int, jurisdiction: (object{country: string, display_name: string, level: string, state: null|string}&\Stripe\StripeObject), sourcing: string, tax_rate_details: null|(object{display_name: string, percentage_decimal: string, tax_type: string}&\Stripe\StripeObject), taxability_reason: string, taxable_amount: int}&\Stripe\StripeObject))[], tax_code: string}&\Stripe\StripeObject) $shipping_cost The shipping cost details for the transaction. + * @property int $tax_date Timestamp of date at which the tax rules and rates in effect applies for the calculation. + * @property string $type If reversal, this transaction reverses an earlier transaction. + */ +class Transaction extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'tax.transaction'; + + const TYPE_REVERSAL = 'reversal'; + const TYPE_TRANSACTION = 'transaction'; + + /** + * Retrieves a Tax Transaction object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Transaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Transaction the created transaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function createFromCalculation($params = null, $opts = null) + { + $url = static::classUrl() . '/create_from_calculation'; + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Transaction the created transaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function createReversal($params = null, $opts = null) + { + $url = static::classUrl() . '/create_reversal'; + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param string $id + * @param null|array $params + * @param null|array|string $opts + * + * @return \Stripe\Collection list of transaction line items + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function allLineItems($id, $params = null, $opts = null) + { + $url = static::resourceUrl($id) . '/line_items'; + list($response, $opts) = static::_staticRequest('get', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Tax/TransactionLineItem.php b/stripe-php/lib/Tax/TransactionLineItem.php new file mode 100644 index 0000000..fae64c4 --- /dev/null +++ b/stripe-php/lib/Tax/TransactionLineItem.php @@ -0,0 +1,31 @@ +smallest currency unit. If tax_behavior=inclusive, then this amount includes taxes. Otherwise, taxes were calculated on top of this amount. + * @property int $amount_tax The amount of tax calculated for this line item, in the smallest currency unit. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $product The ID of an existing Product. + * @property int $quantity The number of units of the item being purchased. For reversals, this is the quantity reversed. + * @property string $reference A custom identifier for this line item in the transaction. + * @property null|(object{original_line_item: string}&\Stripe\StripeObject) $reversal If type=reversal, contains information about what was reversed. + * @property string $tax_behavior Specifies whether the amount includes taxes. If tax_behavior=inclusive, then the amount includes taxes. + * @property string $tax_code The tax code ID used for this resource. + * @property string $type If reversal, this line item reverses an earlier transaction. + */ +class TransactionLineItem extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'tax.transaction_line_item'; + + const TAX_BEHAVIOR_EXCLUSIVE = 'exclusive'; + const TAX_BEHAVIOR_INCLUSIVE = 'inclusive'; + + const TYPE_REVERSAL = 'reversal'; + const TYPE_TRANSACTION = 'transaction'; +} diff --git a/stripe-php/lib/TaxCode.php b/stripe-php/lib/TaxCode.php new file mode 100644 index 0000000..4d50d23 --- /dev/null +++ b/stripe-php/lib/TaxCode.php @@ -0,0 +1,56 @@ +Tax codes classify goods and services for tax purposes. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property string $description A detailed description of which types of products the tax code represents. + * @property string $name A short name for the tax code. + */ +class TaxCode extends ApiResource +{ + const OBJECT_NAME = 'tax_code'; + + /** + * A list of all tax codes + * available to add to Products in order to allow specific tax calculations. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an existing tax code. Supply the unique tax code ID and + * Stripe will return the corresponding tax code information. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return TaxCode + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/TaxDeductedAtSource.php b/stripe-php/lib/TaxDeductedAtSource.php new file mode 100644 index 0000000..93bb8a3 --- /dev/null +++ b/stripe-php/lib/TaxDeductedAtSource.php @@ -0,0 +1,17 @@ +customer or account. + * Customer and account tax IDs get displayed on related invoices and credit notes. + * + * Related guides: Customer tax identification numbers, Account tax IDs + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|string $country Two-letter ISO code representing the country of the tax ID. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|Customer|string $customer ID of the customer. + * @property null|string $customer_account ID of the Account representing the customer. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|(object{account?: Account|string, application?: Application|string, customer?: Customer|string, customer_account: null|string, type: string}&StripeObject) $owner The account or customer the tax ID belongs to. + * @property string $type Type of the tax ID, one of ad_nrt, ae_trn, al_tin, am_tin, ao_tin, ar_cuit, au_abn, au_arn, aw_tin, az_tin, ba_tin, bb_tin, bd_bin, bf_ifu, bg_uic, bh_vat, bj_ifu, bo_tin, br_cnpj, br_cpf, bs_tin, by_tin, ca_bn, ca_gst_hst, ca_pst_bc, ca_pst_mb, ca_pst_sk, ca_qst, cd_nif, ch_uid, ch_vat, cl_tin, cm_niu, cn_tin, co_nit, cr_tin, cv_nif, de_stn, do_rcn, ec_ruc, eg_tin, es_cif, et_tin, eu_oss_vat, eu_vat, gb_vat, ge_vat, gn_nif, hk_br, hr_oib, hu_tin, id_npwp, il_vat, in_gst, is_vat, jp_cn, jp_rn, jp_trn, ke_pin, kg_tin, kh_tin, kr_brn, kz_bin, la_tin, li_uid, li_vat, ma_vat, md_vat, me_pib, mk_vat, mr_nif, mx_rfc, my_frp, my_itn, my_sst, ng_tin, no_vat, no_voec, np_pan, nz_gst, om_vat, pe_ruc, ph_tin, ro_tin, rs_pib, ru_inn, ru_kpp, sa_vat, sg_gst, sg_uen, si_tin, sn_ninea, sr_fin, sv_nit, th_vat, tj_tin, tr_tin, tw_vat, tz_vat, ua_vat, ug_tin, us_ein, uy_ruc, uz_tin, uz_vat, ve_rif, vn_tin, za_vat, zm_tin, or zw_tin. Note that some legacy tax IDs have type unknown + * @property string $value Value of the tax ID. + * @property null|(object{status: string, verified_address: null|string, verified_name: null|string}&StripeObject) $verification Tax ID verification information. + */ +class TaxId extends ApiResource +{ + const OBJECT_NAME = 'tax_id'; + + const TYPE_AD_NRT = 'ad_nrt'; + const TYPE_AE_TRN = 'ae_trn'; + const TYPE_AL_TIN = 'al_tin'; + const TYPE_AM_TIN = 'am_tin'; + const TYPE_AO_TIN = 'ao_tin'; + const TYPE_AR_CUIT = 'ar_cuit'; + const TYPE_AU_ABN = 'au_abn'; + const TYPE_AU_ARN = 'au_arn'; + const TYPE_AW_TIN = 'aw_tin'; + const TYPE_AZ_TIN = 'az_tin'; + const TYPE_BA_TIN = 'ba_tin'; + const TYPE_BB_TIN = 'bb_tin'; + const TYPE_BD_BIN = 'bd_bin'; + const TYPE_BF_IFU = 'bf_ifu'; + const TYPE_BG_UIC = 'bg_uic'; + const TYPE_BH_VAT = 'bh_vat'; + const TYPE_BJ_IFU = 'bj_ifu'; + const TYPE_BO_TIN = 'bo_tin'; + const TYPE_BR_CNPJ = 'br_cnpj'; + const TYPE_BR_CPF = 'br_cpf'; + const TYPE_BS_TIN = 'bs_tin'; + const TYPE_BY_TIN = 'by_tin'; + const TYPE_CA_BN = 'ca_bn'; + const TYPE_CA_GST_HST = 'ca_gst_hst'; + const TYPE_CA_PST_BC = 'ca_pst_bc'; + const TYPE_CA_PST_MB = 'ca_pst_mb'; + const TYPE_CA_PST_SK = 'ca_pst_sk'; + const TYPE_CA_QST = 'ca_qst'; + const TYPE_CD_NIF = 'cd_nif'; + const TYPE_CH_UID = 'ch_uid'; + const TYPE_CH_VAT = 'ch_vat'; + const TYPE_CL_TIN = 'cl_tin'; + const TYPE_CM_NIU = 'cm_niu'; + const TYPE_CN_TIN = 'cn_tin'; + const TYPE_CO_NIT = 'co_nit'; + const TYPE_CR_TIN = 'cr_tin'; + const TYPE_CV_NIF = 'cv_nif'; + const TYPE_DE_STN = 'de_stn'; + const TYPE_DO_RCN = 'do_rcn'; + const TYPE_EC_RUC = 'ec_ruc'; + const TYPE_EG_TIN = 'eg_tin'; + const TYPE_ES_CIF = 'es_cif'; + const TYPE_ET_TIN = 'et_tin'; + const TYPE_EU_OSS_VAT = 'eu_oss_vat'; + const TYPE_EU_VAT = 'eu_vat'; + const TYPE_GB_VAT = 'gb_vat'; + const TYPE_GE_VAT = 'ge_vat'; + const TYPE_GN_NIF = 'gn_nif'; + const TYPE_HK_BR = 'hk_br'; + const TYPE_HR_OIB = 'hr_oib'; + const TYPE_HU_TIN = 'hu_tin'; + const TYPE_ID_NPWP = 'id_npwp'; + const TYPE_IL_VAT = 'il_vat'; + const TYPE_IN_GST = 'in_gst'; + const TYPE_IS_VAT = 'is_vat'; + const TYPE_JP_CN = 'jp_cn'; + const TYPE_JP_RN = 'jp_rn'; + const TYPE_JP_TRN = 'jp_trn'; + const TYPE_KE_PIN = 'ke_pin'; + const TYPE_KG_TIN = 'kg_tin'; + const TYPE_KH_TIN = 'kh_tin'; + const TYPE_KR_BRN = 'kr_brn'; + const TYPE_KZ_BIN = 'kz_bin'; + const TYPE_LA_TIN = 'la_tin'; + const TYPE_LI_UID = 'li_uid'; + const TYPE_LI_VAT = 'li_vat'; + const TYPE_MA_VAT = 'ma_vat'; + const TYPE_MD_VAT = 'md_vat'; + const TYPE_ME_PIB = 'me_pib'; + const TYPE_MK_VAT = 'mk_vat'; + const TYPE_MR_NIF = 'mr_nif'; + const TYPE_MX_RFC = 'mx_rfc'; + const TYPE_MY_FRP = 'my_frp'; + const TYPE_MY_ITN = 'my_itn'; + const TYPE_MY_SST = 'my_sst'; + const TYPE_NG_TIN = 'ng_tin'; + const TYPE_NO_VAT = 'no_vat'; + const TYPE_NO_VOEC = 'no_voec'; + const TYPE_NP_PAN = 'np_pan'; + const TYPE_NZ_GST = 'nz_gst'; + const TYPE_OM_VAT = 'om_vat'; + const TYPE_PE_RUC = 'pe_ruc'; + const TYPE_PH_TIN = 'ph_tin'; + const TYPE_RO_TIN = 'ro_tin'; + const TYPE_RS_PIB = 'rs_pib'; + const TYPE_RU_INN = 'ru_inn'; + const TYPE_RU_KPP = 'ru_kpp'; + const TYPE_SA_VAT = 'sa_vat'; + const TYPE_SG_GST = 'sg_gst'; + const TYPE_SG_UEN = 'sg_uen'; + const TYPE_SI_TIN = 'si_tin'; + const TYPE_SN_NINEA = 'sn_ninea'; + const TYPE_SR_FIN = 'sr_fin'; + const TYPE_SV_NIT = 'sv_nit'; + const TYPE_TH_VAT = 'th_vat'; + const TYPE_TJ_TIN = 'tj_tin'; + const TYPE_TR_TIN = 'tr_tin'; + const TYPE_TW_VAT = 'tw_vat'; + const TYPE_TZ_VAT = 'tz_vat'; + const TYPE_UA_VAT = 'ua_vat'; + const TYPE_UG_TIN = 'ug_tin'; + const TYPE_UNKNOWN = 'unknown'; + const TYPE_US_EIN = 'us_ein'; + const TYPE_UY_RUC = 'uy_ruc'; + const TYPE_UZ_TIN = 'uz_tin'; + const TYPE_UZ_VAT = 'uz_vat'; + const TYPE_VE_RIF = 've_rif'; + const TYPE_VN_TIN = 'vn_tin'; + const TYPE_ZA_VAT = 'za_vat'; + const TYPE_ZM_TIN = 'zm_tin'; + const TYPE_ZW_TIN = 'zw_tin'; + + /** + * Creates a new account or customer tax_id object. + * + * @param null|array{expand?: string[], owner?: array{account?: string, customer?: string, customer_account?: string, type: string}, type: string, value: string} $params + * @param null|array|string $options + * + * @return TaxId the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Deletes an existing account or customer tax_id object. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return TaxId the deleted resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * Returns a list of tax IDs. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, owner?: array{account?: string, customer?: string, customer_account?: string, type: string}, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves an account or customer tax_id object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return TaxId + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + const VERIFICATION_STATUS_PENDING = 'pending'; + const VERIFICATION_STATUS_UNAVAILABLE = 'unavailable'; + const VERIFICATION_STATUS_UNVERIFIED = 'unverified'; + const VERIFICATION_STATUS_VERIFIED = 'verified'; +} diff --git a/stripe-php/lib/TaxRate.php b/stripe-php/lib/TaxRate.php new file mode 100644 index 0000000..148745a --- /dev/null +++ b/stripe-php/lib/TaxRate.php @@ -0,0 +1,143 @@ +invoices, subscriptions and Checkout Sessions to collect tax. + * + * Related guide: Tax rates + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property bool $active Defaults to true. When set to false, this tax rate cannot be used with new applications or Checkout Sessions, but will still work for subscriptions and invoices that already have it set. + * @property null|string $country Two-letter country code (ISO 3166-1 alpha-2). + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $description An arbitrary string attached to the tax rate for your internal use only. It will not be visible to your customers. + * @property string $display_name The display name of the tax rates as it will appear to your customer on their receipt email, PDF, and the hosted invoice page. + * @property null|float $effective_percentage Actual/effective tax rate percentage out of 100. For tax calculations with automatic_tax[enabled]=true, this percentage reflects the rate actually used to calculate tax based on the product's taxability and whether the user is registered to collect taxes in the corresponding jurisdiction. + * @property null|(object{amount: int, currency: string}&StripeObject) $flat_amount The amount of the tax rate when the rate_type is flat_amount. Tax rates with rate_type percentage can vary based on the transaction, resulting in this field being null. This field exposes the amount and currency of the flat tax rate. + * @property bool $inclusive This specifies if the tax rate is inclusive or exclusive. + * @property null|string $jurisdiction The jurisdiction for the tax rate. You can use this label field for tax reporting purposes. It also appears on your customer’s invoice. + * @property null|string $jurisdiction_level The level of the jurisdiction that imposes this tax rate. Will be null for manually defined tax rates. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property float $percentage Tax rate percentage out of 100. For tax calculations with automatic_tax[enabled]=true, this percentage includes the statutory tax rate of non-taxable jurisdictions. + * @property null|string $rate_type Indicates the type of tax rate applied to the taxable amount. This value can be null when no tax applies to the location. This field is only present for TaxRates created by Stripe Tax. + * @property null|string $state ISO 3166-2 subdivision code, without country prefix. For example, "NY" for New York, United States. + * @property null|string $tax_type The high-level tax type, such as vat or sales_tax. + */ +class TaxRate extends ApiResource +{ + const OBJECT_NAME = 'tax_rate'; + + use ApiOperations\Update; + + const JURISDICTION_LEVEL_CITY = 'city'; + const JURISDICTION_LEVEL_COUNTRY = 'country'; + const JURISDICTION_LEVEL_COUNTY = 'county'; + const JURISDICTION_LEVEL_DISTRICT = 'district'; + const JURISDICTION_LEVEL_MULTIPLE = 'multiple'; + const JURISDICTION_LEVEL_STATE = 'state'; + + const RATE_TYPE_FLAT_AMOUNT = 'flat_amount'; + const RATE_TYPE_PERCENTAGE = 'percentage'; + + const TAX_TYPE_AMUSEMENT_TAX = 'amusement_tax'; + const TAX_TYPE_COMMUNICATIONS_TAX = 'communications_tax'; + const TAX_TYPE_GST = 'gst'; + const TAX_TYPE_HST = 'hst'; + const TAX_TYPE_IGST = 'igst'; + const TAX_TYPE_JCT = 'jct'; + const TAX_TYPE_LEASE_TAX = 'lease_tax'; + const TAX_TYPE_PST = 'pst'; + const TAX_TYPE_QST = 'qst'; + const TAX_TYPE_RETAIL_DELIVERY_FEE = 'retail_delivery_fee'; + const TAX_TYPE_RST = 'rst'; + const TAX_TYPE_SALES_TAX = 'sales_tax'; + const TAX_TYPE_SERVICE_TAX = 'service_tax'; + const TAX_TYPE_VAT = 'vat'; + + /** + * Creates a new tax rate. + * + * @param null|array{active?: bool, country?: string, description?: string, display_name: string, expand?: string[], inclusive: bool, jurisdiction?: string, metadata?: array, percentage: float, state?: string, tax_type?: string} $params + * @param null|array|string $options + * + * @return TaxRate the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of your tax rates. Tax rates are returned sorted by creation + * date, with the most recently created tax rates appearing first. + * + * @param null|array{active?: bool, created?: array|int, ending_before?: string, expand?: string[], inclusive?: bool, limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves a tax rate with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return TaxRate + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates an existing tax rate. + * + * @param string $id the ID of the resource to update + * @param null|array{active?: bool, country?: string, description?: string, display_name?: string, expand?: string[], jurisdiction?: string, metadata?: null|array, state?: string, tax_type?: string} $params + * @param null|array|string $opts + * + * @return TaxRate the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Terminal/Configuration.php b/stripe-php/lib/Terminal/Configuration.php new file mode 100644 index 0000000..b94828d --- /dev/null +++ b/stripe-php/lib/Terminal/Configuration.php @@ -0,0 +1,132 @@ +Terminal configurations documentation. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|(object{splashscreen?: string|\Stripe\File}&\Stripe\StripeObject) $bbpos_wisepad3 + * @property null|(object{splashscreen?: string|\Stripe\File}&\Stripe\StripeObject) $bbpos_wisepos_e + * @property null|bool $is_account_default Whether this Configuration is the default for your account + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string $name String indicating the name of the Configuration object, set by the user + * @property null|(object{enabled: null|bool}&\Stripe\StripeObject) $offline + * @property null|(object{end_hour: int, start_hour: int}&\Stripe\StripeObject) $reboot_window + * @property null|(object{splashscreen?: string|\Stripe\File}&\Stripe\StripeObject) $stripe_s700 + * @property null|(object{aed?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), aud?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), bgn?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), cad?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), chf?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), czk?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), dkk?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), eur?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), gbp?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), gip?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), hkd?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), huf?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), jpy?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), mxn?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), myr?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), nok?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), nzd?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), pln?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), ron?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), sek?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), sgd?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject), usd?: (object{fixed_amounts?: null|int[], percentages?: null|int[], smart_tip_threshold?: int}&\Stripe\StripeObject)}&\Stripe\StripeObject) $tipping + * @property null|(object{splashscreen?: string|\Stripe\File}&\Stripe\StripeObject) $verifone_p400 + * @property null|(object{enterprise_eap_peap?: (object{ca_certificate_file?: string, password: string, ssid: string, username: string}&\Stripe\StripeObject), enterprise_eap_tls?: (object{ca_certificate_file?: string, client_certificate_file: string, private_key_file: string, private_key_file_password?: string, ssid: string}&\Stripe\StripeObject), personal_psk?: (object{password: string, ssid: string}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject) $wifi + */ +class Configuration extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'terminal.configuration'; + + use \Stripe\ApiOperations\Update; + + /** + * Creates a new Configuration object. + * + * @param null|array{bbpos_wisepad3?: array{splashscreen?: null|string}, bbpos_wisepos_e?: array{splashscreen?: null|string}, expand?: string[], name?: string, offline?: null|array{enabled: bool}, reboot_window?: array{end_hour: int, start_hour: int}, stripe_s700?: array{splashscreen?: null|string}, tipping?: null|array{aed?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, aud?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, bgn?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, cad?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, chf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, czk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, dkk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, eur?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gbp?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gip?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, hkd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, huf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, jpy?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, mxn?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, myr?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nok?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nzd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, pln?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, ron?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sek?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sgd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, usd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}}, verifone_p400?: array{splashscreen?: null|string}, wifi?: null|array{enterprise_eap_peap?: array{ca_certificate_file?: string, password: string, ssid: string, username: string}, enterprise_eap_tls?: array{ca_certificate_file?: string, client_certificate_file: string, private_key_file: string, private_key_file_password?: string, ssid: string}, personal_psk?: array{password: string, ssid: string}, type: string}} $params + * @param null|array|string $options + * + * @return Configuration the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Deletes a Configuration object. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return Configuration the deleted resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * Returns a list of Configuration objects. + * + * @param null|array{ending_before?: string, expand?: string[], is_account_default?: bool, limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a Configuration object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Configuration + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates a new Configuration object. + * + * @param string $id the ID of the resource to update + * @param null|array{bbpos_wisepad3?: null|array{splashscreen?: null|string}, bbpos_wisepos_e?: null|array{splashscreen?: null|string}, expand?: string[], name?: string, offline?: null|array{enabled: bool}, reboot_window?: null|array{end_hour: int, start_hour: int}, stripe_s700?: null|array{splashscreen?: null|string}, tipping?: null|array{aed?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, aud?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, bgn?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, cad?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, chf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, czk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, dkk?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, eur?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gbp?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, gip?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, hkd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, huf?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, jpy?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, mxn?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, myr?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nok?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, nzd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, pln?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, ron?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sek?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, sgd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}, usd?: array{fixed_amounts?: int[], percentages?: int[], smart_tip_threshold?: int}}, verifone_p400?: null|array{splashscreen?: null|string}, wifi?: null|array{enterprise_eap_peap?: array{ca_certificate_file?: string, password: string, ssid: string, username: string}, enterprise_eap_tls?: array{ca_certificate_file?: string, client_certificate_file: string, private_key_file: string, private_key_file_password?: string, ssid: string}, personal_psk?: array{password: string, ssid: string}, type: string}} $params + * @param null|array|string $opts + * + * @return Configuration the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Terminal/ConnectionToken.php b/stripe-php/lib/Terminal/ConnectionToken.php new file mode 100644 index 0000000..40b82d5 --- /dev/null +++ b/stripe-php/lib/Terminal/ConnectionToken.php @@ -0,0 +1,43 @@ +Fleet management + * + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|string $location The id of the location that this connection token is scoped to. Note that location scoping only applies to internet-connected readers. For more details, see the docs on scoping connection tokens. + * @property string $secret Your application should pass this token to the Stripe Terminal SDK. + */ +class ConnectionToken extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'terminal.connection_token'; + + /** + * To connect to a reader the Stripe Terminal SDK needs to retrieve a short-lived + * connection token from Stripe, proxied through your server. On your backend, add + * an endpoint that creates and returns a connection token. + * + * @param null|array{expand?: string[], location?: string} $params + * @param null|array|string $options + * + * @return ConnectionToken the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Terminal/Location.php b/stripe-php/lib/Terminal/Location.php new file mode 100644 index 0000000..ed55213 --- /dev/null +++ b/stripe-php/lib/Terminal/Location.php @@ -0,0 +1,135 @@ +Fleet management + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject) $address + * @property null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string, town: null|string}&\Stripe\StripeObject) $address_kana + * @property null|(object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string, town: null|string}&\Stripe\StripeObject) $address_kanji + * @property null|string $configuration_overrides The ID of a configuration that will be used to customize all readers in this location. + * @property string $display_name The display name of the location. + * @property null|string $display_name_kana The Kana variation of the display name of the location. + * @property null|string $display_name_kanji The Kanji variation of the display name of the location. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $phone The phone number of the location. + */ +class Location extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'terminal.location'; + + use \Stripe\ApiOperations\Update; + + /** + * Creates a new Location object. For further details, including which + * address fields are required in each country, see the Manage locations guide. + * + * @param null|array{address?: array{city?: string, country: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, configuration_overrides?: string, display_name?: string, display_name_kana?: string, display_name_kanji?: string, expand?: string[], metadata?: null|array, phone?: string} $params + * @param null|array|string $options + * + * @return Location the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Deletes a Location object. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return Location the deleted resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * Returns a list of Location objects. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a Location object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Location + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates a Location object by setting the values of the parameters + * passed. Any parameters not provided will be left unchanged. + * + * @param string $id the ID of the resource to update + * @param null|array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, configuration_overrides?: null|string, display_name?: null|string, display_name_kana?: null|string, display_name_kanji?: null|string, expand?: string[], metadata?: null|array, phone?: null|string} $params + * @param null|array|string $opts + * + * @return Location the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Terminal/OnboardingLink.php b/stripe-php/lib/Terminal/OnboardingLink.php new file mode 100644 index 0000000..d7ab3d5 --- /dev/null +++ b/stripe-php/lib/Terminal/OnboardingLink.php @@ -0,0 +1,42 @@ +OnboardingLink object that contains a redirect_url + * used for onboarding onto Tap to Pay on iPhone. + * + * @param null|array{expand?: string[], link_options: array{apple_terms_and_conditions?: array{allow_relinking?: bool, merchant_display_name: string}}, link_type: string, on_behalf_of?: string} $params + * @param null|array|string $options + * + * @return OnboardingLink the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/Terminal/Reader.php b/stripe-php/lib/Terminal/Reader.php new file mode 100644 index 0000000..6ae73bd --- /dev/null +++ b/stripe-php/lib/Terminal/Reader.php @@ -0,0 +1,283 @@ +Connecting to a reader + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|(object{collect_inputs?: (object{inputs: ((object{custom_text: null|(object{description: null|string, skip_button: null|string, submit_button: null|string, title: null|string}&\Stripe\StripeObject), email?: (object{value: null|string}&\Stripe\StripeObject), numeric?: (object{value: null|string}&\Stripe\StripeObject), phone?: (object{value: null|string}&\Stripe\StripeObject), required: null|bool, selection?: (object{choices: ((object{id: null|string, style: null|string, text: string}&\Stripe\StripeObject))[], id: null|string, text: null|string}&\Stripe\StripeObject), signature?: (object{value: null|string}&\Stripe\StripeObject), skipped?: bool, text?: (object{value: null|string}&\Stripe\StripeObject), toggles: null|((object{default_value: null|string, description: null|string, title: null|string, value: null|string}&\Stripe\StripeObject))[], type: string}&\Stripe\StripeObject))[], metadata: null|\Stripe\StripeObject}&\Stripe\StripeObject), collect_payment_method?: (object{collect_config?: (object{enable_customer_cancellation?: bool, skip_tipping?: bool, tipping?: (object{amount_eligible?: int}&\Stripe\StripeObject)}&\Stripe\StripeObject), payment_intent: string|\Stripe\PaymentIntent, payment_method?: \Stripe\PaymentMethod}&\Stripe\StripeObject), confirm_payment_intent?: (object{confirm_config?: (object{return_url?: string}&\Stripe\StripeObject), payment_intent: string|\Stripe\PaymentIntent}&\Stripe\StripeObject), failure_code: null|string, failure_message: null|string, process_payment_intent?: (object{payment_intent: string|\Stripe\PaymentIntent, process_config?: (object{enable_customer_cancellation?: bool, return_url?: string, skip_tipping?: bool, tipping?: (object{amount_eligible?: int}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject), process_setup_intent?: (object{generated_card?: string, process_config?: (object{enable_customer_cancellation?: bool}&\Stripe\StripeObject), setup_intent: string|\Stripe\SetupIntent}&\Stripe\StripeObject), refund_payment?: (object{amount?: int, charge?: string|\Stripe\Charge, metadata?: \Stripe\StripeObject, payment_intent?: string|\Stripe\PaymentIntent, reason?: string, refund?: string|\Stripe\Refund, refund_application_fee?: bool, refund_payment_config?: (object{enable_customer_cancellation?: bool}&\Stripe\StripeObject), reverse_transfer?: bool}&\Stripe\StripeObject), set_reader_display?: (object{cart: null|(object{currency: string, line_items: (object{amount: int, description: string, quantity: int}&\Stripe\StripeObject)[], tax: null|int, total: int}&\Stripe\StripeObject), type: string}&\Stripe\StripeObject), status: string, type: string}&\Stripe\StripeObject) $action The most recent action performed by the reader. + * @property null|string $device_sw_version The current software version of the reader. + * @property string $device_type Device type of the reader. + * @property null|string $ip_address The local IP address of the reader. + * @property string $label Custom label given to the reader for easier identification. + * @property null|int $last_seen_at The last time this reader reported to Stripe backend. Timestamp is measured in milliseconds since the Unix epoch. Unlike most other Stripe timestamp fields which use seconds, this field uses milliseconds. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|Location|string $location The location identifier of the reader. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $serial_number Serial number of the reader. + * @property null|string $status The networking status of the reader. We do not recommend using this field in flows that may block taking payments. + */ +class Reader extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'terminal.reader'; + + use \Stripe\ApiOperations\Update; + + const DEVICE_TYPE_BBPOS_CHIPPER2X = 'bbpos_chipper2x'; + const DEVICE_TYPE_BBPOS_WISEPAD3 = 'bbpos_wisepad3'; + const DEVICE_TYPE_BBPOS_WISEPOS_E = 'bbpos_wisepos_e'; + const DEVICE_TYPE_MOBILE_PHONE_READER = 'mobile_phone_reader'; + const DEVICE_TYPE_SIMULATED_STRIPE_S700 = 'simulated_stripe_s700'; + const DEVICE_TYPE_SIMULATED_WISEPOS_E = 'simulated_wisepos_e'; + const DEVICE_TYPE_STRIPE_M2 = 'stripe_m2'; + const DEVICE_TYPE_STRIPE_S700 = 'stripe_s700'; + const DEVICE_TYPE_VERIFONE_P400 = 'verifone_P400'; + + const STATUS_OFFLINE = 'offline'; + const STATUS_ONLINE = 'online'; + + /** + * Creates a new Reader object. + * + * @param null|array{expand?: string[], label?: string, location?: string, metadata?: null|array, registration_code: string} $params + * @param null|array|string $options + * + * @return Reader the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Deletes a Reader object. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return Reader the deleted resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * Returns a list of Reader objects. + * + * @param null|array{device_type?: string, ending_before?: string, expand?: string[], limit?: int, location?: string, serial_number?: string, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a Reader object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates a Reader object by setting the values of the parameters + * passed. Any parameters not provided will be left unchanged. + * + * @param string $id the ID of the resource to update + * @param null|array{expand?: string[], label?: null|string, metadata?: null|array} $params + * @param null|array|string $opts + * + * @return Reader the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Reader the canceled reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancelAction($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel_action'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Reader the collected reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function collectInputs($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/collect_inputs'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Reader the collected reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function collectPaymentMethod($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/collect_payment_method'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Reader the confirmed reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function confirmPaymentIntent($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/confirm_payment_intent'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Reader the processed reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function processPaymentIntent($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/process_payment_intent'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Reader the processed reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function processSetupIntent($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/process_setup_intent'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Reader the refunded reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function refundPayment($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/refund_payment'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Reader the seted reader + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function setReaderDisplay($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/set_reader_display'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/TestHelpers/TestClock.php b/stripe-php/lib/TestHelpers/TestClock.php new file mode 100644 index 0000000..61d86f1 --- /dev/null +++ b/stripe-php/lib/TestHelpers/TestClock.php @@ -0,0 +1,125 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|string $name The custom name supplied at creation. + * @property string $status The status of the Test Clock. + * @property (object{advancing?: (object{target_frozen_time: int}&\Stripe\StripeObject)}&\Stripe\StripeObject) $status_details + */ +class TestClock extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'test_helpers.test_clock'; + + const STATUS_ADVANCING = 'advancing'; + const STATUS_INTERNAL_FAILURE = 'internal_failure'; + const STATUS_READY = 'ready'; + + /** + * Creates a new test clock that can be attached to new customers and quotes. + * + * @param null|array{expand?: string[], frozen_time: int, name?: string} $params + * @param null|array|string $options + * + * @return TestClock the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Deletes a test clock. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return TestClock the deleted resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * Returns a list of your test clocks. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a test clock. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return TestClock + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return TestClock the advanced test clock + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function advance($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/advance'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/Token.php b/stripe-php/lib/Token.php new file mode 100644 index 0000000..4aa0182 --- /dev/null +++ b/stripe-php/lib/Token.php @@ -0,0 +1,93 @@ +recommended payments integrations to perform this process + * on the client-side. This guarantees that no sensitive card data touches your server, + * and allows your integration to operate in a PCI-compliant way. + * + * If you can't use client-side tokenization, you can also create tokens using + * the API with either your publishable or secret API key. If + * your integration uses this method, you're responsible for any PCI compliance + * that it might require, and you must keep your secret API key safe. Unlike with + * client-side tokenization, your customer's information isn't sent directly to + * Stripe, so we can't determine how it's handled or stored. + * + * You can't store or use tokens more than once. To store card or bank account + * information for later use, create Customer + * objects or External accounts. + * Radar, our integrated solution for automatic fraud protection, + * performs best with integrations that use client-side tokenization. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|BankAccount $bank_account

These bank accounts are payment methods on Customer objects.

On the other hand External Accounts are transfer destinations on Account objects for connected accounts. They can be bank accounts or debit cards as well, and are documented in the links above.

Related guide: Bank debits and transfers

+ * @property null|Card $card

You can store multiple cards on a customer in order to charge the customer later. You can also store multiple debit cards on a recipient in order to transfer to those cards later.

Related guide: Card payments with Sources

+ * @property null|string $client_ip IP address of the client that generates the token. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $type Type of the token: account, bank_account, card, or pii. + * @property bool $used Determines if you have already used this token (you can only use tokens once). + */ +class Token extends ApiResource +{ + const OBJECT_NAME = 'token'; + + const TYPE_ACCOUNT = 'account'; + const TYPE_BANK_ACCOUNT = 'bank_account'; + const TYPE_CARD = 'card'; + const TYPE_PII = 'pii'; + + /** + * Creates a single-use token that represents a bank account’s details. You can use + * this token with any v1 API method in place of a bank account dictionary. You can + * only use this token once. To do so, attach it to a connected + * account where controller.requirement_collection + * is application, which includes Custom accounts. + * + * @param null|array{account?: array{business_type?: string, company?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, directors_provided?: bool, directorship_declaration?: array{date?: int, ip?: string, user_agent?: string}, executives_provided?: bool, export_license_id?: string, export_purpose_code?: string, name?: string, name_kana?: string, name_kanji?: string, owners_provided?: bool, ownership_declaration?: array{date?: int, ip?: string, user_agent?: string}, ownership_declaration_shown_and_signed?: bool, ownership_exemption_reason?: null|string, phone?: string, registration_date?: null|array{day: int, month: int, year: int}, registration_number?: string, representative_declaration?: array{date?: int, ip?: string, user_agent?: string}, structure?: null|string, tax_id?: string, tax_id_registrar?: string, vat_id?: string, verification?: array{document?: array{back?: string, front?: string}}}, individual?: array{address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, dob?: null|array{day: int, month: int, year: int}, email?: string, first_name?: string, first_name_kana?: string, first_name_kanji?: string, full_name_aliases?: null|string[], gender?: string, id_number?: string, id_number_secondary?: string, last_name?: string, last_name_kana?: string, last_name_kanji?: string, maiden_name?: string, metadata?: null|array, phone?: string, political_exposure?: string, registered_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, relationship?: array{director?: bool, executive?: bool, owner?: bool, percent_ownership?: null|float, title?: string}, ssn_last_4?: string, verification?: array{additional_document?: array{back?: string, front?: string}, document?: array{back?: string, front?: string}}}, tos_shown_and_accepted?: bool}, bank_account?: array{account_holder_name?: string, account_holder_type?: string, account_number: string, account_type?: string, country: string, currency?: string, payment_method?: string, routing_number?: string}, card?: array|string, customer?: string, cvc_update?: array{cvc: string}, expand?: string[], person?: array{additional_tos_acceptances?: array{account?: array{date?: int, ip?: string, user_agent?: null|string}}, address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, address_kana?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, address_kanji?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}, dob?: null|array{day: int, month: int, year: int}, documents?: array{company_authorization?: array{files?: string[]}, passport?: array{files?: string[]}, visa?: array{files?: string[]}}, email?: string, first_name?: string, first_name_kana?: string, first_name_kanji?: string, full_name_aliases?: null|string[], gender?: string, id_number?: string, id_number_secondary?: string, last_name?: string, last_name_kana?: string, last_name_kanji?: string, maiden_name?: string, metadata?: null|array, nationality?: string, phone?: string, political_exposure?: string, registered_address?: array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, relationship?: array{authorizer?: bool, director?: bool, executive?: bool, legal_guardian?: bool, owner?: bool, percent_ownership?: null|float, representative?: bool, title?: string}, ssn_last_4?: string, us_cfpb_data?: array{ethnicity_details?: array{ethnicity?: string[], ethnicity_other?: string}, race_details?: array{race?: string[], race_other?: string}, self_identified_gender?: string}, verification?: array{additional_document?: array{back?: string, front?: string}, document?: array{back?: string, front?: string}}}, pii?: array{id_number?: string}} $params + * @param null|array|string $options + * + * @return Token the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Retrieves the token with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Token + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Topup.php b/stripe-php/lib/Topup.php new file mode 100644 index 0000000..7002801 --- /dev/null +++ b/stripe-php/lib/Topup.php @@ -0,0 +1,143 @@ +Topping up your platform account + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount transferred. + * @property null|BalanceTransaction|string $balance_transaction ID of the balance transaction that describes the impact of this top-up on your account balance. May not be specified depending on status of top-up. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|int $expected_availability_date Date the funds are expected to arrive in your Stripe account for payouts. This factors in delays like weekends or bank holidays. May not be specified depending on status of top-up. + * @property null|string $failure_code Error code explaining reason for top-up failure if available (see the errors section for a list of codes). + * @property null|string $failure_message Message to user further explaining reason for top-up failure if available. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|Source $source The source field is deprecated. It might not always be present in the API response. + * @property null|string $statement_descriptor Extra information about a top-up. This will appear on your source's bank statement. It must contain at least one letter. + * @property string $status The status of the top-up is either canceled, failed, pending, reversed, or succeeded. + * @property null|string $transfer_group A string that identifies this top-up as part of a group. + */ +class Topup extends ApiResource +{ + const OBJECT_NAME = 'topup'; + + use ApiOperations\Update; + + const STATUS_CANCELED = 'canceled'; + const STATUS_FAILED = 'failed'; + const STATUS_PENDING = 'pending'; + const STATUS_REVERSED = 'reversed'; + const STATUS_SUCCEEDED = 'succeeded'; + + /** + * Top up the balance of an account. + * + * @param null|array{amount: int, currency: string, description?: string, expand?: string[], metadata?: null|array, source?: string, statement_descriptor?: string, transfer_group?: string} $params + * @param null|array|string $options + * + * @return Topup the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of top-ups. + * + * @param null|array{amount?: array|int, created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the details of a top-up that has previously been created. Supply the + * unique top-up ID that was returned from your previous request, and Stripe will + * return the corresponding top-up information. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Topup + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the metadata of a top-up. Other top-up details are not editable by + * design. + * + * @param string $id the ID of the resource to update + * @param null|array{description?: string, expand?: string[], metadata?: null|array} $params + * @param null|array|string $opts + * + * @return Topup the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return Topup the canceled topup + * + * @throws Exception\ApiErrorException if the request fails + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/Transfer.php b/stripe-php/lib/Transfer.php new file mode 100644 index 0000000..0c4eca5 --- /dev/null +++ b/stripe-php/lib/Transfer.php @@ -0,0 +1,197 @@ +Transfer object is created when you move funds between Stripe accounts as + * part of Connect. + * + * Before April 6, 2017, transfers also represented movement of funds from a + * Stripe account to a card or bank account. This behavior has since been split + * out into a Payout object, with corresponding payout endpoints. For more + * information, read about the + * transfer/payout split. + * + * Related guide: Creating separate charges and transfers + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount in cents (or local equivalent) to be transferred. + * @property int $amount_reversed Amount in cents (or local equivalent) reversed (can be less than the amount attribute on the transfer if a partial reversal was issued). + * @property null|BalanceTransaction|string $balance_transaction Balance transaction that describes the impact of this transfer on your account balance. + * @property int $created Time that this record of the transfer was first created. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|Account|string $destination ID of the Stripe account the transfer was sent to. + * @property null|Charge|string $destination_payment If the destination is a Stripe account, this will be the ID of the payment that the destination account received for the transfer. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property Collection $reversals A list of reversals that have been applied to the transfer. + * @property bool $reversed Whether the transfer has been fully reversed. If the transfer is only partially reversed, this attribute will still be false. + * @property null|Charge|string $source_transaction ID of the charge that was used to fund the transfer. If null, the transfer was funded from the available balance. + * @property null|string $source_type The source balance this transfer came from. One of card, fpx, or bank_account. + * @property null|string $transfer_group A string that identifies this transaction as part of a group. See the Connect documentation for details. + */ +class Transfer extends ApiResource +{ + const OBJECT_NAME = 'transfer'; + + use ApiOperations\NestedResource; + use ApiOperations\Update; + + const SOURCE_TYPE_BANK_ACCOUNT = 'bank_account'; + const SOURCE_TYPE_CARD = 'card'; + const SOURCE_TYPE_FPX = 'fpx'; + + /** + * To send funds from your Stripe account to a connected account, you create a new + * transfer object. Your Stripe balance must be able to + * cover the transfer amount, or you’ll receive an “Insufficient Funds” error. + * + * @param null|array{amount?: int, currency: string, description?: string, destination: string, expand?: string[], metadata?: array, source_transaction?: string, source_type?: string, transfer_group?: string} $params + * @param null|array|string $options + * + * @return Transfer the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of existing transfers sent to connected accounts. The transfers + * are returned in sorted order, with the most recently created transfers appearing + * first. + * + * @param null|array{created?: array|int, destination?: string, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, transfer_group?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an existing transfer. Supply the unique transfer ID + * from either a transfer creation request or the transfer list, and Stripe will + * return the corresponding transfer information. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Transfer + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the specified transfer by setting the values of the parameters passed. + * Any parameters not provided will be left unchanged. + * + * This request accepts only metadata as an argument. + * + * @param string $id the ID of the resource to update + * @param null|array{description?: string, expand?: string[], metadata?: null|array} $params + * @param null|array|string $opts + * + * @return Transfer the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + const PATH_REVERSALS = '/reversals'; + + /** + * @param string $id the ID of the transfer on which to retrieve the transfer reversals + * @param null|array $params + * @param null|array|string $opts + * + * @return Collection the list of transfer reversals + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function allReversals($id, $params = null, $opts = null) + { + return self::_allNestedResources($id, static::PATH_REVERSALS, $params, $opts); + } + + /** + * @param string $id the ID of the transfer on which to create the transfer reversal + * @param null|array $params + * @param null|array|string $opts + * + * @return TransferReversal + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function createReversal($id, $params = null, $opts = null) + { + return self::_createNestedResource($id, static::PATH_REVERSALS, $params, $opts); + } + + /** + * @param string $id the ID of the transfer to which the transfer reversal belongs + * @param string $reversalId the ID of the transfer reversal to retrieve + * @param null|array $params + * @param null|array|string $opts + * + * @return TransferReversal + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieveReversal($id, $reversalId, $params = null, $opts = null) + { + return self::_retrieveNestedResource($id, static::PATH_REVERSALS, $reversalId, $params, $opts); + } + + /** + * @param string $id the ID of the transfer to which the transfer reversal belongs + * @param string $reversalId the ID of the transfer reversal to update + * @param null|array $params + * @param null|array|string $opts + * + * @return TransferReversal + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function updateReversal($id, $reversalId, $params = null, $opts = null) + { + return self::_updateNestedResource($id, static::PATH_REVERSALS, $reversalId, $params, $opts); + } +} diff --git a/stripe-php/lib/TransferReversal.php b/stripe-php/lib/TransferReversal.php new file mode 100644 index 0000000..88ba583 --- /dev/null +++ b/stripe-php/lib/TransferReversal.php @@ -0,0 +1,76 @@ +Stripe Connect platforms can reverse transfers made to a + * connected account, either entirely or partially, and can also specify whether + * to refund any related application fees. Transfer reversals add to the + * platform's balance and subtract from the destination account's balance. + * + * Reversing a transfer that was made for a destination + * charge is allowed only up to the amount of + * the charge. It is possible to reverse a + * transfer_group + * transfer only if the destination account has enough balance to cover the + * reversal. + * + * Related guide: Reverse transfers + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount, in cents (or local equivalent). + * @property null|BalanceTransaction|string $balance_transaction Balance transaction that describes the impact on your account balance. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|Refund|string $destination_payment_refund Linked payment refund for the transfer reversal. + * @property null|StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|Refund|string $source_refund ID of the refund responsible for the transfer reversal. + * @property string|Transfer $transfer ID of the transfer that was reversed. + */ +class TransferReversal extends ApiResource +{ + const OBJECT_NAME = 'transfer_reversal'; + + use ApiOperations\Update { + save as protected _save; + } + + /** + * @return string the API URL for this Stripe transfer reversal + */ + public function instanceUrl() + { + $id = $this['id']; + $transfer = $this['transfer']; + if (!$id) { + throw new Exception\UnexpectedValueException( + 'Could not determine which URL to request: ' + . "class instance has invalid ID: {$id}", + null + ); + } + $id = Util\Util::utf8($id); + $transfer = Util\Util::utf8($transfer); + + $base = Transfer::classUrl(); + $transferExtn = \urlencode($transfer); + $extn = \urlencode($id); + + return "{$base}/{$transferExtn}/reversals/{$extn}"; + } + + /** + * @param null|array|string $opts + * + * @return TransferReversal the saved reversal + * + * @throws Exception\ApiErrorException if the request fails + */ + public function save($opts = null) + { + return $this->_save($opts); + } +} diff --git a/stripe-php/lib/Treasury/CreditReversal.php b/stripe-php/lib/Treasury/CreditReversal.php new file mode 100644 index 0000000..5f65a69 --- /dev/null +++ b/stripe-php/lib/Treasury/CreditReversal.php @@ -0,0 +1,95 @@ +ReceivedCredits depending on their network and source flow. Reversing a ReceivedCredit leads to the creation of a new object known as a CreditReversal. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount (in cents) transferred. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property string $financial_account The FinancialAccount to reverse funds from. + * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $network The rails used to reverse the funds. + * @property string $received_credit The ReceivedCredit being reversed. + * @property string $status Status of the CreditReversal + * @property (object{posted_at: null|int}&\Stripe\StripeObject) $status_transitions + * @property null|string|Transaction $transaction The Transaction associated with this object. + */ +class CreditReversal extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'treasury.credit_reversal'; + + const NETWORK_ACH = 'ach'; + const NETWORK_STRIPE = 'stripe'; + + const STATUS_CANCELED = 'canceled'; + const STATUS_POSTED = 'posted'; + const STATUS_PROCESSING = 'processing'; + + /** + * Reverses a ReceivedCredit and creates a CreditReversal object. + * + * @param null|array{expand?: string[], metadata?: array, received_credit: string} $params + * @param null|array|string $options + * + * @return CreditReversal the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of CreditReversals. + * + * @param null|array{ending_before?: string, expand?: string[], financial_account: string, limit?: int, received_credit?: string, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an existing CreditReversal by passing the unique + * CreditReversal ID from either the CreditReversal creation request or + * CreditReversal list. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return CreditReversal + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Treasury/DebitReversal.php b/stripe-php/lib/Treasury/DebitReversal.php new file mode 100644 index 0000000..c2c400d --- /dev/null +++ b/stripe-php/lib/Treasury/DebitReversal.php @@ -0,0 +1,94 @@ +ReceivedDebits depending on their network and source flow. Reversing a ReceivedDebit leads to the creation of a new object known as a DebitReversal. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount (in cents) transferred. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $financial_account The FinancialAccount to reverse funds from. + * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. + * @property null|(object{issuing_dispute: null|string}&\Stripe\StripeObject) $linked_flows Other flows linked to a DebitReversal. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property string $network The rails used to reverse the funds. + * @property string $received_debit The ReceivedDebit being reversed. + * @property string $status Status of the DebitReversal + * @property (object{completed_at: null|int}&\Stripe\StripeObject) $status_transitions + * @property null|string|Transaction $transaction The Transaction associated with this object. + */ +class DebitReversal extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'treasury.debit_reversal'; + + const NETWORK_ACH = 'ach'; + const NETWORK_CARD = 'card'; + + const STATUS_FAILED = 'failed'; + const STATUS_PROCESSING = 'processing'; + const STATUS_SUCCEEDED = 'succeeded'; + + /** + * Reverses a ReceivedDebit and creates a DebitReversal object. + * + * @param null|array{expand?: string[], metadata?: array, received_debit: string} $params + * @param null|array|string $options + * + * @return DebitReversal the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of DebitReversals. + * + * @param null|array{ending_before?: string, expand?: string[], financial_account: string, limit?: int, received_debit?: string, resolution?: string, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a DebitReversal object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return DebitReversal + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Treasury/FinancialAccount.php b/stripe-php/lib/Treasury/FinancialAccount.php new file mode 100644 index 0000000..5ef63fb --- /dev/null +++ b/stripe-php/lib/Treasury/FinancialAccount.php @@ -0,0 +1,172 @@ +ISO 3166-1 alpha-2). + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|FinancialAccountFeatures $features Encodes whether a FinancialAccount has access to a particular Feature, with a status enum and associated status_details. Stripe or the platform can control Features via the requested field. + * @property ((object{aba?: (object{account_holder_name: string, account_number?: null|string, account_number_last4: string, bank_name: string, routing_number: string}&\Stripe\StripeObject), supported_networks?: string[], type: string}&\Stripe\StripeObject))[] $financial_addresses The set of credentials that resolve to a FinancialAccount. + * @property null|bool $is_default + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $nickname The nickname for the FinancialAccount. + * @property null|string[] $pending_features The array of paths to pending Features in the Features hash. + * @property null|(object{inbound_flows: null|string, outbound_flows: null|string}&\Stripe\StripeObject) $platform_restrictions The set of functionalities that the platform can restrict on the FinancialAccount. + * @property null|string[] $restricted_features The array of paths to restricted Features in the Features hash. + * @property string $status Status of this FinancialAccount. + * @property (object{closed: null|(object{reasons: string[]}&\Stripe\StripeObject)}&\Stripe\StripeObject) $status_details + * @property string[] $supported_currencies The currencies the FinancialAccount can hold a balance in. Three-letter ISO currency code, in lowercase. + */ +class FinancialAccount extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'treasury.financial_account'; + + use \Stripe\ApiOperations\Update; + + const STATUS_CLOSED = 'closed'; + const STATUS_OPEN = 'open'; + + /** + * Creates a new FinancialAccount. Each connected account can have up to three + * FinancialAccounts by default. + * + * @param null|array{expand?: string[], features?: array{card_issuing?: array{requested: bool}, deposit_insurance?: array{requested: bool}, financial_addresses?: array{aba?: array{requested: bool}}, inbound_transfers?: array{ach?: array{requested: bool}}, intra_stripe_flows?: array{requested: bool}, outbound_payments?: array{ach?: array{requested: bool}, us_domestic_wire?: array{requested: bool}}, outbound_transfers?: array{ach?: array{requested: bool}, us_domestic_wire?: array{requested: bool}}}, metadata?: array, nickname?: null|string, platform_restrictions?: array{inbound_flows?: string, outbound_flows?: string}, supported_currencies: string[]} $params + * @param null|array|string $options + * + * @return FinancialAccount the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of FinancialAccounts. + * + * @param null|array{created?: array|int, ending_before?: string, expand?: string[], limit?: int, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves the details of a FinancialAccount. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return FinancialAccount + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the details of a FinancialAccount. + * + * @param string $id the ID of the resource to update + * @param null|array{expand?: string[], features?: array{card_issuing?: array{requested: bool}, deposit_insurance?: array{requested: bool}, financial_addresses?: array{aba?: array{requested: bool}}, inbound_transfers?: array{ach?: array{requested: bool}}, intra_stripe_flows?: array{requested: bool}, outbound_payments?: array{ach?: array{requested: bool}, us_domestic_wire?: array{requested: bool}}, outbound_transfers?: array{ach?: array{requested: bool}, us_domestic_wire?: array{requested: bool}}}, forwarding_settings?: array{financial_account?: string, payment_method?: string, type: string}, metadata?: array, nickname?: null|string, platform_restrictions?: array{inbound_flows?: string, outbound_flows?: string}} $params + * @param null|array|string $opts + * + * @return FinancialAccount the updated resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return FinancialAccount the closed financial account + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function close($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/close'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return FinancialAccountFeatures the retrieved financial account features + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function retrieveFeatures($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/features'; + list($response, $opts) = $this->_request('get', $url, $params, $opts); + $obj = \Stripe\Util\Util::convertToStripeObject($response, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return FinancialAccountFeatures the updated financial account features + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function updateFeatures($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/features'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/Treasury/FinancialAccountFeatures.php b/stripe-php/lib/Treasury/FinancialAccountFeatures.php new file mode 100644 index 0000000..08419a8 --- /dev/null +++ b/stripe-php/lib/Treasury/FinancialAccountFeatures.php @@ -0,0 +1,23 @@ +status enum and associated status_details. + * Stripe or the platform can control Features via the requested field. + * + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|(object{requested: bool, status: string, status_details: ((object{code: string, resolution: null|string, restriction?: string}&\Stripe\StripeObject))[]}&\Stripe\StripeObject) $card_issuing Toggle settings for enabling/disabling a feature + * @property null|(object{requested: bool, status: string, status_details: ((object{code: string, resolution: null|string, restriction?: string}&\Stripe\StripeObject))[]}&\Stripe\StripeObject) $deposit_insurance Toggle settings for enabling/disabling a feature + * @property null|(object{aba?: (object{requested: bool, status: string, status_details: ((object{code: string, resolution: null|string, restriction?: string}&\Stripe\StripeObject))[]}&\Stripe\StripeObject)}&\Stripe\StripeObject) $financial_addresses Settings related to Financial Addresses features on a Financial Account + * @property null|(object{ach?: (object{requested: bool, status: string, status_details: ((object{code: string, resolution: null|string, restriction?: string}&\Stripe\StripeObject))[]}&\Stripe\StripeObject)}&\Stripe\StripeObject) $inbound_transfers InboundTransfers contains inbound transfers features for a FinancialAccount. + * @property null|(object{requested: bool, status: string, status_details: ((object{code: string, resolution: null|string, restriction?: string}&\Stripe\StripeObject))[]}&\Stripe\StripeObject) $intra_stripe_flows Toggle settings for enabling/disabling a feature + * @property null|(object{ach?: (object{requested: bool, status: string, status_details: ((object{code: string, resolution: null|string, restriction?: string}&\Stripe\StripeObject))[]}&\Stripe\StripeObject), us_domestic_wire?: (object{requested: bool, status: string, status_details: ((object{code: string, resolution: null|string, restriction?: string}&\Stripe\StripeObject))[]}&\Stripe\StripeObject)}&\Stripe\StripeObject) $outbound_payments Settings related to Outbound Payments features on a Financial Account + * @property null|(object{ach?: (object{requested: bool, status: string, status_details: ((object{code: string, resolution: null|string, restriction?: string}&\Stripe\StripeObject))[]}&\Stripe\StripeObject), us_domestic_wire?: (object{requested: bool, status: string, status_details: ((object{code: string, resolution: null|string, restriction?: string}&\Stripe\StripeObject))[]}&\Stripe\StripeObject)}&\Stripe\StripeObject) $outbound_transfers OutboundTransfers contains outbound transfers features for a FinancialAccount. + */ +class FinancialAccountFeatures extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'treasury.financial_account_features'; +} diff --git a/stripe-php/lib/Treasury/InboundTransfer.php b/stripe-php/lib/Treasury/InboundTransfer.php new file mode 100644 index 0000000..9ed106e --- /dev/null +++ b/stripe-php/lib/Treasury/InboundTransfer.php @@ -0,0 +1,116 @@ +InboundTransfers to add funds to your FinancialAccount via a PaymentMethod that is owned by you. The funds will be transferred via an ACH debit. + * + * Related guide: Moving money with Treasury using InboundTransfer objects + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount (in cents) transferred. + * @property bool $cancelable Returns true if the InboundTransfer is able to be canceled. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|(object{code: string}&\Stripe\StripeObject) $failure_details Details about this InboundTransfer's failure. Only set when status is failed. + * @property string $financial_account The FinancialAccount that received the funds. + * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. + * @property (object{received_debit: null|string}&\Stripe\StripeObject) $linked_flows + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $origin_payment_method The origin payment method to be debited for an InboundTransfer. + * @property null|(object{billing_details: (object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), email: null|string, name: null|string}&\Stripe\StripeObject), type: string, us_bank_account?: (object{account_holder_type: null|string, account_type: null|string, bank_name: null|string, fingerprint: null|string, last4: null|string, mandate?: string|\Stripe\Mandate, network: string, routing_number: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $origin_payment_method_details Details about the PaymentMethod for an InboundTransfer. + * @property null|bool $returned Returns true if the funds for an InboundTransfer were returned after the InboundTransfer went to the succeeded state. + * @property string $statement_descriptor Statement descriptor shown when funds are debited from the source. Not all payment networks support statement_descriptor. + * @property string $status Status of the InboundTransfer: processing, succeeded, failed, and canceled. An InboundTransfer is processing if it is created and pending. The status changes to succeeded once the funds have been "confirmed" and a transaction is created and posted. The status changes to failed if the transfer fails. + * @property (object{canceled_at?: null|int, failed_at: null|int, succeeded_at: null|int}&\Stripe\StripeObject) $status_transitions + * @property null|string|Transaction $transaction The Transaction associated with this object. + */ +class InboundTransfer extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'treasury.inbound_transfer'; + + const STATUS_CANCELED = 'canceled'; + const STATUS_FAILED = 'failed'; + const STATUS_PROCESSING = 'processing'; + const STATUS_SUCCEEDED = 'succeeded'; + + /** + * Creates an InboundTransfer. + * + * @param null|array{amount: int, currency: string, description?: string, expand?: string[], financial_account: string, metadata?: array, origin_payment_method: string, statement_descriptor?: string} $params + * @param null|array|string $options + * + * @return InboundTransfer the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of InboundTransfers sent from the specified FinancialAccount. + * + * @param null|array{ending_before?: string, expand?: string[], financial_account: string, limit?: int, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an existing InboundTransfer. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return InboundTransfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return InboundTransfer the canceled inbound transfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/Treasury/OutboundPayment.php b/stripe-php/lib/Treasury/OutboundPayment.php new file mode 100644 index 0000000..727de90 --- /dev/null +++ b/stripe-php/lib/Treasury/OutboundPayment.php @@ -0,0 +1,123 @@ +OutboundPayments to send funds to another party's external bank account or FinancialAccount. To send money to an account belonging to the same user, use an OutboundTransfer. + * + * Simulate OutboundPayment state changes with the /v1/test_helpers/treasury/outbound_payments endpoints. These methods can only be called on test mode objects. + * + * Related guide: Moving money with Treasury using OutboundPayment objects + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount (in cents) transferred. + * @property bool $cancelable Returns true if the object can be canceled, and false otherwise. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $customer ID of the customer to whom an OutboundPayment is sent. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|string $destination_payment_method The PaymentMethod via which an OutboundPayment is sent. This field can be empty if the OutboundPayment was created using destination_payment_method_data. + * @property null|(object{billing_details: (object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), email: null|string, name: null|string}&\Stripe\StripeObject), financial_account?: (object{id: string, network: string}&\Stripe\StripeObject), type: string, us_bank_account?: (object{account_holder_type: null|string, account_type: null|string, bank_name: null|string, fingerprint: null|string, last4: null|string, mandate?: string|\Stripe\Mandate, network: string, routing_number: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $destination_payment_method_details Details about the PaymentMethod for an OutboundPayment. + * @property null|(object{ip_address: null|string, present: bool}&\Stripe\StripeObject) $end_user_details Details about the end user. + * @property int $expected_arrival_date The date when funds are expected to arrive in the destination account. + * @property string $financial_account The FinancialAccount that funds were pulled from. + * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|(object{code: string, transaction: string|Transaction}&\Stripe\StripeObject) $returned_details Details about a returned OutboundPayment. Only set when the status is returned. + * @property string $statement_descriptor The description that appears on the receiving end for an OutboundPayment (for example, bank statement for external bank transfer). + * @property string $status Current status of the OutboundPayment: processing, failed, posted, returned, canceled. An OutboundPayment is processing if it has been created and is pending. The status changes to posted once the OutboundPayment has been "confirmed" and funds have left the account, or to failed or canceled. If an OutboundPayment fails to arrive at its destination, its status will change to returned. + * @property (object{canceled_at: null|int, failed_at: null|int, posted_at: null|int, returned_at: null|int}&\Stripe\StripeObject) $status_transitions + * @property null|(object{ach?: (object{trace_id: string}&\Stripe\StripeObject), type: string, us_domestic_wire?: (object{chips: null|string, imad: null|string, omad: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $tracking_details Details about network-specific tracking information if available. + * @property string|Transaction $transaction The Transaction associated with this object. + */ +class OutboundPayment extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'treasury.outbound_payment'; + + const STATUS_CANCELED = 'canceled'; + const STATUS_FAILED = 'failed'; + const STATUS_POSTED = 'posted'; + const STATUS_PROCESSING = 'processing'; + const STATUS_RETURNED = 'returned'; + + /** + * Creates an OutboundPayment. + * + * @param null|array{amount: int, currency: string, customer?: string, description?: string, destination_payment_method?: string, destination_payment_method_data?: array{billing_details?: array{address?: null|array{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string}, email?: null|string, name?: null|string, phone?: null|string}, financial_account?: string, metadata?: array, type: string, us_bank_account?: array{account_holder_type?: string, account_number?: string, account_type?: string, financial_connections_account?: string, routing_number?: string}}, destination_payment_method_options?: array{us_bank_account?: null|array{network?: string}}, end_user_details?: array{ip_address?: string, present: bool}, expand?: string[], financial_account: string, metadata?: array, statement_descriptor?: string} $params + * @param null|array|string $options + * + * @return OutboundPayment the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of OutboundPayments sent from the specified FinancialAccount. + * + * @param null|array{created?: array|int, customer?: string, ending_before?: string, expand?: string[], financial_account: string, limit?: int, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an existing OutboundPayment by passing the unique + * OutboundPayment ID from either the OutboundPayment creation request or + * OutboundPayment list. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return OutboundPayment + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return OutboundPayment the canceled outbound payment + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/Treasury/OutboundTransfer.php b/stripe-php/lib/Treasury/OutboundTransfer.php new file mode 100644 index 0000000..7e01b57 --- /dev/null +++ b/stripe-php/lib/Treasury/OutboundTransfer.php @@ -0,0 +1,121 @@ +OutboundTransfers to transfer funds from a FinancialAccount to a PaymentMethod belonging to the same entity. To send funds to a different party, use OutboundPayments instead. You can send funds over ACH rails or through a domestic wire transfer to a user's own external bank account. + * + * Simulate OutboundTransfer state changes with the /v1/test_helpers/treasury/outbound_transfers endpoints. These methods can only be called on test mode objects. + * + * Related guide: Moving money with Treasury using OutboundTransfer objects + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount (in cents) transferred. + * @property bool $cancelable Returns true if the object can be canceled, and false otherwise. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property null|string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|string $destination_payment_method The PaymentMethod used as the payment instrument for an OutboundTransfer. + * @property (object{billing_details: (object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), email: null|string, name: null|string}&\Stripe\StripeObject), financial_account?: (object{id: string, network: string}&\Stripe\StripeObject), type: string, us_bank_account?: (object{account_holder_type: null|string, account_type: null|string, bank_name: null|string, fingerprint: null|string, last4: null|string, mandate?: string|\Stripe\Mandate, network: string, routing_number: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $destination_payment_method_details + * @property int $expected_arrival_date The date when funds are expected to arrive in the destination account. + * @property string $financial_account The FinancialAccount that funds were pulled from. + * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|(object{code: string, transaction: string|Transaction}&\Stripe\StripeObject) $returned_details Details about a returned OutboundTransfer. Only set when the status is returned. + * @property string $statement_descriptor Information about the OutboundTransfer to be sent to the recipient account. + * @property string $status Current status of the OutboundTransfer: processing, failed, canceled, posted, returned. An OutboundTransfer is processing if it has been created and is pending. The status changes to posted once the OutboundTransfer has been "confirmed" and funds have left the account, or to failed or canceled. If an OutboundTransfer fails to arrive at its destination, its status will change to returned. + * @property (object{canceled_at: null|int, failed_at: null|int, posted_at: null|int, returned_at: null|int}&\Stripe\StripeObject) $status_transitions + * @property null|(object{ach?: (object{trace_id: string}&\Stripe\StripeObject), type: string, us_domestic_wire?: (object{chips: null|string, imad: null|string, omad: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $tracking_details Details about network-specific tracking information if available. + * @property string|Transaction $transaction The Transaction associated with this object. + */ +class OutboundTransfer extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'treasury.outbound_transfer'; + + const STATUS_CANCELED = 'canceled'; + const STATUS_FAILED = 'failed'; + const STATUS_POSTED = 'posted'; + const STATUS_PROCESSING = 'processing'; + const STATUS_RETURNED = 'returned'; + + /** + * Creates an OutboundTransfer. + * + * @param null|array{amount: int, currency: string, description?: string, destination_payment_method?: string, destination_payment_method_data?: array{financial_account?: string, type: string}, destination_payment_method_options?: array{us_bank_account?: null|array{network?: string}}, expand?: string[], financial_account: string, metadata?: array, statement_descriptor?: string} $params + * @param null|array|string $options + * + * @return OutboundTransfer the created resource + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = \Stripe\Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * Returns a list of OutboundTransfers sent from the specified FinancialAccount. + * + * @param null|array{ending_before?: string, expand?: string[], financial_account: string, limit?: int, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an existing OutboundTransfer by passing the unique + * OutboundTransfer ID from either the OutboundTransfer creation request or + * OutboundTransfer list. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return OutboundTransfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * @param null|array $params + * @param null|array|string $opts + * + * @return OutboundTransfer the canceled outbound transfer + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public function cancel($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } +} diff --git a/stripe-php/lib/Treasury/ReceivedCredit.php b/stripe-php/lib/Treasury/ReceivedCredit.php new file mode 100644 index 0000000..4fb198d --- /dev/null +++ b/stripe-php/lib/Treasury/ReceivedCredit.php @@ -0,0 +1,80 @@ +FinancialAccount (for example, via ACH or wire). These money movements are not initiated from the FinancialAccount. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount (in cents) transferred. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|string $failure_code Reason for the failure. A ReceivedCredit might fail because the receiving FinancialAccount is closed or frozen. + * @property null|string $financial_account The FinancialAccount that received the funds. + * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. + * @property (object{balance?: string, billing_details: (object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), email: null|string, name: null|string}&\Stripe\StripeObject), financial_account?: (object{id: string, network: string}&\Stripe\StripeObject), issuing_card?: string, type: string, us_bank_account?: (object{bank_name: null|string, last4: null|string, routing_number: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $initiating_payment_method_details + * @property (object{credit_reversal: null|string, issuing_authorization: null|string, issuing_transaction: null|string, source_flow: null|string, source_flow_details?: null|(object{credit_reversal?: CreditReversal, outbound_payment?: OutboundPayment, outbound_transfer?: OutboundTransfer, payout?: \Stripe\Payout, type: string}&\Stripe\StripeObject), source_flow_type: null|string}&\Stripe\StripeObject) $linked_flows + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $network The rails used to send the funds. + * @property null|(object{deadline: null|int, restricted_reason: null|string}&\Stripe\StripeObject) $reversal_details Details describing when a ReceivedCredit may be reversed. + * @property string $status Status of the ReceivedCredit. ReceivedCredits are created either succeeded (approved) or failed (declined). If a ReceivedCredit is declined, the failure reason can be found in the failure_code field. + * @property null|string|Transaction $transaction The Transaction associated with this object. + */ +class ReceivedCredit extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'treasury.received_credit'; + + const FAILURE_CODE_ACCOUNT_CLOSED = 'account_closed'; + const FAILURE_CODE_ACCOUNT_FROZEN = 'account_frozen'; + const FAILURE_CODE_INTERNATIONAL_TRANSACTION = 'international_transaction'; + const FAILURE_CODE_OTHER = 'other'; + + const NETWORK_ACH = 'ach'; + const NETWORK_CARD = 'card'; + const NETWORK_STRIPE = 'stripe'; + const NETWORK_US_DOMESTIC_WIRE = 'us_domestic_wire'; + + const STATUS_FAILED = 'failed'; + const STATUS_SUCCEEDED = 'succeeded'; + + /** + * Returns a list of ReceivedCredits. + * + * @param null|array{ending_before?: string, expand?: string[], financial_account: string, limit?: int, linked_flows?: array{source_flow_type: string}, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an existing ReceivedCredit by passing the unique + * ReceivedCredit ID from the ReceivedCredit list. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return ReceivedCredit + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Treasury/ReceivedDebit.php b/stripe-php/lib/Treasury/ReceivedDebit.php new file mode 100644 index 0000000..fa14bb9 --- /dev/null +++ b/stripe-php/lib/Treasury/ReceivedDebit.php @@ -0,0 +1,80 @@ +FinancialAccount. These are not initiated from the FinancialAccount. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount (in cents) transferred. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|string $failure_code Reason for the failure. A ReceivedDebit might fail because the FinancialAccount doesn't have sufficient funds, is closed, or is frozen. + * @property null|string $financial_account The FinancialAccount that funds were pulled from. + * @property null|string $hosted_regulatory_receipt_url A hosted transaction receipt URL that is provided when money movement is considered regulated under Stripe's money transmission licenses. + * @property null|(object{balance?: string, billing_details: (object{address: (object{city: null|string, country: null|string, line1: null|string, line2: null|string, postal_code: null|string, state: null|string}&\Stripe\StripeObject), email: null|string, name: null|string}&\Stripe\StripeObject), financial_account?: (object{id: string, network: string}&\Stripe\StripeObject), issuing_card?: string, type: string, us_bank_account?: (object{bank_name: null|string, last4: null|string, routing_number: null|string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $initiating_payment_method_details + * @property (object{debit_reversal: null|string, inbound_transfer: null|string, issuing_authorization: null|string, issuing_transaction: null|string, payout: null|string}&\Stripe\StripeObject) $linked_flows + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $network The network used for the ReceivedDebit. + * @property null|(object{deadline: null|int, restricted_reason: null|string}&\Stripe\StripeObject) $reversal_details Details describing when a ReceivedDebit might be reversed. + * @property string $status Status of the ReceivedDebit. ReceivedDebits are created with a status of either succeeded (approved) or failed (declined). The failure reason can be found under the failure_code. + * @property null|string|Transaction $transaction The Transaction associated with this object. + */ +class ReceivedDebit extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'treasury.received_debit'; + + const FAILURE_CODE_ACCOUNT_CLOSED = 'account_closed'; + const FAILURE_CODE_ACCOUNT_FROZEN = 'account_frozen'; + const FAILURE_CODE_INSUFFICIENT_FUNDS = 'insufficient_funds'; + const FAILURE_CODE_INTERNATIONAL_TRANSACTION = 'international_transaction'; + const FAILURE_CODE_OTHER = 'other'; + + const NETWORK_ACH = 'ach'; + const NETWORK_CARD = 'card'; + const NETWORK_STRIPE = 'stripe'; + + const STATUS_FAILED = 'failed'; + const STATUS_SUCCEEDED = 'succeeded'; + + /** + * Returns a list of ReceivedDebits. + * + * @param null|array{ending_before?: string, expand?: string[], financial_account: string, limit?: int, starting_after?: string, status?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an existing ReceivedDebit by passing the unique + * ReceivedDebit ID from the ReceivedDebit list. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return ReceivedDebit + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Treasury/Transaction.php b/stripe-php/lib/Treasury/Transaction.php new file mode 100644 index 0000000..e16a991 --- /dev/null +++ b/stripe-php/lib/Treasury/Transaction.php @@ -0,0 +1,79 @@ +FinancialAccount's balance. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property int $amount Amount (in cents) transferred. + * @property (object{cash: int, inbound_pending: int, outbound_pending: int}&\Stripe\StripeObject) $balance_impact Change to a FinancialAccount's balance + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property string $description An arbitrary string attached to the object. Often useful for displaying to users. + * @property null|\Stripe\Collection $entries A list of TransactionEntries that are part of this Transaction. This cannot be expanded in any list endpoints. + * @property string $financial_account The FinancialAccount associated with this object. + * @property null|string $flow ID of the flow that created the Transaction. + * @property null|(object{credit_reversal?: CreditReversal, debit_reversal?: DebitReversal, inbound_transfer?: InboundTransfer, issuing_authorization?: \Stripe\Issuing\Authorization, outbound_payment?: OutboundPayment, outbound_transfer?: OutboundTransfer, received_credit?: ReceivedCredit, received_debit?: ReceivedDebit, type: string}&\Stripe\StripeObject) $flow_details Details of the flow that created the Transaction. + * @property string $flow_type Type of the flow that created the Transaction. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $status Status of the Transaction. + * @property (object{posted_at: null|int, void_at: null|int}&\Stripe\StripeObject) $status_transitions + */ +class Transaction extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'treasury.transaction'; + + const FLOW_TYPE_CREDIT_REVERSAL = 'credit_reversal'; + const FLOW_TYPE_DEBIT_REVERSAL = 'debit_reversal'; + const FLOW_TYPE_INBOUND_TRANSFER = 'inbound_transfer'; + const FLOW_TYPE_ISSUING_AUTHORIZATION = 'issuing_authorization'; + const FLOW_TYPE_OTHER = 'other'; + const FLOW_TYPE_OUTBOUND_PAYMENT = 'outbound_payment'; + const FLOW_TYPE_OUTBOUND_TRANSFER = 'outbound_transfer'; + const FLOW_TYPE_RECEIVED_CREDIT = 'received_credit'; + const FLOW_TYPE_RECEIVED_DEBIT = 'received_debit'; + + const STATUS_OPEN = 'open'; + const STATUS_POSTED = 'posted'; + const STATUS_VOID = 'void'; + + /** + * Retrieves a list of Transaction objects. + * + * @param null|array{created?: array|int, ending_before?: string, expand?: string[], financial_account: string, limit?: int, order_by?: string, starting_after?: string, status?: string, status_transitions?: array{posted_at?: array|int}} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves the details of an existing Transaction. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return Transaction + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Treasury/TransactionEntry.php b/stripe-php/lib/Treasury/TransactionEntry.php new file mode 100644 index 0000000..130b298 --- /dev/null +++ b/stripe-php/lib/Treasury/TransactionEntry.php @@ -0,0 +1,94 @@ +Transaction. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property (object{cash: int, inbound_pending: int, outbound_pending: int}&\Stripe\StripeObject) $balance_impact Change to a FinancialAccount's balance + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property string $currency Three-letter ISO currency code, in lowercase. Must be a supported currency. + * @property int $effective_at When the TransactionEntry will impact the FinancialAccount's balance. + * @property string $financial_account The FinancialAccount associated with this object. + * @property null|string $flow Token of the flow associated with the TransactionEntry. + * @property null|(object{credit_reversal?: CreditReversal, debit_reversal?: DebitReversal, inbound_transfer?: InboundTransfer, issuing_authorization?: \Stripe\Issuing\Authorization, outbound_payment?: OutboundPayment, outbound_transfer?: OutboundTransfer, received_credit?: ReceivedCredit, received_debit?: ReceivedDebit, type: string}&\Stripe\StripeObject) $flow_details Details of the flow associated with the TransactionEntry. + * @property string $flow_type Type of the flow associated with the TransactionEntry. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string|Transaction $transaction The Transaction associated with this object. + * @property string $type The specific money movement that generated the TransactionEntry. + */ +class TransactionEntry extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'treasury.transaction_entry'; + + const FLOW_TYPE_CREDIT_REVERSAL = 'credit_reversal'; + const FLOW_TYPE_DEBIT_REVERSAL = 'debit_reversal'; + const FLOW_TYPE_INBOUND_TRANSFER = 'inbound_transfer'; + const FLOW_TYPE_ISSUING_AUTHORIZATION = 'issuing_authorization'; + const FLOW_TYPE_OTHER = 'other'; + const FLOW_TYPE_OUTBOUND_PAYMENT = 'outbound_payment'; + const FLOW_TYPE_OUTBOUND_TRANSFER = 'outbound_transfer'; + const FLOW_TYPE_RECEIVED_CREDIT = 'received_credit'; + const FLOW_TYPE_RECEIVED_DEBIT = 'received_debit'; + + const TYPE_CREDIT_REVERSAL = 'credit_reversal'; + const TYPE_CREDIT_REVERSAL_POSTING = 'credit_reversal_posting'; + const TYPE_DEBIT_REVERSAL = 'debit_reversal'; + const TYPE_INBOUND_TRANSFER = 'inbound_transfer'; + const TYPE_INBOUND_TRANSFER_RETURN = 'inbound_transfer_return'; + const TYPE_ISSUING_AUTHORIZATION_HOLD = 'issuing_authorization_hold'; + const TYPE_ISSUING_AUTHORIZATION_RELEASE = 'issuing_authorization_release'; + const TYPE_OTHER = 'other'; + const TYPE_OUTBOUND_PAYMENT = 'outbound_payment'; + const TYPE_OUTBOUND_PAYMENT_CANCELLATION = 'outbound_payment_cancellation'; + const TYPE_OUTBOUND_PAYMENT_FAILURE = 'outbound_payment_failure'; + const TYPE_OUTBOUND_PAYMENT_POSTING = 'outbound_payment_posting'; + const TYPE_OUTBOUND_PAYMENT_RETURN = 'outbound_payment_return'; + const TYPE_OUTBOUND_TRANSFER = 'outbound_transfer'; + const TYPE_OUTBOUND_TRANSFER_CANCELLATION = 'outbound_transfer_cancellation'; + const TYPE_OUTBOUND_TRANSFER_FAILURE = 'outbound_transfer_failure'; + const TYPE_OUTBOUND_TRANSFER_POSTING = 'outbound_transfer_posting'; + const TYPE_OUTBOUND_TRANSFER_RETURN = 'outbound_transfer_return'; + const TYPE_RECEIVED_CREDIT = 'received_credit'; + const TYPE_RECEIVED_DEBIT = 'received_debit'; + + /** + * Retrieves a list of TransactionEntry objects. + * + * @param null|array{created?: array|int, effective_at?: array|int, ending_before?: string, expand?: string[], financial_account: string, limit?: int, order_by?: string, starting_after?: string, transaction?: string} $params + * @param null|array|string $opts + * + * @return \Stripe\Collection of ApiResources + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, \Stripe\Collection::class, $params, $opts); + } + + /** + * Retrieves a TransactionEntry object. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return TransactionEntry + * + * @throws \Stripe\Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = \Stripe\Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } +} diff --git a/stripe-php/lib/Util/ApiVersion.php b/stripe-php/lib/Util/ApiVersion.php new file mode 100644 index 0000000..25b7816 --- /dev/null +++ b/stripe-php/lib/Util/ApiVersion.php @@ -0,0 +1,11 @@ +container = \array_change_key_case($initial_array, \CASE_LOWER); + } + + /** + * @return int + */ + #[\ReturnTypeWillChange] + public function count() + { + return \count($this->container); + } + + /** + * @return \ArrayIterator + */ + #[\ReturnTypeWillChange] + public function getIterator() + { + return new \ArrayIterator($this->container); + } + + /** + * @return void + */ + #[\ReturnTypeWillChange] + public function offsetSet($offset, $value) + { + $offset = self::maybeLowercase($offset); + if (null === $offset) { + $this->container[] = $value; + } else { + $this->container[$offset] = $value; + } + } + + /** + * @return bool + */ + #[\ReturnTypeWillChange] + public function offsetExists($offset) + { + $offset = self::maybeLowercase($offset); + + return isset($this->container[$offset]); + } + + /** + * @return void + */ + #[\ReturnTypeWillChange] + public function offsetUnset($offset) + { + $offset = self::maybeLowercase($offset); + unset($this->container[$offset]); + } + + /** + * @return mixed + */ + #[\ReturnTypeWillChange] + public function offsetGet($offset) + { + $offset = self::maybeLowercase($offset); + + return isset($this->container[$offset]) ? $this->container[$offset] : null; + } + + private static function maybeLowercase($v) + { + if (\is_string($v)) { + return \strtolower($v); + } + + return $v; + } +} diff --git a/stripe-php/lib/Util/DefaultLogger.php b/stripe-php/lib/Util/DefaultLogger.php new file mode 100644 index 0000000..016cbe8 --- /dev/null +++ b/stripe-php/lib/Util/DefaultLogger.php @@ -0,0 +1,29 @@ + 0) { + throw new \Stripe\Exception\BadMethodCallException('DefaultLogger does not currently implement context. Please implement if you need it.'); + } + + if (null === $this->destination) { + \error_log($message, $this->messageType); + } else { + \error_log($message, $this->messageType, $this->destination); + } + } +} diff --git a/stripe-php/lib/Util/EventNotificationTypes.php b/stripe-php/lib/Util/EventNotificationTypes.php new file mode 100644 index 0000000..9d77783 --- /dev/null +++ b/stripe-php/lib/Util/EventNotificationTypes.php @@ -0,0 +1,14 @@ + \Stripe\Events\V1BillingMeterErrorReportTriggeredEventNotification::class, + \Stripe\Events\V1BillingMeterNoMeterFoundEventNotification::LOOKUP_TYPE => \Stripe\Events\V1BillingMeterNoMeterFoundEventNotification::class, + \Stripe\Events\V2CoreEventDestinationPingEventNotification::LOOKUP_TYPE => \Stripe\Events\V2CoreEventDestinationPingEventNotification::class, + // The end of the section generated from our OpenAPI spec + ]; +} diff --git a/stripe-php/lib/Util/EventTypes.php b/stripe-php/lib/Util/EventTypes.php new file mode 100644 index 0000000..c0a4282 --- /dev/null +++ b/stripe-php/lib/Util/EventTypes.php @@ -0,0 +1,14 @@ + \Stripe\Events\V1BillingMeterErrorReportTriggeredEvent::class, + \Stripe\Events\V1BillingMeterNoMeterFoundEvent::LOOKUP_TYPE => \Stripe\Events\V1BillingMeterNoMeterFoundEvent::class, + \Stripe\Events\V2CoreEventDestinationPingEvent::LOOKUP_TYPE => \Stripe\Events\V2CoreEventDestinationPingEvent::class, + // The end of the section generated from our OpenAPI spec + ]; +} diff --git a/stripe-php/lib/Util/LoggerInterface.php b/stripe-php/lib/Util/LoggerInterface.php new file mode 100644 index 0000000..5603c81 --- /dev/null +++ b/stripe-php/lib/Util/LoggerInterface.php @@ -0,0 +1,34 @@ + \Stripe\Collection::class, + \Stripe\Issuing\CardDetails::OBJECT_NAME => \Stripe\Issuing\CardDetails::class, + \Stripe\SearchResult::OBJECT_NAME => \Stripe\SearchResult::class, + \Stripe\File::OBJECT_NAME_ALT => \Stripe\File::class, + // object classes: The beginning of the section generated from our OpenAPI spec + \Stripe\Account::OBJECT_NAME => \Stripe\Account::class, + \Stripe\AccountLink::OBJECT_NAME => \Stripe\AccountLink::class, + \Stripe\AccountSession::OBJECT_NAME => \Stripe\AccountSession::class, + \Stripe\ApplePayDomain::OBJECT_NAME => \Stripe\ApplePayDomain::class, + \Stripe\Application::OBJECT_NAME => \Stripe\Application::class, + \Stripe\ApplicationFee::OBJECT_NAME => \Stripe\ApplicationFee::class, + \Stripe\ApplicationFeeRefund::OBJECT_NAME => \Stripe\ApplicationFeeRefund::class, + \Stripe\Apps\Secret::OBJECT_NAME => \Stripe\Apps\Secret::class, + \Stripe\Balance::OBJECT_NAME => \Stripe\Balance::class, + \Stripe\BalanceSettings::OBJECT_NAME => \Stripe\BalanceSettings::class, + \Stripe\BalanceTransaction::OBJECT_NAME => \Stripe\BalanceTransaction::class, + \Stripe\BankAccount::OBJECT_NAME => \Stripe\BankAccount::class, + \Stripe\Billing\Alert::OBJECT_NAME => \Stripe\Billing\Alert::class, + \Stripe\Billing\AlertTriggered::OBJECT_NAME => \Stripe\Billing\AlertTriggered::class, + \Stripe\Billing\CreditBalanceSummary::OBJECT_NAME => \Stripe\Billing\CreditBalanceSummary::class, + \Stripe\Billing\CreditBalanceTransaction::OBJECT_NAME => \Stripe\Billing\CreditBalanceTransaction::class, + \Stripe\Billing\CreditGrant::OBJECT_NAME => \Stripe\Billing\CreditGrant::class, + \Stripe\Billing\Meter::OBJECT_NAME => \Stripe\Billing\Meter::class, + \Stripe\Billing\MeterEvent::OBJECT_NAME => \Stripe\Billing\MeterEvent::class, + \Stripe\Billing\MeterEventAdjustment::OBJECT_NAME => \Stripe\Billing\MeterEventAdjustment::class, + \Stripe\Billing\MeterEventSummary::OBJECT_NAME => \Stripe\Billing\MeterEventSummary::class, + \Stripe\BillingPortal\Configuration::OBJECT_NAME => \Stripe\BillingPortal\Configuration::class, + \Stripe\BillingPortal\Session::OBJECT_NAME => \Stripe\BillingPortal\Session::class, + \Stripe\Capability::OBJECT_NAME => \Stripe\Capability::class, + \Stripe\Card::OBJECT_NAME => \Stripe\Card::class, + \Stripe\CashBalance::OBJECT_NAME => \Stripe\CashBalance::class, + \Stripe\Charge::OBJECT_NAME => \Stripe\Charge::class, + \Stripe\Checkout\Session::OBJECT_NAME => \Stripe\Checkout\Session::class, + \Stripe\Climate\Order::OBJECT_NAME => \Stripe\Climate\Order::class, + \Stripe\Climate\Product::OBJECT_NAME => \Stripe\Climate\Product::class, + \Stripe\Climate\Supplier::OBJECT_NAME => \Stripe\Climate\Supplier::class, + \Stripe\ConfirmationToken::OBJECT_NAME => \Stripe\ConfirmationToken::class, + \Stripe\ConnectCollectionTransfer::OBJECT_NAME => \Stripe\ConnectCollectionTransfer::class, + \Stripe\CountrySpec::OBJECT_NAME => \Stripe\CountrySpec::class, + \Stripe\Coupon::OBJECT_NAME => \Stripe\Coupon::class, + \Stripe\CreditNote::OBJECT_NAME => \Stripe\CreditNote::class, + \Stripe\CreditNoteLineItem::OBJECT_NAME => \Stripe\CreditNoteLineItem::class, + \Stripe\Customer::OBJECT_NAME => \Stripe\Customer::class, + \Stripe\CustomerBalanceTransaction::OBJECT_NAME => \Stripe\CustomerBalanceTransaction::class, + \Stripe\CustomerCashBalanceTransaction::OBJECT_NAME => \Stripe\CustomerCashBalanceTransaction::class, + \Stripe\CustomerSession::OBJECT_NAME => \Stripe\CustomerSession::class, + \Stripe\Discount::OBJECT_NAME => \Stripe\Discount::class, + \Stripe\Dispute::OBJECT_NAME => \Stripe\Dispute::class, + \Stripe\Entitlements\ActiveEntitlement::OBJECT_NAME => \Stripe\Entitlements\ActiveEntitlement::class, + \Stripe\Entitlements\ActiveEntitlementSummary::OBJECT_NAME => \Stripe\Entitlements\ActiveEntitlementSummary::class, + \Stripe\Entitlements\Feature::OBJECT_NAME => \Stripe\Entitlements\Feature::class, + \Stripe\EphemeralKey::OBJECT_NAME => \Stripe\EphemeralKey::class, + \Stripe\Event::OBJECT_NAME => \Stripe\Event::class, + \Stripe\ExchangeRate::OBJECT_NAME => \Stripe\ExchangeRate::class, + \Stripe\File::OBJECT_NAME => \Stripe\File::class, + \Stripe\FileLink::OBJECT_NAME => \Stripe\FileLink::class, + \Stripe\FinancialConnections\Account::OBJECT_NAME => \Stripe\FinancialConnections\Account::class, + \Stripe\FinancialConnections\AccountOwner::OBJECT_NAME => \Stripe\FinancialConnections\AccountOwner::class, + \Stripe\FinancialConnections\AccountOwnership::OBJECT_NAME => \Stripe\FinancialConnections\AccountOwnership::class, + \Stripe\FinancialConnections\Session::OBJECT_NAME => \Stripe\FinancialConnections\Session::class, + \Stripe\FinancialConnections\Transaction::OBJECT_NAME => \Stripe\FinancialConnections\Transaction::class, + \Stripe\Forwarding\Request::OBJECT_NAME => \Stripe\Forwarding\Request::class, + \Stripe\FundingInstructions::OBJECT_NAME => \Stripe\FundingInstructions::class, + \Stripe\Identity\VerificationReport::OBJECT_NAME => \Stripe\Identity\VerificationReport::class, + \Stripe\Identity\VerificationSession::OBJECT_NAME => \Stripe\Identity\VerificationSession::class, + \Stripe\Invoice::OBJECT_NAME => \Stripe\Invoice::class, + \Stripe\InvoiceItem::OBJECT_NAME => \Stripe\InvoiceItem::class, + \Stripe\InvoiceLineItem::OBJECT_NAME => \Stripe\InvoiceLineItem::class, + \Stripe\InvoicePayment::OBJECT_NAME => \Stripe\InvoicePayment::class, + \Stripe\InvoiceRenderingTemplate::OBJECT_NAME => \Stripe\InvoiceRenderingTemplate::class, + \Stripe\Issuing\Authorization::OBJECT_NAME => \Stripe\Issuing\Authorization::class, + \Stripe\Issuing\Card::OBJECT_NAME => \Stripe\Issuing\Card::class, + \Stripe\Issuing\Cardholder::OBJECT_NAME => \Stripe\Issuing\Cardholder::class, + \Stripe\Issuing\Dispute::OBJECT_NAME => \Stripe\Issuing\Dispute::class, + \Stripe\Issuing\PersonalizationDesign::OBJECT_NAME => \Stripe\Issuing\PersonalizationDesign::class, + \Stripe\Issuing\PhysicalBundle::OBJECT_NAME => \Stripe\Issuing\PhysicalBundle::class, + \Stripe\Issuing\Token::OBJECT_NAME => \Stripe\Issuing\Token::class, + \Stripe\Issuing\Transaction::OBJECT_NAME => \Stripe\Issuing\Transaction::class, + \Stripe\LineItem::OBJECT_NAME => \Stripe\LineItem::class, + \Stripe\LoginLink::OBJECT_NAME => \Stripe\LoginLink::class, + \Stripe\Mandate::OBJECT_NAME => \Stripe\Mandate::class, + \Stripe\PaymentAttemptRecord::OBJECT_NAME => \Stripe\PaymentAttemptRecord::class, + \Stripe\PaymentIntent::OBJECT_NAME => \Stripe\PaymentIntent::class, + \Stripe\PaymentIntentAmountDetailsLineItem::OBJECT_NAME => \Stripe\PaymentIntentAmountDetailsLineItem::class, + \Stripe\PaymentLink::OBJECT_NAME => \Stripe\PaymentLink::class, + \Stripe\PaymentMethod::OBJECT_NAME => \Stripe\PaymentMethod::class, + \Stripe\PaymentMethodConfiguration::OBJECT_NAME => \Stripe\PaymentMethodConfiguration::class, + \Stripe\PaymentMethodDomain::OBJECT_NAME => \Stripe\PaymentMethodDomain::class, + \Stripe\PaymentRecord::OBJECT_NAME => \Stripe\PaymentRecord::class, + \Stripe\Payout::OBJECT_NAME => \Stripe\Payout::class, + \Stripe\Person::OBJECT_NAME => \Stripe\Person::class, + \Stripe\Plan::OBJECT_NAME => \Stripe\Plan::class, + \Stripe\Price::OBJECT_NAME => \Stripe\Price::class, + \Stripe\Product::OBJECT_NAME => \Stripe\Product::class, + \Stripe\ProductFeature::OBJECT_NAME => \Stripe\ProductFeature::class, + \Stripe\PromotionCode::OBJECT_NAME => \Stripe\PromotionCode::class, + \Stripe\Quote::OBJECT_NAME => \Stripe\Quote::class, + \Stripe\Radar\EarlyFraudWarning::OBJECT_NAME => \Stripe\Radar\EarlyFraudWarning::class, + \Stripe\Radar\ValueList::OBJECT_NAME => \Stripe\Radar\ValueList::class, + \Stripe\Radar\ValueListItem::OBJECT_NAME => \Stripe\Radar\ValueListItem::class, + \Stripe\Refund::OBJECT_NAME => \Stripe\Refund::class, + \Stripe\Reporting\ReportRun::OBJECT_NAME => \Stripe\Reporting\ReportRun::class, + \Stripe\Reporting\ReportType::OBJECT_NAME => \Stripe\Reporting\ReportType::class, + \Stripe\ReserveTransaction::OBJECT_NAME => \Stripe\ReserveTransaction::class, + \Stripe\Review::OBJECT_NAME => \Stripe\Review::class, + \Stripe\SetupAttempt::OBJECT_NAME => \Stripe\SetupAttempt::class, + \Stripe\SetupIntent::OBJECT_NAME => \Stripe\SetupIntent::class, + \Stripe\ShippingRate::OBJECT_NAME => \Stripe\ShippingRate::class, + \Stripe\Sigma\ScheduledQueryRun::OBJECT_NAME => \Stripe\Sigma\ScheduledQueryRun::class, + \Stripe\Source::OBJECT_NAME => \Stripe\Source::class, + \Stripe\SourceMandateNotification::OBJECT_NAME => \Stripe\SourceMandateNotification::class, + \Stripe\SourceTransaction::OBJECT_NAME => \Stripe\SourceTransaction::class, + \Stripe\Subscription::OBJECT_NAME => \Stripe\Subscription::class, + \Stripe\SubscriptionItem::OBJECT_NAME => \Stripe\SubscriptionItem::class, + \Stripe\SubscriptionSchedule::OBJECT_NAME => \Stripe\SubscriptionSchedule::class, + \Stripe\Tax\Association::OBJECT_NAME => \Stripe\Tax\Association::class, + \Stripe\Tax\Calculation::OBJECT_NAME => \Stripe\Tax\Calculation::class, + \Stripe\Tax\CalculationLineItem::OBJECT_NAME => \Stripe\Tax\CalculationLineItem::class, + \Stripe\Tax\Registration::OBJECT_NAME => \Stripe\Tax\Registration::class, + \Stripe\Tax\Settings::OBJECT_NAME => \Stripe\Tax\Settings::class, + \Stripe\Tax\Transaction::OBJECT_NAME => \Stripe\Tax\Transaction::class, + \Stripe\Tax\TransactionLineItem::OBJECT_NAME => \Stripe\Tax\TransactionLineItem::class, + \Stripe\TaxCode::OBJECT_NAME => \Stripe\TaxCode::class, + \Stripe\TaxDeductedAtSource::OBJECT_NAME => \Stripe\TaxDeductedAtSource::class, + \Stripe\TaxId::OBJECT_NAME => \Stripe\TaxId::class, + \Stripe\TaxRate::OBJECT_NAME => \Stripe\TaxRate::class, + \Stripe\Terminal\Configuration::OBJECT_NAME => \Stripe\Terminal\Configuration::class, + \Stripe\Terminal\ConnectionToken::OBJECT_NAME => \Stripe\Terminal\ConnectionToken::class, + \Stripe\Terminal\Location::OBJECT_NAME => \Stripe\Terminal\Location::class, + \Stripe\Terminal\OnboardingLink::OBJECT_NAME => \Stripe\Terminal\OnboardingLink::class, + \Stripe\Terminal\Reader::OBJECT_NAME => \Stripe\Terminal\Reader::class, + \Stripe\TestHelpers\TestClock::OBJECT_NAME => \Stripe\TestHelpers\TestClock::class, + \Stripe\Token::OBJECT_NAME => \Stripe\Token::class, + \Stripe\Topup::OBJECT_NAME => \Stripe\Topup::class, + \Stripe\Transfer::OBJECT_NAME => \Stripe\Transfer::class, + \Stripe\TransferReversal::OBJECT_NAME => \Stripe\TransferReversal::class, + \Stripe\Treasury\CreditReversal::OBJECT_NAME => \Stripe\Treasury\CreditReversal::class, + \Stripe\Treasury\DebitReversal::OBJECT_NAME => \Stripe\Treasury\DebitReversal::class, + \Stripe\Treasury\FinancialAccount::OBJECT_NAME => \Stripe\Treasury\FinancialAccount::class, + \Stripe\Treasury\FinancialAccountFeatures::OBJECT_NAME => \Stripe\Treasury\FinancialAccountFeatures::class, + \Stripe\Treasury\InboundTransfer::OBJECT_NAME => \Stripe\Treasury\InboundTransfer::class, + \Stripe\Treasury\OutboundPayment::OBJECT_NAME => \Stripe\Treasury\OutboundPayment::class, + \Stripe\Treasury\OutboundTransfer::OBJECT_NAME => \Stripe\Treasury\OutboundTransfer::class, + \Stripe\Treasury\ReceivedCredit::OBJECT_NAME => \Stripe\Treasury\ReceivedCredit::class, + \Stripe\Treasury\ReceivedDebit::OBJECT_NAME => \Stripe\Treasury\ReceivedDebit::class, + \Stripe\Treasury\Transaction::OBJECT_NAME => \Stripe\Treasury\Transaction::class, + \Stripe\Treasury\TransactionEntry::OBJECT_NAME => \Stripe\Treasury\TransactionEntry::class, + \Stripe\WebhookEndpoint::OBJECT_NAME => \Stripe\WebhookEndpoint::class, + // object classes: The end of the section generated from our OpenAPI spec + ]; + + /** + * @var array Mapping from v2 object types to resource classes + */ + const v2Mapping = [ + // v2 object classes: The beginning of the section generated from our OpenAPI spec + \Stripe\V2\Billing\MeterEvent::OBJECT_NAME => \Stripe\V2\Billing\MeterEvent::class, + \Stripe\V2\Billing\MeterEventAdjustment::OBJECT_NAME => \Stripe\V2\Billing\MeterEventAdjustment::class, + \Stripe\V2\Billing\MeterEventSession::OBJECT_NAME => \Stripe\V2\Billing\MeterEventSession::class, + \Stripe\V2\Core\Account::OBJECT_NAME => \Stripe\V2\Core\Account::class, + \Stripe\V2\Core\AccountLink::OBJECT_NAME => \Stripe\V2\Core\AccountLink::class, + \Stripe\V2\Core\AccountPerson::OBJECT_NAME => \Stripe\V2\Core\AccountPerson::class, + \Stripe\V2\Core\AccountPersonToken::OBJECT_NAME => \Stripe\V2\Core\AccountPersonToken::class, + \Stripe\V2\Core\AccountToken::OBJECT_NAME => \Stripe\V2\Core\AccountToken::class, + \Stripe\V2\Core\Event::OBJECT_NAME => \Stripe\V2\Core\Event::class, + \Stripe\V2\Core\EventDestination::OBJECT_NAME => \Stripe\V2\Core\EventDestination::class, + // v2 object classes: The end of the section generated from our OpenAPI spec + ]; +} diff --git a/stripe-php/lib/Util/RandomGenerator.php b/stripe-php/lib/Util/RandomGenerator.php new file mode 100644 index 0000000..ccf023a --- /dev/null +++ b/stripe-php/lib/Util/RandomGenerator.php @@ -0,0 +1,36 @@ + a list of headers that should be persisted across requests + */ + public static $HEADERS_TO_PERSIST = [ + 'Stripe-Account', + 'Stripe-Context', + 'Stripe-Version', + ]; + + /** @var array */ + public $headers; + + /** @var null|string */ + public $apiKey; + + /** @var null|string */ + public $apiBase; + + /** @var null|int */ + public $maxNetworkRetries; + + /** + * @param null|string $key + * @param array $headers + * @param null|string $base + * @param null|int $maxNetworkRetries + */ + public function __construct($key = null, $headers = [], $base = null, $maxNetworkRetries = null) + { + $this->apiKey = $key; + $this->headers = $headers; + $this->apiBase = $base; + $this->maxNetworkRetries = $maxNetworkRetries; + } + + /** + * @return array + */ + public function __debugInfo() + { + return [ + 'apiKey' => $this->redactedApiKey(), + 'headers' => $this->headers, + 'apiBase' => $this->apiBase, + 'maxNetworkRetries' => $this->maxNetworkRetries, + ]; + } + + /** + * Unpacks an options array and merges it into the existing RequestOptions + * object. + * + * @param null|array|RequestOptions|string $options a key => value array + * @param bool $strict when true, forbid string form and arbitrary keys in array form + * + * @return RequestOptions + */ + public function merge($options, $strict = false) + { + $other_options = self::parse($options, $strict); + if (null === $other_options->apiKey) { + $other_options->apiKey = $this->apiKey; + } + if (null === $other_options->apiBase) { + $other_options->apiBase = $this->apiBase; + } + if (null === $other_options->maxNetworkRetries) { + $other_options->maxNetworkRetries = $this->maxNetworkRetries; + } + $other_options->headers = \array_merge($this->headers, $other_options->headers); + + // special handling for stripe_context + // if other sent an empty string, then we should unset + if (\array_key_exists('Stripe-Context', $other_options->headers) && '' === $other_options->headers['Stripe-Context']) { + unset($other_options->headers['Stripe-Context']); + } + + return $other_options; + } + + /** + * Discards all headers that we don't want to persist across requests. + */ + public function discardNonPersistentHeaders() + { + foreach ($this->headers as $k => $v) { + if (!\in_array($k, self::$HEADERS_TO_PERSIST, true)) { + unset($this->headers[$k]); + } + } + } + + /** + * Unpacks an options array into an RequestOptions object. + * + * @param null|array|RequestOptions|string $options a key => value array + * @param bool $strict when true, forbid string form and arbitrary keys in array form + * + * @return RequestOptions + * + * @throws \Stripe\Exception\InvalidArgumentException + */ + public static function parse($options, $strict = false) + { + if ($options instanceof self) { + return clone $options; + } + + if (null === $options) { + return new RequestOptions(null, [], null); + } + + if (\is_string($options)) { + if ($strict) { + $message = 'Do not pass a string for request options. If you want to set the ' + . 'API key, pass an array like ["api_key" => ] instead.'; + + throw new \Stripe\Exception\InvalidArgumentException($message); + } + + return new RequestOptions($options, [], null); + } + + if (\is_array($options)) { + $headers = []; + $key = null; + $base = null; + $maxNetworkRetries = null; + + if (\array_key_exists('api_key', $options)) { + $key = $options['api_key']; + unset($options['api_key']); + } + if (\array_key_exists('idempotency_key', $options)) { + $headers['Idempotency-Key'] = $options['idempotency_key']; + unset($options['idempotency_key']); + } + if (\array_key_exists('stripe_account', $options)) { + if (null !== $options['stripe_account']) { + $headers['Stripe-Account'] = $options['stripe_account']; + } + unset($options['stripe_account']); + } + if (\array_key_exists('stripe_context', $options)) { + if (null !== $options['stripe_context']) { + $headers['Stripe-Context'] = (string) $options['stripe_context']; + } + unset($options['stripe_context']); + } + if (\array_key_exists('stripe_version', $options)) { + if (null !== $options['stripe_version']) { + $headers['Stripe-Version'] = $options['stripe_version']; + } + unset($options['stripe_version']); + } + if (\array_key_exists('max_network_retries', $options)) { + if (null !== $options['max_network_retries']) { + $maxNetworkRetries = $options['max_network_retries']; + } + unset($options['max_network_retries']); + } + if (\array_key_exists('api_base', $options)) { + $base = $options['api_base']; + unset($options['api_base']); + } + + if ($strict && !empty($options)) { + $message = 'Got unexpected keys in options array: ' . \implode(', ', \array_keys($options)); + + throw new \Stripe\Exception\InvalidArgumentException($message); + } + + return new RequestOptions($key, $headers, $base, $maxNetworkRetries); + } + + $message = 'The second argument to Stripe API method calls is an ' + . 'optional per-request apiKey, which must be a string, or ' + . 'per-request options, which must be an array. (HINT: you can set ' + . 'a global apiKey by "Stripe::setApiKey()")'; + + throw new \Stripe\Exception\InvalidArgumentException($message); + } + + /** @return string */ + private function redactedApiKey() + { + if (null === $this->apiKey) { + return ''; + } + + $pieces = \explode('_', $this->apiKey, 3); + $last = \array_pop($pieces); + $redactedLast = \strlen($last) > 4 + ? (\str_repeat('*', \strlen($last) - 4) . \substr($last, -4)) + : $last; + $pieces[] = $redactedLast; + + return \implode('_', $pieces); + } +} diff --git a/stripe-php/lib/Util/Set.php b/stripe-php/lib/Util/Set.php new file mode 100644 index 0000000..f68c6db --- /dev/null +++ b/stripe-php/lib/Util/Set.php @@ -0,0 +1,45 @@ +_elts = []; + foreach ($members as $item) { + $this->_elts[$item] = true; + } + } + + public function includes($elt) + { + return isset($this->_elts[$elt]); + } + + public function add($elt) + { + $this->_elts[$elt] = true; + } + + public function discard($elt) + { + unset($this->_elts[$elt]); + } + + public function toArray() + { + return \array_keys($this->_elts); + } + + /** + * @return \ArrayIterator + */ + #[\ReturnTypeWillChange] + public function getIterator() + { + return new \ArrayIterator($this->toArray()); + } +} diff --git a/stripe-php/lib/Util/Util.php b/stripe-php/lib/Util/Util.php new file mode 100644 index 0000000..96f92a6 --- /dev/null +++ b/stripe-php/lib/Util/Util.php @@ -0,0 +1,341 @@ +id; + } + if (static::isList($h)) { + $results = []; + foreach ($h as $v) { + $results[] = static::objectsToIds($v); + } + + return $results; + } + if (\is_array($h)) { + $results = []; + foreach ($h as $k => $v) { + if (null === $v) { + continue; + } + $results[$k] = static::objectsToIds($v); + } + + return $results; + } + + return $h; + } + + /** + * @param array $params + * @param mixed $apiMode + * + * @return string + */ + public static function encodeParameters($params, $apiMode = 'v1') + { + $flattenedParams = self::flattenParams($params, null, $apiMode); + $pieces = []; + foreach ($flattenedParams as $param) { + list($k, $v) = $param; + $pieces[] = self::urlEncode($k) . '=' . self::urlEncode($v); + } + + return \implode('&', $pieces); + } + + /** + * @param array $params + * @param null|string $parentKey + * @param mixed $apiMode + * + * @return array + */ + public static function flattenParams( + $params, + $parentKey = null, + $apiMode = 'v1' + ) { + $result = []; + + foreach ($params as $key => $value) { + $calculatedKey = $parentKey ? "{$parentKey}[{$key}]" : $key; + if (self::isList($value)) { + $result = \array_merge( + $result, + self::flattenParamsList($value, $calculatedKey, $apiMode) + ); + } elseif (\is_array($value)) { + $result = \array_merge( + $result, + self::flattenParams($value, $calculatedKey, $apiMode) + ); + } else { + $result[] = [$calculatedKey, $value]; + } + } + + return $result; + } + + /** + * @param array $value + * @param string $calculatedKey + * @param mixed $apiMode + * + * @return array + */ + public static function flattenParamsList( + $value, + $calculatedKey, + $apiMode = 'v1' + ) { + $result = []; + + foreach ($value as $i => $elem) { + if (self::isList($elem)) { + $result = \array_merge( + $result, + self::flattenParamsList($elem, $calculatedKey) + ); + } elseif (\is_array($elem)) { + $result = \array_merge( + $result, + self::flattenParams($elem, "{$calculatedKey}[{$i}]") + ); + } else { + // Always use indexed format for arrays + $result[] = ["{$calculatedKey}[{$i}]", $elem]; + } + } + + return $result; + } + + /** + * @param string $key a string to URL-encode + * + * @return string the URL-encoded string + */ + public static function urlEncode($key) + { + $s = \urlencode((string) $key); + + // Don't use strict form encoding by changing the square bracket control + // characters back to their literals. This is fine by the server, and + // makes these parameter strings easier to read. + $s = \str_replace('%5B', '[', $s); + + return \str_replace('%5D', ']', $s); + } + + public static function normalizeId($id) + { + if (\is_array($id)) { + // see https://github.com/stripe/stripe-php/pull/1602 + if (!isset($id['id'])) { + return [null, $id]; + } + $params = $id; + $id = $params['id']; + unset($params['id']); + } else { + $params = []; + } + + return [$id, $params]; + } + + /** + * Returns UNIX timestamp in milliseconds. + * + * @return int current time in millis + */ + public static function currentTimeMillis() + { + return (int) \round(\microtime(true) * 1000); + } + + public static function getApiMode($path) + { + $apiMode = 'v1'; + if ('/v2' === substr($path, 0, 3)) { + $apiMode = 'v2'; + } + + return $apiMode; + } + + /** + * Useful for determining if we should trust the object type when turning a response into a StripeObject. + * + * @param 'delete'|'get'|'post' $method the HTTP method + * @param 'v1'|'v2' $apiMode the API version + * + * @return bool true if the method is a DELETE request for v2 API, false otherwise + */ + public static function isV2DeleteRequest($method, $apiMode) + { + return 'delete' === $method && 'v2' === $apiMode; + } +} diff --git a/stripe-php/lib/V2/Billing/MeterEvent.php b/stripe-php/lib/V2/Billing/MeterEvent.php new file mode 100644 index 0000000..248b082 --- /dev/null +++ b/stripe-php/lib/V2/Billing/MeterEvent.php @@ -0,0 +1,21 @@ +event_name field on a meter. + * @property string $identifier A unique identifier for the event. If not provided, one will be generated. We recommend using a globally unique identifier for this. We’ll enforce uniqueness within a rolling 24 hour period. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property \Stripe\StripeObject $payload The payload of the event. This must contain the fields corresponding to a meter’s customer_mapping.event_payload_key (default is stripe_customer_id) and value_settings.event_payload_key (default is value). Read more about the payload.. + * @property int $timestamp The time of the event. Must be within the past 35 calendar days or up to 5 minutes in the future. Defaults to current timestamp if not specified. + */ +class MeterEvent extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'v2.billing.meter_event'; +} diff --git a/stripe-php/lib/V2/Billing/MeterEventAdjustment.php b/stripe-php/lib/V2/Billing/MeterEventAdjustment.php new file mode 100644 index 0000000..042d8e9 --- /dev/null +++ b/stripe-php/lib/V2/Billing/MeterEventAdjustment.php @@ -0,0 +1,23 @@ +event_name field on a meter. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $status Open Enum. The meter event adjustment’s status. + * @property string $type Open Enum. Specifies whether to cancel a single event or a range of events for a time period. Time period cancellation is not supported yet. + */ +class MeterEventAdjustment extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'v2.billing.meter_event_adjustment'; + + const STATUS_COMPLETE = 'complete'; + const STATUS_PENDING = 'pending'; +} diff --git a/stripe-php/lib/V2/Billing/MeterEventSession.php b/stripe-php/lib/V2/Billing/MeterEventSession.php new file mode 100644 index 0000000..14ae5cd --- /dev/null +++ b/stripe-php/lib/V2/Billing/MeterEventSession.php @@ -0,0 +1,18 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + */ +class MeterEventSession extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'v2.billing.meter_event_session'; +} diff --git a/stripe-php/lib/V2/Collection.php b/stripe-php/lib/V2/Collection.php new file mode 100644 index 0000000..f9721d8 --- /dev/null +++ b/stripe-php/lib/V2/Collection.php @@ -0,0 +1,111 @@ + + * + * @property null|string $next_page_url + * @property null|string $previous_page_url + * @property TStripeObject[] $data + */ +class Collection extends \Stripe\StripeObject implements \Countable, \IteratorAggregate +{ + const OBJECT_NAME = 'list'; + + use \Stripe\ApiOperations\Request; + + /** + * @return string the base URL for the given class + */ + public static function baseUrl() + { + return \Stripe\Stripe::$apiBase; + } + + /** + * @return mixed + */ + #[\ReturnTypeWillChange] + public function offsetGet($k) + { + if (\is_string($k)) { + return parent::offsetGet($k); + } + $msg = "You tried to access the {$k} index, but V2Collection " + . 'types only support string keys. (HINT: List calls ' + . 'return an object with a `data` (which is the data ' + . "array). You likely want to call ->data[{$k}])"; + + throw new \Stripe\Exception\InvalidArgumentException($msg); + } + + /** + * @return int the number of objects in the current page + */ + #[\ReturnTypeWillChange] + public function count() + { + return \count($this->data); + } + + /** + * @return \ArrayIterator an iterator that can be used to iterate + * across objects in the current page + */ + #[\ReturnTypeWillChange] + public function getIterator() + { + return new \ArrayIterator($this->data); + } + + /** + * @return \ArrayIterator an iterator that can be used to iterate + * backwards across objects in the current page + */ + public function getReverseIterator() + { + return new \ArrayIterator(\array_reverse($this->data)); + } + + /** + * @return \Generator|TStripeObject[] A generator that can be used to + * iterate across all objects across all pages. As page boundaries are + * encountered, the next page will be fetched automatically for + * continued iteration. + * + * @throws \Stripe\Exception\ApiErrorException + */ + public function autoPagingIterator() + { + $page = $this->data; + $next_page_url = $this->next_page_url; + + while (true) { + foreach ($page as $item) { + yield $item; + } + if (null === $next_page_url) { + break; + } + + list($response, $opts) = $this->_request( + 'get', + $next_page_url, + null, + null, + [], + 'v2' + ); + $obj = \Stripe\Util\Util::convertToStripeObject($response, $opts, 'v2'); + /** @phpstan-ignore-next-line */ + $page = $obj->data; + /** @phpstan-ignore-next-line */ + $next_page_url = $obj->next_page_url; + } + } +} diff --git a/stripe-php/lib/V2/Core/Account.php b/stripe-php/lib/V2/Core/Account.php new file mode 100644 index 0000000..3b7b9ea --- /dev/null +++ b/stripe-php/lib/V2/Core/Account.php @@ -0,0 +1,33 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|(object{entries?: (object{awaiting_action_from: string, description: string, errors: (object{code: string, description: string}&\Stripe\StripeObject)[], impact: (object{restricts_capabilities?: (object{capability: string, configuration: string, deadline: (object{status: string}&\Stripe\StripeObject)}&\Stripe\StripeObject)[]}&\Stripe\StripeObject), minimum_deadline: (object{status: string}&\Stripe\StripeObject), reference?: (object{inquiry?: string, resource?: string, type: string}&\Stripe\StripeObject), requested_reasons: (object{code: string}&\Stripe\StripeObject)[]}&\Stripe\StripeObject)[], summary?: (object{minimum_deadline?: (object{status: string, time?: int}&\Stripe\StripeObject)}&\Stripe\StripeObject)}&\Stripe\StripeObject) $requirements Information about the active requirements for the Account, including what information needs to be collected, and by when. + */ +class Account extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'v2.core.account'; + + const DASHBOARD_EXPRESS = 'express'; + const DASHBOARD_FULL = 'full'; + const DASHBOARD_NONE = 'none'; +} diff --git a/stripe-php/lib/V2/Core/AccountLink.php b/stripe-php/lib/V2/Core/AccountLink.php new file mode 100644 index 0000000..4ed024b --- /dev/null +++ b/stripe-php/lib/V2/Core/AccountLink.php @@ -0,0 +1,21 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property string $url The URL at which the account can access the Stripe-hosted flow. + * @property (object{type: string, account_onboarding?: (object{collection_options?: (object{fields?: string, future_requirements?: string}&\Stripe\StripeObject), configurations: string[], refresh_url: string, return_url?: string}&\Stripe\StripeObject), account_update?: (object{collection_options?: (object{fields?: string, future_requirements?: string}&\Stripe\StripeObject), configurations: string[], refresh_url: string, return_url?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $use_case Hash containing usage options. + */ +class AccountLink extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'v2.core.account_link'; +} diff --git a/stripe-php/lib/V2/Core/AccountPerson.php b/stripe-php/lib/V2/Core/AccountPerson.php new file mode 100644 index 0000000..0afc0a5 --- /dev/null +++ b/stripe-php/lib/V2/Core/AccountPerson.php @@ -0,0 +1,44 @@ +true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string[] $nationalities The countries where the person is a national. Two-letter country code (ISO 3166-1 alpha-2). + * @property null|string $phone The person's phone number. + * @property null|string $political_exposure The person's political exposure. + * @property null|(object{authorizer?: bool, director?: bool, executive?: bool, legal_guardian?: bool, owner?: bool, percent_ownership?: string, representative?: bool, title?: string}&\Stripe\StripeObject) $relationship The relationship that this person has with the Account's business or legal entity. + * @property null|(object{kana?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}&\Stripe\StripeObject), kanji?: (object{city?: string, country?: string, line1?: string, line2?: string, postal_code?: string, state?: string, town?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $script_addresses The script addresses (e.g., non-Latin characters) associated with the person. + * @property null|(object{kana?: (object{given_name?: string, surname?: string}&\Stripe\StripeObject), kanji?: (object{given_name?: string, surname?: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $script_names The script names (e.g. non-Latin characters) associated with the person. + * @property null|string $surname The person's last name. + * @property int $updated Time at which the object was last updated. Represented as a RFC 3339 date & time UTC value in millisecond precision, for example: 2022-09-18T13:22:18.123Z. + */ +class AccountPerson extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'v2.core.account_person'; + + const LEGAL_GENDER_FEMALE = 'female'; + const LEGAL_GENDER_MALE = 'male'; + + const POLITICAL_EXPOSURE_EXISTING = 'existing'; + const POLITICAL_EXPOSURE_NONE = 'none'; +} diff --git a/stripe-php/lib/V2/Core/AccountPersonToken.php b/stripe-php/lib/V2/Core/AccountPersonToken.php new file mode 100644 index 0000000..4e84da8 --- /dev/null +++ b/stripe-php/lib/V2/Core/AccountPersonToken.php @@ -0,0 +1,20 @@ +true if the token exists in live mode or the value false if the object exists in test mode. + * @property bool $used Determines if the token has already been used (tokens can only be used once). + */ +class AccountPersonToken extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'v2.core.account_person_token'; +} diff --git a/stripe-php/lib/V2/Core/AccountToken.php b/stripe-php/lib/V2/Core/AccountToken.php new file mode 100644 index 0000000..d6c6419 --- /dev/null +++ b/stripe-php/lib/V2/Core/AccountToken.php @@ -0,0 +1,20 @@ +true if the token exists in live mode or the value false if the object exists in test mode. + * @property bool $used Determines if the token has already been used (tokens can only be used once). + */ +class AccountToken extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'v2.core.account_token'; +} diff --git a/stripe-php/lib/V2/Core/Event.php b/stripe-php/lib/V2/Core/Event.php new file mode 100644 index 0000000..d3c6013 --- /dev/null +++ b/stripe-php/lib/V2/Core/Event.php @@ -0,0 +1,21 @@ +webhook endpoints and Amazon EventBridge. Event destinations support receiving thin events and snapshot events. + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value of the object field. + * @property null|(object{aws_account_id: string, aws_event_source_arn: string, aws_event_source_status: string}&\Stripe\StripeObject) $amazon_eventbridge Amazon EventBridge configuration. + * @property int $created Time at which the object was created. + * @property string $description An optional description of what the event destination is used for. + * @property string[] $enabled_events The list of events to enable for this endpoint. + * @property string $event_payload Payload type of events being subscribed to. + * @property null|string[] $events_from Where events should be routed from. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property null|\Stripe\StripeObject $metadata Metadata. + * @property string $name Event destination name. + * @property null|string $snapshot_api_version If using the snapshot event payload, the API version events are rendered as. + * @property string $status Status. It can be set to either enabled or disabled. + * @property null|(object{disabled?: (object{reason: string}&\Stripe\StripeObject)}&\Stripe\StripeObject) $status_details Additional information about event destination status. + * @property string $type Event destination type. + * @property int $updated Time at which the object was last updated. + * @property null|(object{signing_secret?: string, url?: string}&\Stripe\StripeObject) $webhook_endpoint Webhook endpoint configuration. + */ +class EventDestination extends \Stripe\ApiResource +{ + const OBJECT_NAME = 'v2.core.event_destination'; + + const EVENT_PAYLOAD_SNAPSHOT = 'snapshot'; + const EVENT_PAYLOAD_THIN = 'thin'; + + const STATUS_DISABLED = 'disabled'; + const STATUS_ENABLED = 'enabled'; + + const TYPE_AMAZON_EVENTBRIDGE = 'amazon_eventbridge'; + const TYPE_WEBHOOK_ENDPOINT = 'webhook_endpoint'; +} diff --git a/stripe-php/lib/V2/Core/EventNotification.php b/stripe-php/lib/V2/Core/EventNotification.php new file mode 100644 index 0000000..4c2b006 --- /dev/null +++ b/stripe-php/lib/V2/Core/EventNotification.php @@ -0,0 +1,131 @@ +v2->core->events->retrieve(thin_event.id)` to fetch the full event object. + * + * @property string $id Unique identifier for the event. + * @property string $type The type of the event. + * @property string $created Time at which the object was created. + * @property null|\Stripe\StripeContext $context Authentication context needed to fetch the event or related object. + * @property null|Reason $reason Reason for the event. + * @property bool $livemode Livemode indicates if the event is from a production(true) or test(false) account. + */ +abstract class EventNotification +{ + public $id; + public $type; + public $created; + public $context; + public $reason; + public $livemode; + + protected $client; + // only available on children + protected $related_object; + + /** + * @param array $json the raw json body + * @param \Stripe\StripeClient $client a StripeClient instance that this can use to make requests + */ + public function __construct($json, $client) + { + $this->client = $client; + + if (\array_key_exists('id', $json)) { + $this->id = $json['id']; + } + if (\array_key_exists('type', $json)) { + $this->type = $json['type']; + } + if (\array_key_exists('created', $json)) { + $this->created = $json['created']; + } + if (\array_key_exists('context', $json) && null !== $json['context']) { + $this->context = \Stripe\StripeContext::parse($json['context']); + } + if (\array_key_exists('livemode', $json)) { + $this->livemode = $json['livemode']; + } + if (\array_key_exists('related_object', $json)) { + $this->related_object = new RelatedObject($json['related_object']); + } + if (\array_key_exists('reason', $json)) { + $this->reason = new Reason($json['reason']); + } + } + + /** + * Helper for constructing an Event Notification. Doesn't perform signature validation, so you + * should use \Stripe\BaseStripeClient#parseEventNotification instead for + * initial handling. This is useful in unit tests and working with EventNotifications that you've + * already validated the authenticity of. + * + * @param string $jsonStr the raw json payload + * @param \Stripe\StripeClient $client a StripeClient instance that this can use to make requests + * + * @return EventNotification + */ + public static function fromJson($jsonStr, $client) + { + $json = json_decode($jsonStr, true); + + $class = UnknownEventNotification::class; + $eventNotificationTypes = EventNotificationTypes::v2EventMapping; + if (\array_key_exists($json['type'], $eventNotificationTypes)) { + $class = $eventNotificationTypes[$json['type']]; + } + + return new $class($json, $client); + } + + /** + * Retrieve the full Event from the Stripe API. + * + * @return Event + */ + public function fetchEvent() + { + $response = $this->client->rawRequest( + 'get', + "/v2/core/events/{$this->id}", + null, + ['stripe_context' => $this->context], + null, + ['fetch_event'] + ); + + return $this->client->deserialize($response->body, 'v2'); + } + + protected function fetchRelatedObject() + { + if (null === $this->related_object) { + return null; + } + + $options = []; + if (null !== $this->context) { + $options['stripe_context'] = $this->context; + } + + $response = $this->client->rawRequest( + 'get', + $this->related_object->url, + null, + $options, + null, + ['fetch_related_object'] + ); + + return $this->client->deserialize($response->body, \Stripe\Util\Util::getApiMode($this->related_object->url)); + } +} diff --git a/stripe-php/lib/V2/DeletedObject.php b/stripe-php/lib/V2/DeletedObject.php new file mode 100644 index 0000000..025f431 --- /dev/null +++ b/stripe-php/lib/V2/DeletedObject.php @@ -0,0 +1,14 @@ +webhook endpoints via the API to be + * notified about events that happen in your Stripe account or connected + * accounts. + * + * Most users configure webhooks from the dashboard, which provides a user interface for registering and testing your webhook endpoints. + * + * Related guide: Setting up webhooks + * + * @property string $id Unique identifier for the object. + * @property string $object String representing the object's type. Objects of the same type share the same value. + * @property null|string $api_version The API version events are rendered as for this webhook endpoint. + * @property null|string $application The ID of the associated Connect application. + * @property int $created Time at which the object was created. Measured in seconds since the Unix epoch. + * @property null|string $description An optional description of what the webhook is used for. + * @property string[] $enabled_events The list of events to enable for this endpoint. ['*'] indicates that all events are enabled, except those that require explicit selection. + * @property bool $livemode Has the value true if the object exists in live mode or the value false if the object exists in test mode. + * @property StripeObject $metadata Set of key-value pairs that you can attach to an object. This can be useful for storing additional information about the object in a structured format. + * @property null|string $secret The endpoint's secret, used to generate webhook signatures. Only returned at creation. + * @property string $status The status of the webhook. It can be enabled or disabled. + * @property string $url The URL of the webhook endpoint. + */ +class WebhookEndpoint extends ApiResource +{ + const OBJECT_NAME = 'webhook_endpoint'; + + use ApiOperations\Update; + + /** + * A webhook endpoint must have a url and a list of + * enabled_events. You may optionally specify the Boolean + * connect parameter. If set to true, then a Connect webhook endpoint + * that notifies the specified url about events from all connected + * accounts is created; otherwise an account webhook endpoint that notifies the + * specified url only about events from your account is created. You + * can also create webhook endpoints in the webhooks settings + * section of the Dashboard. + * + * @param null|array{api_version?: string, connect?: bool, description?: null|string, enabled_events: string[], expand?: string[], metadata?: null|array, url: string} $params + * @param null|array|string $options + * + * @return WebhookEndpoint the created resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } + + /** + * You can also delete webhook endpoints via the webhook endpoint + * management page of the Stripe dashboard. + * + * @param null|array $params + * @param null|array|string $opts + * + * @return WebhookEndpoint the deleted resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public function delete($params = null, $opts = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $opts); + $this->refreshFrom($response, $opts); + + return $this; + } + + /** + * Returns a list of your webhook endpoints. + * + * @param null|array{ending_before?: string, expand?: string[], limit?: int, starting_after?: string} $params + * @param null|array|string $opts + * + * @return Collection of ApiResources + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function all($params = null, $opts = null) + { + $url = static::classUrl(); + + return static::_requestPage($url, Collection::class, $params, $opts); + } + + /** + * Retrieves the webhook endpoint with the given ID. + * + * @param array|string $id the ID of the API resource to retrieve, or an options array containing an `id` key + * @param null|array|string $opts + * + * @return WebhookEndpoint + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function retrieve($id, $opts = null) + { + $opts = Util\RequestOptions::parse($opts); + $instance = new static($id, $opts); + $instance->refresh(); + + return $instance; + } + + /** + * Updates the webhook endpoint. You may edit the url, the list of + * enabled_events, and the status of your endpoint. + * + * @param string $id the ID of the resource to update + * @param null|array{description?: null|string, disabled?: bool, enabled_events?: string[], expand?: string[], metadata?: null|array, url?: string} $params + * @param null|array|string $opts + * + * @return WebhookEndpoint the updated resource + * + * @throws Exception\ApiErrorException if the request fails + */ + public static function update($id, $params = null, $opts = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $opts); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + + return $obj; + } +} diff --git a/stripe-php/lib/WebhookSignature.php b/stripe-php/lib/WebhookSignature.php new file mode 100644 index 0000000..edd4fb9 --- /dev/null +++ b/stripe-php/lib/WebhookSignature.php @@ -0,0 +1,140 @@ + 0) && (\abs(\time() - $timestamp) > $tolerance)) { + throw Exception\SignatureVerificationException::factory( + 'Timestamp outside the tolerance zone', + $payload, + $header + ); + } + + return true; + } + + /** + * Extracts the timestamp in a signature header. + * + * @param string $header the signature header + * + * @return int the timestamp contained in the header, or -1 if no valid + * timestamp is found + */ + private static function getTimestamp($header) + { + $items = \explode(',', $header); + + foreach ($items as $item) { + $itemParts = \explode('=', $item, 2); + if ('t' === $itemParts[0]) { + if (!\is_numeric($itemParts[1])) { + return -1; + } + + return (int) $itemParts[1]; + } + } + + return -1; + } + + /** + * Extracts the signatures matching a given scheme in a signature header. + * + * @param string $header the signature header + * @param string $scheme the signature scheme to look for + * + * @return array the list of signatures matching the provided scheme + */ + private static function getSignatures($header, $scheme) + { + $signatures = []; + $items = \explode(',', $header); + + foreach ($items as $item) { + $itemParts = \explode('=', $item, 2); + if (\trim($itemParts[0]) === $scheme) { + $signatures[] = $itemParts[1]; + } + } + + return $signatures; + } + + /** + * Computes the signature for a given payload and secret. + * + * The current scheme used by Stripe ("v1") is HMAC/SHA-256. + * + * @param string $payload the payload to sign + * @param string $secret the secret used to generate the signature + * + * @return string the signature as a string + */ + private static function computeSignature($payload, $secret) + { + return \hash_hmac('sha256', $payload, $secret); + } +} diff --git a/stripe-webhook.php b/stripe-webhook.php new file mode 100644 index 0000000..008dec2 --- /dev/null +++ b/stripe-webhook.php @@ -0,0 +1,77 @@ +type) { + case 'invoice.payment_succeeded': + $invoice = $event->data->object; + $subscription_id = $invoice->subscription; + + // Get subscription details + try { + $subscription = \Stripe\Subscription::retrieve($subscription_id); + } catch (\Stripe\Exception\ApiErrorException $e) { + // Log error + http_response_code(400); + exit(); + } + + $end_date = date('Y-m-d H:i:s', $subscription->current_period_end); + + // Update subscription in database + try { + $stmt = db()->prepare("UPDATE subscriptions SET status = 'active', end_date = ? WHERE stripe_subscription_id = ?"); + $stmt->execute([$end_date, $subscription_id]); + } catch (PDOException $e) { + // Log error + http_response_code(500); + exit(); + } + break; + case 'customer.subscription.deleted': + $subscription = $event->data->object; + $subscription_id = $subscription->id; + + // Update subscription in database + try { + $stmt = db()->prepare("UPDATE subscriptions SET status = 'canceled' WHERE stripe_subscription_id = ?"); + $stmt->execute([$subscription_id]); + } catch (PDOException $e) { + // Log error + http_response_code(500); + exit(); + } + break; + default: + // Unexpected event type + http_response_code(200); + exit(); +} + +http_response_code(200); diff --git a/subscribe.php b/subscribe.php new file mode 100644 index 0000000..b5ef3e7 --- /dev/null +++ b/subscribe.php @@ -0,0 +1,49 @@ +prepare("SELECT email FROM users WHERE id = ?"); +$stmt->execute([$user_id]); +$user = $stmt->fetch(); + +if (!$user) { + die("User not found."); +} + +$checkout_session = \Stripe\Checkout\Session::create([ + 'customer_email' => $user['email'], + 'payment_method_types' => ['card'], + 'line_items' => [[ + 'price' => $priceId, + 'quantity' => 1, + ]], + 'mode' => 'subscription', + 'success_url' => 'http://' . $_SERVER['HTTP_HOST'] . '/success.php?session_id={CHECKOUT_SESSION_ID}', + 'cancel_url' => 'http://' . $_SERVER['HTTP_HOST'] . '/cancel.php', + 'client_reference_id' => $user_id +]); + +header("HTTP/1.1 303 See Other"); +header("Location: " . $checkout_session->url); diff --git a/success.php b/success.php new file mode 100644 index 0000000..1d4a474 --- /dev/null +++ b/success.php @@ -0,0 +1,78 @@ +getMessage()); +} + +$user_id = $checkout_session->client_reference_id; +$stripe_subscription_id = $checkout_session->subscription; + +// Get subscription details +try { + $subscription = \Stripe\Subscription::retrieve($stripe_subscription_id); +} catch (\Stripe\Exception\ApiErrorException $e) { + die("Error retrieving subscription details: " . $e->getMessage()); +} + +$plan = $subscription->items->data[0]->price->lookup_key; +$status = $subscription->status; +$start_date = date('Y-m-d H:i:s', $subscription->current_period_start); +$end_date = date('Y-m-d H:i:s', $subscription->current_period_end); + +// Save subscription to database +try { + $stmt = db()->prepare("INSERT INTO subscriptions (user_id, stripe_subscription_id, plan, status, start_date, end_date) VALUES (?, ?, ?, ?, ?, ?)"); + $stmt->execute([$user_id, $stripe_subscription_id, $plan, $status, $start_date, $end_date]); +} catch (PDOException $e) { + // Ideally, you should log this error and handle it gracefully + die("Database error: " . $e->getMessage()); +} + +?> + + + + + + Subscription Successful - Veritune + + + + + + +
+
+

Subscription Successful!

+

Thank you for subscribing to our Pro plan. You now have unlimited certificate generation.

+ Go to Dashboard +
+
+ + + + diff --git a/uploads/.gitignore b/uploads/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/uploads/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file